From 05db2f1dc8f55b48b25e19152c9723e2c42473ef Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 20 Dec 2020 23:38:09 +0000 Subject: [PATCH] Deployed 29e3d9b to 0.3 with MkDocs 1.1.2 and mike 0.5.5 --- 0.3/404.html | 1097 ++++++++++ 0.3/CNAME | 1 + 0.3/assets/images/favicon.png | Bin 0 -> 1870 bytes 0.3/assets/javascripts/bundle.f4f0c901.min.js | 1 + .../javascripts/lunr/min/lunr.ar.min.js | 1 + .../javascripts/lunr/min/lunr.da.min.js | 18 + .../javascripts/lunr/min/lunr.de.min.js | 18 + .../javascripts/lunr/min/lunr.du.min.js | 18 + .../javascripts/lunr/min/lunr.es.min.js | 18 + .../javascripts/lunr/min/lunr.fi.min.js | 18 + .../javascripts/lunr/min/lunr.fr.min.js | 18 + .../javascripts/lunr/min/lunr.hu.min.js | 18 + .../javascripts/lunr/min/lunr.it.min.js | 18 + .../javascripts/lunr/min/lunr.ja.min.js | 1 + .../javascripts/lunr/min/lunr.jp.min.js | 1 + .../javascripts/lunr/min/lunr.multi.min.js | 1 + .../javascripts/lunr/min/lunr.nl.min.js | 18 + .../javascripts/lunr/min/lunr.no.min.js | 18 + .../javascripts/lunr/min/lunr.pt.min.js | 18 + .../javascripts/lunr/min/lunr.ro.min.js | 18 + .../javascripts/lunr/min/lunr.ru.min.js | 18 + .../lunr/min/lunr.stemmer.support.min.js | 1 + .../javascripts/lunr/min/lunr.sv.min.js | 18 + .../javascripts/lunr/min/lunr.tr.min.js | 18 + .../javascripts/lunr/min/lunr.vi.min.js | 1 + 0.3/assets/javascripts/lunr/tinyseg.min.js | 1 + .../assets/javascripts/vendor.49293c47.min.js | 18 +- .../javascripts/worker/search.0f64ce30.min.js | 58 + 0.3/assets/stylesheets/main.9526ea36.min.css | 1 + .../stylesheets/palette.47d7edde.min.css | 2 +- 0.3/change-log/index.html | 1380 ++++++++++++ 0.3/citation/index.html | 1323 +++++++++++ 0.3/code_of_conduct/index.html | 1462 +++++++++++++ 0.3/developers/documentation/index.html | 1300 +++++++++++ 0.3/developers/git-flow/index.html | 1334 ++++++++++++ 0.3/developers/remote-support/index.html | 1184 ++++++++++ 0.3/developers/test-cases/index.html | 1520 +++++++++++++ 0.3/developers/testing/index.html | 1252 +++++++++++ .../virtual-environments/index.html | 1399 ++++++++++++ 0.3/faq/index.html | 1569 ++++++++++++++ 0.3/features/add-new-features/index.html | 1493 +++++++++++++ 0.3/features/feature-introduction/index.html | 1319 +++++++++++ .../fitbit-heartrate-intraday/index.html | 1395 ++++++++++++ .../fitbit-heartrate-summary/index.html | 1442 ++++++++++++ 0.3/features/fitbit-sleep-summary/index.html | 1585 ++++++++++++++ 0.3/features/fitbit-steps-intraday/index.html | 1434 ++++++++++++ 0.3/features/fitbit-steps-summary/index.html | 1364 ++++++++++++ 0.3/features/phone-accelerometer/index.html | 1409 ++++++++++++ .../phone-activity-recognition/index.html | 1385 ++++++++++++ .../phone-applications-foreground/index.html | 1343 ++++++++++++ 0.3/features/phone-battery/index.html | 1322 +++++++++++ 0.3/features/phone-bluetooth/index.html | 1483 +++++++++++++ 0.3/features/phone-calls/index.html | 1389 ++++++++++++ 0.3/features/phone-conversation/index.html | 1443 ++++++++++++ 0.3/features/phone-data-yield/index.html | 1336 ++++++++++++ 0.3/features/phone-light/index.html | 1313 +++++++++++ 0.3/features/phone-locations/index.html | 1584 ++++++++++++++ 0.3/features/phone-messages/index.html | 1314 +++++++++++ 0.3/features/phone-screen/index.html | 1345 ++++++++++++ 0.3/features/phone-wifi-connected/index.html | 1301 +++++++++++ 0.3/features/phone-wifi-visible/index.html | 1301 +++++++++++ 0.3/file-structure/index.html | 1186 ++++++++++ 0.3/img/analysis_workflow.png | Bin 0 -> 518168 bytes 0.3/img/files.png | Bin 0 -> 321183 bytes 0.3/img/h-data-yield.html | 39 + 0.3/img/h-data-yield.png | Bin 0 -> 37780 bytes 0.3/img/hm-data-yield-participants.html | 191 ++ 0.3/img/hm-data-yield-participants.png | Bin 0 -> 46634 bytes 0.3/img/hm-feature-correlations.html | 96 + 0.3/img/hm-feature-correlations.png | Bin 0 -> 295093 bytes 0.3/img/hm-phone-sensors.html | 627 ++++++ 0.3/img/hm-phone-sensors.png | Bin 0 -> 59705 bytes 0.3/img/hm-sensor_rows.html | 627 ++++++ 0.3/img/hm-sensor_rows.png | Bin 0 -> 54662 bytes 0.3/index.html | 1254 +++++++++++ 0.3/javascripts/extra.js | 14 + 0.3/migrating-from-old-versions/index.html | 1192 ++++++++++ 0.3/search/search_index.json | 1 + 0.3/setup/configuration/index.html | 1930 +++++++++++++++++ 0.3/setup/execution/index.html | 1204 ++++++++++ 0.3/setup/installation/index.html | 1372 ++++++++++++ 0.3/sitemap.xml | 171 ++ 0.3/sitemap.xml.gz | Bin 0 -> 216 bytes 0.3/stylesheets/extra.css | 28 + 0.3/team/index.html | 1498 +++++++++++++ .../data-quality-visualizations/index.html | 1312 +++++++++++ .../feature-visualizations/index.html | 1226 +++++++++++ 0.3/workflow-examples/analysis/index.html | 1342 ++++++++++++ 0.3/workflow-examples/minimal/index.html | 1245 +++++++++++ latest/404.html | 86 +- .../assets/javascripts/bundle.d371fdb2.min.js | 1 - .../assets/javascripts/bundle.f4f0c901.min.js | 1 + .../assets/javascripts/vendor.49293c47.min.js | 15 + .../assets/stylesheets/main.9526ea36.min.css | 1 + .../assets/stylesheets/main.a2a6bca7.min.css | 1 - .../stylesheets/palette.47d7edde.min.css | 1 + latest/change-log/index.html | 160 +- latest/citation/index.html | 86 +- latest/code_of_conduct/index.html | 86 +- latest/developers/documentation/index.html | 86 +- latest/developers/git-flow/index.html | 88 +- latest/developers/remote-support/index.html | 86 +- latest/developers/test-cases/index.html | 86 +- latest/developers/testing/index.html | 86 +- .../virtual-environments/index.html | 128 +- latest/faq/index.html | 86 +- latest/features/add-new-features/index.html | 86 +- .../features/feature-introduction/index.html | 86 +- .../fitbit-heartrate-intraday/index.html | 86 +- .../fitbit-heartrate-summary/index.html | 86 +- .../features/fitbit-sleep-summary/index.html | 86 +- .../features/fitbit-steps-intraday/index.html | 86 +- .../features/fitbit-steps-summary/index.html | 86 +- .../features/phone-accelerometer/index.html | 86 +- .../phone-activity-recognition/index.html | 86 +- .../phone-applications-foreground/index.html | 86 +- latest/features/phone-battery/index.html | 86 +- latest/features/phone-bluetooth/index.html | 86 +- latest/features/phone-calls/index.html | 86 +- latest/features/phone-conversation/index.html | 86 +- latest/features/phone-data-yield/index.html | 86 +- latest/features/phone-light/index.html | 86 +- latest/features/phone-locations/index.html | 86 +- latest/features/phone-messages/index.html | 86 +- latest/features/phone-screen/index.html | 86 +- .../features/phone-wifi-connected/index.html | 86 +- latest/features/phone-wifi-visible/index.html | 86 +- latest/file-structure/index.html | 86 +- latest/index.html | 89 +- latest/javascripts/extra.js | 2 +- latest/migrating-from-old-versions/index.html | 86 +- latest/search/search_index.json | 2 +- latest/setup/configuration/index.html | 86 +- latest/setup/execution/index.html | 86 +- latest/setup/installation/index.html | 86 +- latest/sitemap.xml | 84 +- latest/sitemap.xml.gz | Bin 216 -> 216 bytes latest/team/index.html | 86 +- .../data-quality-visualizations/index.html | 86 +- .../feature-visualizations/index.html | 86 +- latest/workflow-examples/analysis/index.html | 88 +- latest/workflow-examples/minimal/index.html | 86 +- versions.json | 2 +- 143 files changed, 64472 insertions(+), 492 deletions(-) create mode 100644 0.3/404.html create mode 100644 0.3/CNAME create mode 100644 0.3/assets/images/favicon.png create mode 100644 0.3/assets/javascripts/bundle.f4f0c901.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 0.3/assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 0.3/assets/javascripts/lunr/tinyseg.min.js rename latest/assets/javascripts/vendor.12f39d2a.min.js => 0.3/assets/javascripts/vendor.49293c47.min.js (63%) create mode 100644 0.3/assets/javascripts/worker/search.0f64ce30.min.js create mode 100644 0.3/assets/stylesheets/main.9526ea36.min.css rename latest/assets/stylesheets/palette.c308bc62.min.css => 0.3/assets/stylesheets/palette.47d7edde.min.css (73%) create mode 100644 0.3/change-log/index.html create mode 100644 0.3/citation/index.html create mode 100644 0.3/code_of_conduct/index.html create mode 100644 0.3/developers/documentation/index.html create mode 100644 0.3/developers/git-flow/index.html create mode 100644 0.3/developers/remote-support/index.html create mode 100644 0.3/developers/test-cases/index.html create mode 100644 0.3/developers/testing/index.html create mode 100644 0.3/developers/virtual-environments/index.html create mode 100644 0.3/faq/index.html create mode 100644 0.3/features/add-new-features/index.html create mode 100644 0.3/features/feature-introduction/index.html create mode 100644 0.3/features/fitbit-heartrate-intraday/index.html create mode 100644 0.3/features/fitbit-heartrate-summary/index.html create mode 100644 0.3/features/fitbit-sleep-summary/index.html create mode 100644 0.3/features/fitbit-steps-intraday/index.html create mode 100644 0.3/features/fitbit-steps-summary/index.html create mode 100644 0.3/features/phone-accelerometer/index.html create mode 100644 0.3/features/phone-activity-recognition/index.html create mode 100644 0.3/features/phone-applications-foreground/index.html create mode 100644 0.3/features/phone-battery/index.html create mode 100644 0.3/features/phone-bluetooth/index.html create mode 100644 0.3/features/phone-calls/index.html create mode 100644 0.3/features/phone-conversation/index.html create mode 100644 0.3/features/phone-data-yield/index.html create mode 100644 0.3/features/phone-light/index.html create mode 100644 0.3/features/phone-locations/index.html create mode 100644 0.3/features/phone-messages/index.html create mode 100644 0.3/features/phone-screen/index.html create mode 100644 0.3/features/phone-wifi-connected/index.html create mode 100644 0.3/features/phone-wifi-visible/index.html create mode 100644 0.3/file-structure/index.html create mode 100644 0.3/img/analysis_workflow.png create mode 100644 0.3/img/files.png create mode 100644 0.3/img/h-data-yield.html create mode 100644 0.3/img/h-data-yield.png create mode 100644 0.3/img/hm-data-yield-participants.html create mode 100644 0.3/img/hm-data-yield-participants.png create mode 100644 0.3/img/hm-feature-correlations.html create mode 100644 0.3/img/hm-feature-correlations.png create mode 100644 0.3/img/hm-phone-sensors.html create mode 100644 0.3/img/hm-phone-sensors.png create mode 100644 0.3/img/hm-sensor_rows.html create mode 100644 0.3/img/hm-sensor_rows.png create mode 100644 0.3/index.html create mode 100644 0.3/javascripts/extra.js create mode 100644 0.3/migrating-from-old-versions/index.html create mode 100644 0.3/search/search_index.json create mode 100644 0.3/setup/configuration/index.html create mode 100644 0.3/setup/execution/index.html create mode 100644 0.3/setup/installation/index.html create mode 100644 0.3/sitemap.xml create mode 100644 0.3/sitemap.xml.gz create mode 100644 0.3/stylesheets/extra.css create mode 100644 0.3/team/index.html create mode 100644 0.3/visualizations/data-quality-visualizations/index.html create mode 100644 0.3/visualizations/feature-visualizations/index.html create mode 100644 0.3/workflow-examples/analysis/index.html create mode 100644 0.3/workflow-examples/minimal/index.html delete mode 100644 latest/assets/javascripts/bundle.d371fdb2.min.js create mode 100644 latest/assets/javascripts/bundle.f4f0c901.min.js create mode 100644 latest/assets/javascripts/vendor.49293c47.min.js create mode 100644 latest/assets/stylesheets/main.9526ea36.min.css delete mode 100644 latest/assets/stylesheets/main.a2a6bca7.min.css create mode 100644 latest/assets/stylesheets/palette.47d7edde.min.css diff --git a/0.3/404.html b/0.3/404.html new file mode 100644 index 00000000..45ee5e14 --- /dev/null +++ b/0.3/404.html @@ -0,0 +1,1097 @@ + + + + + + + + + + + + + + + + + + + + + + + RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+ +

404 - Not found

+ + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/CNAME b/0.3/CNAME new file mode 100644 index 00000000..17ba96bf --- /dev/null +++ b/0.3/CNAME @@ -0,0 +1 @@ +www.rapids.science \ No newline at end of file diff --git a/0.3/assets/images/favicon.png b/0.3/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/0.3/assets/javascripts/bundle.f4f0c901.min.js b/0.3/assets/javascripts/bundle.f4f0c901.min.js new file mode 100644 index 00000000..89bac06c --- /dev/null +++ b/0.3/assets/javascripts/bundle.f4f0c901.min.js @@ -0,0 +1 @@ +!function(e,t){for(var a in t)e[a]=t[a]}(window,function(e){function t(t){for(var c,o,i=t[0],s=t[1],b=t[2],p=0,l=[];pObject(s.a)(new q.a(e=>{for(const t of e)I.next(t)}))).pipe(Object(d.a)(e=>Object(l.a)(Object(s.a)(e),n.a).pipe(Object(U.a)(()=>e.disconnect()))),Object(f.a)({bufferSize:1,refCount:!0}));function D(e){return W.pipe(Object($.a)(t=>t.observe(e)),Object(d.a)(t=>I.pipe(Object(h.a)(({target:t})=>t===e),Object(U.a)(()=>t.unobserve(e)),Object(m.a)(({contentRect:e})=>({width:e.width,height:e.height})))),Object(P.a)(function(e){return{width:e.offsetWidth,height:e.offsetHeight}}(e)))}var F=a(74);var J=a(60);function Y(e,t=location){return e.host===t.host&&/^(?:\/[\w-]+)*(?:\/?|\.html)$/i.test(e.pathname)}function K(e,t=location){return e.pathname===t.pathname&&e.hash.length>0}function B(){return new J.a(new URL(location.href))}function Q(){return location.hash.substring(1)}function X(e){const t=L("a");t.href=e,t.addEventListener("click",e=>e.stopPropagation()),t.click()}var V=a(5);function G(e){const t=matchMedia(e);return new V.a(e=>{t.addListener(t=>e.next(t.matches))}).pipe(Object(P.a)(t.matches),Object(f.a)({bufferSize:1,refCount:!0}))}const Z={drawer:A("[data-md-toggle=drawer]"),search:A("[data-md-toggle=search]")};function ee(e,t){Z[e].checked!==t&&Z[e].click()}function te(e){const t=Z[e];return Object(b.a)(t,"change").pipe(Object(m.a)(()=>t.checked),Object(P.a)(t.checked))}function ae(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function ce({x:e,y:t}){window.scrollTo(e||0,t||0)}function ne(){return{width:innerWidth,height:innerHeight}}function re(e,{header$:t,viewport$:a}){const c=a.pipe(Object(S.a)("size")),n=Object(i.a)([c,t]).pipe(Object(m.a)(()=>({x:e.offsetLeft,y:e.offsetTop})));return Object(i.a)([t,a,n]).pipe(Object(m.a)(([{height:e},{offset:t,size:a},{x:c,y:n}])=>({offset:{x:t.x-c,y:t.y-n+e},size:a})))}var oe=a(62),ie=a(63);var se=a(12),be=a(77);let ue;function pe(e){return ue.pipe(Object(d.a)(t=>void 0!==t[e]?Object(s.a)(t[e]):se.a),Object(g.a)())}var le=a(28),fe=a(65);function de({document$:e,viewport$:t}){return Object(le.a)(Object(d.a)(a=>{const c=function(e,{document$:t}){return t.pipe(Object(m.a)(()=>{const t=getComputedStyle(e);return["sticky","-webkit-sticky"].includes(t.position)}),Object(g.a)(),Object(d.a)(t=>t?D(e).pipe(Object(m.a)(({height:e})=>({sticky:!0,height:e}))):Object(s.a)({sticky:!1,height:0})),Object(f.a)({bufferSize:1,refCount:!0}))}(a,{document$:e}),n=pe("main").pipe(Object(m.a)(e=>T("h1, h2, h3, h4, h5, h6",e)),Object(h.a)(e=>void 0!==e),Object(fe.a)(pe("header-title")),Object(d.a)(([e,a])=>re(e,{header$:c,viewport$:t}).pipe(Object(m.a)(({offset:{y:t}})=>t>=e.offsetHeight?"page":"site"),Object(g.a)(),function(e){return Object(le.a)(Object(O.a)(p.a),Object($.a)(t=>{!function(e,t){e.setAttribute("data-md-state",t?"active":"")}(e,"page"===t)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(e)}))}(a))),Object(P.a)("site"));return Object(i.a)([c,n]).pipe(Object(m.a)(([e,t])=>Object.assign({type:t},e)))}))}var he=a(10);function je({header$:e,viewport$:t}){const a=new N.a;return pe("header").pipe(Object(d.a)(e=>{return a.pipe(Object(S.a)("active"),(t=e,Object(le.a)(Object(O.a)(p.a),Object($.a)(({active:e})=>{!function(e,t){e.setAttribute("data-md-state",t?"shadow":"")}(t,e)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(t)}))));var t})).subscribe(he.a),Object(le.a)(Object(d.a)(a=>function(e,{header$:t,viewport$:a}){const c=t.pipe(Object(m.a)(({height:e})=>e),Object(g.a)()),n=c.pipe(Object(d.a)(()=>D(e).pipe(Object(m.a)(({height:t})=>({top:e.offsetTop,bottom:e.offsetTop+t})),Object(S.a)("bottom"))));return Object(i.a)([c,n,a]).pipe(Object(m.a)(([e,{top:t,bottom:a},{offset:{y:c},size:{height:n}}])=>({offset:t-e,height:n=Math.max(0,n-Math.max(0,t-c,e)-Math.max(0,n+c-a)),active:t-e<=c})),Object(g.a)((e,t)=>e.offset===t.offset&&e.height===t.height&&e.active===t.active))}(a,{header$:e,viewport$:t})),Object($.a)(e=>a.next(e)),Object(U.a)(()=>a.complete()))}function Oe(e){e.style.top=""}function me(e,{main$:t,viewport$:a}){const c=e.parentElement.offsetTop-e.parentElement.parentElement.offsetTop;return Object(i.a)([t,a]).pipe(Object(m.a)(([{offset:e,height:t},{offset:{y:a}}])=>({height:t=t+Math.min(c,Math.max(0,a-e))-c,lock:a>=e+c})),Object(g.a)((e,t)=>e.height===t.height&&e.lock===t.lock))}function ge(e,{header$:t}){return Object(le.a)(Object(O.a)(p.a),Object(j.a)(t),Object($.a)(([{height:t,lock:a},{height:c}])=>{!function(e,t){const a=e.firstElementChild;a.style.height=t-2*a.offsetTop+"px"}(e,t),a?function(e,t){e.style.top=t+"px"}(e,c):Oe(e)}),Object(m.a)(([e])=>e),Object(U.a)(()=>{Oe(e),function(e){e.firstElementChild.style.height=""}(e)}))}var ve=a(67);function $e(e){const t=new RegExp(e.separator,"img"),a=(e,t,a)=>`${t}${a}`;return c=>{c=c.replace(/[\s*+\-:~^]+/g," ").trim();const n=new RegExp(`(^|${e.separator})(${c.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(t,"|")})`,"img");return e=>e.replace(n,a).replace(/<\/mark>(\s+)]*>/gim,"$1")}}function ye(e){return e.split(/"([^"]+)"/g).map((e,t)=>1&t?e.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):e).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}function we(e,t){if("string"==typeof t||"number"==typeof t)e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(const a of t)we(e,a)}function xe(e,t,...a){const c=document.createElement(e);if(t)for(const e of Object.keys(t))"boolean"!=typeof t[e]?c.setAttribute(e,t[e]):t[e]&&c.setAttribute(e,"");for(const e of a)we(c,e);return c}let Se;function ke(e,t){if(void 0===Se){const e=A("#__lang");Se=JSON.parse(e.textContent)}if(void 0===Se[e])throw new ReferenceError("Invalid translation: "+e);return void 0!==t?Se[e].replace("#",t.toString()):Se[e]}function _e(e){if(e>999){return((e+1e-6)/1e3).toFixed(+((e-950)%1e3>99))+"k"}return e.toString()}var Ee;function Te(e){return e.type===Ee.READY}function Ae(e){return e.type===Ee.QUERY}function Ce(e){return e.type===Ee.RESULT}function Me({config:e,docs:t,index:a,options:c}){1===e.lang.length&&"en"===e.lang[0]&&(e.lang=[ke("search.config.lang")]),"[\\s\\-]+"===e.separator&&(e.separator=ke("search.config.separator"));const n=ke("search.config.pipeline").split(/\s*,\s*/).filter(Boolean);return{config:e,docs:t,index:a,options:Object.assign(Object.assign({},c),{pipeline:n,suggestions:!0})}}function Le(e,{index$:t,base$:a}){const c=new Worker(e),n=new N.a,r=function(e,{tx$:t}){const a=Object(b.a)(e,"message").pipe(Object(m.a)(({data:e})=>e));return t.pipe(Object(oe.a)(()=>a,{leading:!0,trailing:!0}),Object($.a)(t=>e.postMessage(t)),Object(ie.a)(a),Object(F.a)())}(c,{tx$:n}).pipe(Object(j.a)(a),Object(m.a)(([e,t])=>{if(Ce(e))for(const a of e.data.items)for(const e of a)e.location=`${t}/${e.location}`;return e}),Object(F.a)());return t.pipe(Object(m.a)(e=>({type:Ee.SETUP,data:Me(e)})),Object(O.a)(u.b)).subscribe(n.next.bind(n)),{tx$:n,rx$:r}}!function(e){e[e.SETUP=0]="SETUP",e[e.READY=1]="READY",e[e.QUERY=2]="QUERY",e[e.RESULT=3]="RESULT"}(Ee||(Ee={}));var Re,Pe=a(37);function ze(e,t){const a=t&Re.PARENT,c=t&Re.TEASER,n=Object.keys(e.terms).filter(t=>!e.terms[t]).map(e=>[xe("del",null,e)," "]).flat().slice(0,-1),r=new URL(e.location);r.searchParams.append("h",Object.entries(e.terms).reduce((e,[t,a])=>`${e} ${a?t:""}`,"").replace(/%20/g,"+"));return xe("a",{href:""+r,class:"md-search-result__link",tabIndex:-1},xe("article",{class:["md-search-result__article",...a?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},a>0&&xe("div",{class:"md-search-result__icon md-icon"}),xe("h1",{class:"md-search-result__title"},e.title),c>0&&e.text.length>0&&xe("p",{class:"md-search-result__teaser"},function(e,t){let a=t;if(e.length>a){for(;" "!==e[a]&&--a>0;);return e.substring(0,a)+"..."}return e}(e.text,320)),c>0&&n.length>0&&xe("p",{class:"md-search-result__terms"},ke("search.result.term.missing"),": ",n)))}function He(e,t=1/0){const a=[...e],c=a.findIndex(e=>!e.location.includes("#")),[n]=a.splice(c,1);let r=a.findIndex(e=>e.scoreze(e,Re.TEASER)),...i.length?[xe("details",{class:"md-search-result__more"},xe("summary",{tabIndex:-1},i.length>0&&1===i.length?ke("search.result.more.one"):ke("search.result.more.other",i.length)),i.map(e=>ze(e,Re.TEASER)))]:[]];return xe("li",{class:"md-search-result__item"},s)}function qe(e){return xe("ul",{class:"md-source__facts"},e.map(e=>xe("li",{class:"md-source__fact"},e)))}function Ne({document$:e,dialog$:t}){if(!Pe.isSupported())return n.a;e.subscribe(()=>{M("pre > code").forEach((e,t)=>{const a=e.parentElement;var c;a.id="__code_"+t,a.insertBefore((c=a.id,xe("button",{class:"md-clipboard md-icon",title:ke("clipboard.copy"),"data-clipboard-target":`#${c} > code`})),e)})});const a=new V.a(e=>{new Pe(".md-clipboard").on("success",t=>e.next(t))}).pipe(Object(F.a)());return a.pipe(Object($.a)(e=>e.clearSelection()),Object(k.a)(ke("clipboard.copied"))).subscribe(t),a}!function(e){e[e.TEASER=1]="TEASER",e[e.PARENT=2]="PARENT"}(Re||(Re={}));var Ue=a(68),Ie=a(78);function We(e,{document$:t,viewport$:a,location$:c}){"scrollRestoration"in history&&(history.scrollRestoration="manual"),Object(b.a)(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"});const r=T('link[rel="shortcut icon"]');void 0!==r&&(r.href=r.href);const i=Object(b.a)(document.body,"click").pipe(Object(h.a)(e=>!(e.metaKey||e.ctrlKey)),Object(d.a)(t=>{if(t.target instanceof HTMLElement){const a=t.target.closest("a");if(a&&!a.target&&Y(a)&&e.includes(a.href))return K(a)||t.preventDefault(),Object(s.a)(a)}return n.a}),Object(m.a)(e=>({url:new URL(e.href)})),Object(F.a)());i.subscribe(()=>{ee("search",!1)});const u=i.pipe(Object(h.a)(({url:e})=>!K(e)),Object(F.a)()),p=Object(b.a)(window,"popstate").pipe(Object(h.a)(e=>null!==e.state),Object(m.a)(e=>({url:new URL(location.href),offset:e.state})),Object(F.a)());Object(l.a)(u,p).pipe(Object(g.a)((e,t)=>e.url.href===t.url.href),Object(m.a)(({url:e})=>e)).subscribe(c);const f=c.pipe(Object(S.a)("pathname"),Object(Ue.a)(1),Object(d.a)(e=>Object(o.a)(fetch(e.href,{credentials:"same-origin"}).then(e=>e.text())).pipe(Object(v.a)(()=>(function(e){location.href=e.href}(e),n.a)))),Object(F.a)());u.pipe(Object(ve.a)(f)).subscribe(({url:e})=>{history.pushState({},"",e.toString())});const j=new DOMParser;f.pipe(Object(m.a)(e=>j.parseFromString(e,"text/html"))).subscribe(t);Object(l.a)(u,p).pipe(Object(ve.a)(t)).subscribe(({url:e,offset:t})=>{e.hash&&!t?X(e.hash):ce(t||{y:0})}),t.pipe(Object(Ue.a)(1)).subscribe(({title:e,head:t})=>{document.title=e;for(const e of['link[rel="canonical"]','meta[name="author"]','meta[name="description"]']){const a=T(e,t),c=T(e,document.head);void 0!==a&&void 0!==c&&R(c,a)}document.dispatchEvent(new CustomEvent("DOMContentSwitch"))}),a.pipe(Object(Ie.a)(250),Object(S.a)("offset")).subscribe(({offset:e})=>{history.replaceState(e,"")}),Object(l.a)(i,p).pipe(Object(x.a)(2,1),Object(h.a)(([e,t])=>e.url.pathname===t.url.pathname&&!K(t.url)),Object(m.a)(([,e])=>e)).subscribe(({offset:e})=>{ce(e||{y:0})})}function De(){const e=Object(b.a)(window,"keydown").pipe(Object(h.a)(e=>!(e.metaKey||e.ctrlKey)),Object(m.a)(e=>({type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),Object(F.a)()).pipe(Object(m.a)(e=>{return Object.assign({mode:(t="search",Z[t].checked?"search":"global")},e);var t}),Object(h.a)(({mode:e})=>{if("global"===e){const e=C();if(void 0!==e)return!function(e){switch(e.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return!0;default:return e.isContentEditable}}(e)}return!0}),Object(F.a)());return e.pipe(Object(h.a)(({mode:e})=>"search"===e),Object(j.a)(pe("search-query"),pe("search-result"),pe("search-suggest"))).subscribe(([e,t,a,c])=>{const n=C();switch(e.type){case"Enter":if(n===t){const t=new Map;for(const e of M(":first-child [href]",a)){const a=e.firstElementChild;t.set(e,parseFloat(a.getAttribute("data-md-score")))}if(t.size){const[[e]]=[...t].sort(([,e],[,t])=>t-e);e.click()}e.claim()}break;case"Escape":case"Tab":ee("search",!1),z(t,!1);break;case"ArrowUp":case"ArrowDown":if(void 0===n)z(t);else{const c=[t,...M(":not(details) > [href], summary, details[open] [href]",a)],r=Math.max(0,(Math.max(0,c.indexOf(n))+c.length+("ArrowUp"===e.type?-1:1))%c.length);z(c[r])}e.claim();break;case"ArrowRight":c.innerText.length&&t.selectionStart===t.value.length&&(t.value=c.innerText);break;default:t!==C()&&z(t)}}),e.pipe(Object(h.a)(({mode:e})=>"global"===e),Object(j.a)(pe("search-query"))).subscribe(([e,t])=>{switch(e.type){case"f":case"s":case"/":z(t),function(e){if(!(e instanceof HTMLInputElement))throw new Error("Not implemented");e.select()}(t),e.claim();break;case"p":case",":const a=T("[href][rel=prev]");void 0!==a&&a.click();break;case"n":case".":const c=T("[href][rel=next]");void 0!==c&&c.click()}}),e}function Fe(e){e.placeholder=ke("search.placeholder")}function Je(e,{transform:t}={}){const a=t||ye,c=Object(l.a)(Object(b.a)(e,"keyup"),Object(b.a)(e,"focus").pipe(Object(y.a)(1))).pipe(Object(m.a)(()=>a(e.value)),Object(P.a)(a(e.value)),Object(g.a)()),n=function(e){return Object(l.a)(Object(b.a)(e,"focus"),Object(b.a)(e,"blur")).pipe(Object(m.a)(({type:e})=>"focus"===e),Object(P.a)(e===C()))}(e);return Object(i.a)([c,n]).pipe(Object(m.a)(([e,t])=>({value:e,focus:t})))}function Ye({tx$:e},t={}){return Object(le.a)(Object(d.a)(a=>{const c=Je(a,t);return c.pipe(Object(S.a)("value"),Object(m.a)(({value:e})=>({type:Ee.QUERY,data:e}))).subscribe(e.next.bind(e)),c.pipe(Object(S.a)("focus")).subscribe(({focus:e})=>{e&&ee("search",e)}),c.pipe(function(e){return Object(le.a)(Object($.a)(({focus:t})=>{t?function(e,t){e.placeholder=t}(e,""):Fe(e)}),Object(U.a)(()=>{Fe(e)}))}(a))}))}function Ke(){return Object(le.a)(Object(d.a)(e=>function(e){return Object(b.a)(e,"click").pipe(Object(k.a)(void 0))}(e).pipe(Object(ie.a)(pe("search-query")),Object($.a)(z),Object(k.a)(void 0))),Object(P.a)(void 0))}function Be(e,t){e.appendChild(t)}function Qe(e,{query$:t,fetch$:a}){const c=A(".md-search-result__list",e),n=A(".md-search-result__meta",e);return Object(le.a)(Object(j.a)(t),Object(m.a)(([e,t])=>{const{items:a}=e;return t.value?function(e,t){switch(t){case 0:e.textContent=ke("search.result.none");break;case 1:e.textContent=ke("search.result.one");break;default:e.textContent=ke("search.result.other",t)}}(n,a.length):function(e){e.textContent=ke("search.result.placeholder")}(n),e}),Object(d.a)(t=>{const{items:n}=t,r=[...n.map(([e])=>e.score),0];return a.pipe(Object(O.a)(p.a),Object(be.a)(t=>{const a=e.parentElement;for(;t16)););return t},0),Object(k.a)(t),Object(U.a)(()=>{!function(e){e.innerHTML=""}(c)}))}))}function Xe({rx$:e},{query$:t}){return Object(le.a)(Object(d.a)(a=>{const c=a.parentElement,n=function(e){return Object(l.a)(Object(b.a)(e,"scroll"),Object(b.a)(window,"resize")).pipe(Object(m.a)(()=>H(e)),Object(P.a)(H(e)))}(c).pipe(Object(m.a)(({y:e})=>e>=c.scrollHeight-c.offsetHeight-16),Object(g.a)(),Object(h.a)(Boolean));return e.pipe(Object(h.a)(Ce),Object(m.a)(({data:e})=>e),Qe(a,{query$:t,fetch$:n}))}))}function Ve({header$:e,viewport$:t,screen$:a}){return Object(le.a)(Object(d.a)(c=>a.pipe(Object(d.a)(a=>a?re(c,{header$:e,viewport$:t}).pipe(Object(m.a)(({offset:{y:e}})=>({hidden:e>=10})),Object(S.a)("hidden"),function(e){return Object(le.a)(Object(O.a)(p.a),Object($.a)(({hidden:t})=>{!function(e,t){e.setAttribute("data-md-state",t?"hidden":"")}(e,t)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(e)}))}(c)):Object(s.a)({hidden:!0})))))}function Ge(e){e.removeAttribute("data-md-state")}function Ze(e){e.classList.remove("md-nav__link--active")}function et({header$:e,main$:t,viewport$:a,tablet$:c}){return Object(le.a)(Object(d.a)(n=>c.pipe(Object(d.a)(c=>{if(c){const c=M(".md-nav__link",n),r=me(n,{main$:t,viewport$:a}).pipe(ge(n,{header$:e})),o=function(e,{header$:t,viewport$:a}){const c=new Map;for(const t of e){const e=T(`[id="${decodeURIComponent(t.hash.substring(1))}"]`);void 0!==e&&c.set(t,e)}const n=t.pipe(Object(m.a)(e=>18+e.height));return D(document.body).pipe(Object(S.a)("height"),Object(m.a)(()=>{let e=[];return[...c].reduce((t,[a,n])=>{for(;e.length;){if(!(c.get(e[e.length-1]).tagName>=n.tagName))break;e.pop()}let r=n.offsetTop;for(;!r&&n.parentElement;)r=(n=n.parentElement).offsetTop;return t.set([...e=[...e,a]].reverse(),r)},new Map)}),Object(d.a)(e=>Object(i.a)([n,a]).pipe(Object(be.a)(([e,t],[a,{offset:{y:c}}])=>{for(;t.length;){const[,n]=t[0];if(!(n-a=c))break;t=[e.pop(),...t]}return[e,t]},[[],[...e]]),Object(g.a)((e,t)=>e[0]===t[0]&&e[1]===t[1])))).pipe(Object(m.a)(([e,t])=>({prev:e.map(([e])=>e),next:t.map(([e])=>e)})),Object(P.a)({prev:[],next:[]}),Object(x.a)(2,1),Object(m.a)(([e,t])=>e.prev.length{for(const[e]of t)Ze(e),Ge(e);e.forEach(([t],a)=>{!function(e,t){e.classList.toggle("md-nav__link--active",t)}(t,a===e.length-1),function(e,t){e.setAttribute("data-md-state",t?"blur":"")}(t,!0)})}),Object(U.a)(()=>{for(const t of e)Ze(t),Ge(t)}))}(c));return Object(i.a)([r,o]).pipe(Object(m.a)(([e,t])=>({sidebar:e,anchors:t})))}return Object(s.a)({})}))))}var tt=a(71);var at=a(72);function ct(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}var nt=a(73);function rt(e){const[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":const[,t,a]=e.match(/^.+github\.com\/([^\/]+)\/?([^\/]+)?/i);return function(e,t){const a=void 0!==t?`https://api.github.com/repos/${e}/${t}`:"https://api.github.com/users/"+e;return Object(o.a)(fetch(a)).pipe(Object(h.a)(e=>200===e.status),Object(d.a)(e=>e.json()),Object(m.a)(e=>{if(void 0!==t){const{stargazers_count:t,forks_count:a}=e;return[_e(t)+" Stars",_e(a)+" Forks"]}{const{public_repos:t}=e;return[_e(t)+" Repositories"]}}),Object(nt.a)([]),Object(F.a)())}(t,a);case"gitlab":const[,c,r]=e.match(/^.+?([^\/]*gitlab[^\/]+)\/(.+?)\/?$/i);return function(e,t){const a=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Object(o.a)(fetch(a)).pipe(Object(h.a)(e=>200===e.status),Object(d.a)(e=>e.json()),Object(m.a)(({star_count:e,forks_count:t})=>[_e(e)+" Stars",_e(t)+" Forks"]),Object(nt.a)([]),Object(F.a)())}(c,r);default:return n.a}}function ot({document$:e}){e.pipe(Object(m.a)(()=>A(".md-source[href]")),Object(d.a)(({href:e})=>{return t=""+function(e){let t=0;for(let a=0,c=e.length;art(e),Object(r.a)(()=>{const e=sessionStorage.getItem(t);if(e)return Object(s.a)(JSON.parse(e));{const e=a();return e.subscribe(e=>{try{sessionStorage.setItem(t,JSON.stringify(e))}catch(e){}}),e}});var t,a}),Object(h.a)(e=>e.length>0),Object(v.a)(()=>n.a)).subscribe(e=>{for(const t of M(".md-source__repository"))t.hasAttribute("data-md-state")||(t.setAttribute("data-md-state","done"),t.appendChild(qe(e)))})}function it(e,t){e.setAttribute("data-md-state","lock"),e.style.top=`-${t}px`}function st(e){const t=-1*parseInt(e.style.top,10);e.removeAttribute("data-md-state"),e.style.top="",t&&window.scrollTo(0,t)}function bt(e){if(!function(e){return"object"==typeof e&&"string"==typeof e.base&&"object"==typeof e.features&&"object"==typeof e.search}(e))throw new SyntaxError("Invalid configuration: "+JSON.stringify(e));const t=function(){const e=new E.a;return Object(b.a)(document,"DOMContentLoaded").pipe(Object(k.a)(document)).subscribe(e),e}(),a=B(),A=function(e,{location$:t}){return t.pipe(Object(w.a)(1),Object(m.a)(({href:t})=>new URL(e,t).toString().replace(/\/$/,"")),Object(f.a)({bufferSize:1,refCount:!0}))}(e.base,{location$:a}),C=Object(b.a)(window,"hashchange").pipe(Object(m.a)(Q),Object(P.a)(Q()),Object(h.a)(e=>e.length>0),Object(F.a)()),z=Object(i.a)([Object(l.a)(Object(b.a)(window,"scroll",{passive:!0}),Object(b.a)(window,"resize",{passive:!0})).pipe(Object(m.a)(ae),Object(P.a)(ae())),Object(b.a)(window,"resize",{passive:!0}).pipe(Object(m.a)(ne),Object(P.a)(ne()))]).pipe(Object(m.a)(([e,t])=>({offset:e,size:t})),Object(f.a)({bufferSize:1,refCount:!0})),H=G("(min-width: 960px)"),q=G("(min-width: 1220px)");!function(e,{document$:t}){ue=t.pipe(Object(m.a)(t=>e.reduce((e,a)=>{const c=T(`[data-md-component=${a}]`,t);return Object.assign(Object.assign({},e),void 0!==c?{[a]:c}:{})},{})),Object(be.a)((t,a)=>{for(const c of e)switch(c){case"announce":case"header-topic":case"container":case"skip":c in t&&void 0!==t[c]&&(R(t[c],a[c]),t[c]=a[c]);break;default:void 0!==a[c]?t[c]=T(`[data-md-component=${c}]`):delete t[c]}return t}),Object(f.a)({bufferSize:1,refCount:!0}))}(["announce","container","header","header-title","header-topic","main","navigation","search","search-query","search-reset","search-result","search-suggest","skip","tabs","toc"],{document$:t});const U=De();matchMedia("(hover)").matches&&function({document$:e,viewport$:t}){const a=e.pipe(Object(m.a)(()=>M("pre > code"))),c=t.pipe(Object(S.a)("size"));Object(i.a)([a,c]).subscribe(([e])=>{for(const t of e)t.scrollWidth>t.clientWidth?t.setAttribute("tabindex","0"):t.removeAttribute("tabindex")})}({document$:t,viewport$:z}),function({document$:e,hash$:t}){const a=e.pipe(Object(m.a)(()=>M("details")));Object(l.a)(G("print").pipe(Object(h.a)(Boolean)),Object(b.a)(window,"beforeprint")).pipe(Object(ie.a)(a)).subscribe(e=>{for(const t of e)t.setAttribute("open","")}),t.pipe(Object(m.a)(e=>T(`[id="${e}"]`)),Object(h.a)(e=>void 0!==e),Object($.a)(e=>{const t=e.closest("details");t&&!t.open&&t.setAttribute("open","")})).subscribe(e=>e.scrollIntoView())}({document$:t,hash$:C}),function({document$:e}){e.pipe(Object(Ue.a)(1),Object(j.a)(pe("container")),Object(m.a)(([,e])=>M("script",e))).pipe(Object(d.a)(e=>Object(s.a)(...e)),Object(tt.a)(e=>{const t=L("script");return e.src?(t.src=e.src,R(e,t),new V.a(e=>{t.onload=()=>e.complete()})):(t.textContent=e.textContent,R(e,t),se.a)})).subscribe(he.a)}({document$:t}),ot({document$:t}),function({document$:e}){const t=L("table");e.pipe(Object(m.a)(()=>M("table:not([class])"))).subscribe(e=>{for(const a of e)R(a,t),R(t,xe("div",{class:"md-typeset__scrollwrap"},xe("div",{class:"md-typeset__table"},a)))})}({document$:t}),function({document$:e}){const t=e.pipe(Object(m.a)(()=>M("[data-md-scrollfix]")),Object(f.a)({bufferSize:1,refCount:!0}));t.subscribe(e=>{for(const t of e)t.removeAttribute("data-md-scrollfix")}),Object(at.a)(ct,t,n.a).pipe(Object(d.a)(e=>Object(l.a)(...e.map(e=>Object(b.a)(e,"touchstart").pipe(Object(k.a)(e)))))).subscribe(e=>{const t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})}({document$:t});const I=function({duration:e}={}){const t=new N.a,a=L("div");return a.classList.add("md-dialog","md-typeset"),t.pipe(Object(d.a)(t=>Object(s.a)(document.body).pipe(Object(m.a)(e=>e.appendChild(a)),Object(O.a)(p.a),Object(y.a)(1),Object($.a)(e=>{e.innerHTML=t,e.setAttribute("data-md-state","open")}),Object(y.a)(e||2e3),Object($.a)(e=>e.removeAttribute("data-md-state")),Object(y.a)(400),Object($.a)(e=>{e.innerHTML="",e.remove()})))).subscribe(he.a),t}(),W=Ne({document$:t,dialog$:I}),D=pe("header").pipe(de({document$:t,viewport$:z}),Object(f.a)({bufferSize:1,refCount:!0})),J=pe("main").pipe(je({header$:D,viewport$:z}),Object(f.a)({bufferSize:1,refCount:!0})),K=pe("navigation").pipe(function({header$:e,main$:t,viewport$:a,screen$:c}){return Object(le.a)(Object(d.a)(n=>c.pipe(Object(d.a)(c=>c?me(n,{main$:t,viewport$:a}).pipe(ge(n,{header$:e}),Object(m.a)(e=>({sidebar:e}))):Object(s.a)({})))))}({header$:D,main$:J,viewport$:z,screen$:q}),Object(f.a)({bufferSize:1,refCount:!0})),Z=pe("toc").pipe(et({header$:D,main$:J,viewport$:z,tablet$:H}),Object(f.a)({bufferSize:1,refCount:!0})),ce=e.features.includes("navigation.tabs.sticky")?n.a:pe("tabs").pipe(Ve({header$:D,viewport$:z,screen$:q}),Object(f.a)({bufferSize:1,refCount:!0})),re=pe("search").pipe(Object(d.a)(()=>Object(r.a)(()=>{const t=e.search&&e.search.index?e.search.index:void 0,n=void 0!==t?Object(o.a)(t):A.pipe(Object(d.a)(e=>fetch(e+"/search/search_index.json",{credentials:"same-origin"}).then(e=>e.json())));return e.features.includes("search.highlight")&&Object(i.a)([a,n]).subscribe(([e,t])=>{if(!e.searchParams.has("h"))return;const a=$e(t.config)(e.searchParams.get("h"));let n=e.hash?T(`[id="${e.hash.slice(1)}"]`):T("article");if(void 0!==n)for(;n;){const e=document.createNodeIterator(n,NodeFilter.SHOW_TEXT),t=[];for(;;){const a=e.nextNode();if(!a)break;t.push(a)}for(const e of t)e.textContent.trim()&&e.replaceWith(xe("span",null,a(c(e.textContent))));if("article"===n.tagName)break;{const e=n.nextSibling;if(e instanceof HTMLElement&&e.tagName.match(/^H[1-6]/))break;n=e}}}),Object(s.a)(Le(e.search.worker,{base$:A,index$:n}))}))).pipe(Object(d.a)(t=>{const a=new URLSearchParams(document.location.search);a.get("q")&&(pe("search-suggest").subscribe(e=>{e.innerText=a.get("q"),pe("search-query").subscribe(e=>e.focus())}),t.rx$.pipe(Object(h.a)(Te),Object(d.a)(()=>pe("search-query"))).subscribe(e=>{e.blur(),e.value=a.get("q"),e.focus()}));const c=pe("search-query").pipe(Ye(t,{transform:e.search.transform}),Object(f.a)({bufferSize:1,refCount:!0})),n=pe("search-reset").pipe(Ke(),Object(f.a)({bufferSize:1,refCount:!0})),r=pe("search-result").pipe(Xe(t,{query$:c}),Object(f.a)({bufferSize:1,refCount:!0}));return e.features.includes("search.suggest")&&(r.pipe(Object(j.a)(c)).subscribe(([{suggestions:e},t])=>{if(void 0!==e){const a=document.querySelector(".md-search__suggest"),c=t.value.split(/([\s-]+)/);if(e.length){const[n]=e.slice(-1);if(e.length>=t.value.split(/[\s-]+/).length&&n.startsWith(c[c.length-1])){const e=document.createElement("span");e.innerHTML=[...c.slice(0,-1),n].join(""),a.innerHTML="",a.appendChild(e)}else a.innerHTML=""}else a.innerHTML=""}}),pe("search-query").pipe(Object(d.a)(e=>Object(b.a)(e,"keydown").pipe(Object(O.a)(u.b),Object(m.a)(()=>e.value),Object(g.a)(),Object(m.a)(()=>{const t=document.querySelector(".md-search__suggest span");t&&(t.innerHTML.startsWith(e.value)&&!e.value.endsWith(" ")&&0!==e.value.length||(t.innerHTML=""))})))).subscribe()),pe("search").pipe(function({rx$:e,tx$:t},{query$:a,reset$:c,result$:n}){return Object(le.a)(Object(d.a)(()=>{const r=e.pipe(Object(h.a)(Te),Object(k.a)("ready"),Object(P.a)("waiting"));return t.pipe(Object(h.a)(Ae),Object(ve.a)(r),Object(w.a)(1)).subscribe(t.next.bind(t)),Object(i.a)([r,a,n,c]).pipe(Object(m.a)(([e,t,a])=>({status:e,query:t,result:a})))}))}(t,{query$:c,reset$:n,result$:r}))}),Object(v.a)(()=>(pe("search").subscribe(e=>e.hidden=!0),n.a)),Object(f.a)({bufferSize:1,refCount:!0}));if(C.pipe(Object($.a)(()=>ee("search",!1)),Object(y.a)(125)).subscribe(e=>X("#"+e)),Object(i.a)([te("search"),H]).pipe(Object(j.a)(z),Object(d.a)(([[e,a],{offset:{y:c}}])=>{const n=e&&!a;return t.pipe(Object(y.a)(n?400:100),Object(O.a)(p.a),Object($.a)(({body:e})=>n?it(e,c):st(e)))})).subscribe(),Object(b.a)(document.body,"click").pipe(Object(h.a)(e=>!(e.metaKey||e.ctrlKey)),Object(h.a)(e=>{if(e.target instanceof HTMLElement){const t=e.target.closest("a");if(t&&Y(t))return!0}return!1})).subscribe(()=>{ee("drawer",!1)}),e.features.includes("navigation.instant")&&"file:"!==location.protocol){const e=new DOMParser;A.pipe(Object(d.a)(t=>Object(o.a)(fetch(t+"/sitemap.xml").then(e=>e.text()).then(t=>e.parseFromString(t,"text/xml")))),Object(j.a)(A),Object(m.a)(([e,t])=>{const a=M("loc",e).map(e=>e.textContent);if(a.length>1){const[e,c]=a.sort((e,t)=>e.length-t.length);let n=0;if(e===c)n=e.length;else for(;e.charAt(n)===c.charAt(n);)n++;for(let c=0;c{We(e,{document$:t,location$:a,viewport$:z})})}U.pipe(Object(h.a)(e=>"global"===e.mode&&"Tab"===e.type),Object(w.a)(1)).subscribe(()=>{for(const e of M(".headerlink"))e.style.visibility="visible"}),t.subscribe(()=>{const e=M("[data-md-state=indeterminate]");for(const t of e)t.dataset.mdState="",t.indeterminate=!0,t.checked=!1});const oe=M("[data-md-option=palette]");for(let e=0;e{for(const e of["mdColorScheme","mdColorPrimary","mdColorAccent"])t.dataset[e]&&(document.body.dataset[e]=t.dataset[e]);oe[e].dataset.mdState="hidden";const a=oe[(e+1)%oe.length];a.dataset.mdState="",a.focus(),localStorage.setItem("__palette",JSON.stringify({index:e,color:{scheme:t.dataset.mdColorScheme,primary:t.dataset.mdColorPrimary,accent:t.dataset.mdColorAccent}}))})}if(oe.length){const{index:e}=JSON.parse(localStorage.getItem("__palette")||'{ "index": 0 }');oe[(+e+1)%oe.length].dataset.mdState=""}if(e.features.includes("header.autohide")&&z.pipe(Object(m.a)(({offset:e})=>e.y),Object(x.a)(2,1),Object(m.a)(([e,t])=>[ez.pipe(Object(m.a)(({offset:e})=>e.y),Object(h.a)(e=>e>400),Object(m.a)(e=>Math.abs(t-e)),Object(h.a)(e=>e>100),Object(k.a)(e),Object(w.a)(1)))).subscribe(e=>{const t=T("[data-md-component=header]");null==t||t.setAttribute("data-md-state",e?"hidden":"shadow")}),void 0!==e.version&&"mike"===e.version.method){const e=A.pipe(Object(d.a)(e=>fetch(e+"/../versions.json",{credentials:"same-origin"}).then(e=>e.json())),Object(v.a)(()=>(console.log("Couldn't load versions.json"),n.a)));pe("header-title").pipe(Object(m.a)(e=>e.querySelector(".md-header-nav__topic")),Object(_.a)(A,e)).subscribe(([e,t,a])=>{e.appendChild(function(e,t){const[,a]=e.match(/([^\/]+)\/?$/);return xe("div",{class:"md-version"},xe("span",{class:"md-version__current"},(t.find(({version:e})=>e===a)||t[0]).version),xe("ul",{class:"md-version__list"},t.map(t=>xe("li",{class:"md-version__item"},xe("a",{class:"md-version__link",href:`${e}/../${t.version}/`},t.title)))))}(t,a))})}const fe={document$:t,location$:a,viewport$:z,header$:D,main$:J,navigation$:K,search$:re,tabs$:ce,toc$:Z,clipboard$:W,keyboard$:U,dialog$:I};return Object(l.a)(...Object.values(fe)).subscribe(),fe}document.documentElement.classList.remove("no-js"),document.documentElement.classList.add("js"),navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&document.documentElement.classList.add("ios")}})); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.ar.min.js b/0.3/assets/javascripts/lunr/min/lunr.ar.min.js new file mode 100644 index 00000000..248ddc5d --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.ar.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWordFilter,e.ar.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ar.stemmer))},e.ar.wordCharacters="ء-ٛٱـ",e.ar.trimmer=e.trimmerSupport.generateTrimmer(e.ar.wordCharacters),e.Pipeline.registerFunction(e.ar.trimmer,"trimmer-ar"),e.ar.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ف ك ب و س ل ن ا ي ت",pre2:"ال لل",pre3:"بال وال فال تال كال ولل",pre4:"فبال كبال وبال وكال"},e.suf={suf1:"ه ك ت ن ا ي",suf2:"نك نه ها وك يا اه ون ين تن تم نا وا ان كم كن ني نن ما هم هن تك ته ات يه",suf3:"تين كهم نيه نهم ونه وها يهم ونا ونك وني وهم تكم تنا تها تني تهم كما كها ناه نكم هنا تان يها",suf4:"كموه ناها ونني ونهم تكما تموه تكاه كماه ناكم ناهم نيها وننا"},e.patterns=JSON.parse('{"pt43":[{"pt":[{"c":"ا","l":1}]},{"pt":[{"c":"ا,ت,ن,ي","l":0}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"و","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ي","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ا","l":2},{"c":"ل","l":3,"m":3}]},{"pt":[{"c":"م","l":0}]}],"pt53":[{"pt":[{"c":"ت","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":3},{"c":"ل","l":3,"m":4},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":3}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ن","l":4}]},{"pt":[{"c":"ت","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"م","l":0},{"c":"و","l":3}]},{"pt":[{"c":"ا","l":1},{"c":"و","l":3}]},{"pt":[{"c":"و","l":1},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"ا","l":2},{"c":"ن","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":1},{"c":"ا","l":3}]},{"pt":[{"c":"ي,ت,ا,ن","l":0},{"c":"ت","l":1}],"mPt":[{"c":"ف","l":0,"m":2},{"c":"ع","l":1,"m":3},{"c":"ا","l":2},{"c":"ل","l":3,"m":4}]},{"pt":[{"c":"ت,ي,ا,ن","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":2},{"c":"ي","l":3}]},{"pt":[{"c":"ا,ي,ت,ن","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ء","l":4}]}],"pt63":[{"pt":[{"c":"ا","l":0},{"c":"ت","l":2},{"c":"ا","l":4}]},{"pt":[{"c":"ا,ت,ن,ي","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"و","l":3}]},{"pt":[{"c":"م","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ي","l":1},{"c":"ي","l":3},{"c":"ا","l":4},{"c":"ء","l":5}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ا","l":4}]}],"pt54":[{"pt":[{"c":"ت","l":0}]},{"pt":[{"c":"ا,ي,ت,ن","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"م","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":2}]}],"pt64":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":1}]}],"pt73":[{"pt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ا","l":5}]}],"pt75":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":5}]}]}'),e.execArray=["cleanWord","removeDiacritics","cleanAlef","removeStopWords","normalizeHamzaAndAlef","removeStartWaw","removePre432","removeEndTaa","wordCheck"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHamzaAndAlef=function(){return e.word=e.word.replace("ؤ","ء"),e.word=e.word.replace("ئ","ء"),e.word=e.word.replace(/([\u0627])\1+/gi,"ا"),!1},e.removeEndTaa=function(){return!(e.word.length>2)||(e.word=e.word.replace(/[\u0627]$/,""),e.word=e.word.replace("ة",""),!1)},e.removeStartWaw=function(){return e.word.length>3&&"و"==e.word[0]&&"و"==e.word[1]&&(e.word=e.word.slice(1)),!1},e.removePre432=function(){var r=e.word;if(e.word.length>=7){var t=new RegExp("^("+e.pre.pre4.split(" ").join("|")+")");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=6){var c=new RegExp("^("+e.pre.pre3.split(" ").join("|")+")");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=5){var l=new RegExp("^("+e.pre.pre2.split(" ").join("|")+")");e.word=e.word.replace(l,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.patternCheck=function(r){for(var t=0;t3){var t=new RegExp("^("+e.pre.pre1.split(" ").join("|")+")");e.word=e.word.replace(t,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.removeSuf1=function(){var r=e.word;if(0==e.sufRemoved&&e.word.length>3){var t=new RegExp("("+e.suf.suf1.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.removeSuf432=function(){var r=e.word;if(e.word.length>=6){var t=new RegExp("("+e.suf.suf4.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=5){var c=new RegExp("("+e.suf.suf3.split(" ").join("|")+")$");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=4){var l=new RegExp("("+e.suf.suf2.split(" ").join("|")+")$");e.word=e.word.replace(l,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.wordCheck=function(){for(var r=(e.word,[e.removeSuf432,e.removeSuf1,e.removePre1]),t=0,c=!1;e.word.length>=7&&!e.result&&t=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.de.min.js b/0.3/assets/javascripts/lunr/min/lunr.de.min.js new file mode 100644 index 00000000..f3b5c108 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.de.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!v.eq_s(1,e)||(v.ket=v.cursor,!v.in_grouping(p,97,252)))&&(v.slice_from(r),v.cursor=n,!0)}function i(){for(var r,n,i,s,t=v.cursor;;)if(r=v.cursor,v.bra=r,v.eq_s(1,"ß"))v.ket=v.cursor,v.slice_from("ss");else{if(r>=v.limit)break;v.cursor=r+1}for(v.cursor=t;;)for(n=v.cursor;;){if(i=v.cursor,v.in_grouping(p,97,252)){if(s=v.cursor,v.bra=s,e("u","U",i))break;if(v.cursor=s,e("y","Y",i))break}if(i>=v.limit)return void(v.cursor=n);v.cursor=i+1}}function s(){for(;!v.in_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function t(){m=v.limit,l=m;var e=v.cursor+3;0<=e&&e<=v.limit&&(d=e,s()||(m=v.cursor,m=v.limit)return;v.cursor++}}}function c(){return m<=v.cursor}function u(){return l<=v.cursor}function a(){var e,r,n,i,s=v.limit-v.cursor;if(v.ket=v.cursor,(e=v.find_among_b(w,7))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:v.slice_del(),v.ket=v.cursor,v.eq_s_b(1,"s")&&(v.bra=v.cursor,v.eq_s_b(3,"nis")&&v.slice_del());break;case 3:v.in_grouping_b(g,98,116)&&v.slice_del()}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(f,4))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:if(v.in_grouping_b(k,98,116)){var t=v.cursor-3;v.limit_backward<=t&&t<=v.limit&&(v.cursor=t,v.slice_del())}}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(_,8))&&(v.bra=v.cursor,u()))switch(e){case 1:v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,r=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-r,u()&&v.slice_del()));break;case 2:n=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-n,v.slice_del());break;case 3:if(v.slice_del(),v.ket=v.cursor,i=v.limit-v.cursor,!v.eq_s_b(2,"er")&&(v.cursor=v.limit-i,!v.eq_s_b(2,"en")))break;v.bra=v.cursor,c()&&v.slice_del();break;case 4:v.slice_del(),v.ket=v.cursor,e=v.find_among_b(b,2),e&&(v.bra=v.cursor,u()&&1==e&&v.slice_del())}}var d,l,m,h=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],w=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],f=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],b=[new r("ig",-1,1),new r("lich",-1,1)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],g=[117,30,5],k=[117,30,4],v=new n;this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return i(),v.cursor=e,t(),v.limit_backward=e,v.cursor=v.limit,a(),v.cursor=v.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.du.min.js b/0.3/assets/javascripts/lunr/min/lunr.du.min.js new file mode 100644 index 00000000..49a0f3f0 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.du.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Dutch` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e,r,i,o=C.cursor;;){if(C.bra=C.cursor,e=C.find_among(b,11))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(r=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=r);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=r;else if(n(r))break}else if(n(r))break}function n(e){return C.cursor=e,e>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,f=_,t()||(_=C.cursor,_<3&&(_=3),t()||(f=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var e;;)if(C.bra=C.cursor,e=C.find_among(p,3))switch(C.ket=C.cursor,e){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return f<=C.cursor}function a(){var e=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var e;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.slice_del(),w=!0,a())))}function m(){var e;u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.eq_s_b(3,"gem")||(C.cursor=C.limit-e,C.slice_del(),a())))}function d(){var e,r,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,e=C.find_among_b(h,5))switch(C.bra=C.cursor,e){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(z,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(r=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-r,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,e=C.find_among_b(k,6))switch(C.bra=C.cursor,e){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(j,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var f,_,w,b=[new r("",-1,6),new r("á",0,1),new r("ä",0,1),new r("é",0,2),new r("ë",0,2),new r("í",0,3),new r("ï",0,3),new r("ó",0,4),new r("ö",0,4),new r("ú",0,5),new r("ü",0,5)],p=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],g=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],h=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],k=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],v=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var r=C.cursor;return e(),C.cursor=r,o(),C.limit_backward=r,C.cursor=C.limit,d(),C.cursor=C.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.es.min.js b/0.3/assets/javascripts/lunr/min/lunr.es.min.js new file mode 100644 index 00000000..2989d342 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.es.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Spanish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=function(){var s=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(){if(A.out_grouping(x,97,252)){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}return!0}function n(){if(A.in_grouping(x,97,252)){var s=A.cursor;if(e()){if(A.cursor=s,!A.in_grouping(x,97,252))return!0;for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}}return!1}return!0}function i(){var s,r=A.cursor;if(n()){if(A.cursor=r,!A.out_grouping(x,97,252))return;if(s=A.cursor,e()){if(A.cursor=s,!A.in_grouping(x,97,252)||A.cursor>=A.limit)return;A.cursor++}}g=A.cursor}function a(){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}return!0}function t(){var e=A.cursor;g=A.limit,p=g,v=g,i(),A.cursor=e,a()&&(p=A.cursor,a()&&(v=A.cursor))}function o(){for(var e;;){if(A.bra=A.cursor,e=A.find_among(k,6))switch(A.ket=A.cursor,e){case 1:A.slice_from("a");continue;case 2:A.slice_from("e");continue;case 3:A.slice_from("i");continue;case 4:A.slice_from("o");continue;case 5:A.slice_from("u");continue;case 6:if(A.cursor>=A.limit)break;A.cursor++;continue}break}}function u(){return g<=A.cursor}function w(){return p<=A.cursor}function c(){return v<=A.cursor}function m(){var e;if(A.ket=A.cursor,A.find_among_b(y,13)&&(A.bra=A.cursor,(e=A.find_among_b(q,11))&&u()))switch(e){case 1:A.bra=A.cursor,A.slice_from("iendo");break;case 2:A.bra=A.cursor,A.slice_from("ando");break;case 3:A.bra=A.cursor,A.slice_from("ar");break;case 4:A.bra=A.cursor,A.slice_from("er");break;case 5:A.bra=A.cursor,A.slice_from("ir");break;case 6:A.slice_del();break;case 7:A.eq_s_b(1,"u")&&A.slice_del()}}function l(e,s){if(!c())return!0;A.slice_del(),A.ket=A.cursor;var r=A.find_among_b(e,s);return r&&(A.bra=A.cursor,1==r&&c()&&A.slice_del()),!1}function d(e){return!c()||(A.slice_del(),A.ket=A.cursor,A.eq_s_b(2,e)&&(A.bra=A.cursor,c()&&A.slice_del()),!1)}function b(){var e;if(A.ket=A.cursor,e=A.find_among_b(S,46)){switch(A.bra=A.cursor,e){case 1:if(!c())return!1;A.slice_del();break;case 2:if(d("ic"))return!1;break;case 3:if(!c())return!1;A.slice_from("log");break;case 4:if(!c())return!1;A.slice_from("u");break;case 5:if(!c())return!1;A.slice_from("ente");break;case 6:if(!w())return!1;A.slice_del(),A.ket=A.cursor,e=A.find_among_b(C,4),e&&(A.bra=A.cursor,c()&&(A.slice_del(),1==e&&(A.ket=A.cursor,A.eq_s_b(2,"at")&&(A.bra=A.cursor,c()&&A.slice_del()))));break;case 7:if(l(P,3))return!1;break;case 8:if(l(F,3))return!1;break;case 9:if(d("at"))return!1}return!0}return!1}function f(){var e,s;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(W,12),A.limit_backward=s,e)){if(A.bra=A.cursor,1==e){if(!A.eq_s_b(1,"u"))return!1;A.slice_del()}return!0}return!1}function _(){var e,s,r,n;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(L,96),A.limit_backward=s,e))switch(A.bra=A.cursor,e){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"u")?(n=A.limit-A.cursor,A.eq_s_b(1,"g")?A.cursor=A.limit-n:A.cursor=A.limit-r):A.cursor=A.limit-r,A.bra=A.cursor;case 2:A.slice_del()}}function h(){var e,s;if(A.ket=A.cursor,e=A.find_among_b(z,8))switch(A.bra=A.cursor,e){case 1:u()&&A.slice_del();break;case 2:u()&&(A.slice_del(),A.ket=A.cursor,A.eq_s_b(1,"u")&&(A.bra=A.cursor,s=A.limit-A.cursor,A.eq_s_b(1,"g")&&(A.cursor=A.limit-s,u()&&A.slice_del())))}}var v,p,g,k=[new s("",-1,6),new s("á",0,1),new s("é",0,2),new s("í",0,3),new s("ó",0,4),new s("ú",0,5)],y=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],q=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("ándo",-1,2),new s("iéndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("ár",-1,3),new s("ér",-1,4),new s("ír",-1,5)],C=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],P=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],F=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],S=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logía",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("ación",-1,2),new s("ución",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logías",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],W=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yó",-1,1)],L=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("ía",-1,2),new s("aría",5,2),new s("ería",5,2),new s("iría",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("ían",16,2),new s("arían",20,2),new s("erían",20,2),new s("irían",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arán",-1,2),new s("erán",-1,2),new s("irán",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("ías",39,2),new s("arías",45,2),new s("erías",45,2),new s("irías",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("íais",-1,2),new s("aríais",55,2),new s("eríais",55,2),new s("iríais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("áis",-1,2),new s("éis",-1,1),new s("aréis",64,2),new s("eréis",64,2),new s("iréis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("ábamos",70,2),new s("áramos",70,2),new s("iéramos",70,2),new s("íamos",70,2),new s("aríamos",74,2),new s("eríamos",74,2),new s("iríamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("ásemos",78,2),new s("iésemos",78,2),new s("imos",-1,2),new s("arás",-1,2),new s("erás",-1,2),new s("irás",-1,2),new s("ís",-1,2),new s("ará",-1,2),new s("erá",-1,2),new s("irá",-1,2),new s("aré",-1,2),new s("eré",-1,2),new s("iré",-1,2),new s("ió",-1,2)],z=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("á",-1,1),new s("é",-1,2),new s("í",-1,1),new s("ó",-1,1)],x=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],A=new r;this.setCurrent=function(e){A.setCurrent(e)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return t(),A.limit_backward=e,A.cursor=A.limit,m(),A.cursor=A.limit,b()||(A.cursor=A.limit,f()||(A.cursor=A.limit,_())),A.cursor=A.limit,h(),A.cursor=A.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.fi.min.js b/0.3/assets/javascripts/lunr/min/lunr.fi.min.js new file mode 100644 index 00000000..29f5dfce --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.fi.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Finnish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){f=A.limit,d=f,n()||(f=A.cursor,n()||(d=A.cursor))}function n(){for(var i;;){if(i=A.cursor,A.in_grouping(W,97,246))break;if(A.cursor=i,i>=A.limit)return!0;A.cursor++}for(A.cursor=i;!A.out_grouping(W,97,246);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}function t(){return d<=A.cursor}function s(){var i,e;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(h,10)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.in_grouping_b(x,97,246))return;break;case 2:if(!t())return}A.slice_del()}else A.limit_backward=e}function o(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(v,9))switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"k")||(A.cursor=A.limit-r,A.slice_del());break;case 2:A.slice_del(),A.ket=A.cursor,A.eq_s_b(3,"kse")&&(A.bra=A.cursor,A.slice_from("ksi"));break;case 3:A.slice_del();break;case 4:A.find_among_b(p,6)&&A.slice_del();break;case 5:A.find_among_b(g,6)&&A.slice_del();break;case 6:A.find_among_b(j,2)&&A.slice_del()}else A.limit_backward=e}function l(){return A.find_among_b(q,7)}function a(){return A.eq_s_b(1,"i")&&A.in_grouping_b(L,97,246)}function u(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(C,30)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.eq_s_b(1,"a"))return;break;case 2:case 9:if(!A.eq_s_b(1,"e"))return;break;case 3:if(!A.eq_s_b(1,"i"))return;break;case 4:if(!A.eq_s_b(1,"o"))return;break;case 5:if(!A.eq_s_b(1,"ä"))return;break;case 6:if(!A.eq_s_b(1,"ö"))return;break;case 7:if(r=A.limit-A.cursor,!l()&&(A.cursor=A.limit-r,!A.eq_s_b(2,"ie"))){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward){A.cursor=A.limit-r;break}A.cursor--,A.bra=A.cursor;break;case 8:if(!A.in_grouping_b(W,97,246)||!A.out_grouping_b(W,97,246))return}A.slice_del(),k=!0}else A.limit_backward=e}function c(){var i,e,r;if(A.cursor>=d)if(e=A.limit_backward,A.limit_backward=d,A.ket=A.cursor,i=A.find_among_b(P,14)){if(A.bra=A.cursor,A.limit_backward=e,1==i){if(r=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-r}A.slice_del()}else A.limit_backward=e}function m(){var i;A.cursor>=f&&(i=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.find_among_b(F,2)?(A.bra=A.cursor,A.limit_backward=i,A.slice_del()):A.limit_backward=i)}function w(){var i,e,r,n,t,s;if(A.cursor>=f){if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.eq_s_b(1,"t")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.in_grouping_b(W,97,246)&&(A.cursor=A.limit-r,A.slice_del(),A.limit_backward=e,n=A.limit-A.cursor,A.cursor>=d&&(A.cursor=d,t=A.limit_backward,A.limit_backward=A.cursor,A.cursor=A.limit-n,A.ket=A.cursor,i=A.find_among_b(S,2))))){if(A.bra=A.cursor,A.limit_backward=t,1==i){if(s=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-s}return void A.slice_del()}A.limit_backward=e}}function _(){var i,e,r,n;if(A.cursor>=f){for(i=A.limit_backward,A.limit_backward=f,e=A.limit-A.cursor,l()&&(A.cursor=A.limit-e,A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.in_grouping_b(y,97,228)&&(A.bra=A.cursor,A.out_grouping_b(W,97,246)&&A.slice_del()),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"j")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.eq_s_b(1,"o")?A.slice_del():(A.cursor=A.limit-r,A.eq_s_b(1,"u")&&A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"o")&&(A.bra=A.cursor,A.eq_s_b(1,"j")&&A.slice_del()),A.cursor=A.limit-e,A.limit_backward=i;;){if(n=A.limit-A.cursor,A.out_grouping_b(W,97,246)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,b=A.slice_to(),A.eq_v_b(b)&&A.slice_del())}}var k,b,d,f,h=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],p=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],g=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],j=[new e("lle",-1,-1),new e("ine",-1,-1)],v=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],q=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],C=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,a),new e("seen",11,-1,l),new e("hen",11,2),new e("tten",11,-1,a),new e("hin",11,3),new e("siin",11,-1,a),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],P=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],F=[new e("i",-1,-1),new e("j",-1,-1)],S=[new e("mma",-1,1),new e("imma",0,-1)],y=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],W=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],x=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],A=new r;this.setCurrent=function(i){A.setCurrent(i)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return i(),k=!1,A.limit_backward=e,A.cursor=A.limit,s(),A.cursor=A.limit,o(),A.cursor=A.limit,u(),A.cursor=A.limit,c(),A.cursor=A.limit,k?(m(),A.cursor=A.limit):(A.cursor=A.limit,w(),A.cursor=A.limit),_(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.fr.min.js b/0.3/assets/javascripts/lunr/min/lunr.fr.min.js new file mode 100644 index 00000000..68cd0094 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.fr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `French` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,s){return!(!W.eq_s(1,e)||(W.ket=W.cursor,!W.in_grouping(F,97,251)))&&(W.slice_from(r),W.cursor=s,!0)}function i(e,r,s){return!!W.eq_s(1,e)&&(W.ket=W.cursor,W.slice_from(r),W.cursor=s,!0)}function n(){for(var r,s;;){if(r=W.cursor,W.in_grouping(F,97,251)){if(W.bra=W.cursor,s=W.cursor,e("u","U",r))continue;if(W.cursor=s,e("i","I",r))continue;if(W.cursor=s,i("y","Y",r))continue}if(W.cursor=r,W.bra=r,!e("y","Y",r)){if(W.cursor=r,W.eq_s(1,"q")&&(W.bra=W.cursor,i("u","U",r)))continue;if(W.cursor=r,r>=W.limit)return;W.cursor++}}}function t(){for(;!W.in_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}for(;!W.out_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}return!1}function u(){var e=W.cursor;if(q=W.limit,g=q,p=q,W.in_grouping(F,97,251)&&W.in_grouping(F,97,251)&&W.cursor=W.limit){W.cursor=q;break}W.cursor++}while(!W.in_grouping(F,97,251))}q=W.cursor,W.cursor=e,t()||(g=W.cursor,t()||(p=W.cursor))}function o(){for(var e,r;;){if(r=W.cursor,W.bra=r,!(e=W.find_among(h,4)))break;switch(W.ket=W.cursor,e){case 1:W.slice_from("i");break;case 2:W.slice_from("u");break;case 3:W.slice_from("y");break;case 4:if(W.cursor>=W.limit)return;W.cursor++}}}function c(){return q<=W.cursor}function a(){return g<=W.cursor}function l(){return p<=W.cursor}function w(){var e,r;if(W.ket=W.cursor,e=W.find_among_b(C,43)){switch(W.bra=W.cursor,e){case 1:if(!l())return!1;W.slice_del();break;case 2:if(!l())return!1;W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")&&(W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU"));break;case 3:if(!l())return!1;W.slice_from("log");break;case 4:if(!l())return!1;W.slice_from("u");break;case 5:if(!l())return!1;W.slice_from("ent");break;case 6:if(!c())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(z,6))switch(W.bra=W.cursor,e){case 1:l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&W.slice_del()));break;case 2:l()?W.slice_del():a()&&W.slice_from("eux");break;case 3:l()&&W.slice_del();break;case 4:c()&&W.slice_from("i")}break;case 7:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(y,3))switch(W.bra=W.cursor,e){case 1:l()?W.slice_del():W.slice_from("abl");break;case 2:l()?W.slice_del():W.slice_from("iqU");break;case 3:l()&&W.slice_del()}break;case 8:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")))){W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU");break}break;case 9:W.slice_from("eau");break;case 10:if(!a())return!1;W.slice_from("al");break;case 11:if(l())W.slice_del();else{if(!a())return!1;W.slice_from("eux")}break;case 12:if(!a()||!W.out_grouping_b(F,97,251))return!1;W.slice_del();break;case 13:return c()&&W.slice_from("ant"),!1;case 14:return c()&&W.slice_from("ent"),!1;case 15:return r=W.limit-W.cursor,W.in_grouping_b(F,97,251)&&c()&&(W.cursor=W.limit-r,W.slice_del()),!1}return!0}return!1}function f(){var e,r;if(W.cursor=q){if(s=W.limit_backward,W.limit_backward=q,W.ket=W.cursor,e=W.find_among_b(P,7))switch(W.bra=W.cursor,e){case 1:if(l()){if(i=W.limit-W.cursor,!W.eq_s_b(1,"s")&&(W.cursor=W.limit-i,!W.eq_s_b(1,"t")))break;W.slice_del()}break;case 2:W.slice_from("i");break;case 3:W.slice_del();break;case 4:W.eq_s_b(2,"gu")&&W.slice_del()}W.limit_backward=s}}function b(){var e=W.limit-W.cursor;W.find_among_b(U,5)&&(W.cursor=W.limit-e,W.ket=W.cursor,W.cursor>W.limit_backward&&(W.cursor--,W.bra=W.cursor,W.slice_del()))}function d(){for(var e,r=1;W.out_grouping_b(F,97,251);)r--;if(r<=0){if(W.ket=W.cursor,e=W.limit-W.cursor,!W.eq_s_b(1,"é")&&(W.cursor=W.limit-e,!W.eq_s_b(1,"è")))return;W.bra=W.cursor,W.slice_from("e")}}function k(){if(!w()&&(W.cursor=W.limit,!f()&&(W.cursor=W.limit,!m())))return W.cursor=W.limit,void _();W.cursor=W.limit,W.ket=W.cursor,W.eq_s_b(1,"Y")?(W.bra=W.cursor,W.slice_from("i")):(W.cursor=W.limit,W.eq_s_b(1,"ç")&&(W.bra=W.cursor,W.slice_from("c")))}var p,g,q,v=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],h=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],z=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],y=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],C=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],x=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],I=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],P=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],U=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],F=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],S=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],W=new s;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){var e=W.cursor;return n(),W.cursor=e,u(),W.limit_backward=e,W.cursor=W.limit,k(),W.cursor=W.limit,b(),W.cursor=W.limit,d(),W.cursor=W.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.hu.min.js b/0.3/assets/javascripts/lunr/min/lunr.hu.min.js new file mode 100644 index 00000000..ed9d909f --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.hu.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Hungarian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,n=L.cursor;if(d=L.limit,L.in_grouping(W,97,252))for(;;){if(e=L.cursor,L.out_grouping(W,97,252))return L.cursor=e,L.find_among(g,8)||(L.cursor=e,e=L.limit)return void(d=e);L.cursor++}if(L.cursor=n,L.out_grouping(W,97,252)){for(;!L.in_grouping(W,97,252);){if(L.cursor>=L.limit)return;L.cursor++}d=L.cursor}}function i(){return d<=L.cursor}function a(){var e;if(L.ket=L.cursor,(e=L.find_among_b(h,2))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e")}}function t(){var e=L.limit-L.cursor;return!!L.find_among_b(p,23)&&(L.cursor=L.limit-e,!0)}function s(){if(L.cursor>L.limit_backward){L.cursor--,L.ket=L.cursor;var e=L.cursor-1;L.limit_backward<=e&&e<=L.limit&&(L.cursor=e,L.bra=e,L.slice_del())}}function c(){var e;if(L.ket=L.cursor,(e=L.find_among_b(_,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function o(){L.ket=L.cursor,L.find_among_b(v,44)&&(L.bra=L.cursor,i()&&(L.slice_del(),a()))}function w(){var e;if(L.ket=L.cursor,(e=L.find_among_b(z,3))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("e");break;case 2:case 3:L.slice_from("a")}}function l(){var e;if(L.ket=L.cursor,(e=L.find_among_b(y,6))&&(L.bra=L.cursor,i()))switch(e){case 1:case 2:L.slice_del();break;case 3:L.slice_from("a");break;case 4:L.slice_from("e")}}function u(){var e;if(L.ket=L.cursor,(e=L.find_among_b(j,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function m(){var e;if(L.ket=L.cursor,(e=L.find_among_b(C,7))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:L.slice_del()}}function k(){var e;if(L.ket=L.cursor,(e=L.find_among_b(P,12))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 9:L.slice_del();break;case 2:case 5:case 8:L.slice_from("e");break;case 3:case 6:L.slice_from("a")}}function f(){var e;if(L.ket=L.cursor,(e=L.find_among_b(F,31))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:L.slice_del();break;case 2:case 5:case 10:case 14:case 19:L.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:L.slice_from("e")}}function b(){var e;if(L.ket=L.cursor,(e=L.find_among_b(S,42))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:L.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:L.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:L.slice_from("e")}}var d,g=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],h=[new n("á",-1,1),new n("é",-1,2)],p=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],_=[new n("al",-1,1),new n("el",-1,2)],v=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nál",-1,-1),new n("nél",-1,-1),new n("ból",-1,-1),new n("ról",-1,-1),new n("tól",-1,-1),new n("bõl",-1,-1),new n("rõl",-1,-1),new n("tõl",-1,-1),new n("ül",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("képpen",22,-1),new n("on",19,-1),new n("ön",19,-1),new n("képp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("ként",29,-1),new n("anként",32,-1),new n("enként",32,-1),new n("onként",32,-1),new n("ot",29,-1),new n("ért",29,-1),new n("öt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("höz",-1,-1),new n("vá",-1,-1),new n("vé",-1,-1)],z=[new n("án",-1,2),new n("én",-1,1),new n("ánként",-1,3)],y=[new n("stul",-1,2),new n("astul",0,1),new n("ástul",0,3),new n("stül",-1,2),new n("estül",3,1),new n("éstül",3,4)],j=[new n("á",-1,1),new n("é",-1,2)],C=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("ák",0,1),new n("ék",0,2),new n("ök",0,3)],P=[new n("éi",-1,7),new n("áéi",0,6),new n("ééi",0,5),new n("é",-1,9),new n("ké",3,4),new n("aké",4,1),new n("eké",4,1),new n("oké",4,1),new n("áké",4,3),new n("éké",4,2),new n("öké",4,1),new n("éé",3,8)],F=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("ád",2,14),new n("éd",2,15),new n("öd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("ánk",11,2),new n("énk",11,3),new n("ünk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("ájuk",17,5),new n("ük",-1,8),new n("jük",19,7),new n("éjük",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("ám",22,10),new n("ém",22,11),new n("o",-1,18),new n("á",-1,19),new n("é",-1,20)],S=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("áid",0,7),new n("éid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("ái",7,12),new n("éi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("éitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("áik",18,27),new n("éik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("áink",25,18),new n("éink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("áitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("áim",35,2),new n("éim",35,3)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var n=L.cursor;return e(),L.limit_backward=n,L.cursor=L.limit,c(),L.cursor=L.limit,o(),L.cursor=L.limit,w(),L.cursor=L.limit,l(),L.cursor=L.limit,u(),L.cursor=L.limit,k(),L.cursor=L.limit,f(),L.cursor=L.limit,b(),L.cursor=L.limit,m(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.it.min.js b/0.3/assets/javascripts/lunr/min/lunr.it.min.js new file mode 100644 index 00000000..344b6a3c --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.it.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Italian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!x.eq_s(1,e)||(x.ket=x.cursor,!x.in_grouping(L,97,249)))&&(x.slice_from(r),x.cursor=n,!0)}function i(){for(var r,n,i,o,t=x.cursor;;){if(x.bra=x.cursor,r=x.find_among(h,7))switch(x.ket=x.cursor,r){case 1:x.slice_from("à");continue;case 2:x.slice_from("è");continue;case 3:x.slice_from("ì");continue;case 4:x.slice_from("ò");continue;case 5:x.slice_from("ù");continue;case 6:x.slice_from("qU");continue;case 7:if(x.cursor>=x.limit)break;x.cursor++;continue}break}for(x.cursor=t;;)for(n=x.cursor;;){if(i=x.cursor,x.in_grouping(L,97,249)){if(x.bra=x.cursor,o=x.cursor,e("u","U",i))break;if(x.cursor=o,e("i","I",i))break}if(x.cursor=i,x.cursor>=x.limit)return void(x.cursor=n);x.cursor++}}function o(e){if(x.cursor=e,!x.in_grouping(L,97,249))return!1;for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function t(){if(x.in_grouping(L,97,249)){var e=x.cursor;if(x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return o(e);x.cursor++}return!0}return o(e)}return!1}function s(){var e,r=x.cursor;if(!t()){if(x.cursor=r,!x.out_grouping(L,97,249))return;if(e=x.cursor,x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return x.cursor=e,void(x.in_grouping(L,97,249)&&x.cursor=x.limit)return;x.cursor++}k=x.cursor}function a(){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function u(){var e=x.cursor;k=x.limit,p=k,g=k,s(),x.cursor=e,a()&&(p=x.cursor,a()&&(g=x.cursor))}function c(){for(var e;;){if(x.bra=x.cursor,!(e=x.find_among(q,3)))break;switch(x.ket=x.cursor,e){case 1:x.slice_from("i");break;case 2:x.slice_from("u");break;case 3:if(x.cursor>=x.limit)return;x.cursor++}}}function w(){return k<=x.cursor}function l(){return p<=x.cursor}function m(){return g<=x.cursor}function f(){var e;if(x.ket=x.cursor,x.find_among_b(C,37)&&(x.bra=x.cursor,(e=x.find_among_b(z,5))&&w()))switch(e){case 1:x.slice_del();break;case 2:x.slice_from("e")}}function v(){var e;if(x.ket=x.cursor,!(e=x.find_among_b(S,51)))return!1;switch(x.bra=x.cursor,e){case 1:if(!m())return!1;x.slice_del();break;case 2:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del());break;case 3:if(!m())return!1;x.slice_from("log");break;case 4:if(!m())return!1;x.slice_from("u");break;case 5:if(!m())return!1;x.slice_from("ente");break;case 6:if(!w())return!1;x.slice_del();break;case 7:if(!l())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(P,4),e&&(x.bra=x.cursor,m()&&(x.slice_del(),1==e&&(x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&x.slice_del()))));break;case 8:if(!m())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(F,3),e&&(x.bra=x.cursor,1==e&&m()&&x.slice_del());break;case 9:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del())))}return!0}function b(){var e,r;x.cursor>=k&&(r=x.limit_backward,x.limit_backward=k,x.ket=x.cursor,e=x.find_among_b(W,87),e&&(x.bra=x.cursor,1==e&&x.slice_del()),x.limit_backward=r)}function d(){var e=x.limit-x.cursor;if(x.ket=x.cursor,x.in_grouping_b(y,97,242)&&(x.bra=x.cursor,w()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(1,"i")&&(x.bra=x.cursor,w()))))return void x.slice_del();x.cursor=x.limit-e}function _(){d(),x.ket=x.cursor,x.eq_s_b(1,"h")&&(x.bra=x.cursor,x.in_grouping_b(U,99,103)&&w()&&x.slice_del())}var g,p,k,h=[new r("",-1,7),new r("qu",0,6),new r("á",0,1),new r("é",0,2),new r("í",0,3),new r("ó",0,4),new r("ú",0,5)],q=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],C=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],z=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],P=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],F=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],S=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("ità",-1,8),new r("istà",-1,1),new r("istè",-1,1),new r("istì",-1,1)],W=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erà",-1,1),new r("irà",-1,1),new r("erò",-1,1),new r("irò",-1,1)],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],y=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],U=[17],x=new n;this.setCurrent=function(e){x.setCurrent(e)},this.getCurrent=function(){return x.getCurrent()},this.stem=function(){var e=x.cursor;return i(),x.cursor=e,u(),x.limit_backward=e,x.cursor=x.limit,f(),x.cursor=x.limit,v()||(x.cursor=x.limit,b()),x.cursor=x.limit,_(),x.cursor=x.limit_backward,c(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.ja.min.js b/0.3/assets/javascripts/lunr/min/lunr.ja.min.js new file mode 100644 index 00000000..5f254ebe --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.ja.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(e=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=e);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=e;else if(n(e))break}else if(n(e))break}function n(r){return C.cursor=r,r>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,d=_,t()||(_=C.cursor,_<3&&(_=3),t()||(d=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var r;;)if(C.bra=C.cursor,r=C.find_among(p,3))switch(C.ket=C.cursor,r){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return d<=C.cursor}function a(){var r=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-r,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var r;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.slice_del(),w=!0,a())))}function m(){var r;u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.eq_s_b(3,"gem")||(C.cursor=C.limit-r,C.slice_del(),a())))}function f(){var r,e,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,r=C.find_among_b(h,5))switch(C.bra=C.cursor,r){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(j,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(e=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-e,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,r=C.find_among_b(k,6))switch(C.bra=C.cursor,r){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(z,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var d,_,w,b=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],p=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],g=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],h=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],k=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],v=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(r){C.setCurrent(r)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return r(),C.cursor=e,o(),C.limit_backward=e,C.cursor=C.limit,f(),C.cursor=C.limit_backward,s(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.no.min.js b/0.3/assets/javascripts/lunr/min/lunr.no.min.js new file mode 100644 index 00000000..92bc7e4e --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.no.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Norwegian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.pt.min.js b/0.3/assets/javascripts/lunr/min/lunr.pt.min.js new file mode 100644 index 00000000..6c16996d --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.pt.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Portuguese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(k,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("a~");continue;case 2:z.slice_from("o~");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function n(){if(z.out_grouping(y,97,250)){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!0;z.cursor++}return!1}return!0}function i(){if(z.in_grouping(y,97,250))for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return g=z.cursor,!0}function o(){var e,r,s=z.cursor;if(z.in_grouping(y,97,250))if(e=z.cursor,n()){if(z.cursor=e,i())return}else g=z.cursor;if(z.cursor=s,z.out_grouping(y,97,250)){if(r=z.cursor,n()){if(z.cursor=r,!z.in_grouping(y,97,250)||z.cursor>=z.limit)return;z.cursor++}g=z.cursor}}function t(){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function a(){var e=z.cursor;g=z.limit,b=g,h=g,o(),z.cursor=e,t()&&(b=z.cursor,t()&&(h=z.cursor))}function u(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(q,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("ã");continue;case 2:z.slice_from("õ");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function w(){return g<=z.cursor}function m(){return b<=z.cursor}function c(){return h<=z.cursor}function l(){var e;if(z.ket=z.cursor,!(e=z.find_among_b(F,45)))return!1;switch(z.bra=z.cursor,e){case 1:if(!c())return!1;z.slice_del();break;case 2:if(!c())return!1;z.slice_from("log");break;case 3:if(!c())return!1;z.slice_from("u");break;case 4:if(!c())return!1;z.slice_from("ente");break;case 5:if(!m())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(j,4),e&&(z.bra=z.cursor,c()&&(z.slice_del(),1==e&&(z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del()))));break;case 6:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(C,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 7:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(P,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 8:if(!c())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del());break;case 9:if(!w()||!z.eq_s_b(1,"e"))return!1;z.slice_from("ir")}return!0}function f(){var e,r;if(z.cursor>=g){if(r=z.limit_backward,z.limit_backward=g,z.ket=z.cursor,e=z.find_among_b(S,120))return z.bra=z.cursor,1==e&&z.slice_del(),z.limit_backward=r,!0;z.limit_backward=r}return!1}function d(){var e;z.ket=z.cursor,(e=z.find_among_b(W,7))&&(z.bra=z.cursor,1==e&&w()&&z.slice_del())}function v(e,r){if(z.eq_s_b(1,e)){z.bra=z.cursor;var s=z.limit-z.cursor;if(z.eq_s_b(1,r))return z.cursor=z.limit-s,w()&&z.slice_del(),!1}return!0}function p(){var e;if(z.ket=z.cursor,e=z.find_among_b(L,4))switch(z.bra=z.cursor,e){case 1:w()&&(z.slice_del(),z.ket=z.cursor,z.limit-z.cursor,v("u","g")&&v("i","c"));break;case 2:z.slice_from("c")}}function _(){if(!l()&&(z.cursor=z.limit,!f()))return z.cursor=z.limit,void d();z.cursor=z.limit,z.ket=z.cursor,z.eq_s_b(1,"i")&&(z.bra=z.cursor,z.eq_s_b(1,"c")&&(z.cursor=z.limit,w()&&z.slice_del()))}var h,b,g,k=[new r("",-1,3),new r("ã",0,1),new r("õ",0,2)],q=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],j=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],C=[new r("ante",-1,1),new r("avel",-1,1),new r("ível",-1,1)],P=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],F=[new r("ica",-1,1),new r("ância",-1,1),new r("ência",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logía",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("ável",-1,1),new r("ível",-1,1),new r("ución",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aça~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("ências",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logías",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aço~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],S=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("áreis",73,1),new r("éreis",73,1),new r("íreis",73,1),new r("ásseis",73,1),new r("ésseis",73,1),new r("ísseis",73,1),new r("áveis",73,1),new r("íeis",73,1),new r("aríeis",84,1),new r("eríeis",84,1),new r("iríeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("áramos",90,1),new r("éramos",90,1),new r("íramos",90,1),new r("ávamos",90,1),new r("íamos",90,1),new r("aríamos",95,1),new r("eríamos",95,1),new r("iríamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("ássemos",99,1),new r("êssemos",99,1),new r("íssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("ámos",-1,1),new r("arás",-1,1),new r("erás",-1,1),new r("irás",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("ará",-1,1),new r("erá",-1,1),new r("irá",-1,1)],W=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("á",-1,1),new r("í",-1,1),new r("ó",-1,1)],L=[new r("e",-1,1),new r("ç",-1,2),new r("é",-1,1),new r("ê",-1,1)],y=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],z=new s;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return e(),z.cursor=r,a(),z.limit_backward=r,z.cursor=z.limit,_(),z.cursor=z.limit,p(),z.cursor=z.limit_backward,u(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.ro.min.js b/0.3/assets/javascripts/lunr/min/lunr.ro.min.js new file mode 100644 index 00000000..72771401 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.ro.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Romanian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=function(){var i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(e,i){L.eq_s(1,e)&&(L.ket=L.cursor,L.in_grouping(W,97,259)&&L.slice_from(i))}function n(){for(var i,r;;){if(i=L.cursor,L.in_grouping(W,97,259)&&(r=L.cursor,L.bra=r,e("u","U"),L.cursor=r,e("i","I")),L.cursor=i,L.cursor>=L.limit)break;L.cursor++}}function t(){if(L.out_grouping(W,97,259)){for(;!L.in_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}return!0}function a(){if(L.in_grouping(W,97,259))for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}function o(){var e,i,r=L.cursor;if(L.in_grouping(W,97,259)){if(e=L.cursor,!t())return void(h=L.cursor);if(L.cursor=e,!a())return void(h=L.cursor)}L.cursor=r,L.out_grouping(W,97,259)&&(i=L.cursor,t()&&(L.cursor=i,L.in_grouping(W,97,259)&&L.cursor=L.limit)return!1;L.cursor++}for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!1;L.cursor++}return!0}function c(){var e=L.cursor;h=L.limit,k=h,g=h,o(),L.cursor=e,u()&&(k=L.cursor,u()&&(g=L.cursor))}function s(){for(var e;;){if(L.bra=L.cursor,e=L.find_among(z,3))switch(L.ket=L.cursor,e){case 1:L.slice_from("i");continue;case 2:L.slice_from("u");continue;case 3:if(L.cursor>=L.limit)break;L.cursor++;continue}break}}function w(){return h<=L.cursor}function m(){return k<=L.cursor}function l(){return g<=L.cursor}function f(){var e,i;if(L.ket=L.cursor,(e=L.find_among_b(C,16))&&(L.bra=L.cursor,m()))switch(e){case 1:L.slice_del();break;case 2:L.slice_from("a");break;case 3:L.slice_from("e");break;case 4:L.slice_from("i");break;case 5:i=L.limit-L.cursor,L.eq_s_b(2,"ab")||(L.cursor=L.limit-i,L.slice_from("i"));break;case 6:L.slice_from("at");break;case 7:L.slice_from("aţi")}}function p(){var e,i=L.limit-L.cursor;if(L.ket=L.cursor,(e=L.find_among_b(P,46))&&(L.bra=L.cursor,m())){switch(e){case 1:L.slice_from("abil");break;case 2:L.slice_from("ibil");break;case 3:L.slice_from("iv");break;case 4:L.slice_from("ic");break;case 5:L.slice_from("at");break;case 6:L.slice_from("it")}return _=!0,L.cursor=L.limit-i,!0}return!1}function d(){var e,i;for(_=!1;;)if(i=L.limit-L.cursor,!p()){L.cursor=L.limit-i;break}if(L.ket=L.cursor,(e=L.find_among_b(F,62))&&(L.bra=L.cursor,l())){switch(e){case 1:L.slice_del();break;case 2:L.eq_s_b(1,"ţ")&&(L.bra=L.cursor,L.slice_from("t"));break;case 3:L.slice_from("ist")}_=!0}}function b(){var e,i,r;if(L.cursor>=h){if(i=L.limit_backward,L.limit_backward=h,L.ket=L.cursor,e=L.find_among_b(q,94))switch(L.bra=L.cursor,e){case 1:if(r=L.limit-L.cursor,!L.out_grouping_b(W,97,259)&&(L.cursor=L.limit-r,!L.eq_s_b(1,"u")))break;case 2:L.slice_del()}L.limit_backward=i}}function v(){var e;L.ket=L.cursor,(e=L.find_among_b(S,5))&&(L.bra=L.cursor,w()&&1==e&&L.slice_del())}var _,g,k,h,z=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],C=[new i("ea",-1,3),new i("aţia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aţie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],P=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aţiune",-1,5),new i("iţiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ătoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ători",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icităi",-1,4),new i("abilităi",-1,1),new i("ivităi",-1,3),new i("icităţi",-1,4),new i("abilităţi",-1,1),new i("ivităţi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ător",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icală",-1,4),new i("icivă",-1,4),new i("ativă",-1,5),new i("itivă",-1,6)],F=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("işti",-1,3),new i("ivi",-1,1),new i("ităi",-1,1),new i("oşi",-1,1),new i("ităţi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("ică",-1,1),new i("abilă",-1,1),new i("ibilă",-1,1),new i("oasă",-1,1),new i("ată",-1,1),new i("ită",-1,1),new i("antă",-1,1),new i("istă",-1,3),new i("ută",-1,1),new i("ivă",-1,1)],q=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ăsc",-1,1),new i("ind",-1,1),new i("ând",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("âre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("âse",10,1),new i("eşte",-1,1),new i("ăşte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eşti",-1,1),new i("ăşti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("âi",-1,1),new i("aşi",-1,1),new i("seşi",-1,2),new i("aseşi",29,1),new i("seseşi",29,2),new i("iseşi",29,1),new i("useşi",29,1),new i("âseşi",29,1),new i("işi",-1,1),new i("uşi",-1,1),new i("âşi",-1,1),new i("aţi",-1,2),new i("eaţi",38,1),new i("iaţi",38,1),new i("eţi",-1,2),new i("iţi",-1,2),new i("âţi",-1,2),new i("arăţi",-1,1),new i("serăţi",-1,2),new i("aserăţi",45,1),new i("seserăţi",45,2),new i("iserăţi",45,1),new i("userăţi",45,1),new i("âserăţi",45,1),new i("irăţi",-1,1),new i("urăţi",-1,1),new i("ârăţi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("âsem",57,1),new i("im",-1,2),new i("âm",-1,2),new i("ăm",-1,2),new i("arăm",65,1),new i("serăm",65,2),new i("aserăm",67,1),new i("seserăm",67,2),new i("iserăm",67,1),new i("userăm",67,1),new i("âserăm",67,1),new i("irăm",65,1),new i("urăm",65,1),new i("ârăm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("ându",-1,1),new i("ez",-1,1),new i("ească",-1,1),new i("ară",-1,1),new i("seră",-1,2),new i("aseră",84,1),new i("seseră",84,2),new i("iseră",84,1),new i("useră",84,1),new i("âseră",84,1),new i("iră",-1,1),new i("ură",-1,1),new i("âră",-1,1),new i("ează",-1,1)],S=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ă",-1,1)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var e=L.cursor;return n(),L.cursor=e,c(),L.limit_backward=e,L.cursor=L.limit,f(),L.cursor=L.limit,d(),L.cursor=L.limit,_||(L.cursor=L.limit,b(),L.cursor=L.limit),v(),L.cursor=L.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.ru.min.js b/0.3/assets/javascripts/lunr/min/lunr.ru.min.js new file mode 100644 index 00000000..186cc485 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.ru.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!W.in_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function t(){for(;!W.out_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function w(){b=W.limit,_=b,e()&&(b=W.cursor,t()&&e()&&t()&&(_=W.cursor))}function i(){return _<=W.cursor}function u(e,n){var r,t;if(W.ket=W.cursor,r=W.find_among_b(e,n)){switch(W.bra=W.cursor,r){case 1:if(t=W.limit-W.cursor,!W.eq_s_b(1,"а")&&(W.cursor=W.limit-t,!W.eq_s_b(1,"я")))return!1;case 2:W.slice_del()}return!0}return!1}function o(){return u(h,9)}function s(e,n){var r;return W.ket=W.cursor,!!(r=W.find_among_b(e,n))&&(W.bra=W.cursor,1==r&&W.slice_del(),!0)}function c(){return s(g,26)}function m(){return!!c()&&(u(C,8),!0)}function f(){return s(k,2)}function l(){return u(P,46)}function a(){s(v,36)}function p(){var e;W.ket=W.cursor,(e=W.find_among_b(F,2))&&(W.bra=W.cursor,i()&&1==e&&W.slice_del())}function d(){var e;if(W.ket=W.cursor,e=W.find_among_b(q,4))switch(W.bra=W.cursor,e){case 1:if(W.slice_del(),W.ket=W.cursor,!W.eq_s_b(1,"н"))break;W.bra=W.cursor;case 2:if(!W.eq_s_b(1,"н"))break;case 3:W.slice_del()}}var _,b,h=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],g=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],C=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],k=[new n("сь",-1,1),new n("ся",-1,1)],P=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],v=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],F=[new n("ост",-1,1),new n("ость",-1,1)],q=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],S=[33,65,8,232],W=new r;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){return w(),W.cursor=W.limit,!(W.cursor=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.sv.min.js b/0.3/assets/javascripts/lunr/min/lunr.sv.min.js new file mode 100644 index 00000000..3e5eb640 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.sv.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Swedish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.tr.min.js b/0.3/assets/javascripts/lunr/min/lunr.tr.min.js new file mode 100644 index 00000000..563f6ec1 --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.tr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Turkish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=function(){var i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){function r(r,i,e){for(;;){var n=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(r,i,e)){Dr.cursor=Dr.limit-n;break}if(Dr.cursor=Dr.limit-n,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function n(){var i,e;i=Dr.limit-Dr.cursor,r(Wr,97,305);for(var n=0;nDr.limit_backward&&(Dr.cursor--,e=Dr.limit-Dr.cursor,i()))?(Dr.cursor=Dr.limit-e,!0):(Dr.cursor=Dr.limit-n,r()?(Dr.cursor=Dr.limit-n,!1):(Dr.cursor=Dr.limit-n,!(Dr.cursor<=Dr.limit_backward)&&(Dr.cursor--,!!i()&&(Dr.cursor=Dr.limit-n,!0))))}function u(r){return t(r,function(){return Dr.in_grouping_b(Wr,97,305)})}function o(){return u(function(){return Dr.eq_s_b(1,"n")})}function s(){return u(function(){return Dr.eq_s_b(1,"s")})}function c(){return u(function(){return Dr.eq_s_b(1,"y")})}function l(){return t(function(){return Dr.in_grouping_b(Lr,105,305)},function(){return Dr.out_grouping_b(Wr,97,305)})}function a(){return Dr.find_among_b(ur,10)&&l()}function m(){return n()&&Dr.in_grouping_b(Lr,105,305)&&s()}function d(){return Dr.find_among_b(or,2)}function f(){return n()&&Dr.in_grouping_b(Lr,105,305)&&c()}function b(){return n()&&Dr.find_among_b(sr,4)}function w(){return n()&&Dr.find_among_b(cr,4)&&o()}function _(){return n()&&Dr.find_among_b(lr,2)&&c()}function k(){return n()&&Dr.find_among_b(ar,2)}function p(){return n()&&Dr.find_among_b(mr,4)}function g(){return n()&&Dr.find_among_b(dr,2)}function y(){return n()&&Dr.find_among_b(fr,4)}function z(){return n()&&Dr.find_among_b(br,2)}function v(){return n()&&Dr.find_among_b(wr,2)&&c()}function h(){return Dr.eq_s_b(2,"ki")}function q(){return n()&&Dr.find_among_b(_r,2)&&o()}function C(){return n()&&Dr.find_among_b(kr,4)&&c()}function P(){return n()&&Dr.find_among_b(pr,4)}function F(){return n()&&Dr.find_among_b(gr,4)&&c()}function S(){return Dr.find_among_b(yr,4)}function W(){return n()&&Dr.find_among_b(zr,2)}function L(){return n()&&Dr.find_among_b(vr,4)}function x(){return n()&&Dr.find_among_b(hr,8)}function A(){return Dr.find_among_b(qr,2)}function E(){return n()&&Dr.find_among_b(Cr,32)&&c()}function j(){return Dr.find_among_b(Pr,8)&&c()}function T(){return n()&&Dr.find_among_b(Fr,4)&&c()}function Z(){return Dr.eq_s_b(3,"ken")&&c()}function B(){var r=Dr.limit-Dr.cursor;return!(T()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,Z()))))}function D(){if(A()){var r=Dr.limit-Dr.cursor;if(S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T())return!1}return!0}function G(){if(W()){Dr.bra=Dr.cursor,Dr.slice_del();var r=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,x()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,T()||(Dr.cursor=Dr.limit-r)))),nr=!1,!1}return!0}function H(){if(!L())return!0;var r=Dr.limit-Dr.cursor;return!E()&&(Dr.cursor=Dr.limit-r,!j())}function I(){var r,i=Dr.limit-Dr.cursor;return!(S()||(Dr.cursor=Dr.limit-i,F()||(Dr.cursor=Dr.limit-i,P()||(Dr.cursor=Dr.limit-i,C()))))||(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,T()||(Dr.cursor=Dr.limit-r),!1)}function J(){var r,i=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,nr=!0,B()&&(Dr.cursor=Dr.limit-i,D()&&(Dr.cursor=Dr.limit-i,G()&&(Dr.cursor=Dr.limit-i,H()&&(Dr.cursor=Dr.limit-i,I()))))){if(Dr.cursor=Dr.limit-i,!x())return;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T()||(Dr.cursor=Dr.limit-r)}Dr.bra=Dr.cursor,Dr.slice_del()}function K(){var r,i,e,n;if(Dr.ket=Dr.cursor,h()){if(r=Dr.limit-Dr.cursor,p())return Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,a()&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))),!0;if(Dr.cursor=Dr.limit-r,w()){if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,e=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-e,!m()&&(Dr.cursor=Dr.limit-e,!K())))return!0;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}return!0}if(Dr.cursor=Dr.limit-r,g()){if(n=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-n,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-n,!K())return!1;return!0}}return!1}function M(r){if(Dr.ket=Dr.cursor,!g()&&(Dr.cursor=Dr.limit-r,!k()))return!1;var i=Dr.limit-Dr.cursor;if(d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-i,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-i,!K())return!1;return!0}function N(r){if(Dr.ket=Dr.cursor,!z()&&(Dr.cursor=Dr.limit-r,!b()))return!1;var i=Dr.limit-Dr.cursor;return!(!m()&&(Dr.cursor=Dr.limit-i,!d()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)}function O(){var r,i=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,!(!w()&&(Dr.cursor=Dr.limit-i,!v()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,!(!W()||(Dr.bra=Dr.cursor,Dr.slice_del(),!K()))||(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!(a()||(Dr.cursor=Dr.limit-r,m()||(Dr.cursor=Dr.limit-r,K())))||(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)))}function Q(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,!p()&&(Dr.cursor=Dr.limit-e,!f()&&(Dr.cursor=Dr.limit-e,!_())))return!1;if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,a())Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()||(Dr.cursor=Dr.limit-i);else if(Dr.cursor=Dr.limit-r,!W())return!0;return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,K(),!0}function R(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,W())return Dr.bra=Dr.cursor,Dr.slice_del(),void K();if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,q())if(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-r,!m())){if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!W())return;if(Dr.bra=Dr.cursor,Dr.slice_del(),!K())return}Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}else if(Dr.cursor=Dr.limit-e,!M(e)&&(Dr.cursor=Dr.limit-e,!N(e))){if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,y())return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,i=Dr.limit-Dr.cursor,void(a()?(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())):(Dr.cursor=Dr.limit-i,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,K())));if(Dr.cursor=Dr.limit-e,!O()){if(Dr.cursor=Dr.limit-e,d())return Dr.bra=Dr.cursor,void Dr.slice_del();Dr.cursor=Dr.limit-e,K()||(Dr.cursor=Dr.limit-e,Q()||(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,(a()||(Dr.cursor=Dr.limit-e,m()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))))}}}function U(){var r;if(Dr.ket=Dr.cursor,r=Dr.find_among_b(Sr,4))switch(Dr.bra=Dr.cursor,r){case 1:Dr.slice_from("p");break;case 2:Dr.slice_from("ç");break;case 3:Dr.slice_from("t");break;case 4:Dr.slice_from("k")}}function V(){for(;;){var r=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(Wr,97,305)){Dr.cursor=Dr.limit-r;break}if(Dr.cursor=Dr.limit-r,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function X(r,i,e){if(Dr.cursor=Dr.limit-r,V()){var n=Dr.limit-Dr.cursor;if(!Dr.eq_s_b(1,i)&&(Dr.cursor=Dr.limit-n,!Dr.eq_s_b(1,e)))return!0;Dr.cursor=Dr.limit-r;var t=Dr.cursor;return Dr.insert(Dr.cursor,Dr.cursor,e),Dr.cursor=t,!1}return!0}function Y(){var r=Dr.limit-Dr.cursor;(Dr.eq_s_b(1,"d")||(Dr.cursor=Dr.limit-r,Dr.eq_s_b(1,"g")))&&X(r,"a","ı")&&X(r,"e","i")&&X(r,"o","u")&&X(r,"ö","ü")}function $(){for(var r,i=Dr.cursor,e=2;;){for(r=Dr.cursor;!Dr.in_grouping(Wr,97,305);){if(Dr.cursor>=Dr.limit)return Dr.cursor=r,!(e>0)&&(Dr.cursor=i,!0);Dr.cursor++}e--}}function rr(r,i,e){for(;!Dr.eq_s(i,e);){if(Dr.cursor>=Dr.limit)return!0;Dr.cursor++}return(tr=i)!=Dr.limit||(Dr.cursor=r,!1)}function ir(){var r=Dr.cursor;return!rr(r,2,"ad")||(Dr.cursor=r,!rr(r,5,"soyad"))}function er(){var r=Dr.cursor;return!ir()&&(Dr.limit_backward=r,Dr.cursor=Dr.limit,Y(),Dr.cursor=Dr.limit,U(),!0)}var nr,tr,ur=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("müz",-1,-1),new i("nüz",-1,-1),new i("mız",-1,-1),new i("nız",-1,-1)],or=[new i("leri",-1,-1),new i("ları",-1,-1)],sr=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nü",-1,-1),new i("nı",-1,-1)],cr=[new i("in",-1,-1),new i("un",-1,-1),new i("ün",-1,-1),new i("ın",-1,-1)],lr=[new i("a",-1,-1),new i("e",-1,-1)],ar=[new i("na",-1,-1),new i("ne",-1,-1)],mr=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],dr=[new i("nda",-1,-1),new i("nde",-1,-1)],fr=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],br=[new i("ndan",-1,-1),new i("nden",-1,-1)],wr=[new i("la",-1,-1),new i("le",-1,-1)],_r=[new i("ca",-1,-1),new i("ce",-1,-1)],kr=[new i("im",-1,-1),new i("um",-1,-1),new i("üm",-1,-1),new i("ım",-1,-1)],pr=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sün",-1,-1),new i("sın",-1,-1)],gr=[new i("iz",-1,-1),new i("uz",-1,-1),new i("üz",-1,-1),new i("ız",-1,-1)],yr=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sünüz",-1,-1),new i("sınız",-1,-1)],zr=[new i("lar",-1,-1),new i("ler",-1,-1)],vr=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nüz",-1,-1),new i("nız",-1,-1)],hr=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dür",-1,-1),new i("tür",-1,-1),new i("dır",-1,-1),new i("tır",-1,-1)],qr=[new i("casına",-1,-1),new i("cesine",-1,-1)],Cr=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dük",-1,-1),new i("tük",-1,-1),new i("dık",-1,-1),new i("tık",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("düm",-1,-1),new i("tüm",-1,-1),new i("dım",-1,-1),new i("tım",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dün",-1,-1),new i("tün",-1,-1),new i("dın",-1,-1),new i("tın",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dü",-1,-1),new i("tü",-1,-1),new i("dı",-1,-1),new i("tı",-1,-1)],Pr=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],Fr=[new i("miş",-1,-1),new i("muş",-1,-1),new i("müş",-1,-1),new i("mış",-1,-1)],Sr=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ğ",-1,4)],Wr=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],Lr=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],xr=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],Ar=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],Er=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],jr=[17],Tr=[65],Zr=[65],Br=[["a",xr,97,305],["e",Ar,101,252],["ı",Er,97,305],["i",jr,101,105],["o",Tr,111,117],["ö",Zr,246,252],["u",Tr,111,117]],Dr=new e;this.setCurrent=function(r){Dr.setCurrent(r)},this.getCurrent=function(){return Dr.getCurrent()},this.stem=function(){return!!($()&&(Dr.limit_backward=Dr.cursor,Dr.cursor=Dr.limit,J(),Dr.cursor=Dr.limit,nr&&(R(),Dr.cursor=Dr.limit_backward,er())))}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.tr.stemmer,"stemmer-tr"),r.tr.stopWordFilter=r.generateStopWordFilter("acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir biri birkaç birkez birçok birşey birşeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunları bunların bunu bunun burada böyle böylece da daha dahi de defa değil diye diğer doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiği ettiğini eğer gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir iki ile ilgili ise itibaren itibariyle için işte kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduklarını olduğu olduğunu olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafından trilyon tüm var vardı ve veya ya yani yapacak yapmak yaptı yaptıkları yaptığı yaptığını yapılan yapılması yapıyor yedi yerine yetmiş yine yirmi yoksa yüz zaten çok çünkü öyle üzere üç şey şeyden şeyi şeyler şu şuna şunda şundan şunları şunu şöyle".split(" ")),r.Pipeline.registerFunction(r.tr.stopWordFilter,"stopWordFilter-tr")}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/min/lunr.vi.min.js b/0.3/assets/javascripts/lunr/min/lunr.vi.min.js new file mode 100644 index 00000000..22aed28c --- /dev/null +++ b/0.3/assets/javascripts/lunr/min/lunr.vi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); \ No newline at end of file diff --git a/0.3/assets/javascripts/lunr/tinyseg.min.js b/0.3/assets/javascripts/lunr/tinyseg.min.js new file mode 100644 index 00000000..302befbb --- /dev/null +++ b/0.3/assets/javascripts/lunr/tinyseg.min.js @@ -0,0 +1 @@ +!function(_,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(_.lunr)}(this,(function(){return function(_){function t(){var _={"[一二三四五六七八九十百千万億兆]":"M","[一-龠々〆ヵヶ]":"H","[ぁ-ん]":"I","[ァ-ヴーア-ン゙ー]":"K","[a-zA-Za-zA-Z]":"A","[0-90-9]":"N"};for(var t in this.chartype_=[],_){var H=new RegExp(t);this.chartype_.push([H,_[t]])}return this.BIAS__=-332,this.BC1__={HH:6,II:2461,KH:406,OH:-1378},this.BC2__={AA:-3267,AI:2744,AN:-878,HH:-4070,HM:-1711,HN:4012,HO:3761,IA:1327,IH:-1184,II:-1332,IK:1721,IO:5492,KI:3831,KK:-8741,MH:-3132,MK:3334,OO:-2920},this.BC3__={HH:996,HI:626,HK:-721,HN:-1307,HO:-836,IH:-301,KK:2762,MK:1079,MM:4034,OA:-1652,OH:266},this.BP1__={BB:295,OB:304,OO:-125,UB:352},this.BP2__={BO:60,OO:-1762},this.BQ1__={BHH:1150,BHM:1521,BII:-1158,BIM:886,BMH:1208,BNH:449,BOH:-91,BOO:-2597,OHI:451,OIH:-296,OKA:1851,OKH:-1020,OKK:904,OOO:2965},this.BQ2__={BHH:118,BHI:-1159,BHM:466,BIH:-919,BKK:-1720,BKO:864,OHH:-1139,OHM:-181,OIH:153,UHI:-1146},this.BQ3__={BHH:-792,BHI:2664,BII:-299,BKI:419,BMH:937,BMM:8335,BNN:998,BOH:775,OHH:2174,OHM:439,OII:280,OKH:1798,OKI:-793,OKO:-2242,OMH:-2402,OOO:11699},this.BQ4__={BHH:-3895,BIH:3761,BII:-4654,BIK:1348,BKK:-1806,BMI:-3385,BOO:-12396,OAH:926,OHH:266,OHK:-2036,ONN:-973},this.BW1__={",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682},this.BW2__={"..":-11822,11:-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669},this.BW3__={"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1e3,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990},this.TC1__={AAA:1093,HHH:1029,HHM:580,HII:998,HOH:-390,HOM:-331,IHI:1169,IOH:-142,IOI:-1015,IOM:467,MMH:187,OOI:-1832},this.TC2__={HHO:2088,HII:-1023,HMM:-1154,IHI:-1965,KKH:703,OII:-2649},this.TC3__={AAA:-294,HHH:346,HHI:-341,HII:-1088,HIK:731,HOH:-1486,IHH:128,IHI:-3041,IHO:-1935,IIH:-825,IIM:-1035,IOI:-542,KHH:-1216,KKA:491,KKH:-1217,KOK:-1009,MHH:-2694,MHM:-457,MHO:123,MMH:-471,NNH:-1689,NNO:662,OHO:-3393},this.TC4__={HHH:-203,HHI:1344,HHK:365,HHM:-122,HHN:182,HHO:669,HIH:804,HII:679,HOH:446,IHH:695,IHO:-2324,IIH:321,III:1497,IIO:656,IOO:54,KAK:4845,KKA:3386,KKK:3065,MHH:-405,MHI:201,MMH:-241,MMM:661,MOM:841},this.TQ1__={BHHH:-227,BHHI:316,BHIH:-132,BIHH:60,BIII:1595,BNHH:-744,BOHH:225,BOOO:-908,OAKK:482,OHHH:281,OHIH:249,OIHI:200,OIIH:-68},this.TQ2__={BIHH:-1401,BIII:-1033,BKAK:-543,BOOO:-5591},this.TQ3__={BHHH:478,BHHM:-1073,BHIH:222,BHII:-504,BIIH:-116,BIII:-105,BMHI:-863,BMHM:-464,BOMH:620,OHHH:346,OHHI:1729,OHII:997,OHMH:481,OIHH:623,OIIH:1344,OKAK:2792,OKHH:587,OKKA:679,OOHH:110,OOII:-685},this.TQ4__={BHHH:-721,BHHM:-3604,BHII:-966,BIIH:-607,BIII:-2181,OAAA:-2763,OAKK:180,OHHH:-294,OHHI:2446,OHHO:480,OHIH:-1573,OIHH:1935,OIHI:-493,OIIH:626,OIII:-4007,OKAK:-8156},this.TW1__={"につい":-4681,"東京都":2026},this.TW2__={"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216},this.TW3__={"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287},this.TW4__={"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865},this.UC1__={A:484,K:93,M:645,O:-505},this.UC2__={A:819,H:1059,I:409,M:3987,N:5775,O:646},this.UC3__={A:-1370,I:2311},this.UC4__={A:-2643,H:1809,I:-1032,K:-3450,M:3565,N:3876,O:6646},this.UC5__={H:313,I:-1238,K:-799,M:539,O:-831},this.UC6__={H:-506,I:-253,K:87,M:247,O:-387},this.UP1__={O:-214},this.UP2__={B:69,O:935},this.UP3__={B:189},this.UQ1__={BH:21,BI:-12,BK:-99,BN:142,BO:-56,OH:-95,OI:477,OK:410,OO:-2422},this.UQ2__={BH:216,BI:113,OK:1759},this.UQ3__={BA:-479,BH:42,BI:1913,BK:-7198,BM:3160,BN:6427,BO:14761,OI:-827,ON:-3212},this.UW1__={",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135},this.UW2__={",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568},this.UW3__={",":4889,1:-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278},this.UW4__={",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1e3,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637},this.UW5__={",":465,".":-299,1:-514,E2:-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343},this.UW6__={",":227,".":808,1:-270,E1:306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496},this}t.prototype.ctype_=function(_){for(var t in this.chartype_)if(_.match(this.chartype_[t][0]))return this.chartype_[t][1];return"O"},t.prototype.ts_=function(_){return _||0},t.prototype.segment=function(_){if(null==_||null==_||""==_)return[];var t=[],H=["B3","B2","B1"],s=["O","O","O"],h=_.split("");for(K=0;K0&&(t.push(i),i="",N="B"),I=O,O=B,B=N,i+=H[K]}return t.push(i),t},_.TinySegmenter=t}})); \ No newline at end of file diff --git a/latest/assets/javascripts/vendor.12f39d2a.min.js b/0.3/assets/javascripts/vendor.49293c47.min.js similarity index 63% rename from latest/assets/javascripts/vendor.12f39d2a.min.js rename to 0.3/assets/javascripts/vendor.49293c47.min.js index 6d198607..6c356e4a 100644 --- a/latest/assets/javascripts/vendor.12f39d2a.min.js +++ b/0.3/assets/javascripts/vendor.49293c47.min.js @@ -1,15 +1,15 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return o}));var r=n(2);function i(t){return Object(r.a)(null==t?void 0:t.lift)}function o(t){return e=>{if(i(e))return e.lift((function(e){try{return t(e,this)}catch(t){this.error(t)}}));throw new TypeError("Unable to lift unknown Observable type")}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(16);class i extends r.b{constructor(t,e,n,r,i){super(t),this.onUnsubscribe=i,e&&(this._next=function(t){try{e(t)}catch(t){this.destination.error(t)}}),n&&(this._error=function(t){try{n(t)}catch(t){this.destination.error(t)}this.unsubscribe()}),r&&(this._complete=function(){try{r()}catch(t){this.destination.error(t)}this.unsubscribe()})}unsubscribe(){var t;!this.closed&&(null===(t=this.onUnsubscribe)||void 0===t||t.call(this)),super.unsubscribe()}}},function(t,e,n){"use strict";function r(t){return"function"==typeof t}n.d(e,"a",(function(){return r}))},,,function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var r=n(16),i=n(7),o=n(14),s=n(27),c=n(13),u=n(18),a=n(2);class l{constructor(t){t&&(this._subscribe=t)}lift(t){const e=new l;return e.source=this,e.operator=t,e}subscribe(t,e,n){const o=(s=t)&&s instanceof r.b||function(t){return t&&Object(a.a)(t.next)&&Object(a.a)(t.error)&&Object(a.a)(t.complete)}(s)&&Object(i.c)(s)?t:new r.a(t,e,n);var s;const{operator:u,source:l}=this;return o.add(u?u.call(o,l):l||c.a.useDeprecatedSynchronousErrorHandling?this._subscribe(o):this._trySubscribe(o)),o}_trySubscribe(t){try{return this._subscribe(t)}catch(e){if(c.a.useDeprecatedSynchronousErrorHandling)throw e;!function(t){for(;t;){const{closed:e,destination:n,isStopped:i}=t;if(e||i)return!1;t=n&&n instanceof r.b?n:null}return!0}(t)?Object(u.a)(e):t.error(e)}}forEach(t,e){return new(e=d(e))((e,n)=>{let r;r=this.subscribe(e=>{try{t(e)}catch(t){n(t),null==r||r.unsubscribe()}},n,e)})}_subscribe(t){var e;return null===(e=this.source)||void 0===e?void 0:e.subscribe(t)}[o.a](){return this}pipe(...t){return t.length?Object(s.b)(t)(this):this}toPromise(t){return new(t=d(t))((t,e)=>{let n;this.subscribe(t=>n=t,t=>e(t),()=>t(n))})}}function d(t){var e;return null!==(e=null!=t?t:c.a.Promise)&&void 0!==e?e:Promise}l.create=t=>new l(t)},function(t,e,n){"use strict";n.d(e,"a",(function(){return g})),n.d(e,"c",(function(){return _})),n.d(e,"b",(function(){return O}));function r(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function c(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((r=r.apply(t,e||[])).next())}))}Object.create;function i(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function o(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=i(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,i){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)})(r,i,(e=t[n](e)).done,e.value)}))}}}Object.create;var s=n(20),c=n(2);function u(t){return Object(c.a)(null==t?void 0:t.then)}const a="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";var l=n(14),d=n(5),f=n(7);var h=n(21);function b(t){return Object(c.a)(t[l.a])}function v(t){return Object(c.a)(null==t?void 0:t[a])}function p(t){return Symbol.asyncIterator&&Object(c.a)(null==t?void 0:t[Symbol.asyncIterator])}function m(t){return new TypeError(`You provided ${null!==t&&"object"==typeof t?"an invalid object":`'${t}'`} where a stream was expected. You can provide an Observable, Promise, Array, AsyncIterable, or Iterable.`)}function y(t,e){if(null!=t){if(b(t))return function(t,e){return new d.a(n=>{const r=new f.b;return r.add(e.schedule(()=>{const i=t[l.a]();r.add(i.subscribe({next(t){r.add(e.schedule(()=>n.next(t)))},error(t){r.add(e.schedule(()=>n.error(t)))},complete(){r.add(e.schedule(()=>n.complete()))}}))})),r})}(t,e);if(Object(s.a)(t))return Object(h.a)(t,e);if(u(t))return function(t,e){return new d.a(n=>e.schedule(()=>t.then(t=>{n.add(e.schedule(()=>{n.next(t),n.add(e.schedule(()=>n.complete()))}))},t=>{n.add(e.schedule(()=>n.error(t)))})))}(t,e);if(p(t))return function(t,e){if(!t)throw new Error("Iterable cannot be null");return new d.a(n=>{const r=new f.b;return r.add(e.schedule(()=>{const i=t[Symbol.asyncIterator]();r.add(e.schedule((function(){i.next().then(t=>{t.done?n.complete():(n.next(t.value),this.schedule())})})))})),r})}(t,e);if(v(t))return function(t,e){return new d.a(n=>{let r;return n.add(e.schedule(()=>{r=t[a](),function(t,e,n,r=0){const i=e.schedule((function(){try{n.call(this)}catch(e){t.error(e)}}),r);t.add(i)}(n,e,(function(){const{value:t,done:e}=r.next();e?n.complete():(n.next(t),this.schedule())}))})),()=>Object(c.a)(null==r?void 0:r.return)&&r.return()})}(t,e)}throw m(t)}var w=n(18);function g(t,e){return e?y(t,e):_(t)}function _(t){if(t instanceof d.a)return t;if(null!=t){if(b(t))return f=t,new d.a(t=>{const e=f[l.a]();if(Object(c.a)(e.subscribe))return e.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")});if(Object(s.a)(t))return O(t);if(u(t))return i=t,new d.a(t=>{i.then(e=>{t.closed||(t.next(e),t.complete())},e=>t.error(e)).then(null,w.a)});if(p(t))return n=t,new d.a(t=>{(function(t,e){var n,i,s,c;return r(this,void 0,void 0,(function*(){try{for(n=o(t);!(i=yield n.next()).done;){const t=i.value;e.next(t)}}catch(t){s={error:t}}finally{try{i&&!i.done&&(c=n.return)&&(yield c.call(n))}finally{if(s)throw s.error}}e.complete()}))})(n,t).catch(e=>t.error(e))});if(v(t))return e=t,new d.a(t=>{const n=e[a]();for(;!t.closed;){const{done:e,value:r}=n.next();e?t.complete():t.next(r)}return()=>Object(c.a)(null==n?void 0:n.return)&&n.return()})}var e,n,i,f;throw m(t)}function O(t){return new d.a(e=>{for(let n=0;nfunction(e){t(this),this.message=e?`${e.length} errors occurred during unsubscription:\n${e.map((t,e)=>`${e+1}) ${t.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=e});var s=n(11);class c{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._teardowns=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;const{_parentage:e}=this;if(Array.isArray(e))for(const t of e)t.remove(this);else null==e||e.remove(this);const{initialTeardown:n}=this;if(Object(r.a)(n))try{n()}catch(e){t=e instanceof o?e.errors:[e]}const{_teardowns:i}=this;if(i){this._teardowns=null;for(const e of i)try{l(e)}catch(e){t=null!=t?t:[],e instanceof o?t=[...t,...e.errors]:t.push(e)}}if(t)throw new o(t)}}add(t){var e;if(t&&t!==this)if(this.closed)l(t);else{if(t instanceof c){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=null!==(e=this._teardowns)&&void 0!==e?e:[]).push(t)}}_hasParent(t){const{_parentage:e}=this;return e===t||Array.isArray(e)&&e.includes(t)}_addParent(t){const{_parentage:e}=this;this._parentage=Array.isArray(e)?(e.push(t),e):e?[e,t]:t}_removeParent(t){const{_parentage:e}=this;e===t?this._parentage=null:Array.isArray(e)&&Object(s.a)(e,t)}remove(t){const{_teardowns:e}=this;e&&Object(s.a)(e,t),t instanceof c&&t._removeParent(this)}}c.EMPTY=(()=>{const t=new c;return t.closed=!0,t})();const u=c.EMPTY;function a(t){return t instanceof c||t&&"closed"in t&&Object(r.a)(t.remove)&&Object(r.a)(t.add)&&Object(r.a)(t.unsubscribe)}function l(t){Object(r.a)(t)?t():t.unsubscribe()}},function(t,e,n){"use strict";n.d(e,"b",(function(){return s})),n.d(e,"c",(function(){return c})),n.d(e,"a",(function(){return u}));var r=n(2),i=n(30);function o(t){return t[t.length-1]}function s(t){return Object(r.a)(o(t))?t.pop():void 0}function c(t){return Object(i.a)(o(t))?t.pop():void 0}function u(t,e){return"number"==typeof o(t)?t.pop():e}},function(t,e,n){"use strict";function r(t){return t}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";function r(){}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";function r(t,e){if(t){const n=t.indexOf(e);0<=n&&t.splice(n,1)}}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(5);const i=new r.a(t=>t.complete())},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r={onUnhandledError:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r="function"==typeof Symbol&&Symbol.observable||"@@observable"},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(21),i=n(6);function o(t,e){return e?Object(r.a)(t,e):Object(i.b)(t)}},function(t,e,n){"use strict";n.d(e,"b",(function(){return u})),n.d(e,"a",(function(){return a}));var r=n(2),i=n(7),o=n(13),s=n(18),c=n(10);class u extends i.b{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,Object(i.c)(t)&&t.add(this)):this.destination=d}static create(t,e,n){return new a(t,e,n)}next(t){this.isStopped||this._next(t)}error(t){this.isStopped||(this.isStopped=!0,this._error(t))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(t){this.destination.next(t)}_error(t){this.destination.error(t),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}}class a extends u{constructor(t,e,n){if(super(),this.destination=d,(t||e||n)&&t!==d){let i;if(Object(r.a)(t))i=t;else if(t){let r;({next:i,error:e,complete:n}=t),this&&o.a.useDeprecatedNextContext?(r=Object.create(t),r.unsubscribe=()=>this.unsubscribe()):r=t,i=null==i?void 0:i.bind(r),e=null==e?void 0:e.bind(r),n=null==n?void 0:n.bind(r)}this.destination={next:i||c.a,error:e||l,complete:n||c.a}}}}function l(t){if(o.a.useDeprecatedSynchronousErrorHandling)throw t;Object(s.a)(t)}const d={closed:!0,next:c.a,error:l,complete:c.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(29),i=n(6),o=n(0),s=n(1);var c=n(2);function u(t,e,n=1/0){return Object(c.a)(e)?u((n,o)=>Object(r.a)((t,r)=>e(n,t,o,r))(Object(i.c)(t(n,o))),n):("number"==typeof e&&(n=e),Object(o.b)((e,r)=>function(t,e,n,r,o,c,u,a){let l=[],d=0,f=0,h=!1;const b=()=>{!h||l.length||d||e.complete()},v=t=>d{c&&e.next(t),d++,Object(i.c)(n(t,f++)).subscribe(new s.a(e,t=>{null==o||o(t),c?v(t):e.next(t)},void 0,()=>{for(d--;l.length&&dp(t))):p(t)}b()}))};return t.subscribe(new s.a(e,v,void 0,()=>{h=!0,b()})),()=>{l=null,null==a||a()}}(e,r,t,n)))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(13);function i(t){setTimeout(()=>{const{onUnhandledError:e}=r.a;if(!e)throw t;e(t)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(29);const{isArray:i}=Array;function o(t){return Object(r.a)(e=>function(t,e){return i(e)?t(...e):t(e)}(t,e))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r=t=>t&&"number"==typeof t.length&&"function"!=typeof t},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(5);function i(t,e){return new r.a(n=>{let r=0;return e.schedule((function(){r===t.length?n.complete():(n.next(t[r++]),n.closed||this.schedule())}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));const{isArray:r}=Array;function i(t){return 1===t.length&&r(t[0])?t[0]:t}},function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"a",(function(){return o}));var r=n(32);const i=new(n(34).a)(r.a),o=i},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(5),i=n(7),o=n(26);const s=Object(o.a)(t=>function(){t(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var c=n(11);class u extends r.a{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(t){const e=new a(this,this);return e.operator=t,e}_throwIfClosed(){if(this.closed)throw new s}next(t){if(this._throwIfClosed(),!this.isStopped){const e=this.observers.slice();for(const n of e)n.next(t)}}error(t){if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=t;const{observers:e}=this;for(;e.length;)e.shift().error(t)}}complete(){if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;const{observers:t}=this;for(;t.length;)t.shift().complete()}}unsubscribe(){this.isStopped=this.closed=!0,this.observers=null}_trySubscribe(t){return this._throwIfClosed(),super._trySubscribe(t)}_subscribe(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)}_innerSubscribe(t){const{hasError:e,isStopped:n,observers:r}=this;return e||n?i.a:(r.push(t),new i.b(()=>Object(c.a)(this.observers,t)))}_checkFinalizedStatuses(t){const{hasError:e,thrownError:n,isStopped:r}=this;e?t.error(n):r&&t.complete()}asObservable(){const t=new r.a;return t.source=this,t}}u.create=(t,e)=>new a(t,e);class a extends u{constructor(t,e){super(),this.destination=t,this.source=e}next(t){var e,n;null===(n=null===(e=this.destination)||void 0===e?void 0:e.next)||void 0===n||n.call(e,t)}error(t){var e,n;null===(n=null===(e=this.destination)||void 0===e?void 0:e.error)||void 0===n||n.call(e,t)}complete(){var t,e;null===(e=null===(t=this.destination)||void 0===t?void 0:t.complete)||void 0===e||e.call(t)}_subscribe(t){var e,n;return null!==(n=null===(e=this.source)||void 0===e?void 0:e.subscribe(t))&&void 0!==n?n:i.a}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(31);var i=n(15),o=n(8);function s(...t){return Object(r.a)(1)(Object(i.a)(t,Object(o.c)(t)))}},function(t,e,n){"use strict";function r(t){const e=t(t=>{Error.call(t),t.stack=(new Error).stack});return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return o}));var r=n(9);function i(...t){return o(t)}function o(t){return 0===t.length?r.a:1===t.length?t[0]:function(e){return t.reduce((t,e)=>e(t),e)}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r={now:()=>(r.delegate||Date).now(),delegate:void 0}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return Object(r.b)((n,r)=>{let o=0;n.subscribe(new i.a(r,n=>{r.next(t.call(e,n,o++))}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(2);function i(t){return t&&Object(r.a)(t.schedule)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(17),i=n(9);function o(t=1/0){return Object(r.a)(i.a,t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(7);class i extends r.b{constructor(t,e){super()}schedule(t,e=0){return this}}const o={setInterval(...t){const{delegate:e}=o;return((null==e?void 0:e.setInterval)||setInterval)(...t)},clearInterval(t){const{delegate:e}=o;return((null==e?void 0:e.clearInterval)||clearInterval)(t)},delegate:void 0};var s=n(11);class c extends i{constructor(t,e){super(t,e),this.scheduler=t,this.work=e,this.pending=!1}schedule(t,e=0){if(this.closed)return this;this.state=t;const n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,e)),this.pending=!0,this.delay=e,this.id=this.id||this.requestAsyncId(r,this.id,e),this}requestAsyncId(t,e,n=0){return o.setInterval(t.flush.bind(t,this),n)}recycleAsyncId(t,e,n=0){if(null!=n&&this.delay===n&&!1===this.pending)return e;o.clearInterval(e)}execute(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(t,e){let n,r=!1;try{this.work(t)}catch(t){r=!0,n=!!t&&t||new Error(t)}if(r)return this.unsubscribe(),n}unsubscribe(){if(!this.closed){const{id:t,scheduler:e}=this,{actions:n}=e;this.work=this.state=this.scheduler=null,this.pending=!1,Object(s.a)(n,this),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null,super.unsubscribe()}}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(5),i=n(23),o=n(30);function s(t=0,e,n=i.a){let s=-1;return null!=e&&(Object(o.a)(e)?n=e:s=e),new r.a(e=>{let r=(i=t)instanceof Date&&!isNaN(i)?+t-n.now():t;var i;r<0&&(r=0);let o=0;return n.schedule((function(){e.closed||(e.next(o++),0<=s?this.schedule(void 0,s):e.complete())}),r)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(28);class i{constructor(t,e=i.now){this.schedulerActionCtor=t,this.now=e}schedule(t,e=0,n){return new this.schedulerActionCtor(this,t).schedule(n,e)}}i.now=r.a.now;class o extends i{constructor(t,e=i.now){super(t,e),this.actions=[],this.active=!1,this.scheduled=void 0}flush(t){const{actions:e}=this;if(this.active)return void e.push(t);let n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(6),i=n(0),o=n(1);function s(t,e){return Object(i.b)((n,i)=>{let s=null,c=0,u=!1;const a=()=>u&&!s&&i.complete();n.subscribe(new o.a(i,n=>{null==s||s.unsubscribe();let u=0;const l=c++;Object(r.c)(t(n,l)).subscribe(s=new o.a(i,t=>i.next(e?e(n,t,l,u++):t),void 0,()=>{s=null,a()}))},void 0,()=>{u=!0,a()}))})}},function(t,e,n){ -/*! - * clipboard.js v2.0.6 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -var r;r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=6)}([function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(t),r.removeAllRanges(),r.addRange(i),e=r.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var r=this.e||(this.e={});return(r[t]||(r[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var r=this;function i(){r.off(t,i),e.apply(n,arguments)}return i._=e,this.on(t,i,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),r=0,i=n.length;r0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=i()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=i()(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":o(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}(),u=n(1),a=n.n(u),l=n(2),d=n.n(l),f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===f(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=d()(t,"click",(function(t){return e.onClick(t)}))}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return v("action",t)}},{key:"defaultTarget",value:function(t){var e=v("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return v("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach((function(t){n=n&&!!document.queryCommandSupported(t)})),n}}]),e}(a.a);function v(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}e.default=b}]).default},t.exports=r()},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(24),i=n(28);class o extends r.a{constructor(t=1/0,e=1/0,n=i.a){super(),this.bufferSize=t,this.windowTime=e,this.timestampProvider=n,this.buffer=[],this.infiniteTimeWindow=!0,this.infiniteTimeWindow=e===1/0,this.bufferSize=Math.max(1,t),this.windowTime=Math.max(1,e)}next(t){const{isStopped:e,buffer:n,infiniteTimeWindow:r,timestampProvider:i,windowTime:o}=this;e||(n.push(t),!r&&n.push(i.now()+o)),this.trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this.trimBuffer();const e=this._innerSubscribe(t),{infiniteTimeWindow:n,buffer:r}=this,i=r.slice();for(let e=0;e0},t.prototype.connect_=function(){r&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},t.prototype.disconnect_=function(){r&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},t.prototype.onTransitionEnd_=function(t){var e=t.propertyName,n=void 0===e?"":e;s.some((function(t){return!!~n.indexOf(t)}))&&this.refresh()},t.getInstance=function(){return this.instance_||(this.instance_=new t),this.instance_},t.instance_=null,t}(),a=function(t,e){for(var n=0,r=Object.keys(e);n0},t}(),_="undefined"!=typeof WeakMap?new WeakMap:new n,O=function t(e){if(!(this instanceof t))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=u.getInstance(),r=new g(e,n,this);_.set(this,r)};["observe","unobserve","disconnect"].forEach((function(t){O.prototype[t]=function(){var e;return(e=_.get(this))[t].apply(e,arguments)}}));var j=void 0!==i.ResizeObserver?i.ResizeObserver:O;e.a=j}).call(this,n(46))},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(5),i=n(6);function o(t){return new r.a(e=>{Object(i.c)(t()).subscribe(e)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return Object(r.b)((n,r)=>{let o=0;n.subscribe(new i.a(r,n=>t.call(e,n,o++)&&r.next(n)))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(12),i=n(0),o=n(1);function s(t){return t<=0?()=>r.a:Object(i.b)((e,n)=>{let r=0;e.subscribe(new o.a(n,e=>{++r<=t&&(n.next(e),t<=r&&n.complete())}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return t=null!=t?t:s,Object(r.b)((n,r)=>{let o,s=!0;n.subscribe(new i.a(r,n=>{(s&&(o=n,1)||!t(o,o=e?e(n):n))&&r.next(n),s=!1}))})}function s(t,e){return t===e}},function(t,e,n){"use strict"; +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return o}));var r=n(2);function i(t){return Object(r.a)(null==t?void 0:t.lift)}function o(t){return e=>{if(i(e))return e.lift((function(e){try{return t(e,this)}catch(t){this.error(t)}}));throw new TypeError("Unable to lift unknown Observable type")}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(16);class i extends r.b{constructor(t,e,n,r,i){super(t),this.onUnsubscribe=i,e&&(this._next=function(t){try{e(t)}catch(t){this.destination.error(t)}}),n&&(this._error=function(t){try{n(t)}catch(t){this.destination.error(t)}this.unsubscribe()}),r&&(this._complete=function(){try{r()}catch(t){this.destination.error(t)}this.unsubscribe()})}unsubscribe(){var t;!this.closed&&(null===(t=this.onUnsubscribe)||void 0===t||t.call(this)),super.unsubscribe()}}},function(t,e,n){"use strict";function r(t){return"function"==typeof t}n.d(e,"a",(function(){return r}))},,,function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var r=n(16),i=n(7),o=n(14),s=n(28),c=n(13),u=n(18),a=n(2);class l{constructor(t){t&&(this._subscribe=t)}lift(t){const e=new l;return e.source=this,e.operator=t,e}subscribe(t,e,n){const o=(s=t)&&s instanceof r.b||function(t){return t&&Object(a.a)(t.next)&&Object(a.a)(t.error)&&Object(a.a)(t.complete)}(s)&&Object(i.c)(s)?t:new r.a(t,e,n);var s;const{operator:u,source:l}=this;return o.add(u?u.call(o,l):l||c.a.useDeprecatedSynchronousErrorHandling?this._subscribe(o):this._trySubscribe(o)),o}_trySubscribe(t){try{return this._subscribe(t)}catch(e){if(c.a.useDeprecatedSynchronousErrorHandling)throw e;!function(t){for(;t;){const{closed:e,destination:n,isStopped:i}=t;if(e||i)return!1;t=n&&n instanceof r.b?n:null}return!0}(t)?Object(u.a)(e):t.error(e)}}forEach(t,e){return new(e=d(e))((e,n)=>{let r;r=this.subscribe(e=>{try{t(e)}catch(t){n(t),null==r||r.unsubscribe()}},n,e)})}_subscribe(t){var e;return null===(e=this.source)||void 0===e?void 0:e.subscribe(t)}[o.a](){return this}pipe(...t){return t.length?Object(s.b)(t)(this):this}toPromise(t){return new(t=d(t))((t,e)=>{let n;this.subscribe(t=>n=t,t=>e(t),()=>t(n))})}}function d(t){var e;return null!==(e=null!=t?t:c.a.Promise)&&void 0!==e?e:Promise}l.create=t=>new l(t)},function(t,e,n){"use strict";n.d(e,"a",(function(){return g})),n.d(e,"c",(function(){return _})),n.d(e,"b",(function(){return O}));function r(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function c(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((r=r.apply(t,e||[])).next())}))}Object.create;function i(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function o(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=i(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,i){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)})(r,i,(e=t[n](e)).done,e.value)}))}}}Object.create;var s=n(20),c=n(2);function u(t){return Object(c.a)(null==t?void 0:t.then)}const a="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";var l=n(14),d=n(5),f=n(7);var h=n(21);function b(t){return Object(c.a)(t[l.a])}function v(t){return Object(c.a)(null==t?void 0:t[a])}function p(t){return Symbol.asyncIterator&&Object(c.a)(null==t?void 0:t[Symbol.asyncIterator])}function m(t){return new TypeError(`You provided ${null!==t&&"object"==typeof t?"an invalid object":`'${t}'`} where a stream was expected. You can provide an Observable, Promise, Array, AsyncIterable, or Iterable.`)}function y(t,e){if(null!=t){if(b(t))return function(t,e){return new d.a(n=>{const r=new f.b;return r.add(e.schedule(()=>{const i=t[l.a]();r.add(i.subscribe({next(t){r.add(e.schedule(()=>n.next(t)))},error(t){r.add(e.schedule(()=>n.error(t)))},complete(){r.add(e.schedule(()=>n.complete()))}}))})),r})}(t,e);if(Object(s.a)(t))return Object(h.a)(t,e);if(u(t))return function(t,e){return new d.a(n=>e.schedule(()=>t.then(t=>{n.add(e.schedule(()=>{n.next(t),n.add(e.schedule(()=>n.complete()))}))},t=>{n.add(e.schedule(()=>n.error(t)))})))}(t,e);if(p(t))return function(t,e){if(!t)throw new Error("Iterable cannot be null");return new d.a(n=>{const r=new f.b;return r.add(e.schedule(()=>{const i=t[Symbol.asyncIterator]();r.add(e.schedule((function(){i.next().then(t=>{t.done?n.complete():(n.next(t.value),this.schedule())})})))})),r})}(t,e);if(v(t))return function(t,e){return new d.a(n=>{let r;return n.add(e.schedule(()=>{r=t[a](),function(t,e,n,r=0){const i=e.schedule((function(){try{n.call(this)}catch(e){t.error(e)}}),r);t.add(i)}(n,e,(function(){const{value:t,done:e}=r.next();e?n.complete():(n.next(t),this.schedule())}))})),()=>Object(c.a)(null==r?void 0:r.return)&&r.return()})}(t,e)}throw m(t)}var w=n(18);function g(t,e){return e?y(t,e):_(t)}function _(t){if(t instanceof d.a)return t;if(null!=t){if(b(t))return f=t,new d.a(t=>{const e=f[l.a]();if(Object(c.a)(e.subscribe))return e.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")});if(Object(s.a)(t))return O(t);if(u(t))return i=t,new d.a(t=>{i.then(e=>{t.closed||(t.next(e),t.complete())},e=>t.error(e)).then(null,w.a)});if(p(t))return n=t,new d.a(t=>{(function(t,e){var n,i,s,c;return r(this,void 0,void 0,(function*(){try{for(n=o(t);!(i=yield n.next()).done;){const t=i.value;e.next(t)}}catch(t){s={error:t}}finally{try{i&&!i.done&&(c=n.return)&&(yield c.call(n))}finally{if(s)throw s.error}}e.complete()}))})(n,t).catch(e=>t.error(e))});if(v(t))return e=t,new d.a(t=>{const n=e[a]();for(;!t.closed;){const{done:e,value:r}=n.next();e?t.complete():t.next(r)}return()=>Object(c.a)(null==n?void 0:n.return)&&n.return()})}var e,n,i,f;throw m(t)}function O(t){return new d.a(e=>{for(let n=0;nfunction(e){t(this),this.message=e?`${e.length} errors occurred during unsubscription:\n${e.map((t,e)=>`${e+1}) ${t.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=e});var s=n(11);class c{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._teardowns=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;const{_parentage:e}=this;if(Array.isArray(e))for(const t of e)t.remove(this);else null==e||e.remove(this);const{initialTeardown:n}=this;if(Object(r.a)(n))try{n()}catch(e){t=e instanceof o?e.errors:[e]}const{_teardowns:i}=this;if(i){this._teardowns=null;for(const e of i)try{l(e)}catch(e){t=null!=t?t:[],e instanceof o?t=[...t,...e.errors]:t.push(e)}}if(t)throw new o(t)}}add(t){var e;if(t&&t!==this)if(this.closed)l(t);else{if(t instanceof c){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=null!==(e=this._teardowns)&&void 0!==e?e:[]).push(t)}}_hasParent(t){const{_parentage:e}=this;return e===t||Array.isArray(e)&&e.includes(t)}_addParent(t){const{_parentage:e}=this;this._parentage=Array.isArray(e)?(e.push(t),e):e?[e,t]:t}_removeParent(t){const{_parentage:e}=this;e===t?this._parentage=null:Array.isArray(e)&&Object(s.a)(e,t)}remove(t){const{_teardowns:e}=this;e&&Object(s.a)(e,t),t instanceof c&&t._removeParent(this)}}c.EMPTY=(()=>{const t=new c;return t.closed=!0,t})();const u=c.EMPTY;function a(t){return t instanceof c||t&&"closed"in t&&Object(r.a)(t.remove)&&Object(r.a)(t.add)&&Object(r.a)(t.unsubscribe)}function l(t){Object(r.a)(t)?t():t.unsubscribe()}},function(t,e,n){"use strict";n.d(e,"b",(function(){return s})),n.d(e,"c",(function(){return c})),n.d(e,"a",(function(){return u}));var r=n(2),i=n(31);function o(t){return t[t.length-1]}function s(t){return Object(r.a)(o(t))?t.pop():void 0}function c(t){return Object(i.a)(o(t))?t.pop():void 0}function u(t,e){return"number"==typeof o(t)?t.pop():e}},function(t,e,n){"use strict";function r(t){return t}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";function r(){}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";function r(t,e){if(t){const n=t.indexOf(e);0<=n&&t.splice(n,1)}}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(5);const i=new r.a(t=>t.complete())},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r={onUnhandledError:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r="function"==typeof Symbol&&Symbol.observable||"@@observable"},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(21),i=n(6);function o(t,e){return e?Object(r.a)(t,e):Object(i.b)(t)}},function(t,e,n){"use strict";n.d(e,"b",(function(){return u})),n.d(e,"a",(function(){return a}));var r=n(2),i=n(7),o=n(13),s=n(18),c=n(10);class u extends i.b{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,Object(i.c)(t)&&t.add(this)):this.destination=d}static create(t,e,n){return new a(t,e,n)}next(t){this.isStopped||this._next(t)}error(t){this.isStopped||(this.isStopped=!0,this._error(t))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(t){this.destination.next(t)}_error(t){this.destination.error(t),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}}class a extends u{constructor(t,e,n){if(super(),this.destination=d,(t||e||n)&&t!==d){let i;if(Object(r.a)(t))i=t;else if(t){let r;({next:i,error:e,complete:n}=t),this&&o.a.useDeprecatedNextContext?(r=Object.create(t),r.unsubscribe=()=>this.unsubscribe()):r=t,i=null==i?void 0:i.bind(r),e=null==e?void 0:e.bind(r),n=null==n?void 0:n.bind(r)}this.destination={next:i||c.a,error:e||l,complete:n||c.a}}}}function l(t){if(o.a.useDeprecatedSynchronousErrorHandling)throw t;Object(s.a)(t)}const d={closed:!0,next:c.a,error:l,complete:c.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(30),i=n(6),o=n(0),s=n(1);var c=n(2);function u(t,e,n=1/0){return Object(c.a)(e)?u((n,o)=>Object(r.a)((t,r)=>e(n,t,o,r))(Object(i.c)(t(n,o))),n):("number"==typeof e&&(n=e),Object(o.b)((e,r)=>function(t,e,n,r,o,c,u,a){let l=[],d=0,f=0,h=!1;const b=()=>{!h||l.length||d||e.complete()},v=t=>d{c&&e.next(t),d++,Object(i.c)(n(t,f++)).subscribe(new s.a(e,t=>{null==o||o(t),c?v(t):e.next(t)},void 0,()=>{for(d--;l.length&&dp(t))):p(t)}b()}))};return t.subscribe(new s.a(e,v,void 0,()=>{h=!0,b()})),()=>{l=null,null==a||a()}}(e,r,t,n)))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(13);function i(t){setTimeout(()=>{const{onUnhandledError:e}=r.a;if(!e)throw t;e(t)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(30);const{isArray:i}=Array;function o(t){return Object(r.a)(e=>function(t,e){return i(e)?t(...e):t(e)}(t,e))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r=t=>t&&"number"==typeof t.length&&"function"!=typeof t},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(5);function i(t,e){return new r.a(n=>{let r=0;return e.schedule((function(){r===t.length?n.complete():(n.next(t[r++]),n.closed||this.schedule())}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));const{isArray:r}=Array;function i(t){return 1===t.length&&r(t[0])?t[0]:t}},function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"a",(function(){return o}));var r=n(33);const i=new(n(35).a)(r.a),o=i},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(5),i=n(7),o=n(27);const s=Object(o.a)(t=>function(){t(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var c=n(11);class u extends r.a{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(t){const e=new a(this,this);return e.operator=t,e}_throwIfClosed(){if(this.closed)throw new s}next(t){if(this._throwIfClosed(),!this.isStopped){const e=this.observers.slice();for(const n of e)n.next(t)}}error(t){if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=t;const{observers:e}=this;for(;e.length;)e.shift().error(t)}}complete(){if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;const{observers:t}=this;for(;t.length;)t.shift().complete()}}unsubscribe(){this.isStopped=this.closed=!0,this.observers=null}_trySubscribe(t){return this._throwIfClosed(),super._trySubscribe(t)}_subscribe(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)}_innerSubscribe(t){const{hasError:e,isStopped:n,observers:r}=this;return e||n?i.a:(r.push(t),new i.b(()=>Object(c.a)(this.observers,t)))}_checkFinalizedStatuses(t){const{hasError:e,thrownError:n,isStopped:r}=this;e?t.error(n):r&&t.complete()}asObservable(){const t=new r.a;return t.source=this,t}}u.create=(t,e)=>new a(t,e);class a extends u{constructor(t,e){super(),this.destination=t,this.source=e}next(t){var e,n;null===(n=null===(e=this.destination)||void 0===e?void 0:e.next)||void 0===n||n.call(e,t)}error(t){var e,n;null===(n=null===(e=this.destination)||void 0===e?void 0:e.error)||void 0===n||n.call(e,t)}complete(){var t,e;null===(e=null===(t=this.destination)||void 0===t?void 0:t.complete)||void 0===e||e.call(t)}_subscribe(t){var e,n;return null!==(n=null===(e=this.source)||void 0===e?void 0:e.subscribe(t))&&void 0!==n?n:i.a}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(32);var i=n(15),o=n(8);function s(...t){return Object(r.a)(1)(Object(i.a)(t,Object(o.c)(t)))}},function(t,e,n){"use strict"; /*! * escape-html * Copyright(c) 2012-2013 TJ Holowaychuk * Copyright(c) 2015 Andreas Lubbe * Copyright(c) 2015 Tiancheng "Timothy" Gu * MIT Licensed - */var r=/["'&<>]/;t.exports=function(t){var e,n=""+t,i=r.exec(n);if(!i)return n;var o="",s=0,c=0;for(s=i.index;sn[t]),keys:t}}}var e;return{args:t,keys:null}}var a=n(16),l=n(6),d=n(9),f=n(19),h=n(8);function b(...t){const e=Object(h.c)(t),n=Object(h.b)(t),{args:i,keys:o}=u(t),s=new r.a(p(i,e,o?t=>{const e={};for(let n=0;n{m(e,()=>{const{length:i}=t,o=new Array(i);let s=i;const c=t.map(()=>!1);let u=!0;for(let a=0;a{Object(l.a)(t[a],e).subscribe(new v(r,t=>{o[a]=t,u&&(c[a]=!0,u=!c.every(d.a)),u||r.next(n(o.slice()))},()=>0==--s))},r)}},r)}}function m(t,e,n){t?n.add(t.schedule(e)):e()}},function(t,e,n){!function(){"use strict";function t(t){var e=!0,n=!1,r=null,i={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function o(t){return!!(t&&t!==document&&"HTML"!==t.nodeName&&"BODY"!==t.nodeName&&"classList"in t&&"contains"in t.classList)}function s(t){t.classList.contains("focus-visible")||(t.classList.add("focus-visible"),t.setAttribute("data-focus-visible-added",""))}function c(t){e=!1}function u(){document.addEventListener("mousemove",a),document.addEventListener("mousedown",a),document.addEventListener("mouseup",a),document.addEventListener("pointermove",a),document.addEventListener("pointerdown",a),document.addEventListener("pointerup",a),document.addEventListener("touchmove",a),document.addEventListener("touchstart",a),document.addEventListener("touchend",a)}function a(t){t.target.nodeName&&"html"===t.target.nodeName.toLowerCase()||(e=!1,document.removeEventListener("mousemove",a),document.removeEventListener("mousedown",a),document.removeEventListener("mouseup",a),document.removeEventListener("pointermove",a),document.removeEventListener("pointerdown",a),document.removeEventListener("pointerup",a),document.removeEventListener("touchmove",a),document.removeEventListener("touchstart",a),document.removeEventListener("touchend",a))}document.addEventListener("keydown",(function(n){n.metaKey||n.altKey||n.ctrlKey||(o(t.activeElement)&&s(t.activeElement),e=!0)}),!0),document.addEventListener("mousedown",c,!0),document.addEventListener("pointerdown",c,!0),document.addEventListener("touchstart",c,!0),document.addEventListener("visibilitychange",(function(t){"hidden"===document.visibilityState&&(n&&(e=!0),u())}),!0),u(),t.addEventListener("focus",(function(t){var n,r,c;o(t.target)&&(e||(n=t.target,r=n.type,"INPUT"===(c=n.tagName)&&i[r]&&!n.readOnly||"TEXTAREA"===c&&!n.readOnly||n.isContentEditable))&&s(t.target)}),!0),t.addEventListener("blur",(function(t){var e;o(t.target)&&(t.target.classList.contains("focus-visible")||t.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(r),r=window.setTimeout((function(){n=!1}),100),(e=t.target).hasAttribute("data-focus-visible-added")&&(e.classList.remove("focus-visible"),e.removeAttribute("data-focus-visible-added")))}),!0),t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host?t.host.setAttribute("data-js-focus-visible",""):t.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if("undefined"!=typeof window&&"undefined"!=typeof document){var e;window.applyFocusVisiblePolyfill=t;try{e=new CustomEvent("focus-visible-polyfill-ready")}catch(t){(e=document.createEvent("CustomEvent")).initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(e)}"undefined"!=typeof document&&t(document)}()},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},,,,,function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(5),i=n(17),o=n(20),s=n(2),c=n(19),u=n(15);const a=["addListener","removeListener"],l=["addEventListener","removeEventListener"],d=["on","off"];function f(t,e,n,b){if(Object(s.a)(n)&&(b=n,n=void 0),b)return f(t,e,n).pipe(Object(c.a)(b));const[v,p]=function(t){return Object(s.a)(t.addEventListener)&&Object(s.a)(t.removeEventListener)}(t)?l.map(r=>i=>t[r](e,i,n)):function(t){return Object(s.a)(t.addListener)&&Object(s.a)(t.removeListener)}(t)?a.map(h(t,e)):function(t){return Object(s.a)(t.on)&&Object(s.a)(t.off)}(t)?d.map(h(t,e)):[];return!v&&Object(o.a)(t)?Object(i.a)(t=>f(t,e,n))(Object(u.a)(t)):new r.a(t=>{if(!v)throw new TypeError("Invalid event target");const e=(...e)=>t.next(1p(e)})}function h(t,e){return n=>r=>t[n](e,r)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t){return Object(r.b)((e,n)=>{e.subscribe(new i.a(n,()=>n.next(t)))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(31),i=n(15),o=n(22),s=n(6),c=n(12),u=n(8);function a(...t){const e=Object(u.c)(t),n=Object(u.a)(t,1/0);return(t=Object(o.a)(t)).length?1===t.length?Object(s.c)(t[0]):Object(r.a)(n)(Object(i.a)(t,e)):c.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(25),i=n(8),o=n(0);function s(...t){const e=Object(i.c)(t);return Object(o.b)((n,i)=>{(e?Object(r.a)(t,n,e):Object(r.a)(t,n)).subscribe(i)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(15),i=n(21),o=n(8);function s(...t){const e=Object(o.c)(t);return e?Object(i.a)(t,e):Object(r.a)(t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(5),i=n(10);const o=new r.a(i.a)},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(0);function i(t){return Object(r.b)((e,n)=>{e.subscribe(n),n.add(t)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(37),i=n(0);function o(t,e,n){let o;return o=t&&"object"==typeof t?t:{bufferSize:t,windowTime:e,refCount:!1,scheduler:n},Object(i.b)(function({bufferSize:t=1/0,windowTime:e=1/0,refCount:n,scheduler:i}){let o,s,c=0;return(u,a)=>{let l;c++,o?l=o.subscribe(a):(o=new r.a(t,e,i),l=o.subscribe(a),s=u.subscribe({next(t){o.next(t)},error(t){const e=o;s=void 0,o=void 0,e.error(t)},complete(){s=void 0,o.complete()}}),s.closed&&(s=void 0)),a.add(()=>{c--,l.unsubscribe(),n&&0===c&&s&&(s.unsubscribe(),s=void 0,o=void 0)})}}(o))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(2),i=n(0),o=n(1),s=n(9);function c(t,e,n){const c=Object(r.a)(t)||e||n?{next:t,error:e,complete:n}:t;return c?Object(i.b)((t,e)=>{t.subscribe(new o.a(e,t=>{var n;null===(n=c.next)||void 0===n||n.call(c,t),e.next(t)},t=>{var n;null===(n=c.error)||void 0===n||n.call(c,t),e.error(t)},()=>{var t;null===(t=c.complete)||void 0===t||t.call(c),e.complete()}))}):s.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(24);class i extends r.a{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){const e=super._subscribe(t);return!e.closed&&t.next(this._value),e}getValue(){const{hasError:t,thrownError:e,_value:n}=this;if(t)throw e;return this._throwIfClosed(),n}next(t){super.next(this._value=t)}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(42);function i(t,e){return Object(r.a)((n,r)=>e?e(n[t],r[t]):n[t]===r[t])}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(0),i=n(1),o=n(6);const s={leading:!0,trailing:!1};function c(t,{leading:e,trailing:n}=s){return Object(r.b)((r,s)=>{let c=!1,u=null,a=null,l=!1;const d=()=>{null==a||a.unsubscribe(),a=null,n&&(h(),l&&s.complete())},f=e=>a=Object(o.c)(t(e)).subscribe(new i.a(s,d,void 0,d)),h=()=>{c&&(s.next(u),!l&&f(u)),c=!1,u=null};r.subscribe(new i.a(s,t=>{c=!0,u=t,(!a||a.closed)&&(e?h():f(t))},void 0,()=>{l=!0,(!(n&&c&&a)||a.closed)&&s.complete()}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(35);function i(t,e){return e?Object(r.a)(()=>t,e):Object(r.a)(()=>t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e=0){return Object(r.b)((n,r)=>{n.subscribe(new i.a(r,n=>r.add(t.schedule(()=>r.next(n),e)),n=>r.add(t.schedule(()=>r.error(n),e)),()=>r.add(t.schedule(()=>r.complete(),e))))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(44),i=n(0),o=n(22),s=n(19),c=n(27),u=n(8);function a(...t){return function t(...e){const n=Object(u.b)(e);return n?Object(c.a)(t(...e),Object(s.a)(n)):Object(i.b)((t,n)=>{Object(r.b)([t,...Object(o.a)(e)])(n)})}(...t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(0),i=n(1),o=n(6),s=n(9),c=n(10),u=n(8);function a(...t){const e=Object(u.b)(t);return Object(r.b)((n,r)=>{const u=t.length,a=new Array(u);let l=t.map(()=>!1),d=!1;n.subscribe(new i.a(r,t=>{if(d){const n=[t,...a];r.next(e?e(...n):n)}}));for(let e=0;e{a[e]=t,d||l[e]||(l[e]=!0,(d=l.every(s.a))&&(l=null))},void 0,c.a))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t){return Object(r.b)((e,n)=>{let r=!1,o=null;e.subscribe(new i.a(n,t=>{r=!0,o=t}));const s=()=>{if(r){r=!1;const t=o;o=null,n.next(t)}};t.subscribe(new i.a(n,s,void 0,s))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(40);function i(t){return Object(r.a)((e,n)=>t<=n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(6),i=n(1),o=n(0);function s(t){return Object(o.b)((e,n)=>{let o,c=null,u=!1;c=e.subscribe(new i.a(n,void 0,i=>{o=Object(r.c)(t(i,s(t)(e))),c?(c.unsubscribe(),c=null,o.subscribe(n)):u=!0})),u&&(c.unsubscribe(),c=null,o.subscribe(n))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(0),i=n(1),o=n(11);function s(t,e=null){return e=null!=e?e:t,Object(r.b)((n,r)=>{let s=[],c=0;n.subscribe(new i.a(r,n=>{let i=null;c++%e==0&&s.push([]);for(const e of s)e.push(n),t<=e.length&&(i=null!=i?i:[],i.push(e));if(i)for(const t of i)Object(o.a)(s,t),r.next(t)},void 0,()=>{for(const t of s)r.next(t);r.complete()},()=>{s=null}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(17),i=n(2);function o(t,e){return Object(i.a)(e)?Object(r.a)(t,e,1):Object(r.a)(t,1)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(39),i=n(12);function o(t,e=i.a,n=i.a){return Object(r.a)(()=>t()?e:n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(5),i=n(7),o=n(0),s=n(1);function c(){return Object(o.b)((t,e)=>{let n=null;t._refCount++;const r=new s.a(e,void 0,void 0,void 0,()=>{if(!t||t._refCount<=0||0<--t._refCount)return void(n=null);const r=t._connection,i=n;n=null,!r||i&&r!==i||r.unsubscribe(),e.unsubscribe()});t.subscribe(r),r.closed||(n=t.connect())})}class u extends r.a{constructor(t,e){super(),this.source=t,this.subjectFactory=e,this._subject=null,this._refCount=0,this._connection=null}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;const{_connection:t}=this;this._subject=this._connection=null,null==t||t.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new i.b;const e=this.getSubject();t.add(this.source.subscribe(new s.a(e,void 0,t=>{this._teardown(),e.error(t)},()=>{this._teardown(),e.complete()},()=>this._teardown()))),t.closed&&(this._connection=null,t=i.b.EMPTY)}return t}refCount(){return c()(this)}}var a=n(2);var l=n(24);function d(){return new l.a}function f(){return t=>c()(function(t,e){const n=Object(a.a)(t)?t:()=>t;return Object(a.a)(e)?Object(o.b)((t,r)=>{const i=n();e(i).subscribe(r).add(t.subscribe(i))}):t=>{const e=new u(t,n);return Object(o.a)(t)&&(e.lift=t.lift),e.source=t,e.subjectFactory=n,e}}(d)(t))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(32),i=n(7);const o={schedule(t){let e=requestAnimationFrame,n=cancelAnimationFrame;const{delegate:r}=o;r&&(e=r.requestAnimationFrame,n=r.cancelAnimationFrame);const s=e(e=>{n=void 0,t(e)});return new i.b(()=>null==n?void 0:n(s))},requestAnimationFrame(...t){const{delegate:e}=o;return((null==e?void 0:e.requestAnimationFrame)||requestAnimationFrame)(...t)},cancelAnimationFrame(...t){const{delegate:e}=o;return((null==e?void 0:e.cancelAnimationFrame)||cancelAnimationFrame)(...t)},delegate:void 0};class s extends r.a{constructor(t,e){super(t,e),this.scheduler=t,this.work=e}requestAsyncId(t,e,n=0){return null!==n&&n>0?super.requestAsyncId(t,e,n):(t.actions.push(this),t.scheduled||(t.scheduled=o.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,e,n=0){if(null!=n&&n>0||null==n&&this.delay>0)return super.recycleAsyncId(t,e,n);0===t.actions.length&&(o.cancelAnimationFrame(e),t.scheduled=void 0)}}var c=n(34);class u extends c.a{flush(t){this.active=!0,this.scheduled=void 0;const{actions:e}=this;let n,r=-1;t=t||e.shift();const i=e.length;do{if(n=t.execute(t.state,t.delay))break}while(++rObject(s.a)(e.pipe(Object(c.a)(1),Object(i.b)((t,e)=>{t.subscribe(new o.a(e,u.a))})),n.pipe(a(t))):Object(i.b)((e,n)=>{let r=0,i=!1,s=0;const c=()=>i&&!s&&n.complete();e.subscribe(new o.a(n,e=>{let i=!1;const u=()=>{n.next(e),null==a||a.unsubscribe(),i||(s--,i=!0,c())},a=new o.a(n,u,void 0,u);s++,t(e,r++).subscribe(a)},void 0,()=>{i=!0,c()}))})}var l=n(33);function d(t,e=r.b){const n=Object(l.a)(t,e);return a(()=>n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(0),i=n(1);function o(t,e,n,r,o){return(s,c)=>{let u=n,a=e,l=0;s.subscribe(new i.a(c,e=>{const n=l++;a=u?t(a,e,n):(u=!0,e),r&&c.next(a)},void 0,o&&(()=>{u&&c.next(a),c.complete()})))}}function s(t,e){return Object(r.b)(o(t,e,arguments.length>=2,!0))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(23),i=n(0),o=n(1),s=n(6);var c=n(33);function u(t,e=r.b){const n=Object(c.a)(t,e);return u=()=>n,Object(i.b)((t,e)=>{let n=!1,r=null,i=null;const c=()=>{if(null==i||i.unsubscribe(),i=null,n){n=!1;const t=r;r=null,e.next(t)}};t.subscribe(new o.a(e,t=>{null==i||i.unsubscribe(),n=!0,r=t,i=new o.a(e,c,void 0,c),Object(s.c)(u(t)).subscribe(i)},void 0,()=>{c(),e.complete()},()=>{r=i=null}))});var u}},function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var r=n(5),i=n(6),o=n(22),s=n(12),c=n(1),u=n(8);var a=n(0);function l(...t){return Object(a.b)((e,n)=>{(function(...t){const e=Object(u.b)(t);return(t=Object(o.a)(t)).length?new r.a(n=>{let r=t.map(()=>[]),o=t.map(()=>!1);n.add(()=>{r=o=null});for(let s=0;!n.closed&&s{if(r[s].push(t),r.every(t=>t.length)){const t=r.map(t=>t.shift());n.next(e?e(...t):t),r.some((t,e)=>!t.length&&o[e])&&n.complete()}},void 0,()=>{o[s]=!0,!r[s].length&&n.complete()}));return()=>{r=o=null}}):s.a})(e,...t).subscribe(n)})}function d(...t){return l(...t)}}]]); \ No newline at end of file + */var r=/["'&<>]/;t.exports=function(t){var e,n=""+t,i=r.exec(n);if(!i)return n;var o="",s=0,c=0;for(s=i.index;s{Error.call(t),t.stack=(new Error).stack});return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return o}));var r=n(9);function i(...t){return o(t)}function o(t){return 0===t.length?r.a:1===t.length?t[0]:function(e){return t.reduce((t,e)=>e(t),e)}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r={now:()=>(r.delegate||Date).now(),delegate:void 0}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return Object(r.b)((n,r)=>{let o=0;n.subscribe(new i.a(r,n=>{r.next(t.call(e,n,o++))}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(2);function i(t){return t&&Object(r.a)(t.schedule)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(17),i=n(9);function o(t=1/0){return Object(r.a)(i.a,t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(7);class i extends r.b{constructor(t,e){super()}schedule(t,e=0){return this}}const o={setInterval(...t){const{delegate:e}=o;return((null==e?void 0:e.setInterval)||setInterval)(...t)},clearInterval(t){const{delegate:e}=o;return((null==e?void 0:e.clearInterval)||clearInterval)(t)},delegate:void 0};var s=n(11);class c extends i{constructor(t,e){super(t,e),this.scheduler=t,this.work=e,this.pending=!1}schedule(t,e=0){if(this.closed)return this;this.state=t;const n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,e)),this.pending=!0,this.delay=e,this.id=this.id||this.requestAsyncId(r,this.id,e),this}requestAsyncId(t,e,n=0){return o.setInterval(t.flush.bind(t,this),n)}recycleAsyncId(t,e,n=0){if(null!=n&&this.delay===n&&!1===this.pending)return e;o.clearInterval(e)}execute(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(t,e){let n,r=!1;try{this.work(t)}catch(t){r=!0,n=!!t&&t||new Error(t)}if(r)return this.unsubscribe(),n}unsubscribe(){if(!this.closed){const{id:t,scheduler:e}=this,{actions:n}=e;this.work=this.state=this.scheduler=null,this.pending=!1,Object(s.a)(n,this),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null,super.unsubscribe()}}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(5),i=n(23),o=n(31);function s(t=0,e,n=i.a){let s=-1;return null!=e&&(Object(o.a)(e)?n=e:s=e),new r.a(e=>{let r=(i=t)instanceof Date&&!isNaN(i)?+t-n.now():t;var i;r<0&&(r=0);let o=0;return n.schedule((function(){e.closed||(e.next(o++),0<=s?this.schedule(void 0,s):e.complete())}),r)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(29);class i{constructor(t,e=i.now){this.schedulerActionCtor=t,this.now=e}schedule(t,e=0,n){return new this.schedulerActionCtor(this,t).schedule(n,e)}}i.now=r.a.now;class o extends i{constructor(t,e=i.now){super(t,e),this.actions=[],this.active=!1,this.scheduled=void 0}flush(t){const{actions:e}=this;if(this.active)return void e.push(t);let n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(6),i=n(0),o=n(1);function s(t,e){return Object(i.b)((n,i)=>{let s=null,c=0,u=!1;const a=()=>u&&!s&&i.complete();n.subscribe(new o.a(i,n=>{null==s||s.unsubscribe();let u=0;const l=c++;Object(r.c)(t(n,l)).subscribe(s=new o.a(i,t=>i.next(e?e(n,t,l,u++):t),void 0,()=>{s=null,a()}))},void 0,()=>{u=!0,a()}))})}},function(t,e,n){ +/*! + * clipboard.js v2.0.6 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +var r;r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=6)}([function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(t),r.removeAllRanges(),r.addRange(i),e=r.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var r=this.e||(this.e={});return(r[t]||(r[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var r=this;function i(){r.off(t,i),e.apply(n,arguments)}return i._=e,this.on(t,i,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),r=0,i=n.length;r0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=i()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=i()(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":o(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}(),u=n(1),a=n.n(u),l=n(2),d=n.n(l),f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===f(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=d()(t,"click",(function(t){return e.onClick(t)}))}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return v("action",t)}},{key:"defaultTarget",value:function(t){var e=v("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return v("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach((function(t){n=n&&!!document.queryCommandSupported(t)})),n}}]),e}(a.a);function v(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}e.default=b}]).default},t.exports=r()},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(24),i=n(29);class o extends r.a{constructor(t=1/0,e=1/0,n=i.a){super(),this.bufferSize=t,this.windowTime=e,this.timestampProvider=n,this.buffer=[],this.infiniteTimeWindow=!0,this.infiniteTimeWindow=e===1/0,this.bufferSize=Math.max(1,t),this.windowTime=Math.max(1,e)}next(t){const{isStopped:e,buffer:n,infiniteTimeWindow:r,timestampProvider:i,windowTime:o}=this;e||(n.push(t),!r&&n.push(i.now()+o)),this.trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this.trimBuffer();const e=this._innerSubscribe(t),{infiniteTimeWindow:n,buffer:r}=this,i=r.slice();for(let e=0;e0},t.prototype.connect_=function(){r&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},t.prototype.disconnect_=function(){r&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},t.prototype.onTransitionEnd_=function(t){var e=t.propertyName,n=void 0===e?"":e;s.some((function(t){return!!~n.indexOf(t)}))&&this.refresh()},t.getInstance=function(){return this.instance_||(this.instance_=new t),this.instance_},t.instance_=null,t}(),a=function(t,e){for(var n=0,r=Object.keys(e);n0},t}(),_="undefined"!=typeof WeakMap?new WeakMap:new n,O=function t(e){if(!(this instanceof t))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=u.getInstance(),r=new g(e,n,this);_.set(this,r)};["observe","unobserve","disconnect"].forEach((function(t){O.prototype[t]=function(){var e;return(e=_.get(this))[t].apply(e,arguments)}}));var j=void 0!==i.ResizeObserver?i.ResizeObserver:O;e.a=j}).call(this,n(46))},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(5),i=n(6);function o(t){return new r.a(e=>{Object(i.c)(t()).subscribe(e)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return Object(r.b)((n,r)=>{let o=0;n.subscribe(new i.a(r,n=>t.call(e,n,o++)&&r.next(n)))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(12),i=n(0),o=n(1);function s(t){return t<=0?()=>r.a:Object(i.b)((e,n)=>{let r=0;e.subscribe(new o.a(n,e=>{++r<=t&&(n.next(e),t<=r&&n.complete())}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return t=null!=t?t:s,Object(r.b)((n,r)=>{let o,s=!0;n.subscribe(new i.a(r,n=>{(s&&(o=n,1)||!t(o,o=e?e(n):n))&&r.next(n),s=!1}))})}function s(t,e){return t===e}},function(t,e,n){"use strict";n.d(e,"a",(function(){return b})),n.d(e,"b",(function(){return p}));var r=n(5);const{isArray:i}=Array,{getPrototypeOf:o,prototype:s,keys:c}=Object;function u(t){if(1===t.length){const n=t[0];if(i(n))return{args:n,keys:null};if((e=n)&&"object"==typeof e&&o(e)===s){const t=c(n);return{args:t.map(t=>n[t]),keys:t}}}var e;return{args:t,keys:null}}var a=n(16),l=n(6),d=n(9),f=n(19),h=n(8);function b(...t){const e=Object(h.c)(t),n=Object(h.b)(t),{args:i,keys:o}=u(t),s=new r.a(p(i,e,o?t=>{const e={};for(let n=0;n{m(e,()=>{const{length:i}=t,o=new Array(i);let s=i;const c=t.map(()=>!1);let u=!0;for(let a=0;a{Object(l.a)(t[a],e).subscribe(new v(r,t=>{o[a]=t,u&&(c[a]=!0,u=!c.every(d.a)),u||r.next(n(o.slice()))},()=>0==--s))},r)}},r)}}function m(t,e,n){t?n.add(t.schedule(e)):e()}},function(t,e,n){!function(){"use strict";function t(t){var e=!0,n=!1,r=null,i={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function o(t){return!!(t&&t!==document&&"HTML"!==t.nodeName&&"BODY"!==t.nodeName&&"classList"in t&&"contains"in t.classList)}function s(t){t.classList.contains("focus-visible")||(t.classList.add("focus-visible"),t.setAttribute("data-focus-visible-added",""))}function c(t){e=!1}function u(){document.addEventListener("mousemove",a),document.addEventListener("mousedown",a),document.addEventListener("mouseup",a),document.addEventListener("pointermove",a),document.addEventListener("pointerdown",a),document.addEventListener("pointerup",a),document.addEventListener("touchmove",a),document.addEventListener("touchstart",a),document.addEventListener("touchend",a)}function a(t){t.target.nodeName&&"html"===t.target.nodeName.toLowerCase()||(e=!1,document.removeEventListener("mousemove",a),document.removeEventListener("mousedown",a),document.removeEventListener("mouseup",a),document.removeEventListener("pointermove",a),document.removeEventListener("pointerdown",a),document.removeEventListener("pointerup",a),document.removeEventListener("touchmove",a),document.removeEventListener("touchstart",a),document.removeEventListener("touchend",a))}document.addEventListener("keydown",(function(n){n.metaKey||n.altKey||n.ctrlKey||(o(t.activeElement)&&s(t.activeElement),e=!0)}),!0),document.addEventListener("mousedown",c,!0),document.addEventListener("pointerdown",c,!0),document.addEventListener("touchstart",c,!0),document.addEventListener("visibilitychange",(function(t){"hidden"===document.visibilityState&&(n&&(e=!0),u())}),!0),u(),t.addEventListener("focus",(function(t){var n,r,c;o(t.target)&&(e||(n=t.target,r=n.type,"INPUT"===(c=n.tagName)&&i[r]&&!n.readOnly||"TEXTAREA"===c&&!n.readOnly||n.isContentEditable))&&s(t.target)}),!0),t.addEventListener("blur",(function(t){var e;o(t.target)&&(t.target.classList.contains("focus-visible")||t.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(r),r=window.setTimeout((function(){n=!1}),100),(e=t.target).hasAttribute("data-focus-visible-added")&&(e.classList.remove("focus-visible"),e.removeAttribute("data-focus-visible-added")))}),!0),t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host?t.host.setAttribute("data-js-focus-visible",""):t.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if("undefined"!=typeof window&&"undefined"!=typeof document){var e;window.applyFocusVisiblePolyfill=t;try{e=new CustomEvent("focus-visible-polyfill-ready")}catch(t){(e=document.createEvent("CustomEvent")).initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(e)}"undefined"!=typeof document&&t(document)}()},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},,,,,function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(5),i=n(17),o=n(20),s=n(2),c=n(19),u=n(15);const a=["addListener","removeListener"],l=["addEventListener","removeEventListener"],d=["on","off"];function f(t,e,n,b){if(Object(s.a)(n)&&(b=n,n=void 0),b)return f(t,e,n).pipe(Object(c.a)(b));const[v,p]=function(t){return Object(s.a)(t.addEventListener)&&Object(s.a)(t.removeEventListener)}(t)?l.map(r=>i=>t[r](e,i,n)):function(t){return Object(s.a)(t.addListener)&&Object(s.a)(t.removeListener)}(t)?a.map(h(t,e)):function(t){return Object(s.a)(t.on)&&Object(s.a)(t.off)}(t)?d.map(h(t,e)):[];return!v&&Object(o.a)(t)?Object(i.a)(t=>f(t,e,n))(Object(u.a)(t)):new r.a(t=>{if(!v)throw new TypeError("Invalid event target");const e=(...e)=>t.next(1p(e)})}function h(t,e){return n=>r=>t[n](e,r)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t){return Object(r.b)((e,n)=>{e.subscribe(new i.a(n,()=>n.next(t)))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(32),i=n(15),o=n(22),s=n(6),c=n(12),u=n(8);function a(...t){const e=Object(u.c)(t),n=Object(u.a)(t,1/0);return(t=Object(o.a)(t)).length?1===t.length?Object(s.c)(t[0]):Object(r.a)(n)(Object(i.a)(t,e)):c.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(25),i=n(8),o=n(0);function s(...t){const e=Object(i.c)(t);return Object(o.b)((n,i)=>{(e?Object(r.a)(t,n,e):Object(r.a)(t,n)).subscribe(i)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(15),i=n(21),o=n(8);function s(...t){const e=Object(o.c)(t);return e?Object(i.a)(t,e):Object(r.a)(t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(5),i=n(10);const o=new r.a(i.a)},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(0);function i(t){return Object(r.b)((e,n)=>{e.subscribe(n),n.add(t)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(38),i=n(0);function o(t,e,n){let o;return o=t&&"object"==typeof t?t:{bufferSize:t,windowTime:e,refCount:!1,scheduler:n},Object(i.b)(function({bufferSize:t=1/0,windowTime:e=1/0,refCount:n,scheduler:i}){let o,s,c=0;return(u,a)=>{let l;c++,o?l=o.subscribe(a):(o=new r.a(t,e,i),l=o.subscribe(a),s=u.subscribe({next(t){o.next(t)},error(t){const e=o;s=void 0,o=void 0,e.error(t)},complete(){s=void 0,o.complete()}}),s.closed&&(s=void 0)),a.add(()=>{c--,l.unsubscribe(),n&&0===c&&s&&(s.unsubscribe(),s=void 0,o=void 0)})}}(o))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(2),i=n(0),o=n(1),s=n(9);function c(t,e,n){const c=Object(r.a)(t)||e||n?{next:t,error:e,complete:n}:t;return c?Object(i.b)((t,e)=>{t.subscribe(new o.a(e,t=>{var n;null===(n=c.next)||void 0===n||n.call(c,t),e.next(t)},t=>{var n;null===(n=c.error)||void 0===n||n.call(c,t),e.error(t)},()=>{var t;null===(t=c.complete)||void 0===t||t.call(c),e.complete()}))}):s.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(24);class i extends r.a{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){const e=super._subscribe(t);return!e.closed&&t.next(this._value),e}getValue(){const{hasError:t,thrownError:e,_value:n}=this;if(t)throw e;return this._throwIfClosed(),n}next(t){super.next(this._value=t)}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(43);function i(t,e){return Object(r.a)((n,r)=>e?e(n[t],r[t]):n[t]===r[t])}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(0),i=n(1),o=n(6);const s={leading:!0,trailing:!1};function c(t,{leading:e,trailing:n}=s){return Object(r.b)((r,s)=>{let c=!1,u=null,a=null,l=!1;const d=()=>{null==a||a.unsubscribe(),a=null,n&&(h(),l&&s.complete())},f=e=>a=Object(o.c)(t(e)).subscribe(new i.a(s,d,void 0,d)),h=()=>{c&&(s.next(u),!l&&f(u)),c=!1,u=null};r.subscribe(new i.a(s,t=>{c=!0,u=t,(!a||a.closed)&&(e?h():f(t))},void 0,()=>{l=!0,(!(n&&c&&a)||a.closed)&&s.complete()}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(36);function i(t,e){return e?Object(r.a)(()=>t,e):Object(r.a)(()=>t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e=0){return Object(r.b)((n,r)=>{n.subscribe(new i.a(r,n=>r.add(t.schedule(()=>r.next(n),e)),n=>r.add(t.schedule(()=>r.error(n),e)),()=>r.add(t.schedule(()=>r.complete(),e))))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(44),i=n(0),o=n(22),s=n(19),c=n(28),u=n(8);function a(...t){return function t(...e){const n=Object(u.b)(e);return n?Object(c.a)(t(...e),Object(s.a)(n)):Object(i.b)((t,n)=>{Object(r.b)([t,...Object(o.a)(e)])(n)})}(...t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(0),i=n(1),o=n(6),s=n(9),c=n(10),u=n(8);function a(...t){const e=Object(u.b)(t);return Object(r.b)((n,r)=>{const u=t.length,a=new Array(u);let l=t.map(()=>!1),d=!1;n.subscribe(new i.a(r,t=>{if(d){const n=[t,...a];r.next(e?e(...n):n)}}));for(let e=0;e{a[e]=t,d||l[e]||(l[e]=!0,(d=l.every(s.a))&&(l=null))},void 0,c.a))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t){return Object(r.b)((e,n)=>{let r=!1,o=null;e.subscribe(new i.a(n,t=>{r=!0,o=t}));const s=()=>{if(r){r=!1;const t=o;o=null,n.next(t)}};t.subscribe(new i.a(n,s,void 0,s))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(41);function i(t){return Object(r.a)((e,n)=>t<=n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(6),i=n(1),o=n(0);function s(t){return Object(o.b)((e,n)=>{let o,c=null,u=!1;c=e.subscribe(new i.a(n,void 0,i=>{o=Object(r.c)(t(i,s(t)(e))),c?(c.unsubscribe(),c=null,o.subscribe(n)):u=!0})),u&&(c.unsubscribe(),c=null,o.subscribe(n))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(0),i=n(1),o=n(11);function s(t,e=null){return e=null!=e?e:t,Object(r.b)((n,r)=>{let s=[],c=0;n.subscribe(new i.a(r,n=>{let i=null;c++%e==0&&s.push([]);for(const e of s)e.push(n),t<=e.length&&(i=null!=i?i:[],i.push(e));if(i)for(const t of i)Object(o.a)(s,t),r.next(t)},void 0,()=>{for(const t of s)r.next(t);r.complete()},()=>{s=null}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(17),i=n(2);function o(t,e){return Object(i.a)(e)?Object(r.a)(t,e,1):Object(r.a)(t,1)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(40),i=n(12);function o(t,e=i.a,n=i.a){return Object(r.a)(()=>t()?e:n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t=null){return Object(r.b)((e,n)=>{let r=!1;e.subscribe(new i.a(n,t=>{r=!0,n.next(t)},void 0,()=>{r||n.next(t),n.complete()}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(5),i=n(7),o=n(0),s=n(1);function c(){return Object(o.b)((t,e)=>{let n=null;t._refCount++;const r=new s.a(e,void 0,void 0,void 0,()=>{if(!t||t._refCount<=0||0<--t._refCount)return void(n=null);const r=t._connection,i=n;n=null,!r||i&&r!==i||r.unsubscribe(),e.unsubscribe()});t.subscribe(r),r.closed||(n=t.connect())})}class u extends r.a{constructor(t,e){super(),this.source=t,this.subjectFactory=e,this._subject=null,this._refCount=0,this._connection=null}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;const{_connection:t}=this;this._subject=this._connection=null,null==t||t.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new i.b;const e=this.getSubject();t.add(this.source.subscribe(new s.a(e,void 0,t=>{this._teardown(),e.error(t)},()=>{this._teardown(),e.complete()},()=>this._teardown()))),t.closed&&(this._connection=null,t=i.b.EMPTY)}return t}refCount(){return c()(this)}}var a=n(2);var l=n(24);function d(){return new l.a}function f(){return t=>c()(function(t,e){const n=Object(a.a)(t)?t:()=>t;return Object(a.a)(e)?Object(o.b)((t,r)=>{const i=n();e(i).subscribe(r).add(t.subscribe(i))}):t=>{const e=new u(t,n);return Object(o.a)(t)&&(e.lift=t.lift),e.source=t,e.subjectFactory=n,e}}(d)(t))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(33),i=n(7);const o={schedule(t){let e=requestAnimationFrame,n=cancelAnimationFrame;const{delegate:r}=o;r&&(e=r.requestAnimationFrame,n=r.cancelAnimationFrame);const s=e(e=>{n=void 0,t(e)});return new i.b(()=>null==n?void 0:n(s))},requestAnimationFrame(...t){const{delegate:e}=o;return((null==e?void 0:e.requestAnimationFrame)||requestAnimationFrame)(...t)},cancelAnimationFrame(...t){const{delegate:e}=o;return((null==e?void 0:e.cancelAnimationFrame)||cancelAnimationFrame)(...t)},delegate:void 0};class s extends r.a{constructor(t,e){super(t,e),this.scheduler=t,this.work=e}requestAsyncId(t,e,n=0){return null!==n&&n>0?super.requestAsyncId(t,e,n):(t.actions.push(this),t.scheduled||(t.scheduled=o.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,e,n=0){if(null!=n&&n>0||null==n&&this.delay>0)return super.recycleAsyncId(t,e,n);0===t.actions.length&&(o.cancelAnimationFrame(e),t.scheduled=void 0)}}var c=n(35);class u extends c.a{flush(t){this.active=!0,this.scheduled=void 0;const{actions:e}=this;let n,r=-1;t=t||e.shift();const i=e.length;do{if(n=t.execute(t.state,t.delay))break}while(++rObject(s.a)(e.pipe(Object(c.a)(1),Object(i.b)((t,e)=>{t.subscribe(new o.a(e,u.a))})),n.pipe(a(t))):Object(i.b)((e,n)=>{let r=0,i=!1,s=0;const c=()=>i&&!s&&n.complete();e.subscribe(new o.a(n,e=>{let i=!1;const u=()=>{n.next(e),null==a||a.unsubscribe(),i||(s--,i=!0,c())},a=new o.a(n,u,void 0,u);s++,t(e,r++).subscribe(a)},void 0,()=>{i=!0,c()}))})}var l=n(34);function d(t,e=r.b){const n=Object(l.a)(t,e);return a(()=>n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(0),i=n(1);function o(t,e,n,r,o){return(s,c)=>{let u=n,a=e,l=0;s.subscribe(new i.a(c,e=>{const n=l++;a=u?t(a,e,n):(u=!0,e),r&&c.next(a)},void 0,o&&(()=>{u&&c.next(a),c.complete()})))}}function s(t,e){return Object(r.b)(o(t,e,arguments.length>=2,!0))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(23),i=n(0),o=n(1),s=n(6);var c=n(34);function u(t,e=r.b){const n=Object(c.a)(t,e);return u=()=>n,Object(i.b)((t,e)=>{let n=!1,r=null,i=null;const c=()=>{if(null==i||i.unsubscribe(),i=null,n){n=!1;const t=r;r=null,e.next(t)}};t.subscribe(new o.a(e,t=>{null==i||i.unsubscribe(),n=!0,r=t,i=new o.a(e,c,void 0,c),Object(s.c)(u(t)).subscribe(i)},void 0,()=>{c(),e.complete()},()=>{r=i=null}))});var u}},function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var r=n(5),i=n(6),o=n(22),s=n(12),c=n(1),u=n(8);var a=n(0);function l(...t){return Object(a.b)((e,n)=>{(function(...t){const e=Object(u.b)(t);return(t=Object(o.a)(t)).length?new r.a(n=>{let r=t.map(()=>[]),o=t.map(()=>!1);n.add(()=>{r=o=null});for(let s=0;!n.closed&&s{if(r[s].push(t),r.every(t=>t.length)){const t=r.map(t=>t.shift());n.next(e?e(...t):t),r.some((t,e)=>!t.length&&o[e])&&n.complete()}},void 0,()=>{o[s]=!0,!r[s].length&&n.complete()}));return()=>{r=o=null}}):s.a})(e,...t).subscribe(n)})}function d(...t){return l(...t)}}]]); \ No newline at end of file diff --git a/0.3/assets/javascripts/worker/search.0f64ce30.min.js b/0.3/assets/javascripts/worker/search.0f64ce30.min.js new file mode 100644 index 00000000..99676d0b --- /dev/null +++ b/0.3/assets/javascripts/worker/search.0f64ce30.min.js @@ -0,0 +1,58 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=5)}([function(e,t,r){"use strict"; +/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var n=/["'&<>]/;e.exports=function(e){var t,r=""+e,i=n.exec(r);if(!i)return r;var s="",o=0,a=0;for(o=i.index;o0){var u=I.utils.clone(t)||{};u.position=[o,a],u.index=i.length,i.push(new I.Token(r.slice(o,s),u))}o=s+1}}return i},I.tokenizer.separator=/[\s\-]+/ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var r=I.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},I.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=i),s!=e);)n=r-t,i=t+Math.floor(n/2),s=this.elements[2*i];return s==e||s>e?2*i:sa?l+=2:o==a&&(t+=r[u+1]*n[l+1],u+=2,l+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var s,o=i.str.charAt(0);o in i.node.edges?s=i.node.edges[o]:(s=new I.TokenSet,i.node.edges[o]=s),1==i.str.length&&(s.final=!0),n.push({node:s,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(0!=i.editsRemaining){if("*"in i.node.edges)var a=i.node.edges["*"];else{a=new I.TokenSet;i.node.edges["*"]=a}if(0==i.str.length&&(a.final=!0),n.push({node:a,editsRemaining:i.editsRemaining-1,str:i.str}),i.str.length>1&&n.push({node:i.node,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)}),1==i.str.length&&(i.node.final=!0),i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{u=new I.TokenSet;i.node.edges["*"]=u}1==i.str.length&&(u.final=!0),n.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.str.length>1){var l,c=i.str.charAt(0),h=i.str.charAt(1);h in i.node.edges?l=i.node.edges[h]:(l=new I.TokenSet,i.node.edges[h]=l),1==i.str.length&&(l.final=!0),n.push({node:l,editsRemaining:i.editsRemaining-1,str:c+i.str.slice(2)})}}}return r},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,r=t,n=0,i=e.length;n=e;t--){var r=this.uncheckedNodes[t],n=r.child.toString();n in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[n]:(r.child._str=n,this.minimizedNodes[n]=r.child),this.uncheckedNodes.pop()}} +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */,I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),r=Object.create(null),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var r=e[this._ref],n=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var i=0;i=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new I.QueryParseError(r,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(r,t.start,t.end)}var n=e.peekLexeme();if(null==n){r="expecting term or field, found nothing";throw new I.QueryParseError(r,t.start,t.end)}switch(n.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:r="expecting term or field, found '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),n="unrecognised field '"+t.str+"', possible fields: "+r;throw new I.QueryParseError(n,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(null==i){n="expecting term, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(i.type){case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term, found '"+i.type+"'";throw new I.QueryParseError(n,i.start,i.end)}}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var n="edit distance must be numeric";throw new I.QueryParseError(n,t.start,t.end)}e.currentClause.editDistance=r;var i=e.peekLexeme();if(null!=i)switch(i.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:n="Unexpected lexeme type '"+i.type+"'";throw new I.QueryParseError(n,i.start,i.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var n="boost must be numeric";throw new I.QueryParseError(n,t.start,t.end)}e.currentClause.boost=r;var i=e.peekLexeme();if(null!=i)switch(i.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:n="Unexpected lexeme type '"+i.type+"'";throw new I.QueryParseError(n,i.start,i.end)}else e.nextClause()}},void 0===(i="function"==typeof(n=function(){return I})?n.call(t,r,t,e):n)||(e.exports=i)}()},function(e,t,r){"use strict";(function(t){e.exports=function(){if("object"==typeof globalThis)return globalThis;var e;try{e=this||new Function("return this")()}catch(e){if("object"==typeof window)return window;if("object"==typeof self)return self;if(void 0!==t)return t}return e}()}).call(this,r(4))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";r.r(t),r.d(t,"handler",(function(){return u}));function n(e,t,r,n){return new(r||(r=Promise))((function(i,s){function o(e){try{u(n.next(e))}catch(e){s(e)}}function a(e){try{u(n.throw(e))}catch(e){s(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,a)}u((n=n.apply(e,t||[])).next())}))}Object.create;Object.create;r(1);var i,s=r(0);class o{constructor({config:e,docs:t,index:r,options:n}){this.options=n,this.documents=function(e){const t=new Map,r=new Set;for(const n of e){const[e,i]=n.location.split("#"),o=n.location,a=n.title,u=s(n.text).replace(/\s+(?=[,.:;!?])/g,"").replace(/\s+/g," ");if(i){const i=t.get(e);r.has(i)?t.set(o,{location:o,title:a,text:u,parent:i}):(i.title=n.title,i.text=u,r.add(i))}else t.set(o,{location:o,title:a,text:u})}return t}(t),this.highlight=function(e){const t=new RegExp(e.separator,"img"),r=(e,t,r)=>`${t}${r}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();const i=new RegExp(`(^|${e.separator})(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(t,"|")})`,"img");return e=>e.replace(i,r).replace(/<\/mark>(\s+)]*>/gim,"$1")}}(e),lunr.tokenizer.separator=new RegExp(e.separator),this.index=void 0===r?lunr((function(){1===e.lang.length&&"en"!==e.lang[0]?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang));const r=function(e,t){const[r,n]=[new Set(e),new Set(t)];return[...new Set([...r].filter(e=>!n.has(e)))]}(["trimmer","stopWordFilter","stemmer"],n.pipeline);for(const t of e.lang.map(e=>"en"===e?lunr:lunr[e]))for(const e of r)this.pipeline.remove(t[e]),this.searchPipeline.remove(t[e]);this.field("title",{boost:1e3}),this.field("text"),this.ref("location");for(const e of t)this.add(e)})):lunr.Index.load(r)}search(e){if(e)try{const t=this.highlight(e),r=function(e){const t=new lunr.Query(["title","text"]);return new lunr.QueryParser(e,t).parse(),t.clauses}(e).filter(e=>e.presence!==lunr.Query.presence.PROHIBITED),n=this.index.search(e+"*").reduce((e,{ref:n,score:i,matchData:s})=>{const o=this.documents.get(n);if(void 0!==o){const{location:n,title:a,text:u,parent:l}=o,c=function(e,t){const r=new Set(e),n={};for(let e=0;ee);e.push({location:n,title:t(a),text:t(u),score:i*(1+h),terms:c})}return e},[]).sort((e,t)=>t.score-e.score).reduce((e,t)=>{const r=this.documents.get(t.location);if(void 0!==r){const n="parent"in r?r.parent.location:r.location;e.set(n,[...e.get(n)||[],t])}return e},new Map);let i;if(this.options.suggestions){const e=this.index.query(e=>{for(const t of r)e.term(t.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});i=e.length?Object.keys(e[0].matchData.metadata):[]}return Object.assign({items:[...n.values()]},void 0!==i&&{suggestions:i})}catch(t){console.warn(`Invalid query: ${e} – see https://bit.ly/2s3ChXG`)}return{items:[]}}}let a;function u(e){return n(this,void 0,void 0,(function*(){switch(e.type){case i.SETUP:return yield function(e){return n(this,void 0,void 0,(function*(){let t="../lunr";if("undefined"!=typeof parent&&"IFrameWorker"in parent){const e=document.querySelector("script[src]"),[r]=e.src.split("/worker");t=t.replace("..",r)}const r=[];for(const n of e.lang)"ja"===n&&r.push(t+"/tinyseg.min.js"),"en"!==n&&r.push(`${t}/min/lunr.${n}.min.js`);e.lang.length>1&&r.push(t+"/min/lunr.multi.min.js"),r.length&&(yield importScripts(t+"/min/lunr.stemmer.support.min.js",...r))}))}(e.data.config),a=new o(e.data),{type:i.READY};case i.QUERY:return{type:i.RESULT,data:a?a.search(e.data):{items:[]}};default:throw new TypeError("Invalid message type")}}))}!function(e){e[e.SETUP=0]="SETUP",e[e.READY=1]="READY",e[e.QUERY=2]="QUERY",e[e.RESULT=3]="RESULT"}(i||(i={})),addEventListener("message",e=>n(void 0,void 0,void 0,(function*(){postMessage(yield u(e.data))})))}]); \ No newline at end of file diff --git a/0.3/assets/stylesheets/main.9526ea36.min.css b/0.3/assets/stylesheets/main.9526ea36.min.css new file mode 100644 index 00000000..f1ba1793 --- /dev/null +++ b/0.3/assets/stylesheets/main.9526ea36.min.css @@ -0,0 +1 @@ +html{box-sizing:border-box;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}*,*::before,*::after{box-sizing:inherit}body{margin:0}a,button,label,input{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{display:block;box-sizing:content-box;height:.05rem;padding:0;overflow:visible;border:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{margin:0;padding:0;font-size:inherit;background:transparent;border:0}input{border:0;outline:none}:root{--md-default-fg-color: hsla(0, 0%, 0%, 0.87);--md-default-fg-color--light: hsla(0, 0%, 0%, 0.54);--md-default-fg-color--lighter: hsla(0, 0%, 0%, 0.32);--md-default-fg-color--lightest: hsla(0, 0%, 0%, 0.07);--md-default-bg-color: hsla(0, 0%, 100%, 1);--md-default-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-default-bg-color--lighter: hsla(0, 0%, 100%, 0.3);--md-default-bg-color--lightest: hsla(0, 0%, 100%, 0.12);--md-primary-fg-color: hsla(231, 48%, 48%, 1);--md-primary-fg-color--light: hsla(231, 44%, 56%, 1);--md-primary-fg-color--dark: hsla(232, 54%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-accent-fg-color: hsla(231, 99%, 66%, 1);--md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}:root>*{--md-code-fg-color: hsla(200, 18%, 26%, 1);--md-code-bg-color: hsla(0, 0%, 96%, 1);--md-code-hl-color: hsla(60, 100%, 50%, 0.5);--md-code-hl-number-color: hsla(0, 67%, 50%, 1);--md-code-hl-special-color: hsla(340, 83%, 47%, 1);--md-code-hl-function-color: hsla(291, 45%, 50%, 1);--md-code-hl-constant-color: hsla(250, 63%, 60%, 1);--md-code-hl-keyword-color: hsla(219, 54%, 51%, 1);--md-code-hl-string-color: hsla(150, 63%, 30%, 1);--md-code-hl-name-color: var(--md-code-fg-color);--md-code-hl-operator-color: var(--md-default-fg-color--light);--md-code-hl-punctuation-color: var(--md-default-fg-color--light);--md-code-hl-comment-color: var(--md-default-fg-color--light);--md-code-hl-generic-color: var(--md-default-fg-color--light);--md-code-hl-variable-color: var(--md-default-fg-color--light);--md-typeset-color: var(--md-default-fg-color);--md-typeset-a-color: var(--md-primary-fg-color);--md-typeset-mark-color: hsla(60, 100%, 50%, 0.5);--md-typeset-del-color: hsla(6, 90%, 60%, 0.15);--md-typeset-ins-color: hsla(150, 90%, 44%, 0.15);--md-typeset-kbd-color: hsla(0, 0%, 98%, 1);--md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);--md-typeset-kbd-border-color: hsla(0, 0%, 72%, 1);--md-admonition-fg-color: var(--md-default-fg-color);--md-admonition-bg-color: var(--md-default-bg-color);--md-footer-fg-color: hsla(0, 0%, 100%, 1);--md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7);--md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3);--md-footer-bg-color: hsla(0, 0%, 0%, 0.87);--md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32)}.md-icon svg{display:block;width:1.2rem;height:1.2rem;fill:currentColor}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:var(--md-typeset-color);font-feature-settings:"kern","liga";font-family:-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,pre,kbd{color:var(--md-typeset-color);font-feature-settings:"kern";font-family:SFMono-Regular,Consolas,Menlo,monospace}:root{--md-typeset-table--ascending: url("data:image/svg+xml;charset=utf-8,");--md-typeset-table--descending: url("data:image/svg+xml;charset=utf-8,")}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact;color-adjust:exact}@media print{.md-typeset{font-size:.68rem}}.md-typeset p,.md-typeset ul,.md-typeset ol,.md-typeset dl,.md-typeset blockquote{display:flow-root;margin:1em 0}.md-typeset h1{display:flow-root;margin:0 0 1.25em;color:var(--md-default-fg-color--light);font-weight:300;font-size:2em;line-height:1.3;letter-spacing:-0.01em}.md-typeset h2{display:flow-root;margin:1.6em 0 .64em;font-weight:300;font-size:1.5625em;line-height:1.4;letter-spacing:-0.01em}.md-typeset h3{display:flow-root;margin:1.6em 0 .8em;font-weight:400;font-size:1.25em;line-height:1.5;letter-spacing:-0.01em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{display:flow-root;margin:1em 0;font-weight:700;letter-spacing:-0.01em}.md-typeset h5,.md-typeset h6{display:flow-root;margin:1.25em 0;color:var(--md-default-fg-color--light);font-weight:700;font-size:.8em;letter-spacing:-0.01em}.md-typeset h5{text-transform:uppercase}.md-typeset hr{display:flow-root;margin:1.5em 0;border-bottom:.05rem solid var(--md-default-fg-color--lighter)}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a::before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset code,.md-typeset pre,.md-typeset kbd{color:var(--md-code-fg-color);direction:ltr}@media print{.md-typeset code,.md-typeset pre,.md-typeset kbd{white-space:pre-wrap}}.md-typeset code{padding:0 .2941176471em;font-size:.85em;word-break:break-word;background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset code:not(.focus-visible){outline:none;-webkit-tap-highlight-color:transparent}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:initial;padding:initial;background-color:transparent;box-shadow:none}.md-typeset a>code{color:currentColor}.md-typeset pre{position:relative;display:flow-root;margin:1em 0;line-height:1.4}.md-typeset pre>code{display:block;margin:0;padding:.7720588235em 1.1764705882em;overflow:auto;word-break:normal;box-shadow:none;-webkit-box-decoration-break:slice;box-decoration-break:slice;touch-action:auto;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width: 44.9375em){.md-typeset>pre{margin:1em -0.8rem}.md-typeset>pre code{border-radius:0}}.md-typeset kbd{display:inline-block;padding:0 .6666666667em;color:var(--md-default-fg-color);font-size:.75em;vertical-align:text-top;word-break:break-word;background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -0.1rem .2rem var(--md-typeset-kbd-accent-color) inset}.md-typeset mark{color:inherit;word-break:break-word;background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{text-decoration:none;border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help}@media(hover: none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:focus::after,.md-typeset abbr[title]:hover::after{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:absolute;left:0;display:inline-block;width:auto;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;max-width:80%;margin-top:2em;padding:.2rem .3rem;color:var(--md-default-bg-color);font-size:.7rem;background-color:var(--md-default-fg-color);border-radius:.1rem;content:attr(title)}}.md-typeset small{opacity:.75}.md-typeset sup,.md-typeset sub{margin-left:.078125em}[dir=rtl] .md-typeset sup,[dir=rtl] .md-typeset sub{margin-right:.078125em;margin-left:initial}.md-typeset blockquote{padding-left:.6rem;color:var(--md-default-fg-color--light);border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:initial;border-right:.2rem solid var(--md-default-fg-color--lighter);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ul,.md-typeset ol{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ul,[dir=rtl] .md-typeset ol{margin-right:.625em;margin-left:initial}.md-typeset ul ol,.md-typeset ol ol{list-style-type:lower-alpha}.md-typeset ul ol ol,.md-typeset ol ol ol{list-style-type:lower-roman}.md-typeset ul li,.md-typeset ol li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ul li,[dir=rtl] .md-typeset ol li{margin-right:1.25em;margin-left:initial}.md-typeset ul li p,.md-typeset ul li blockquote,.md-typeset ol li p,.md-typeset ol li blockquote{margin:.5em 0}.md-typeset ul li:last-child,.md-typeset ol li:last-child{margin-bottom:0}.md-typeset ul li ul,.md-typeset ul li ol,.md-typeset ol li ul,.md-typeset ol li ol{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ul li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ol li ol{margin-right:.625em;margin-left:initial}.md-typeset dd{margin:1em 0 1.5em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:initial}.md-typeset img,.md-typeset svg{max-width:100%;height:auto}.md-typeset img[align=left],.md-typeset svg[align=left]{margin:1em;margin-left:0}.md-typeset img[align=right],.md-typeset svg[align=right]{margin:1em;margin-right:0}.md-typeset img[align]:only-child,.md-typeset svg[align]:only-child{margin-top:0}.md-typeset figure{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;margin:0 auto;text-align:center}.md-typeset figcaption{max-width:24rem;margin:.5em auto 2em;font-style:italic}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){display:inline-block;max-width:100%;overflow:auto;font-size:.64rem;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1);touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) th>*:first-child,.md-typeset table:not([class]) td>*:first-child{margin-top:0}.md-typeset table:not([class]) th>*:last-child,.md-typeset table:not([class]) td>*:last-child{margin-bottom:0}.md-typeset table:not([class]) th:not([align]),.md-typeset table:not([class]) td:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) th:not([align]),[dir=rtl] .md-typeset table:not([class]) td:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.9375em 1.25em;color:var(--md-default-bg-color);vertical-align:top;background-color:var(--md-default-fg-color--light)}.md-typeset table:not([class]) th a{color:inherit}.md-typeset table:not([class]) td{padding:.9375em 1.25em;vertical-align:top;border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-typeset table:not([class]) tr{transition:background-color 125ms}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}.md-typeset table th[role=columnheader]::after{display:inline-block;width:1.2em;height:1.2em;margin-left:.5em;vertical-align:sub;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset table th[role=columnheader][aria-sort=ascending]::after{background-color:currentColor;-webkit-mask-image:var(--md-typeset-table--ascending);mask-image:var(--md-typeset-table--ascending)}.md-typeset table th[role=columnheader][aria-sort=descending]::after{background-color:currentColor;-webkit-mask-image:var(--md-typeset-table--descending);mask-image:var(--md-typeset-table--descending)}.md-typeset__scrollwrap{margin:1em -0.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{height:100%;font-size:125%}@media screen and (min-width: 100em){html{font-size:137.5%}}@media screen and (min-width: 125em){html{font-size:150%}}body{position:relative;display:flex;flex-direction:column;width:100%;min-height:100%;font-size:.5rem;background-color:var(--md-default-bg-color)}@media print{body{display:block}}@media screen and (max-width: 59.9375em){body[data-md-state=lock]{position:fixed}}.md-grid{max-width:61rem;margin-right:auto;margin-left:auto}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.md-toggle{display:none}.md-skip{position:fixed;z-index:-1;margin:.5rem;padding:.3rem .5rem;color:var(--md-default-bg-color);font-size:.64rem;background-color:var(--md-default-fg-color);border-radius:.1rem;transform:translateY(0.4rem);opacity:0}.md-skip:focus{z-index:10;transform:translateY(0);opacity:1;transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),opacity 175ms 75ms}@page{margin:25mm}.md-announce{overflow:auto;background-color:var(--md-footer-bg-color)}@media print{.md-announce{display:none}}.md-announce__inner{margin:.6rem auto;padding:0 .8rem;color:var(--md-footer-fg-color);font-size:.7rem}.md-typeset .md-button{display:inline-block;padding:.625em 2em;color:var(--md-primary-fg-color);font-weight:700;border:.1rem solid currentColor;border-radius:.1rem;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{color:var(--md-accent-bg-color);background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color)}:root{--md-clipboard-icon: url("data:image/svg+xml;charset=utf-8,")}.md-clipboard{position:absolute;top:.5em;right:.5em;z-index:1;width:1.5em;height:1.5em;color:var(--md-default-fg-color--lightest);border-radius:.1rem;cursor:pointer;transition:color 250ms}@media print{.md-clipboard{display:none}}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard::after{display:block;width:1.125em;height:1.125em;margin:0 auto;background-color:currentColor;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-content{flex-grow:1;overflow:auto;scroll-padding-top:51.2rem}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width: 76.25em){.md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem;margin-left:.8rem}.md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-right:.8rem;margin-left:1.2rem}}.md-content__inner::before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__button{float:right;margin:.4rem 0;margin-left:.4rem;padding:0}@media print{.md-content__button{display:none}}[dir=rtl] .md-content__button{float:left;margin-right:.4rem;margin-left:initial}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}.md-dialog{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;right:.8rem;bottom:.8rem;left:initial;z-index:2;display:block;min-width:11.1rem;padding:.4rem .6rem;color:var(--md-default-bg-color);font-size:.7rem;background-color:var(--md-default-fg-color);border:none;border-radius:.1rem;transform:translateY(100%);opacity:0;transition:transform 0ms 400ms,opacity 400ms}@media print{.md-dialog{display:none}}[dir=rtl] .md-dialog{right:initial;left:.8rem}.md-dialog[data-md-state=open]{transform:translateY(0);opacity:1;transition:transform 400ms cubic-bezier(0.075, 0.85, 0.175, 1),opacity 400ms}.md-header{position:-webkit-sticky;position:sticky;top:0;right:0;left:0;z-index:2;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem rgba(0,0,0,0),0 .2rem .4rem rgba(0,0,0,0);transition:color 250ms,background-color 250ms}@media print{.md-header{display:none}}.md-header[data-md-state=shadow]{box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);transition:transform 250ms cubic-bezier(0.1, 0.7, 0.1, 1),color 250ms,background-color 250ms,box-shadow 250ms}.md-header[data-md-state=hidden]{transform:translateY(-100%);transition:transform 250ms cubic-bezier(0.8, 0, 0.6, 1),color 250ms,background-color 250ms,box-shadow 250ms}.md-header-nav{display:flex;align-items:center;padding:0 .2rem}.md-header-nav__button{position:relative;z-index:1;display:inline-block;margin:.2rem;padding:.4rem;color:currentColor;vertical-align:middle;cursor:pointer;transition:opacity 250ms}.md-header-nav__button:focus,.md-header-nav__button:hover{opacity:.7}.md-header-nav__button:not(.focus-visible){outline:none}.md-header-nav__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width: 76.1875em){.md-header-nav__button.md-logo{display:none}}.md-header-nav__button.md-logo img,.md-header-nav__button.md-logo svg{display:block;width:1.2rem;height:1.2rem;fill:currentColor}@media screen and (min-width: 60em){.md-header-nav__button[for=__search]{display:none}}.no-js .md-header-nav__button[for=__search]{display:none}[dir=rtl] .md-header-nav__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width: 76.25em){.md-header-nav__button[for=__drawer]{display:none}}.md-header-nav__topic{position:absolute;display:flex;max-width:100%;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms}.md-header-nav__topic+.md-header-nav__topic{z-index:-1;transform:translateX(1.25rem);opacity:0;transition:transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1),opacity 150ms;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{transform:translateX(-1.25rem)}.md-header-nav__title{flex-grow:1;height:2.4rem;margin-right:.4rem;margin-left:1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{z-index:-1;transform:translateX(-1.25rem);opacity:0;transition:transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1),opacity 150ms;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{z-index:0;transform:translateX(0);opacity:1;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms;pointer-events:initial}.md-header-nav__title>.md-header-nav__ellipsis{position:relative;width:100%;height:100%}.md-header-nav__options{display:flex;flex-shrink:0;max-width:100%;white-space:nowrap;transition:max-width 0ms 250ms,opacity 250ms 250ms}.md-header-nav__options>[data-md-state=hidden]{display:none}[data-md-toggle=search]:checked~.md-header .md-header-nav__options{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header-nav__source{display:none}@media screen and (min-width: 60em){.md-header-nav__source{display:block;width:11.7rem;max-width:11.7rem;margin-left:1rem}[dir=rtl] .md-header-nav__source{margin-right:1rem;margin-left:initial}}@media screen and (min-width: 76.25em){.md-header-nav__source{margin-left:1.4rem}[dir=rtl] .md-header-nav__source{margin-right:1.4rem}}.md-footer{color:var(--md-footer-fg-color);background-color:var(--md-footer-bg-color)}@media print{.md-footer{display:none}}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{display:flex;padding-top:1.4rem;padding-bottom:.4rem;transition:opacity 250ms}@media screen and (min-width: 45em){.md-footer-nav__link{width:50%}}.md-footer-nav__link:focus,.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{float:left}@media screen and (max-width: 44.9375em){.md-footer-nav__link--prev{width:25%}.md-footer-nav__link--prev .md-footer-nav__title{display:none}}[dir=rtl] .md-footer-nav__link--prev{float:right}[dir=rtl] .md-footer-nav__link--prev svg{transform:scaleX(-1)}.md-footer-nav__link--next{float:right;text-align:right}@media screen and (max-width: 44.9375em){.md-footer-nav__link--next{width:75%}}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}[dir=rtl] .md-footer-nav__link--next svg{transform:scaleX(-1)}.md-footer-nav__title{position:relative;flex-grow:1;max-width:calc(100% - 2.4rem);padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__button{margin:.2rem;padding:.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-footer-copyright{width:100%;margin:auto .6rem;padding:.4rem 0;color:var(--md-footer-fg-color--lighter);font-size:.64rem}@media screen and (min-width: 45em){.md-footer-copyright{width:auto}}.md-footer-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width: 45em){.md-footer-social{padding:.6rem 0}}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;text-align:center}.md-footer-social__link::before{line-height:1.9}.md-footer-social__link svg{max-height:.8rem;vertical-align:-25%;fill:currentColor}:root{--md-nav-icon--prev: url("data:image/svg+xml;charset=utf-8,");--md-nav-icon--next: url("data:image/svg+xml;charset=utf-8,");--md-toc-icon: url("data:image/svg+xml;charset=utf-8,")}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;overflow:hidden;font-weight:700;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{width:auto;height:100%}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{display:block;width:2.4rem;height:2.4rem;fill:currentColor}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__link{display:block;margin-top:.625em;overflow:hidden;text-overflow:ellipsis;cursor:pointer;transition:color 125ms;scroll-snap-align:start}.md-nav__link[data-md-state=blur]{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon::after{display:block;width:100%;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);background-color:currentColor}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__source{display:none}@media screen and (max-width: 76.1875em){.md-nav--primary,.md-nav--primary .md-nav{position:absolute;top:0;right:0;left:0;z-index:1;display:flex;flex-direction:column;height:100%;background-color:var(--md-default-bg-color)}.md-nav--primary .md-nav__title,.md-nav--primary .md-nav__item{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;color:var(--md-default-fg-color--light);font-weight:400;line-height:2.4rem;white-space:nowrap;background-color:var(--md-default-fg-color--lightest);cursor:pointer}.md-nav--primary .md-nav__title .md-nav__icon{position:absolute;top:.4rem;left:.4rem;display:block;width:1.2rem;height:1.2rem;margin:.2rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem;left:initial}.md-nav--primary .md-nav__title .md-nav__icon::after{display:block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-nav--primary .md-nav__title~.md-nav__list{overflow-y:auto;background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color)}.md-nav--primary .md-nav__title .md-logo{position:absolute;top:.2rem;left:.2rem;display:block;margin:.2rem;padding:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-logo{right:.2rem;left:initial}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link .md-nav__icon{position:absolute;top:50%;right:.6rem;width:1.2rem;height:1.2rem;margin-top:-0.6rem;color:inherit;font-size:1.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{right:initial;left:.6rem}.md-nav--primary .md-nav__link .md-nav__icon::after{display:block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-nav--primary .md-nav__icon::after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:initial}.md-nav--secondary{background-color:transparent}.md-nav__toggle~.md-nav{display:flex;transform:translateX(100%);opacity:0;transition:transform 250ms cubic-bezier(0.8, 0, 0.6, 1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{transform:translateX(0);opacity:1;transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width: 59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__link[for=__toc]{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__link[for=__toc] .md-icon::after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{display:block;padding:0 .2rem;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color--dark)}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:block;padding-right:2.4rem;scroll-snap-align:initial}[dir=rtl] .md-nav--integrated .md-nav__link[for=__toc]{padding-right:.8rem;padding-left:2.4rem}.md-nav--integrated .md-nav__link[for=__toc] .md-icon::after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width: 60em){.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width: 76.25em){.md-nav{transition:max-height 250ms cubic-bezier(0.86, 0, 0.07, 1)}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__title{display:block;padding:0;pointer-events:none;scroll-snap-align:start}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{float:right;width:.9rem;height:.9rem;transition:transform 250ms}[dir=rtl] .md-nav__icon{float:left;transform:rotate(180deg)}.md-nav__icon::after{display:inline-block;width:100%;height:100%;vertical-align:-0.1rem;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav>.md-nav__title{display:block;padding:0 .6rem;pointer-events:none;scroll-snap-align:start}.md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav__item{padding-right:.6rem}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:block;margin-bottom:1.25em;border-left:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav>.md-nav__title{display:none}}:root{--md-search-result-icon: url("data:image/svg+xml;charset=utf-8,")}.md-search{position:relative}@media screen and (min-width: 60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{z-index:1;opacity:0}@media screen and (max-width: 59.9375em){.md-search__overlay{position:absolute;top:.2rem;left:-2.2rem;width:2rem;height:2rem;overflow:hidden;background-color:var(--md-default-bg-color);border-radius:1rem;transform-origin:center;transition:transform 300ms 100ms,opacity 200ms 200ms;pointer-events:none}[dir=rtl] .md-search__overlay{right:-2.2rem;left:initial}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform 400ms,opacity 100ms}}@media screen and (min-width: 60em){.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;background-color:rgba(0,0,0,.54);cursor:pointer;transition:width 0ms 250ms,height 0ms 250ms,opacity 250ms}[dir=rtl] .md-search__overlay{right:0;left:initial}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;opacity:1;transition:width 0ms,height 0ms,opacity 250ms}}@media screen and (max-width: 29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width: 30em)and (max-width: 44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width: 45em)and (max-width: 59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width: 59.9375em){.md-search__inner{position:fixed;top:0;left:100%;z-index:2;width:100%;height:100%;transform:translateX(5%);opacity:0;transition:right 0ms 300ms,left 0ms 300ms,transform 150ms 150ms cubic-bezier(0.4, 0, 0.2, 1),opacity 150ms 150ms}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;transform:translateX(0);opacity:1;transition:right 0ms 0ms,left 0ms 0ms,transform 150ms 150ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms 150ms}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:initial}html [dir=rtl] .md-search__inner{right:100%;left:initial;transform:translateX(-5%)}}@media screen and (min-width: 60em){.md-search__inner{position:relative;float:right;width:11.7rem;padding:.1rem 0;transition:width 250ms cubic-bezier(0.1, 0.7, 0.1, 1)}[dir=rtl] .md-search__inner{float:left}}@media screen and (min-width: 60em)and (max-width: 76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width: 76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{position:relative;z-index:2;height:2.4rem;background-color:var(--md-default-bg-color);transition:color 250ms,background-color 250ms}@media screen and (min-width: 60em){.md-search__form{height:1.8rem;background-color:rgba(0,0,0,.26);border-radius:.1rem}.md-search__form:hover{background-color:rgba(255,255,255,.12)}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0}.md-search__input{position:relative;z-index:2;width:100%;height:100%;padding:0 2.2rem 0 3.6rem;font-size:.9rem;text-overflow:ellipsis;background:transparent}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{-webkit-transition:color 250ms;transition:color 250ms}.md-search__input::-moz-placeholder{-moz-transition:color 250ms;transition:color 250ms}.md-search__input::-ms-input-placeholder{-ms-transition:color 250ms;transition:color 250ms}.md-search__input::placeholder{transition:color 250ms}.md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input~.md-search__icon,.md-search__input::placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (min-width: 60em){.md-search__input{padding-left:2.2rem;color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input::-webkit-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{color:var(--md-default-fg-color);text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__suggest{position:absolute;top:0;display:flex;align-items:center;width:100%;height:100%;padding:0 2.2rem 0 3.6rem;color:var(--md-default-fg-color--lighter);font-size:.9rem;white-space:nowrap;opacity:0;transition:opacity 50ms}[dir=rtl] .md-search__suggest{padding:0 3.6rem 0 2.2rem}@media screen and (min-width: 60em){.md-search__suggest{padding-left:2.2rem;font-size:.8rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity 300ms 100ms}.md-search__icon{position:absolute;z-index:2;width:1.2rem;height:1.2rem;cursor:pointer;transition:color 250ms,opacity 250ms}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:initial}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width: 59.9375em){.md-search__icon[for=__search]{top:.6rem;left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem;left:initial}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width: 60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}.md-search__icon[type=reset]{top:.3rem;right:.5rem;transform:scale(0.75);opacity:0;transition:transform 150ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms;pointer-events:none}[dir=rtl] .md-search__icon[type=reset]{right:initial;left:.5rem}@media screen and (max-width: 59.9375em){.md-search__icon[type=reset]{top:.6rem;right:.8rem}[dir=rtl] .md-search__icon[type=reset]{right:initial;left:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{transform:scale(1);opacity:1;pointer-events:initial}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;z-index:1;width:100%;overflow:hidden;border-radius:0 0 .1rem .1rem}@media screen and (max-width: 59.9375em){.md-search__output{top:2.4rem;bottom:0}}@media screen and (min-width: 60em){.md-search__output{top:1.9rem;opacity:0;transition:opacity 400ms}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}}.md-search__scrollwrap{height:100%;overflow-y:auto;background-color:var(--md-default-bg-color);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}@media(-webkit-max-device-pixel-ratio: 1), (max-resolution: 1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width: 76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width: 60em){.md-search__scrollwrap{max-height:0;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{padding:0 .8rem;color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;background-color:var(--md-default-fg-color--lightest);scroll-snap-align:start}@media screen and (min-width: 60em){.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:initial}}.md-search-result__list{margin:0;padding:0;list-style:none}.md-search-result__item{box-shadow:0 -0.05rem 0 var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;transition:background-color 250ms;scroll-snap-align:start}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{display:block;padding:.75em .8rem;color:var(--md-typeset-a-color);font-size:.64rem;outline:0;cursor:pointer;transition:color 250ms,background-color 250ms;scroll-snap-align:start}@media screen and (min-width: 60em){.md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem;padding-left:.8rem}}.md-search-result__more summary:focus,.md-search-result__more summary:hover{color:var(--md-accent-fg-color);background-color:var(--md-accent-fg-color--transparent)}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{position:relative;padding:0 .8rem;overflow:hidden}@media screen and (min-width: 60em){.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-weight:400;font-size:.8rem;line-height:1.4}.md-search-result__icon{position:absolute;left:0;width:1.2rem;height:1.2rem;margin:.5rem;color:var(--md-default-fg-color--light)}@media screen and (max-width: 59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon::after{display:inline-block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-search-result__icon{right:0;left:initial}[dir=rtl] .md-search-result__icon::after{transform:scaleX(-1)}.md-search-result__title{margin:.5em 0;font-weight:700;font-size:.64rem;line-height:1.6}.md-search-result__teaser{display:-webkit-box;max-height:2rem;margin:.5em 0;overflow:hidden;color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}@media screen and (max-width: 44.9375em){.md-search-result__teaser{max-height:3rem;-webkit-line-clamp:3}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-search-result__teaser{max-height:3rem;-webkit-line-clamp:3}}.md-search-result__teaser mark{text-decoration:underline;background-color:transparent}.md-search-result__terms{margin:.5em 0;font-size:.64rem;font-style:italic}.md-search-result mark{color:var(--md-accent-fg-color);background-color:transparent}.md-select{position:relative;z-index:1}.md-select__inner{position:absolute;top:calc(100% - 0.2rem);left:50%;max-height:0;margin-top:.2rem;color:var(--md-default-fg-color);background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.1),0 0 .05rem rgba(0,0,0,.25);transform:translate3d(-50%, 0.3rem, 0);opacity:0;transition:transform 250ms 375ms,opacity 250ms 250ms,max-height 0ms 500ms}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;transform:translate3d(-50%, 0, 0);opacity:1;transition:transform 250ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 250ms,max-height 250ms}.md-select__inner::after{position:absolute;top:0;left:50%;width:0;height:0;margin-top:-0.2rem;margin-left:-0.2rem;border:.2rem solid transparent;border-top:0;border-bottom-color:var(--md-default-bg-color);content:""}.md-select__list{max-height:inherit;margin:0;padding:0;overflow:auto;font-size:.8rem;list-style-type:none;border-radius:.1rem}.md-select__item{line-height:1.8rem}.md-select__link{display:block;width:100%;padding-right:1.2rem;padding-left:.6rem;cursor:pointer;transition:background-color 250ms,color 250ms;scroll-snap-align:start}[dir=rtl] .md-select__link{padding-right:.6rem;padding-left:1.2rem}.md-select__link:focus,.md-select__link:hover{background-color:var(--md-default-fg-color--lightest)}@-webkit-keyframes md-sidebar__scrollwrap--hack{0%,99%{-webkit-scroll-snap-type:none;scroll-snap-type:none}100%{-webkit-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}}@keyframes md-sidebar__scrollwrap--hack{0%,99%{-webkit-scroll-snap-type:none;-ms-scroll-snap-type:none;scroll-snap-type:none}100%{-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}}.md-sidebar{position:-webkit-sticky;position:sticky;top:2.4rem;flex-shrink:0;align-self:flex-start;width:12.1rem;height:0;padding:1.2rem 0}@media print{.md-sidebar{display:none}}@media screen and (max-width: 76.1875em){.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;z-index:3;display:block;width:12.1rem;height:100%;background-color:var(--md-default-bg-color);transform:translateX(0);transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 250ms}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:initial}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{position:absolute;top:0;right:0;bottom:0;left:0;margin:0;-webkit-scroll-snap-type:none;-ms-scroll-snap-type:none;scroll-snap-type:none;overflow:hidden}}@media screen and (min-width: 76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width: 60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}.js .md-sidebar__scrollwrap{-webkit-animation:md-sidebar__scrollwrap--hack 1000ms forwards;animation:md-sidebar__scrollwrap--hack 1000ms forwards}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width: 76.1875em){.md-overlay{position:fixed;top:0;z-index:3;width:0;height:0;background-color:rgba(0,0,0,.54);opacity:0;transition:width 0ms 250ms,height 0ms 250ms,opacity 250ms}[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;opacity:1;transition:width 0ms,height 0ms,opacity 250ms}}@-webkit-keyframes md-source__facts--done{0%{height:0}100%{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}100%{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{transform:translateY(100%);opacity:0}50%{opacity:0}100%{transform:translateY(0%);opacity:1}}@keyframes md-source__fact--done{0%{transform:translateY(100%);opacity:0}50%{opacity:0}100%{transform:translateY(0%);opacity:1}}.md-source{display:block;font-size:.65rem;line-height:1.2;white-space:nowrap;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:opacity 250ms}.md-source:focus,.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;width:2.4rem;height:2.4rem;vertical-align:middle}.md-source__icon svg{margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:initial}.md-source__icon+.md-source__repository{margin-left:-2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem;margin-left:initial;padding-right:2rem;padding-left:initial}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);margin-left:.6rem;overflow:hidden;font-weight:700;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{margin:0;padding:0;overflow:hidden;font-weight:700;font-size:.55rem;list-style-type:none;opacity:.75}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done 250ms ease-in;animation:md-source__facts--done 250ms ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done 400ms ease-out;animation:md-source__fact--done 400ms ease-out}.md-source__fact::before{margin:0 .1rem;content:"·"}.md-source__fact:first-child::before{display:none}.md-tabs{width:100%;overflow:auto;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);transition:background-color 250ms}@media print{.md-tabs{display:none}}@media screen and (max-width: 76.1875em){.md-tabs{display:none}}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{transform:translateY(50%);opacity:0;transition:transform 0ms 100ms,opacity 100ms}.md-tabs__list{margin:0;margin-left:.2rem;padding:0;white-space:nowrap;list-style:none;contain:content}[dir=rtl] .md-tabs__list{margin-right:.2rem;margin-left:initial}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;font-size:.7rem;-webkit-backface-visibility:hidden;backface-visibility:hidden;opacity:.7;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 250ms}.md-tabs__link--active,.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:100ms}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:120ms}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:140ms}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:160ms}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:180ms}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:200ms}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:220ms}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:240ms}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:260ms}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:280ms}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:300ms}:root{--md-version-icon: url( "data:image/svg+xml;charset=utf-8," )}.md-version{flex-shrink:0;height:2.4rem;font-size:.8rem}.md-version__current{position:relative;top:.05rem;margin-right:.4rem;margin-left:1.4rem}[dir=rtl] .md-version__current{margin-right:1.4rem;margin-left:.4rem}.md-version__current::after{display:inline-block;width:.4rem;height:.6rem;margin-left:.4rem;background-color:currentColor;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:""}[dir=rtl] .md-version__current::after{margin-right:.4rem;margin-left:initial}.md-version__list{position:absolute;top:.15rem;max-height:1.8rem;margin:.2rem .8rem;padding:0;overflow:auto;color:var(--md-default-fg-color);list-style-type:none;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.1),0 0 .05rem rgba(0,0,0,.25);opacity:0;transition:max-height 0ms 500ms,opacity 250ms 250ms;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.md-version__list:focus-within,.md-version__list:hover{max-height:10rem;opacity:1;transition:max-height 250ms,opacity 250ms}.md-version__item{line-height:1.8rem}.md-version__link{display:block;width:100%;padding-right:1.2rem;padding-left:.6rem;cursor:pointer;transition:color 250ms,background-color 250ms;scroll-snap-align:start}[dir=rtl] .md-version__link{padding-right:.6rem;padding-left:1.2rem}.md-version__link:focus,.md-version__link:hover{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--abstract: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--info: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--tip: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--success: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--question: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--warning: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--failure: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--danger: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--bug: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--example: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--quote: url( "data:image/svg+xml;charset=utf-8," )}.md-typeset .admonition,.md-typeset details{margin:1.5625em 0;padding:0 .6rem;overflow:hidden;color:var(--md-admonition-fg-color);font-size:.64rem;page-break-inside:avoid;background-color:var(--md-admonition-bg-color);border-left:.2rem solid #448aff;border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 .025rem .05rem rgba(0,0,0,.05)}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}.md-typeset .admonition .admonition,.md-typeset details .admonition,.md-typeset .admonition details,.md-typeset details details{margin:1em 0}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -0.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition-title,.md-typeset summary{position:relative;margin:0 -0.6rem 0 -0.8rem;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(68,138,255,.1);border-left:.2rem solid #448aff}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{margin:0 -0.8rem 0 -0.6rem;padding:.4rem 2rem .4rem .6rem;border-right:.2rem solid #448aff;border-left:none}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}.md-typeset .admonition-title::before,.md-typeset summary::before{position:absolute;left:.6rem;width:1rem;height:1rem;background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .admonition-title::before,[dir=rtl] .md-typeset summary::before{right:.6rem;left:initial}.md-typeset .admonition-title code,.md-typeset summary code{margin:initial;padding:initial;color:currentColor;background-color:transparent;border-radius:initial;box-shadow:none}.md-typeset .admonition-title+.tabbed-set:last-child,.md-typeset summary+.tabbed-set:last-child{margin-top:0}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:rgba(68,138,255,.1);border-color:#448aff}.md-typeset .note>.admonition-title::before,.md-typeset .note>summary::before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.abstract,.md-typeset details.abstract,.md-typeset .admonition.tldr,.md-typeset details.tldr,.md-typeset .admonition.summary,.md-typeset details.summary{border-color:#00b0ff}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary,.md-typeset .tldr>.admonition-title,.md-typeset .tldr>summary,.md-typeset .summary>.admonition-title,.md-typeset .summary>summary{background-color:rgba(0,176,255,.1);border-color:#00b0ff}.md-typeset .abstract>.admonition-title::before,.md-typeset .abstract>summary::before,.md-typeset .tldr>.admonition-title::before,.md-typeset .tldr>summary::before,.md-typeset .summary>.admonition-title::before,.md-typeset .summary>summary::before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.info,.md-typeset details.info,.md-typeset .admonition.todo,.md-typeset details.todo{border-color:#00b8d4}.md-typeset .info>.admonition-title,.md-typeset .info>summary,.md-typeset .todo>.admonition-title,.md-typeset .todo>summary{background-color:rgba(0,184,212,.1);border-color:#00b8d4}.md-typeset .info>.admonition-title::before,.md-typeset .info>summary::before,.md-typeset .todo>.admonition-title::before,.md-typeset .todo>summary::before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.tip,.md-typeset details.tip,.md-typeset .admonition.important,.md-typeset details.important,.md-typeset .admonition.hint,.md-typeset details.hint{border-color:#00bfa5}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary,.md-typeset .important>.admonition-title,.md-typeset .important>summary,.md-typeset .hint>.admonition-title,.md-typeset .hint>summary{background-color:rgba(0,191,165,.1);border-color:#00bfa5}.md-typeset .tip>.admonition-title::before,.md-typeset .tip>summary::before,.md-typeset .important>.admonition-title::before,.md-typeset .important>summary::before,.md-typeset .hint>.admonition-title::before,.md-typeset .hint>summary::before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.success,.md-typeset details.success,.md-typeset .admonition.done,.md-typeset details.done,.md-typeset .admonition.check,.md-typeset details.check{border-color:#00c853}.md-typeset .success>.admonition-title,.md-typeset .success>summary,.md-typeset .done>.admonition-title,.md-typeset .done>summary,.md-typeset .check>.admonition-title,.md-typeset .check>summary{background-color:rgba(0,200,83,.1);border-color:#00c853}.md-typeset .success>.admonition-title::before,.md-typeset .success>summary::before,.md-typeset .done>.admonition-title::before,.md-typeset .done>summary::before,.md-typeset .check>.admonition-title::before,.md-typeset .check>summary::before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.question,.md-typeset details.question,.md-typeset .admonition.faq,.md-typeset details.faq,.md-typeset .admonition.help,.md-typeset details.help{border-color:#64dd17}.md-typeset .question>.admonition-title,.md-typeset .question>summary,.md-typeset .faq>.admonition-title,.md-typeset .faq>summary,.md-typeset .help>.admonition-title,.md-typeset .help>summary{background-color:rgba(100,221,23,.1);border-color:#64dd17}.md-typeset .question>.admonition-title::before,.md-typeset .question>summary::before,.md-typeset .faq>.admonition-title::before,.md-typeset .faq>summary::before,.md-typeset .help>.admonition-title::before,.md-typeset .help>summary::before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.warning,.md-typeset details.warning,.md-typeset .admonition.attention,.md-typeset details.attention,.md-typeset .admonition.caution,.md-typeset details.caution{border-color:#ff9100}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary,.md-typeset .attention>.admonition-title,.md-typeset .attention>summary,.md-typeset .caution>.admonition-title,.md-typeset .caution>summary{background-color:rgba(255,145,0,.1);border-color:#ff9100}.md-typeset .warning>.admonition-title::before,.md-typeset .warning>summary::before,.md-typeset .attention>.admonition-title::before,.md-typeset .attention>summary::before,.md-typeset .caution>.admonition-title::before,.md-typeset .caution>summary::before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.failure,.md-typeset details.failure,.md-typeset .admonition.missing,.md-typeset details.missing,.md-typeset .admonition.fail,.md-typeset details.fail{border-color:#ff5252}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary,.md-typeset .missing>.admonition-title,.md-typeset .missing>summary,.md-typeset .fail>.admonition-title,.md-typeset .fail>summary{background-color:rgba(255,82,82,.1);border-color:#ff5252}.md-typeset .failure>.admonition-title::before,.md-typeset .failure>summary::before,.md-typeset .missing>.admonition-title::before,.md-typeset .missing>summary::before,.md-typeset .fail>.admonition-title::before,.md-typeset .fail>summary::before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.danger,.md-typeset details.danger,.md-typeset .admonition.error,.md-typeset details.error{border-color:#ff1744}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary,.md-typeset .error>.admonition-title,.md-typeset .error>summary{background-color:rgba(255,23,68,.1);border-color:#ff1744}.md-typeset .danger>.admonition-title::before,.md-typeset .danger>summary::before,.md-typeset .error>.admonition-title::before,.md-typeset .error>summary::before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:rgba(245,0,87,.1);border-color:#f50057}.md-typeset .bug>.admonition-title::before,.md-typeset .bug>summary::before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.example,.md-typeset details.example{border-color:#651fff}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:rgba(101,31,255,.1);border-color:#651fff}.md-typeset .example>.admonition-title::before,.md-typeset .example>summary::before{background-color:#651fff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.quote,.md-typeset details.quote,.md-typeset .admonition.cite,.md-typeset details.cite{border-color:#9e9e9e}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary,.md-typeset .cite>.admonition-title,.md-typeset .cite>summary{background-color:rgba(158,158,158,.1);border-color:#9e9e9e}.md-typeset .quote>.admonition-title::before,.md-typeset .quote>summary::before,.md-typeset .cite>.admonition-title::before,.md-typeset .cite>summary::before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}:root{--md-footnotes-icon: url("data:image/svg+xml;charset=utf-8,")}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{transition:color 125ms}.md-typeset .footnote li:target{color:var(--md-default-fg-color)}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{transform:translateX(0);opacity:1}.md-typeset .footnote li>:first-child{margin-top:0}.md-typeset .footnote-backref{display:inline-block;color:var(--md-typeset-a-color);font-size:0;vertical-align:text-bottom;transform:translateX(0.25rem);opacity:0;transition:color 250ms,transform 250ms 250ms,opacity 125ms 250ms}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);transform:translateX(0);opacity:1}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-0.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref::before{display:inline-block;width:.8rem;height:.8rem;background-color:currentColor;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .footnote-backref::before svg{transform:scaleX(-1)}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;color:var(--md-default-fg-color--lighter);opacity:0;transition:color 250ms,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:initial}.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink,.md-typeset .headerlink:focus{opacity:1;transition:color 250ms,opacity 125ms}.md-typeset :target>.headerlink,.md-typeset .headerlink:focus,.md-typeset .headerlink:hover{color:var(--md-accent-fg-color)}.md-typeset :target{scroll-margin-top:3.6rem}@media screen and (min-width: 76.25em){.md-header--lifted~.md-container .md-typeset :target{scroll-margin-top:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{scroll-margin-top:3.4rem}@media screen and (min-width: 76.25em){.md-header--lifted~.md-container .md-typeset h1:target,.md-header--lifted~.md-container .md-typeset h2:target,.md-header--lifted~.md-container .md-typeset h3:target{scroll-margin-top:5.8rem}}.md-typeset h4:target{scroll-margin-top:3.45rem}@media screen and (min-width: 76.25em){.md-header--lifted~.md-container .md-typeset h4:target{scroll-margin-top:5.85rem}}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width: 44.9375em){.md-typeset div.arithmatex{margin:0 -0.8rem}}.md-typeset div.arithmatex>*{width:-webkit-min-content;width:-moz-min-content;width:min-content;margin:1em auto !important;padding:0 .8rem;overflow:auto;touch-action:auto}.md-typeset del.critic,.md-typeset ins.critic,.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment::before{content:"/* "}.md-typeset .critic.comment::after{content:" */"}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;overflow:auto;box-shadow:none}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon: url("data:image/svg+xml;charset=utf-8,")}.md-typeset details{display:flow-root;padding-top:0;overflow:visible}.md-typeset details[open]>summary::after{transform:rotate(90deg)}.md-typeset details:not([open]){padding-bottom:0;box-shadow:none}.md-typeset details:not([open])>summary{border-radius:.1rem}.md-typeset summary{display:block;min-height:1rem;padding:.4rem 1.8rem .4rem 2rem;border-top-left-radius:.1rem;border-top-right-radius:.1rem;cursor:pointer}[dir=rtl] .md-typeset summary{padding:.4rem 2.2rem .4rem 1.8rem}.md-typeset summary:not(.focus-visible){outline:none;-webkit-tap-highlight-color:transparent}.md-typeset summary::after{position:absolute;top:.4rem;right:.4rem;width:1rem;height:1rem;background-color:currentColor;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transform:rotate(0deg);transition:transform 250ms;content:""}[dir=rtl] .md-typeset summary::after{right:initial;left:.4rem;transform:rotate(180deg)}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .twemoji,.md-typeset .gemoji{display:inline-block;height:1.125em;vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .twemoji svg,.md-typeset .gemoji svg{width:1.125em;max-height:100%;fill:currentColor}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .sb,.highlight .sc,.highlight .s2,.highlight .si,.highlight .s1,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .il,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .no,.highlight .nb,.highlight .bp{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .cm,.highlight .c1,.highlight .ch,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gr,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gs,.highlight .gu,.highlight .gt{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{margin:0 -0.125em;padding:0 .125em;border-radius:.1rem}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em;background-color:var(--md-code-hl-color)}.highlight [data-linenos]::before{position:-webkit-sticky;position:sticky;left:-1.1764705882em;float:left;margin-right:1.1764705882em;margin-left:-1.1764705882em;padding-left:1.1764705882em;color:var(--md-default-fg-color--light);background-color:var(--md-code-bg-color);box-shadow:-0.05rem 0 var(--md-default-fg-color--lightest) inset;content:attr(data-linenos);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlighttable{display:flow-root;overflow:hidden}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable .linenos{padding:.7720588235em 1.1764705882em;padding-right:0;font-size:.85em;background-color:var(--md-code-bg-color);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlighttable .linenodiv{padding-right:.5882352941em;box-shadow:-0.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;overflow:hidden}.md-typeset .highlighttable{margin:1em 0;direction:ltr;border-radius:.1rem}.md-typeset .highlighttable code{border-radius:0}@media screen and (max-width: 44.9375em){.md-typeset>.highlight{margin:1em -0.8rem}.md-typeset>.highlight .hll{margin:0 -0.8rem;padding:0 .8rem}.md-typeset>.highlight code{border-radius:0}.md-typeset>.highlighttable{margin:1em -0.8rem;border-radius:0}.md-typeset>.highlighttable .hll{margin:0 -0.8rem;padding:0 .8rem}}.md-typeset .keys kbd::before,.md-typeset .keys kbd::after{position:relative;margin:0;color:inherit;-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.md-typeset .keys span{padding:0 .2em;color:var(--md-default-fg-color--light)}.md-typeset .keys .key-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-left-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-right-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-left-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-right-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-left-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-right-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-left-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-right-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-left-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-right-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-left-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-right-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-left-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-right-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-left-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-right-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-arrow-down::before{padding-right:.4em;content:"↓"}.md-typeset .keys .key-arrow-left::before{padding-right:.4em;content:"←"}.md-typeset .keys .key-arrow-right::before{padding-right:.4em;content:"→"}.md-typeset .keys .key-arrow-up::before{padding-right:.4em;content:"↑"}.md-typeset .keys .key-backspace::before{padding-right:.4em;content:"⌫"}.md-typeset .keys .key-backtab::before{padding-right:.4em;content:"⇤"}.md-typeset .keys .key-caps-lock::before{padding-right:.4em;content:"⇪"}.md-typeset .keys .key-clear::before{padding-right:.4em;content:"⌧"}.md-typeset .keys .key-context-menu::before{padding-right:.4em;content:"☰"}.md-typeset .keys .key-delete::before{padding-right:.4em;content:"⌦"}.md-typeset .keys .key-eject::before{padding-right:.4em;content:"⏏"}.md-typeset .keys .key-end::before{padding-right:.4em;content:"⤓"}.md-typeset .keys .key-escape::before{padding-right:.4em;content:"⎋"}.md-typeset .keys .key-home::before{padding-right:.4em;content:"⤒"}.md-typeset .keys .key-insert::before{padding-right:.4em;content:"⎀"}.md-typeset .keys .key-page-down::before{padding-right:.4em;content:"⇟"}.md-typeset .keys .key-page-up::before{padding-right:.4em;content:"⇞"}.md-typeset .keys .key-print-screen::before{padding-right:.4em;content:"⎙"}.md-typeset .keys .key-tab::after{padding-left:.4em;content:"⇥"}.md-typeset .keys .key-num-enter::after{padding-left:.4em;content:"⌤"}.md-typeset .keys .key-enter::after{padding-left:.4em;content:"⏎"}.md-typeset .tabbed-content{display:none;order:99;width:100%;box-shadow:0 -0.05rem var(--md-default-fg-color--lightest)}@media print{.md-typeset .tabbed-content{display:block;order:initial}}.md-typeset .tabbed-content>pre:only-child,.md-typeset .tabbed-content>.highlight:only-child pre,.md-typeset .tabbed-content>.highlighttable:only-child{margin:0}.md-typeset .tabbed-content>pre:only-child>code,.md-typeset .tabbed-content>.highlight:only-child pre>code,.md-typeset .tabbed-content>.highlighttable:only-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-content>.tabbed-set{margin:0}.md-typeset .tabbed-set{position:relative;display:flex;flex-wrap:wrap;margin:1em 0;border-radius:.1rem}.md-typeset .tabbed-set>input{position:absolute;width:0;height:0;opacity:0}.md-typeset .tabbed-set>input:checked+label{color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:checked+label+.tabbed-content{display:block}.md-typeset .tabbed-set>input:focus+label{outline-style:auto}.md-typeset .tabbed-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.md-typeset .tabbed-set>label{z-index:1;width:auto;padding:.9375em 1.25em .78125em;color:var(--md-default-fg-color--light);font-weight:700;font-size:.64rem;border-bottom:.1rem solid transparent;cursor:pointer;transition:color 250ms}.md-typeset .tabbed-set>label:hover{color:var(--md-accent-fg-color)}:root{--md-tasklist-icon: url( "data:image/svg+xml;charset=utf-8," );--md-tasklist-icon--checked: url( "data:image/svg+xml;charset=utf-8," )}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:initial}.md-typeset .task-list-control [type=checkbox]{z-index:-1;opacity:0}.md-typeset .task-list-indicator::before{position:absolute;top:.15em;left:-1.5em;width:1.25em;height:1.25em;background-color:var(--md-default-fg-color--lightest);-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .task-list-indicator::before{right:-1.5em;left:initial}.md-typeset [type=checkbox]:checked+.task-list-indicator::before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media screen and (min-width: 45em){.md-typeset .inline{float:left;width:11.7rem;margin-top:0;margin-right:.8rem;margin-bottom:.8rem}[dir=rtl] .md-typeset .inline{float:right;margin-right:0;margin-left:.8rem}.md-typeset .inline.end{float:right;margin-right:0;margin-left:.8rem}[dir=rtl] .md-typeset .inline.end{float:left;margin-right:.8rem;margin-left:0}} diff --git a/latest/assets/stylesheets/palette.c308bc62.min.css b/0.3/assets/stylesheets/palette.47d7edde.min.css similarity index 73% rename from latest/assets/stylesheets/palette.c308bc62.min.css rename to 0.3/assets/stylesheets/palette.47d7edde.min.css index 16b060a0..e990a89a 100644 --- a/latest/assets/stylesheets/palette.c308bc62.min.css +++ b/0.3/assets/stylesheets/palette.47d7edde.min.css @@ -1 +1 @@ -[data-md-color-accent=red]{--md-accent-fg-color: hsla(348, 100%, 55%, 1);--md-accent-fg-color--transparent: hsla(348, 100%, 55%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=pink]{--md-accent-fg-color: hsla(339, 100%, 48%, 1);--md-accent-fg-color--transparent: hsla(339, 100%, 48%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=purple]{--md-accent-fg-color: hsla(291, 96%, 62%, 1);--md-accent-fg-color--transparent: hsla(291, 96%, 62%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=deep-purple]{--md-accent-fg-color: hsla(256, 100%, 65%, 1);--md-accent-fg-color--transparent: hsla(256, 100%, 65%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=indigo]{--md-accent-fg-color: hsla(231, 99%, 66%, 1);--md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=blue]{--md-accent-fg-color: hsla(218, 100%, 63%, 1);--md-accent-fg-color--transparent: hsla(218, 100%, 63%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=light-blue]{--md-accent-fg-color: hsla(203, 100%, 46%, 1);--md-accent-fg-color--transparent: hsla(203, 100%, 46%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=cyan]{--md-accent-fg-color: hsla(188, 100%, 42%, 1);--md-accent-fg-color--transparent: hsla(188, 100%, 42%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=teal]{--md-accent-fg-color: hsla(172, 100%, 37%, 1);--md-accent-fg-color--transparent: hsla(172, 100%, 37%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=green]{--md-accent-fg-color: hsla(145, 100%, 39%, 1);--md-accent-fg-color--transparent: hsla(145, 100%, 39%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=light-green]{--md-accent-fg-color: hsla(97, 81%, 48%, 1);--md-accent-fg-color--transparent: hsla(97, 81%, 48%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=lime]{--md-accent-fg-color: hsla(75, 100%, 46%, 1);--md-accent-fg-color--transparent: hsla(75, 100%, 46%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=yellow]{--md-accent-fg-color: hsla(50, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(50, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=amber]{--md-accent-fg-color: hsla(40, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(40, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=orange]{--md-accent-fg-color: hsla(34, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(34, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=deep-orange]{--md-accent-fg-color: hsla(14, 100%, 63%, 1);--md-accent-fg-color--transparent: hsla(14, 100%, 63%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=red]{--md-primary-fg-color: hsla(1, 83%, 63%, 1);--md-primary-fg-color--light: hsla(0, 69%, 67%, 1);--md-primary-fg-color--dark: hsla(1, 77%, 55%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=pink]{--md-primary-fg-color: hsla(340, 82%, 52%, 1);--md-primary-fg-color--light: hsla(340, 82%, 59%, 1);--md-primary-fg-color--dark: hsla(336, 78%, 43%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=purple]{--md-primary-fg-color: hsla(291, 47%, 51%, 1);--md-primary-fg-color--light: hsla(291, 47%, 60%, 1);--md-primary-fg-color--dark: hsla(287, 65%, 40%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=deep-purple]{--md-primary-fg-color: hsla(262, 47%, 55%, 1);--md-primary-fg-color--light: hsla(262, 47%, 63%, 1);--md-primary-fg-color--dark: hsla(262, 52%, 47%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=indigo]{--md-primary-fg-color: hsla(231, 48%, 48%, 1);--md-primary-fg-color--light: hsla(231, 44%, 56%, 1);--md-primary-fg-color--dark: hsla(232, 54%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=blue]{--md-primary-fg-color: hsla(207, 90%, 54%, 1);--md-primary-fg-color--light: hsla(207, 90%, 61%, 1);--md-primary-fg-color--dark: hsla(210, 79%, 46%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=light-blue]{--md-primary-fg-color: hsla(199, 98%, 48%, 1);--md-primary-fg-color--light: hsla(199, 92%, 56%, 1);--md-primary-fg-color--dark: hsla(201, 98%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=cyan]{--md-primary-fg-color: hsla(187, 100%, 42%, 1);--md-primary-fg-color--light: hsla(187, 71%, 50%, 1);--md-primary-fg-color--dark: hsla(186, 100%, 33%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=teal]{--md-primary-fg-color: hsla(174, 100%, 29%, 1);--md-primary-fg-color--light: hsla(174, 63%, 40%, 1);--md-primary-fg-color--dark: hsla(173, 100%, 24%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=green]{--md-primary-fg-color: hsla(122, 39%, 49%, 1);--md-primary-fg-color--light: hsla(123, 38%, 57%, 1);--md-primary-fg-color--dark: hsla(123, 43%, 39%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=light-green]{--md-primary-fg-color: hsla(88, 50%, 53%, 1);--md-primary-fg-color--light: hsla(88, 50%, 60%, 1);--md-primary-fg-color--dark: hsla(92, 48%, 42%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=lime]{--md-primary-fg-color: hsla(66, 70%, 54%, 1);--md-primary-fg-color--light: hsla(66, 70%, 61%, 1);--md-primary-fg-color--dark: hsla(62, 61%, 44%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=yellow]{--md-primary-fg-color: hsla(54, 100%, 62%, 1);--md-primary-fg-color--light: hsla(54, 100%, 67%, 1);--md-primary-fg-color--dark: hsla(43, 96%, 58%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=amber]{--md-primary-fg-color: hsla(45, 100%, 51%, 1);--md-primary-fg-color--light: hsla(45, 100%, 58%, 1);--md-primary-fg-color--dark: hsla(38, 100%, 50%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=orange]{--md-primary-fg-color: hsla(36, 100%, 57%, 1);--md-primary-fg-color--light: hsla(36, 100%, 57%, 1);--md-primary-fg-color--dark: hsla(33, 100%, 49%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=deep-orange]{--md-primary-fg-color: hsla(14, 100%, 63%, 1);--md-primary-fg-color--light: hsla(14, 100%, 70%, 1);--md-primary-fg-color--dark: hsla(14, 91%, 54%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=brown]{--md-primary-fg-color: hsla(16, 25%, 38%, 1);--md-primary-fg-color--light: hsla(16, 18%, 47%, 1);--md-primary-fg-color--dark: hsla(14, 26%, 29%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=grey]{--md-primary-fg-color: hsla(0, 0%, 46%, 1);--md-primary-fg-color--light: hsla(0, 0%, 62%, 1);--md-primary-fg-color--dark: hsla(0, 0%, 38%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=blue-grey]{--md-primary-fg-color: hsla(199, 18%, 40%, 1);--md-primary-fg-color--light: hsla(200, 18%, 46%, 1);--md-primary-fg-color--dark: hsla(199, 18%, 33%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=white]{--md-primary-fg-color: hsla(0, 0%, 100%, 1);--md-primary-fg-color--light: hsla(0, 0%, 100%, 0.7);--md-primary-fg-color--dark: hsla(0, 0%, 0%, 0.07);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54);--md-typeset-a-color: hsla(231, 48%, 48%, 1)}@media screen and (min-width: 60em){[data-md-color-primary=white] .md-search__input{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:rgba(0,0,0,.87)}[data-md-color-primary=white] .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input:hover{background-color:rgba(0,0,0,.32)}}@media screen and (min-width: 76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07)}}[data-md-color-primary=black]{--md-primary-fg-color: hsla(0, 0%, 0%, 1);--md-primary-fg-color--light: hsla(0, 0%, 0%, 0.54);--md-primary-fg-color--dark: hsla(0, 0%, 0%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-typeset-a-color: hsla(231, 48%, 48%, 1)}[data-md-color-primary=black] .md-header{background-color:#000}@media screen and (max-width: 59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:rgba(0,0,0,.87)}}@media screen and (min-width: 60em){[data-md-color-primary=black] .md-search__input{background-color:rgba(255,255,255,.12)}[data-md-color-primary=black] .md-search__input:hover{background-color:rgba(255,255,255,.3)}}@media screen and (max-width: 76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width: 76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}}@media screen{[data-md-color-scheme=slate]{--md-hue: 232;--md-default-fg-color: hsla(var(--md-hue), 75%, 95%, 1);--md-default-fg-color--light: hsla(var(--md-hue), 75%, 90%, 0.62);--md-default-fg-color--lighter: hsla(var(--md-hue), 75%, 90%, 0.32);--md-default-fg-color--lightest: hsla(var(--md-hue), 75%, 90%, 0.12);--md-default-bg-color: hsla(var(--md-hue), 15%, 21%, 1);--md-default-bg-color--light: hsla(var(--md-hue), 15%, 21%, 0.54);--md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 21%, 0.26);--md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 21%, 0.07);--md-code-fg-color: hsla(var(--md-hue), 18%, 86%, 1);--md-code-bg-color: hsla(var(--md-hue), 15%, 15%, 1);--md-code-hl-color: hsla(218, 100%, 63%, 0.15);--md-code-hl-number-color: hsla(6, 74%, 63%, 1);--md-code-hl-special-color: hsla(340, 83%, 66%, 1);--md-code-hl-function-color: hsla(291, 57%, 65%, 1);--md-code-hl-constant-color: hsla(250, 62%, 70%, 1);--md-code-hl-keyword-color: hsla(219, 66%, 64%, 1);--md-code-hl-string-color: hsla(150, 58%, 44%, 1);--md-typeset-a-color: var(--md-primary-fg-color--light);--md-typeset-mark-color: hsla(218, 100%, 63%, 0.3);--md-typeset-kbd-color: hsla(var(--md-hue), 15%, 94%, 0.12);--md-typeset-kbd-accent-color: hsla(var(--md-hue), 15%, 94%, 0.2);--md-typeset-kbd-border-color: hsla(var(--md-hue), 15%, 14%, 1);--md-admonition-bg-color: hsla(var(--md-hue), 0%, 100%, 0.025);--md-footer-bg-color: hsla(var(--md-hue), 15%, 12%, 0.87);--md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 10%, 1)}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color: hsla(231, 44%, 56%, 1)}} +[data-md-color-accent=red]{--md-accent-fg-color: hsla(348, 100%, 55%, 1);--md-accent-fg-color--transparent: hsla(348, 100%, 55%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=pink]{--md-accent-fg-color: hsla(339, 100%, 48%, 1);--md-accent-fg-color--transparent: hsla(339, 100%, 48%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=purple]{--md-accent-fg-color: hsla(291, 96%, 62%, 1);--md-accent-fg-color--transparent: hsla(291, 96%, 62%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=deep-purple]{--md-accent-fg-color: hsla(256, 100%, 65%, 1);--md-accent-fg-color--transparent: hsla(256, 100%, 65%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=indigo]{--md-accent-fg-color: hsla(231, 99%, 66%, 1);--md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=blue]{--md-accent-fg-color: hsla(218, 100%, 63%, 1);--md-accent-fg-color--transparent: hsla(218, 100%, 63%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=light-blue]{--md-accent-fg-color: hsla(203, 100%, 46%, 1);--md-accent-fg-color--transparent: hsla(203, 100%, 46%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=cyan]{--md-accent-fg-color: hsla(188, 100%, 42%, 1);--md-accent-fg-color--transparent: hsla(188, 100%, 42%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=teal]{--md-accent-fg-color: hsla(172, 100%, 37%, 1);--md-accent-fg-color--transparent: hsla(172, 100%, 37%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=green]{--md-accent-fg-color: hsla(145, 100%, 39%, 1);--md-accent-fg-color--transparent: hsla(145, 100%, 39%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=light-green]{--md-accent-fg-color: hsla(97, 81%, 48%, 1);--md-accent-fg-color--transparent: hsla(97, 81%, 48%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=lime]{--md-accent-fg-color: hsla(75, 100%, 46%, 1);--md-accent-fg-color--transparent: hsla(75, 100%, 46%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=yellow]{--md-accent-fg-color: hsla(50, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(50, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=amber]{--md-accent-fg-color: hsla(40, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(40, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=orange]{--md-accent-fg-color: hsla(34, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(34, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=deep-orange]{--md-accent-fg-color: hsla(14, 100%, 63%, 1);--md-accent-fg-color--transparent: hsla(14, 100%, 63%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=red]{--md-primary-fg-color: hsla(1, 83%, 63%, 1);--md-primary-fg-color--light: hsla(0, 69%, 67%, 1);--md-primary-fg-color--dark: hsla(1, 77%, 55%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=pink]{--md-primary-fg-color: hsla(340, 82%, 52%, 1);--md-primary-fg-color--light: hsla(340, 82%, 59%, 1);--md-primary-fg-color--dark: hsla(336, 78%, 43%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=purple]{--md-primary-fg-color: hsla(291, 47%, 51%, 1);--md-primary-fg-color--light: hsla(291, 47%, 60%, 1);--md-primary-fg-color--dark: hsla(287, 65%, 40%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=deep-purple]{--md-primary-fg-color: hsla(262, 47%, 55%, 1);--md-primary-fg-color--light: hsla(262, 47%, 63%, 1);--md-primary-fg-color--dark: hsla(262, 52%, 47%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=indigo]{--md-primary-fg-color: hsla(231, 48%, 48%, 1);--md-primary-fg-color--light: hsla(231, 44%, 56%, 1);--md-primary-fg-color--dark: hsla(232, 54%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=blue]{--md-primary-fg-color: hsla(207, 90%, 54%, 1);--md-primary-fg-color--light: hsla(207, 90%, 61%, 1);--md-primary-fg-color--dark: hsla(210, 79%, 46%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=light-blue]{--md-primary-fg-color: hsla(199, 98%, 48%, 1);--md-primary-fg-color--light: hsla(199, 92%, 56%, 1);--md-primary-fg-color--dark: hsla(201, 98%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=cyan]{--md-primary-fg-color: hsla(187, 100%, 42%, 1);--md-primary-fg-color--light: hsla(187, 71%, 50%, 1);--md-primary-fg-color--dark: hsla(186, 100%, 33%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=teal]{--md-primary-fg-color: hsla(174, 100%, 29%, 1);--md-primary-fg-color--light: hsla(174, 63%, 40%, 1);--md-primary-fg-color--dark: hsla(173, 100%, 24%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=green]{--md-primary-fg-color: hsla(122, 39%, 49%, 1);--md-primary-fg-color--light: hsla(123, 38%, 57%, 1);--md-primary-fg-color--dark: hsla(123, 43%, 39%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=light-green]{--md-primary-fg-color: hsla(88, 50%, 53%, 1);--md-primary-fg-color--light: hsla(88, 50%, 60%, 1);--md-primary-fg-color--dark: hsla(92, 48%, 42%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=lime]{--md-primary-fg-color: hsla(66, 70%, 54%, 1);--md-primary-fg-color--light: hsla(66, 70%, 61%, 1);--md-primary-fg-color--dark: hsla(62, 61%, 44%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=yellow]{--md-primary-fg-color: hsla(54, 100%, 62%, 1);--md-primary-fg-color--light: hsla(54, 100%, 67%, 1);--md-primary-fg-color--dark: hsla(43, 96%, 58%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=amber]{--md-primary-fg-color: hsla(45, 100%, 51%, 1);--md-primary-fg-color--light: hsla(45, 100%, 58%, 1);--md-primary-fg-color--dark: hsla(38, 100%, 50%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=orange]{--md-primary-fg-color: hsla(36, 100%, 57%, 1);--md-primary-fg-color--light: hsla(36, 100%, 57%, 1);--md-primary-fg-color--dark: hsla(33, 100%, 49%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=deep-orange]{--md-primary-fg-color: hsla(14, 100%, 63%, 1);--md-primary-fg-color--light: hsla(14, 100%, 70%, 1);--md-primary-fg-color--dark: hsla(14, 91%, 54%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=brown]{--md-primary-fg-color: hsla(16, 25%, 38%, 1);--md-primary-fg-color--light: hsla(16, 18%, 47%, 1);--md-primary-fg-color--dark: hsla(14, 26%, 29%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=grey]{--md-primary-fg-color: hsla(0, 0%, 46%, 1);--md-primary-fg-color--light: hsla(0, 0%, 62%, 1);--md-primary-fg-color--dark: hsla(0, 0%, 38%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=blue-grey]{--md-primary-fg-color: hsla(199, 18%, 40%, 1);--md-primary-fg-color--light: hsla(200, 18%, 46%, 1);--md-primary-fg-color--dark: hsla(199, 18%, 33%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=white]{--md-primary-fg-color: hsla(0, 0%, 100%, 1);--md-primary-fg-color--light: hsla(0, 0%, 100%, 0.7);--md-primary-fg-color--dark: hsla(0, 0%, 0%, 0.07);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54);--md-typeset-a-color: hsla(231, 48%, 48%, 1)}@media screen and (min-width: 60em){[data-md-color-primary=white] .md-search__form{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:rgba(0,0,0,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:rgba(0,0,0,.87)}}@media screen and (min-width: 76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07)}}[data-md-color-primary=black]{--md-primary-fg-color: hsla(0, 0%, 0%, 1);--md-primary-fg-color--light: hsla(0, 0%, 0%, 0.54);--md-primary-fg-color--dark: hsla(0, 0%, 0%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-typeset-a-color: hsla(231, 48%, 48%, 1)}[data-md-color-primary=black] .md-header{background-color:#000}@media screen and (max-width: 59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:rgba(0,0,0,.87)}}@media screen and (min-width: 60em){[data-md-color-primary=black] .md-search__form{background-color:rgba(255,255,255,.12)}[data-md-color-primary=black] .md-search__form:hover{background-color:rgba(255,255,255,.3)}}@media screen and (max-width: 76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width: 76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}}@media screen{[data-md-color-scheme=slate]{--md-hue: 232;--md-default-fg-color: hsla(var(--md-hue), 75%, 95%, 1);--md-default-fg-color--light: hsla(var(--md-hue), 75%, 90%, 0.62);--md-default-fg-color--lighter: hsla(var(--md-hue), 75%, 90%, 0.32);--md-default-fg-color--lightest: hsla(var(--md-hue), 75%, 90%, 0.12);--md-default-bg-color: hsla(var(--md-hue), 15%, 21%, 1);--md-default-bg-color--light: hsla(var(--md-hue), 15%, 21%, 0.54);--md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 21%, 0.26);--md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 21%, 0.07);--md-code-fg-color: hsla(var(--md-hue), 18%, 86%, 1);--md-code-bg-color: hsla(var(--md-hue), 15%, 15%, 1);--md-code-hl-color: hsla(218, 100%, 63%, 0.15);--md-code-hl-number-color: hsla(6, 74%, 63%, 1);--md-code-hl-special-color: hsla(340, 83%, 66%, 1);--md-code-hl-function-color: hsla(291, 57%, 65%, 1);--md-code-hl-constant-color: hsla(250, 62%, 70%, 1);--md-code-hl-keyword-color: hsla(219, 66%, 64%, 1);--md-code-hl-string-color: hsla(150, 58%, 44%, 1);--md-typeset-a-color: var(--md-primary-fg-color--light);--md-typeset-mark-color: hsla(218, 100%, 63%, 0.3);--md-typeset-kbd-color: hsla(var(--md-hue), 15%, 94%, 0.12);--md-typeset-kbd-accent-color: hsla(var(--md-hue), 15%, 94%, 0.2);--md-typeset-kbd-border-color: hsla(var(--md-hue), 15%, 14%, 1);--md-admonition-bg-color: hsla(var(--md-hue), 0%, 100%, 0.025);--md-footer-bg-color: hsla(var(--md-hue), 15%, 12%, 0.87);--md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 10%, 1)}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color: hsla(231, 44%, 56%, 1)}} diff --git a/0.3/change-log/index.html b/0.3/change-log/index.html new file mode 100644 index 00000000..c1c0f0cd --- /dev/null +++ b/0.3/change-log/index.html @@ -0,0 +1,1380 @@ + + + + + + + + + + + + + + + + + + + + + + + Change Log - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Change Log

+

0.3.0

+
    +
  • Update R and Python virtual environments
  • +
  • Add GH actions CI support for tests and docker
  • +
  • Add release and test badges to README
  • +
+

v0.2.6

+
    +
  • Fix old versions banner on nested pages
  • +
+

v0.2.5

+
    +
  • Fix docs deploy typo
  • +
+

v0.2.4

+
    +
  • Fix broken links in landing page and docs deploy
  • +
+

v0.2.3

+
    +
  • Fix participant IDS in the example analysis workflow
  • +
+

v0.2.2

+
    +
  • Fix readme link to docs
  • +
+

v0.2.1

+
    +
  • FIx link to the most recent version in the old version banner
  • +
+

v0.2.0

+
    +
  • Add new PHONE_BLUETOOTH DORYAB provider
  • +
  • Deprecate PHONE_BLUETOOTH RAPIDS provider
  • +
  • Fix bug in filter_data_by_segment for Python when dataset was empty
  • +
  • Minor doc updates
  • +
  • New FAQ item
  • +
+

v0.1.0

+ + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/citation/index.html b/0.3/citation/index.html new file mode 100644 index 00000000..a0da12c0 --- /dev/null +++ b/0.3/citation/index.html @@ -0,0 +1,1323 @@ + + + + + + + + + + + + + + + + + + + + + + + Citation - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Cite RAPIDS and providers

+
+

RAPIDS and the community

+

RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!

+
+

RAPIDS

+

If you used RAPIDS, please cite this paper.

+
+

RAPIDS et al. citation

+

Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA +RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices +JMIR Preprints. 18/08/2020:23246 +DOI: 10.2196/preprints.23246 +URL: https://preprints.jmir.org/preprint/23246

+
+

Panda (accelerometer)

+

If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS.

+
+

Panda et al. citation

+

Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.

+
+

Stachl (applications foreground)

+

If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS.

+
+

Stachl et al. citation

+

Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres Völkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus Bühner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117

+
+

Doryab (bluetooth)

+

If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS.

+
+

Doryab et al. citation

+

Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394

+
+

Barnett (locations)

+

If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS.

+
+

Barnett et al. citation

+

Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98–e112, https://doi.org/10.1093/biostatistics/kxy059

+
+
+

Canzian et al. citation

+

Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp ‘15). Association for Computing Machinery, New York, NY, USA, 1293–1304. DOI:https://doi.org/10.1145/2750858.2805845

+
+

Doryab (locations)

+

If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS.

+
+

Doryab et al. citation

+

Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394

+
+
+

Canzian et al. citation

+

Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp ‘15). Association for Computing Machinery, New York, NY, USA, 1293–1304. DOI:https://doi.org/10.1145/2750858.2805845

+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/code_of_conduct/index.html b/0.3/code_of_conduct/index.html new file mode 100644 index 00000000..9a3b87a2 --- /dev/null +++ b/0.3/code_of_conduct/index.html @@ -0,0 +1,1462 @@ + + + + + + + + + + + + + + + + + + + + + + + Code of Conduct - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Contributor Covenant Code of Conduct

+

Our Pledge

+

We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation.

+

We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community.

+

Our Standards

+

Examples of behavior that contributes to a positive environment for our +community include:

+
    +
  • Demonstrating empathy and kindness toward other people
  • +
  • Being respectful of differing opinions, viewpoints, and experiences
  • +
  • Giving and gracefully accepting constructive feedback
  • +
  • Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience
  • +
  • Focusing on what is best not just for us as individuals, but for the + overall community
  • +
+

Examples of unacceptable behavior include:

+
    +
  • The use of sexualized language or imagery, and sexual attention or + advances of any kind
  • +
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • +
  • Public or private harassment
  • +
  • Publishing others’ private information, such as a physical or email + address, without their explicit permission
  • +
  • Other conduct which could reasonably be considered inappropriate in a + professional setting
  • +
+

Enforcement Responsibilities

+

Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful.

+

Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate.

+

Scope

+

This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event.

+

Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +moshi@pitt.edu. +All complaints will be reviewed and investigated promptly and fairly.

+

All community leaders are obligated to respect the privacy and security of the +reporter of any incident.

+

Enforcement Guidelines

+

Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct:

+

1. Correction

+

Community Impact: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community.

+

Consequence: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested.

+

2. Warning

+

Community Impact: A violation through a single incident or series +of actions.

+

Consequence: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban.

+

3. Temporary Ban

+

Community Impact: A serious violation of community standards, including +sustained inappropriate behavior.

+

Consequence: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban.

+

4. Permanent Ban

+

Community Impact: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals.

+

Consequence: A permanent ban from any sort of public interaction within +the community.

+

Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

+

Community Impact Guidelines were inspired by +Mozilla’s code of conduct enforcement ladder.

+

For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available +at https://www.contributor-covenant.org/translations.

+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/developers/documentation/index.html b/0.3/developers/documentation/index.html new file mode 100644 index 00000000..efade6c0 --- /dev/null +++ b/0.3/developers/documentation/index.html @@ -0,0 +1,1300 @@ + + + + + + + + + + + + + + + + + + + + + + + Documentation - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Documentation

+

We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.

+

Set up development environment

+
    +
  1. Make sure your conda environment is active
  2. +
  3. pip install mkdocs
  4. +
  5. pip install mkdocs-material
  6. +
+

Preview

+

Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000:

+
mkdocs serve
+
+

File Structure

+

The documentation config file is /mkdocs.yml, if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.

+

Reference

+

Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements.

+
+

Hint

+

Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: +

[mylink](../setup/installation.md)
+

+
+

Extras

+

You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources:

+ +

You can use this page to create markdown tables more easily

+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/developers/git-flow/index.html b/0.3/developers/git-flow/index.html new file mode 100644 index 00000000..d71776b4 --- /dev/null +++ b/0.3/developers/git-flow/index.html @@ -0,0 +1,1334 @@ + + + + + + + + + + + + + + + + + + + + + + + Git Flow - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Git Flow

+

We use the develop/master variation of the OneFlow git flow

+

Add New Features

+

We use feature (topic) branches to implement new features

+
    +
  1. Pull the latest develop +
    git checkout develop
    +git pull
    +
  2. +
  3. Create your feature branch +
    git checkout -b feature/feature1
    +
  4. +
  5. Add, modify or delete the necessary files to add your new feature
  6. +
  7. Update the change log (docs/change-log.md)
  8. +
  9. Stage and commit your changes using VS Code git GUI or the following commands +
    git add modified-file1 modified-file2
    +git commit -m "Add my new feature" # use a concise description
    +
  10. +
  11. Integrate your new feature to develop
  12. +
+
+

You are an internal developer if you have writing permissions to the repository.

+

Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online.

+
git checkout feature/feature1
+git fetch origin develop
+git rebase -i develop
+git checkout develop
+git merge --no-ff feature/feature1 # (use the default merge message)
+git push origin develop
+git branch -d feature/feature1
+
+
+
+

You are an external developer if you do NOT have writing permissions to the repository.

+

Push your feature branch online +

git push --set-upstream origin feature/external-test
+
+Then open a pull request to the develop branch using Github’s GUI

+
+
+

Release a New Version

+
    +
  1. Pull the latest develop +
    git checkout develop
    +git pull
    +
  2. +
  3. Create a new release branch +
    git describe --abbrev=0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX)
    +git checkout -b release/v[NEW_RELEASE] develop
    +
  4. +
  5. Add new tag +
    git tag v[NEW_RELEASE]
    +
  6. +
  7. Merge and push the release branch +
    git checkout develop
    +git merge release/v[NEW_RELEASE]
    +git push --tags origin develop
    +git branch -d release/v[NEW_RELEASE]
    +
  8. +
  9. Fast-forward master +
    git checkout master
    +git merge --ff-only develop
    +git push
    +
  10. +
  11. Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log)
  12. +
+

Release a Hotfix

+
    +
  1. Pull the latest master +
    git checkout master
    +git pull
    +
  2. +
  3. Start a hotfix branch +
    git describe --abbrev=0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX)
    +git checkout -b hotfix/v[NEW_HOTFIX] master
    +
  4. +
  5. Fix whatever needs to be fixed
  6. +
  7. Update the change log
  8. +
  9. Tag and merge the hotfix +
    git tag v[NEW_HOTFIX]
    +git checkout develop
    +git merge hotfix/v[NEW_HOTFIX]
    +git push --tags origin develop
    +git branch -d hotfix/v[NEW_HOTFIX]
    +
  10. +
  11. Fast-forward master +
    git checkout master
    +git merge --ff-only v[NEW_HOTFIX]
    +git push
    +
  12. +
  13. Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)
  14. +
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/developers/remote-support/index.html b/0.3/developers/remote-support/index.html new file mode 100644 index 00000000..8b5b4584 --- /dev/null +++ b/0.3/developers/remote-support/index.html @@ -0,0 +1,1184 @@ + + + + + + + + + + + + + + + + + + + + + + + Remote Support - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Remote Support

+

We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible.

+
    +
  1. Install Visual Studio Code
  2. +
  3. Open you RAPIDS root folder in a new VSCode window
  4. +
  5. Open a new Terminal Terminal > New terminal
  6. +
  7. Install the Live Share extension pack
  8. +
  9. +

    Press Ctrl+P or Cmd+P and run this command:

    +

    >live share: start collaboration session
    +
    +6. Follow the instructions and share the session link you receive

    +
  10. +
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/developers/test-cases/index.html b/0.3/developers/test-cases/index.html new file mode 100644 index 00000000..467a2b43 --- /dev/null +++ b/0.3/developers/test-cases/index.html @@ -0,0 +1,1520 @@ + + + + + + + + + + + + + + + + + + + + + + + Test cases - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Test Cases

+

Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively.

+

The following is a list of the sensors that testing is currently available.

+

Messages (SMS)

+
    +
  • The raw message data file contains data for 2 separate days.
  • +
  • The data for the first day contains records 5 records for every + epoch.
  • +
  • The second day's data contains 6 records for each of only 2 + epoch (currently morning and evening)
  • +
  • The raw message data contains records for both message_types + (i.e. recieved and sent) in both days in all epochs. The + number records with each message_types per epoch is randomly + distributed There is at least one records with each + message_types per epoch.
  • +
  • There is one raw message data file each, as described above, for + testing both iOS and Android data.
  • +
  • There is also an additional empty data file for both android and + iOS for testing empty data files
  • +
+

Calls

+

Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv. This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable.

+
    +
  • The call data would contain data for 2 days.
  • +
  • The data for the first day contains 6 records for every epoch.
  • +
  • The second day's data contains 6 records for each of only 2 + epoch (currently morning and evening)
  • +
  • The call data contains records for all call_types (i.e. + incoming, outgoing and missed) in both days in all epochs. + The number records with each of the call_types per epoch is + randomly distributed. There is at least one records with each + call_types per epoch.
  • +
  • There is one call data file each, as described above, for testing + both iOS and Android data.
  • +
  • There is also an additional empty data file for both android and + iOS for testing empty data files
  • +
+

Screen

+

Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv. This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor

+
    +
  • The screen delta data file contains data for 1 day.
  • +
  • The screen delta data contains 1 record to represent an unlock + episode that falls within an epoch for every epoch.
  • +
  • The screen delta data contains 1 record to represent an unlock + episode that falls across the boundary of 2 epochs. Namely the + unlock episode starts in one epoch and ends in the next, thus + there is a record for unlock episodes that fall across night + to morning, morning to afternoon and finally afternoon to + night
  • +
  • The testing is done for unlock episode_type.
  • +
  • There is one screen data file each for testing both iOS and + Android data formats.
  • +
  • There is also an additional empty data file for both android and + iOS for testing empty data files
  • +
+

Battery

+

Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv. This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor.

+
    +
  • The battery delta data file contains data for 1 day.
  • +
  • The battery delta data contains 1 record each for a charging and + discharging episode that falls within an epoch for every + epoch. Thus, for the daily epoch there would be multiple + charging and discharging episodes
  • +
  • Since either a charging episode or a discharging episode and + not both can occur across epochs, in order to test episodes that + occur across epochs alternating episodes of charging and + discharging episodes that fall across night to morning, + morning to afternoon and finally afternoon to night are + present in the battery delta data. This starts with a + discharging episode that begins in night and end in morning.
  • +
  • There is one battery data file each, for testing both iOS and + Android data formats.
  • +
  • There is also an additional empty data file for both android and + iOS for testing empty data files
  • +
+

Bluetooth

+
    +
  • The raw Bluetooth data file contains data for 1 day.
  • +
  • The raw Bluetooth data contains at least 2 records for each + epoch. Each epoch has a record with a timestamp for the + beginning boundary for that epoch and a record with a + timestamp for the ending boundary for that epoch. (e.g. For + the morning epoch there is a record with a timestamp for + 6:00AM and another record with a timestamp for 11:59:59AM. + These are to test edge cases)
  • +
  • An option of 5 Bluetooth devices are randomly distributed + throughout the data records.
  • +
  • There is one raw Bluetooth data file each, for testing both iOS + and Android data formats.
  • +
  • There is also an additional empty data file for both android and + iOS for testing empty data files.
  • +
+

WIFI

+
    +
  • There are 2 data files (wifi_raw.csv and sensor_wifi_raw.csv) + for each fake participant for each phone platform.
  • +
  • The raw WIFI data files contain data for 1 day.
  • +
  • The sensor_wifi_raw.csv data contains at least 2 records for + each epoch. Each epoch has a record with a timestamp for the + beginning boundary for that epoch and a record with a + timestamp for the ending boundary for that epoch. (e.g. For + the morning epoch there is a record with a timestamp for + 6:00AM and another record with a timestamp for 11:59:59AM. + These are to test edge cases)
  • +
  • The wifi_raw.csv data contains 3 records with random timestamps + for each epoch to represent visible broadcasting WIFI network. + This file is empty for the iOS phone testing data.
  • +
  • An option of 10 access point devices is randomly distributed + throughout the data records. 5 each for sensor_wifi_raw.csv and + wifi_raw.csv.
  • +
  • There data files for testing both iOS and Android data formats.
  • +
  • There are also additional empty data files for both android and + iOS for testing empty data files.
  • +
+

Light

+
    +
  • The raw light data file contains data for 1 day.
  • +
  • The raw light data contains 3 or 4 rows of data for each epoch + except night. The single row of data for night is for testing + features for single values inputs. (Example testing the standard + deviation of one input value)
  • +
  • Since light is only available for Android there is only one file + that contains data for Android. All other files (i.e. for iPhone) + are empty data files.
  • +
+

Application Foreground

+
    +
  • The raw application foreground data file contains data for 1 day.
  • +
  • The raw application foreground data contains 7 - 9 rows of data + for each epoch. The records for each epoch contains apps that + are randomly selected from a list of apps that are from the + MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See + testing_config.yaml). There are also records in each epoch + that have apps randomly selected from a list of apps that are from + the EXCLUDED_CATEGORIES and EXCLUDED_APPS. This is to test + that these apps are actually being excluded from the calculations + of features. There are also records to test SINGLE_APPS + calculations.
  • +
  • Since application foreground is only available for Android there + is only one file that contains data for Android. All other files + (i.e. for iPhone) are empty data files.
  • +
+

Activity Recognition

+
    +
  • The raw Activity Recognition data file contains data for 1 day.
  • +
  • The raw Activity Recognition data each epoch period contains + rows that records 2 - 5 different activity_types. The is such + that durations of activities can be tested. Additionally, there + are records that mimic the duration of an activity over the time + boundary of neighboring epochs. (For example, there a set of + records that mimic the participant in_vehicle from afternoon + into evening)
  • +
  • There is one file each with raw Activity Recognition data for + testing both iOS and Android data formats. + (plugin_google_activity_recognition_raw.csv for android and + plugin_ios_activity_recognition_raw.csv for iOS)
  • +
  • There is also an additional empty data file for both android and + iOS for testing empty data files.
  • +
+

Conversation

+
    +
  • The raw conversation data file contains data for 2 day.
  • +
  • The raw conversation data contains records with a sample of both + datatypes (i.e. voice/noise = 0, and conversation = 2 ) + as well as rows with for samples of each of the inference values + (i.e. silence = 0, noise = 1, voice = 2, and unknown + = 3) for each epoch. The different datatype and inference + records are randomly distributed throughout the epoch.
  • +
  • Additionally there are 2 - 5 records for conversations (datatype + = 2, and inference = -1) in each epoch and for each epoch + except night, there is a conversation record that has a + double_convo_start timestamp that is from the previous + epoch. This is to test the calculations of features across + epochs.
  • +
  • There is a raw conversation data file for both android and iOS + platforms (plugin_studentlife_audio_android_raw.csv and + plugin_studentlife_audio_raw.csv respectively).
  • +
  • Finally, there are also additional empty data files for both + android and iOS for testing empty data files
  • +
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/developers/testing/index.html b/0.3/developers/testing/index.html new file mode 100644 index 00000000..da6bedf3 --- /dev/null +++ b/0.3/developers/testing/index.html @@ -0,0 +1,1252 @@ + + + + + + + + + + + + + + + + + + + + + + + Testing - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Testing

+

The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory

+

Steps for Testing

+
    +
  1. To begin testing RAPIDS place the fake raw input data csv files in + tests/data/raw/. The fake participant files should be placed in + tests/data/external/. The expected output files of RAPIDS after + processing the input data should be placed in + tests/data/processesd/.
  2. +
  3. The Snakemake rule(s) that are to be tested must be placed in the + tests/Snakemake file. The current tests/Snakemake is a good + example of how to define them. (At the time of writing this + documentation the snakefile contains rules messages (SMS), calls and + screen)
  4. +
  5. Edit the tests/settings/config.yaml. Add and/or remove the rules + to be run for testing from the forcerun list.
  6. +
  7. Edit the tests/settings/testing_config.yaml with the necessary + configuration settings for running the rules to be tested.
  8. +
  9. Add any additional testscripts in tests/scripts.
  10. +
  11. Uncomment or comment off lines in the testing shell script + tests/scripts/run_tests.sh.
  12. +
  13. +

    Run the testing shell script.

    +
    tests/scripts/run_tests.sh
    +
    +
  14. +
+

The following is a snippet of the output you should see after running your test.

+
test_sensors_files_exist (test_sensor_features.TestSensorFeatures) ... ok
+test_sensors_features_calculations (test_sensor_features.TestSensorFeatures) ... FAIL
+
+======================================================================
+FAIL: test_sensors_features_calculations (test_sensor_features.TestSensorFeatures)
+----------------------------------------------------------------------
+
+

The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation

+

Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available.

+

Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.

+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/developers/virtual-environments/index.html b/0.3/developers/virtual-environments/index.html new file mode 100644 index 00000000..e7e52dde --- /dev/null +++ b/0.3/developers/virtual-environments/index.html @@ -0,0 +1,1399 @@ + + + + + + + + + + + + + + + + + + + + + + + Virtual Environments - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + + + + +
+
+ + + + + + + +

Virtual Environments

+ +

Python Virtual Environment

+

Add new packages

+

Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active (conda activate YOUR_ENV).

+

Remove packages

+

Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME

+

Updating all packages

+

Make sure your Python virtual environment is active (conda activate YOUR_ENV), then run +

conda update --all
+

+

Update your conda environment.yaml

+

After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: +

conda env export --no-builds | sed 's/^.*libgfortran.*$/  - libgfortran/' | sed 's/^.*mkl=.*$/  - mkl/' >  environment.yml
+

+

R Virtual Environment

+

Add new packages

+
    +
  1. Open your terminal and navigate to RAPIDS’ root folder
  2. +
  3. Run R to open an R interactive session
  4. +
  5. Run renv::install("PACKAGE_NAME")
  6. +
+

Remove packages

+
    +
  1. Open your terminal and navigate to RAPIDS’ root folder
  2. +
  3. Run R to open an R interactive session
  4. +
  5. Run renv::remove("PACKAGE_NAME")
  6. +
+

Updating all packages

+
    +
  1. Open your terminal and navigate to RAPIDS’ root folder
  2. +
  3. Run R to open an R interactive session
  4. +
  5. Run renv::update()
  6. +
+

Update your R renv.lock

+

After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline.

+
    +
  1. Open your terminal and navigate to RAPIDS’ root folder
  2. +
  3. Run R to open an R interactive session
  4. +
  5. Run renv::snapshot() (renv will ask you to confirm any updates to this file)
  6. +
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/faq/index.html b/0.3/faq/index.html new file mode 100644 index 00000000..d0570d97 --- /dev/null +++ b/0.3/faq/index.html @@ -0,0 +1,1569 @@ + + + + + + + + + + + + + + + + + + + + + + + FAQ - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + + + + +
+
+ + + + + + + +

Frequently Asked Questions

+

Cannot connect to your MySQL server

+
Problem
**Error in .local(drv, \...) :** **Failed to connect to database: Error:
+Can\'t initialize character set unknown (path: compiled\_in)** :
+
+Calls: dbConnect -> dbConnect -> .local -> .Call
+Execution halted
+[Tue Mar 10 19:40:15 2020]
+Error in rule download_dataset:
+    jobid: 531
+    output: data/raw/p60/locations_raw.csv
+
+RuleException:
+CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile:
+Command 'set -euo pipefail;  Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1.
+File "/home/ubuntu/rapids/rules/preprocessing.snakefile", line 20, in __rule_download_dataset
+File "/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py", line 57, in run
+Shutting down, this might take some time.
+Exiting because a job execution failed. Look above for error message
+
+
+
Solution

Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env.

+
+
+

Cannot start mysql in linux via brew services start mysql

+
Problem

Cannot start mysql in linux via brew services start mysql

+
+
Solution

Use mysql.server start

+
+
+

Every time I run force the download_dataset rule all rules are executed

+
Problem

When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed

+
+
Solution

This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.

+
+
+

Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule.

+
Problem
Error in .local(conn, statement, ...) : 
+  could not run statement: Table 'db_name.table_name' doesn't exist
+Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call
+Execution halted
+
+
+
Solution

Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.

+
+
+

How do I install RAPIDS on Ubuntu 16.04

+
Solution
    +
  1. +

    Install dependencies (Homebrew - if not installed):

    +
      +
    • sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev
    • +
    • Install brew for linux and add the following line to ~/.bashrc: export PATH=$HOME/.linuxbrew/bin:$PATH
    • +
    • source ~/.bashrc
    • +
    +
  2. +
  3. +

    Install MySQL

    +
      +
    • brew install mysql
    • +
    • brew services start mysql
    • +
    +
  4. +
  5. +

    Install R, pandoc and rmarkdown:

    +
      +
    • brew install r
    • +
    • brew install gcc@6 (needed due to this bug)
    • +
    • HOMEBREW_CC=gcc-6 brew install pandoc
    • +
    +
  6. +
  7. +

    Install miniconda using these instructions

    +
  8. +
  9. +

    Clone our repo:

    +
      +
    • git clone https://github.com/carissalow/rapids
    • +
    +
  10. +
  11. +

    Create a python virtual environment:

    +
      +
    • cd rapids
    • +
    • conda env create -f environment.yml -n MY_ENV_NAME
    • +
    • conda activate MY_ENV_NAME
    • +
    +
  12. +
  13. +

    Install R packages and virtual environment:

    +
      +
    • snakemake renv_install
    • +
    • snakemake renv_init
    • +
    • snakemake renv_restore
    • +
    +

    This step could take several minutes to complete. Please be patient and let it run until completion.

    +
  14. +
+
+
+

mysql.h cannot be found

+
Problem
--------------------------[ ERROR MESSAGE ]----------------------------
+<stdin>:1:10: fatal error: mysql.h: No such file or directory
+compilation terminated.
+-----------------------------------------------------------------------
+ERROR: configuration failed for package 'RMySQL'
+
+
+
Solution
sudo apt install libmariadbclient-dev
+
+
+
+

No package libcurl found

+
Problem

libcurl cannot be found

+
+
Solution

Install libcurl +

sudo apt install libcurl4-openssl-dev
+

+
+
+

Configuration failed because openssl was not found.

+
Problem

openssl cannot be found

+
+
Solution

Install openssl +

sudo apt install libssl-dev
+

+
+
+

Configuration failed because libxml-2.0 was not found

+
Problem

libxml-2.0 cannot be found

+
+
Solution

Install libxml-2.0 +

sudo apt install libxml2-dev
+

+
+
+

SSL connection error when running RAPIDS

+
Problem

You are getting the following error message when running RAPIDS: +

Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol.
+

+
+
Solution

This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector.

+

If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here

+
+
+

DB_TABLES key not found

+
Problem

If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS', it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS

+
+
Solution

You need to add or remove any leading whitespaces as needed on that line.

+
PHONE_VALID_SENSED_BINS:
+    COMPUTE: False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features
+    BIN_SIZE: &bin_size 5 # (in minutes)
+    PHONE_SENSORS: []
+
+
+
+

Error while updating your conda environment in Ubuntu

+
Problem

You get the following error: +

CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003
+    appears to be corrupted. The path 'include/mysqlStubs.h'
+    specified in the package manifest cannot be found.
+ClobberError: This transaction has incompatible packages due to a shared path.
+    packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243
+    path: 'lib/libiomp5.so'
+

+
+
Solution

Reinstall conda

+
+

Embedded nul in string

+
Problem

You get the following error when downloading sensor data: +

Error in result_fetch(res@ptr, n = n) : 
+  embedded nul in string:
+

+
+
Solution

This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue). Since it seems this problem won’t be handled by RMariaDB, you have two options:

+
    +
  1. If it’s only a few rows that are causing this problem, remove the the null character from the conflictive table cell.
  2. +
  3. If it’s not feasible to modify your data you can try swapping RMariaDB with RMySQL. Just have in mind you might have problems connecting to modern MySQL servers running in Liunx:
      +
    • Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder +
      R -e 'renv::install("RMySQL")'
      +
    • +
    • Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL)
    • +
    • In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = "./.env", group = group) with dbEngine <- dbConnect(MySQL(), default.file = "./.env", group = group)
    • +
    +
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/add-new-features/index.html b/0.3/features/add-new-features/index.html new file mode 100644 index 00000000..89362b94 --- /dev/null +++ b/0.3/features/add-new-features/index.html @@ -0,0 +1,1493 @@ + + + + + + + + + + + + + + + + + + + + + + + Add New Features - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + + + + +
+
+ + + + + + + +

Add New Features

+
+

Hint

+

We recommend reading the Behavioral Features Introduction before reading this page

+
+
+

Hint

+

You won’t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.

+
+

New Features for Existing Sensors

+

You can add new features to any existing sensors (see list below) by adding a new provider in three steps:

+
    +
  1. Modify the config.yaml file
  2. +
  3. Create a provider folder, script and function
  4. +
  5. Implement your features extraction code
  6. +
+

As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1, feature2, feature3 in Python and that it requires a parameter from the user called MY_PARAMETER.

+
Existing Sensors

An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml:

+
    +
  • Phone Accelerometer
  • +
  • Phone Activity Recognition
  • +
  • Phone Applications Foreground
  • +
  • Phone Battery
  • +
  • Phone Bluetooth
  • +
  • Phone Calls
  • +
  • Phone Conversation
  • +
  • Phone Data Yield
  • +
  • Phone Light
  • +
  • Phone Locations
  • +
  • Phone Messages
  • +
  • Phone Screen
  • +
  • Phone WiFI Connected
  • +
  • Phone WiFI Visible
  • +
  • Fitbit Heart Rate Summary
  • +
  • Fitbit Heart Rate Intraday
  • +
  • Fitbit Sleep Summary
  • +
  • Fitbit Steps Summary
  • +
  • Fitbit Steps Intraday
  • +
+
+

Modify the config.yaml file

+

In this step you need to add your provider configuration section under the relevant sensor in config.yaml. See our example for our tutorial’s VEGA provider for PHONE_ACCELEROMETER:

+
Example configuration for a new accelerometer provider VEGA
PHONE_ACCELEROMETER:
+    TABLE: accelerometer
+    PROVIDERS:
+        RAPIDS:
+            COMPUTE: False
+            ...
+
+        PANDA:
+            COMPUTE: False
+            ...
+        VEGA:
+            COMPUTE: False
+            FEATURES: ["feature1", "feature2", "feature3"]
+            MY_PARAMTER: a_string
+            SRC_FOLDER: "vega"
+            SRC_LANGUAGE: "python"
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                         Description
[COMPUTE]Flag to activate/deactivate your provider
[FEATURES]List of features your provider supports. Your provider code should only return the features on this list
[MY_PARAMTER]An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types.
[SRC_LANGUAGE]The programming language of your provider script, it can be python or r, in our example python
[SRC_FOLDER]The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)
+

Create a provider folder, script and function

+

In this step you need to add a folder, script and function for your provider.

+
    +
  1. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER, in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above).
  2. +
  3. Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R.
  4. +
  5. +

    Add your provider function in your provider script. The name of such function should be [providername]_features, in our example vega_features

    +
    +

    Python function

    +
    def [providername]_features(sensor_data_files, time_segment, provider, filter_data_by_segment, *args, **kwargs):
    +
    +
    +
    +

    R function

    +
    [providername]_features <- function(sensor_data, time_segment, provider)
    +
    +
    +
  6. +
+

Implement your feature extraction code

+

The provider function that you created in the step above will receive the following parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter                                      Description
sensor_data_filesPath to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml)
time_segmentThe label of the time segment that should be processed.
providerThe parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:"a_string"}
filter_data_by_segmentPython only. A function that you will use to filter your data. In R this function is already available in the environment.
*argsPython only. Not used for now
**kwargsPython only. Not used for now
+

The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages:

+
1. Read a participant’s data by loading the CSV data stored in the file pointed by sensor_data_files
acc_data = pd.read_csv(sensor_data_files["sensor_data"])
+
+

Note that phone’s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on)

+
+
2. Filter your data to process only those rows that belong to time_segment

This step is only one line of code, but to undersand why we need it, keep reading. +

acc_data = filter_data_by_segment(acc_data, time_segment)
+

+

You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with.

+

Let’s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment. A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01. The labels are arbritrary and the instances depend on the days a participant was monitored for:

+
    +
  • the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances
  • +
  • the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances.
  • +
  • the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances.
  • +
+

For this example, RAPIDS will call your provider function three times for p01, once where time_segment is my_days, once where time_segment is my_weeks and once where time_segment is my_weekends. In this example not every row in p01‘s data needs to take part in the feature computation for either segment and the rows need to be grouped differently.

+

Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment. This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01‘s my_days, my_weeks, and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features, for example:

+
acc_features["maxmagnitude"] = acc_data.groupby(["local_segment"])["magnitude"].max()
+
+

The reason RAPIDS does not filter the participant’s data set for you is because your code might need to compute something based on a participant’s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number.

+
+
3. Return a data frame with your features

After filtering, grouping your data, and computing your features, your provider function should return a data frame that has:

+
    +
  • One row per time segment instance (e.g. 14 our p01‘s my_days example)
  • +
  • The local_segment column added by filter_data_by_segment()
  • +
  • One column per feature. By convention the name of your features should only contain letters or numbers (feature1). RAPIDS will automatically add the right sensor and provider prefix (phone_accelerometr_vega_)
  • +
+
+
PHONE_ACCELEROMETER Provider Example

For your reference, this a short example of our own provider (RAPIDS) for PHONE_ACCELEROMETER that computes five acceleration features

+
def rapids_features(sensor_data_files, time_segment, provider, filter_data_by_segment, *args, **kwargs):
+
+    acc_data = pd.read_csv(sensor_data_files["sensor_data"])
+    requested_features = provider["FEATURES"]
+    # name of the features this function can compute
+    base_features_names = ["maxmagnitude", "minmagnitude", "avgmagnitude", "medianmagnitude", "stdmagnitude"]
+    # the subset of requested features this function can compute
+    features_to_compute = list(set(requested_features) & set(base_features_names))
+
+    acc_features = pd.DataFrame(columns=["local_segment"] + features_to_compute)
+    if not acc_data.empty:
+        acc_data = filter_data_by_segment(acc_data, time_segment)
+
+        if not acc_data.empty:
+            acc_features = pd.DataFrame()
+            # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2)
+            magnitude = acc_data.apply(lambda row: np.sqrt(row["double_values_0"] ** 2 + row["double_values_1"] ** 2 + row["double_values_2"] ** 2), axis=1)
+            acc_data = acc_data.assign(magnitude = magnitude.values)
+
+            if "maxmagnitude" in features_to_compute:
+                acc_features["maxmagnitude"] = acc_data.groupby(["local_segment"])["magnitude"].max()
+            if "minmagnitude" in features_to_compute:
+                acc_features["minmagnitude"] = acc_data.groupby(["local_segment"])["magnitude"].min()
+            if "avgmagnitude" in features_to_compute:
+                acc_features["avgmagnitude"] = acc_data.groupby(["local_segment"])["magnitude"].mean()
+            if "medianmagnitude" in features_to_compute:
+                acc_features["medianmagnitude"] = acc_data.groupby(["local_segment"])["magnitude"].median()
+            if "stdmagnitude" in features_to_compute:
+                acc_features["stdmagnitude"] = acc_data.groupby(["local_segment"])["magnitude"].std()
+
+            acc_features = acc_features.reset_index()
+
+    return acc_features
+
+
+

New Features for Non-Existing Sensors

+

If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the "Existing Sensors" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.

+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/feature-introduction/index.html b/0.3/features/feature-introduction/index.html new file mode 100644 index 00000000..5594ada3 --- /dev/null +++ b/0.3/features/feature-introduction/index.html @@ -0,0 +1,1319 @@ + + + + + + + + + + + + + + + + + + + + + + + Introduction - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Behavioral Features Introduction

+

Every phone or Fitbit sensor has a corresponding config section in config.yaml, these sections follow a similar structure and we’ll use PHONE_ACCELEROMETER as an example to explain this structure.

+
+

Hint

+
    +
  • We recommend reading this page if you are using RAPIDS for the first time
  • +
  • All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants).
  • +
  • Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS.
  • +
+
+
+

Config section example for PHONE_ACCELEROMETER

+
# 1) Config section
+PHONE_ACCELEROMETER:
+    # 2) Parameters for PHONE_ACCELEROMETER
+    TABLE: accelerometer
+
+    # 3) Providers for PHONE_ACCELEROMETER
+    PROVIDERS:
+        # 4) RAPIDS provider
+        RAPIDS:
+            # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER
+            COMPUTE: False
+            # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER
+            FEATURES: ["maxmagnitude", "minmagnitude", "avgmagnitude", "medianmagnitude", "stdmagnitude"]
+            SRC_FOLDER: "rapids" # inside src/features/phone_accelerometer
+            SRC_LANGUAGE: "python"
+
+        # 5) PANDA provider
+        PANDA:
+            # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER
+            COMPUTE: False
+            VALID_SENSED_MINUTES: False
+            # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER
+            FEATURES:
+                exertional_activity_episode: ["sumduration", "maxduration", "minduration", "avgduration", "medianduration", "stdduration"]
+                nonexertional_activity_episode: ["sumduration", "maxduration", "minduration", "avgduration", "medianduration", "stdduration"]
+            SRC_FOLDER: "panda" # inside src/features/phone_accelerometer
+            SRC_LANGUAGE: "python"
+
+
+

Sensor Parameters

+

Each sensor configuration section has a “parameters” subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS]. We explain these parameters in a table at the top of each sensor documentation page.

+

Sensor Providers

+

Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4) and PANDA (see #5).

+

Provider Parameters

+

Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider’s behavioral features.

+

We explain every provider’s parameter in a table under the Parameters description heading on each provider documentation page.

+

Provider Features

+

Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2). In either case, you can delete the features you are not interested in and they will not be included in the sensor’s output feature file.

+

We explain each behavioral feature in a table under the Features description heading on each provider documentation page.

+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/fitbit-heartrate-intraday/index.html b/0.3/features/fitbit-heartrate-intraday/index.html new file mode 100644 index 00000000..efadd2f1 --- /dev/null +++ b/0.3/features/fitbit-heartrate-intraday/index.html @@ -0,0 +1,1395 @@ + + + + + + + + + + + + + + + + + + + + + + + Fitbit Heart Rate Intraday - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Fitbit Heart Rate Intraday

+

Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file.
+

The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT. The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don’t have access to your participants’ Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together.

+

We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity).

+
Example of the structure of source data
+ + + + + + + + + + + + + + + + + + + + + +
device_idfitbit_data
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“activities-heart”:[{“dateTime”:”2020-10-07”,”value”:{“customHeartRateZones”:[],”heartRateZones”:[{“caloriesOut”:1200.6102,”max”:88,”min”:31,”minutes”:1058,”name”:”Out of Range”},{“caloriesOut”:760.3020,”max”:120,”min”:86,”minutes”:366,”name”:”Fat Burn”},{“caloriesOut”:15.2048,”max”:146,”min”:120,”minutes”:2,”name”:”Cardio”},{“caloriesOut”:0,”max”:221,”min”:148,”minutes”:0,”name”:”Peak”}],”restingHeartRate”:72}}],”activities-heart-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:68},{“time”:”00:01:00”,”value”:67},{“time”:”00:02:00”,”value”:67},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“activities-heart”:[{“dateTime”:”2020-10-08”,”value”:{“customHeartRateZones”:[],”heartRateZones”:[{“caloriesOut”:1100.1120,”max”:89,”min”:30,”minutes”:921,”name”:”Out of Range”},{“caloriesOut”:660.0012,”max”:118,”min”:82,”minutes”:361,”name”:”Fat Burn”},{“caloriesOut”:23.7088,”max”:142,”min”:108,”minutes”:3,”name”:”Cardio”},{“caloriesOut”:0,”max”:221,”min”:148,”minutes”:0,”name”:”Peak”}],”restingHeartRate”:70}}],”activities-heart-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:77},{“time”:”00:01:00”,”value”:75},{“time”:”00:02:00”,”value”:73},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“activities-heart”:[{“dateTime”:”2020-10-09”,”value”:{“customHeartRateZones”:[],”heartRateZones”:[{“caloriesOut”:750.3615,”max”:77,”min”:30,”minutes”:851,”name”:”Out of Range”},{“caloriesOut”:734.1516,”max”:107,”min”:77,”minutes”:550,”name”:”Fat Burn”},{“caloriesOut”:131.8579,”max”:130,”min”:107,”minutes”:29,”name”:”Cardio”},{“caloriesOut”:0,”max”:220,”min”:130,”minutes”:0,”name”:”Peak”}],”restingHeartRate”:69}}],”activities-heart-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:90},{“time”:”00:01:00”,”value”:89},{“time”:”00:02:00”,”value”:88},…],”datasetInterval”:1,”datasetType”:”minute”}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
device_idlocal_date_timeheartrateheartrate_zone
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 00:00:0068outofrange
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 00:01:0067outofrange
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 00:02:0067outofrange
+
+
+
+

RAPIDS provider

+
+

Available time segments

+
    +
  • Available for all time segments
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/fitbit_heartrate_intraday_raw.csv
+- data/raw/{pid}/fitbit_heartrate_intraday_parsed.csv
+- data/raw/{pid}/fitbit_heartrate_intraday_parsed_with_datetime.csv
+- data/interim/{pid}/fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_{language}_{provider_key}.csv
+- data/processed/features/{pid}/fitbit_heartrate_intraday.csv
+
+
+

Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider
[FEATURES]Features to be computed from heart rate intraday data, see table below
+

Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
maxhrbeats/minsThe maximum heart rate during a time segment.
minhrbeats/minsThe minimum heart rate during a time segment.
avghrbeats/minsThe average heart rate during a time segment.
medianhrbeats/minsThe median of heart rate during a time segment.
modehrbeats/minsThe mode of heart rate during a time segment.
stdhrbeats/minsThe standard deviation of heart rate during a time segment.
diffmaxmodehrbeats/minsThe difference between the maximum and mode heart rate during a time segment.
diffminmodehrbeats/minsThe difference between the mode and minimum heart rate during a time segment.
entropyhrnatsShannon’s entropy measurement based on heart rate during a time segment.
minutesonZONEminutesNumber of minutes the user’s heart rate fell within each heartrate_zone during a time segment.
+
+

Assumptions/Observations

+
    +
  1. There are four heart rate zones (ZONE): outofrange, fatburn, cardio, and peak. Please refer to Fitbit documentation for more information about the way they are computed.
  2. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/fitbit-heartrate-summary/index.html b/0.3/features/fitbit-heartrate-summary/index.html new file mode 100644 index 00000000..dec62033 --- /dev/null +++ b/0.3/features/fitbit-heartrate-summary/index.html @@ -0,0 +1,1442 @@ + + + + + + + + + + + + + + + + + + + + + + + Fitbit Heart Rate Summary - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Fitbit Heart Rate Summary

+

Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file.
+

The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT. The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don’t have access to your participants’ Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together.

+

We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity).

+
Example of the structure of source data
+ + + + + + + + + + + + + + + + + + + + + +
device_idfitbit_data
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“activities-heart”:[{“dateTime”:”2020-10-07”,”value”:{“customHeartRateZones”:[],”heartRateZones”:[{“caloriesOut”:1200.6102,”max”:88,”min”:31,”minutes”:1058,”name”:”Out of Range”},{“caloriesOut”:760.3020,”max”:120,”min”:86,”minutes”:366,”name”:”Fat Burn”},{“caloriesOut”:15.2048,”max”:146,”min”:120,”minutes”:2,”name”:”Cardio”},{“caloriesOut”:0,”max”:221,”min”:148,”minutes”:0,”name”:”Peak”}],”restingHeartRate”:72}}],”activities-heart-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:68},{“time”:”00:01:00”,”value”:67},{“time”:”00:02:00”,”value”:67},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“activities-heart”:[{“dateTime”:”2020-10-08”,”value”:{“customHeartRateZones”:[],”heartRateZones”:[{“caloriesOut”:1100.1120,”max”:89,”min”:30,”minutes”:921,”name”:”Out of Range”},{“caloriesOut”:660.0012,”max”:118,”min”:82,”minutes”:361,”name”:”Fat Burn”},{“caloriesOut”:23.7088,”max”:142,”min”:108,”minutes”:3,”name”:”Cardio”},{“caloriesOut”:0,”max”:221,”min”:148,”minutes”:0,”name”:”Peak”}],”restingHeartRate”:70}}],”activities-heart-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:77},{“time”:”00:01:00”,”value”:75},{“time”:”00:02:00”,”value”:73},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“activities-heart”:[{“dateTime”:”2020-10-09”,”value”:{“customHeartRateZones”:[],”heartRateZones”:[{“caloriesOut”:750.3615,”max”:77,”min”:30,”minutes”:851,”name”:”Out of Range”},{“caloriesOut”:734.1516,”max”:107,”min”:77,”minutes”:550,”name”:”Fat Burn”},{“caloriesOut”:131.8579,”max”:130,”min”:107,”minutes”:29,”name”:”Cardio”},{“caloriesOut”:0,”max”:220,”min”:130,”minutes”:0,”name”:”Peak”}],”restingHeartRate”:69}}],”activities-heart-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:90},{“time”:”00:01:00”,”value”:89},{“time”:”00:02:00”,”value”:88},…],”datasetInterval”:1,”datasetType”:”minute”}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
device_idlocal_date_timeheartrate_daily_restinghrheartrate_daily_caloriesoutofrangeheartrate_daily_caloriesfatburnheartrate_daily_caloriescardioheartrate_daily_caloriespeak
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07721200.6102760.302015.20480
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-08701100.1120660.001223.70880
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-0969750.3615734.1516131.85790
+
+
+
+

RAPIDS provider

+
+

Available time segments

+
    +
  • Only available for segments that span 1 or more complete days (e.g. Jan 1st 00:00 to Jan 3rd 23:59)
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/fitbit_heartrate_summary_raw.csv
+- data/raw/{pid}/fitbit_heartrate_summary_parsed.csv
+- data/raw/{pid}/fitbit_heartrate_summary_parsed_with_datetime.csv
+- data/interim/{pid}/fitbit_heartrate_summary_features/fitbit_heartrate_summary_{language}_{provider_key}.csv
+- data/processed/features/{pid}/fitbit_heartrate_summary.csv
+
+
+

Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider
[FEATURES]Features to be computed from heart rate summary data, see table below
+

Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
maxrestinghrbeats/minsThe maximum daily resting heart rate during a time segment.
minrestinghrbeats/minsThe minimum daily resting heart rate during a time segment.
avgrestinghrbeats/minsThe average daily resting heart rate during a time segment.
medianrestinghrbeats/minsThe median of daily resting heart rate during a time segment.
moderestinghrbeats/minsThe mode of daily resting heart rate during a time segment.
stdrestinghrbeats/minsThe standard deviation of daily resting heart rate during a time segment.
diffmaxmoderestinghrbeats/minsThe difference between the maximum and mode daily resting heart rate during a time segment.
diffminmoderestinghrbeats/minsThe difference between the mode and minimum daily resting heart rate during a time segment.
entropyrestinghrnatsShannon’s entropy measurement based on daily resting heart rate during a time segment.
sumcaloriesZONEcalsThe total daily calories burned within heartrate_zone during a time segment.
maxcaloriesZONEcalsThe maximum daily calories burned within heartrate_zone during a time segment.
mincaloriesZONEcalsThe minimum daily calories burned within heartrate_zone during a time segment.
avgcaloriesZONEcalsThe average daily calories burned within heartrate_zone during a time segment.
mediancaloriesZONEcalsThe median of daily calories burned within heartrate_zone during a time segment.
stdcaloriesZONEcalsThe standard deviation of daily calories burned within heartrate_zone during a time segment.
entropycaloriesZONEnatsShannon’s entropy measurement based on daily calories burned within heartrate_zone during a time segment.
+
+

Assumptions/Observations

+
    +
  1. +

    There are four heart rate zones (ZONE): outofrange, fatburn, cardio, and peak. Please refer to Fitbit documentation for more information about the way they are computed.

    +
  2. +
  3. +

    Calories’ accuracy depends on the users’ Fitbit profile (weight, height, etc.).

    +
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/fitbit-sleep-summary/index.html b/0.3/features/fitbit-sleep-summary/index.html new file mode 100644 index 00000000..f3ebf2b5 --- /dev/null +++ b/0.3/features/fitbit-sleep-summary/index.html @@ -0,0 +1,1585 @@ + + + + + + + + + + + + + + + + + + + + + + + Fitbit Sleep Summary - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Fitbit Sleep Summary

+

Sensor parameters description for [FITBIT_SLEEP_SUMMARY]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file.
+

The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT. The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don’t have access to your participants’ Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together.

+

We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity).

+
Example of the structure of source data with Fitbit’s sleep API Version 1
+ + + + + + + + + + + + + + + + + + + + + +
device_idfitbit_data
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“sleep”: [{“awakeCount”: 2, “awakeDuration”: 3, “awakeningsCount”: 10, “dateOfSleep”: “2020-10-07”, “duration”: 8100000, “efficiency”: 91, “endTime”: “2020-10-07T18:10:00.000”, “isMainSleep”: true, “logId”: 14147921940, “minuteData”: [{“dateTime”: “15:55:00”, “value”: “3”}, {“dateTime”: “15:56:00”, “value”: “3”}, {“dateTime”: “15:57:00”, “value”: “2”},…], “minutesAfterWakeup”: 0, “minutesAsleep”: 123, “minutesAwake”: 12, “minutesToFallAsleep”: 0, “restlessCount”: 8, “restlessDuration”: 9, “startTime”: “2020-10-07T15:55:00.000”, “timeInBed”: 135}, {“awakeCount”: 0, “awakeDuration”: 0, “awakeningsCount”: 1, “dateOfSleep”: “2020-10-07”, “duration”: 3780000, “efficiency”: 100, “endTime”: “2020-10-07T10:52:30.000”, “isMainSleep”: false, “logId”: 14144903977, “minuteData”: [{“dateTime”: “09:49:00”, “value”: “1”}, {“dateTime”: “09:50:00”, “value”: “1”}, {“dateTime”: “09:51:00”, “value”: “1”},…], “minutesAfterWakeup”: 1, “minutesAsleep”: 62, “minutesAwake”: 0, “minutesToFallAsleep”: 0, “restlessCount”: 1, “restlessDuration”: 1, “startTime”: “2020-10-07T09:49:00.000”, “timeInBed”: 63}], “summary”: {“totalMinutesAsleep”: 185, “totalSleepRecords”: 2, “totalTimeInBed”: 198}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“sleep”: [{“awakeCount”: 3, “awakeDuration”: 21, “awakeningsCount”: 16, “dateOfSleep”: “2020-10-08”, “duration”: 19260000, “efficiency”: 89, “endTime”: “2020-10-08T06:01:30.000”, “isMainSleep”: true, “logId”: 14150613895, “minuteData”: [{“dateTime”: “00:40:00”, “value”: “3”}, {“dateTime”: “00:41:00”, “value”: “3”}, {“dateTime”: “00:42:00”, “value”: “3”},…], “minutesAfterWakeup”: 0, “minutesAsleep”: 275, “minutesAwake”: 33, “minutesToFallAsleep”: 0, “restlessCount”: 13, “restlessDuration”: 25, “startTime”: “2020-10-08T00:40:00.000”, “timeInBed”: 321}], “summary”: {“totalMinutesAsleep”: 275, “totalSleepRecords”: 1, “totalTimeInBed”: 321}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“sleep”: [{“awakeCount”: 1, “awakeDuration”: 3, “awakeningsCount”: 8, “dateOfSleep”: “2020-10-09”, “duration”: 19320000, “efficiency”: 96, “endTime”: “2020-10-09T05:57:30.000”, “isMainSleep”: true, “logId”: 14161136803, “minuteData”: [{“dateTime”: “00:35:30”, “value”: “2”}, {“dateTime”: “00:36:30”, “value”: “1”}, {“dateTime”: “00:37:30”, “value”: “1”},…], “minutesAfterWakeup”: 0, “minutesAsleep”: 309, “minutesAwake”: 13, “minutesToFallAsleep”: 0, “restlessCount”: 7, “restlessDuration”: 10, “startTime”: “2020-10-09T00:35:30.000”, “timeInBed”: 322}], “summary”: {“totalMinutesAsleep”: 309, “totalSleepRecords”: 1, “totalTimeInBed”: 322}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
device_idlocal_start_date_timelocal_end_date_timeefficiencyminutes_after_wakeupminutes_asleepminutes_awakeminutes_to_fall_asleepminutes_in_bedis_main_sleeptypecount_awakeduration_awakecount_awakeningscount_restlessduration_restless
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 15:55:002020-10-07 18:10:009101231201351classic231089
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 09:49:002020-10-07 10:52:3010016200630classic00111
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-08 00:40:002020-10-08 06:01:308902753303211classic321161325
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-09 00:35:302020-10-09 05:57:309603091303221classic138710
+
+
+
+
Example of the structure of source data with Fitbit’s sleep API Version 1.2
+ + + + + + + + + + + + + + + + + + + + + +
device_idfitbit_data
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“sleep”:[{“dateOfSleep”:”2020-10-10”,”duration”:3600000,”efficiency”:92,”endTime”:”2020-10-10T16:37:00.000”,”infoCode”:2,”isMainSleep”:false,”levels”:{“data”:[{“dateTime”:”2020-10-10T15:36:30.000”,”level”:”restless”,”seconds”:60},{“dateTime”:”2020-10-10T15:37:30.000”,”level”:”asleep”,”seconds”:660},{“dateTime”:”2020-10-10T15:48:30.000”,”level”:”restless”,”seconds”:60},…], “summary”:{“asleep”:{“count”:0,”minutes”:56},”awake”:{“count”:0,”minutes”:0},”restless”:{“count”:3,”minutes”:4}}},”logId”:26315914306,”minutesAfterWakeup”:0,”minutesAsleep”:55,”minutesAwake”:5,”minutesToFallAsleep”:0,”startTime”:”2020-10-10T15:36:30.000”,”timeInBed”:60,”type”:”classic”},{“dateOfSleep”:”2020-10-10”,”duration”:22980000,”efficiency”:88,”endTime”:”2020-10-10T08:10:00.000”,”infoCode”:0,”isMainSleep”:true,”levels”:{“data”:[{“dateTime”:”2020-10-10T01:46:30.000”,”level”:”light”,”seconds”:420},{“dateTime”:”2020-10-10T01:53:30.000”,”level”:”deep”,”seconds”:1230},{“dateTime”:”2020-10-10T02:14:00.000”,”level”:”light”,”seconds”:360},…], “summary”:{“deep”:{“count”:3,”minutes”:92,”thirtyDayAvgMinutes”:0},”light”:{“count”:29,”minutes”:193,”thirtyDayAvgMinutes”:0},”rem”:{“count”:4,”minutes”:33,”thirtyDayAvgMinutes”:0},”wake”:{“count”:28,”minutes”:65,”thirtyDayAvgMinutes”:0}}},”logId”:26311786557,”minutesAfterWakeup”:0,”minutesAsleep”:318,”minutesAwake”:65,”minutesToFallAsleep”:0,”startTime”:”2020-10-10T01:46:30.000”,”timeInBed”:383,”type”:”stages”}],”summary”:{“stages”:{“deep”:92,”light”:193,”rem”:33,”wake”:65},”totalMinutesAsleep”:373,”totalSleepRecords”:2,”totalTimeInBed”:443}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“sleep”:[{“dateOfSleep”:”2020-10-11”,”duration”:41640000,”efficiency”:89,”endTime”:”2020-10-11T11:47:00.000”,”infoCode”:0,”isMainSleep”:true,”levels”:{“data”:[{“dateTime”:”2020-10-11T00:12:30.000”,”level”:”wake”,”seconds”:450},{“dateTime”:”2020-10-11T00:20:00.000”,”level”:”light”,”seconds”:870},{“dateTime”:”2020-10-11T00:34:30.000”,”level”:”wake”,”seconds”:780},…], “summary”:{“deep”:{“count”:4,”minutes”:52,”thirtyDayAvgMinutes”:62},”light”:{“count”:32,”minutes”:442,”thirtyDayAvgMinutes”:364},”rem”:{“count”:6,”minutes”:68,”thirtyDayAvgMinutes”:58},”wake”:{“count”:29,”minutes”:132,”thirtyDayAvgMinutes”:94}}},”logId”:26589710670,”minutesAfterWakeup”:1,”minutesAsleep”:562,”minutesAwake”:132,”minutesToFallAsleep”:0,”startTime”:”2020-10-11T00:12:30.000”,”timeInBed”:694,”type”:”stages”}],”summary”:{“stages”:{“deep”:52,”light”:442,”rem”:68,”wake”:132},”totalMinutesAsleep”:562,”totalSleepRecords”:1,”totalTimeInBed”:694}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524{“sleep”:[{“dateOfSleep”:”2020-10-12”,”duration”:28980000,”efficiency”:93,”endTime”:”2020-10-12T09:34:30.000”,”infoCode”:0,”isMainSleep”:true,”levels”:{“data”:[{“dateTime”:”2020-10-12T01:31:00.000”,”level”:”wake”,”seconds”:600},{“dateTime”:”2020-10-12T01:41:00.000”,”level”:”light”,”seconds”:60},{“dateTime”:”2020-10-12T01:42:00.000”,”level”:”deep”,”seconds”:2340},…], “summary”:{“deep”:{“count”:4,”minutes”:63,”thirtyDayAvgMinutes”:59},”light”:{“count”:27,”minutes”:257,”thirtyDayAvgMinutes”:364},”rem”:{“count”:5,”minutes”:94,”thirtyDayAvgMinutes”:58},”wake”:{“count”:24,”minutes”:69,”thirtyDayAvgMinutes”:95}}},”logId”:26589710673,”minutesAfterWakeup”:0,”minutesAsleep”:415,”minutesAwake”:68,”minutesToFallAsleep”:0,”startTime”:”2020-10-12T01:31:00.000”,”timeInBed”:483,”type”:”stages”}],”summary”:{“stages”:{“deep”:63,”light”:257,”rem”:94,”wake”:69},”totalMinutesAsleep”:415,”totalSleepRecords”:1,”totalTimeInBed”:483}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
device_idlocal_start_date_timelocal_end_date_timeefficiencyminutes_after_wakeupminutes_asleepminutes_awakeminutes_to_fall_asleepminutes_in_bedis_main_sleeptype
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-10 15:36:302020-10-10 16:37:009205550600classic
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-10 01:46:302020-10-10 08:10:008803186503831stages
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-11 00:12:302020-10-11 11:47:0089156213206941stages
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-12 01:31:002020-10-12 09:34:309304156804831stages
+
+
+
+

RAPIDS provider

+
+

Available time segments

+
    +
  • Only available for segments that span 1 or more complete days (e.g. Jan 1st 00:00 to Jan 3rd 23:59)
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/fitbit_sleep_summary_raw.csv
+- data/raw/{pid}/fitbit_sleep_summary_parsed.csv
+- data/raw/{pid}/fitbit_sleep_summary_parsed_with_datetime.csv
+- data/interim/{pid}/fitbit_sleep_summary_features/fitbit_sleep_summary_{language}_{provider_key}.csv
+- data/processed/features/{pid}/fitbit_sleep_summary.csv
+
+
+

Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider
[SLEEP_TYPES]Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main, nap, all.
[FEATURES]Features to be computed from sleep summary data, see table below
+

Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countepisodeTYPEepisodesNumber of sleep episodes for a certain sleep type during a time segment.
avgefficiencyTYPEscoresAverage sleep efficiency for a certain sleep type during a time segment.
sumdurationafterwakeupTYPEminutesTotal duration the user stayed in bed after waking up for a certain sleep type during a time segment.
sumdurationasleepTYPEminutesTotal sleep duration for a certain sleep type during a time segment.
sumdurationawakeTYPEminutesTotal duration the user stayed awake but still in bed for a certain sleep type during a time segment.
sumdurationtofallasleepTYPEminutesTotal duration the user spent to fall asleep for a certain sleep type during a time segment.
sumdurationinbedTYPEminutesTotal duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment.
avgdurationafterwakeupTYPEminutesAverage duration the user stayed in bed after waking up for a certain sleep type during a time segment.
avgdurationasleepTYPEminutesAverage sleep duration for a certain sleep type during a time segment.
avgdurationawakeTYPEminutesAverage duration the user stayed awake but still in bed for a certain sleep type during a time segment.
avgdurationtofallasleepTYPEminutesAverage duration the user spent to fall asleep for a certain sleep type during a time segment.
avgdurationinbedTYPEminutesAverage duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment.
+
+

Assumptions/Observations

+
    +
  1. +

    There are three sleep types (TYPE): main, nap, all. The all type contains both main sleep and naps.

    +
  2. +
  3. +

    There are two versions of Fitbit’s sleep API (version 1 and version 1.2), and each provides raw sleep data in a different format:

    +
      +
    • Count & duration summaries. v1 contains count_awake, duration_awake, count_awakenings, count_restless, and duration_restless fields for every sleep record but v1.2 does not.
    • +
    +
  4. +
  5. +

    API columns. Features are computed based on the values provided by Fitbit’s API: efficiency, minutes_after_wakeup, minutes_asleep, minutes_awake, minutes_to_fall_asleep, minutes_in_bed, is_main_sleep and type.

    +
  6. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/fitbit-steps-intraday/index.html b/0.3/features/fitbit-steps-intraday/index.html new file mode 100644 index 00000000..4c06cde5 --- /dev/null +++ b/0.3/features/fitbit-steps-intraday/index.html @@ -0,0 +1,1434 @@ + + + + + + + + + + + + + + + + + + + + + + + Fitbit Steps Intraday - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Fitbit Steps Intraday

+

Sensor parameters description for [FITBIT_STEPS_INTRADAY]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file.
+

The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT. The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don’t have access to your participants’ Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together.

+

We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity).

+
Example of the structure of source data
+ + + + + + + + + + + + + + + + + + + + + +
device_idfitbit_data
a748ee1a-1d0b-4ae9-9074-279a2b6ba524“activities-steps”:[{“dateTime”:”2020-10-07”,”value”:”1775”}],”activities-steps-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:5},{“time”:”00:01:00”,”value”:3},{“time”:”00:02:00”,”value”:0},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524“activities-steps”:[{“dateTime”:”2020-10-08”,”value”:”3201”}],”activities-steps-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:14},{“time”:”00:01:00”,”value”:11},{“time”:”00:02:00”,”value”:10},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524“activities-steps”:[{“dateTime”:”2020-10-09”,”value”:”998”}],”activities-steps-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:0},{“time”:”00:01:00”,”value”:0},{“time”:”00:02:00”,”value”:0},…],”datasetInterval”:1,”datasetType”:”minute”}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
device_idlocal_date_timesteps
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 00:00:005
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 00:01:003
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-07 00:02:000
+
+
+
+

RAPIDS provider

+
+

Available time segments

+
    +
  • Available for all time segments
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/fitbit_steps_intraday_raw.csv
+- data/raw/{pid}/fitbit_steps_intraday_parsed.csv
+- data/raw/{pid}/fitbit_steps_intraday_parsed_with_datetime.csv
+- data/interim/{pid}/fitbit_steps_intraday_features/fitbit_steps_intraday_{language}_{provider_key}.csv
+- data/processed/features/{pid}/fitbit_steps_intraday.csv
+
+
+

Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider
[FEATURES]Features to be computed from steps intraday data, see table below
[THRESHOLD_ACTIVE_BOUT]Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active.
[INCLUDE_ZERO_STEP_ROWS]Whether or not to include time segments with a 0 step count during the whole day.
+

Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
sumstepsstepsThe total step count during a time segment.
maxstepsstepsThe maximum step count during a time segment.
minstepsstepsThe minimum step count during a time segment.
avgstepsstepsThe average step count during a time segment.
stdstepsstepsThe standard deviation of step count during a time segment.
countepisodesedentaryboutboutsNumber of sedentary bouts during a time segment.
sumdurationsedentaryboutminutesTotal duration of all sedentary bouts during a time segment.
maxdurationsedentaryboutminutesThe maximum duration of any sedentary bout during a time segment.
mindurationsedentaryboutminutesThe minimum duration of any sedentary bout during a time segment.
avgdurationsedentaryboutminutesThe average duration of sedentary bouts during a time segment.
stddurationsedentaryboutminutesThe standard deviation of the duration of sedentary bouts during a time segment.
countepisodeactiveboutboutsNumber of active bouts during a time segment.
sumdurationactiveboutminutesTotal duration of all active bouts during a time segment.
maxdurationactiveboutminutesThe maximum duration of any active bout during a time segment.
mindurationactiveboutminutesThe minimum duration of any active bout during a time segment.
avgdurationactiveboutminutesThe average duration of active bouts during a time segment.
stddurationactiveboutminutesThe standard deviation of the duration of active bouts during a time segment.
+
+

Assumptions/Observations

+
    +
  1. Active and sedentary bouts. If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary.
  2. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/fitbit-steps-summary/index.html b/0.3/features/fitbit-steps-summary/index.html new file mode 100644 index 00000000..7cbad13a --- /dev/null +++ b/0.3/features/fitbit-steps-summary/index.html @@ -0,0 +1,1364 @@ + + + + + + + + + + + + + + + + + + + + + + + Fitbit Steps Summary - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Fitbit Steps Summary

+

Sensor parameters description for [FITBIT_STEPS_SUMMARY]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file.
+

The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT. The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don’t have access to your participants’ Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together.

+

We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity).

+
Example of the structure of source data
+ + + + + + + + + + + + + + + + + + + + + +
device_idfitbit_data
a748ee1a-1d0b-4ae9-9074-279a2b6ba524“activities-steps”:[{“dateTime”:”2020-10-07”,”value”:”1775”}],”activities-steps-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:5},{“time”:”00:01:00”,”value”:3},{“time”:”00:02:00”,”value”:0},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524“activities-steps”:[{“dateTime”:”2020-10-08”,”value”:”3201”}],”activities-steps-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:14},{“time”:”00:01:00”,”value”:11},{“time”:”00:02:00”,”value”:10},…],”datasetInterval”:1,”datasetType”:”minute”}}
a748ee1a-1d0b-4ae9-9074-279a2b6ba524“activities-steps”:[{“dateTime”:”2020-10-09”,”value”:”998”}],”activities-steps-intraday”:{“dataset”:[{“time”:”00:00:00”,”value”:0},{“time”:”00:01:00”,”value”:0},{“time”:”00:02:00”,”value”:0},…],”datasetInterval”:1,”datasetType”:”minute”}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
device_idlocal_date_timesteps
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-071775
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-083201
a748ee1a-1d0b-4ae9-9074-279a2b6ba5242020-10-09998
+
+
+
+

RAPIDS provider

+
+

Available time segments

+
    +
  • Only available for segments that span 1 or more complete days (e.g. Jan 1st 00:00 to Jan 3rd 23:59)
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/fitbit_steps_summary_raw.csv
+- data/raw/{pid}/fitbit_steps_summary_parsed.csv
+- data/raw/{pid}/fitbit_steps_summary_parsed_with_datetime.csv
+- data/interim/{pid}/fitbit_steps_summary_features/fitbit_steps_summary_{language}_{provider_key}.csv
+- data/processed/features/{pid}/fitbit_steps_summary.csv
+
+
+

Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider
[FEATURES]Features to be computed from steps summary data, see table below
+

Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
maxsumstepsstepsThe maximum daily step count during a time segment.
minsumstepsstepsThe minimum daily step count during a time segment.
avgsumstepsstepsThe average daily step count during a time segment.
mediansumstepsstepsThe median of daily step count during a time segment.
stdsumstepsstepsThe standard deviation of daily step count during a time segment.
+
+

Assumptions/Observations

+

NA

+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-accelerometer/index.html b/0.3/features/phone-accelerometer/index.html new file mode 100644 index 00000000..f34340fb --- /dev/null +++ b/0.3/features/phone-accelerometer/index.html @@ -0,0 +1,1409 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Accelerometer - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Accelerometer

+

Sensor parameters description for [PHONE_ACCELEROMETER]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the accelerometer data is stored
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_accelerometer_raw.csv
+- data/raw/{pid}/phone_accelerometer_with_datetime.csv
+- data/interim/{pid}/phone_accelerometer_features/phone_accelerometer_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_accelerometer.csv
+
+
+

Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
+

Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
maxmagnitudem/s2The maximum magnitude of acceleration (\(\|acceleration\| = \sqrt{x^2 + y^2 + z^2}\)).
minmagnitudem/s2The minimum magnitude of acceleration.
avgmagnitudem/s2The average magnitude of acceleration.
medianmagnitudem/s2The median magnitude of acceleration.
stdmagnitudem/s2The standard deviation of acceleration.
+
+

Assumptions/Observations

+
    +
  1. Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.
  2. +
+
+

PANDA provider

+

These features are based on the work by Panda et al.

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_accelerometer_raw.csv
+- data/raw/{pid}/phone_accelerometer_with_datetime.csv
+- data/interim/{pid}/phone_accelerometer_features/phone_accelerometer_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_accelerometer.csv
+
+
+

Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider
[FEATURES]Features to be computed for exertional and non-exertional activity episodes, see table below
+

Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
sumdurationminutesTotal duration of all exertional or non-exertional activity episodes.
maxdurationminutesLongest duration of any exertional or non-exertional activity episode.
mindurationminutesShortest duration of any exertional or non-exertional activity episode.
avgdurationminutesAverage duration of any exertional or non-exertional activity episode.
mediandurationminutesMedian duration of any exertional or non-exertional activity episode.
stddurationminutesStandard deviation of the duration of all exertional or non-exertional activity episodes.
+
+

Assumptions/Observations

+
    +
  1. Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.
  2. +
  3. See Panda et al for a definition of exertional and non-exertional activity episodes
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-activity-recognition/index.html b/0.3/features/phone-activity-recognition/index.html new file mode 100644 index 00000000..daa2276b --- /dev/null +++ b/0.3/features/phone-activity-recognition/index.html @@ -0,0 +1,1385 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Activity Recognition - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Activity Recognition

+

Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION]:

+ + + + + + + + + + + + + + + + + + + + + +
Key                                                              Description
[TABLE][ANDROID]Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS)
[TABLE][IOS]Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)
[EPISODE_THRESHOLD_BETWEEN_ROWS]Difference in minutes between any two rows for them to be considered part of the same activity episode
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_activity_recognition_raw.csv
+- data/raw/{pid}/phone_activity_recognition_with_datetime.csv
+- data/raw/{pid}/phone_activity_recognition_with_datetime_unified.csv
+- data/interim/{pid}/phone_activity_recognition_episodes.csv
+- data/interim/{pid}/phone_activity_recognition_episodes_resampled.csv
+- data/interim/{pid}/phone_activity_recognition_episodes_resampled_with_datetime.csv
+- data/interim/{pid}/phone_activity_recognition_features/phone_activity_recognition_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_activity_recognition.csv
+
+
+

Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
[ACTIVITY_CLASSES][STATIONARY]An array of the activity labels to be considered in the STATIONARY category choose any of still, tilting
[ACTIVITY_CLASSES][MOBILE]An array of the activity labels to be considered in the MOBILE category choose any of on_foot, walking, running, on_bicycle
[ACTIVITY_CLASSES][VEHICLE]An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule
+

Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countrowsNumber of episodes.
mostcommonactivityactivity typeThe most common activity type (e.g. still, on_foot, etc.). If there is a tie, the first one is chosen.
countuniqueactivitiesactivity typeNumber of unique activities.
durationstationaryminutesThe total duration of [ACTIVITY_CLASSES][STATIONARY] episodes
durationmobileminutesThe total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities
durationvehicleminutesThe total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity
+
+

Assumptions/Observations

+
    +
  1. +

    iOS Activity Recognition names and types are unified with Android labels:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    iOS Activity NameAndroid Activity NameAndroid Activity Type
    walkingwalking7
    runningrunning8
    cyclingon_bicycle1
    automotivein_vehicle0
    stationarystill3
    unknownunknown4
    +
  2. +
  3. +

    In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file.

    +
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-applications-foreground/index.html b/0.3/features/phone-applications-foreground/index.html new file mode 100644 index 00000000..b173fdcf --- /dev/null +++ b/0.3/features/phone-applications-foreground/index.html @@ -0,0 +1,1343 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Applications Foreground - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Applications Foreground

+

Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the applications foreground data is stored
[APPLICATION_CATEGORIES][CATALOGUE_SOURCE]FILE or GOOGLE. If FILE, app categories (genres) are read from [CATALOGUE_FILE]. If [GOOGLE], app categories (genres) are scrapped from the Play Store
[APPLICATION_CATEGORIES][CATALOGUE_FILE]CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv
[APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE]if [CATALOGUE_SOURCE] is equal to FILE, this flag signals whether or not to update [CATALOGUE_FILE], if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE]
[APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES]This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE]. If [CATALOGUE_SOURCE] is equal to GOOGLE, all genres are scraped anyway (this flag is ignored)
+

RAPIDS provider

+

The app category (genre) catalogue used in these features was originally created by Stachl et al.

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_applications_foreground_raw.csv
+- data/raw/{pid}/phone_applications_foreground_with_datetime.csv
+- data/raw/{pid}/phone_applications_foreground_with_datetime_with_categories.csv
+- data/interim/{pid}/phone_applications_foreground_features/phone_applications_foreground_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_applications_foreground.csv
+
+
+

Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                                        Description
[COMPUTE]Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
[SINGLE_CATEGORIES]An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above)
[MULTIPLE_CATEGORIES]An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above)
[SINGLE_APPS]An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study)
[EXCLUDED_CATEGORIES]An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above)
[EXCLUDED_APPS]An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube
+

Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countappsNumber of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app)
timeoffirstuseminutesThe time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment
timeoflastuseminutesThe time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment
frequencyentropynatsThe entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app
+
+

Assumptions/Observations

+

Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories).

+

Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where “genre” == EXCLUDED_CATEGORIES or “package_name” == EXCLUDED_APPS.

+

We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS (data/external/stachl_application_genre_catalogue.csv), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).

+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-battery/index.html b/0.3/features/phone-battery/index.html new file mode 100644 index 00000000..25c099ae --- /dev/null +++ b/0.3/features/phone-battery/index.html @@ -0,0 +1,1322 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Battery - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Battery

+

Sensor parameters description for [PHONE_BATTERY]:

+ + + + + + + + + + + + + + + + + +
Key                                                              Description
[TABLE]Database table where the battery data is stored
[EPISODE_THRESHOLD_BETWEEN_ROWS]Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_battery_raw.csv
+- data/interim/{pid}/phone_battery_episodes.csv
+- data/interim/{pid}/phone_battery_episodes_resampled.csv
+- data/interim/{pid}/phone_battery_episodes_resampled_with_datetime.csv
+- data/interim/{pid}/phone_battery_features/phone_battery_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_battery.csv
+
+
+

Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_BATTERY features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
+

Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countdischargeepisodesNumber of discharging episodes.
sumdurationdischargeminutesThe total duration of all discharging episodes.
countchargeepisodesNumber of battery charging episodes.
sumdurationchargeminutesThe total duration of all charging episodes.
avgconsumptionrateepisodes/minutesThe average of all episodes’ consumption rates. An episode’s consumption rate is defined as the ratio between its battery delta and duration
maxconsumptionrateepisodes/minutesThe highest of all episodes’ consumption rates. An episode’s consumption rate is defined as the ratio between its battery delta and duration
+
+

Assumptions/Observations

+
    +
  1. We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3
  2. +
  3. We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-bluetooth/index.html b/0.3/features/phone-bluetooth/index.html new file mode 100644 index 00000000..8e153b35 --- /dev/null +++ b/0.3/features/phone-bluetooth/index.html @@ -0,0 +1,1483 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Bluetooth - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Bluetooth

+

Sensor parameters description for [PHONE_BLUETOOTH]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the bluetooth data is stored
+

RAPIDS provider

+
+

Warning

+

The features of this provider are deprecated in favor of DORYAB provider (see below).

+
+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_bluetooth_raw.csv
+- data/raw/{pid}/phone_bluetooth_with_datetime.csv
+- data/interim/{pid}/phone_bluetooth_features/phone_bluetooth_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_bluetooth.csv"
+
+
+

Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
+

Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countscansdevicesNumber of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately
uniquedevicesdevicesNumber of unique devices during a time segment as identified by their hardware (bt_address) address
countscansmostuniquedevicescansNumber of scans of the most sensed device within each time segment instance
+
+

Assumptions/Observations

+
    +
  • From v0.2.0 countscans, uniquedevices, countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider
  • +
+
+

DORYAB provider

+

This provider is adapted from the work by Doryab et al.

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_bluetooth_raw.csv
+- data/raw/{pid}/phone_bluetooth_with_datetime.csv
+- data/interim/{pid}/phone_bluetooth_features/phone_bluetooth_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_bluetooth.csv"
+
+
+

Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider
[FEATURES]Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices.
+

Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Feature                                                                                  UnitsDescription
countscansscansNumber of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant’s phone
uniquedevicesdevicesNumber of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses (bt_address)
meanscansscansMean of the scans of every sensed device within each time segment instance
stdscansscansStandard deviation of the scans of every sensed device within each time segment instance
countscansmostfrequentdevicewithinsegmentsscansNumber of scans of the most sensed device within each time segment instance
countscansleastfrequentdevicewithinsegmentsscansNumber of scans of the least sensed device within each time segment instance
countscansmostfrequentdeviceacrosssegmentsscansNumber of scans of the most sensed device across time segment instances of the same type
countscansleastfrequentdeviceacrosssegmentsscansNumber of scans of the least sensed device across time segment instances of the same type per device
countscansmostfrequentdeviceacrossdatasetscansNumber of scans of the most sensed device across the entire dataset of every participant
countscansleastfrequentdeviceacrossdatasetscansNumber of scans of the least sensed device across the entire dataset of every participant
+
+

Assumptions/Observations

+
    +
  • Devices are classified as belonging to the participant (own) or to other people (others) using k-means based on the number of times and the number of days each device was detected across each participant’s dataset. See Doryab et al for more details.
  • +
  • If ownership cannot be computed because all devices were detected on only one day, they are all considered as other. Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have.
  • +
  • The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don’t.
  • +
+
Example
Simplified raw bluetooth data

The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. +

local_date  segment     bt_address                              own_device
+2016-11-29  morning     55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2016-11-29  morning     55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2016-11-29  morning     55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2016-11-29  morning     55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2016-11-29  morning     48872A52-68DE-420D-98DA-73339A1C4685              0
+2016-11-29  afternoon   55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2016-11-29  afternoon   48872A52-68DE-420D-98DA-73339A1C4685              0
+2016-11-30  morning     55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2016-11-30  morning     48872A52-68DE-420D-98DA-73339A1C4685              0
+2016-11-30  morning     25262DC7-780C-4AD5-AD3A-D9776AEF7FC1              0
+2016-11-30  morning     5B1E6981-2E50-4D9A-99D8-67AED430C5A8              0
+2016-11-30  morning     5B1E6981-2E50-4D9A-99D8-67AED430C5A8              0
+2016-11-30  afternoon   55C836F5-487E-405F-8E28-21DBD40FA4FF              1
+2017-05-07  morning     5C5A9C41-2F68-4CEB-96D0-77DE3729B729              0
+2017-05-07  morning     25262DC7-780C-4AD5-AD3A-D9776AEF7FC1              0
+2017-05-07  morning     5B1E6981-2E50-4D9A-99D8-67AED430C5A8              0
+2017-05-07  morning     6C444841-FE64-4375-BC3F-FA410CDC0AC7              0
+2017-05-07  morning     4DC7A22D-9F1F-4DEF-8576-086910AABCB5              0
+2017-05-07  afternoon   5B1E6981-2E50-4D9A-99D8-67AED430C5A8              0
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+2017-05-07  afternoon   499A1EAF-DDF1-4657-986C-EA5032104448              1
+

+
+
The most and least frequent OTHER devices (own_device == 0) during morning segments

The most and least frequent ALL|OWN|OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. +

most frequent device across 2016-11-29 morning:   '48872A52-68DE-420D-98DA-73339A1C4685'  (this device is the only one in this instance)
+least frequent device across 2016-11-29 morning:  '48872A52-68DE-420D-98DA-73339A1C4685'  (this device is the only one in this instance)
+most frequent device across 2016-11-30 morning:   '5B1E6981-2E50-4D9A-99D8-67AED430C5A8'
+least frequent device across 2016-11-30 morning:  '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1'  (when tied, the first occurance is chosen)
+most frequent device across 2017-05-07 morning:   '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1'  (when tied, the first occurance is chosen)
+least frequent device across 2017-05-07 morning:  '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1'  (when tied, the first occurance is chosen)
+
+most frequent across morning segments:            '5B1E6981-2E50-4D9A-99D8-67AED430C5A8'
+least frequent across morning segments:           '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen)
+
+most frequent across dataset:                     '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account "morning" segments)
+least frequent across dataset:                    '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen)
+

+
+
Bluetooth features for OTHER devices and morning segments

For brevity we only show the following features for morning segments: +

OTHER: 
+    DEVICES: ["countscans", "uniquedevices", "meanscans", "stdscans"]
+    SCANS_MOST_FREQUENT_DEVICE: ["withinsegments", "acrosssegments", "acrossdataset"]
+

+

Note that countscansmostfrequentdeviceacrossdatasetothers is all 0s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other). +

local_segment       countscansothers    uniquedevicesothers meanscansothers stdscansothers  countscansmostfrequentdevicewithinsegmentsothers    countscansmostfrequentdeviceacrosssegmentsothers    countscansmostfrequentdeviceacrossdatasetothers
+2016-11-29-morning  1                   1                   1.000000        NaN             1                                                   0.0                                                 0.0
+2016-11-30-morning  4                   3                   1.333333        0.57735         2                                                   2.0                                                 2.0
+2017-05-07-morning  5                   5                   1.000000        0.00000         1                                                   1.0                                                 1.0
+

+
+
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-calls/index.html b/0.3/features/phone-calls/index.html new file mode 100644 index 00000000..41290c9e --- /dev/null +++ b/0.3/features/phone-calls/index.html @@ -0,0 +1,1389 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Calls - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Calls

+

Sensor parameters description for [PHONE_CALLS]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the calls data is stored
+

RAPIDS Provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_calls_raw.csv
+- data/raw/{pid}/phone_calls_with_datetime.csv
+- data/raw/{pid}/phone_calls_with_datetime_unified.csv
+- data/interim/{pid}/phone_calls_features/phone_calls_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_calls.csv
+
+
+

Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + +
Key                       Description
[COMPUTE]Set to True to extract PHONE_CALLS features from the RAPIDS provider
[CALL_TYPES]The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed.
[FEATURES]Features to be computed for outgoing, incoming, and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below.
+

Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countcallsNumber of calls of a particular call_type occurred during a particular time_segment.
distinctcontactscontactsNumber of distinct contacts that are associated with a particular call_type for a particular time_segment
meandurationsecondsThe mean duration of all calls of a particular call_type during a particular time_segment.
sumdurationsecondsThe sum of the duration of all calls of a particular call_type during a particular time_segment.
mindurationsecondsThe duration of the shortest call of a particular call_type during a particular time_segment.
maxdurationsecondsThe duration of the longest call of a particular call_type during a particular time_segment.
stddurationsecondsThe standard deviation of the duration of all the calls of a particular call_type during a particular time_segment.
modedurationsecondsThe mode of the duration of all the calls of a particular call_type during a particular time_segment.
entropydurationnatsThe estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment.
timefirstcallminutesThe time in minutes between 12:00am (midnight) and the first call of call_type.
timelastcallminutesThe time in minutes between 12:00am (midnight) and the last call of call_type.
countmostfrequentcontactcallsThe number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period.
+

Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countcallsNumber of missed calls that occurred during a particular time_segment.
distinctcontactscontactsNumber of distinct contacts that are associated with missed calls for a particular time_segment
timefirstcallminutesThe time in hours from 12:00am (Midnight) that the first missed call occurred.
timelastcallminutesThe time in hours from 12:00am (Midnight) that the last missed call occurred.
countmostfrequentcontactcallsThe number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period.
+
+

Assumptions/Observations

+
    +
  1. Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces.
  2. +
  3. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing
  4. +
  5. iOS calls data is transformed to match Android calls data format. See our algorithm
  6. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-conversation/index.html b/0.3/features/phone-conversation/index.html new file mode 100644 index 00000000..04f4746c --- /dev/null +++ b/0.3/features/phone-conversation/index.html @@ -0,0 +1,1443 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Conversation - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Conversation

+

Sensor parameters description for [PHONE_CONVERSATION]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[TABLE][ANDROID]Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS)
[TABLE][IOS]Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_conversation_raw.csv
+- data/raw/{pid}/phone_conversation_with_datetime.csv
+- data/raw/{pid}/phone_conversation_with_datetime_unified.csv
+- data/interim/{pid}/phone_conversation_features/phone_conversation_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_conversation.csv
+
+
+

Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
[RECORDING_MINUTES]Minutes the plugin was recording audio (default 1 min)
[PAUSED_MINUTES]Minutes the plugin was NOT recording audio (default 3 min)
+

Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
minutessilenceminutesMinutes labeled as silence
minutesnoiseminutesMinutes labeled as noise
minutesvoiceminutesMinutes labeled as voice
minutesunknownminutesMinutes labeled as unknown
sumconversationdurationminutesTotal duration of all conversations
maxconversationdurationminutesLongest duration of all conversations
minconversationdurationminutesShortest duration of all conversations
avgconversationdurationminutesAverage duration of all conversations
sdconversationdurationminutesStandard Deviation of the duration of all conversations
timefirstconversationminutesMinutes since midnight when the first conversation for a time segment was detected
timelastconversationminutesMinutes since midnight when the last conversation for a time segment was detected
noisesumenergyL2-normSum of all energy values when inference is noise
noiseavgenergyL2-normAverage of all energy values when inference is noise
noisesdenergyL2-normStandard Deviation of all energy values when inference is noise
noiseminenergyL2-normMinimum of all energy values when inference is noise
noisemaxenergyL2-normMaximum of all energy values when inference is noise
voicesumenergyL2-normSum of all energy values when inference is voice
voiceavgenergyL2-normAverage of all energy values when inference is voice
voicesdenergyL2-normStandard Deviation of all energy values when inference is voice
voiceminenergyL2-normMinimum of all energy values when inference is voice
voicemaxenergyL2-normMaximum of all energy values when inference is voice
silencesensedfraction-Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown)
noisesensedfraction-Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown)
voicesensedfraction-Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown)
unknownsensedfraction-Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown)
silenceexpectedfraction-Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes)
noiseexpectedfraction-Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes)
voiceexpectedfraction-Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes)
unknownexpectedfraction-Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes)
+
+

Assumptions/Observations

+
    +
  1. The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android’s format
  2. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-data-yield/index.html b/0.3/features/phone-data-yield/index.html new file mode 100644 index 00000000..8801fab2 --- /dev/null +++ b/0.3/features/phone-data-yield/index.html @@ -0,0 +1,1336 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Data Yield - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Data Yield

+

This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows (time segments) that do not contain enough data. You should decide what is your “enough” threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle.

+
+

Why is data yield important?

+

Imagine that you want to extract PHONE_CALL features on daily segments (00:00 to 23:59). Let’s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It’s more likely that other calls were placed on the 22 hours of data that you didn’t log on day 2 than on the 1 hour of data you didn’t log on day 1, and so including day 2 in your analysis could bias your results.

+
+

Sensor parameters description for [PHONE_DATA_YIELD]:

+ + + + + + + + + + + + + +
Key                   Description
[SENSORS]One or more phone sensor config keys (e.g. PHONE_MESSAGE). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below (do NOT include Fitbit sensors).
+
+

Supported phone sensors for [PHONE_DATA_YIELD][SENSORS]

+
PHONE_ACCELEROMETER
+PHONE_ACTIVITY_RECOGNITION
+PHONE_APPLICATIONS_FOREGROUND
+PHONE_BATTERY
+PHONE_BLUETOOTH
+PHONE_CALLS
+PHONE_CONVERSATION
+PHONE_MESSAGES
+PHONE_LIGHT
+PHONE_LOCATIONS
+PHONE_SCREEN
+PHONE_WIFI_VISIBLE
+PHONE_WIFI_CONNECTED
+
+
+

RAPIDS provider

+

Before explaining the data yield features, let’s define the following relevant concepts:

+
    +
  • A valid minute is any 60 second window when any phone sensor logged at least 1 row of data
  • +
  • A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS]
  • +
+

The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below.

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/{sensor}_raw.csv # one for every [PHONE_DATA_YIELD][SENSORS]
+- data/interim/{pid}/phone_yielded_timestamps.csv
+- data/interim/{pid}/phone_yielded_timestamps_with_datetime.csv
+- data/interim/{pid}/phone_data_yield_features/phone_data_yield_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_data_yield.csv
+
+
+

Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
[MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS]The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid.
+

Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
ratiovalidyieldedminutesrowsThe ratio between the number of valid minutes and the duration in minutes of a time segment.
ratiovalidyieldedhoursluxThe ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1.
+
+

Assumptions/Observations

+
    +
  1. +

    We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together.

    +

    For example, let’s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur:

    +

      +
    1. the 12 missing hours are from the beginning of the segment or
    2. +
    3. 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours).
    4. +

    +

    ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b. In other words, sensed data for b is more evenly spread compared to a.

    +
  2. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-light/index.html b/0.3/features/phone-light/index.html new file mode 100644 index 00000000..c7f35e9a --- /dev/null +++ b/0.3/features/phone-light/index.html @@ -0,0 +1,1313 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Light - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Light

+

Sensor parameters description for [PHONE_LIGHT]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the light data is stored
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_light_raw.csv
+- data/raw/{pid}/phone_light_with_datetime.csv
+- data/interim/{pid}/phone_light_features/phone_light_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_light.csv
+
+
+

Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_LIGHT features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
+

Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countrowsNumber light sensor rows recorded.
maxluxluxThe maximum ambient luminance.
minluxluxThe minimum ambient luminance.
avgluxluxThe average ambient luminance.
medianluxluxThe median ambient luminance.
stdluxluxThe standard deviation of ambient luminance.
+
+

Assumptions/Observations

+

NA

+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-locations/index.html b/0.3/features/phone-locations/index.html new file mode 100644 index 00000000..e5a907ad --- /dev/null +++ b/0.3/features/phone-locations/index.html @@ -0,0 +1,1584 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Locations - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Locations

+

Sensor parameters description for [PHONE_LOCATIONS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Key                                                                                       Description
[TABLE]Database table where the location data is stored
[LOCATIONS_TO_USE]Type of location data to use, one of ALL, GPS or FUSED_RESAMPLED. This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled.
[FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD]if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes).
[FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION]if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes)
+
+

Assumptions/Observations

+

Types of location data to use +AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS, if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL, if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED. RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS], this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one.

+

There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.

+
+

BARNETT provider

+

These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al.

+
+

Available time segments and platforms

+
    +
  • Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments)
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_locations_raw.csv
+- data/interim/{pid}/phone_locations_processed.csv
+- data/interim/{pid}/phone_locations_processed_with_datetime.csv
+- data/interim/{pid}/phone_locations_features/phone_locations_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_locations.csv
+
+
+

Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                                         Description
[COMPUTE]Set to True to extract PHONE_LOCATIONS features from the BARNETT provider
[FEATURES]Features to be computed, see table below
[ACCURACY_LIMIT]An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there’s a 68% probability the true location is within this radius
[TIMEZONE]Timezone where the location data was collected. By default points to the one defined in the Configuration
[MINUTES_DATA_USED]Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough.
+

Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
hometimeminutesTime at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius.
disttravelledmetersTotal distance travelled over a day (flights).
rogmetersThe Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place.
maxdiammetersThe maximum diameter is the largest distance between any two pauses.
maxhomedistmetersThe maximum distance from home in meters.
siglocsvisitedlocationsThe number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another.
avgflightlenmetersMean length of all flights.
stdflightlenmetersStandard deviation of the length of all flights.
avgflightdursecondsMean duration of all flights.
stdflightdursecondsThe standard deviation of the duration of all flights.
probpause-The fraction of a day spent in a pause (as opposed to a flight)
siglocentropynatsShannon’s entropy measurement based on the proportion of time spent at each significant location visited during a day.
circdnrtn-A continuous metric quantifying a person’s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day.
wkenddayrtn-Same as circdnrtn but computed separately for weekends and weekdays.
+
+

Assumptions/Observations

+

Barnett's et al features +These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R.

+

Significant Locations +Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al.

+

The Circadian Calculation +For a detailed description of how this is calculated, see Canzian et al.

+
+

DORYAB provider

+

These features are based on the original implementation by Doryab et al..

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_locations_raw.csv
+- data/interim/{pid}/phone_locations_processed.csv
+- data/interim/{pid}/phone_locations_processed_with_datetime.csv
+- data/interim/{pid}/phone_locations_features/phone_locations_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_locations.csv
+
+
+

Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                                         Description
[COMPUTE]Set to True to extract PHONE_LOCATIONS features from the BARNETT provider
[FEATURES]Features to be computed, see table below
[DBSCAN_EPS]The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function.
[DBSCAN_MINSAMPLES]The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself.
[THRESHOLD_STATIC]It is the threshold value in km/hr which labels a row as Static or Moving.
[MAXIMUM_GAP_ALLOWED]The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing.
[MINUTES_DATA_USED]Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough.
[SAMPLING_FREQUENCY]Expected time difference between any two location rows in minutes. If set to 0, the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations.
+

Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
locationvariance\(meters^2\)The sum of the variances of the latitude and longitude columns.
loglocationvariance-Log of the sum of the variances of the latitude and longitude columns.
totaldistancemetersTotal distance travelled in a time segment using the haversine formula.
averagespeedkm/hrAverage speed in a time segment considering only the instances labeled as Moving.
varspeedkm/hrSpeed variance in a time segment considering only the instances labeled as Moving.
circadianmovement-"It encodes the extent to which a person’s location patterns follow a 24-hour circadian cycle." Doryab et al..
numberofsignificantplacesplacesNumber of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place.
numberlocationtransitionstransitionsNumber of movements between any two clusters in a time segment.
radiusgyrationmetersQuantifies the area covered by a participant
timeattop1locationminutesTime spent at the most significant location.
timeattop2locationminutesTime spent at the 2nd most significant location.
timeattop3locationminutesTime spent at the 3rd most significant location.
movingtostaticratio-Ratio between the number of rows labeled Moving versus Static
outlierstimepercent-Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment.
maxlengthstayatclustersminutesMaximum time spent in a cluster (significant location).
minlengthstayatclustersminutesMinimum time spent in a cluster (significant location).
meanlengthstayatclustersminutesAverage time spent in a cluster (significant location).
stdlengthstayatclustersminutesStandard deviation of time spent in a cluster (significant location).
locationentropynatsShannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location).
normalizedlocationentropynatsShannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location).
+
+

Assumptions/Observations

+

Significant Locations Identified +Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection.

+

The Circadian Calculation +For a detailed description of how this is calculated, see Canzian et al.

+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-messages/index.html b/0.3/features/phone-messages/index.html new file mode 100644 index 00000000..2522ce81 --- /dev/null +++ b/0.3/features/phone-messages/index.html @@ -0,0 +1,1314 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Messages - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Messages

+

Sensor parameters description for [PHONE_MESSAGES]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the messages data is stored
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_messages_raw.csv
+- data/raw/{pid}/phone_messages_with_datetime.csv
+- data/interim/{pid}/phone_messages_features/phone_messages_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_messages.csv
+
+
+

Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_MESSAGES features from the RAPIDS provider
[MESSAGES_TYPES]The messages_type that will be analyzed. The options for this parameter are received or sent.
[FEATURES]Features to be computed, see table below for [MESSAGES_TYPES] received and sent
+

Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countmessagesNumber of messages of type messages_type that occurred during a particular time_segment.
distinctcontactscontactsNumber of distinct contacts that are associated with a particular messages_type during a particular time_segment.
timefirstmessagesminutesNumber of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment.
timelastmessagesminutesNumber of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment.
countmostfrequentcontactmessagesNumber of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant.
+
+

Assumptions/Observations

+
    +
  1. [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent
  2. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-screen/index.html b/0.3/features/phone-screen/index.html new file mode 100644 index 00000000..3b43dfe5 --- /dev/null +++ b/0.3/features/phone-screen/index.html @@ -0,0 +1,1345 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone Screen - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone Screen

+

Sensor parameters description for [PHONE_SCREEN]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the screen data is stored
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_screen_raw.csv
+- data/raw/{pid}/phone_screen_with_datetime.csv
+- data/raw/{pid}/phone_screen_with_datetime_unified.csv
+- data/interim/{pid}/phone_screen_episodes.csv
+- data/interim/{pid}/phone_screen_episodes_resampled.csv
+- data/interim/{pid}/phone_screen_episodes_resampled_with_datetime.csv
+- data/interim/{pid}/phone_screen_features/phone_screen_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_screen.csv
+
+
+

Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key                                                          Description
[COMPUTE]Set to True to extract PHONE_SCREEN features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
[REFERENCE_HOUR_FIRST_USE]The reference point from which firstuseafter is to be computed, default is midnight
[IGNORE_EPISODES_SHORTER_THAN]Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter.
[IGNORE_EPISODES_LONGER_THAN]Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter.
[EPISODE_TYPES]Currently we only support unlock episodes (from when the phone is unlocked until the screen is off)
+

Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
sumdurationminutesTotal duration of all unlock episodes.
maxdurationminutesLongest duration of any unlock episode.
mindurationminutesShortest duration of any unlock episode.
avgdurationminutesAverage duration of all unlock episodes.
stddurationminutesStandard deviation duration of all unlock episodes.
countepisodeepisodesNumber of all unlock episodes
+ +

|firstuseafter |minutes |Minutes until the first unlock episode.

+
+

Assumptions/Observations

+
    +
  1. +

    In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event.

    +
  2. +
  3. +

    Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off. In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF) but these are not implemented at the moment.

    +
  4. +
  5. +

    We transform iOS screen events to match Android’s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.

    +
  6. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-wifi-connected/index.html b/0.3/features/phone-wifi-connected/index.html new file mode 100644 index 00000000..5cc1c621 --- /dev/null +++ b/0.3/features/phone-wifi-connected/index.html @@ -0,0 +1,1301 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone WiFI Connected - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone WiFi Connected

+

Sensor parameters description for [PHONE_WIFI_CONNECTED]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the wifi (connected) data is stored
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android and iOS
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_wifi_connected_raw.csv
+- data/raw/{pid}/phone_wifi_connected_with_datetime.csv
+- data/interim/{pid}/phone_wifi_connected_features/phone_wifi_connected_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_wifi_connected.csv
+
+
+

Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
+

Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countscansdevicesNumber of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately
uniquedevicesdevicesNumber of unique access point during a time_segment as identified by their hardware address
countscansmostuniquedevicescansNumber of scans of the most scanned access point during a time_segment across the whole monitoring period
+
+

Assumptions/Observations

+
    +
  1. A connected WiFI access point is one that a phone was connected to.
  2. +
  3. By default AWARE stores this data in the sensor_wifi table.
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/features/phone-wifi-visible/index.html b/0.3/features/phone-wifi-visible/index.html new file mode 100644 index 00000000..ed8f1c82 --- /dev/null +++ b/0.3/features/phone-wifi-visible/index.html @@ -0,0 +1,1301 @@ + + + + + + + + + + + + + + + + + + + + + + + Phone WiFI Visible - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

Phone WiFi Visible

+

Sensor parameters description for [PHONE_WIFI_VISIBLE]:

+ + + + + + + + + + + + + +
Key                             Description
[TABLE]Database table where the wifi (visible) data is stored
+

RAPIDS provider

+
+

Available time segments and platforms

+
    +
  • Available for all time segments
  • +
  • Available for Android only
  • +
+
+
+

File Sequence

+
- data/raw/{pid}/phone_wifi_visible_raw.csv
+- data/raw/{pid}/phone_wifi_visible_with_datetime.csv
+- data/interim/{pid}/phone_wifi_visible_features/phone_wifi_visible_{language}_{provider_key}.csv
+- data/processed/features/{pid}/phone_wifi_visible.csv
+
+
+

Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + +
Key                             Description
[COMPUTE]Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider
[FEATURES]Features to be computed, see table below
+

Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS]:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureUnitsDescription
countscansdevicesNumber of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately
uniquedevicesdevicesNumber of unique access point during a time_segment as identified by their hardware address
countscansmostuniquedevicescansNumber of scans of the most scanned access point during a time_segment across the whole monitoring period
+
+

Assumptions/Observations

+
    +
  1. A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS.
  2. +
  3. By default AWARE stores this data in the wifi table.
  4. +
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/file-structure/index.html b/0.3/file-structure/index.html new file mode 100644 index 00000000..ff7e5c1c --- /dev/null +++ b/0.3/file-structure/index.html @@ -0,0 +1,1186 @@ + + + + + + + + + + + + + + + + + + + + + + + File Structure - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + +

File Structure

+
+

Tip

+
    +
  • Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation, then to Configuration, and then to Execution
  • +
  • All paths mentioned in this page are relative to RAPIDS’ root folder.
  • +
+
+

If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file, participants files, time segment files, and the config.yaml file as instructed in the Configuration page. The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more.

+

All data is saved in data/. The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor.

+

RAPIDS source code is saved in src/. The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.).

+

In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.).

+
+ +
Interaction diagram between the user, and important files in RAPIDS
+
+ + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/img/analysis_workflow.png b/0.3/img/analysis_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..89aab053612caa4b3e3b8f762e4acbfc5b156aff GIT binary patch literal 518168 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%0AW;YOh&X>>e&kZ%}5f!zr)zPxhsg$hQ|rU2Pa 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ö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 z zi4&6la;^T301SY)J1(m*I1Z=3gd0EpH=Ke;KNesfxZ!{c!2a*wUWJ_i;g~ze|mG0{=bL|2-SqfB65i0a^LO6;xHrL#8*enxPL= zu*F8t|G_XyV8F!6PG!&P;(6y{?t_*>ef2BW3q>XTi&B_=FL@p4AjE5?<9404|Ffuj z$UqLs+TjljL|tPw-@>p1=(p_C&jj-`nNxA4CWRcb`?D9nx*>hOs6_H!_% zR^9b2|4`o@IMiWTO}&Tq_^w^&q;LLtO|H7$TBXJ;Q0wHc&oclCg}94?{?GA^@S78@ z6P16=eye1Qxx^LL$Q*0ho-3z_<4OKLL(+#3_+}=MAFl^{=6hmsiqEN|B}JF^Ijk*@ zkxs^vO*|m2yY`E3aJ>ZlSo$7Vj??(Ao?OvYlV)DYakgpX$HEq$b4-X{`GZ?lzoa_| z6@|1=4rx|h!G|1tJ80z8(LcKy+#NKuz-L_+VjTNG{I?%r^X0^B6BAmuGEr_?1Gz)x(_6~g%Xci)HY}R_Hvp^IWq`uSpNB- zc2JCo#v(H^`L`b-87D|ReFPiJF`Ql!qqV@ZQO=#9(J?>}N|w9Izu z8|y8L+E$AfO4gs1fBTY9{ai1z9a=O`9d7Ilawj1@_CMHFT9(t~QiW?NKNkFL)cF*M*q3A@*k7GZ85@Hmz#37+N5q-Y^IicNn0|f z{_QOZo6BzLidz53vQ_Dur`H;YmnNWmRG*?* zH1adkZ~-b_DAT!@M1{W!`;UG=bE!X96(aCQ^6p>n`RbffLG63w61Bkn@jd-yoxDL~ zLV;h3U3cq1=_b)3T+nH)6skf>*``nadtLtXho~%={WVx$x3kA{1w9U~8C%odIab9L z7d){p1;R$@)nPGfQZbixD_@2{`9!Dj!<{n5PDtX?pvbc&r(yc4r~QnwmI2U^%z%VY zEQKaNf@p|Ia5l*a#k7R#PP0S31eKe0T2t@N0+v@IeLeRV*^MY3ShyieD*T~ggX=wy z$Gbf!Pp_peBs!ROUAU^LlMLru_=YR=Z5bqaN8dvQZg(GGPz`MH^#?)!CmrmN1gSL_ zeolDteX$5vJ~ftxTrGFtbSRc7OU-Z!J=Y2K(zuqoUAEro@?@;BXW`qxD&VWUf+>2m zjys(Vh>MKkGOhyZEgMaq){ODkaGi0hq1DI~p%{%G!0menYdZ4?LUp?ps-mHeUzfXG zgb*lCNy~MQcD)E$QfTn7AfVgRpb1lc{SdR9Vv5lK4@#U-k0uQ?WfZIBi!e`{0Dw%L zQm~}*$+TM#nnDUxG`yDgiO4UX*?Z))TE~@O%$s{}9>mug8w^9?+Q)VGzH+F)Q$PXV z3yL)td2OaT8W(ccTGMp;K{Mu(#GLXRhOr+Y#_m9xF9cnhB&CO+_jt}hkLDQkmpl;C zvNh5qcT~Ib<=Oh!+oAV6bFG@v?}3#tSFx*_dHoBQ-)WMUbz8rUAVin3t{m}bme9XvN zupo2ndR1@)lr}w&O6=(Yj(G+GI*PA$Ap6muQ76bqyj_O@1X&rB!TL~RlOK?BfwFyo zp>zLswLP)5uJ}8=->DW&7pKly)R(vlsC4ZusJePX+a0riJ|Bu?e!US?ZHq%t$?>{D z%yS+=G*MITPMwQ_vR+`HJw@XK1OA!f-DUuHDKpOQBu!Gu^q{yGau$`fwC#OQ3-oQw z*ZH>H3r!kZAUZPWp!e5kprXbLC{f3AJ45BNfr~@g4DQ0^6j6$SzJwY4j@aIZ z=DJFBCCq_la5O~SbRz(XwF2*`e2EMSsHZ3lK8C6CW+0UzY=G8K~${U5(c9wMf=M-0B%}l8j%BgQVK10S+(d* zA=LAQ${{U+S)coE0XXS1T!45dkZ1=*<%DLf4^t;pgxIuI%wzU=F0uGLSx%piP4sm5bl}u_ z=;0ynZWC@zFo*Q0X6+YlXRiA)&S7~frls14AAuIe+CC1!`SXC&fEl@p%FLw0;lMUu zHcQm32G_3al?H`eRV@$ZsiJjWRa%22ABnoHNBGu;e~k=4c+{+7P%$pY+PVXVYsBve z4F<^eAx`~J|IR1(!mXNfu`p{v4In=ZJ#I+-`)E4w)KT@WTqcYA_?_3>XkX`2qZToEvfl@StJk=|c-&Xeg?s1@xK zVE{#IAfTr_wKIEufcV2fEIU(RxFZq1`zU@21j4Vsze~nvFpw~JE$UpgcL za!E~mx-%?O(0mAUQjX{vePYYV^J@XRNa;#6UJrI_kVBHWMRx( zV}jcmcu6EUl!$DwQu?d?c#@)JOBEJo?mormNj94|y7&_Pp+^?!M%&FCyk6}W?wVdx z2kj9`Xl{BVaMu0_-MB~q8?gjwIa zF98y${2*hZ^aKr5rp*AmLe?J6XTuT^b362^l?5Xu3Lvy$5RBeBBU*Cr%TqoY1@x*@u$_G^Ls*r{!`N6%6Z0@~pO& zUrEP2;Z&;>z6r+)aD}z*fCI@{xQgHkUjeDZW)%I4GmS!+zeM+WC|Z5}Q#f zXBem0tYYD&NUkcDVzH37E6g{I$&)TIY&_D#1hszDM&$~VvFxhqktx)-rmWU0Fdt3Z zFg8g1^y8KY`6XX2Qnl(e0IsYf`8bOV^2P2ed~}0<(fkq%US@-Y`J!9AA%52GFV{1@ z>~gfglu9mlnAEVA#9?zTj%=dpVGTGs<@{-oEjx-KR4DPQkw+bOt3fq$X!)WzO(e-? zx+@KuO>$NqgJP;gM)xmMjaq1PE`6>gO%4TaQ;I3-Fv8mtL5ypdtJGo``ZV1X`&c zgK6pQlCrc-=VLcw>Qmy(nQ{XH4AGiJ&S~Ib6s@uNUrKoK4N{|x zwz`XFc(h~=Z1jKrY}PB(#nL$yoM7YOvQKRM=1O?3IJn>W%YIb16PC11WHRyhb zWgla84a|gAB)$BPiQ0eAxUz^R?;%X3Qq@ zqmU`wGk0)$h4g^EFcE2q>QKJ__E{eUQS@WCnV$sivsg{sL#lKpy+qnaO(S8`K@YVk z6UP4xScf4WO%F*vOlRXrd$#GuQg#tDF)Y3S(!7X`El2ngp19*w)n~p#7)nNw%8qx~ z!E6A0UtfDH7vJe$zDa0ezf!`TvZWg1V5MnQ+iFv@=hmVM3$)*P%wSyMWXj7L19i{{ z^e&VPW>J4bRN@HDJT~a4kMqX@*RrD|6Vz>KJAoLBDNaeyYVPVY0aWWET> zgydX<`akHiX^@c7YC=b{Q2L=dH1?~_lhT}|S^=(w5;a`CPI1O76*Ao5<3X`tD`W=a zkt*5YZ=;Cz$&0c~W4W1?%u2evPZccF@PHSV1T$nE^J; zxdVU=WrkNt+yTd~s0|P?#vus+EQu&a`cU&V*Xz2|1%Hb7>Zp4trKh_~A2S%lXbmP{ zGgq&Op#lzn!*-+9gqPxIwH^e02J$>=%MOiq#L5uXYeJuV6ao^4tZ^YtQWT_WV-otb zp17cx`W$z_AVA3e`?%!#_Poyql ziYI-Ys9f@wx@&lwidNkiza86Wnjwvqxovs`+!lf=yz9ShT?{FTlr{o8Jmy?{!Uq^| zYbx09vb=lbgU}&Qwx0&zFOwuJ#=D?DA`mitYz2+gK%QWGr{==;Wbr!(sW{1SkDmaM zp%$=TpwG&f|0b`fE^p;Ll@DPYax|ro4pFQcVV**#*9XG!g81Fv;eXUEXD$&puMY#t z#T|{GCjU^nKl~qbRfvD*BZP+wF^K;-R{OxH-%srH3p5?g{i#t#oaFPn4hjHXAj~GR z8{0S(@FgF3v0(b?zlf|-n{zaM{4jQ&4=;=Zuo=`fhFyv+aODNT73=NqSR8oCjU8(d zKa$aPkh(ARbd&gBfft*kdtv4UM5D3acK7~M`6VXKW)gv!z&?%`msY)nv0;hxT)_juU| zLEdo`4Wjmc%zXAwg9Po-RQ{Krqt(`GevOEcRPKulNxFywP z10E}3+}dKUimn1QweG+L4ZZdj+3ME13%TYWldCKBD-DrSs>lOy>fT`Wvg(rs)pIRh zTzj&Yuod;%Yp<^oQRu2TuMQ?8 zX8=7wIhbojrolyo-vM8!Zq@M%GFt08KpG|fy4`}0NWSP<>{LhO?Vs$JWI3G~WK1K5 z9fH)i4F+oaAYfzdvUu|#_R{sM*!5*!qIfw`mb@lNu(Y{`^&iG;RuXRyI=y}{BxD$(4dEr_t^aedgLF|W&wLF z#uCnH)S8N_5gt+Bv^|+gDfp``ko`WFXn`yoxNprC?+=@qdx@#Y#aS@AcdA+b44e{N z9OlRhuZx`a(}6797XXEfbAoM|ahvSwpbKleFy4}qBPOW-Q*YNLK3cuY^w?i>g;J0b zdL5FRjNkl`IPSVHa_hWg&PLOZ0tHQjCGI5~&!DkPmC7l8jF+6x#20^YSxCRF|h*A}(X*dn!>g(zFW(O)`lF)!%uGTkL9!k2f zhu6)RB75Oo>9ZKOKACjp?k9yz(d_Sni}xmEPzh!1T8N{=EFUs~Sr`u$)c{E4X*1Bu zJJ}m4Dz#bI3UF~W<>XmHv6mOX?V)c}n zv`y0Uov;Fo--txO3HJQ~7UmfCUn9LVDEeK@N*%|qG@VfI=_M2N?qAE7$*p4$|4K?X zk+1YoBjFjikW#oE>XsM)W?IDu6~B2o9nfisfNuzD=W#|HYnTG%B!u!OjR9kD?q`-U zC2Qe|b{b&|)DtLC>~-wvM;A$pcFaH%Djc!q&s;}o4JlaO%31+%ma-OcSgDG+h*f7y zM=ON2n)x>dAFrCMZo3g5BQO=iBBo}f8pfWeF)!0c2uPTG$R2{$jxo z?1``)oadfnWeuEawenN$3+N1@Zz3s|>H**24qKhZZ3jt=d!f_1PxrI1U-j)SOG2d4 zU#fc?&(&VOaEO0#tf+6sb6?PDGt9GlJ`KxC>Dw<1+2Xn6qRq9w0hqvL&jKol*}Rt- zzeI9`sBn`(p7YZe`BHMbh?JWxUy* z^GoW`10}a{ML{-@I=o$3Xpl;fG-ydyX97H!85Fm~vQ0YUecJF#Rr`;ITt+codA&T| z%DGn2&s67Wiq=^~vI=}YH(yImHc=$;G5PWo0pixst%!&%M+mw}h_J^}dGYoQ-hK-j zpYuXJJb0QzM?=^NHC$Y5C#;q%VxB8MoTBJ^w>y~mcYDe+%{?jF%R+*xZyI767R+Wp z*987<4}yH5z9ns(qAp;_a*A7B&3t6;w;Od`lyg=Sjw(E@SEQbg_N6>Ow8Y^#eCF4+ zI0>RoSIV4E9TENCO}g!(msdh@k5u6cYAL&1j)H~><9-iXMYuS4dx0MK|IlBbsn@6N z`Ery%vI$R~fQ+HedV*Q*OU~ zqUCh9%x||&T@G(u&Ej2}{So&1-hFBpp|`5P{Rq~g)6}X|SfvNGUJaQZ<5Fsv-|i!~ z(27>DZb=g_Nwmbuci5(DNoCj)pKbSCDg%JH+S+zU#t=8{Y820`wfENjvVentMwD=ZS`jR zj7S{{o%)j#jql)&d6Y_jd$!T9&>uk$xUR(|Fy zv)MPgzaLk@$EUzS5_Tat<*+8phHr5!)q85PnO+z=&nW$HqRQ;1)F~3`K0o?~6hD^* z8+7^Qqw)w>T`znGr%s}@+09!1*~LbYf9s3*%_X)61@&f4H#4*+M*MCzXYBvQ0`78s zOUSWAbYZ{&@2jH>30gLK>R0BN#r+dqRy0iAkK`LRoHta)CwWGnbovi(0lR<>d?h_g zk)9&O{FBeaoE0~Q=UGW}H|_hy%A4p4I4^op%8&5k>(`+(_uU6R&H7UZegX76*-G=I zZ^Z>JL79=<=Np5cR=!WAuv#9*)7#tr!262AI#PMsQ#gZP@HejxCT^6(uY9Kv^6eJN zOMhuq;Z1Q&F><5X_S@6?XJ1Wa@YVqBydh&$n!fQMKYlGAQoT{SBJZND=8|WLHa*F* z{m~9mthy%tzZ#^Yu;Sq?KD@!mtI?WY`nB(=$nW4Rq}SfRf+3(UJ~wnR0AAmUSfvG^f;NWsBlN(J^-jvF1%X1|}P zJ7TyQ?4m5Cw)$Gg`=fuw5yR6*@Gk%?5WNgM%P)5bkNldDmu045J;KL7MU5lTt~(Pu z5aKWs>c;u}pTK)3nWNI;?%$oqe>^qWO6WXU`Ma2!7W*z%>LMqJZrd*^LetmqJ{~R8 zCAe4brL*v()9-g&^IWhJj%z>Gn+sBs?&R8t8K}V>~x-S{)3;TS&{R2-U_)b*GAYM8BbMwn)MO)Vkgf?ZynbB>?BOr zTI@}>Ege&naSAT{Z$@V>2+oU1l`5VJ?oslr;uo5^LQ{@CLgsZAU3c0`o3Cj2uRC-7 z!yOojMb8*h#iLq3N*+{fdRp}~jgaZxWS%TL%-i9PU`inT`LE0U?;q$r;R)$~Rtw^} zEm!9~lIvr;XQLgQyQgiupXe8E(B<4K*oe#d&8GxyOcnJ-4{w}PNSRt5=X|0np$bX- zgzDbH&;Ky=PG~O;2kpq-vLL*Tb6p~=%^hl)eGwn8aQf^zzSA*3z~pdG#Bs$d zvVulK1zWKmCwZDo(Rocur*wZ&(y%YR;IB^$5QPPLa9uAN@Awu=6OdsWN@gc%uuHz# zPIK5RI=Vcj7{#WGR<@>0d&ZytAO z#fa9tSn>Y#?FEWQYwhjjv~z)?vW)A=9p>6>`U7opgFTO>dkhr zj=ZYC?Anx|i9PYKiT8B_{%3Z=6>YffWVrL%M2W(kGdMZHLSxm~`Xa4lAM1-qCoFB+ zSWKXLm-pcKIj}A)e%6w>R^z1tESHLD0?ylIp(jzUB~v+m%}wzRtlKJNG*tZ*0snN2 z!X^&S#)%xdKXFN=bpvO;Q(+f;$y|52GQi({G`9@*# zLmebM31+O3Wq^3+U&CU)+JArI<`*Mew*Bv|{nX$Qs^RV8snqrH&QRwGSSbMqMx2#W zAlS{hMDNxz#`#c*AcpK^%`KYi`~G|7|NcYF@$ap&@ekXW&?f$8{i_+H$ThlJ+dx@8 zk2ldQ1JwmP`+eQ^zeN3X_i0>bz+XM*L=derVfXQFkfriK5AKP_E$ z$4~7KP!VR!Z|u#mBOu&V6lR%c_|HrH=WQ8l9wB5n51&LI z;)Ca-C{YPKc#0L<9=KP0B%`hqm@7YfJWBt+cO5Nw6d|0iTSw2U?u-_MNeEAtBpemdKO+nqM2x%C z;Eey>pno?A9oK(v(7!im+YbI~;!tw%uMhgy2W{u{{{{*F1_|5Y+`m!W|LZ|Q0X=XP z7kR_{Kj&#cpCCA4yF*TmO$szg*?@h%725dPK-rfY zSfZ(Z)ty27(UF%B`wLb^Vkh+3fLuNY0D0PrV@<24$LjM$y-$$RI^|X6(!q!C5Up-2Wp~6(?WHJSj~?!#zQ!VSASfQ1iRHrQe#a zbv==C>^orwrIIqlW%Smc=axF*Kzi<3*fm>Ke1}@i1?ls&j1M*XL{|<^aUPdFALd|X?a=l&OMao zfzRH&VUO@gpqR0~mEITaG+hcHE(%~5cL&H;N?)8+e*FGQJ^2^!EpQVUS96priiJ(! zD44{MNfS*AJv9X=a=*UNy7HE0v+lxSQ`?d^-CY^&CV5Q*r9R5{{=g)Dt>RUgb}E!w6PlS&#ko-38EQ?70;p-&r^)t_N=hi z1ys}yc*TMyC>F>Tgz(~wO4-W@v++{~AqfpOP->YV6YYzp!QMv@&)GLE`EGk%BaXkU zv1g#Vir0yN9ZidyJ8Lbxa}^fc(CZPOa!9}EO$(GTo`{${4UmUi#Oo4K32;#qSD7Vo zE8YfhPvWf4+Gy>3kfj*B)_8Ino#Bt}N+8-MMMPVPaJjKg#$LiQe_)s{W#hrNg(u-U zH*S*b+L__Ia=`j4>w60*`@4$9N`{}>hRgv1cXy|DnDB9U&VdY(oo5O~a9bo$b& z9FV2X=vYkh4`~pTz`nVa4d30ltSC{r4ad~@F(w?RK+!CT9u&hVhf{FlWh@S811$8(k_SAaq zLimC?-g?t*!eP+(VJK8>ko0AZxhw|9oWaYDJc2R`@tHSx!ZW1OM0KYgOjNxgzoelB z%&1-floi^XW8F$$DPzcatfufeiWd*0GjbPJPk@R_b?4m@4unEUMtx(eKPTHOQ7u4I zrUAeB3eXC_zW4cH(z)NNAn{X*z}YxK`(RHp;HtQRrt}Ak%3RYx`m254mvBzfBjGA2 zBnB{PW$kS2xuzeachjehgRRs)pHz(Iyz1YH0FKM+)1hEnPE2Cy=L{>{Ga-E)KI#I| z8)h8KI|tJ@6sC68 z|B!)j11qn;;&u<$7*ZhWSkE_89E61|Ly*U*g2LYUbA0Vf?*CM6{ZcEVqPFaQL!@HpYfdSdelX5 z@V5yjLv|iC@Hk>%rWXD>V}#RRmxoBJPBaG^lU<9+Hf3xTR3`w*Y6GJl40(36ga+UU zn>c2C@G!i&$W4gP1nsTcXTE)N(2J6bW$jeyHf`eNyVs3R4y6Bl z`V&v9T38CDMK3P5;vAWHNQ)x8&9YB95DRV0^T@{;Ufp(Cq75D;>0ZR^ynuH;3uXaaSP#u zNvRvmw1_LWA7Z=*6jnFSFkXh}U}d$=MZ;6*+l64gep7rv61^nkB4%0laC6zckbdp; z+QPPamq$=rx1L3!P!so5M3ERoX_v!vC;Ql|;$i|cgV-MmdV0lNas!l@#B;8ec$j_Z z<0t?*5P%~n9yNjP!hY-Mv|$)z@$z*Xpl$p1$qR`rnZd+emRIii%Q?kJF{u^Uy!RG; z9Owowek2NysMhrr^j$A07aQRqE%Zo`^c1d4_l`$%n;ab|5?A|m6 z$rjB@llOW9#k-GqA-%u*ut zK~jshAhZ>_<@&1g(r-pB9|ODvK;uN6>S6I8ZMQkR5>+x8Vx=Naqp^sR559yyPuRlr zht8L$2POsN-sKIZAKz1>uycvwxbFd5A$P{z2PfZSM>a4zAU;hWcm{l8#DmL$b|2oJ z90Mem+C|tUL-JWaDA|CFAndyByMpJpth3b=(jT?4;8?Gt^cb|Ucrmv$DcacgGMr0c zFl1l9Oqb=hhNzAE9pH9KXRk&SKO%tY(+f1%SUjCD^Gr?Q89ncAyeIp@ljlmSC3k+0 zv;lhZiVVjR+AdO74Jz2o8k4BI13-u2gHFm=Qv#)^)A{ca#lU7=(h76??G7JwZEAiq za%B+FsRMokN+%a>!w->&in9@zbn1cf^-_OFsK-^*i|Bj!b1l&Y{ZqhqS zhkIW`j)97osrH$5Me7C7jbj#s<6dMws!3pc2odzBfgTHDPj0UZnsjyDbeYqis3yI+ zzB62aSZ5F-99bXkwhKEq<`%NWhws*V3&5m{0wP0gd!{P7IZ?OC;d)= zUsPt>+I^u=_IK~B$kin;YQC!=9GeDubmrE*ZhoL|RStP<%jG^=06E1B@aV3hY~au@NHR^}Sm;2M$+~4%mPhbd43)xQWT5&dy#XDXbtT79aZLkc zU6ndFr-=tEK~LZk-lx-L;e z8NzF206sVWZlf4j1Eeynlxz6_q-Im9wxs_DKXJ!f0I>oiJ%YA9s-j3PjvGdvR7BN} zSF&CPmKhkbx-usu?aDWpevq*K7@qTc0SgmAuatFbXV}UPF^GP&qMS}0%*vibPA}t7 zmX{Gk3`pZ46K$!K7H|{H0_R03%wL90yLxn72$nzp(g$xq_!a^fop(*gVRsEsM+fus zIjDj_B^nC4blOnUYuiI9Y66y~6(k)_i8`Vi3xk8lg4N7#IvkPjF~KAfT(cy^iEz$H zpF})QP6Kmq(ye2!rRL>WOy;s^}uUV3Mz_I*<|B8#wcib`!fJnu@L6B)PII z3DTFTpW!A90Z{0YI`CN6bEgye@EAD}k8qO-y9&OpV~C8{`fZROFc%3RlBJ+K!Gv>% zHrk7@s`-marr)-NpG^hSFr1VS!zls5u|${k@tHOpeU11t=vZpUQ92+Uo(j-_4paYd zSGOr%9#uM!2sN@ebBFRlzRd>(AgeSVTEoqi%LvA}cfKTKClydCSg?I$goEak-_G*W z{k;YJ>7;xrPCGDx-b^U`!~mQUujRt!g2S|e$L~u;rF@J_!NeuQWmTu0?!bFAAH>DE z{U-7|_qq{P+9>BFuP#x6Tp%hGO`KzY&zemR-ZSJ?yMY;pE~|bHp|CSPt-i z_d_tE7AnR#@1>^jTACLR#twDn@(7uyRTpu5lr!>CM0`!#l1Ia9%=~EDF$`=$n>YE{ zmp7tP%qEZ^CGubuolONIED0t?;dprce?(_SJw_)z$~r!6IC66|vaev;$<*5QZx;e% zrP?4TwH?#2J_Ken&_AH^+j8~jx)dzWk?MorDUgG+=)1Q(Yv+PVbD}r@ldrzDp(U|l z+if#5D5_h@gZ%i}w%h3CwW7VRdR!0>D$OzLH}6oNR2@h+sAw78`4osbQXrTd&2(=) zveR=gARBqui0+hwAPBcs!03KJc)p%4*veV|$c^`UjTc-U36Lnm*Kj_r?r$VT;w%Za zkEn4D9KcpXV98G(a-ZCpDMrPkg{dUYPSal)sZRriLNqL#;m_rT?Br}vc7Dv=Qe=NG zN`~bO350SyklB3B;25W-(A&d%YUfKr74#a|7y7$^d2(mjzD0RXcfM7KbK$!BF8STUhooN>yA^OAX|* z3-=nfw_dsXooI(#>>=sKD6zb_tDC;GbvkZDYMW(6{rYb%!O;Jm>-TeNMWf8*C?A-3#a1P_$RVm zBbmk%81M($&56ow2Pj2@m{m!UgiWFvCVe{?Ahd=83Tm9rb*g26`FgXb!)&J=fqN7T zM%R*OSJ2K7L|7fwar`twcVv^g%(U~vb-s4Td;s)s!9`RcH*nuN-OW!vL7@x;Xi1Uy-nPFufOaB_+BQ>YRCNn6d54uF%v#HkOJe1SF)8Rw!i3Q3+qvpGqa0=JC+lA{+xTByf zO@>-w*6)J+kidrtaFd}s>P8wO=w#0i>NjlA33+RpJW36vxZTsOI~D;of5eeTA~aRr z`B9DAMfzE5@ERMZftdsJK$+7|aC$9ZSCa~bN}8630rh`hu?PB>UO!$AB+FZ`?|K#O3bS3fy$b2Ut>-cuh zMX3lX@gSxb2ToihamlvM3*9AU|X`v~ElOZjPmF zGVt9jsf6f72hlNro;s)3+FxfPixH;?QU@vgzu5ckc&_*M|LV}7c@j}lr(~0iWUG@x zAv0SES&6L7=+-dH43UcLy^@tv$QB`Gl#!h++wZ!ZbMCMAr*r@Dy?=lGevke;$EWvt zjq7!d=kH)o?-*aa`9~cBd^e=-Jga-(^Jo|Haka!L& zj<*Zn(H{uDvFU$S_R3-58UWKun#bis3$tEKPEW4Gyk8AGA~d=!o9HB0~TVxOFTL@bJTrb?g1`>J!sqR6t>Wt0Q8!Rl!5p^;u2dv zZv$VZgj(Yb3W@#FQgBqS!+fBB-dn_ZVCv*-#H_R4N(Uvc2+qILz&N^#vCa!!3}ql$ zdIu)fh3bCg(wQ$L*@FG|(YaoCS!T6ca8rEqjE3RBf(GY$lOb9$XGf%4;|B3y37yA< zrCwso6JiXL`*eQo0|)g<%*f(cLj;WRbbc#II(_42=v1g3T@WVz{WuQ3{4L0aLqY&a zST8de(?SkHRukk`{+!lpu(?Vg$0suB{q4WVa9>Os16Nu0>>R3JZ{jgzL0k5 z6dK~&)OHhL9ebfFK60~2%A}8Wz~PRjO2-EwXiZpc(fV$~XI+ieAP8gd;g((R6uIgc z`Gw;kD1{k-|CRISxEF%RcqvLNKQXsDEh)}fd4D&d#08I`fG!lp{mF5JY5lAW)=ZT{ zdzM#TuNHWgdIUfeO(!?0!$mboeHX}OdzE<7e4j6nSoh1O$;F@;+*m+_AX3Lsx?#ut z%Js!#yNF+~zs>><6nZAU1BAa%GQo+W+@F$W2r_0~WehIDrQUmjogf_qlu15d`4d*$ zKC-`;)`185oLocfUQ4!;;w@RfCH$v z2d|!DOl&^^^G4CbN1Xh8sG%--yh&Kj=ARydjMiA&i1YWxJ?m$90k-u}%w=g!2i@Vi zqF0cz@Uhi)3=;D6Z#CAG&*r4eA(4 zkoT6Ax&y|?K=0aeWZ)niUOu98eL##viPrfRG|t=_pCOzf@Hu_hNVfG>s1G4ilaS{|9}+Bmp|Ooz#sgY*P``bynBBAhlcMl zSx7!Qw1wj!iePJ6y*ssHh&V?hzUMQc8&qsQZgv#_J;ws~5VkBhRa>$4vgRoZ;n>u@ z0$Vxp9hc=tthR*BwcRs01@x!r-)F$hlkn^Bu8;i>R=AvZK%EzgRwnr4dk( z6FBh)4f?`&1~emCAw27rwm)tW6EgtArv8Y_HoaP=kMXb06W{frA@{ zJ_c@HDE1)wg4NZ(xd5yng{xm=O4|ZOkxMY{e?I3Lh%S}^E0fsFxk57;aZVG@%4*Un zJ_0`Z=ACt2gumaH1DAhr66lA^Kx9o1pf@dC5TlIyKYjzp7EbSx%vWLUlg}??UOB&c za=E>Z=fyKIS65*;EZaJUO9?}cJMA^>G#++QVwcL=+#FnG(DRW>x=Onm^CI-ygVK8q;)OQlhn>dz8o=Gm%V(QuSW&iWEOC=r) z+j29e*CFBx(;={66&*Zfe|f7PPR&PDzlG`~hT_Fmj>HCa`knHdb%ZL&DXHJYh%NSK zIebve+J!*AF2%=lN@le>-NilWzgbrk&r-6DnUJb6+GRofvpcx-IkhkCrv@G#zixoh z@37d=y^j=7t7Jh(awn5)Vv@vz4Z)Qj@A-}q&ISlV5No6ShKL5E0(;mlI=GU7|CVbw zzs>$>)4GYT)t-=XD`;AOYM(YIn?f^5it46#0(`2xNh7rIvaF;9C3>y1|hcE;%>$|mgC*9k${S5Q|V8%Du zRD_?m@83@6kWTk8P9`2yfANh|Mg%3xRQ;jJ{pHxGa}KcD`U5xrE+pdb6j zZa#CdriQ{Zlq#_FA7M!0bj(jKRBAC@ey`W zWLg`6k#s(y zC4ea+HZT61qCb7mpHoD(@#ijDIXQpsA}|y`4c*EiEC2H>y7}`g`m?YnR1-Zwg_6^vMh0cJD-{Xskt6 zf87e$ErjDZm^`y-Xn;Uj?oQcPV$w{!2Z64fQCnB%zFga(${|M+4E4QHl4G}X8<{zXraMrWrdm-d8thjo{4 zX@umK#}km<|0l{xX-MhB9I7TZfZhU7{97Sod8lB`p|mtw2xO# z!LXS{t3_D};MNNfrB?Qp^U_mu$F4otSKT*%PUM%xD?_wrN@xD}Jq{EM2y9+}&R3t= ziQY1(#WuW~%7(%Nq_qK(F1~H`! z-Xh*~qP>vf9B0lYrI76VM{3FSfM90`h#BQt?$KFdM4^T%L8y{yEp*Zpz4a-!*g?(643TzhL= zWfAcd5Oss_cU^f%2}#_bSRM!DomZjQjiW&(o$A9?op&%y_(L+F-*w&1>=E?ScKlJ>r&>t1SUq2yQI*J>w-bVQ<_F z`ApG=vSS^f0mF(lAhpc-=1rT_C+tGx36S29fs=@_?iX|I}>A&zZ0_hx7`<=;ZiA1INWz9aR~2 zW1R>kG33{L#g3RYGnR%#`~NPz5ADu{jKomzpHPiCy%07_h7q{pxaG1iZg-KO4~O|oWD;kSj^15QM&Oy!=XvPHJkEB z_K7qrnwN`AMHn_!yyS5(n2uN+@}D&nH5mbAMpVfRHAxPs)>P_0)dhx6mFvMEQg&IHn5(-Hu^_^2~vUHQ9g}JVp&N zif%HZ02LAd*svbd{>Xb~H=xWCHvP|@(*K@7JCqB}LSRT{P9eL zD0{AGTy{3>@>LWt22`S2TX~+{9^NbRi6HKg)^0xtfC0@NSbCxUhLR&5T-KTg*N&vq z6~~i+%(gQFSG;1-DPrwgN#j-7sIljCVxcja1K>J3-awUGGy4lx(I`U$gpLEYYBxxf z22hgq=q!Vge*@sY$2tMk>KPy!yDK12=!~`MoOe%hie&1F?hgvZP&RZA3=f&3xa8>T zZN4Dx!T1$)m})q^p~}G}>9uR5;47+6ZHfL$XfV3h{{Lqj8!{6IXq zBZSt$m@JvtGq=C)E6}5xE&WnQM9ay*ci2k>o5$o7M`W_UHx!)+G0lzZq*jCX5Xe88^>{Ha@pYIGxHw9&mfh9%|HT zZCbdw_Loj53HyNf-VtiG%MZW+Zs=qZo0ZCDR~?&30*$`0x|7>Zg_g&(@&mHMG%gAC zVuir?o0P#}7*76FL4cWK!WyMPp|aNn2RD1{iPV^z&%SPG*XLtuBJ4J>T=$vwfAGI^ zkqEalX8NpWH*A`xc-`Dh1X}T(`43hBc2prdZl|ok0cU_628gI8AK|z-1rAh3w^FpO z+>$$Dz$&wq2X$-T+}qi8{qeje^-<~CjN(1Bc9>e65P$m$ztqi{0IZMd`7 z^2{TU9%k%`(?wtumg9wjPl#_5ozZ2_tUJNj{JbZ(aHfPyl7hB}zc}L2?@mkh!Hs2V zY^%2lB-dZLfYjZ>uY|KKl5?Ht?PmAfO9!vh4M}CZ@d6(TJ2cX*V^S+Y&f@_Gjqd2OglnvBo@~6B_eQ(YG}tRD54~zCg69t;W?@= zqfBREF{|=#d>^hWXR+~cvpB~s5rCFBW|Lh=P6Bchj%?VxtruI0078Ec&<+LNniNx5 znk4Tz)@G&X*u$pN&nyJ@%3v%Mq^KB*3US#gG?Y5zr7K4pNk@GnxN*B`Bgu%1-@BgJ}8mFN0v<+dK|hy+`|{d1)nzz zvWB1i@`Tsn+*lL5esqho@vfl|Zav8;T6=BKUK_G#2352(m6q07(To|mA+Xi4IJ$qi z7{JH7ep$b{k6EtrVKif@rA8<{Glzpp|MJ)nbE5k5oWo@ZMHlY>Y zJr}ixP@%|bZ?8@LS!tHvdBK2bo-gjO=qlBBjkKz!Gf6yutwv&)EWgs&Fu{N@;ZPR_ zZPJ+czi%R}>-XYdA?YHgBP*oALMApnUS8<+358CJJ+E(X85F4Lm<6>nS|lQJez$ix z2VN467B7&9v-g=(>wo_4+37N9;`?AR2Tqs=^nT}e3Aix1Cv6q%i$s0p>`9fSp_fNgO{18KBd`l_{T|cpE`X+z8PEU- zOc$5StPDHErHs8VHR@Q4BcMk)V3Mag)8C*qZrTQVoJs&NO9rZ-L$SpvyXCLWmx8&-|lo$zk*X0X%~I6h{~+5b8u#U~dbd_3&b;c9iod=&l! zP_pgsaI$*HSr5KYb`wD_hp*|vvq(AY=+^`^IJthKAodmNeQ&e%1q4i7B`eTx6tlNp zhh`3|8%dP$Y@fAMwB)h~8w_?{IEW8ged{6ujg_QeP*^2uF7kw(mb9W7TMn`-^(CU-m9DM|I#IBH42r zVNLuOC)N$r(*${9A6ylT)+wofP;gsxzByBQV(N0jsZ>MgLeb*fVgvLdfmKH{D>?Jt z09ILbdJOaw=~&(>=4-huPK`CDIA^_hp;3lvM~+Jqk4MJUt_ONUt0KlC9Ns}}Y~R1b z2zp$6eLGMnI}q`WP4O%;$IU50-H#f1Vu~Z)e*`aX zC+d1d33}x0I4JoB^yJhuTl+0I+(a@Asy#psFQLK4fo=#@RWG@cQ#1E}mu5?%LT%vR zs@3274?|b~U2OL75nGxO=#TQJxVl&-wzPwVSvh$dOQzLqPjDFq0nx$QtS`81@0a!h zyh`y~T?ZWn4DkQ@fGXHD9i@VF3VuhVlc%7smlYe%dbj3H*+RO*hpM!^1LOV+0PLUe zl%59Py5xdEh`w}12e|ZStZlNVct7|Ls6$I>y4pRD!A0n@--nz878WsOC+}>nKB2%8 zl>u6^)|x1cdYa-)8`uhHWYw?=pc#phuLYa4`lio{Gwx#U%f4x= zmJ_FW=I?ypU%*dbp-zpVxEoJ^v$`geJ8mBN7#pM-rKVF+eIx@UL<6@ZQ;EsEbU~Cn zDh|&mIS%PDcy3^DJaT(8t%7B;Lh)~);0Wm*`{I6d*^u#$Dqt6b62(fO!L9r1W@ja( zPw$}**8y`@0u9Nk@^XR~jN_s^kuCw$4+9^usUEr7`r-q8QwHq~+;$;XCi> zauQK-$9Il$JJz(uTdPtOqDnGjV-m0^JqU6gsF_9#8^{YoJE_$7=k^F?x&Ydrd5X%^ zcW0Z6mXxmz!hHLOLZpgHY>$HD9= z@_F$8RI@j$NqlkHMy+9*Hq@TES;g?vzc%em7X*JQX~=xcPc2th&VDIQF(ydMhplLd z>MkAVik^KeDpDk%&}a1dl`Faa)_5+kI!=mwgxv#HClECISU(96vv0~&qulu(53kEB zM~7S$9lIwNK=!*}f~dPLc3Gtdn}UcTx6ROps~j7$-bwD!&sgYI%>daUq)jZhmzB|&PvoYEP)Fuc&>JROwR-f^5}lr!wQkS*!= zh|qu)%?%MESW(@rU?m>^lF8aW4wum^-b>J9=mj#h{Kzaa18KA-i%-zsOAlkJ zQD$+KN$dj;cm-w91->^SrO^JHRZ9_cYUs5>V;+64-#jKGElgulD>; zlhw@Va2N=kCv{teP95eb%L1>`pweV<%-5yL?O0rOW^{|W$Lr&9j$lLY9yodX@{>>( zu7>m)-<4!g)4hyaYPP!Y33X{MLzn5hss&EoPc%O{bYCW1n;G6B(Q?m>{}@~a%b zCDPx`nvnQwPKUDtI|#Z$wB^P-uRyT`uD7KI#SW)2Pn|0IIgOJT<9Eh~qQksua+yKd zkLAF5A}&2^JFH*o__l-zK4tm%qXn zvppFIhx4|%3mWl#sn$uYeFUw^9a<{wMJ~&x)DPhu_`(*yg50Y&W6*`C4f9CNATa*+ zpisf#@Ut0>QFZd_tgIZ0fuHIVd3EOMgIU-6ST;xN7u2(hupA07NQmS0uLhG7%+V4U z6fG^IUL7GKgrue0L?-3E7{o*s9>&%O{c*0JR&kG!!DCB}mtx^5nVZ#eSKN}s4kPMk z(i&i@zJ0WEQ9oe@si8Cw|1|&|6xoWiN33owwB@yMf)EvzbWk!AyCzX7D0 z+>ij!=WI-S)5{5u{T|aC9i6t)^8|fuP5suny0wlI)il3s*gDk2E@{+~MwJNC#7Tll zpUMX)?Shp%l)P6jU+h27hY79VuOaw@&^QZz&2I(_2?LOT_5rpmvSXg+CM%en>@Rbo&Xi?eMu!D(p@~ZVT=!b&+SB&Sq?mb}?#-#ufyKYy%r}P%s*DjkNH8*3>}* zD!*{X$HSSad|a7W#(?t10mvYd-)|s%pFBPK_Fb`%ho=KCyy=2V5)t3&YO{0ukWtQ# zW}Vghn)eJi;p>Y{g4VdkgJ-22sHji4EesnCWW}`B948i88h5}_5cDwyG-(=`Nbjj; zk~X|6$6&N=_E;>gChZWv1?PkL_I!g)+hc!z++P;<=gj?FmOuC0|04z^G6fu5pl6sI z=@3&<(+^xPl`WZpseDa{AI887dILRE``8jwPnZbXy;CfN%<&i`KMj|mFPHl9LN}A% z+xrL7fFbTQWLhYaWt%Zjq$>8j(Q{i}7iC zWu@RWDb;_5qUt_uJchp8BVXajKjRt*xrLId5FVlA;j2ZD!3lT)uEz=uG1e{eT!OW1 z%H7V>2Tr+$Pdc1&jR0~T{u;r-#1D|p&`4KJTH-X3vf4&GYsfxcfFRL(gHH46jxc#S zSCysR&XDXW!NLb5x~ttb6+!jj5;%!d-6jLs3c3f$Zzx1Ekvn+gd|R*SF=Fy&3{&*p z!!InlUN$a#F204748B;Af9%eGM`&iaSrAaN!~z0OFV$~4`V55gNv2{P8JFjMUqME6H&O&p>&9KKhm;`tugE8Z91|JI ziJA4%+&~Ox+LDElKINBgg98;KgHSl2H!4r2T3~Hg(88!j!eUMYW$Pap48&zlmFUV1 zn1n9&dGXZTManRRx?Xh1k{20RjRp?HLi&n@ZabGM2h2NLE@*tvt)G*~bRogc z=Dh+(>NiWUh^ypJHR{SGKh9~jl)`Cp1CY9ar9~rZjdbw$n<&-^a+nRSh65w z3*>E~D2~9L^uU0j!YnXi_OBWNldW1=2Q=Uc)#ok@17o6rCL}0kPqi#T9+ie=)Za~n zMLhct3bxB@gBK|0?Ngbi_&6?RgF|e<^F68yY01JCS%!~IG)a%78`w;m5(XU{vhT2- zUiNmguJ+@$_eF~*IBu4c2;>5uLT(@<`2Hvj4fEhLeDhaHw#MpWsJd^3fI0N%mk|NVk^~K*wh)iAE5m)tXfj> z+QpDtyw|HSLwfBwJ=8j18`0(<-9Eij(M+eO9(c`z0#{4JRc-|HJqtHn%?W^Bk3A=N zu-AEP30vaT-i?`ml#PNFVy^e%DOz3}$=Fu|>4BE|vskt0jVv3!QF%Db^w+L3U#>pK zj13MoV#^EIxh)iNd{IU5tzmNR*8%3rju0prWt%F6KEbT%SdzIDo2<}qX6)pi+M=9R zXNv5on=(sHoW&8mpBgY(fR1_7V&?lcFd_74fkjU%4y)4jPA;XA=CS`%1<6$fN;P{& z1-kE_?1UCmwoeT1J>=Q2Mvy**LYChl)ewovkqM$Jq#^wh9vEd7(cx61QpFKelKs^- zu&c{hVjd~TpUNY1P>4ahUk0|RBkfT0(Mopz>W5j~elpY#c`GH@@+(72DoA7y)~+kS zd`!U;x>X@Nto1$Xs+YJIkP8fV8&o?UK$0P0607YBG8~QG?YW1Tj+lN(-7REe`t8X4 zrz#i~y($Q-f~)KN9r_@XCJ1D9enN?}9XsWOxq&ciWEX5Q$N-OZs(JFa+jW_Kjc{I^ z+x3F?wM0fyWoYqR9>S!;Y&SyO5f>31N_?}Ot_DkBJL;q=*NT9pr5Bm0u`S$*?fqqG z;omk50b{KNa6eLOw!%AM?1d<|(R@5v5q3qcpCx=IV=79`VLZo%^3O~rRI+A@mgkGM z-UibrczYW|yG1LzQ1t?*3H8BRV*4D~MkP5oQ|yC`2}{#emMnBuZ)T-RH2<-gB0`j0 zNa5A%CLUL0aUFvsQugQP1|YKzl@rXaj^?xIjzgTkE1+@wGsgSppGofGeRmbcXBG-a z{PpIHInfp?jB>CxD|YdfbQr)HL4N-ZA+HNN0t7QYC@RYa5>}izqpQIp4ALby7qU>M zfZn$dx@sjU96#7|rv6=`xTeRm!2$E2$U33{LzI$lxd8AgF6M-uVx&t!4r7U(!@GxO zfxP!ulavA**Vq4(BYn0lbV{q~3JnS2>e_W#knxH0PEcQc=!!?4iBuE2?MusZ7|T*_ zF(Pw)&nOMHvIw+P-^$EyhAQxV^4s;6a#;OOgih}j+w<%;pd^oeD_UNHtf0tKFsSrB zfi?!U5%exVoPn4HFGPDW9=L0zL%|v?FHIp8C8&6Y5mb@eZ?GwUIv)|iQ+?krLa5p= z9bBiCFd0bxUCQ{hhBMVu4S}sMt^avgDTL0A@3Pw0=dIw#(&~3x^GFi~-)%5JJb{6VimRdS`rT^H&rN>p^6wC(mSrz%| zq^A)k1?|^=C?w--6(artY`ErV6&9+fr6jx zo%BTM6pe8fcL)BDSDyKqTqjqIk@bc|>7fK3_p9|b^-@eFV`U7F^A6SXVf_(vl#Iii zg)^OFK(WTPRp9f@^tDeBDGCy}yShrfJ=HP{tlx*&U?Ll2N)BG?e*2(J{nt3CKE788 zjWehSU?DeC5k%Xm2h0?SRxc~ZEr+AG*FbSm9h>vBL=w}J5-7i8?yz^QwKX;AFc zE}xYq&zjK+HZg%}P|cD~_v1YD3XvVb`TWW6VX*$>sl18linZ(b&~DHsc@Wm$ew|2K zvD+~r67`!8%xX}G=0n;<|Cb}P&4Hha5VQ%Z4PyXyvVJ7X)ANr2AgY)aF{E{5XSSTE zJ{C-N)v`Fkstr7rVE20pFQPIyI7R{tm@B+bg|6+}AT}d`ycR8I#lqY209sK3Wv-TJ z896w?qrd}WD}fWeS*@WZ_wo#!^M?y3qq(eam_<`oc-uysum#49HXtdeg*_19T6}S* zDMhv+mIc2eC)kNKZYs0-J<|z0hNO5nhGB2CY?kl&$jmv|oT9VW`ADnu^50wlGhbRh z*zz4z&W7=GXc!On1nbnuMyqMnh|UioOe<>pDfO-W zkU+0CD3p>h>M<`Vj=(~HO97r$6I^T`RsN;N zTpXZkkkMi@Ua27D$)0}3`Fxo(#i(gkqY9QrkO997B9vhP)qKSiUAa&TqYtSU$H1M| z_dNooEv)@yw0J9s)hGTgHd`*2uAl4in43c=$a#dNPUULC*O8Z+izWI-v#FU28cRVz zU!*JFM27@~UNkASRpWVKN0eKD6O|vbVLu>ys5bF-m5oBN{2*ldlt!Zf@}jB6FBLVI`IRIa~Y!(yU?@XA(z*=M1w*lTJ3R# z*=$$Krw;4fInPRk&+OIvm4xT3Q=oJ`^Rc;5#qq{TpRh5lrtKTONvlTIc&1Qh0H6M< z12D2h6n6BPpbMAo`MF9}{^q^+czRTRhFj)j6L{1e7E+<~Jph6m7T|2Z0d&$CYEqUm zhPyU6C^#AQCxe=a2&K^wxZ5SlR(oSw&iWkx`fw#{{CMUKlVFA75k~TVEx~bU8_;7@ zpRNMrK2=*4XS(sUZdB3WuoW~B;Ct+J`l_==kLpcNV68qwyb%~*E{wj-f{H_QQInQ!o85RhQ-%$$ zHUo()>EZ+{EehuXgpk#SoVdtRl?DGv6QDY8t0jMfX+s=CNzo@>2Squ9=L1o5+K-L1 zp-w6kMMPS`x{HITCDh(dcrS+ce~;drk9daDW;q#oGf0&)zJd-1^DZ`>S!t;ohUAF# zDi%R4p=>Gz!|zc?DnWoLNK0YwPQ;*kl zxz{JEc;t|t<$(b+sYn-zWB~J{rG1@*G&TkC!8@36xRZ)K{{7 zzZeCDf*Tf?8WnQ2-tVMH3&IzFSEplx3WO56NwOz58W}|)v=>6>?cwAO3gMtcV^KbI z{N(M;va{8uW^DH-!4fIy>0F)souhpv5l~cE8t2Xu5ILcAI zHz25Iz*t76IJ)NpRKk?68O<$+1YO;8L|6RujU<<5`YpSLqgrlMaNPM0d-mDodudNK z1}#6Bj-tJO;h`)w0p_5FxxO%KIgK>o{!?p~nwow$OK*xet=!{%8=+p^f z;>As)-c%S94KZI<*#EEQ_5^X>5;0o;gz8Os2U7f=;mNkjqDO}JD&g7YVRX#FXXvI0 zY!gG)l-OrJtOCI&B*6$74YC51at$57>4nquz%iye?TF+f(X1xw+DW>#o0uMLH#$3> zqrTojVU&?v*HS~3hovW3#w8f=aS$TYjC-ap^1fE2i0;W&UrxS0OtpN@r#!`U&f|?bEd6+=bjIlw{E+O&9dM)0?CIzy<;2yrOwD0!tn+(iX6@X<9$E zy^^x9JEUCSSak%JPrZV4c{jLcwGoDpjPeHmnqQ$V_Phqnd(R)tZPudLQUIgIw*QQt zGt~8W1@tfkgq>p%3-EU_8(RW|frn>$7kKSQq4fFABDtw((C4;?4QtkXg3cnV4czl- z!k`OI`W)pIQcbMb7)bPqWM!?U&voTr*#`-U>C(cp-TveU>r-@!9*Q{FNT}IvMfr#i z;LKHO3xdaXTK%~Z_=YX@8v0xVPe%uJmhF)oj$GCH*oO%KwhQ=x`{?G7w?{xKgDkqm zZ9J!Y`pr(cZkk;~sua^v{5c@dfel0Hg9rpOrG6@Xl{~O%G*Z1d0vVzUfw!4j*vK{< z&?OnrE>#MD)T+}q-=?r}2yQbJ`~0tu^RZhEh(6&LSG97e-WE2jr82SAgiwHl z6@MibKKSG;-)i|e*XbR&@xfufoDcB<`7fz;Cn!r`Q=gY_3crO3g%x7&p|mnqZBbGn zU#E4CY(Q9ebY5|UWyWKxW7qtGHpx`F_n0I5KL&b5vARW?sZ7=BekXo|F08>9(~v)V z%PvSkm#LTpyV-+-Lo2Yzx;YnsQHc0nN6CJ_Ly0ArUn62oC7sM$#RvKdd!okhRR*O zwJu@W7L&ccCuMWz6Q*)tw!rZh!ZstfvUufGLx>O3puvqgGtl6p6wfy$hXgRw^%*|& zLi_*{QLz*x@51QAZ`_`S_fuYC`(pFH)yEQ;BY7Pt|IOK(c>h)8TEPvNvDKL}ylzO> zFp~6J7)FB074S^#>3N9r3|H9Sz<0F1p`-4>>dx&ET+V8%r?YuF%K5pPPpK~h1Iy*c z*rZ*z{*6q$X$tX#5BND8+3JhQY$Ah*^LFp{sEuLlM`&zk=SzlT@P6Oc(2?e32Qc1N zz3RO>w2O2ihtZw+Rfhe1Dz6e<2&TT;p&vzii-LMPTXm}?q#=XJ?o=oX|AjOZ+LDuL zpW2I^2#_)l*dja({(}YJP6D3A$*8fdci4yQ-OxKh;fPs9qynd`h`%8Z!De)C9&~wN z3k~aWCjdi~VuJs_8_#Cgu^8OSlw$7COS)Fw(t?S6=i#$&*NL`m(un#jOYvRlqq@k4 ziPsEENBBSJ-a=|vr2S=VJA2Wa>f@C+O&+lLd8XNcD*8cCU;LCxHN2r=0pz&#AbG%k zd=c{C$50su-%!b3jH-5x%1CcL>7>^k11Dwf>x%&bJ7TCTI(Xp3Ha$2&U-Ah8OM1X@ zGjm3Cbzvm|`N%-xHN43JxhPXFzOK-2pm7s{0)rKHvS7dvG-(0dKlcE^lyI3k)Q{3c zz7Ad(a9ENQ<5cE|q;Z@|(Ba_x)-(ow;2sQ14sx7t4o{*h8k8Q^gor;4PPm{)q98rc z`B2Y?g(bySBBP*kpv`4?^#Z_sH?<2q)Rdg2fBRVQA9dO5s;9Yy$u}t6jI?tAS)boH z8X6mhSKto_)PxxbY!!5v9zy9K+}irV&!mr;{uQ9bb+;?ksX~sF3!F3!tP>gK=*mb0 z^6sgE9GtSe_TVj*&C~e++Dv=3j`H_VEmju|qv*g+NT+IGnW^YS5d0u5suEY}rjKT}StJG6lV;Do-~+y9mEBQ9cIDt2VuL)0}PFJNb9A>Mw^OMa04C z{Q|PkdyXb3j@?27Gc&t)wHd^Da*}}~-`qQ<{cm3wCoIwkcd%XPA_^55+-rWsZfFHs zx2M#N2T=WhlJiAmRLz1Lo(Pa0+y@O3F=s;*Z0$ECw4(k4%Qe`sgWkLB^b&na%bZ;B-q6 z!Fs$1)~3@{Ix8ln;=SOY_za|N(~5UgXP zsXf?Xefs1nq0@UUeqVr^A1CuUo{P~PGNEy??=)cT(hWZ$v?<}&XJc$Sr7T3S#S5yq z{g&ZqXWip`CSwNu(*AcZde&_Ru#4TC`SgGWO3@UaFI$PvJ5}*6p=T~m& zR;jQs%b*qPyu33gV_**@Wkm&j)cq<*7^q(}hG-i%F7|6-5;@9bA}9F-7v$R&Td%#| zGMn>;*6`5|quWsn!_dEK7Ge;i@tl^ z_WqaOZYwDC9V9oj{Dh5Mu$0;IHa7xpN#&@6Oz4-M07cpIHtjL<(Ah)PH~osDKfeKT z)4YYJ>GLcL6M-p?(VtsmM5p5H;Hajo7~clk9eI8)+1&4=-&6`+QxPr>*^h%5Wn?VP z^2bUUd*ik4|G@)h&_p83h`k*u$8PD#TV+LOyZs^?;nTH#m1j|1akH^!wm6Q8|0T$Y zP*!+sL;vT@mq(TwfM(B#{#supx;Qt*_M#gOj4Ee22w?3n?IUChCE?RcM>XS8VFcao zR0y3Z0x1U<(UfknFWCS(PmD}FzoB}D(qjUNzHh%kNr*~DmvIQ~a&@I_ zU+27m6Wa;J)nVw+Lr;nr_H*D87h5jy%+FP(dO$^(=)c6_={gx39b! zHE=*s%9;TT)B@TLXkeW&)7a0xVG=!mv_XEU0F8YYP-50{RTvCP)t=8su$;zvHg`LZ zocA?wdedM&d@L@0U$DjrHoj5Vf|FNTVt5ap4;^N4`2>fvH2ZjM?{p=HNEWKiffWnM ziyG>ns*x`8uE_?Ox+DCsl4n|bMQPB%q^@`gMZqpK&ShqS&J*C-*$Rud*Fe4eH}V7z zLrduc8J#W9#;+y}UgasQ9H5BgULB9&Hcf_YYTeVcd-XQ`sEP?WUjX-Emyer-+NFDp zE8utL!GZl^YaS$@t5jaWlvf?C3@G5^$PIK8GrAqo8uSM>W|Xeqp?6Vyb%0|_;J5M) z?4VEdUP!l`?=hH{s+|Jil)P5RMLm=B_Q*V|G!_)JM+4y99-arut*N!F-q}GSl(NPQ zlA`1pJ9{3VwPy5G)p6o068NM8(O@S6?-SvegXMSrzCp5-kC9qJ=P+d0ye~JmnV|x)RsL3BhKjrdsJDDKUaE`AOL|J=*j;hi28?rt6_{X-bx`5*`Ky!S30)yfWQ3ys_^ z45ZT_(C*y|C3f0|<#JwsMIKXJV(V#YiC|N*jqfGF=JO{T6E?5wZ>|OlyCd9~ji~)q zwQod!HhK(_X1f8IEum((p=9k{D>Dk~N6V>sQZ}j{zpeSi=Et@fEFa~nk%(fTCk5#{%aOZM70F>4Re%FmcVnGn^ z7^8%zWkyp}SVOwJQE8xbM&%Hsb65PpOn(Z@!2?E;jkR54`uSC=novHrFsVLpZCD(p zpd})J!@V(__7*blzP_`KD@6aWGG@`s!1>h4_Evhh?)Uz7OAXr~cT9uoVcR4G%h8&< z!h@n;y+gDs_bVkB%jgXF_A>b)y`#y1%@9yr{fW?e=(W3jtw|ORoz0 zJZc|R<`r?GQ5_9xF5PDc2dk)f(S$je65yzQ;S6In%}?8VNnp%To`EZhn=I) zjna>>`~&wP}4J@)I?a1KwlLYZkV z)J7_Ua_yn8C|JPHkq{J=CVk*Bm7A2z!)QY}4f}Sg%hDNbQH-w@M`Z{Uz4&dsK(M`kYx`-IE?!L;c1j zEmc$IkvGUK&MqIQN`=*t@+$S&-ob*7#F2D+p)15;-?%;27Xn+SM_H>`xm~kqt~B|6 z!2~cnNW+t7OanOjH|*xS>Z``Nh8ts9=zKirZu0V@!iR&^)c!%&Adk733kb`vU~h_% z)N`edztHI4CO>xivqWBpm`O79#`6r?n;s)FDEU_JhzI@}4Lkd14O-kEn!67}m#YbU( zTn3!HS3MC906)oD*{D%>&h>D)gjC;t-{KBKW80)682pF1(WZ1Lk>zyNqu#5APtvo< zO*UAIB;(yjibsxhg~8b(uS~=vN3W}1;1=ev4m5aMZU)YsZj{>fdM}Q)meqLM7BBXO z7`a*lJt>~_sOX&fDqa@x0E4$`0D94@=4{e|TX zsU zU}RS%Fs6Ogc?XNt(08#ZD5gkzXBSSbp4ik zOHCu041EBD>tUPg`{%{l?>`QWq-$GMClT%lc$1ybW6Ap^((cgegKY8?K4}R~@=}P| zE`bY6zwme3vtJ>ypN~7vR`*p#F9P z4o9AQi1hlthzY!*q4@0232eK~heYwQ${+Aqe#tg4hAR)4%LIfeQCpcPc z=xw36-ODx|nqT+V<-UR=hXD*%twi{QgLDb;1+SFH~0=eZL_01NApNc@Ez< z*ggBs*O>}{<1!Evt&YHrTY30w@9m1 zhxOy;osjJcmy)6C8cH8d>RT zPYJLka|_6U$WuZeh1p_~Gv9eW7EA}L9tWP_42^bEvX#(S-CT@NkLd>gehh$bWQ z9OQvMT79+-TRnMG)X*}}-udyMcqBD;Rmm$et@eOnl;x$s1o(Mb65bse1%Mu*M~Qar zx-Gv#5BN&=!0Le#55pet{#SzpP2T|yXvQii$vS;goC8~=pTrYYw!shggO$Wc+e3JF zd1Y*)sE9iXZ4}Ty+_c}Wnz$-l`5{4M)Zp4|w)!pKBiV_)r-|LL3LRLS z3GVTNgxkVul7{&Xyc|Htnusf7uM2BT1!U3hLu<*c&wM1f;g8tfe{O?z&g$FAo5PR{ zawLnaBQrh#&5e}G*2E!!=0>PIv6eFvTukUEfz`DFX{y@~t81mngfQWm*k~NKHUH}B zw~TB@9uEyo2XOaKz>rYK50K_=SvPH*R`NT)x&p9vo$@YNUGa}tVRcEs>e}MgOzbw_ zenk-`fS=y3ZM86icmWPc&WmYS>h3Tk97>Hu7XwalXcvz=^z6~n4AnH?2IEU|Eo$QI7=ED5X#jfkL zT&LKigw-W=zX1~NKC*GR(Kz4GYKP^fcs0DXv1CH$GWel0EW8SE>4UkCtKAIn9h_9* z&m%rb5vvQ1k#TTosIkCY_iG5|%P*RR$Znd>tdhSWPc$2K3h;>>e46`6nfGE3r8b`L z3H~H#(V?vO?0~1r%X36ueWjk^`W$`Mk59&QSARbqP;&5m`=>pm>_Ol_s%(c#+|Q4b zDA$ALE4+%>BqpZ{~nfd3|P8>Ush6gTn_pIs*l zpFPa`agG@3!h2uY27cxAZo>i+H`NKhx^`RIR^l3lm;5LTzYO2jyt8^0!(?<&K?_G% zSG+38XsmIyp@wnleb;PD@=|wT#OLaC2Pl5{baD9bt~)C!j#YP?+yw6`%Izgc+70m^ zcmd(-wBU*+dLcQYw~hDw57YV|mjQg?e^@(L$l)O>yBTXqab4g??}VQsuH=#~{4474 z_viF<+en+^LH6qoOx5*`z5K+%5|7Nq&1NDjyyeHy8i9RnZyx&t+IJIPqPty~l(B8a zw*y@DN}xzsTaoAC>E3?Lq?-V)NP?RgGbVs$6Y+|Fst2w73vqh5V&G=tCekaW;TiwH zBL~lLf)5!OOd?sm;*ipE6XA1H=J@f`{|PmS8zB^~Xne0k^Wzmf8zCR~n)yd;bTeF1 za9D}ReTEiD+#l>RZ_7=)y(C|vTLWMCwW?Z+I3#FXs)1CrAz!bnoG@6hr}x3*C)ZR) z|9A-p8i!wBcOM{btTnF5@RXOoT1F6JIJ|FUBmAOn_C}bChYAboGoikt}y( zCZhcueDbsj2M~VMTsr)svro%uH3SlVFoOh6gXFEG1d_L1Qf#rcEZH?h*xw3 zt_|YN7T~8cF4FXW-%cElOS`Szi2oX{-w%CUOxs?QZnwIZa7B`kO$0G+UzziK7^)jI zr0YlA6V_UL{ z;~C5@9b?KroVn`gR7tB8kiM4|+M0?a()u<$Ll7SSey!S0(kq7H3S;v`@*h8B4&Lg0 zvxW)j72fbx|3GgD&$x}F;-&qX^a^b6jgO1t{P7tE=+fLiKf0Opk`%ba{#-06<{ln$ z7&%kY*NzF0T=MD>JiRI;ERV!E!A=ZCNAE^issCz64_CPeJidQzkPL}&f=kp-z$J{g z%TJQJ3R>_KE5>eN65|9DoB+RMe!P3*hr{Hbcpq0b83#L9foVMGq4p0_ zFdsam1K)U0S1eIXQ9Kf-@#7NH8j`&Wr*$t(*IeuUf$hXMz9I*PV0y1@0f|#gws8_k zc?yMJ&XJtsAJ4#$c(2z`C3#!0XurXC9R4LKj5sBcDd@OO?PwAsop|wi9IK9pgWSZI z>hp)K=wx}p+Jn@n)HT5`W+DrMBvOoXK43XIXk|o5!-9?5XP|oPt3&E0)G^_Byg4#J zMtn3LiT~{4Mq0zzs@o0;|LDex-+-YS=aeQH5m#zlqiJg=UJwTaCr1l*m6cRC>B5fO z1+S%kF+lj>kFWI~A_73xfhS~hMVNqESy}zB_QF%D4m|oqvKL&xLgv&cd2E#T#~1s@ zZe`qWxJBJ0MmPR=i82B+SCZF+L&H@PW|vo5JMYIUvM_TSm}pNrU@y_u1ZwF0c!f1Q zKJJ(F!=zvGkJzS_UG-0JQ9Lm)5M2JUT%a)-I)t3?%A@J53)i z%Bpp4YRUO-U*KGnQQHpxGm-x|>wAmINUd{3kghUGE+4+(2rsOdC+|LyEd2fVAw*@0 ze*Ti=Ghs1E0_~(Bm88TTlAl~%VfxqqlWX_tE_|uihnrWnlB}gv0eE;xZtjl`?=H*7J{g3Wr6X>6K4p0>f<}F=82LaovnGFz0Q!PK;W^n^3M#_;vxap(wSP6|Ger5)s$C>h=q?~RjHs8`B zv4K87q=!W=#P%^@d#~F7)X@;t()9rdqG|~3D-zQW%Y+Tu=W~hP=V3U{4K2%5YX9C6 z2M=CDac)F%W$k5fAlsW#pmf_IoSQazSzuTz)$oy|j7Hfx-9}~A zYQb>XX=vAtGoAwu3%?R}+h>JZ&}r5JtuKDi6{OX|0HEsl+~skuWxsHs3}_r-;c}dO z#!#&d1f_<)4y|43s)gf$Edaj?EwKjXRoNZ4)i1j5vj6riq}I^@s_Vh}J4RV@0IJIk zK=V)ODA?1Z?ELR}L1+6F73|it?{o)Q|Jr)GyVo(y)!j))PMebC;7gmLFHXJ_Wjg(8 zOweA>=&YpqS;^c}ZX(Zw1wZm{TF0HBRV6s#ZSMH2uf{}sB6JAA+Vo+`CFv2!DzNL@ zap)S%0B9JW(Y&5bYMK99Xne=&+lBu@3+5Mr38vr?Qm z96&lURMvc-d~cseWen5wPuWI(x_Hsu7={|oQ$)fdqcI^R_CrB zM^NO8uc0RC*jnuXew{?JV`^Budlv;?=VjQ}KVt#Pws(WFq#Gpqbk zi`^XqMQ{_(-ax?Ua>FZp3l6s^rELM|*XX7EuYz5%#=1Fjq8GVvXilsiJ_p#MN~!5+F^ z40oufRda1mF@sG#5&z0DS$QoDVR^`|o86Q9?_7|pC>bz$=va>%O$p5&GZC5{ER0EnlG2J16%){n%IW^u0#*}1-}i9tb^AsTxH2I zwE3G0Ah$2HP3} zW^|;x@<7#q#y-CR6oJo}j(EDlSriU1pu7y|fL1Qk%4A&Tx64Xd&}dT@nz(=7+G+8` zzPbMHj&!cMed}la=#=Lt%zbRf*PJV`GrV9{)a4^Y(P3wr2>2o8J;#8tLTz|(N~Wl5 zueDdjSm=fx5AN!dwx=F<&3JY3MwoQw9x4@HzL}z$<2e{AT0?VPn2+9{s;p|i-cc@} zJt-{&YkRkAfD)L_V1j@73OQewV`bOW(4}-!oj9xzvzX7P^DmOU-7*U zg|pS>Hsj{aHq*c`!Fp(?d3$fiK8~xkhAAv34q9luA9cFi_*P2P}>wEiR-T20sSD9 zP1SJ)#!QHnw!cVLM|+S(@YqN6#3D@qM|g6m1NJuon%OTBXNc^7?1(*u&;(4?)jF6N zQk#SurUg2>IXr2laOvBZrZNux44k=t6a0N_%RvW+hLj)$1%&H%a0mfu>A!krDcmpP z*?-{&BhEE=Vp;Zn)O|GGgt7lwViVlVwAr)`Xz<3eq6b7S>IjM zaN*4lF@Fx{{ns9OY0rBu&v^Flh_aswR{4;8BTXpSG=h<a4I^VL4*%y`#l)vY)BP z8S!rGZv{U!-DCt6(Uxtw1kK$nk8vEtB#kAZ0&q*K9DKs5aX!uR(YkxmvWK}`k9hHO z#QR;sXuJ)|yppKTM1&W3=Pd1#@GB>;Ab@dBPkd?_>(=;D7m6;IrcZV>6Kec<5W0ll z)5G=Wo9Z$uu)UIhTB#T6v-{pxIoUkrD`9Azb(Rne&26dF#b+tAps)&_?y8bED?(LV*f4QM!x8tot-gLY&eTK|41`C!_VQ@St8qO3iSCOz8g`! z^UUiX$RFN8Gb745a50rTV4(FRAcV&_n9iezMFm-z0qhrfV#`t7)_HmHR2|vl_VJ+U zawc)vK8^g}<=ri094-P%n2{ zG}Ef${w&Kr)?`c-FIxVYvda_--H9@ePGQB{g>`T?kRGZU;9Ct)sys#Q!!qp6h4k!y zw;$Uh)85Yf>i}2X=Tlc@=+E(t_S{`?Q*j_~+0|^q5+|P?9dIHlKLP6B^Rk7`iHyc| z!XBIqt)~_u%;6cBLWVKywv#yuzB*Zv$x9kiMvD--Mcr{~`b4eRmN5U3)?qL{c7EE{ z`gh=nz5evKz&SjQYG3@*7ABKtLdyZ;S6KgR%#2o4s&lZ6$+S;skgc7LUPz_Gu(_D> zNj*0g6&vk{AU~ns5+ZXlN%Q#6>wRtQYTvZiwY~40#xL?7^6W0j&bW~()Uv-U6kb$L zGq;d`@G940V~2vfT`?jb zr@99opr%+M+23tAFo438PU$-9bD8Qk(eRd%Kwa3uSz0C6ZXC2qcXoan!T$ts^Tt%9^@2xdV_2y6W?TrgM8Izh9PC zDELbM=AOn>vM(7;Ln9#qx~X5ZdwkY$<`a!#hJ+U5xf5-wxFMxP$2BHnlq@>b7K9~f z>=c!APU*!k`kK0kUMRm(lNSgmJPK4OLbif$P^WZwFFJS8`f&EQqpI8(Y41FMN6U7- zCtFAI_Ej<~v9rsPnB@EKp`K2Fv{R}nFv$teUiaFvjgvnXS^RxfX>#hiw$>qIPfG^~ z2I5-CxYQ?GWZli%3=fqUO&CKs9yd21dN9vG(JJin^2F8U(*xOOX?ho_uO^Mt>m29? zzje9z_>?Z)H9%d9Hp-ONYQ{kiBzr?$*_iaW-6$Bl#_UyDGL-Z8J=487pvuyW9?6p@ zFlK*>o-}LorAwv4{KEGShA=-6-&Mjn^>@S7`LYx2VMN_yL8C3d;T$$Ro6u-fGHfX} zucKIMou}UNxzZ>;DP4wP6PX0N8E!akwT0oHD7i}3d5S-6l!~Z8i1UN-wOvo zupX#{`lu-romvI%e+E3FA8RfJK@W;Sr`#w*ByR=V^&D z96(R3dZ{^8rDuN@nFoyr@Mn~eAsvc6HCk+)V4UPIsGu}$0lSw}+VX61c>aYJbo3Zz za^W3TwCPZpEJa40^synFR({E-*ZC|_%Bt%9ZLLS{ z!w_vM4!O`)*{cePqK0slOgwJszI&ZHq-+9;Uh3qflXe}R+&6FS&U4{Q{GiFgdm59` z8>)*BD@Z-Z9X%oqG;f38>p5$0N-s4qEt6!z;kTEX&=;TO_@CO~rPLIt%C+>-bez?m zDzG-bzDqjz&!dy~I!C0ZEdeH6$thBspxMkdQH;XOvp`d(GWi^5Qu)o?edxWf%b6~V zd$YV88eFW*%E^9HjlR=v_w5$)V%VuvhYJ?6AnNi_ADrcS@Ljig)=^w!7;3ApJnHF6 zYX#JBm9~=_Cetm)3S}D(CYbxAO&U=o9O?M;gjc>SCmvoO74e^U6U*J_=711gH5%^p z=H&%XT@V$Tq9`l!acGCP0(v|3Uzh~mocOptWA(n!>UKn*DmWm zp6J<_tckEh_2beSV&)Dzce&9nj zzU=1$rQA-kKxk<9He2oyQ|Cw}a8yxUNh6AVL}gcj=JH%)r?o+-uP#Cs?ZHxIFE2o{b zN`#U?XSUx_`UmrzB-g$tyrfU$y2r^veau^ji;`2e&$ykIut(t#V_i6u^fQ zTb%5btBhPv>@O8AKPVjYR7V5aDon*hWZr31w~Fg`A^MV?K{{#QNfI12MLgu8>qp*F zYN965JnQ4*GB2TQj6m@E+d<#;6a?JTC3f_C`pzW2Z}c$?c@NL-m`BaHfXY#NoH;Szcn1xs0*-9@kEOggs$cgJ>OgNtqXS(SmGwan zakfjM%%f(yANSw|gOzqfl*Zd6-7L0<%2CQJ;V?OtEWIsqPDEkz36r%3riIG*b&y)| zjuZ?h>9`~eFTMmg=da{8w^pVDFqFK>ObJy(TbXVB!1X~#Iu?0H17Z=Usg&UQSmS%M zDwVd13KF>(jgI!&3ag4ao}n=6$*8$+_1&n!u)>jXhg$0-hxeAJDj&~;FbZ#TUMj&O z8QnWH3~nQeeMdS(G*$;09TS|)XHja$&gYqmxwc4B0sd`uc)w;|8Xgr%P2B>mGE1}nNBz|;c^m>YY8(9K@4!ysIYWX(O zl$~M%$3$zHf6@GWksLUlSK*O;(1?QToA;zdQ@9=U021t?2tSieXWajlAx7zjd;LVNdgmKJ8&5INhR69-J(_Fqjsg zY;Tmi@LUhlM(p|A-(%xvs@}dI08EA;x#MC&N#8|TA{B;D3QMaRKhG0A|g*Zkh>lYw3Hee}lMP$@x6HU@>+wt&!buT#^()g-TRhb2lozAqUIf&JYx zGTFF{a^0$R-z*%jf{u~3tesXkP9)C$OQns(m3Hmpw#lF0n<8AxlQ?N@W!H)Ix>0Lh znPoUwXp~>)>yu`I{$h%{DOCp&QB$f|vo@(<9}Sv?A9%5+I0Y^z7+))cQ+Y;9iL1s$ zs7j8r3N;;WeI<{9UH`mGvrJhRi(@_{^`knzkDHM+7ENSPr)n5Xl?Az*oxqOb4nTx| ze530d2R{xciPWNdw{@-c+aZV~eyds3E10`{&bUCQbwKKBeTOxAcodsFdbvZnhd%x6 z6xDW*Q*H-71k7x6ddupg22qGW%(0}~=bC%{sw2KbQoO^W^G(d?<==qkmcnHIVdp_o zvHtli=m#3xiVz@u6;_fV{bRHa@0t92&)G95OufCMM(#;uQcC1eYKC5fm%WJ%4xTO7 zkFm`bnP4DPhYU#3)2lL-0L4&0PSwKL&-n00Qt-@_C9Vj0OaEKn%&XH+&AT1g0h1`k zQzl-3<1{$&)=o~6j+>r5MJ$q|am#(r=clgra{7A*(t^ri|p zY^p2B1=kP316Lah2b;ITa@y1HU+D)sSaKR&S!jb;7`l>8j@>D$JlhJG)=mY6b}YI! zkfX6G^{4Aq-Djk@!)H{=fgoDr?ey3%@xEum#RUMf?9g4G;@EILwR>PtW#^dYt|YhY z{-bdQWyBJPWrmJva8*oaCo$Do+^CwWixq%Kn<)(6pL_P@IV5@hbJx4ASqB6Y+wpv{ zub8TyK*&b5@t}tO9PI;KPC4<}C&OScJSGJIMRApk=0aV^A$GzNs;^0>&*G|T8!nkO zNB9{E<8Y3$c3P7x^HUR)qkHzws>PO;* zX23obcylNFRxhAW3<>s~C1NV|PI3N>#}6;qbydWAQB2m)AoAV$L@q*HV|so{k|y@Z zH}jtWa1%3C04eK=IdN;;ga(N6ncPUkN4H02iU@` zreBhEACavyuR4pTF#jxkpHEs5rvlsL{vpW44)lCKA?z0Gv_Az9^uIB3fp*X#uvUdd z2b9N8W!5|IlH{s$GF`q)aIlM8IQ8{N>ta&fMH~A?NHnv|9a&yg5EqB7o4y8UNS?eJ z?+^~nOd(!O!AVZKO9id)rc$v@WQncFsM+spQhvSu^=A~f`&C)O<(Gt9yMsF|F0n*Y zB*-BUx`P=-@1NrxzAM@bP9VM`EmP27UdN~0Y?)KwM%GOuwS!#j`?AHVqTeqAV1R!{ zHvU)N?qh0odG!y!RTtadjbRap(ycRxs|HfcL^A6r*T*H-X4%xp{EoRXrSUxB7+=pa zINF_BoZ|QRg#Y33<#N62%LmTa>2KN3Wzm^GEpu_LU`6M|p9cqXLu_{lw>P=p{Q%cF z3KK^k92xByhkjn=q0-V2u-rxIMS;=F-F_4i3$&eZ^to3*GG_)iPen$W^DPz7-?ZwP zifL(F$D+@)Yw$oqfn$9Se%wO8Qb7zH;FkcYI>#Im{~3N~qZ|=rWodstLLoVsUvxNS z_yWU8AJ(W!TxfjJN;>UHp|G-r)(cK&RmSx@6RjXob-IrZ6YbgcTPH1r`e1*`u_C`B zGh)v3*H|*h&IZqjMjrOfTs*;UbFmlUVRCXw&%=HT?bAseHAu6!v3_P@@KmK)`5^*tV@2+r6C2uhQj8&7Q9pP-#&k1FH=n&`Ba*Yc*4grBLtcjJ+D zzsX6uP^d#a?$^2ZPbM2csy<{zo%mvSF=b=K6VWCRu=c$_#W{Z2o+LYeGN)tCVSr}$ z1uE^|kClau5Kz)NR#Wxd(M5plk9ExG9D`;90<_l!DICPwCrAe6Y z-|mx<+s#@e&DULXbCfbMpT&53$#>EYH@q~zWZ=_m`q+rAw|ldoo$=)TMY!4=)ewt0 z@tItwS^b7RGM~4qWnqpZLXakmlHh zsL1&pt|*JOTkXQOaJwu(FLInxZI4{A0lX}-l-jyhD&H>EYOvzGZ`}@^y=dc9p>h2D zlzmb+ARf@<`!5gsoju{x)Zc!LL3Wt;99Pokdiz$mT1}|P6rQ7jeXEstdjPsq4n$!@ zQCsJycVp=@Pt3}H$aVBf@l5O{D0(V7`cuMzB4uu|tcvKvCl%wyZs z8%&|waXDiu;GHSW_XV9u6!0?#gt>~W<#S4VT9%**e3oG=SJ0@Nq0(gdCxph`Kj+9^ z_lb{~(%;0jQ0|s>F@^pF3wfFMD_z@fRea96xji0EldKQgDs3B5VjO(R1{=y)?%6z_ znuy``(Q{pD)aP|?BquZ`%wkKgU zcS_6z3yIQHO2_b}G2IWz_C7wLZL@g%D)|dn(xKtYP1M=Js#>L>m#g;Xtn@JzVIy%L zb_b4u^qCXOqV#12LxJ68Hj}sQa&vP5QX(0U)VRt-PJbQSRuyojUujQGiLFqZFG}~4 zFMcU_5!n6Hhb34gn(1Z1jo@ysk(;wm6`E^&3geafbiFR0>!#}PBvlk+?#Xtv+P%)w29nx5ICZDEI>wlvMCv&6*V99su4e(EP> zP@<5_vb@V79f7ym^o6&ls`%nj^hO!@l^7k?nZ>h$#fw!(+BfI2Xuf35fdgTR;Go>X zz~o^$JmtZzTn!1Yvek6rh~Md31*dB15^D$80a@89e}cH#i#pA=vQ_P()=SVGquiyk z^M_Tahrf-T&`lBiBWU6~-h2{rW)L^k2Q0=&`R^j`me2muClz*wc$f)VDM)1L%`b(~jrL!#FMJBW57DWTS zb3>;58csrgFhnd%`Mp2?3{Dp;JIE}fGKjog?v4JVbEnen^{QBiPV3I@aa0jjy{SO2 z!Nt;Ws+dE=t5-^zY@T6xrCi6}za`Y&R6T$2mJi;1*_(q4{E~Lr%=^OZ^-4oW=7%yg zeJV+nNuM=hMqdl1Tek(Vd#VNo!$n_`Lq0&~B?IJJdXv7}S9F8dIfhVZZU4=jZqR{p? zA_bR1&yCj=D7zhcJJ-X-U#s*Ks?iBJQ_4J6b@8O0ogj2+D2+YyFja)8wBmXYx866F z3_&f;v|E5J!4~h4UhMY7#xIN|{YRzpRO+A-^>=?RDSew>mpVm`sfymyaTdvG@SJL;JUYF0E0~|f-m@-7iQk=;s2E~TAr=B zAgkGa`XfbxbrG|RuG?5MV{9_J^#{V3GokVLX}`Ge$TCWjC5V&1>KibYPF$}rOd6`x zfBt?d2O5MZ4m~4G>Hu&rxE{p0nqb#9;L?4m%kgshTt_~tMjCHF5lkG_QVAD^Jr$^Y z>I%!PHw8(bOa9d}Lf51PhEBL(mmnG_;|_TJLtEF46tp7UuBwEb^RD5Lz7O z6`M7^W9PCI8|JjVM0#0oxEfU~3&a~9F~P7qj=I(xy}`fstIT_)f}sK`&uYH<-e9@| zKsJ+SW@VF8&QKnGe(Ls1c6aW9^f6!F{84uWe+H_QaeKH!WierM6z4l}?!2!0D3@N( zSKoks)cdt)a`t6(AZj|5GOVkIT5@e7dY=9! z%;%+&66~LS)8=_SJjU57lgCQD@S8iQMw?~)gk@~@c(|~@?3kXIoQ__Ajt754CaY#d z+&DT~=d+dDEo!%Tu}>?eMGlT*@TmEW5Lyicl%{Hc4yKz@%JS=sWbk;mbF4#eSt*$> z5rl;*^HYS_$&Y`zcynjx4v!hy@P+3;Q65HKRjxiIDv-!J()7;!eRZp8vE6)nc^NGg8h7e=Y0mE7`;i#Nc*@Hl-Evq`yCFu=C(HAITgA)#(Xl$vxMUL0RJ)O z6yTHH>4lWpkjgLs&iwX1`pm3jl&gib?8sz`Q(kCMsuLutqFWHocYQ1~n-hZPyx@1T zg*c`Db2-Q2?dpz9lXAleh=nZLbHo|m4UR*nz!q~62-PGM^dNCPc!5JVKTfj@I=baY z37iv33XpH^NWRR;HtGMmr**`>ak@1K-JFNYdsO;*A>(n$sOKCf2; z5S81MLj~?ry;5h%=wVkjw?s8&G6JDhVC{k3XZ=GLjy^s7@`y#9%y>I5QQS?NM1~y5 zTqQ%(U*WP(+~%cApk!aiD9n>lqbxhPDDdmX`10%aD^2M5ny=XnOY$mpA4X8xf%)<{F)W4Wxlt{#=?`5 z1%Jt@YicMXi!V{_o;ADOj4BmDovx@*&#_zm-hzko1j;J7PTLA>RNNjS!_0(qLH_uT zC8{enlwD$l`1Xmt{{xm_AEyT6JjaU)R}->Z^X~+-wx_$#*%9*T+2&+gW;)bqZG7F zHbZ*j)k=LTWNmy_`tn$U5nmk6&)+hBp)=UO+ZR!TU4K!_;RluJT8>af0VjHNafpxy z$&?1+7OxrgY#M^P*JiPU>fV7iJ^sxQG1_0f;fr0M2v0#=fkf7STdpggfdf`}O8QBh zTG~W7vFf6fXfkSAG7sgRe#X!zakab_TH4oEIXG+xZG|7i@V<}Y1*U4x)*5?JEe;s< z!@~DB+b~%;sEB&XD|q2JK>2-3h79Rx$jx>4kemJWM%DmcFGb-mIox;@-JEx zD&Rs&7j4q<_Z+8Si8sBOwm`|P$n6j@d_qit{|&JSTavrr5e-FoW!_(N!&k)Nfua6H z@dekdLfeKB1C3z8`KJEY-_cLdUj6Q=MAu&*VGs(}(sb*8 zyyZfoXlIN63+)THSQ=JQzDwHtA4cK&FoLN`AKUrY`Y@(IEX7lq8u7pE91O=1RybEJ z`}f=VLn<)&izAeKu}(j0)}Z_jyxFmz-?y}FfMp$Gg`ZSY62<)wtx^M$@1EygVHc)h zXS-u*ecZ^W4b;3Yw!7728Iyw_^#&3G;_^%L?Am)St<#DrBFydINu_J_-nOGi=||88 z2g{J&)4y2#p4JS`xWl~t3~TM*FWF#`x5)UqpO@$k#ASU2dcKzUvYmw(3c1jS?-otd^^qsE1y z(EqQIXq&v+<^P8x`|JIZ!FiCt-ZhLl%xB>1v$G0YBL~FfD%2C2^VNejjlukaFMhqK zuu9`!Lfv%rqFkWIdRH#3@9iz`t=Vt#c&$E`Iio-T@xp57JSi6 zmTX0e7!+XqzFhw=cdEdcBmKQ(*Gb&6k4b`8@;W4MvGyUBqPT-jP|7i`k0%MT_X?1I zyz<4r^#_YY^a`}+9qHOYA$wt=JnLw72e#b#ZmQ#bQ62bNvHb3Jef&%K|A`Dc^!QI? z|5@38R)*!NaPj|hj9AVT0>S_GvaS61Z!cR9t5$aE|H6;WfCVw;zwl%IAhhaL|BD#^ z;>UkM{?_gGzwl!#KmI$HZJura3qQ7QF2Ilf|Aimv5t0MzSOBm?A7hC+(6G#g27FX@DHsFo2T|jDS?;ANrv|0XgkMM=&?aTXfQcswtdU|G87yBd2vJWy&v3-;eIj+TCU$ zAEa>I#`|uqG2tN!pP!uNh*`To^E&{vGg26|q5DNlHHmVm zid}gFmu**q*appO|A04NEZr+B>yd2bT@?YxFyy$qgdeo503zxzC(5socbkZK@85Tc z_^I@X-sscFv>Wnkz;hg^k&+z8m+Y0Cb{KOa>B`UVm1vgzvt@rGRd!jSt(-XBWc4(l zbpYMe-5{M@0p==J3>jMaLi*DuPu6ccHio%=aP{Z4a~v&eaIG9aVRjPX!t9kxgfRB1 zo|V-tjyC>-?h6;nEdgmIw}n0(R+(Qbyr36@TNzn#SrIgc*6p1wuhAED>?94=ASyO9 z9$H^PI2l@sYjvHn8ZKT60Ujp5N7;#95Vkf>XK zad#1E&AaNlgDYC2im6*;{LX(F&ypodwesoLr`2nB=okX1uk)|M)U&SqTm-Ws8U2M~ zP1k=^_7kb(ipoCWe>t@V2_gL&Xn*G(wS>;vF7oM#@u`;xC;Aoc$>`3hg2@ITm?JQOBB?hzxr!nmg0d(Nyd&a#jDABE?* zw>Ea)r>O0#YFzjT0i8A7?_Yr>bSo&NU17~ai6+s8uB`v#6X~Iw4b&-cm(hZdZObh>sH6YbPs+fpX zm3ylEubZP|uBu#NO!JL8j@6ZE;UHtx+HbL9tn^ADUssm?eYBD5e=Pm=iW9uy@!Vm} zl50@`(%!K5o=A)w={RMpDkqRii3Jj~%H%^f82S~`em#}hv8HmIKs&|w_Bwksm!Cc6 z@yg|mTK})qoA6mq zuSf-?zGlgX&}AAYwcuss6EVMu`?%2;BJ>v~|Cgz2tkCX9r@ijsPa}=3H5gzLA=uH&?%X0eXm$g%bpIE7mySUO@eik9@*-EqK+*5v)78 z2n3d?_t_V!e{NCPEuyjn3@1rubcg0%7e&pPXF|z2Be@pkwt%CLWaEw#ctxKw zC$19yt53DiPR_wAYX>5oC8^NN$!g?wt8Y+Hn@Kl!imS*td-D-q^}Nrli2^H1P*re$ zI%1C3+_M^Db$<#HlOVVD578@I5r@)`pI7ZHOuH-dCx2$~WQ(X4u+%JAWr+6*A=FXMo0#4M9W)JI(Iab4d+h! zb~W4^TKP638O-m!Z{d-JD)3A+&*sz(iS%J)Yim&j#{rynL5gQLs_+4YR1`R)!y);4 z{W=#(r-{JY#BlJ5^g}x+Au12C9)DL-{gY{hGi!tFVfgXQYy0-Lz-^dlVwkROPnrjo z1}8oOGOwSzonwgP_N3v>$+#mrOlun!(r_&oSkkGYhY14!v3vqJk)KJ5_3?dCy6q#E zxwT~tKEq|R-Y$cD-m8LD5)1eZf>>0DpDX0Am)!GE9Qaa<6C_b${pWPx+8U99yd~s| zq@3Gtuu{Lql}X*lO064%HH%i~&H%Z~3;PFXx8tx9T2mWSC{H5QSzDuY>V5N=XVmS{ zBLP~Ke)SP5Ryt8FL0mykj}pFH*wulcApwS`OT=PpkQDfALn8S@>acpa z7T(*<7rCYjH3Zhwm-VCRvA7d)6}U6uK6`pn8Pp(Es4DVzVxtn)7i59JORO=%Q2une zaJ(_h-b^&Xd$fCyLkcmrj)G4Cq%VKcLMpHQ3fO% z5%G4Mu46#Hn)oGwgMd!U71o2v_xn`hu*u&2w10TF_sV-92>3npKWy%Ch)iP(CmRW8 zdgiL_$WA*w@unRPHAEJRSQSAbm*LmO{V`A{cx(S3!87Ylc})nZCw>IPu&PXYJV5j_ z0R10-M(xF>KNiuy5-w}WBled{8sK5m&j9ovmbm-|wQnq!vdOV5B<#eib5oct3(rD&m>N+x{DPZ!-SLFy^@yNJ|%v?@E6E0 zFqgBQ4of~hS3rO@Dy_AsTBO|1E`)vYgZ|3Cv#y{Xu!65EaNk;dp#M+1?j&F>Q2Gh_ z_>e?iAAkgKb#-Fe=eL<|!TW!W&lhPJ`fd-by5}IUu)tjvTRw>_u)wkdX7ebvFLw*V zo8zM?Zo%5;3KKy_d+l%sgVA9I1{kJ`TEwDYj~uLkV{$0R7&ab?8$=W7MBI~D?w;c- zPDM1m&AmzYZJ2P7VK!;$6jtY#!gol)>t56+KoyKX|31MgA=)kUSp$8p8Rl1kX^-yr z%9L#Be?ZO-@*A}r=AVO2lS}6pMtBY{mK;mNIkI7PajV;@&?j^hX%KbSJLvqnVgGIs zz(3@nFChi)>ca%}+?U0!)~`hddZt7@fndMn$sabS1H)f${(8TkFi=;^+f!So^C8H; zdP+1n;*$n;fuSVpj{v5$s5uA(c(zxD)$(-CVL@bzUV@)9a@TVkBJ$}vF~WvVBc?Wp z1DAIN$S=N?n)+%RMurr~cL@uXn+?4FkaZCck@yyRA#)ciurzUl86!k-Eu^*BzkqJRtnE=-4~pKhA>xIPI1! zjK$q5ADBMj?@~og64^ zpu#pVMPy*Mt?;VQ3*>iitXSR?OMp<`+$%4oZ+uk>QZ-yU!MSK!}mvY`u_Un zhzKY|`zLFAg%AX{`@#Pl!NX?1axTcPs5Ps%Z^e7Oz?4Kwvm`1*AVDdZyn@*}Hj6rrG62FPddaN)r!&EsH0`mOse)tnPqfFX6CE5H5s zryIYAe>jocz0xg-IH?8f!y7kWODL>N5}^v(dCznC-LwX%F9`4C;N`@uh=6eqX8Ngs=tp8>xR_nh+}#rB=FS;my_1 z*iT_CvG5n{U#|m_>fq4&gboatZ+L1w8HSj86MgJvTIbr11i(h!mq)a}5u3u0XFwtS zrBYb6mLsrmyft%6v31!2*q~XCW_YFm0p)!V!j0c}KZK=$dytG0B?^}a_8+o>0X9-l ztKWfi4eXBqPt*$cfd0f&q9*g#eE;Am2=@W6)CxE)VLyTl*N&u%>{+NJVsn`S;1! z+c5V)fooM_unLhezd^gX9dv{*3z5SHVoWq~>&)Qft4;mK)WOeXU1Ojp^(_+c|HgFj z1z3xJ2kQMwR!%((75Q@=1M)2m42iIq*L57o4*&prV7?fTAI8Vjg7wa$FcZX2>HDIl zq6k?)luZbG&mU77Yz1DpT*&{54kZE}Li}}P>+=e~JD{DlLQ7ulcEEfPUhu?u^<^ye zHGt?w;Z1fwy{Hx?@*kfV2G*;zkpUZndoYwz%nL&q1FqfFeTy_6yzSOHD{sXL0IE5; z^-fOQ^6n?ro`6`&-3ndWQ;t|R9aYtF=YG<3AZIfc=2+iIpn>F1L}*Z+5Vn_JLWb(J zXA*Q6!YnGHiCLnT!>W#d9@5-|2Z#oi0C99P@Ji%-Ptu$N;QCaeXPJZWoUW1@;Ep^M zTDdn1@CzA`Qwy)IA_t$0oEo3UYaZ;mm|!k(-Q%fYsD771foMXPMuWK12Hs%5&I42+ zb<3Ze%%<>im06%K2^8n(Vj%JgB5Hp7abd>XKrD?u=<3Yikg$1 z32JLl+_=M`8Ly=b;8_QMd0o}8{J_bUR4qp>Ea2|j#Ugq^HBwWv|di0&L#ES)2ML_cJaWec-bFfY@G6 zO3|HScaF+9i#+uE5;N!&Q_EE$-FR4tOQ=?8aj5sAWkgJN_MBY(kmBf_X+Ym6$+_=o z1~})t{Q1oz~TeDWnt!bcpYO>_Y0|0M6#+TcgzEVPGnuI($(PK<8_)# zW4@=18d#!b!k$!~;B&zG@dZCQ&fP#GW&$XV=q+i-nwIv5$@U)krQv0J5jz~aa_XLQ zjYJkWb`xwL>S}6aRZtIo7?qNRkEM8SkzHp5ec<_o>7N>qTir zV32MJ5i@ez?KpPQ2Z8z9jwVWsgi0A#g)<4=LMAl$2@Oe-;)_$Qc`53q>{nH4mWGwU95>wVD?Rasdsc!D}L++ z9=7+LyzURXoKOVS!EDEE#7$vV&wS5V|Iza2()Xx?A8BxoVR7jTGyKM;J}_Vp4*oCE z`|}3&_sBjY-1D!1IY&|uf@jVwA4U7=DG_f)TxMp|Lw!*%;!QRCk_TjepWe=T_X?;( ztq-BP$QS&<>YU@3;xr5LS=2JG*-rGmh+>$;A3@ zA0@OA%#aBaFXp%Gulw4ie{LLms(kp_;2ZPLg9Q7VbgrAf9l$$+5wi8YDTlY0^0;|# z#jBPyqmwy=-B^qJ^KP3t(^X3@LjMQtbhb@h2mvCQ%Z zBQP_lpN-OW8x9-k58;>*Z@|$zN6CAK1#pbR^F@OqmH=Vm#R(}NNnbYgv57tWtXMOi zVg{p4399RX4vco?OFzH{q>;i#zuR|+LzLS3$9Ddok4R*j10Ar|co#H>Ny&=H{rtA= zL}0P?RyEL$f|-O~x=O#tCWeya)04ek6kK|eX@>P<3%B`&uqLb_(Yo>~h{i5Q6&bTr zCK&UpLh3xJnCMqb3I`@d(j_q;Kc0&QQKsIi6`z~HjYEaB+o(3 z?Eo*q&p2^-Y}(WFbWpief@m;pd$vM{x-;AI7sjNb)pOFhKb0_^47N`mod_ai&#fxi z9dKsdHN(#pK?@W~WXB{BSJ}ZuK70*aC5&z+QBJ=3Y!Ah$<92wzBsXbeB;bg=^vpdF zc#3(xZMu5DSl^BT*`vG5o??5`6P~zOyjx%Zu6yPU2bt%Ht}?Q+z7lgKznF2S?W5PM z8@5A){a`j3FoJ7vr~K5vJ&vatX9?+3m;4qly1cZgJ3H3hEW{uIy0=DK;t8OO{NQ6` zxvtx$WeA_48LGphP9CWY5>hp6cpqIxzjyuH@Fh)rj>s`F-ubEH1cRJ8L4@i~dlT=6 zS{>!i!BL2je*vCH3N$y_PRrxT23gNjK``&48JyuS2H^Rxt0?;>zy5sb)~0`*Ru+@Q z_Q?sbj&6(TxuswDgPc#d9n4<3uC>aqor>{lj6!x({<2>V zc7j(=EEr=ihI)T^h*uWCZ~jg(?)o#Am!2Cm-51pWF_y*-|GF893v-;!tO^rup6sOMfw;dGj(8(^ z_%S?!zkCM2XBd7%z0^>fH(VpnHd*Tf&hPqI-!^qdEN0!0ggw$GCdc6YWwZrpdiVsVMrkpSfSy^Z14Kx_1@ce?D_(D)wBpsEk+@cW}O(&?s%~E z?*8Gornk@naLix<2i6uKs&#eh+oqhgB<}OSI>Nf*#1)YMNRR-2zmt!VzgV~2bZqBt zLc(yz#krb@%T%yWc#hr+d+^}Fmvi=;8h;n|K&D13;=R)6!QM$cVWV(S7Ol>C{@MYS zmTXc%ys?W3fKCk>$dH5jC+>#e>NT>BqeV8Do^Nl;Ko;H5^T2FL>+tps``B=IY^2C- zkpiFkZmx;@|AbGEya(~+qpqFREB8B^(Qa#Gx$le2rZ&|epU88REK?bIDs%AvVcu){ zN}G6czUMIUIw6U4VAdYwx@ak}VAin&1G3=al9>~4emy{O>ZYV6QEBz&z_JHm-~&_w zHW$#qVK6YA&;RAX*TOH6At04-2nd>mIIvv|+HiO%1gs^|;3<07_Y|^nj1mV-K+`W-0&2mL`qT~x;DqFk1l?&8H4{TDH#T_t6JsmgB#2sjsEyAO|wl5{%vZi89iB<|C}Y=>`z z%i`|;^8(bzNZ$@P)?z3-CZjd>>+30t{yKX>?uw1A>I)T`t@c%bGaNCgNgflbbDhDt zct=B&e|ceC_p>u`O_&4`BLhQK@V4kpZ;DU*oD6=aa-)Y9{#gRCNL=7Rj|HQV(Z#R& z+ck)TEAz^-*5YN+d~hqJzCphP;aEQ9$E4Pm{qtuHEkDem{F9bzwvt@|Lf zGv9`2r8J$d+yA0$PN^Y znT=FWT|gwCQ|p_1+ZnNwbkaMhI!t1K>Jk%{3&j5=55r!W<>!N8F=*J6*|%WWGqMZE zVc1~XH|FcBOV|y=8dg>h-$eV?E3l_eMXZDjxRZVJPd8QtocMkW?2c9FtN;Xhv52`s zy*|L)GRaZ677=nBFs(SarY*TBIC0Grf8&LME$>bUWGQ%ALfoi$uS8r8jyIvjUO(-R z-5|91zFm}SVnac%q!Mp{DT|5sWHIWVuV5~Iajcv+h%$9 z$5Mh9rFrgrXV|%O=iIKBE*tw2+6wl=R^W0cgc#z*8{ps@D#|9az0<_r%_zVS1yh2( z?rUGy0H4(z-X0ofiA=Nz*l_-&FCoJ#W+k8L4kyjmJjO95hqn?=i3tC_oALn=j@-ad zrdm7@e%>V*5pF(WKD>HTKR-{Iv0bU1I`9$AcjB z5xV>1>+u&m3h~adR~O48&UPctGAI!;oPWCSRgvq#0V*<|xy9)YSEhMrX!$sNj2I({ zk-I9Spy4p7z{tq>to#SnhGL5rgXh(Cd+7o?7>RW7NN_CZpwwWve6*}s9dl3fn1t5C z%%~ZhV7n^`OzGFXgD5pd2^|ega$hr_d(6HuQV$}b;^k`~AsCUc7_>ryc4SoKWvh{Pb-v8IuK-D+l5l2sJ~nam;DGGghbL$50=!q5 zGcnye2~TR-YuBEKoNitx9O?NFh@6=sA4iM$A}-8<3%TLvy3;#c%C|JFQ6tvmnzG?Q zL!2)B?*^m&1=^%SKnFi*+>&}x?fHStanjND*BJ^Pi&l#m^#14zHDs{F{xzw$f`FY_5&Bk+WQf(J}reOzW8d(?Y9eu9^%JO^5U4bzLQ% zQYa4qCq~n<7tcfmF$o1r*Iis)yU4KemW2_(w>Mg($Zdo|iclPbo3CfCUTS;q1!`!M zY}zG`wtQW$&4VCl2ODzRp%o#F6lm4Q(e!b*SwrgLRF$TNT2DeEqlWjhv;$=Bx|7S; zTveY)<8~6DY~?;`!9xl7Hk(?_2yW`qc6W8O*>k{FapO==$?Z5P6;Bpf2&HVG|7ZBE z+KBAiHJfoRxBy*nZAnK=?#)quVYR>VBD5%;iaVMz%9c$M(oVU zp;fp|CH=Nax&5ilQDjjX<~5Zaa_MJb;PIAG7j%VeI|%ki6UTX~EAO0!JCKwQVFcXzoqIa1vOl+xVyN~ny8Ut?>N%Fl zAOpYIo2v&;V>S89OLk#{(5jF8Ma4nf zk2?VxRKAPg*NGD+etxxwv!!Iu$liNK*_u|79TJ7iknH(8UPkKk`8>XV{QkJ_Kkoaw-rnc? zb~~J{-7Iu-?;zYZ zLg+Tgf+@m>I)%Oag*EkTw(U;p!F@o*YZ=>V1`m%)aIK5W-6L>l2c-jDyCz55G6rF( zX50C5M=%$0XdV7^tEQ^?Z@KNd6OUBR2wr39VQZfuoYIGiZxC8EQmECSnB#`1&_XN1 zIXhm^7z+3H33ER1Blt|N=J)A>U-Q+!x?~w>wE41Ip*UMZDdVR_3WRT23f&UBG<~>} zq$KmvbBI#)@E^wJg}Yb=94xz4?Rst=lzQkd^myAxML-GR*Lfbi?bO%+MghEhphZT6jzp|w6eFZqV2J4}A%y8a<==XeBAH+xw7I#j^xh~$_n3>wpDPk8(* zA`z02g1UMDw{UQg+p05aHza!(J+S$h(OJviLyf9M0)GL_HxM*|lU8rsXc!MepdS}1 z_Tb(0@$j{(%V`}(?&X{ppR;a$m8YkSA9^1bZvUzhykm6#8!;0o<~9|LsHq8H99&zT z>@by1oQ1+K8tyoI#9u+@?~M&Qp=?s^d%Tt+2~hhjPw-F%&ph*rbpm$C1KR;Lx1Syh zwc1z5{{17L^Agsou8syU$|eHpV>2_{v|+rVSRg=5dn;Tu!1(^b%W6E3BhYE!Lv42v z)ppBKCmOYX$)~vk2EROPaf2>2z^Klwj4;I%(o;obf3 zciL+E(eFJ7iHT9bn@0tOXQt*PMQT(xgHu7NV$SO{J%B#cCD}gcVyEFY+nNUM;O%Y) zj9CJVnM{u2S0-xEI-m@$&ebGl9W`hkjcR^e6w0Mnx0lw%AK9H5e!5l~!=1VDfD-$$ z>%Zl9JfbENe$xkC4G6Le2p%l#jk*Y5NPZyvT692#>+)#6gn6|eZP>&8N9)#Bm(drh z%B}));ClD&ox|+}kv|8A#lXQ4deqE4N3S!FUMG*7m=z#|AY_bC56mZ(4ulM-cRaTbAu#0uO2Z`MG6v<8|J` z>tw>~-1u6id+~);mUwLV65NfhXl|Ys91`-5OZEgN53jYqpw0Ms=T3^v2ajhLZa9X& z3vXH*9hY^KPMDV%N`a>H6Fu*RwCoHQ<{`bvgKs64m5GRiHxhg%`<#3Eo*i&e?P3%= z4lAbu_G6&i2(PE1Uc z0(|S3LjP_k(=TM|(7P_psc%fa9wSbz`doQ6D@>FCbOw164% zaw)h%e|Z*FJ2Z{0fIwUg*m7q(-Gk=aiE#7VsHvXRR^`3+S9x#&%7cQ6)@VI=4JCId z1F;`kF?B$$(UsqsZ>N2$B9SkuQr#}#W^cT*IY$w70FbAN` zw;>HnKZvcOMqbqunFjd4M+WP%Uk~lZKdXmPDhS&^dNBKh1&HOyh9To!Z$FUn!)ALI zKqlMr+|QsRr>}qR^vU0O^8ZnKJbR2!L7ACAbN1OV8~bQZ;-39S60Hf+2$)C(;O<7# z$*<)aIyz5dnf_|QRiI?Bkq8lj_ftjhS042k-Y<(G>tbObmtN5@6st5YQ|At!x*{cY z#E3MP@#N*#c*Stt#m{kx9VNz}wlEs@Wmb=$fbZq_@hzqf`nv(h#~rkEoaa|VTAx{0 z9Nvo1PnfRf-QVHe=+2_LyT3vGAePR3qafr(k@=!D^xYdM2-tI$X?^H4BxY2g;!OU| zgeU%?*_%;kzK5o?#1QbNf+qm)7@zLJ4~C-bu-`Lfe%yI?X8Wa)l(D1d*fE57>DoC~ z-UTT4v&x_OV}>4@@IH}&NrnIrBihhHHKml>G)p}Z{z03mzH{mpgujZ=b<@qj3Oh>I zNYZ6{I2)8XTZ;S@H4rLqS{M^6w_bMI69 z#)zpU_CCxfbG0EdeC0s!Uy1!Cq#N%b4SGoIN+?sjX)yrDVvTQ)McL2bf>al*|0i~W zU$jxE=5Ms_Kf7Njwj?VD^*pfIu^4l(MFn#I9s@4q?4rooBPK9)P)Z~!hH)>|eQeFC zSW+16$l(F7W(x;Ea3e}X_x9|!>rC7!Sxw|2{)EN~BAG@O`am7Y8z0Ez_m7XwCH5Am zB7;^W3@S1<4i4g^U%Pe*V`|s(5~76IK#j2VQlzMkccHZ@-*_W;cq3e714aR!fzXL1 zuQwXB&cpPF#atY9h-eSW8D1Lx6qoP#>-)g%Sf=e~{2yR`N&%deaw0Tbs7Xhk2v&hJ zqg%W;ZFmYc?w@ZE`K=^es)oofAd%p|=upLKj>#|0K#)+WC!Ci`i!QbpuJ17&s0l!C z(`Fn zl(>NZKrB)|fOBd`Xu+pG6yjTbs%icVLv2O@8l8>4Sjvi zy$6o@gCUM^oY6FLU$qwm$nZO=!*no^{sJgDF1-C46QO$oww(XyV;uZM9`sJ7r-53r zP-Xy@BLJc~aEod2P>E&f7i&1rPaI!r*o!w#lp0Gz`Q^=@#*fb50A8na_J>&~!q8`s zAgWA@S}o93v>7y*%&MZZ!E1deEca!-_!@|y4p!+Mf5M(Yz91QH3<#kZG0LD;>EPcH zQty3_bMRgL@Clj<1DjgrX%L0UZu)nFK>t3c`JUTBTq=UwNAw?VAA(KkPMj}B0-pj! z~kwS!U$4Dv8<+`v(UHL*=iF3XE9t;V;DnnMRd{2t?g>2J8WNpTYm4 zBpDD-jtY!x@IFna*}9JlJIFx~nNYw`0r64~K@g+%`Zov?8K&Us4n@E-G&)0EchY$? zsxMB^m6l#aFLVc9sGmOsKNt#{THtPGC?6($wQUpy;ndq)3NZ%%vZ{#F76ad(@TmNg z&IQ;Z533up1J*=~IzR^-b`<`kz&Ar%H67pk9A)9V*3gPtVnTeazRz$MBNLpnl1}KK zpY$IloEl!mN%OiL$bv<$8r_6K(3G8+6?{7cuEoA!6c?VpHZ8C0FhAZ&{^D3T!7v^a ztXz} zN5!c_2OWSUducw&pZCG;K}Y^y0J}a13OA?0xldicy$kXCHhopQ*x1>dwat>(zLB{5 z1B>{cOA-~zp*%+1tIP9#A<8>Q;{QIYlpe6({a5hDQnha|JA2hZiEi>K_FM_OoFrXb z)nk@u);sePA+KM*zHiEgAeqgUw9gyxyleVtZO2jJz6z8ft-k}cnv5R}SHZQ$c5SLq zX8^kEpfGu(vG53Mg8{%P7@5PlbLVV?)rfWi1qX7d*B{P-L-`?x67HCQFSI8BprBf~ zbt1doOKuE$+_J?V&kmZqoP$;rx<|beN>BZ7+^XA&q1#2S9n5fvUe$*4s!oi;r!al# zy6j-yo*7=j%XhxqO|kr;V!7{={m>jiTnqw`w7bV=dfSkp!T>16=Frno$efcK-u=0u zB-q|M0P#m8A6{Q1=Wh#1pN_<;o* z+N4D+t{K#oypV&oY!EuqCUAH7x=NraITY}o8ZVIYkg!AMho`3)JHH42RfPfC6e5|c zHAb}2sDl8_PgaOTk`tQ3K%tTG64|kH(D(r9NZ!zc|tiNv7X_t>S7z! zquGTg!h@>i2M*AQ-g%O#_d=z_ZX_N|+7)gh)~IxI6?C34WAz~+VB$~%l(n9`4*YA5H9_E#u2~M zVxX4$Cy5Rq*{rXy#~a8NLmOvzvJ+siXa*!Vv+OP!LDd%|K*Po3^slLfFc9h_60ji%y$%Zrz|Ho9oBet^j;RY~(;PTkx#&|7nA-|uxGeCIhc-!tL#M9?e+cJe z`G-`fL0xTTkS!Ld5k6EiA5eCH6HBQF zA*ws(*nkS&_OLEnk~n%#8Pxb~xV1s|a0B0{C+o^r9K4aKdt^rD-sC z7TcykHT^H7u`T9=^lZJ6GmLm4D3(hBP(N6O+pUptfy=;w_2+DdQ5f77&NCB50&UJP zsA4j8@?QVb=74rqFy!7#tteY$NZiPf-kDITWxxDR`fAsrJPrDeEyK<( z{&B=0RNH!24Ix1cBg9d=EKSEWbs&Qjv8pcizg~ z!gQ9|RF=71`b*le*BYbqZ3Y!eOVz=Zw(F*POx_PX!0C0Z2tASWmLX!O%la|;G>@KJ zbf`ermk2SjbSV0c$@jO9w_@UHi}sp#)JBp2#6**G;1X2+f>I3#@*V+-%=lyzrVbQt zCatOJOHpq$pklG>%r{lss0da1e9nIL_XQAK`>Do`5elLno6q?Gz#C2s=w$*nUxw45 zL@T>|?jrg+2#9!j%NTUms+<1)3Ch+^AjI)t7U*)lD`YpLC!Ym;&1L?wy5IoSdwV zzHdUvjo(HIq*Z30Hr!li4c%{Zrf$J-=A+5cS-sKI`WyAwXG+JZS9=HHVy~iq@E%aB zN3s*w9AmhKg7XZjIu2RvO4?*f9a4OvTt~Kn>CdhWdcbIXsRQ7anJo}JO32;>b=dm)kxIAfcK9F@ zU3gUJD?$AW=;VsQqWihqF?GPL=p7bu%ynboJHI-pi6C?U{x+zt=N`^=Ee%n^Ng7EC zO}Z}IvIQ6cNQ1-^=CJQ0kim@`-{^cMR6_CrLox1#+?6XfVAolhnMw)@3R0*vgOcI) zms_4n5&X3iR>3>ZsR=}fch2@{Bobcaqr;1_+BJBeT*V&@QttBQIP_NK8T#b~k?0|| zKRyH?+1o#Lhaf6^C0z~xRqI5Le9Wf=-i0jyK!-=0c@Rj8IWWi?k6pVZHc1O$3qxF& z=N@0AHvKEhr@*heJx82X2h-%D$&3&cu_IJ!R^_u7fNBeM^UQ6f5p}Ln35<+5 z6`!n7EuKp0^NwMcAqGX*Ray~nj3`vJuEy(y<%g1m^O}0C{5V^Q(pMCuLFfnHZ=RRO z(r*4)PqQ04W;lTa_FpUFOh=GO9|4u-UdA>%!Y7FRp9)MVgP&HOd zl&bwML;HP(c6Gsy1-=B{JLJyt!_XuiNTlX9kVuu9h*_x(>;lT*;@zd!m($2uRDvPw zuxuDI6)QVCZ*)88ZKK{kVB3MK``96HWRD&=0w_GqMy7Z^4Ch1`z>)n@BKppRAZm}{ zb|@z3WpASPSWc!7*t-DeF!;mc|MvJeFq&iEZOy8Y9Y02qnG3L8h~U8>s~sVJh9pDp zjdEQ;@v&*fRX}%`el2rqs{PA`r+~^~C$S?_28cr&WpxMD8St$8HPE7*pw_>ME{@e=KGMf}4%d%ov+ppQZOg0kU8qo66zs#Pc8S80rS;#XKGKQSN#QL9zWcwVI09 zq6sS8fcQ~2`mE$SUCWZ>zP^USGxj+a3N(;ZNFF(J<51MQ+kc(~!wR4Z!m>0;fu9v3 zL}UJbj-sxuH1umHfWQpXad_q08sywce&;i3F2^TG8@d1*_w=yt$cX)S<8*%Cot~aP z_WYqFgTF4q4pjjQt0FSO7Qag z-kXlH=){~*$2LC~!-3fb@AIC4wCWfwT~#$MWTN9Q6M!7R-fOT!Na=)E3V#|$3Q(2|?qBo3dsp|er;aNY!MYb|Ix zqF&N5??l1>Ir@?nMZuAqvX%PA4ydzjr#|+O90DdPN4ODuU^F8~>^e@M^3}|$E^kZ`ZXVf7 z#L`=o+ms>mUdk0OD1MJR6kov-lrcVLDM$$YK1@i+$k)QpAxqb!_<{o};li zw*So^=dQYk4(ziz|6w>VW|XUrmsCZQs|cJsa7@7eW|qQgTvt+<;q|Ow3Oq6b=#6Ay zRwX2s;xC-s3M$IMBAPhSa3p+h9gtA9)&WbAgSI-C1cS39>Kr)QDtLw6R=U5Z`#MeGMz6&j!Az?#U3H;v2&c~@i?1r~BwNY3=yrHh& zJlFpvs#0}z`S|pdb1f*!3V8B8I= z!S0eO4D}2Qh8Y!6c`Jkq+=_>oA*!C{B28C;1);;Q=g~mTz2%YP-hPOO2M2t`;(R?b zt%s;5pfCQUc~l+RjrT_KP>FFA5`C@@!@xJ=rBVPef1>{PP~tZIhjT$iieGu1ATW1l zP#ss8u=|do%P(m(0#bNMM*;K!h{b^diYBxU6&ElRqYvW`VgEW7qRB#fBocU$SedZ) zL39_C?N@#5CclanMs?P|_#+W`G1U0@|MBfT_s&JatZV#QZswJDUhQ`;v#E+LCZcM8 zD~YqR`Xk5*)M@0@$$0z&{L ziV(4rbPp$rNCiOo>H#D%!+pxwc@ptrW!aPe+#x2RT@06{mif4E*o@fJEb` zNAX8?f)4OBpy*^bau8;Lg7h#dbl&aTGncAu!DUqOJ&m3e-FuSx>}gN&ErhN zav?W*o9%an*Z@nR^Z3 z;^sKXy%xCK-~?Ge1)xfRE?~Tzwjo%B1}YJXvd6?4Fkia$QLEa(FZ6pv`MEcyjj-G^ z{IX=Ff6NBLhX=^G`zbz+ycFDc_)`PEHj}qfHeb zz8KT~!@O@J4u_x_Bh(LTu^SzH#FKmF9TDJusw)x$J1n##NLNBwN*>E3vm(E!eh~eg z;L1NbTPz*)V_uih-%MnI$U8a@a1CN?lX7!EMH~*DhGS8HAhvP#S8$ptg3?8n-BiDC zKYe>z?XNGU3}5U^>(S@TEvT)F*B=h2x!AhXro;2yknl3)>koZs0SKY)PRls36`wZ) z)K+{p`hK%{`y2d;&o<5IsapEO@_vVjc77iER8-(TRAgl6VSs|~h$tZ5rzJCziym0v+aW1wB+J$#m zfF7*|-0#}8j^KJK zn7{`6OERi-Lx@`N*k#!*E1L>~<9DBZ(c2IT#6)%Rr`0nvf=1gWh|atQ>7bOZYd~aJ zP>17RHRR#p2?Ox71_0mj$qzIYl&Ju4jCa3KMS)fCo{7o|nyuHjZ#$oV`OQNUFX0P6 z>Ns+O_tH3G0X84{d@A+OmXS{*sk7S*gSA5nJyMMwPlL~iGl8OxIY9~)taL>% zX8QR|o=vN!RLSj08jfdnAZwHQ&-}G23Q2UV{IG5DVc>2*4&2Kl%Cx6Q2(y zK;82vc9Krv;1p=>cvArV@kQykdKt7FwTbdU1JDD$c)^(D%5}5LJf*hp)jd~B|KR~Y zT5)dsvGx$adYRcHf>wa{uW_C4Vd*fqZJ^@Ycy8+(R+S@%=sx?L6HWCgNpjE3>?J?_ z&o6aHzx2hVpe_7TZ}`3+1T;Vw{piT*fB~J5&2Qjpi66KBuo(rAPn!|1$KyS&oG8W zH6WH;8jt00L?jq zxy8nAs!;C=BXT^IE2~aLO$^ok0dtg^*XE2uVKj-Y3!@DzqlsGWcfQapT@+;fqehlh3&E3FoeqI{Y*NO(u+MkSf{CHo}CDJY?sj=g(W)ekR`944yB~ z!vX5udFWs&0m(%(fLN6L&10dz3?EyS1K(_=>v!Z?C_JF}HA`kn1Hn-9!J3q+XuD%J z#n!NLzy#odX0Si~Gxv-)!)Bi#1l;H`-Xk|8QPz4w-19y)j`dF=gmM=t6eR3K_j6F5 zRE9$Yl_`uA`9izWPmu9bp{?bPq0=Dc$fvk_KV3VwW>+f#DVVlsT<$M}Z@nB&+(WxN zx?uYtHXQaEgd@Rzg)FcPT6pN%h(!a%uCs97{n201$^ir#0Q1n(!g>)vcl5WPpt|&> zt=Yvcls)e251acjvu}IQ#xrTrgxtoV(fJ>QhaSG1NCvr96Grs-ckz`izkWbGxHOj2 zcr#0D)44!i20eSD+hFDz3q%w_vX`HVng0H&|KVEUuO?YlN250Y4x&x~{^D8m+aDS( z#O>EMun!Rdv5z>@)b{k^6?mkVyrc{b>gOC7sGVuNud3{f^g<@EIRPK^+RQNs-qTWW zQqguyDLBAA3C3?}?}bo%zCGJuEL)~&tKQN_WOdSU$pT(95m;OEAUfce6f=Cc*eV#B zLEteWco!#1Cy$9VlbomiH$~C%E}*&W4O^9hR?!Rd4XMU1A=Rq#NiU$nV3X&Z!0QN` zB&f=D4Y@QW}l)$K3yVr!Z!NbLdB<6ejhP)3>c~!w=lB&92PfzY;NtI_V zgCW{=Xc!ybrQTdv0EP}X{@zPXuv+2e2N&o)JZ?iZ>YS2e#)etsgr8CB99Bhhdv_UXO z`Y23*mHnW#S=h?L6qNcd>LNAelF#jJH21=E7OTm#^^O3f#0{6EqIxP%e0JV=A<~_)~%KlmO^jn5b^r z&@=yP(&SMGfe^@HQoN4|YP1?%+8#6TKwE$o6Ji7vAwj9YU$ZT01$wNOSfG%m4G2Rd zAX_xf9VorK^_P%G3Wk73-cbM-C@6jTN%XXpIVYxq^yYPXW<5uM%>2=u9$QLeV3wrK zu`PqF*@lUs>L3OiLAxRFFwxXEuZWHYDsm%r5+WFeTm`l&Mbeu&V8Zir`?(a2kgxd@ zi>|(s+7G^>yNiWNgSY$j+rl*bXKb3uHGnT9LficKcI889St@Zt#N(zLeC1}nV}R?4E42GZ$qA`=@?h1FLb zfD0vp9K_+-Iq2XvEqi<2NgtYe`q1!QV*XQVQX0X66kQN8n;3olg1G~X#sT)g!gcX^ zjbo42=0Xc>1^lJD7c_$|V5r^Df)sEy{369-S^R5fQ;k+fwQYJ`=SL1OjtYQ^Prk#2}J8)7L0|~1h^_Fi#JSY4e=9xZgXS0$W}$DON@ASH5}bF4{uKY zuKe1_T4-9zJfav-Pdk4$lxnjd@|T3XEckZl6C4auvi^=gDo6-w3jeg(R3tU|T7Czu z*PseQTof8E?{)d@13O}tF^Kem=^zc~xp8y%Yjc|)gU%1kaZvr54LcR8U&*-b>Oa## zQnKOnPkRu2EJnugSOw~;K!*&2z70=)e`DJGj5krsNuJ&cs(v>}f1?{6-_0Csa(lwk z+)s{1k>B2fQUEcrL!%I4UAfvGC@V3F87;g91FeAomn0by-r4*`eYfBj(M)0^Xtlxa zf;@>uCj{u>3~lH(UV&efhol(dZSmUD*zf5t0&JV-$O}L=JGs}QK{Y}^Qlg#HQGc|t zWC51^yd|U+b=GPXmvCG7=J|eIY@u&={}7D7nn3jsE#PT)G;J+z3g%}6VIxpIZuj0q z26;jlz^{L1K`91s15s!3Wfaa+M6%x6Ca8Ql&`OEq-A(^o37w&m_JlegHP~ z1fC&RdnM@ilG=8);N z5|Y9@0KPQ?hy7{ZW%Z={noBXrL>f-^O=bO&W(2bR zY1pl2pyi=@Q&aWT3W(qm!E#(**c@ZROf5 z54808Lk*0bdot*fPZ__jL92E^P=`kF`e})lXUAAzb~aO88AeG50n`lTYZTE$a|mGc zZ5PC0OdTFvo-NQzf;Wzsk2e*aKHtraM0!D!d&t2Z?8#WJxcs5Bxi<0`LX2!012$A)uju@wq?GGh172r)PZa7gsZ>S2Cqk3A3K>AOZK@I9%Uz?8>@iRH< z+9*0-^Y$^h&!wmhd|1M-OS@cbut9h-7=e4BH~yw(?Rs@>%U{xkHL~vx4e2J$uRv-Zp23;-``{_@kx|v1rJ*H)8M`6R{=4Y$`<`{p`s<_g5PZMQ)Tc zNK2ESFzB1lu44>qpW>sFzYioE5;nnb$s&xYNv~2mfrUniL>k+ZYyv@7TPw|)7>XxK z#*PVJC|WwvPME5l^!$38LdEKwUO2yb;Fnv~$3x>sX%8qWDkf!SeyGt@}CQbX(e)Xr@ai&DQ;vQ$rsBQCO3YEg4fsvjnLf)-u+kl~L?|9|duNfngs+fp`Xp z>``{ZpUxrhV{~4HBK z=9Dw%jBdT7e4kO+YF~bP(vZp}U#eDMS-;Gy z=Sp5b21?6N82an3nP^Q5y74)e{z6k?b6duXha|LC!K-aKZp=`^8fh#q=8?{;i_ZxS zd3!A5HS79mtgkx${&<#)Wwu?<`tYuIq5H^qPsF-acfGKVxfbL7^b`U6hSN=Al!5 z!x)o{=0gu;!Ap>ze{o-5jTgIPuX#@GRmy(lNP#8-FPrcB`JHD==4i#;^wFXQ_4WTU z&a_3tWi8U${3Fjn^q_Si$Ivp^{bymvz+GZ)IcK9v$^o&_7c@gI2XCfeg~rskrRAaI z#O_f^%t80P3AQH*0!mV0KnS_l|5~aNbeJ2+eV~LA3;Y8=IxG$9fCVO{2ySe&#A)GA zo2tx0yzO>8@4sY#$O_n{(DJE8G2XIu>{hFV7i6dtNI(wl;R7$AG+3q~_RF`DtAb*h zOu=t$3UJ=D*k1;$w~CQAQ=yGC06 zzDwB{mDXErw<)FK+|rft*>a33zb<4hi_c1hC~_CS4Gd8c29*J)pXl6EPQx;thX;-y zNneKfxM0NoKjEn`)5-84p$v|@qa5b!6Grr0{n=9WYfvE_QVl|bNz3A?wpol~6k>!Y-55qVQHQ;kqd^!jM0vk{+;7GIf?d~+^D-8B*8 zVfQQ_81B-5HW+nu`u2d@?wvP(sj)J?OWGVz%+)XV0Gj0UAH!?`l+E#X$68zBWxNj^ z{QcCbern0J)iU}yoQejyoV}<5zNbozSdWcbNb=fp-H*sB`wjyZ=$maO{zEMs1Yi$Y zFaf8;1hcExF}TW;Cd34IGtbv|qhqZJ!Crc$f5*tnzA`_EW??LCx=LIuWbax4lXgn= zt&L0yHDM#(l~wNVb1nPu_6Dnl^CpRqre0o|1Zawf1n>9#h~tiy{=bBE`%Wv#T%@at z6PY5>8pQSaJnC)3oI5S!M)!%1VHFC!18tNmqy%Jy+W;3mOKIiy=3#zXS+ zD8WMlD!+wA*u)UJ_pVdjZdG#j^^ewWnlz5--oJ!#3lViD3iFR48z^E4| z310I3y8VYvR>^6O;8O6VgSCyC&4)m;a>+3osQy8m$5XW)+@*wRs82o$cut)nC!in< zA#`&DazN5@wN}-QOo_X<#6F{G0$ORo;G9v7pO#JW(oS^P)H2l=u|XV`EMfnv{uKxS zBy9&*zd;r}qZE=g+KW~5J9R+o_^Z{nMwpkDojkHM5mG^T`tu5@W1z$$6?93Q=E*Cu=pLRwpl<6{c`>BAzbFBT;Hr-+-i3DT-PTz z_D91Y6+boID*hTT`YL&yCaso-^rwky;>)^H(MzaL1;bnVz)J4Ope*IqS1TUpdj2@X z;wLrQMy=x6s|(fQ2SSKfq$`rV735w-r5~WwN$85(ckfxcHa;hQ^da*Vu_Gedrg2LQ z&d)@gY*Mq>AF((SmtEz6b0sR{P1naKd$9iIN?)zmLDLGDD}Qud>lsFM;Z$Af+CGss z7KZg4_f?CxYwQaOFPze>?S7IZrxi=&8X3ae$EEziYkjlkaW**Z+q%>D2yrQk_v`Qt z!zq;xtSVj0Ok2BP`4bX*s@Uvh*c&R-7dfih^U{lTJfG*>@^B2d#fguQOhu^Sz}PQf zr-6x+SU>)#;>9mfKAfnwp_6H}pPb6(N^IN!{*_g?0GIv2Qb6JWaP0c#!Nk{d3iYH@ z8C$3H%5FBSdwq4%eN~~(X^TztxQBVwdp6!($g$>m#syU)!Xj-^OJ?UWAY53*g@%V< z>WXMEjpY>@Eqos&snzGXTr|gD4Y6&2M=TfX9v=N zNgwqJ$*9VUEq4wKv{JOsOk+{PAG@$itVuO;6neB@CagWDdLpSrQifx!toSU!VOEgC zjFPx7+@q4nl9cXkS%?nzh>lGllGxt-fmyst^pjt*e<^^?-(%V#zZZLbmy{w6%bAz<36stSDTe zNx}%+9m>2*-kJd=!_Oi$(a}OIpjt6BXyUwl{IL`ejXRXCE4{EiEeXH=MDII^vtr(re_WJ zS_HobltOY>Leu=|ifbocrof#4BHxq%`4)~s2eLQseOk(t1Oxh2VJ9Au#?C>uJXpPz0RPt1=H0;i2VmZ-Tb)?rf2H%L$76xlpHG%KxQVo-9$`pxBmj*BN^Kwnr-fTY1j; zG!RqmtN5@?4AT1SwG6#PMn-E9C{N6GDt82vL6}{^}CPtQPYuNx&;(I7*q)^&Gd^47G6J zv+Fh9E4mt+yJ$%)9BRhb!+(+y8y@@2c~w7CdDYlBH!|C=<+ufVAGc2B(qXYZt+f1( zzx?YoCdlln+*LQTDdwa#s!a2Hy-kRYU z@!&pk%vZ_<_w*6mtDnnUxlc1rd&t&Hz+z#Ob97U~&VsY8ntV2iRpN4pWlqUbJkB!J z@qBtnd|emg*V_?Ff2yKNo+XM2hX3NwlmI3N^T_Dw*6z1yttv%Z_Sw=#2tL(MQ-Mu2mw`^ zyJR?i>c-;A??z@)0^{e!unc~oJO|4DgQm^q*K*^rRY7>sMaC;uXuxMr5Tn~3Ov7NX zrpl@2;2xNv^Z89eMYM7+9xqynVuc+x>4a60yGiu6c>=1Z4U?o6iD|zD9j9XPq8%yJ zWn7&A&Krc~?7YqHOD!=9eQjp%hpNbZO=|q<-w#1$t=Knm>iy8v`f}y^vN+&M^24_W z(83_hE7mv$!?9;-Z;V~cU{hilOg_n2^|f6ib9D78O5`QPdvn-H?}b%J6~`yeK}^n2 zV3lTOB1rh{Tq7UnIShZISGSbsy7Xpy7r=!MNdV z7>D+R)=4s)_Ki9~f%+dURWANG+CLv(#lgwgycj5ms|qUi=`H5fW<0$~K=io+{`qxM zvVqRmgJ}FR-vwjFwPp_NRhQ~L8+D^cPo+Q6*B9~b>6Jo+^-(0L|c}ldf zGBzDNZxLFe!gi)DhWsiLNF|WXjJx)CNL;W2zG5 zUGO&gD2Mb_?M$7^$NB+4ykKN(1-th57Y>3B#hW$7kdMmch(@j-2B&t=v^5N(^Mg?W zykQ;4=rE~47*Yyg?!DSUXuF(Q4Mb1Lzrep+Bx%}e5fguwXI9y+JE79EGCwmmHg+W= zr^1W-ipx6Gs}d)0*fW-gLl&UUyI*Gj(J|C!#JBL$gHd}Y+=K2O*<{R?Wm6^9<5E9PTetK ztDx^w-Zk6dd}9}`@4@j^azv=mX=5CyG~y=>zV*TsOor$K5NZc!#KuhJyQsL|k}jW9 z>dfCd%(FP1O4*km>8F?i9`(9wI2o8b=F0WuB#}qQ6L}CUt)MGI`W~jc_bu=&bLUS| zsI#iGN`)%0CFM&AGjnOkKOwuAsG-oV;l&wpR+orP>iMI1={c^)3J%|$CMRF=ee9uW zL#>(j z$lT2vn+8d{PVJ8Z5bnz#Sut_Km*F7lw6^5G@%d8&`5~ufg#(NGyy-3_E41YE>oA`@ z;?tSqu3b>q(b!XZ+tWq$Yp!Zb(k{rhhgC}9{6y{icc<~OM! z6^>DPKxu)Hw4W|bnBHdF><6@bC+k97IW6xQ#uyr8iV>{OT)&eF0tQD-y3>;hm;`(o zON7fyPJH|}f4Zn;eog*fYtS>ynd>S3n{15-33O7&-|SURc`ODZLYB|9`om%Z-R2A! z8gjXhPl9#kPb#m293;M|3L% z3BH%Yc}jc!NDMyFXVc*trdqCVI4K-kVqiT@zUn<+&JI{)bAPV2yswz= zW;!e-m~*pWK4~9zd`0uQnL4?a$xmB1v8CaJA|KxhW3I`H zh?;M5pbLg{?Y+V-B)hQ^AZZ{Um*JkdFA!snhaqJ4Z>EMe$0#DZGQzhA?}y?LvtkvC zVCl>_@rP5i_C(%ht}sEr@s!65q+^W@jutV#?N@vV5^&5-$yqk-P7u1~0Z8|YnyF=p z`RwlbsmX*tm9AJ?*5_823vBqQHB|+E(6SjqlG*eyzhwLEXQwTweu=IM8+?2H;HOB$ zZ7`36i!&WF7X$&n%%8XJDQPoQ1x3^&iQOi4TJ%|(Hucm-E|)u`Wsl^Cimxp&jzFMP zhCymg4e;@wA{YEi3SwYZ{L@Rqkegd;3GLc#s8`@+=apk5AF@}`%E2!V$v>@EeVRBExEGk2jH_3>RJ z;EZR6)*)+2POrnntAj3z#LN6SAv~f(5qo?`TJ66**+U|@d*X`EcZ#)g$L^wr;;BZ* z43=5wao$qNjVz~v2tww;CpO+Ulg2kn=MSVSh4V)5zvScmdfN@2VDi=)zI~@>CBkt6 zJHsN^_#oPJh;FaUf4D<%z5!%oYe^$eIQv{&f?m2_F?8R)arI@h^;D`tzO6-nbmzd8 zqL{u$q`cy6D7hZ1k~tXXNuy8)`rts{X=5(XCWNi70^Rsk!FMqYC*DAZz{qzWgsr{^ zkb5`h7>NhTy8BqR6-qrOqu1m%n^H~FNE+{>{Fu_hJB(EK%z}P=m#Y3NJ!XM-ENVJk zC+~{GB@O4%MF6UvO~Vx)S8Z1Y*7#uhyObMU(^8v`(}V$~bIl_uG0`yAnw|Ll-IHe` z?KK=itC~RZk6#hKJ#i!K7xeYrBkf+kYKeoo4nh)swrJx^xvJk_WZictlz4GQFlv<> zRZWy$^6lZ#K-j@x={2p;E6{!1qUW%gEfDJW9R(_X0}|170#^R=mfA5fiIPO^vT`=i znRBi%@6$%QYc!zzJ8CA<;)sVGR5(Hzra2ai?YAn|mMnyO6ge)ez7a2P-7^aN4Zl*$ z)h@H{=WIXt`E?ll|MfKCJS&Fpi-cc^^1y{l0>a&!Zbe5*@o08_zXz!t9uS5vKaqbE zN#0Mul!#R@Onkef=#@Mset($9_)Qq7Uzno+@|{zh9H_fw)MZoxVTCa=+H$k9C%Xvl zdGvc;6R0S1*SQm4okTTpTC$bJf1bXtsl{HaBq@Y^xNZMDW{T~h1ktS<`cR3_{c4rJ zM-Sr|mu$>P>mZB#OpA$Zp&QAI$_BZsQZwDYC@aO?uAoDWPF#O!Jcv{sL2!$}Wf{#T zI(iF8^gdD70FaP}b4w22qbSR0!)>0H;`=?`z9~Q-faGCL?$Hw4I+p#p;b$x_2Kq82 zo|6GFEn)cgQK%u$t_cZ!0PNVhu7&Q{M~gyT*`-_DLiv7s`gE3K+?LFTtO~4@k6s;Y zI_UD8$9|Oi_{TIDg_ds+fv*pw8I$>^Cu_$IsCj05(#(j~5?(2VKJa}?VR36sAQn(2 zc|fRD>R?(>V_{eTilA_VXy5EaoX*n9FBk;tl1`b`Zy8e=OK&N=&m+X_JwZ&;PSi-< z*nL6#zWaOIs5GE2nWC`@UuAosMpr+&28BX?e5%i^0}nvFSn8qjEulr+z-ch#gpN#iynD1eO#0Ec8Nn3X zs_1?Oxsmu?aP!dsf3tbKT|~Ug;&ixO6n7nwVP4%T^pcFpUHNrpu)wYvNcqr2#&{j` zi^+Rl=`eoN8HDRadK)z1f`x)Ln8wvD{n_}uwdKfux!pz@`CkA?b1=wsw)o_!LY-U> zy%fWo_*B(yhbAHA;91etGN|Z+?7F!24~L(%Hq?Ly^@H1Ndw^R!*O7fD$}NMOiXBQrR8GZJsgm~Nc}ri+R6t&{ zO}1c4urMrN3$&}_F@T+&mP;4?Aj}9UM`%;0JhSb|_!);3VamARGQa%f{q{v_vL-Da z=0mGb>~Hsqo2&7orL@3}5xk{(G<)0cbMGY*47yr~<+HZ_@K-_eG&YReLAhE~6L2f9 z17RMoF~Yy6*458-#C;^bGWpu(v~`s=9K(TwIR`+bb(Znt{SG~M!Ysxjvp$&xq#RhD zRF7aeT@PbWK_>WZ0)A-;J!Usmp7)zCUQ|84zk11cPo^2EkBW8T6FxJ&d-vm&8~Y-i z6?R{=OV8F(ygr)Na&<)On2^Q*qyuBh!+~OV=5CO?TrNxjzJs1|Rbc%<<}P|6)2Fs* zy`3eoXwiA!*)*Io2nWvB%$PS!>WvABhVgw?sBdO_mnkhPl3&LOjc_wSWmyJu*F@%h z3~DJdgSqtDpPx@@6|xzS`(SN$@~LUOq0kZ4=Yu6<*#*Bx2(&MJy5RV=HPT|K2P6mK zHm6goj}+EM6e*7-b!aaT=zXj9p0}(&yTbQ%OnDWm;yk=acPh_bKfCUTc;2$MrE4zF zR}z!fMT3r9_dk^&=^0~xV-qza1*~B5cwF&kiK=H97W2a0EX9*yRXHW`N2HbTGC$zDTw?fg$w4L`AK+~ ztCq?rNUk>&fy{*vFRcc4P>@c~ zzo<&xO?Jpsrj=oeFs2`(;ciShwEva0*p~%A`CJgz zBM5@1_=7zoo2e635n(2=H?W8;m}Na>{p|yx!}!=B+R0TKjQ$6ar1lsYvp5x82vBVdnG zq1*-~Xhf4dK;`Zo49@(h$yDE~2}(KnO)rI6jce?FcEO$*i;xHufg!RVxJ+J_(4E&H zOmdb_GlS-7wi3Ey?QSQ3mGZp=oqQF#_C=*js_nCcvNBbEnA&o`=Gc!uN6#u;x?e^b z0Xtk22kSzl?_qVnz(!I){N!NlrH3bSyUM5A6`e+w%4eI#qLe!yP2g#w51T?z=&u% zC8d<pw6^<;QVOQH%v4AvD z%wtynFHeF8y1IeoI?QjTCPk$@24g}}LWC29UmUtEd10Tc_j~8MYqj7T99v%Rt zl0sE;_n7`L{Sf|9u#df%JoK3hVTw9D&dGkkcnF4dPa!U|`$@2L`C=sT? zFE)f;pn}PFS+ofkb1iueDip=hcjqMGH$8ODg$L_0l8(7*f$s1_4D+|b2$+h5-H@k5 z!Y#w_Ky<|joBV9k_`Nnyf-Vmo#Q56moiSwYyYz?MDk;pwF~3+y$D|c(PQ!w_LbOSV z;Yl)rDmG%+&5x%$YG5PK7Y_fxEzalZe~nr+V<$<@!(}4tA!t7pu#cCoXYFeH|5$tP zu%7$)ZJ30T(ITOgmL?i#3Z-3?QE6SYGb)w#Kt^Z}ZQ7-@NP~nf?b5hfilS5+QfUeI z`L0}C_wl=*<9?pw`R6(um#^>l^LdZgJkRq5ZzcOP;aIO*DpFg z!Bkyq0z@^qyvOPX^0kEz$tDZk5iwJL#i*Y8Uwc!QHUnFK!?%^e3R)7rjQqz1n$I<` zP|WI$k|`uVJ`5q>5Xyd_Q+7hT29*J~K&abQh;>^d_Av7@{~V8oxaFZbnu`UH{vi`w z=GXl$hxMS}SM7x*mt`}-B}lBkq4yT-Wu8`u&c2oMN)@BHAu#{g!)_nL%@Po((&<3p zO%TzlFHEhp7w~9=veNnc)Z8VfW=J#*ZD$)0sYM?YUan;8I_Wh!bp+hXJz7Q^_>OKb zHAbmU6H^81H8xBww`_SJ$bUTD`k9gP0*0T>iyYvt+C+;3MjE4>T?hJrSoCsapz^@> zf4A+cC6aWZ$gQp!OQHfB%zr}Y)Tc}Ss%H{ZWRu@DSmZCh)o2kO#(m#1oPDYUh$x#o zFP{O(H=mvMhs-A=VPO#PmSgoyo94T<*T8nT~X zP^@`MVZNKfMu7ImHm-s+1CQ@t$IwHOGbZr44h))}zfYrYT|O(}y8dyWQpm~-?@a@L z$A$wdbFT1`4_lWNSs4k-TfVFe#ZBotS^%J~kEzb1p&%4kFxijgnAMFOuwY!!>+tj- z#zn*MTXrJCc9&?HPQT=RXAiLzFMnYOQ}qTFqY7wCZw*L=*P}cVAqUu;>+~1c;@T^h-l+SPxn;w{M=iOHVazP%^ zS%rh209TOoKC)^dZk3_$3a?a%9)6ibk0Ohmklogp@1o4Od)CE@N)OV=03ZRwVySIa zkl!OJbMq^+)3kbH0f1G1oS7`LG9yxHU`E(LC`MGM&`X)E%VlZbw-jc_+bQNiXNA`usyr){#V@?u2&fw;;i%TjS#j0<1}1U^&nAy8ks z6h;`NG83HnK*%l9h7lQ6l&cAymwn(&J_nJ2ta`a_-;nxW!HXoIIYrGz5LrYYDmCF(vbQ!p>i9Gi8+* zz4-sbqcve(1UKr**LT)G1dLB=TlAF)8b-dO<+qwI0DqPIY^U;kJ72cs8s2XvtI@5= z7#23V#(N|_HzsLY7u{0gApUs@P>czLROxiCu4X>)TIq_93$?rtV}M%ZZY3{@RYjhw;DKdj-zkuZa z$5CR$QMwjA63@+mqjUyGDf%naGyJF$IJ5fjF2SfBUwOElmsbf1z7PV~wMu3$rM)0u zs0?83@3W-1g!qoT3>FmFxm2=qy?tHq<&3X!%XI6|5@Y%c!`qG)Ah^JxR(vKq(ovwc z^B97;#@{DNi=3qPFESRpaguz&60Bg>5TP6OFS$YCLeyReBEh_#Abk-skyFj#kJM5` zz!r03J9+)#@Cffik(NA50*3|k&yB;$v&8q6z$Vk;S)Tp;QKaYC?d{w2;XWzZ6JRe; z+U{PsCKWhLjfS+pj`eBsFdZ{8<`Q@qbv(@THgyKN(L3Z}2)(aG?}C~fwBbv% zgxFP*B0Fi{g=D*5r@4rn=Et8?#F1%UBTlVbX#(?LqySXt;J%f3H*yxr*Tt)i0+T-6BwaMnZjxjLdFP_`i(`WrbmM4i){aZg(JWOI#RE`>~aJM%wEv= ztVCKBrMlK3@mLoUzaVIeCw?7t{WU235?;fGk243suwMTSS9kPKqy+u-jOrF+)|=*r z5XUfqhVJ~9yvC3PVv~O#GHULUsvye2!x2z?2`9(3u|k{;uHmq(!WZ6?dFgX-r@V73 z+B7+`&a?@`*Q#3}R&-@mjgzubkv~o6c%SeZS+;JNG_w~288_OM+r-;vgY|>9767mEZcLKOy#V#iQ??!XT zjsL%vGH&@KrpxQQ19Eh|o#+t*hQEIP$ip9mVmM9y@1MC#e#X44K>$A^N`B^0jn{vE zW+@3XO4JjT@<@KQO33b8lo6om@8#HZjq1R3>qW`MH>H~}elgY8Z$7ysgQ+nCqLcU5 zuUmeY-13K~EjHkmN8om;#uHUjQr7w3Ul&8GW7w866}qWs!8h1!qh)Ok+UMckmUlK1 zR(gBFRl+NWuk>-x$=`7pO$43nQ{LZ}YoQlUz6!@zZLh{$#R08wIRma#=SowfwK+6chYet97Z~LiTN^TlP4{g zh@Ys}LlpcJjQmY_>X+(%j{xJKBieDipVRI?2;3&`)2g$MRcbpNR1hGqD&S<0!83GP zJKDnI(=oWJiPEV*SWVJl$p4Acc!b1>4Bca^7`M~*Zsz>^zNbi5@?yYrJxxeEOIGN~ z=!^Nl>vg?9#0p0KjRj;c(Tu8wbg`(8<1oKOa%Z|X+ia~hGC4AXjtI+;vA44i6vD{7 zH4H|wY@Ye0Brt!NuB;kWUH|F%@lycNGYn}6O_WMxcbeA_72oskib*C-#%9O`5PBk- zLdsAs=$Y>*?A_GSh!pMmljAQy8zD-Wq#i#R4Gy~nB zIIX2(=iln>IV}WmW*Fv0>7c{M0nxM*O|F}Q6V5gmIwDXJv}C3KpisixDgx1eOzk-> z*ZY4Fs4XKN?RAAHrmP4b#R0oI<{W4JeSdhd$R-47klYoDtEHTj^Y{OKi99`VTtd{I zD^o!0oMGsw&;+GaQDc1q0^aa0rZuJ6p(x-)dUTOFVqz`XfcWO(-6n6AU&-jV zQ=bh~R9JTEhT&5FEQQNOcKyR}`&W-Tpc5Cj)Kr3k@#Z%QA~;%Y)$l$3$l^_XiyW}> zo0}pHt!!6*Np0t~1nusQ@Y?6Z<9zt&35Z9g)1C>W2o)F(ajN-dNz5J5p@q05hBr0$FUKIg(2g)mc{dOm6 zxumkp-~qYsn!!rdo?#!{r}AXb8;y7m@(e zZaWl-@pJOLWX2I(8vDil<-5$T}KnAWQ#S{F7gFefAg-8WAP;&?VZd z$#EhK1yIluvM-uvy(W-idOgygDMxW~>#m%e%_@CH>$cV>!>z>iZrFafL?|p|n(lQ; z4195TeFVTPOq#n`sM8?42}2#~Z@0UHuD`SB@#;;Y<qQjMzi2Kgq1Q%%cu z^-eWcPV9Ib8G4-GP`2=)z>YPw0ukMUeKHZ z_8&k1`>zwpgUQ>yoSzyRIvQD81+N)Khtv-SiBc(Cwn-;}x-EDtCnM=%G0lfDy7?0d z*1NvFSmpwn*ql?W+;m!j9 zuLL9VYfx`I;{4WmP|!uvRX(}1fzJ5_6U#@P%i-GZHDs5$OhnbotTF^>lMj4$`*{Q3 zuW~ec_5rd@q2NO(tdd(ht$;A^=Y*J`JX`(ptHsZb%jmjFWtCYDT9}Nh^vQbG&4}H6 zwdHMRWn{C)NW4Xe%9GDP&uaNF?O?6Xa-5^n~WUWWxjB1F|=fAE3@^IXgU8}%sZ zwYx&rHCH~Azvm@={KEaXRm&P;aR& zXWf(^q-W$u-(M~%;iEB)Q3G-oh?E^|n}&gfiCn_^{b6V@W#1FvT;k$q(P7+HjX>~4 zP@C^EFJz)B#jZ2kEOVT{TBf1|#>vGcKg7ZAMgfUsk^Q#tv%0gZ-Y<5Drw?P>w>n6u z9b((R++Ypmr0Yfw?7D5D=1k9Q36+eRW$d=LoM>aNFRa8dhdC& z`T)A3XK~Ygrv|NxA+F{{>H#cbjxqw9^uWISa1z)Y27yIH{qgj^tLk1~Q9ZqO^r*rI zCn)m=t{EY1Ue#Ec?^nE}iBxE~WtG#CXw5;~?u*=9MKX?~Mgw?dMOL@)I4{-;L0EBy zXkRPX3Wq${b)OYCv^kcyNowD)@xR0^`eHqdy&w&ZRM?CbF+c9zXWNfr2F});pQw?CffmNaDOj*(4W(|Dkyo_5!bWlHF3+CI zkSg_?kK#B=RAZ!c?0k6K_S>Q0tC)T2?^7l`(rcGLTnAsy5BAx`EzPyxj_HEh1Gq`q zw>9^cFWhHiFY=6@wd~OFIY?>n?VUt;;Z74A;pLSZ>Nr{+Z{NWbt)-WfY(u$qBtDco zmd_ff6EZmFz|QwvS!OS;P}_e0+VaL8ry+^N*o$|WjRqlj7)6=-hHpEaRYeewUx)KxhN(n4l!QtvH;6q&EHefVeRW7h&B(9$ zJ}Lq1?^=#{PW-+0=03_5t2eTNJ9K&9rpStnA!rkZKM)F9SJl0+kct~g5|YGkK}Au_ zv~kzjr%(2IoGjd;yuL<|B{D4NcweahmbTo)6oHX=-cw_0+$>_wU@)-{*L*68LHn!b z$sUkCCT0=NCq%aX4n)eg5gS8@V`K{Wep8_dRq=OHHvV|h8!Ni@dN?s=yqCCChwwrG zb|MT&&O=r70nM<4;gT26DLPwHxIi>q5NIZw@~Iv9T@*6_CLCz^;}>Mva>)reW8({X z8)mMZ!q@}@iDfS7g(2H*rAqqV%X(_mZmC!~4PmS%`k&(nF~=~*uY%+W2yjfDzY-OW z2@j|7k77&CEuWkNu@}l?E5`S+P|pI)OH%Q9F*)=4INn#V(KkU-JcJ=4tY4xhR!rs} zE4%I!@H@=x;wPc$Kb^%^0w}f!p@!I55PRnGSEj>2pfb8;TgN5BI0LGV#tly;-@uw7 z>e!ch>$Fh;8K>{RvXW=nA6}bzJ2IRV?=_)zX`EJ);@4aiTz61`Q|bJ2pY^p|EJA!d zVY|2U7M!BQ%c*7B&Utu1{zLdo>(2Tq$xW{ricv081BiJWrW@t!fq`Pdnyqm8DuBH_ zXrD2y`FJC*f2JAqJCZ2PbnBx25@#Y}vDJP09`T$GL#=dTexdQt4|G?71iM*Gf4o4y zZ1i;QZ~dsQeR$ismOgjOU3lBKC@nQw#OCCEs`5dT%#cXSNXWO`2!*pOO&iRyA_Bb_ioMU5Kn4nF(VWYI$Wz`=7!u>C9 ze~8lD9`^8AO1fV2-Qb=|W{FGdAcA$}!{b|!;fi_5+#27#Jfk7WH(JwkFP z!rtgT@k{XeUmyu2$;HBrGY8FIOMFs)NSAt^1oML#kB6S5>eQ!}0?uiT93H`yLv~X;A?#CtH&} z74YWKrQe8GC2U{zHG?RgliAkjX>t(WHflWw4cuo;NXn)t(|5?$OL`MkLgVAXA`YvH z*nQ8W&}p>At0}|(8l$!|h5(JsSj`Za>@x||H$60+&2WidBJL{!F%zCaMS$g4avs~u zFS|6M-A!;XWEPo&?V*3_WtQ;&4kn8?AUSF2j2*qrgNDZ6di~TM50Z<#wz^FOObj$C zxC6#vT-DHhBQyWKPl{8+=GI(Ho8i?jw3BNi%zlh%+_~+$95og%a%O#t;Ny;MfE$k8 z$jSXBo&%HQbq5*1-wA&ytf1~MPm{<`^Ud63uRmqMD($}WU3M4K#LM)^&sQHr3OxTT zufHzTWVrFYpGAZc)q|Dm%p1fmhnkIgk zN<$alEp>OE|CBC}RWHc1V79p6Zc!1&Gka9=V@G9|^I_Ll)cr-IM$oqMHC>qf1Zy+} zziT)eoDa`+N^G-!RT+keYsISD8+W~^w3JC+tkWt+oa>iNK)QY?f#*bVNC5;)*u7*T z9>jkq5Vzx@cVfejmEBoywDMmwB71;l^c>&4qL!)K94NM|vcC82hi=wVQcpqBzq~5k7ct6OZNTn z8<=$N+FH*sDSnArwOCfX?B}i@j;}B2tefN6c$&7gPj4UV#=AdXY@Po3;rYtv_LAjn zt|zP3t=M4R#%;)^MzeGO3NMXZ<__Pyb73s4%sC?hE!i4Xib^{#Tb#bDsk_{)bLeY{ z?{zm{qZL6r{15K4R}#9jU&JEsLs^sU%eYNdmGUsY1;Lm3}DY4`BmF%54w9{04MD>o_zojx=Mu8+bUmQ0j^D< zGHl0rnP}$Osn1)*y2`?NGQ6b2brj6pbbgEejrw_xcLwMFBc&xSrahGg7y3Nr!-1(! zyhG=nLLue6`z|qL+ZIr`t9~Jt(sy<9Ie#ehD)dwUsOuC!rYl}|J4ZPgb)i<=^!mrq z7h^ND38)jgP&^40-MLCS#gZI6udY< z=2ffWu1NZvR9^q`+nS|2?mczlo*`QR&p@*M;=+uzaG{gUb0R+XQ${SazUjoQ1*HLTzD z0}6pR6fbgQDR>MdKAT=;Xcv5sQ22Zn;Y%~;VxDC1Sq1Y-9~j#43VIDasABp>^rBmRd(#9%j7~B=A>OLx zgeH$a&i%Jk0P!W(rF|mny`%>MdWz<^|4Bh^RoYBuRnmDLpA}PknG6m{iap7Gpk*|0 z^u)@wb9*w{5p|wBG-&g~iTS=523+rYx9;6m{wy;n2E~2OA?Ov4#1okY#Q(Iu>E=g? zC5|Xnuvd^7ppd8L

z}m_Psj`+9(;(DE_7a_jfl{tVJSe~HG8ds=e3+i@emkIjY( z_QUO8uNXdg@5A2{?sX7z#RrtF& zclo}*JOE%yIDGE_-8cJbv+wdy>Ue5084b!ewiI$0%=_z&cF_DO1xKKRG& zj~#ZOX+4ah*Qv7+KvB3<`m-NA(4hYC3%bsV0GandD&9a<7t@Gub(TzMfVTVD!;XdoU<&$bKM6 zp^{g!w$m(Qkjd_3qx}uNeK9F6_OUT<*assvoQ@qSH=W#CmoQ^@l19Qks>GSC@r!Lu zyT>40`@3Xs%BtP>d6e=>xEx%?vd$IXm)~mG@}#VanzibTg3dbkx`*|;>ll-Iq54df zbjC{BQD?BY)!i$)?B~yC5|mXm;_7#4wG=v;q>|k0CR)B6jC3|`TxA~9C1WLRs^fe{ zP;#1uKh}LmkKRuA2=V?j{^wscir=z}gv~uLtjLmI=KLW4?nAwnhv|$$)^peP>$aHF z?6?=7T6$6U;nco$5Ur8|8k6@yzAx=lsSBG8E8n(P+wDgmJ-eGb6u|*M_@mq9spMh6-*D ztZRSG`&e{TL7_i8lt|%|aRO)CV`s+_YCts z$?@gOHlz!`Tt-v9&u!%@kpbQNUC!43%zb!zTz1@o`D1?VSMzU|yq0rky7xI|&l)nw z(rNGNO%S;A+^Kq_{p+zyWlfjGFEd9yU#YvbZ&!RCkM^G2y5RedWDKsAeEgF0Xn$dh z>dwo%59g-df1qu0C9<`wUh24vLM)3$qnqyQFQ-2xpNq_i#zFXbvHHV|D)aF+uevC4 zij_wD5k$X@d8+ivEl2#IZz#XD(Bp!;!4J;1cwb&aMQ<$eZ*`NTQ4@R8$G#;oUCbrkBU38fj^AD`a}hn3{IKEPEo2$zp51AlAm|1}&^_ouH>u@z04hKz zAUctg$;H(L!+CFpc(aCBo`;~`a@{v32<R{augk%}rPW6cpYo4cmfaQHe~Ky};JH zSWfkS+WdggP9rr|Nr+clb)A$Fq2fI1Ue1m$%t|lhDl;)zC%Hu zt1jmSrXFrbZQ;h=A1L|@kn~y3Ih}G3vT4);QE=G6GEi0!1r0~dbnRXBTa(4Z(y4|j zu1iR~DMdkQ(HHzrSRoJN$oS=x+68E_aS#n@e3vr%vnJ4B&N=^1#_BQ2Pu{wY*Ocrq z`uUA3b*)wUj>C4d8Sgwa+&6ySB5tb)zDWWYcVvQGQAf{lf_fiwM|-!zgr+T7%XbB>*jk5B!kG-TbQjv#ZV2)Hw8XO`X2q^s;dOE;2>mY81s|vb{>VxSWg89ylv>$!4`!cYK^@R zD= z{I24$`J2KHG^my_p+r_o$z9zkaM~>Kd}+)UFV7g2T7KSW-Qb}2JUm-ppB9V#mcrFN ztPyRiqTsgHkW9GU(`l#WXj?t}ka7~BXKe_n{WTs_DefIv9J@)>+#fB}HW`EC%O{Nw zu?!!|`JHb6PX&vukDl|Ncn}PTQ~TT{B1l8z>&6GUzk3I%KmCdmRSvg7P#L64o2p-w zM-~bk*Pe0&OVz zh4{CZu)3KgYPpeCghRmcRgAQ2w)^b9boe;sBs}NYCCC5$IZ9V9^Z_#q-(0-Sg?OS@ zufJGw%3|lghaS;iKFTg3H}4QQt`6T$8w0j1vqPUKTl<1{&cBtyj8&b|J$CJmYAvZ<8S)D8&4r?8+nbbE z%~TJ~2fK;~+kPzsbY5?hD#L)K;qG8m86Km`FgBN5|NA^57z@NFg!XG-ngTk(Up@5$W_j1Y;#wFxuyF9H{SN9pcMx2i z{GM-l0R)NyarDP6OV<2hbC)b-!Y6E(25dvoMu;-WwfNW}w}A6I6-!G*Vh#qP;44QIz zB^}ln%(F&`<{eH-P~Z`7;8I9wov7T59&CLRuCMT|1X%R>iWvSgjRppvq5b2}n^e%j zt15Wyc5$T9==Uvx;_eZAf@v2oQKvlG^%O^=e7l$QZL8RAd-U}7^M%;%xm#u_Fm*)b z#kW`@-V4VkWqHtU(|rub+4D)p?9{`O7($0Ir&d<@r3C;>`k|T|i_N%Z<0``j;ZuIi z{H_rhqqgt?<|jYrfAAempL8&7sh8RLXMKqHsuP{VMX!k2v=y>@7yV82*VKmji>ODy zdh)717#Jk5-qGXvZssrD&P8jPnglE{DdOxxW++Xc`pdIXH>-Qk<5#_YN}lM(W4(hwci~lg}E_ zNw_`>u$>xd#|0_)Ndv*{gy~eJPUn7g1T@dZ%DDAF(>J>jrO;Ep8SyKmA(|T4X8(}? z#Uf%A$JsLz+@SOJyQO$}D+($kFdUTtp3my_$4Ggk{yUh6>|E&$+*X?gx}(b=N-sFN zABMz{Ei3ssvwY915-REB5Pts=VJ%HSeuB3<@zfEhCa?ptO{-3%9DaW5;RU1-hlbt( zlR_q(7DK$?x?6n`8Iv4FO|hyjibsPLaiF^5>pIB1s@|=Ik{>5Re43v=XxFIVthNOIoYF~1#$;BYKj9Z z^(zH;<-n~yU)UbDhSUzbph%^`Os zXcP;;;{nfBxBHYa%7x}@T;nB+lG~tGax5PPBUI{SxdW5}5@o$8#y~$(LLW};yI75` zom~tnYY4r}kkAl}Wex%W!n#$PMUO!)d8C0$WYBzVxyK*x$%D7}T-b494L9Di6YnYU z8CukT+Ao54uDZ*JMnf?fq~fSw3`|f#PoN4xqo-QxLEJ6QH|2wXoI(qL0T+9aX@~52 z>v)jNnd}=eZb3nG6$u38_MH|4=9fOhV>;yk5eC5+_gAwK(QgYbm^pnLemp!}ogVLY z`2VZZD#mD{h&!D>Fu5e0H#KmxcUjvQ0Udcp6H*mC(uWR{X8ZR081AM|^w9x^-f5wv zq=YF6G$=qC$hn&x0H~Er(GDO@%vg}v;W2_mc#ZWH zM(TOL|>^oMm$U0y4zsdjJbqPMEAcZ2`pK9+Vg z0QK~CFKOp<=3VLl+>?Sv7{r4V81HF$NMj^{X+%0)hWAj*91)Y@ErP?CEXL*VQUBhn zXJ?rSd0j=E!>9_n!A)BdW+q2Etv)yMK4Eq0p(E3}%xRBIEfC-X-!Xc1PSG@4+`nqgIVMYoAF*ybW*gQ=k=&h?sMt(_83{S(7M#KQzy}t)AMu zx{!>GsJMV=Um0`}wYwV1S4i~+`C7&txbmi@QD9kUVAu^0u=9SiU&$OM99mU2-;a`@ zxx|0G8R`iBef{UmlaFgDDgH^-Qm|W<$sic6Q^xR*_xIli_6Bb5vG)^Pf;WhTGJoOC z>SXKxJMtqIDuEE&f|UaZLiRcVv=-7Vaz_?jkE}95Qr@6-&35DQI0elF^A_E`Ei7gteZs#|dcdAL)`WBATQ>EyUz}D8@AScN+;$azhBu z8aK6bn1K1nkb(La!M~?ok`LhW9ose~be0sc*8(xP>$h_xf3hH~nPCT4WJt7!fz^y! z`FkPoC)sua)huFpcgurR)!a(GS%32Ii~TvC!)uzf>Ro zr&*6NGRdyJ@%W$1X^nJ~@3A~Dwq%YQLut-StGoPp+Dg>0+#O8`>5fG7pp`?f|BHjA z=GH&IVw6OQ2A>28HUG?*5^x5R>o3)ytIuoEQoQPwz8_mIe29EDnN)xgV(zl|aO zT-=Te?CUJBA!%OGb{&du?{!;`|GNQ zK0B$8=U5slzzVv$QXplVvLV$5~dW@h+3|l z=kNM^Qve$h1Z~eq&lrqfeIqslO%}qwo!q?`DS5%yi=J6r(q6_O0uB+uSpnW z6+l_S*S~eXGK)QHAxAQ!EM*7TL0QY?uwMM|cR_%oD7c1{#854a5Tn%O#Z&V=FCQVI z?3X(K_8v(c53T&8TIVSng`8`>8Os5CTG^5d*cs^-lcOX+Q#{^<;$NV&%cSx6v`rt{ za@z<~hBR|U@096M4P|pq&tDnE``8wXkPj{f^E;=a*Ke>_KNae1zqh88eB?{JND~ce z7G$~-zqGtGR^5w%#{95G2;VUha@ax}J$9N#rh1pdkT#Kb9|~n?J*`F1&8R~kBKa^? zS&I|_?PNt_JcLcLrqZ9s<2oT)ynlE)1=wlFL$Ez&g+4yyRe2ciKoy+~7a0QvTNz~; z^*itUnBi!-A%v6IX-DC5X4Qg&Z6ICtP2JNGJcQiqz`#_!| z4=6NbD)v{^6Gx8VIoNc(&@)v6T*?G&70O9Y4pdwPEI^NpzFfi@d1?LpCW-=c8**rG z@ki?U4Jq{=xiKE1{ND{Bu-s&pgO9KwB4k4vj~&HmUa}#isq^@q`N@H4&k~!I6 zc(pNOFL<@*kD_8c*^4V5tYYT(LJfiFUc*$*KOUc|G!-AQY2S4edm#ntSd)mpygc1# zbP4i!V`NXJlo9k?%8CH{CZK>=d_fU%5)fK|o>g`(MmT86rB|a02~dwk^8XLp)5Y%v zJdO&PbB-&*KHU5e1*#(i4ILQs&t~B7fPJ5?z;*Cp5Lp`j~)%SSB9K0;3ZKRRN@YxnXO>a{xDSvqG6_% zJ8SkqynvvA$q4F?=xa~f!nqS+cZ+!UWYoTF+f2fg5QO(ui`3b%3ZK#+e+HrHF_ihM z5W~n_E&)JM2!~(T0fg(&xtVbVR}BWLp&OM%FAvvRg1Fn2tcJH;$XU^co0{t5TmK(7 zwHJn$&sXwV8r&2Qu?caJDV!9=^x8mWik|Dx25n=*qfSzWfNUD3OeT$o4aI#Cb_}tAH2R<10CW&cM|>U9r$emP2ey zAD96o2e+dl1F9WXnb(Y0y}2V{pGNJN9jJBE?0Za}#$`uLdF4WfFWV=O1ioV*Yxog> z)314-9SSHx1psE}$4JCXZBCmJbzNwN(>5+VqwtPeBUJ>qSSfYs+seN5}0Z5rZwgB z;BIg-MHL$BtwdYPn1kavTFqJYQGI{*4bx=9&kpV*?L*hm=PR3&&U6+Y1FqLB@9Q{P zD65%oC?p587hTL0_q9J$lkO$AX^V*<5lIN>H{30G_;<+-2VA;rgGd5x=A$>jB7wimMiE1D+DwXhvPY@ zEDi@hA{=<`CFSjTGSvSXXloS`MR4-+uwuj(_2eohXQ`N&reE{A=3Ow1vPj4YXCLQn zpk82Z;O&-}dj?d~T3zUoh5`*2mGuSZTg+=0PxT!yX6Ux?n#H>1g=>ByO5+$lePzoq za5W;&#hUx2B?A4_8xuL&v`N45)S>6uc{kVdn;v?}tCydp)PVSXEejvP56r8yLxqLk zsyta;DN)NqrwYR$YOe2X&ifi3BVpx&TfKDIigHY9H(hTbQx(j6I;p9lBpw5eRY)5# z>7RxGdsdG*o7}pY7ZnClFYhB^_+E7i${lb!E@u(YrD)D&#dmthB-Y;;nV_-Wao5Vl=cqUH#Jy zd?7*VlPTJ-2vQxvIN9`BTJAgTXqcyZn;p=KF=2 zCmBMKu7;w)`CB0&I~Uj$@sBKIu)FRA`#&tYCJhjT*ryr%l#^Giv*!81U6>){^?5`WpT1Fli--#60dwj>YG|R5BAcIMtiFBCvs$Lk#rDf%Ogm1 zQ_efaA|_qrv@4+{UQI{%^-0%#9QLwgA4)FH*|5fe;K=br_MBVR_=wx~TyJasHiqIv zFGdFoYn_osRlOluBi8@(mGdBRmSso`DoUUdRH*NbR;}16IaU`lqh4gA{-}t&QNltM z_AAPF-&DuGXX)Hj|J)m;tD^9!-l7O|A5Q1=Z{G*Io0Ah+NA$c@51Mj~v}V6_Eo*Pq zpm2%Wv;e35RidQJoIeCtX`~G_j(l3sWmr532Ixgp(ma)8L6trR44hXNJ|EsgIme4} zm&W792KuR_ zYI~8ti^YHM@0UjxJ?A197gxAvG?Lv)NP!Pcz$=Ciyd1hxvdT+Zea!+Cx`RCW8u`lW zCx~;Ae(BAcnY{h$0xfv4+_Qra54;WHd_j4wLm={@;9|;ViXV)qvw4TxR&09Ct+!vn zrT&Ovj;)RQj2$U>TO@00#u87q#!}pQB89l1;<+)EqB~F$yzZ;4g$|RXV6(F0Xf>|- zJY=S=Gi@Af$AgC|#g7>IsaGA#&=o5Z%0`L(VGu7! zJIocvIZRtEn^>MdFL<Sd2|$8=Pa0wJf{65g3^b=Rl3QTd#bl9As@``XHq7`$l(0+`j_E2K#eo$qLh zQ6nbD{7NovK=bO%;~#>24EJB$qqWv2TtHr?!oj``%SmWXM?v8Km453Z&j!zcrt)JcbFxtp#h#h&&-Q)J_a>o7oxp`7$Pq-}{B{k$pwLwKjRd zc>W)>7;fh0o)m(<(t{FAzN?O*kA^jiYSl>x-01wVU z&&32`o2lFT(i;ugrxhd(fg~ifUw`xj+bn8BMoU;(W|EN_)e5{n9-YfK&mDc7ETy%s zFWBVxLA1_Mofbgyn(Gj$!P1)yB9ueK3O$Q=Squ52|8bJ}@s&+IVI!Ge7^+Uzg_;;U zt;py_#+nhh(H>SA>nwJm++`@c z%)+ucop<&}neL`N=ZKJ40BUQxN|R<}ycVX#`{VtUNkLHZJ6cKsa9S1cEPP;iMfImh zG&dBxxr9qO0?_qRh-k@>xVCaqPBJw29Kv9_=-pMi6W1;xEXdwH zTn8AKGS+Q)*m~Vp1I+4bizVb;pyzt3!s==>`3as9J&c#?Z?gWnOqi>0n?uAed{l&1 z%+N!Gz)HX~4V_&q3o8;xa_V}HXJI65o!r1w7^Z%bRD2AWrisoM@ahgC!opb!hCThX z)%EV|CMP`S^HGvkKE}Tt;7(YAo+H#Lj>N_;5e4|RLBN_!FB$EAd9XM${^i8*n-fq? zFm@mPiu@>?w+NDA7KPNUi>Qo_e6vU|zizLXI@E=wfLLT^5!paMjh!8SfLn7FGh73D<%2J#| z2=thk7A=J?z&v{5td$9o*8v0LWaJp=f|ck5&9@6=A-iP>$-l`rrj{c7gl!#w0O1(S z;2Ew8bOi*VgtB|TIs%{KFW=#LdtlGN>4|~j;EyRJS(70Tmh1q(70m`?hSmWH` zJToaaIcmYL%^>yDI{G&rL;qYs?*_?C-wwnzb&BX($SXW2W#OlFy7g>#K-SQS3`9$( zJ~dvn{O^J-QjUjLF$tYn`KUj5LgJDgFrM1;x-3IKI3J@ML)EJ`T8*k{SKzl=#HYCpmO~_Y&x0|_r zVzij;>p&5px=FwA2f!*7XrP;!1OPiGW*ofLW#z9*6qU(%vA z>z;YZZJ|wa6F7nukb~t%Ss^}Jf9e@TJ~floSwtdgAx~ISE-@RUuF#sjVU1%0+ZMrb zl%GvhlQ@M3GG5Y$`v+kM*w&AN3!8EJ2}mgPyB8(=6)3X&3oJTj#!p zsWk`Ec}YVuAyCF`R{I(zxrHv0oxE-VjKX(Xj~5u2Ia0#e=ccBD5cD)9NeAldP3)AD zN98YT+dYiJ?SK0=QOm+YcRJ2XrncURG6IsABbkhw2z2h+rfgUy-NQQvZG^)FwXkoWmPq3|>L zLO2wx>!r$xUT561q3lqAD`)xRhJRU7=*}_Q(tW~7dXntcYV~l zreBPtT&|D*qL74h9ZEx|c?L4CMLqkWRFysSVxhE#CaB0mchMCFl?qzyP&1&t&e+v? zG=ZAPV94rH+A(fqu{orW%B!7qH#|vynF_cwej)u3j9tx0{i-B)j)y#1dGYM&{3 zubd>bm+I7v@vxIKh)nrcuHBO5F%aMTX-BZAWBH~R+Kr;`kbT;TwaNF*HA^J*X;-j% zMlW3AX^4&R#oF&BfoBUcoFULO>!-DTl-~-DR7@pYh zqLU&p+v+5f7*Bm8u_dSW+Bw0;oeq)aOZ*?Xf_#s*zrncGJ*38s%DXSbSXl=@>bEX| zNKoL!mMXrR^F!vaW3-2cx;aTRyMec)DAkT)%$}I-`H&O;!2muWZbp7wIgbH+&xJl7 z(3rjujS0y*USQ>(g!Qp~F*^k}2#~(V3s>gwZs52GHY^6VL&Cxuo*MZRt3~IpR|9(lvn*HLEB0Ko0sZSM}nwPtlrI3=vV6;;p16Gi8Up& zVn0z^buQ@EbWo3*7+)nf0r!yg0u_siV)9!b2M?meM$pOG_wlggBFiZ>W`{27WM!z0 zJ3(!xiVQtVhBnoXQ!x|4l#}`P0!7;v;V50Fz05s6@?X0!tG0FgwH=nT>k85j4Mn*X ze=e;oTN2iGmqly965=!@18Ag|)|y6m%3fO4|4>tcuLh;oz_Z;!8Zx|O_(G18ux%ea zk?N8LSct#YGMv4#WpG*|$fHD=S}VUH7SIL8Qp_zFU0{q z&aDw609np3Qlp=lVET#45g~u(x9_dSTprQ4It}5DeQg%(6b2jSGxL~FIG9HwZBTwIhxuoOoC_U{r=bf#TSy zs+8DhjX=Ljz0M~D-Iq%EpPG9#>-ji=n)TJWjUpE*pOUd3%+k&ex9qi+ML^GmNPvN* zzzlLi4l^LIB=l)J$S<1Yk}|Tb`QsLZIZgUX>kqB^&$h;rZEf_OQpzPaM3kveqt-Fv zhG*IG#k`m?`eT~om-hscs0jc2KJFL>rw7A*-6`ysKDNvT@_;Ol&hb)%wi1H_SqX@l z{4#IcEZ%|kNB4OzKmf)T;|N<#lJ{isJT1%l7aJr)I-+IK8jT1Ve=DEOp=;^tc~U; zdgnK-MY76npKe=!dXWabl^l%^waEhrvV0KDpV-K|IFfVWKDwfN6`~>emZydwTk0V| zh!HE?KoH(3Az3KR27#=qScLJ&v0uG)cmNR|Q1lM7x=kDjBDh}mcPBAukqBtd*xT@< z4tLu7sPCHpe07W|PKp&yihg_o+n+{Y^d3%%%#htyv2dIeGn|zE^kf8s{_GU!?-bqI zBvvU@gbJZB@O&IO4$iB+$0r#{Z5>8x8f)b_+Fmk2d-zC&9_ zK+Li!tMRSdls*AdpoDpjg+Jl&B5G-rbh~7R9V5^)et@2={q4X@f7ty0lX#t{>{Ti< ze+Wpi4VsfspGt%#54%Mn9c%0O>x1hmz=5?I`)5I6(WDs-q8&udhlr4)8}KW2YY$$t zc{fqv#U-a+H&lN&9tGa3JvM{d?A|$x5{w$8V{K8^cm|+7HS{d4f*BVipBF2PGXJxb z9i^~b7jAi+moU`p@~SeS16my=E@IrXrE}(&aE0sekGi+vCHi8+KYxCUZ;(3D^ekA@ zM$CdyUf)*9=ce+q^}Gf8aS0DZ@2ToP(~AgZ)YKEA<6G0fskGgKKH{iP!`*?I*w3@k zPe)|>#J@>>V4ie(JNPvX5ua6N_tVL@$&Y4-K2Ie@_JFZ1+83s0dm~*t`^85f-_%hymmQMhnmrLW-mt*#vb38=7l&UnQgygkX_F~}4*qL-PpdKw*yBV5bGvPMF2m99%+CAn!S4el8$^_21PcPsp}|e1yqN`tvR3zcj2LIK3XPRjX6P zjyF(hFLksv5}gVVz^Ablmm{c#Tyv@r7jYkD4tI4VKU z;sdZiwApdf?laqw@r(76Kok|2U6YwzGWIyiAM_E=~#;l#91rSzIU+W3@&#%R_;OGgpYOzyPoZ2j`$WgHvD z{K;{;jwP28ZF90t!IB5nUXEG$+5PHjEO~GVoH!9Y2}L2Q0_0k`j0sZ4CY~r_4}hYn zhwojYYu~$V^Tlh#iJ;UGfKXcrd(w-6$va2#qJ%$Hst8UHqGzeHU(jb6;${i7@zeGb z527TiN-yMQ*o6cw9^rBhN^Py)fE%Xd#8y*{vfgIa<-59sa%{=c?_KvXtIHt)LH%0s z$IMQg6n;{|^{W}?7vKO@R?@2H&y{@WWLp`c4zo@$7UeRp{m;#yJwcJ4`raq<726Uo zMzTW7c|zFtqgKiBniy7W#2FWO8jtdVnsN?0$DW0Uz^$V_;3;;DYOT8FttBsFx~`1f zO>T{@vHtVYq1}Ts0T90EiltNuY)jw9^X^SuO-(_2eX|$JgJd`pCq$jDF>XIBOK@+W z3Z+^13u-~%dfuETmaV#mRynRNBL3M@2z9%It+wS|tR#$V@KL2X8*qyRH9vG*wd`10$RO zzp$5zsJ7dDqbp#b_6Y65SJE!S!kk(X!WVRvyx`H%yF4}0N(%pZ!KGXAg1s-5;;XPP znsi;#5l0*Mn~{$g`;-s?1EP;epbI#x!uD&tfBoa@Yw(=e-O3pi`meX8za0ETPm4#S;Zb>#o4L0%ZDg{a&vmX8f26B?Qi-2kPUm z4Yfbw?~zd3j0llYP*;>w`Unq?dXzsIq=!Bd4<=EDLp!pL%D>~gl8Q~AJRLVxK2mo*q+E`hNml1Uc5U**1m3%|7rdWbb&K+X$< zx2ptTmS{dDJtIj0IzJm98>uf3@4jckw8P-cURTWgBf>mHo+kA@QlVV~C^{FUWZg&M zpaH557A+5=^F1;lHzMThR~@_0kQ6m34YA~bfMO6W-KY`kD~lWJ?fGp_W#`==G4yO* z7b#%lM9MFZOq~q>@!unJgR>-pFJQuAGX<^UayTcgzcw&0qtv`vf{{3h;Ii1FI(U6q z5x`i+n07-q{yqfVfPIx{-kD%@6`=yXNnhniz(BQtaSQTY58wIMC5XQM9eQMsE~$#A zYSVcoibKybkM^Yx3^+7-Ac^U8Y7ti1Z3-COo)LIWwfS zJMsCQA#gILl)H3m2gZ>voGHNesoXo@oq$Tzp@|R1O=-te0Ac3X_kBX^suWQ%2nPm* zjwaQ=f|`Jl(Q=a}YGze{`3!Mh+j2}+)Us*2xcgi_Q7junLGNmhBoE&R(Qb@#Xtz+O zS6H-2)wrNO;-@w#vMs$Ly?}GzzF4I&sWi`e)+48k}`m0G`Cd#w_`cRN~C@J;$}JV?xli6iKn8m5M+cf zTJ}c57J;2ied>U)V+?S+Dx95L%Qy2Jlo#i_WP1S90!SBcS2F3JHQSR(U2?lDXAWJ~ z?L3n0*W62~uvZJM=eB1a&w|eQSqhp%+USt>X@<*mkCr4fUlo3DLr^5RE==wP*{$&h zxW5zG(9;=;-ddK4} z5;d{bOV&AG`Yac5?LXJpRn1c@Bs1Bs7XL;`7C{BQDuq67y1>%)H3a$+<04P`x_o*{ zM-QJkLIftsq*CqcHnZIuCR4Z~QGTif3F%bFS#gtzlu+BI#E?~o0ez4nIGsc!3Gc7F zJ*>v*xOJ2Fw&Y)^b-%hDdVw_6H&^YeEx14=EQm<>tIihG4HHqVR}U3`VDPk^>e7}$ zY0C-)!T-hHn}&0_w(Y~Qv_gX^Ny;omRLT@088c;`H5kg6F{DIMNXE=VWtNf*85&4r zN-`8e6f&j~Dn;*ps-EY5-tB$Y{d~B$?f>Qf;kK={?(+Lx*L7a!xgYzn@B2ZSE1|r6 z7d)U5kcV>(C1U9%x!i}^`bpt4M95s8*ik}zg_YedGaK`~mc}XoZ|@&BV1M}u%L!#y8VU@x-WlyR%rj^nvORMug{ea^p7uKRuMOJYivj25_O{|^ z48ZU?*Wvw~$>n?N=6~J#I3onG(`GiRi>$$hr%iU+5b5{w%P1qMbDC}d#VR$@s!kwv z)Ma9ARJ6bUSglnw;aKpb=Gmwi=^9Z^2DVYR{snH96rmH zv@z&P_h`Y+SS$tBGh$CNlcQRXdo?;Fw!OAvWU?lyad4Z2;Y>n5%;BwF<}pB8yyr|V zKf|mpTnq{82#jOW`;kG(hsi*?m*k0tA~v++!AtZDLwkfrOh&vK_~PnAm<6BahFsL+ zRQkQQ*Ie@ZUi!Q*i&lq*{-YG$s7I_r`@Vd?rT+6bNdA3~6bQ~#nJ-=qOhJhwK6l5Z zPzuUioQWE_I|lJuX|E7Pd(V=F-|o7E)k7p-wpDo8_vr8*X(6p0^ziRmBQ2O0D%jEy zO@+SjTs9H@oC(tBmdt(^&w8W<{XHVP%_8B<+rfOV&V4MIAmMT}=mih+7%_xe<&|6m zc#%*XhU87N#+J|vp3>u_QA$I>Oy(-8!=FF}k^5hq@RG~KB*r+u#i|HrGMxiv?Zxe8H?zu@ zCEZe~X7@1Ge{jm9$9(&da1%k~OvVebsD6xMJrW+`Pc(qzWOC-^d)rKHuaNN?HwQ*Z zlNrmlr!9ebjx0|n=qa5h!gg!&x4Uf38o?DoYZL{>ZBJYSe##rYTJ`5D*3;uE{>sry zKs@LiRra|RGPYBydw$ghzb=%5`fJ28djSs34dwt#Q6YFR8HsE50FF`7}p;zpA1=n=7~CjG)dql92yuZGZq zY?R1ok#1{GrL{m3+u@#P4!rlOQ=fjU5A|ypJ9aWq#%R)o+I8tD_xB>-l&-NjatpcN zL)bSwR<;QPim_0Sc1n_-H7PmoI`s+652NHWw-UR68Zm~2euvWUv#gPz>uKGm%K!`4 z0~T(utkRpBE6Xe3^o10tYIKwEg{+>amq8zLU4JqbFZTnSG|C>^kdmJT_@6 zbf^W$tA?EHhW&Ihyr3nDQ+xmyhdF+Jy(n|y_uS?=Y3)cBRSGTQBGP0XDouVWn)B0uUgMRN2yUo6*hVg}#) zeR5ZHU;%$J{mAcyegePres{#+S+c;~026;Ek(?XK2E~Dvvx`NehDsaOZMWElMZ0?J zFbaBW0E*3yI2PJact!m1x|*{jydY~M*ejdFHA;*Q?(4U)vckg`PuAV+ad6!%KtCN#{cb>k+IAl3fx+UgA!~k z$h(OIhS+XpHQw%yqDUu0g@Hu>t5|Sry6Y-7b1BbP3otBP*ZB2r`t_rVpY925J%oqY zO_u*%*6XskLszK@b(Oa6ddf$j9u@RwlXcyGplZng2_)u-evvEG8L!;292chxOKolZIGM)T=xl~%( zR_2wq2QQE+CHUgc%rsulO(bMb#JVwnW$-smL(hcOb@W`!f#?8IYAc}BZrG$Mj+g2R z=SMJ=jfju8uOo%Tk|5u^P?5B-i?&{8kN>mK(U8BcBqXQKXIy+ItwkSVFHP%1@%P23<{9PMt;JGpuP{8z6f+vW8FpBqje{Uh6Pw5(CmW;qtlC1 zutU1yX7;?blT^ONV7*r4u_cmz2~0AL2}#zQT+2T5SZ33C-?HrMAcPC?H$NVIXJ#Ir zyAohT?G8Zep6oyD;7&f&Us+zc(vQeF#P7F4=8-2isUo&2%4x7dyYU|5_DFHmBHfGF`4#x+kH`7^i zx^nScF7z26OR*krcezoLia``zdtz>dWb5_n=9@_-X;M-8^6xnQ{F-}9AV-}$cIQj9 zw0-MZen_mDUqx}z?=#!`WGUrY&V7D<{iIfT#z|Mvf5Lj6&j0?tfq_To3y;>)T1FXa z43Bs2cj_N#kbiUa=Z|cXMs-)puG&b0hTqZ)?T4pI7uv-GWY*Ax{odSf0?WsUT3jJ4 z3cV((8wrMI1OZv8Un6Y-?&Obx9c@oB-jEZ7sFRmLJyFSRFYR@`lznMyc7ad$1h5r} zux-KtqJH;bo&F?=!^-Gcq1zf6as(--@Aa(11)gc|(*X19@ane-rF0~cd%U8_(O;#> z>O$S2#c3ApOM6?ZQ7eUxD%UEtRucoq{3A0QF6qqC(9!VlDbQ=LP_;?rzP7Gf4+T`=#@U<^`w1vNN%Hdw!st zjwL3$^h7r&3~GZON2Oy`aabmr3QtZ{^nAJZGLA{pZjUz(uxZqhY%cM0`^7D;++lwa zS3#TNbRQzBi9c^H(d3xkKx1b;g|?D`ZO4rgljS-q z)TcE;hRLq;nbE$?!}0rG ziU@EvZXpq(N)nmpt~IJ!!2Rw_nUjW zX7hwgRqJs&C)`d??$1efZrk42!GDjZ3i2snEP7aGGxPVpp!xHTFgp9*uD9OIkHEf6iIQ zy1*`+|CeJnl#Hgwp23hg$B^9F4b0zjv|RXCt=~~~#pT&-SLumEgCk~xARp*OnQua| z&QRwlVzgXPz^wJ!0*N=#SkO#L%%|jL)|T9N#xL)~Ct^P%iYI#u{H^b>p$00AT zufztTCd~YpD2qEvVx)46k1}^ly!7da3ODK2w%@g(BgFtG+T~HDmaC`6b0bcQ-a;Ah zRIVPtE;dmQO+>k#W_TrN}sU{2j>n%N`rEuklQ_ ze#(j2=;58Y__A+b-6!Ce4Ghmg#yOasHHRHD&ES-4qb-D-FRkM%<~QJ+zGus`#jY(Q z_)S0oKh^3bN}MxdIhIA?vP)@XWpM+RZ=j%6{k6)-yGcWnaic(4n`cV3nk`J&IuX^h zdV1P5x+QXI16>8(2aAeT{?hV?p*ccE;)_+vJph*=3hgcozt!d}s%9_Qfr3pM5i)^b zRb`KMRFib4#xeN9cE7w(JPpz| z&`4Kg_1}v+;?@GZ@?C@UZ^#Y8S0(ArfNJjEOBo>Jx0T*&-o< zVUAdc5-}8}!W|kPwm6f>`D}S6kNv|`%=ZWpl6=GGCXif^2~`^z3`u6oYV>}aAhxur zl4Q3Mi}X$jF2U+l!n?n^>o{Syp_Mt#=7x1D*y?Uq;BC_TM!uKB;wI1DBR6Nes0?|< zC7R=RJ~r8}6L*ZvO=tL2mKcdMeZ9RrYM`~uS`5Dnv43~{5s?MifCj4VvzXCT|13qS zsF$N=sVW86D5_7m#voQg+!jlZ?z~r*vmUM2<&>mD%@C=OX9pjI!4{@lX42ClJd;a< z7NK-Cp3(%2wubV1t^#I>2EZKBP+H}3HYPUK<|d2^qv?QrYz zb(Cna*p?;DX(iwNo$b7G-+WRhqC2$3h|AAWt0@I}t2zXZEB)z${MqG}mNTix6ISN_ z_j2y0R$!VVWV9JRg!3yS$U9i&X=p*+d+rI0Y!Y|M7HRK)wG$H|{ik03w~xs% zK&FwyMXT_2;EW(6utsD~M63V-y2qkc$ml!SKB4gM;JYTApcillGc%;>p)Bt!OVANF zLugmQSa6t?QWwTWvJrZIY&=Ih-3l5Y$?-X$&|y4@wH|#Q7`$ZZ{SF2T#**G$C{0XD z`vYXkYsUzy0pFkjsB;@*iAdmZLO!g{#sx?={5j%{x$&B*m2E-WSB{gk6vrYW{ty!= zGos{fQ2We0*18=Y+&94RrOcLI%LY49l=sO|Q%$nFFb?f&8M{?8i!EE48WK!(y=&KF z4GGadJN_aXuiz3qSou_4plJYK~hcX^sc|rLc47L!Rr^2oIoR(n}#`mIw_hUvHY8k6-E`0ZS zBq#kscD_h7LV@FI#1yxmQxcrYfoI;=4N*v*MNv81V%DnrtKdXmS-4p{N%r)kxHEK&_28`jP%(Q1wvg{&E*g@GUrpEX(*Fo&*W)-nVE(zPI%g$cy+w`*EiE^pvvr-4NeiFKcVrf$(uSk@? zT=9b&BwbiDRXSl+-|jPI?-K1v+G|J`2lE_}16F_e%(HF{Z{h7>#S1f5TzJC9Hs^e6 z&XJczA3I~O1)Q(cL;93&R{H-AEZpx*T1~0G^R`K17>7anY%<|%we3Yxv#IjkEJcYgc-04utog$^2 zZ^$U;e{~6VP^G=s|EArQexA0!{Y#?VT*>|Vh}2bNM|iyL`9&k51>kKu&z@%*dJ1gc zeHG5r4D_m9pUJ_y>*|`TXd*1NJrR+lsZ(Kz{JqQfZoy>nbZB<6yS?J$9+=`4%rycp zIv;5P6U<8_X0n6ge2zFmK?AYaDvyxl;A?dDXN_|GhuTalW#MITR?f=gyn&^A^#~4`W$a+nCU9(oZ|) zH)p9zz_l>lsck2A!LLg-y}=(9Sp)c-_XS@jyLreIS((ltT02OtS&zmRqs5uV9S=2^ zRL0Fz690)ArQG2%bMa&Z)6m2$k*0hi`{kPh0QSx0pF2q~7lOdT-2_m(kdn3gGj0}` zQF$umyN5Y3CRe9?varb^DlRj{d1os?J<4w3xeDhaTE${+=c7#qh#7YXt0@lqSdXtn zBdKFTen*>LbfkkFk3|T_ zXvxS1ZTmfV7h=J{;ezysh?!LQo`uhQQKGYDn3h=QDO^6pNCpT#@P!xciGE!4M;wmz zING^T_Pa${{gHQlT9S8lKRk1fc$VIM!3+SRFnzWHJa?}z8Kv~jtZ9#knw>AY{ zx?0=^Em0FP&a5h~QQkoITcX6-eVnY+1POL?PpMvz3f()j4zE(VV$>;I{`~{kNi0&l zp8ymAUtwSDr&j36n=YzlKgLe~MS@pi{xTt$n%6Hh(-PodB0Xwc?zjb76S=A+zYtS! zm0XzYRv1{lTwL=BnP~c(6p~cc4o5tq2<6)BgGixLFxQv74!4!kTD^Y}k7>rr+-TZ< zW+ZQ=fJYz6%p_XVn_rcGMn8btFU=!o$8j`j(u6CMuXUb4^IS3pT`c1C3SD_ey#I7N z^+k7e0UOtICW1P7`w%DpAol|aseqR4RfE{n{f=94hV@(dmAlesJtw=g$rx9pMU^(E zNVv!o`7$w|nS0$(D@J3h>ohmL%5L(`1y7ke6^EDci*M0U7D1CC=691u7La88SM%mq zpK6GYvUTo;&c3d6w_J__)SI%8ZLJRp?pIhF#DiPx5}={$!cRmg$tz^0zOb)G$8xKZ z+;S1M*li3YH`6IMdTu%N@cx~1x|P0Xc>G%3_+g|pB7PqLDd#9|cAwetm}eE?A;)0p zbgYq#6xQ(%tB7&E_o&TPpx7Ax>73a7gYggJv<{gT( zdtyl}4K8nO)UB0!JT7_=-7)&LB;20sn*e*oSXNT#L6zkP-f;0J_g1stGOW9`F5pTZ zN!T5ybwI3SRs)*8YM5j7IB8@fB@G{5K?SL-b0tn0j*#`IJV71yxa=IAZB(vOw&Vv0fM-%*3Ajg8n!Rut+^WomJ-RBN_kdJo4yoNw|gkwTr;d7 z8)~X)6nh)uj&L!r(1hTgm(cMDA{3Us~~d6ZOI9Q$g-l^RW4e03tY4r2}!09 zz0VN)_#sBDsV3X>_N9G%fQQm9(DVzdEM`CwwM%!=XYDUzc8m-k+bv!I?^;fMQ~BCq z_Z`D&c&xj3*T}3}&cJ~cI!sQ2?#*PWg{_e3`9jZvrAA*bN{Nk3H2)?jO(B70IxA%b zY7jNy+#yEvF}*4PE*iwdM&|#CPTecMW-{T0CZ5Kj#re+43r0Uw4YkD>3ma9oqTVZ#h5oJWW1 z={ZLrRUIfh+O^)Fg>a*&l}*@RZj$D!Z4objH9KE$8UNfDCZU=zlxkgfGHrmXPLK|h z_`3vcaut4Zr)iR(_Dldjwbm-C;mzXqKpjPW(0CypH#vZnrOds`s8nmq;gW2@Ul z)(<&o1%9j@8KdBa2t$_cRI2Zq_0oTkf~q>FzL*-p?HCQw60!Sj>M90pPE`U7+k&r~ zVga5Yz_3}bReNbe{K(+nBz#XDt*ONPI%=ObE-tQ>R65qT1$M3T*|;spXCvdrXd+~_ zO5HRct4kI$mG^VEQ-Urse?E~O!Z%sRScRgl^dvr+Q!^20R9I8fx@cVp+7b~!4zM>F z&-t*OB5o{v-mYSF+tT0s8c>Cve5gk+7H}h|{9`_s3+mE1qgGS;zRGJ{eMx2wcMV}) z8;Izn@Y$+`#?|E0*W%L$Po_aALGB&)sfh1XKZ=c`A`6rkVr5~f4DxaPDR%t{FDKqt zn$7;g_;U}@f$HdNR~}ha8`k`G1pYXvrUh2 z?&I%TWZ3c}M_`UB_wzOWw{z*g8#m+=carNxiIUEv)EoWjzHaqdT;;bD&qjCR|1=}= zjn320*_OVciV!7ndjY)n?Bklevn9ytyx-Ni8?L5Z>1C+l2eaNpm61L#%hTOaoaFij z(C2kufnmeHD`NV3^n}FJLWxp<};4!>=f+l0OMVUoxmR4=@&C|*>>xZGDP-3*MH0uB}$SE4`k4+LJd?@c>!OZZ*3jd&CRwJ|Sf4WL3I36CO&DEPP{sFu8u#GUt^=6`%mezyHBb9}!Y$Zkhix^;?=w?@n;Bxhu1HUJB3L%kk{*kyUrWF?6JPzN?4 z&-%!-vq+~UiP}Vdj6G&A5_#1t@+&4<=SlF7?Qe#gAXZfH(Wt!GCe|UJS<7>QH1;ox zzm6c`0@$O5&~C`$02#x$kp8pWqQZU5y)%%1)B~Z!aZnHR{^&+TCBbV!xkQauG4*r{ zDDwRT0AlWP%n=gjT@Dg|^?8Ee*F=s>cu!}L;kU2P{yf7oq_Y_<*xj9DE;T_67sl|p z@l(^uW_dBzr7croIbO#Qxl(A=!1#FtxRM}dl985qsM6PFqo(&#Tcw+8Ap5}$D~7o( zBVb1Bp(ZLkpKQ+=v6b+_fx+^7iRM+pMS67agY#oze^%*MEwV_vnde4%0r|d}N)E56 zPZSu=j;Fwex|6hq4@2(+o#~=axfG30KC#0cpCsBya8lO&BAK~1EK>4 z3z~G4Bq9;whBPxrL?lrp49ouf7ETQDVnWhs@*5pb0DEWoGSB4X98lb^S%xm-WxpI8 zu9`aa+O_#+XAL1TZil?E2CR{vLnG`!OuS=%`OUS3r<(oZ z#=1#*9J$QZsgqB4bbgJ2NUK}s?=Ro`Q#3bHKIEn^i$qABzv`v0D~hH80=Xf8mVFL2jBbi{F}Rrt5~j#334t+r91FY zx$hIz$>1!q{eBJc``$Me_T7%&eH|*8t&|ii#aZ*UfbpUucCM(|U`wHWpk{IT&Ato_ zagjZm`q@_qM>=@M9`*jeC=-IL|N80j!C0$`GHjEl9Iw@P;&#Yf9VKYAMqaiv1#jz(HA(-mgx|by=EPKH(Fryf7Drr%05Pgal4F|qsAW}Q!x>)%q`GeHdJ`Swh^!3=u-s_KjulD}J zH=ol>O&`QZaoa~a))6^nZx!X38v~Y6u)90`^=Iefj7VNO)O1nbEqj|fbf0ca{|U|* z>!(4CKf8gJ}<_i3oM6?;u3-0L?)As6P^sqRA&r)EpRVr)zC#mM#zB`@>r zs4^!-oUSc;B?l5|ZSZB|oTL+Pa}7Lf3ObG!NlLzYRi>dyRf(<%uxPv9wsgx%RH{!s z<~!lZj5oON)}A$M31G zJwP$Bm&^Jg&}gxrD7&sQ@27~cA_%wca!{!4wLNrZHYRs}?e=H)|LzS7?8xI6pm(j= z3D!8-EGc@gR7%G~xJ2WCKokKqXEkdca`%P+}>a8xR%mf+8cSXk}WZvwjk*KtO zqg)w&X>q?Cq2yk#ctcm__RR5Llw1);_zT+_Rv!s(!#UmM6ZW!5xypEdAV-lQn;~J< z>wT!I`>#Ipe$DeJ2z#~_X94`rouGV3P9S^s z35%D;e>oL8unOhHp6h*siSZ)egiMN^`7hQy?(DRqQF*+A%`XR&_99LcoA7mR+$?Sbw_S02go?>sVO?Z`NP{d3ovL?Y zi>LH=QCB{4y5Co+Cl2jsEKjFNMDcf`bAT{_9Po7pEi|lVS8%FLhZA z2yT(|p0=vFufU5lvSb=M7A1!Yc!LW8dV{7%T|Gt zo~W(fY9!C$-sL8i;pH?bRHZl)4io9~R3?8pgC%S@5TXg?O=8TO;T#9KYg!5N1JB7N*7bXIW9Dtch=5s%I8S&deBtz9Hv;Jz;U|~=f}34rfgO8 zZ#|60DMJ0!MZZAs1YJF9^JZ(}XrCNjyu`Azj)@1}iSgIW8evvCF(#K z)Lsi~EbDnX>2nsk+2i8QM!8j!#2zbkEp=dY7PL%Dw%vGX_e;#m+z?W5jO6SfVxcGh#%uxz@x;$J zX?;2bCLm*SFmF}hGZ}?dB~mcItU8vi>_yaNHt_>k>O@w$b4*~GrVM=$5jHfxFEh~C zej{8g&QuYfTx^NYMc?B*cSvMvK=R<7khRX{>skf0Pv$pY-Ybr|%ovhoRe@AM7a|}{ z7S5L9o>aXU5U`Oz7X39B5^kw6%vr5uV;Lr$rE;n$yC~BA94LmuY@G~CdjMUYWt-N*QT56_^B}~Z#+gF-e?Gi>jc-XhS3n8?2uHpw76aWqjv2c3XmTH9_uf~+UQcHZmcnrsl3%x_waRp1H> zDz6~X;U~P=r}fhGiZ3|_Rn}12X?{bmS6rTrc}60O&8>%{)VFVTJnwemNs_%G<<+;l z^>zd`ef=eZOBgk}m|Du)FRP1=VH9$cmzbKVcQQ&jY2UwgoW=sI!yS6Jo{Jfn(ff*= zL7)u6PKpg|iDSYW{M@Q?=QkQk`DMbGIMdMh`f^CHp572u-$?5MyGPP+*qmx6aY<4pVYxISX4Jk=|8)Ao^t`#t`1ACs6N&<*DBE~Gwpw}}JkkjXya0eZ zZHvfA!UHk!`J3zFNcc-nIHXvbHwnd4_mf+8x<k^5X)5CEEP`+1082$n!V0y&AH~ol zWFsiA@dxI8cvPfe7GPyNWo)4QxPem9v6j2mC>?%n4hC-ElB*(+ z~!jyzj9AsQePSv%Gk z)EsqxzJ}MScj{RCCM~n@ALG^TJNh? zWmhPaq<QP4xBWGBzfCh)f+3eSdJdwL475H3 z-V+VB&@Pv^H4%GY_)A<@aM1EIk77RXTQRo0#BJ}@swlM*ecjiwuh}ROG1pnSD4MZ| zbN1EI?gwJoXI`%9#h6E~g^KYTc@CA;Jb<*=&@ZsO*+`kNnY@eYbOLd-XpZqk=tT=r zPW4-RN}I;GFi=JP^4gYhIC)Apyt_1o#Q|J@j)qEo{({5$p}Pfjtf{`t?-pgC6Nz{e z&qA0*s!KB7pVnA|y87}VR%&Xl&bfGrl<70{?IRG5w`|r#ngixQI|i5>D!As zajBIR@DIFgDq?T$f>yz#$~yLz)`U6QJ0qedSKCiwE4t}*47L!lz6L{kxyTwBu!vf^ zpF(24!(ruU3SFwBN!5ae3bBl+^{_yHE) zR$!g$d?)g4lH&U8-CiAg@0XO@UWx&xJrB#t4T2T2tOz}AwWX6T(|=h02%7lIA_WRH zs=f(P%i7$N7Y>kPTrxU`eq7Njsg+iqCisi?qoTqYd`x`jOewbk#3--5`7<^J$f)l4 z=FWA5Y*Ob6_>Yv*tmdbnIJTPESN&Xm>vHnmJ>;ZcTy%eSrqz27y1{as{#4b0G7zDJ zcCmS|5@Y?nei4uHjtEyMuM55B*E|dTIC%XcJ8gLuj)>0!VRnP7o}Wk{?FPEReDFDohMnaGl*!K$oWVilD`PuU7zy zR^u);lJK5tzrsRkdvS|~w2x=$SVd}L8yZR^$BIr4AV9$u{if0dos%R72{=3D{Z%F+ zK4Q|D%1Ux_EtHVwY+AZ|!;gkPQU=IKQq>Pjau58taDl^3Z!61wPF3n3;d49$-hPz* z`B|2M)sLTh9V2;nhKwnZZ**_1puy8HSO-ibxia0QD*6VD?foTZB zxmj>mvjn!fULdnq+(-Z@eu06~2MKde=y{FypnJW1ac0~UYLah#zW{6+=0BXb^U=VO z%r{`un5rBy*vz5)cm5(Cw64l-VD^~^#2)s$y}AFkV;0)FD-{3!C7wV;EC zC=p4LiL-k?(n+s&xA!2@k&4R16?Kx7@kXu)F2Vs=OT?QA(-*LBrr@%!G3m|=2@0$+ z;~iKu_cUz!`Q@H1{g+>-^WeTO6GG~hOIuu=pVQw|r^9-bEcqsB`qe?~Mlv;=|GmcP zUSC_)4QH0MHa$70B7}hNiUKcRA}A<;`sBuq6nR1<|A(}ut>EEcbl%DL^T&v+#vCln z+sG*}4DaKv5k&AY^2brsNg92UV*s$K@CS zHiCZuh4^xv%SxZ!I}ewmTBzVXY^_3R;Ja!N?aQQT96GVsSl>04n5dro?jS`UG`iRe z)wWD6mC0QcT1xc84>boV;;cnn-YN*{(YBy*7r9hl==`)yxKO|!>z*scLnuUUg@;#{ zDhYPFimN9q=hyh(-_JSl#guZh7vJH%WTLA5!z+MeCa)SV^CYfoqyPBn5s{bbB~l$v=BB zIGet06%i<;DU;ADHGm8cipMxIA~ubZmER1RtZ#!1l8ZkMLZ`GDH_+azP=>B7fU!j3 zdRmG~buwI(jU=3qB%qC+J>?VVC$)n}Q|?HtwNO$#KnC^gQB!y`>~0R{xuNzQO|OId zTFYDpGhjF2GXC$b-36n&F0=+W^i)$%Pph`e@@s@kmcPv9mpXGY-y=-m*?4bx(d6p~ zJ*pzg3upAF1ZG@sIt#84>Onn{3+$=lt;rd&R5Ld|^>QtO=%qJ9)%=h0>jOV&9~9M| zpUUoueJIa)g7IJZZu(`3S%(@G=G*u)4kv5Q2(tBY9yHty_#&FL;nfTViX3f|MRcOJ ze^lb%FKdgO49fZ+;iX~Ol;@N~tV()i8HaX_UDyw2ds>*hxb|zW!PNmJ4X_^ySFjHvL|E_E`u6f>?gaFti8W?zs$Abz$( zq0skD1{<@TiSfj9jaWY|_v{-HmIeVb;}=va3u(XZ7EjwQDu^|#(SCtl85x^e(w_pl zyJ&3#n5e%7EKA~h%~Wd>EY9ZoR;y~kXUb`lTOH8k(i110^X3a1$pOT6mH-S?;Pz0%WFhZpwlaqXDZwRsFkcib${ z_Gg}6?$P;t1NZyBf>0a8h9Gs{RzY6ixc1)_rJ4B;s?S%{=zKB3ODOu?W!yx)=jDQ^ zhkfREH6)qZ*4H^{ZX(b5v7}9A%QI07ABsGK6Zt}A1#kP#iPuTAvAa*e9;I_#ez~@% zCC*~cLkBieLJ?;XBQ8951AZ_jA4-eL=t+&*R2iX~R3e|UWS{BkcPPf%wz}#!|HGiD zz`}r)1ex;KH2AKRyr)w+q}~4p?F{jxWtxuvUj}@l0y%BQA?s^K5|Tf^&{Odr2oCY- z;JxE(&b)OC4>OG;`mt6p@^oiSV*7XegqEP;;^(VB*Spn=?cA1jX_3vT>`^?$%Wa}f zH;;18Hs}AC{ZhRUUUeJ-+$|7OG{>KQx&4v*U+_a{K3CL)ob$5npmVE^O`yy?bNu{S z!=h&!W&{b}lyI3%boqNK(XFT9q#}--0YOTKST8LWJYk3WU|Cd^pN?rlc_e2?(mzZ- zHyj6N^OYfpcd}K6lPJ{ujTjE!ZcN(dqfh<e`>w%RH9!_zi^TW8hSO1jbyZP!Q;sV&>uE?sivGjOPWvH5CLK2Zos zU^_dw`O$1AT0)mSu7LoFceQ(MH1Xn^&1rqJjM?(@aRtiF-^UH*#_xi(*M71m(jt5D zrT%34AxFta4C0a_r=H#{7y;A4G@K^Cxg>U|%trT7c%t7+>DAOetNvb`-bx{+cAr12 znel|!P|a1;d|!8ED*{H95DVL_Z&tf;*M1<&C78qBpdfj0DdhS<_Pb z@VtI~`}O@RcKxlKoHje=p?Ms3M^wmFlA?9s5gX$F+Uq>v=c0VqWl)J2&Ey+%n6IKg zXmmZ|ZuU`b4YzY9t8`e51*Tewt|{ZQc>X)Tq}{ehpVCWpLehTvbF=u9;ya07Q}&)Y zwTB_nM=jis0(&N!L^ z!{OCe9te=zoQm7rwJR&IhTveUmh-7)NfEKYQlnI`>~dqPzHG52f=Js3*9bm7w{zRI zbL&baGSP#b24+`-cuC#_*q>PT^K1WD_VXjo`A3t9F6f#biPD$OkmvU-17)vhZee@S z(1PrIQaw*z2*tmXdV`?k9kBt)p8@_f-S=hf6XMPNy1DJddD=MK$04)LkpVK;%yzHy zbnitTTB&tk>4b06<$2#QReNEyV;nc<3w{QX^n%ifHt zQNC%pEdc#y%|Vzoo;(2E4EXD-U~eI2P4=0=;3wTv;7S8j+CC#>W5qYP`F?_P20HJLt0}O1WrzH`dq$k4ma9iVvTLtg!zQMVl<&wK>!T?oqWPjx zllD%HO5X);F;nDwYR4IF5PmSDV+?gijVlP}+YAfGvmWMYB};J4b9~!?90DJnQ?84T z5BB-y9_H7P@cMX-f$4pJWxq|{C>X!Q?6Nl;G*Q_|6mWCWqrvxRY*B63$NTlzT{axUAz`{N*f7B; zJMVZF#v9#Dz^3b=I16${ZCv5ge%>SlI95#BT)^>N4zYkH>Rkr|~ z452A-GK#3mr?X`j8dC4^kd&yLpeHn_13y+IyRvSAY;3DjtG3Oyxj)2n-pl^N{}=H* zo_Z76ablOLseUMs8_<39A8&vUCD@EhqrOIjr|rv@+GlqfGX0mHyF|`A@dYim7+;DXAlEVnu*8(Pc9mI6_KT*ocbS+@-D{bGMsgp zr;1~t+}I3r++kJCTDU2@whbYGyd=Ywng|5Q~Y%#D>BX!rYFzA?c^ach`CV0HiH*A0%&r#Bo*Q{$7 z`hu(?RzX4}|16|pz*QbgPU9-x(gEH~sT;$bC7WjupU{2(DYZ{=xE+^DUl6m9Nry#V zBymchIiaYyS97$d^fuXrB!{Uf`sv9Uyz!r0gY|JFNvTv?pTSK+>m(bLjNFN#|1)R@0+bL8&_US(8u!@EbvUv2@@i?JU1>L8 z2$NEDwsr5iur_l!N~)+UOU2;h-`gsl*pGyEY^f0@q&4*Nw8#dsp^#^*6Gxt{ThqUL zwtrF<)*OeDiff&RgAyk+!kGD+n1O3)!mO&PXLmn2=Skb8pf@EVb{3W_uIdfUgQt-m z!q^}WN1?|MRN*3>gqn2iaV$+h&`#auWi}8V-F*#@HQSp|6AIUh;7OI8%HI5)GZGwBrwv2TbsOdklk(%LH=s(pAztwfZ1j3EP z{_{cH!Buejn=2e{!JD2F;nU4GT>*y`ZguP3wlD`EKB|LxX4`v8Pta|*dG_K~Ohu{d zxr#hHWV5>oK#D2u=nGy&>=qbA@Vt6H`H{y`y_Im2kF|9y#8$jdrY!V{WYlDK?+S(k-A=C;ExpZ=}i;GM!NyY#lXwxg>KS2!E5_@SKAr%=0 z%9@rKpZucakGIb*sFCz_gfneA5}xY*FH(JLv>~{DbBy)2*(o+==U%{}^^VEk?+|r? z@mm>PRHj8-{EJZk)LxYo0^K-Y`@Z{^aT_{D*E-RUqzh>;uje1<^0feG{Pl^4T`Ae_Y;N`;Ot=!r1$0bX= zbm4!nY<`DeMG;&{HQ8g|7zhpUKwVy|7~aS%FBth+Ee&9MOzTDB%ByAX({NG2=$eq@p%RAXhS06 zY^@D6j7Ji$`&6&7-r>PD^HSG4AyhXbJ6@sQ#tiEhvmhc%dTTYz%%gJ;t1g##v+uTk zD@eT*`NEFAm)Q5$N3HXHYqZKWK!!{>fT~tM+1=BdSx*L&_S!Jv#8U*AFGQ}`Gt?wq zNAR$>Xn}E*;jz7vb??)WGNqev!OvcDuiX1tZg{8z7KY!EnS(e8y$)Ii2pyeyLcTaYE^6>f&g1&ra?W4 z;)UoEZh>XFNQr%)mL&`MG}Lsbh%!CLFBfQs46-3(rAXi!iPbW-;4%3^GP>H5qe=EI ze%BD>^jEMs^{9q<{pjgm++2~`KA;bTe>)DQC58K`5cDB$1=ston}hEPi)4I_;_?*ac6 zRtQQHaUPH(Q{$o?!(Y8b{2%Y3)1Lx|TCVnI*ncDHarh)1B^`BZ51>y_0{tNvG%m8w znEi7p^}pU{F98an0Z?Vk4~I&UX?hMoESU)nhdmQl%4I+MZdZ-!k!KOOk#wwMR%Isnt|Qv-g_}JMo+__^ibR( z-*T9h@8-VEAsoK@Ewx+IWkSm&Sx9pX0}X7qQQv|#lYlh-OYj53W<}2Mwg0)x1)-~g z5^>i?r8r^pP@~ODys~^el&*orOYj?KysECC44b&q6l;)@ za8~m2FBJrV|5yf0TZoES3-^320EC5wBDZn)ibA}pvONf{2Zndx851G|4rX=lX zApUZf^cdN*ixEdr0j(~dgT6Zoe$@+CTA4hKVbY~E&$zY=9r9sSoR;t=-9O{a|1~zr zp!EMuH1X7VLjHF~iMLpu(_Ncq$y-sxWSX6seR0>!#3YfSQ~FP| z$;>9Hlk4LSiE*v}hJF&CU2YxCpQLUC2n+wtY;2z~ue5F7j4_`f8sAYA3_&>%y+jWE z_@qpzSl--)LLL%;m9@vvY135M|VIarj zqRV`#APF+n`jO~Pn#CQo5q~q!=9JZKLS4tlar&dbl5IT!?`%N=5C26vj@Y-gmzpfYWi}HBDM^HX63($5laC4qFKwRuM&@-U+UMV~ zu0y0ipIa`c9o}G@+hkm8nvbcbbMHwZh+-F^YiYthBMd~~S}2KH`Df*W?|!9e5*&N? zo>d6ha`ZYY)waVy3byB{kM3K`e1|21n^ykgi!FyQ8o_L(qIYgf*Fk!=+P^nM1nDei z*3(lsaIlK<93}1dXGN*3$G)VxeJKAjRz2C9^ zueRijQ=nc&%US z#DO1okEo4fc+r6eJ0-0&F?%>jhUL^dO?g)(4Ae`bA!ApdeLHh9`o6nM-1`d~Q_0Mx z8|Z|;Ds!=nG+E2i6&)`2%_y7ua$|_d%8!M-Vw<+B9qlRLTfj)K%>Lw!404>6nAZEw z&_{<2Q);iu*;4v|^-9x}dcWILVoatSEzgt2HV2rxc*ZWSVoh5*IcKvmu3M#Hh59u6 z1Y*t%NbF?gA}+%a%KzyRxV*Drvz#0e+V6D>D^Wk+?Aw>WK2~A~)hy-xypTQx{BV36 z+kq)sF{dnD>yt76mBB}N=4nd65T+y}o9QbWnfhS0UqFofF33A9ApxX3j%=d2LN6!VJTr#G1_Q_C$Bu2k;&zX%TNYON~Vgh0i zAJ+fhqG(9Hz~|rGa8Jg-o5@(#=IMG5WP|qX$3x=@c5P5PcPiui7{+_3KqA@ja;J2( zng?xM%5VoQ9^>8Z|K>5`Iw(B>0GLXa!7N~acHgH`eT-|tm`qKy!JPbyNwcy7Lbb^X z5GOe#Pi*-3E|KJUL~{L=gz1YPDp&3l99{@o^^Nb5^c2Z%dy%HN(v$f!9^>%RW0dAYr8DlhO0lI2Xz|;80lHi!#7q6mvOR$sIwNS`^E9yVGFO=EC~A)?;$07DEbCe+$T9$?d*Y|$FH4VQ#fH| z0~&T5=SAtn8rdJtB_P-CJzYgfJ#=B&hZ{#rneYQI%q(T=qO6Il=!5ahhg3u85nu*% zaF^@#>?z*C`lZ>Nd@G4SbNq^~<{g^Pdx0)Jj)b9)Ilj6b0kBiG8D-?9wHSgWgZhz2N^PF7L8`gP?RAu z&z+7b)3>&Ur{}xg_xtDj=e@e#r_TAE{o8x(weEG__Y$p<(EHI`4};hVYS&gS`99-& zb{xhKQmQz#LL_+9oCo}^38ac`oViOJl7Qr{!WN)ZeZ|0?r-7V$Runqr=5el(D%V|x zSl2+YvaILv}R1aglp!1yDy3m(wA^QDbgCVvYcnzjivrrnQ9!1{uM z8qT8T@0WOTW#dwP=jw+2gqi|11%5Nw2s7d)G{r;EnPk^4P*~zQ^PFq}#MO%RA05PZ zcj*$m6z+_n!#2Zt*~^d)cKtZo^=l(Tw@65rVFKjg>Q9lMARbSk^nIFUz!#GBOh7-6 zg`Ec%khL%OA%_s8>=TP5K62?gA0)6$EAWY1@fNrOE@wh!=iiLZ+I_f)Wr^<;w@&tM zlfENWHVk zBvSW&vBKJknZ~?^(EJ01=4u%k&T9(3F!ruFcL6U2D~t1o?U#kbNnLk=;+YP#IXV?E z9y@~$IBGw4&jUd*v>Xm%6dBnSn8wKB^m_ODiZu2e_!~>QPZ{vMvfe8VyhQJbCyzsP zl-aHp;b7%1@LmOIdsV#NahR~1eh+NXq|GhL^m~i`=ili=3X=A3wS;wu)uc!3J}RJb zR9_|^D_lP;R7Z6il20jXO%O+FU-?v&|2g&ZD=~|=T{E|v10k!)1h@L-VALvx_#3ew za<=;bt47o?%4inZfGN=gcpaW5Tu{26G_(YPW}&(!q8}L62Pws6riY# z`TV+sMRV*Kz6xDSrMKmAGoWwVQJq3T}t;to_4lH9_tn| zaY2;itp7fl|M`~Wp=tt)vyD#|VZ!q1JrBKS%6zXWcHFZu5cnF`$f!d{zdH%9oC3q6 z1SuyDMUpkCur~t(t`qX`vD}!IIk5JdA|FFVi7!bDAUn+>zO;b{mM%!y^_0G6Q#QHo zXZd5&Y-57l0t|t**5E$ojgPQU)vwi|rmUnSpH|UQnNf>HW;yj@(Dt(k<&Z$EY#_S2 zm?w6u6f}x_{~jh4Q4SY}@fx&j7A8fyk3Z-3h8Cb6w7y7J8c!U=f97WmfV&f@Bg|Gbjhp}ThdE7p*8U~%6AJKU8zwx z!v~7-W-w%(m=MVYCn=U>@%^f;mhBA`>#jlc64dUgIGEuEkMzBSz|)~F7k5t*1|!q`iHJKA>^e#%wKWs4%cD=JFCKcMOD z1*QO0QM%-@^yhecd-F6l059{FrL7eN*CrE2tuhxt~4tC8}87(R7jHLZ)i8m zUS8(a;bR#Z9{mn4n>++r*^?7KzQCs1&jL<_lReZRpR<0UrTvBe2OIEmN}?Xi_X4(T zcce>G;zEy$Rz)wSdZzSiNX>GVw-MoWtHxvRL}!{eKKr*375$Qhd)&j_4-N_VB$Z1I zzP+g+yRGMYYogXgraCIfiR!GjEcT7Jj5;UsAN{%h5Jp2u-&AEeZ-iLLEji>?W;N7i zaa2suPu_3L(b3sY*1*gDD*BMk772$~M=uXDiha_;NyjqKSgXvCNy)9S3O+u?8 zH;Ti^JQN@4(<>XW)f+J}auE}%8MD~KRk4j%ce_joSN7)#dGJ*aN_#g4j zJ-s-4WQ206ek$I`v#hp!WQW%E{iBZ|0}nqte4@3sJwcWujExj!zq@p9x#dR8w;k1x zQn#lKCO+r#XLz3m;9MtIjI14_tPGP4Oh?SBH)$MVAZ*q@80NFl}+CVVY;nsjr;MVC8c6bj~fk?6sClll# z)l)bWfp=?6%$9w#r^}*2Unh~<1iEwCUy*f{yD-5U(xK0;Iwck%GHELN$9LCXDS^^_ z`MB}G&GO4#3gvK71V!dO*zP}Q8bjNqXs)$i^LW86-I}W0^6ySFn&Pk`$zQhhc&8sV zn>$4EXJoJ;FFN+WmZ(5idNz0uY`B#>x-YKNvgh%&H5rd>b9%0eC3DvKf<%zw+}cIn zAB0PKBKFQ7kg!%~r@a8#f^s)GG5|+Z;)wi%lrHQA(B*7j{2gE{YJ6l;NL-uf&s{|^h23DnhUAkqVPsbi2x2BTchGgx zft7Sa>a+`#zjhPsv37Jq#raRbo+9XCp#%O>`cD zsA{$Q5`diSrR<+DU=?6!CF9z*2pmbXRfYY!Zvl0}fhtBYLMw=xWmUF*&g6aC9Ie57 zQg4{Se84fhhGx8M3`{|&nRVLg4{6RsW!JFEi~yM%Gk$yoyl@-~=iFy{#urK30i05h zvEqL+cLwS^PrH}3(umRFn~Wx_%yWnF9pibdiIy=#Q@rE8O#09wApSIrGI@4^UJ@%e zy_YCsr!&%%c1$@i;GZ^$4M7SvE19sQ@mRr0RE=VaBaiQ1I;UYY`3kejh z6i(Jud6a)A;edN%^YWmuj8$-&&FrcE8b`Bzk+v(+WYkG6hWCSHY^YnRW&q!upN`el z2*y?XhS-tJEyqq98r&u!wPAQy75IcJoFQJ7~6c8wOAEoSWQ9) zS!nTS$Z+iAX2i|5h0NbK0a!whROncQ9>HzRVjvG4c!f2h_UQ>20kaD)M)j>Lu4pEA z=8DohI5XsA8a>Nw!_Z~ipq8!636|82kwyG8RC6zcl?U;pZViSy4z{bN>^S!ZbJ*3P zjY5#^4Q!OxI*z&}hfIK#uSsgqHyyxMiyO=Jxi**&3vypAvF~kqwAKqyM;k`G+p2dZ z0t^_#Ossh^r258A0sF-+oa|^CTIU#5OwoiwG1yP^?peRJf|KI|LyxXpU?COQ4Mhr1 zHZ%PevK=Z=er=JI(mVAtNculu;GZ$k)6^Gw6EJF`cgJ7Gr^!#^OaF?D4BHP+_~pIUY!8hO9GiJ zHOP90oz^MyRyZXc0QWpa_Jpb4BFJYQ_#C(lV#sLh3wrkVu;H($`w|4VsJ2m;FLGDl zpa9$);n4Wrnl3{ZpdHoBc8(zCN6-(l4lcE7WO(-3zM^}0t_h5b9*4+`?5i-Mkx%1} z19d4&y{rVp?QkFW{;M95P4W(uQ~As`2?8@#l>Qi)4?lg9`!OAqKL^8ak)b1y57m0` z@Oen3e#X);NmA(^#~T~xFMgosSKfhmPaFMY&iGP#33B*n4KI`)*EvxEY?m^4B6Q^e z2M0_?*EU~SnD%84CTi&@YNNpgROBMr^a%Cu2uuur9 zzB%ZJ^=DnE!C6BG))v@W6F{$X)Bo%>-l>eM>4vIsy4;d{LFG^@jQGevw2nC|lK8JOdII}c50>M~DRAygW%XNi;(6sYM`4e40l^2 zIY21{R%=((Z+Vh>Ti(h77JL@8y2wJ1sqzoSC}Feb$MV);D&Kq%%+0adH5G25=5W&b zzPQyLS*SCc9^s%P2|4i7se&d;@w`z~l>#}sWH_9ooWDBqDc}czhJ5>57siIZMMOg7X zZwYY+Z0BzyC$wg7E87ELvTsumfG{>YD{tah3X%r$C|Y0@G@W!I;{hwn?^^=^07-`< zwpcR&Q=9qRz+p>(^0ipIp1w&c^8EJu2Dh6wbc_xsbO3`e0~}q=W1E}c%Kt*cVI2cN ziI*GX0&%B!ws655K0@r}&dgyNDr;#aYe>K7TsdEbmqii@Uq{T0Ll1xJs>@HE0toP| z_-cH-DNK&<1YvsNzNIPznE~981=mA4zC(byi%T)p#PP*8|6|Q3ux=44&8QI@kp(Tu z?qsoww)l7$=hZI}Zn)RpjMV$Cy8S8xfR>VDP)FLI;og=ilrvfg$JH1Ed7MC9v?3?1 z2~=8RBH1X)4(|OTw?CJD{GZ)|YNkg3Nbi+Audz-6i)f=JLR^)}$e@Iv5LyEQt4`FI zeg>*=g%mtvJjhbFeF$K*Zi-8R`H@E|WSQeQ4&cd?z!R-=w*FLL!VWD+`1KI*N%xu~ z5-(Qu9BSor@bBNwaK5@(?|6PdfH{iGAB#p<)(5HEp#II;F zU2H3_H60_9RI~bkyX53Ba~~vXO^?dqvRUg(p4wsE#;L7iu4S|%{6;*a7B}w2d_6T1 zf3WsI*dTyfZ?~0(T31r?{}W{3PeXaIMP+(C>8mWaVD3^vt*Uc+V=MV)oglVljfUXA zl0_Xc=jtHK!+M5%nrxvR(@fue5&Ay9`!PeYCBVAo{A?9K{UN`$3`~CQ?!(G_o+oT< z0V+skFRuhl#w5DZDzo3iuhhz~?^a0<>fM3&n#f2e{cKeRlhFJRmrFAtU%n*Pw#HUv z_jignwza9OS!jIgdH^h0|F0}=9jE(ptJn8Wh9QTgHKHuZTeY)^Lk2S&)f4Pn6RKI2 z8r!R~yM{d{@ZNMgn6+qzN5=bZO^Nj|^$JF5ti0Z%RhqE64BWM@X&ogNiZk5zvX`LS zvUMDklQB=m4dRWq$awU)++H5@D+x5|xh(Qb`1SkUOD60-)c37?Hn-y7opR~_0K)eSFzio<5wK=$)e-;70rmY*-SkA!5u2F|L4X zOb4)L*TjK3{mDL-;|1^lA3^s#8+ljqDB1?_)$6bODF;%W1IH+N(fP=fmrdMCGl#6L zt5#zy_snppGzh(N4hY&1uZ`-v9D-Recm|C7c}Oxc&|n9+8rm${lDua!iXHlAE~0^V zof*1({Ue}8T3EB>mxx!*jKnWPdwMnH&Cmn!NMaIq)pTh)ls4&j56*Z?Pl@qqfn(TK z4Y;=Qv)tarmM@PaOc%tz-=eTCV;N)RSpryN+$rC7ZiP^c)s3{;q=K@1{ce<3RIqq+ zLO#t|b2aMw&)n?yTj8&O-E382(K^M5N-`zmv2MQtof7~8nD|F(%GPh!M@((i#k@U* z;>gGQzP#Ua)E+Pbs-s2;+?Rq(FSEek%s20zog zycfh`{xwX7(trf}EeY;%<(}*rzfL8h4Yw-4cuyo5Wj(Dq-4_o3LlF;WWZw36wy3cO z@7yv%-OqD?r%NgDApoc4IH*zA&Ode)m2;QR$YnO0;PzJ#e`E0-3b-toyDYBFDsvXi zxXf?9OV+271XWqeuIH#G>Hre?p3KP4&vh0l_wdFEP3J}_2eL(`H4y5gEJTO#OCYn^>{aDO$K$KG>#)~f!)h?LBSE#%C} zmSdunQ{`Y8w`vxtO0H@uI*mVl)AJz>VX6_O8;5f5qkehDCR zDc!>K-nJk7ixk*T9l1wLw!qnm`D4Jm>WI2L zq${ee;vn14DhE${=syLYDYR~0B}&?MXv0{{vu%y)pv#yRBZiqzK%#IKGVQ`iu+d_3 z16*s_hUePIEv^vl&E}Vy!Y!hRE7YD70}h(t1n56u$}yxA5IuQpYw<%?X??S zUJ6@fk1!qj|xYd&5t#N)VfS0uqe*8)@9vcs~pkmteUtB-onkWYY*R z%`UEnIwgVaJ;ElIk$?{HENG8sV~W{VU#sszxx>*RZ> z&V`UM*S|Ap+Y>y+rD#*nt!RaT4$FFei|nM3UtG>5^2k+2QB&mhJ)OP=%5Y{+G0_(? zZHl2}W0|s#8Dn*N$ z$q9HlhD`x}l5RH*Etu|}uB<7z?xTA{FbG=M{Y9?9>rd&tSw2Lee4*fT{>24UBG_<= z5U1n~1)xUQ{IB$B*NEA`cp7_|?L+!3hPBf2hzu`T8xQ21<@kEI)(Cn~)jcm3nm_SZ zq2RwS%4K%=2)QCoH%Lg-(N@RHd2#*qWC}T`Wj!gZ zvK+hzw)&%20j51RFQtB>YrpcDWKTE^cNWhJ!ozAu0ID2uvn%B9FQItN0Ocoi0iDfI zL3zMAWpuq>eb?XV5W5R3k5x<318C37qxQV=Q5~wkzoqUjgur+wzK=wdE;&KY*-EJ_ z@~=br5I$n~Vug+%YU{&e5Dg=tWAq2;q8NGzAF=!~tz!&$Qr?^l#$$dD=$rn5FwozG zW>(FMFREaP=3@NTdQ{ja|Om2~D|BYd+Y`V8T>0ZEtBMTURX(wp(x-;NG`ZGzE_ z0tg=>XieXoecbfdb08ZP__1ng+97Aqk2yVjLhH@=8?k?2OF-(h$>2taib;bY6m}5! z7#R`6rGI~hHU)gf-V=h1_AHcBw~K%zF5C>P$K*hQQAX5U#mel=u1J zr+>ZM3-A#Rn(cP~UMf>-c6zIdg zow{;BHKr8pF+~yLYb{>%mH&K904j|JiZPPPz!If!WYY-YQa=9oHhoDCYkKH&mA0)0 zJV$ETJF4NRbQFF6dy-|9g9=6vMl%XBhVE=0?9o5`N2g z5nkwDpK%#}%dk=KX;b(uQs}pQ;EdYL2!B6|GZub}v8`}}kr8^i7mUYJF>WfMf1Uz8 z&nicaL?;`==C-kdb8N&Qx$yUo*+S+E%YH|Kya5C zBL`_}1?*EFhw~Fbe}72^tjEFVa^|D$sFpOkMulll=Uo2Rs}n)Tvhk^MH=LIPuprio zg4)~v`VQJUJy`tP{5>Iyek*ti-t#|o zottxzENy(IqXXw}CV*f-9g z4|xygcG%`^{@>@8y&pk6iwtSLaBgkUxn&qx`qwUOMZ3^tQb!tg*eD63EaTR{pMhQ5 z9iFqnz7}o&Yj9YGkNx#N;8_|(;D>fkcS)>l?yud9xP^z=|K&&ql8}~h03|{C(`_A; zS^jqT zc_AhJWIPt&`su%%Nw^j+K`f2wnKMI8z-c-?zTFtf7TmT zzK#cNOG!l|ct zs?PGS_pS%8HB~j{tMv_ditw{vPP7KLhl~Fe!mcUgpjFQjRxX1xdk&phxB;kt|JYbOwO?nt@nkfT$v>ME5lG*FDX>fVwsj ze=+IXRva=|ZC``QZKrEly|YcMxBq|BkN}=TfCCWSprAEpKa3+c>HEnB)awra34BCV(J%7ApQTK$=aI?}#}LJ>R1p08?FJ=oCnQ@TdY&)K$aFeK9_i8$69vc2dIuY#=-Gs_Ebl;wQK!xc| zXI=i+Hj{%x6|MCYYXYxj54;MA6wN>PAe=a6aJ7)4xcKY!Z@CFdj1|Sp^$oDl>TV$X zgW^a7d4bRjQgVj~spQH7`y;;>zC6{O_a6H4-3i%kBJkxm;mfB-S(*M76QLhOA(scDQ&zuGkp{Mz| z>;PDS45$Tq?RoQRbq+-;!5(b8rE%5!?@oSvD8gmC#gc6p3{kf&T0FplR_H=$3LXX{1B&9`E4Ibw&B}?$Hxk ziy6ugg#QV9VOl8i>R#4igs^fG!hrgdNbni^`8Tu;NVULGeF7%4KP3VIszYvN$|AN= zmP^qs5iC*N!DL8i+y8qvshWd6+!m%y7Pr7*Is?_!vqr1Lc)6?P6Yo-P^d6(hN&iyEK|rZ;y$%v#83Wx4IM)lX6XLNOh_=5P$0RPsQza;&Cozv)DO@DyPU<1 zbKt)D2}*lCIKiM{t|EPpw7?_zr?QgZ422?QvLH0Fcx>th7oR%lvt?^ABr+e!op>JPVwBEac&K}Yqh zq8D^2fTydvFUMJgoYuI1IKT04N>%kkvN;u|SGqP^y#XrPShj+0xxW$2)<^i z@lGPNTN~QAFp_2II97b80Sw#G12$tc+1YrTSQGctFa+Wm(6-K<0Y*`i?M6vapMRoZ zoi`jX!t>iy<<}uiyZ?}?Dmi!SpI;tw&Bu`2jH!O>2I{0igMQ4;O6uIU7*VqsKg|5w z0}f9BxbE>YjCyL-T-`gcGAM4!bU*<5tsr-a8A`w$7&bz5$$_`)>*r>VfiwkDc?-9E+)uBF$!&G9ca4}`zci% zL)7W6an4?}Oi<^|QyxLhL4>=_gYLKSkvx#nG@BpDvtT zfo~#6IO1WB%GAgAQ!x6?Ko10cg-^igJ`-%2XEyk%=5MB--0F>3C2n9#uso}dFG)s` z(@>>1mHZI`c7<|b`ZkYEPliz6%zD#k351g6-sb_PN8!%6NWzFqG279>wwW>b7f{yS z$UkNfd$|514=~WuH_Sjr&~aLsB^9t^-8Orh&mv~*8lbwP*%@9#Cb72Czi}3IEDeXG z8_9+yMaD-AN%OgrmCG;2j02Rf4Fd*@v} zwLDqWPD-9xxuzmOIo)cukS`sVw@xI^AkLtl6F^D63ZX(Oc@4n4oywKo;CgWaHA@OY z4|H*T=BY`8v&@^Zk)s{hbVt$z{17Jq89j}RWM7=fZ(}G~2cD2F1eOA<<*i)UUA-a+ zOiU5#eI^aw#|5(D=_sedukiw3yzgRt-o>^(;YY86Z3?nq@wB*`&+myt42B$|} z`K+VdsQQXpGqFN{jj*v;vhghp<4-~&8G=1|{LHqT7XhYU_((c`X5-0sNfGl7v1B92 zTL+(K-gaM7q``FfeUXQTrN#OU&!RP*d`(gbh#z`G@5mPDIqEa_ijVw&o^)_jMv*_J zZCios)+*pV^SrQ4O&rQ90JZ27;MS%TRg7rhyaaefYnu+kjH#Le!-uWazY=zU6@nnD zxbjE-$&TiNu2t50!W8e-y@Y`d$OQgfT+(l)$?wYv`(=JI38BRsdP;HXb%`Td9#+Ri&Jqbx@s#gYGfX^_ed z6q(zLW34&*YFJ&GkZQsN3^AGn+lB(9WAGo*dBk366aCBVKtHQ z&F`k^M{Z%vglw8S`fE=0N{VIl?)gvPL0R-EXS#@reH;FH+ zHo$4!U>A#QhsI!QHL*=?BD=6f2YQdhAX34IWO_kWI0sv_#O>nZ8-Sox`6?o%(JCS| zC8vDipi5m%F4?y_M-%G^*3c&9E4Oh87KDUqlw&x2){!9fo|35vuosB?1rGR&@2Jz4 zY{TRpt$$Tpjh!Q#;lX4SMa-!#<4lTa6XPfmkf1W@}kOI2jv@OOu%U zUTCv(W?h7gI}LS9&b>WJ>Wyx%jetl@TvGV=v!>c*?ciXsmirzb%jR+LHOCY6HEFx9 zWYFrReJXLtg&Xz!*>s|G(xhzaHb?3fiRc?IgwTp^hZVI_uz-x{XO#&jYla+0$k7Zu z5-M5$h3|de3P{RYH|lDq`21SywGB&p-OrhKIb$yd9+tKl_5k>K{m>{u?syt7H8O#x ze{k8nE)nlTcz(VOkDVxL*L0DN#yy7<7m+*UkXEpL;V!d`&f2ttpG45@l@h>cCm?5> zYv-F_@krxtGDO8*@i@OHGjyHy90#7nS33@9iEid-^n!D!jR1;kvbLMh#CUw{ZiDB0 zfVwI1_vX!+RibKM{*qf%KCv)Jc;yQTP=&}^ks4)&N9$9%aLTqBO%YvrxPCxyQ*DfaMhgND*ywY|!=Akq)$_Oxl zjQTEs2YxOWe_;(wV{(u$m~2lE1?I+?jL>H=q^ml8X6~q*S8f~BZEkQ)#U8PX!IuHH zZ`aor=??VT=>j4>YHZ1CUxK?G=nKy7=Rk3Epi2VOs(xcak^0$-u{^upNP-C44ch!G zLAwu(!+aHN-!s*`DE0ce5I(K8p&YoS%09bCRa&Cb26{p~4~6i*zykk>Z9@Z}cHO!K zOdDn7Z7T~VeOt++#LBFCrq8GY??4yc>*9^uFr3Qpvxegl(e|f#hFVai)XkVN^)>Ip zW4ZH`Z4a8LR=kkSC-vr@4&zW<6@72nr%s4YSdol1gucnP!K$3dgv(Qpzo{en56TOU zLD}&2G$#mHex}u7%v+YV$6?^)0uAqRxmL`gaXht9ZI}lRJXk~u{NUH?Ayve{GtiOb zLc{e9T!&AoWyjcg*o^9js4+Z^AB|n^l>>X>%%fS{kb!u#R36_dbz!zY2HF5;fh4ui z$nLL>Br@`5pEj@^6-CS8awVvmc)IYYC>7xfgKq*%%l8ER&Q)kl6asrAa+RCt1wr|= z*bS}hXgg_LxYX8yyb2#Q^|NAdPar%u$XkNcYQR2#atdoLh@UZNb8`VT_Lc3opHGFe zb5JsfBPkZ>3vDa1GpmC+FKqLw|u0!gop>t3ZxuoR1X*ZB!V%S|q^lJ14zn_=p^Y*k?k zqDf>3qbfHBbkh)^e@DUz($fiCYdK@C1+v7b4z;v`g)qx&bn{ZR1JWC49jc{LmHZIQ zod4y-##g*K^{?IAAVTY49y-KMGlnFq&Fbr{%aCkEGjqkagIcQt>B?ygjm<-Sc+P-0 zAt45_L^>r1kI=09;=AKJrzkz12?dlw>D>tz+Lgvv>V$2oE+%~Pi(|?|{}onbciJ+} zGzx;2MH+6lBiOK3kk_4^@*iFcCOS@02hGgP!8NhGMUHSFX$bQL%|@yTGURQB667fa zG6x1dC}BEaKjl~&h%g0ag3l5ZE>7;=oD%UnreuIv(}~AMu0B#rZbz-N>}tQ>AK2Eh z{I=-M<Jy%RID`#!lW{t-1Sk6Hd?}(COd6l@1@uzEP)gPBN^LehJDNr08H66Xr2C zVj2YdFD3s@n1ykoL&R^iIbpP#%yEyJC>ufig*tH32^Fi+!v>IDu;h`E)zhlAZF2w) zd?zp?hH1umdbcr3gAK6>1~g0SrNiPKv6UpK?;;YDwC(odjd3I=1%SD4s-! zh^w8*=lDJC}`Zk(6;5ZGAYq z!8cvHvA&W8X01!2_4ur*Iqv035Gbim@Kl2o|1^PsZCOdMFRz#XXt@tFE^ZW9A`wY^ z&LjF{X!QXS)?DLT-rt5jcK%Jlink`&2=J<(@4VGKo?reER@b+UnwNx}Ds! zRA4GH>7YjR6W`m##dfV12zJFw1WowNmO@|};$yie?IO;%3^@#2;*=Xh-O7;KZKi}n zl3z)opA2RL^4|HucI3~~*^oiEn{g@O#D;}mNAJ9&NfPTF!LYOBrAsz$UsTMiRy^)d zUz#H-UJ19DFlW>9GokO&s-~q7s;G4uH3OQ1_c4|w+Ad{sY0q-+bF)xjQ)WxAfI_UZ zUG&h@`T!Hl&A~M^D{BRSqW1PJN8AlV9tW|1cMVhY)Src;G*68C+~-fux=$rHi2i$H z2b9G%INdaqz_*JU++h~&+uLT1TXktIO7&$Yx?T%pT<9><@sjO&%PJK;-1&mF59;76 zlipBHc*;KE)>hK>TkZtSpRrZ^ZpB4U9DmM}pz!Yo%soXQv?LPs?N7JYRuF(WLv(!? zi^*YK?2B|U4pnyeh)n`n?WHEg2AOy0I;<*6d2kUtohYV6tv>pTuZw-iHJcqz3ao_A z>X9%dKaSDyFYH<&10Qr7xaU83IVweBu;L-73%Qx?9>Zizb^6}H?lJmeMR7u+47vH3be6qeR)ViLKV{z1aHv0q?} z?5<;GlcCot4Q9V_t9eOt&GOh+ep5O}>a`Gi5w|85XL8Y+IA@r&&My*H3(PeuDaPfi zV<|zT@B+iDv*p(XBBa9i%9iqmX%!Vz)P7{^-quzzd$h+DC~#DGs_N<}k0T?q=axI! zc5Ls?6>fyw2Anz`SJHruy#AOvc-pEbqhlTSRyPc)Zf17;U=_F4sl1 zF*Q3dfn~jBi*GNKU`+upDgLaZXWH8szDs*IU+=EMX5H(zxoc`WKCh+;!gWrkPWV{$ zsf!TpmIew)-$ZU&aF@1PI7ElPP>eN&>|@BN3$CLz3zfMLnObT4p0Sd6r-*(;e4%+q zNxm!oaJdJww@_irs%niUq!htRjqcwcsnL{N%-ve}a5>tgFRDG8YGcB_2D4^$Uy^^? z?Mh{Xt&K#81+TGtA#-gG_hyd%j&$TX)B3i5I)d!Wq%gZkgs}K=8>2C;Wa%g*C-XyV zv8#y)2kL%VS1Vfp>cphN$sVRXV|Cpk{ zO0a)iiY0YbHyrv{IZH9iHQDP*Sbv%5+S;B}dCs-HPT4MBj=BPnoz)^Fqr|BH*$1o6 zzxM$&zYbSI6=O>#DA?Z`TKgKJHowKWwjXtG*C# zw){gC_dv`PfJ3ctlOBcrNV9&hAuC9Xs*(f;RCo>d1%1<+o8IwQH}g=>MJUNt6rx!R z8iG43LWLbECFrs(S08VqynWl|#wEB)XVP{JXB9g-CO+^OFuxCUx1}njdaqB_etrqn z0zs^@E$y$8moYNqGkI&%xF=%Oyv{8RzGy<0xjgIvoLk!~&*hKzqH39SeN&m8TT90t z1s}6HN2zk>16QaWjn+5gkGG8izYE!PKTSAl*5+%si7+ggY|0y!{y~rNN?&?hT6Y~w zZ|pa3YXp?vWp$B~pm`jZEdz73)?9I2Qwqn`lW+UHOAFdcV<$m{%q6@|dbgf$tIzc@ z9$IJNuW||MXDlCY6c@!%mw81I*VX%iO2^G$V8@g0hT0qUvfZM`##35IZMds^&hTLZ zMGXsH`=xVN;gDyd7N5W7%+Xp)@1Vw7=NYQf(d45KS0o>Arx*+MS3r+j+Uxa`)CZ-B ze;Wl9NJFQtd6A%kQsL&@M`=2KT2^~yLKMgKg+6bGl^Sp$zZYlH(Ga{{Vo2{u7e^8a ziEb_I3Nm(VDA#~M4`vSNa11JK0K%P{xtvqRo7Zd-mJ-@iU4;+sougkDSGj&i{oT!k z1rP`BWL699oVE|SY_s>6|)WV2x4WDXUAd)?U4`^=jPX&7gDkKW1MR$pR%c zA21`o-!QeTD|Ix#OFYO`#l&L~;Zol*{E|xaE>7h;C!bG_+69kGhp>!SBFEWq5 zSP|(Z&oR!k@06U9GvD}lE!npE!ZpaVChSGTML+kZ)QE!Mg42f1kYiSSs5jx9J`>@2 zY5i4co)rv?Z9E-G!zOpkvBz(1((F{*m99LFxtw-k<)US1*$6q_we%*ZZaHB}aq?)W zCCeUCVB^Fy+nf?1`W#8j_|+GVXQUush^rP;7iF{VUQL22=fxl6FQvwcdZ`;N-(#p_ zU#S99R$p1KdRpqkxA{nFhFGYl!by@YMfzaA#;64{NJLiBJDHuRi`B^IWpX%nj7(=K zI0-VNLt*+$DSgb|U@q?OYBiqe3B`Pp&n~Np1<2>)Uwt+ke^YB0Yeq?QOt*~Ix3i2B zi_~|*2nS3iP1UgK2F~S@`66e?KKQ6FblitU=MOK}xk-Sl5oc{AqeXbq62Dh-$(WPvWxaK|UI!e`jv-}S$B7-3;$@;>sT>Ew2 z$S-VOiwsFU3VX1En8mun=fvw=t;oc!@@g^6q*{4Zp={zVuk>T-Yv|)NfoWB*en?my zmS>NsCpP60b%d;9Jj~H>*Ps~Fr~RH^@6}WYbSul9hzcDaTDz^@c5V*RMgzQuGnTJv z<>rl)KCe+0EyCgD+8@)Ps1Od0#|D(hNL4R$&`$a^gnl|5d;;~ooVNpS;YX^%+Rsjn zN{GUdyo;bOO4=FT3DXs{aI)b8ID9Q5rEGYgkLvv)4x_*Valfp((w>2ofT4ZPcG&M5 z>-`&o&UK!oBu$zFHLT-1q`^AiO1yY|?g0{dYNd#zpgRdL*lMCC|0QPiW+U6A8Yfe6 zqi{R4=gt`yi(}j zjp)lo9376*eZ*?kcSGsG9n%GkfD(Z{=#5RUM!Km}4Be>N!153&P39uk<$IoNpF3%F zp66HU^_sTJD%K>5dSBi-H`v>{4NptET%dKQYhOe-*hI}`d_|Dw=z34+~14678 zXv9))>|ga-K5!YDt_MH#8%3y0w1W|%eAQ|w>sz()f!k9BzGaVyjieRKIn~`TVcI&? zOd;-6s`rP}7h=bV0PFL!B&WJ+9akm4Kri!vdg?UvQi>-d_4=R#BFNHX5t`+FL8tt{ zrHZK*yU)cM<9%1)fw~^&RIlSIj6X3s(Q8Q{G5h*AH@uy~y?XrpwCyZTVsn8^3o-4^Qalh#L<)JK;pwl2QFcQFU$C-qT zmTSIlvp#bt-r%E5>zPyqZh`;M=QCtamS@+2yltUBwZ0+<`qcuxR9a1oMn7&GLlrdm z>zqps`f#?K@qnLMuiCvf#riC8tjKyCB71PIB@J)eP*^$h?4w^g`^w07e9(x__mO5@ z+>+BqqAC1I5A1#}JhxB{@Q_oHR)< zlEF%s&Up6AI@Y$+EH50Az4mJ33LA1p7H2R z@!UIe-o)iZ85e8zs-59Onr&9O-jxQJg)xOF1=$kynQw!M&~#H6Z8j_Scdw0$Ee`LqijYAQH%$SrAZ;08 z<_9%CpGA}MB&BNgp~96h_J`to1$=hB{%jGtQ|4j=fAu#&VrK&Cg!5djrdhRG&t}JEcre(K|JY> zakYb5VC%e^o_XlZ?)s6()l&J(%7Qpq(5Y+y^xPHGT=eX2dQubC*oxw)%j#V2OlNIm z%0v(Lx|w=8fOF*ugGn?GLjhe1CrxnCp5Q*NHgo3wWVuj`z3I1>11ob5l`D}5Q{#8_ zpId7eVl1bc|C=)g>Yv?*TD1rIJr{U(k#-~U1wP;ItMAI(!H$bG#lksTRz znzS4r``A*eoXRd2EG7Ia@7|uF``m6~@>yv9ot{+UT`Dsjhtma*yUMnl7`V(H>5s9` zJq0t4LY}5KMU9k89gTV0Hl=&ttX*WFzm54u5&RYf4yv2853S3>G@kr1HP|Fz(B@wA z3f!^rwnBcKw$2*i)lc_4uW5Fcl4iB~vkUg9z)R{V0vuH8(((1P@v?529?R=b z#klaRW}XAvv~Vuse(4GQ&~)!in+Bh7^9rKSnKoB&r|`t>^hgl$*@YK}1-&DA+X6Bc zyQ`oXV^-PU>XvxRioNg%qk6(kzpp)smS|;O{9KtY=Slv}=NqKm+#N^Uc_>K@MbYlK zy}3JnFyOEK-W__R89O&!>W(o*)UPHMK>oDUSfGg`-j)p5N&*mmw*fX%oIaK;I!?U7 z0TTNQBYX#tj9g^{3~;u$rAy@1vJlh*-R?+%J`3XMUX_?^Lb=uMT4;H4goRen{saPg zn^TiQ`SO&h4_1i2S&*r6}msm(?j?_jR`h? zy%R-g>**OE=86b1|Ljfi%gLEH(=8XTQt2rCDuCuql~Cp#Fj7CH_T+ zz43ma*$Hkwfs1llEQ9Lf$`7az-?9xhW-o!Veya_16pj}P%vAu5NTK|keHl;Q8faUn z>>NH9KZTK<#R~fi9l`vny9iAJGrZ!*v-CoE14MzgC1nzHK7(mgvGp1UE z@U->E7cf)fkOY&D6$UD#@hP(LWL3fxhDDf|w2xm4oFJ-F)nd0da8o%`m%1SqKrsHc zM*vw%X>G(ZGL;yap<{0cJLnoYK$O4BtuK9zTcIy`LH1ZBOfS2p6cHI$?aRm0Y6e=M zNmbF@p@>@!{~}H~7rp_a%K;Xk|M<$6zo3Y}d)z7RExVgw2*A^X8j4ijDijF#Op`yv4D3ONvDl z?)QJN*_SXz+kEuQWgUax+x$rl*g>!^1zlZE7z8$f3NAhbn3oA!aFIV+P#Uy8=)d3o zkSeeUFqErfApY`WW-@9}Z)?A^Qt}QuI}TFYd;zd$Q{nSxm?1(3#yg1FS%qC=ai+JI zdwmsZgv;%&z$vJ6H{?(ZDzn-_?i`o+(yAN)lcuy%KS1VK>eK@9u;6igTQreDk9mSX zB$3qxC>@)3^;Yo+!#>BnTSEfJB|?u8Zpp8H0$b8!He4RJq_Dc6?ni?m`w+=suXK;@ z;Wz|ysbDPTlPnfuYaRmAOd{`L)OTQ29>NZ;OTOUO2?bmlNB3n&lTO9*x+&g+ol?mq z9sEMQokJ29ocvPxz>2UjJ5pSYJ@hD6>!@|b>RVaS-m8|TExSFc!R&$k0bV5(gL?n? z(Zso-?IbKPjBVX(ujU>IK~JoXv_{1A{;2rQGhOSxnTGUl)*qoXzcJRI)Io)M(ixYi zqh^F8yaM}A(sek(;JW*7{-Irq3$RzcQ*jI+9tIize2x56V?Vw4%@ATSM^$#VS+$(N zsYKxTHS_hE+8{T;iqMr3O}Ly^lU#vEcFqAhSf{Q#anqi-t^!ee5~~nEQ~)x9s2BJo z?_|~@4dUK+9;)=>5V{_q1JshWft6xMWX%I$WHd&ao>4ah&14j(;x4S{5hSr*C&X5F zxki{?zXEeBzL00D%nGKdD>FNtWbXyF^F)1~Ar+&@-TnK{Q%yAafObsm#tH6O@J9A( zyBsP|vJ64;>Kd!9&gnjg>AjI843YXp{Xhj#?)8Pdk&)8JDf9BhW-lSPNRm`XR>(35 ztxhr@0g<`5=yLJp7LAd8ZH@21U%+D)IB!mowGTXQoF3ZO=F$p^&MIKvEx&RB6bCu7 zb$nI7e>g)WIb0xgIrt znBCd2nVnox{qPU4xA~`=+nOZKEJ;5Iu_ALmjU-B00iuqD4}$Nh#{aC=71*zmBI@0m zvgh|j#cb3g=1w(lJ9=k`qpAQVxAEp!*!NY+y!(2WIOhy5wm6`75*I_Id`_3L(iw30 zZy%VSDIjYvjU>Bkj2llCyCJjyzh4VC9Zr%s*8x7x7rsaMyn&V_15cX7{LazcSG>T@ z))Z{LNNan*)O?kMkBM^}E{TO38tPRrL2?k>>+003ym+2)8}rtieL78gocqh`C}q-z zFl=V@Dn#w~nT&3|yQF)}7o}@&&%*%6*eA7N(KED$18b9=S&T079ychJx&h?7Lp*62 zB2XKV96!iAp27cN`4iAaI5ESeTNHU80?JbzknX5p=*h;U3G(b3R;K5|M(<*>Bc*!4 zLcd#b!U6lytw89pHLI0X>5R3Es?OO>M)S$to7&dpG{}=FC~rPYZF1&k3Z@vs zLz$g1k40s+a`?Z?Y)fqg^7Bu?r9*d|)gg*?BI^v#dw&I0^06n-7jMmUpZ=8kNjm(s zEW6S;M^Fbe2vm=)go@Skz3aGVEy8agu#JpIx<7RB4*ih;w?GV6-&Q z>tb!Vc3w>z2&T4J?tUwyKRTE;KdQ_w#top=zIUMviKe)Vq+u2WjZHsb^2hcE|8U zbHxa>p5dv_XMr_aGP$iuj2fCKL55pYM zR#o~0D(o8Ix65$S3g@NU_m<1({D=sym(Z(M+GLE}*#nY>2h^W`UPiw;B!fUiKG+xZ zv}{uzwpRMiW#wcV@#h!N->HFNIC>A|uCDgkLwGgtdqsbTeEuYREU0PgQ$IY)hQFuq zW7~x_6Xn*6;|^5L|6(xr>;VSz;-|ZGwdmnr-=V^+M+QdydUjCPGMQr2kfwAa`n((1 zFb>kt%)e8l$v~{l$z?X+Z}0L)+<;6#7mM@2MNu32?1hbGa<4!NQo=qALNj#`0X4f) zg~|UN&4&sQXQl@iRmF|+ofE*BNj&%y@`p0ibw>}l!`UK=HV|Yop(dIDUpRee_g{}t zxCVwkDkw9w1=gCz#c*WeMn}I7{Ikmk?+8wv2EMpNCp0lD9!yFA1q?@};|q_8Sjg%n zB>zRbrG{>L&es8^Z5b~&uON8UDzP;X8gpUOWPo2w38$gzECy&UXJM?hbNH2PR4p^0 zLAK>UK)%9pvE@MqFi9@Px?Bwe>6*jw2B^N{89>DVDkZ;PnZxG$1iv}pR+Y{3dt;H7 z>t^XYHCeqsGR<+iE;!AwoX>xNQRG&`7(so_dn`xKy3O`s@{+c}FR|akq~w5v2jJ~s zi^hKCA^%L2zx7k;L((z*!#Hsu{-FN35NA*f6@zlAIVL8V`PVDm+_quCh#Yqz>-2~x z(k`hurPO*ig#G5Dv~kQKlUyXiM;15r{Q{t8!Q+7acm@dV?co?N*iaE z;&Rm$#d>(J(!h!zQ962B_3x*w`=9v%UAbv$4^V9r1PDGHnpIGf)*?ll|t-7o*)P60%u@A zXI_F!G6(^joZmCsYoDgO4=8Q~i{s`k`Ts;2czQiT&53%(xOq?NrGuS;!P*D3a?;}y zfk^T|mEjHL!Ry#Q@6-YfygaR_oV0qm!Bfyl^Dt$NIbsiQmx+6l0088N| zFv+OQox+Tq@{toCl20J^je27=HbxT_Mz(-7gGRGB_JDy^F$mewk_t0S5TS$2qECVQ Zr~cIPe%b7g7e6xqfv2mV%Q~loCICKJ&$s{p literal 0 HcmV?d00001 diff --git a/0.3/img/h-data-yield.html b/0.3/img/h-data-yield.html new file mode 100644 index 00000000..082b5513 --- /dev/null +++ b/0.3/img/h-data-yield.html @@ -0,0 +1,39 @@ +

+ + + +
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/0.3/img/h-data-yield.png b/0.3/img/h-data-yield.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fcced07ac20b0c6225316c7ab87d27f3bc9197 GIT binary patch literal 37780 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 literal 0 HcmV?d00001 diff --git a/0.3/img/hm-data-yield-participants.html b/0.3/img/hm-data-yield-participants.html new file mode 100644 index 00000000..bbb00c75 --- /dev/null +++ b/0.3/img/hm-data-yield-participants.html @@ -0,0 +1,191 @@ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/0.3/img/hm-data-yield-participants.png b/0.3/img/hm-data-yield-participants.png new file mode 100644 index 0000000000000000000000000000000000000000..6778c870cc60bea1bd3b8f45e37c11546aa370b4 GIT binary patch literal 46634 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� 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 literal 0 HcmV?d00001 diff --git a/0.3/img/hm-feature-correlations.html b/0.3/img/hm-feature-correlations.html new file mode 100644 index 00000000..99e596fb --- /dev/null +++ b/0.3/img/hm-feature-correlations.html @@ -0,0 +1,96 @@ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/0.3/img/hm-feature-correlations.png b/0.3/img/hm-feature-correlations.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e60e46e973ceb2af07eada8d836297f0c2af31 GIT binary patch literal 295093 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
  • 4Z?{^i~aUOh#L=aHP&pCZ(A5 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 L6c0V7eDD7NS81K= literal 0 HcmV?d00001 diff --git a/0.3/img/hm-phone-sensors.html b/0.3/img/hm-phone-sensors.html new file mode 100644 index 00000000..b8b3c2e0 --- /dev/null +++ b/0.3/img/hm-phone-sensors.html @@ -0,0 +1,627 @@ + + + + + + + + + + + + + + +Sensors per Minute per Time Segment for All Participants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + + +
    + + + + + + + + + + + + + + + diff --git a/0.3/img/hm-phone-sensors.png b/0.3/img/hm-phone-sensors.png new file mode 100644 index 0000000000000000000000000000000000000000..d53905c3edbff5a162c85763a6caf79409ee2160 GIT binary patch literal 59705 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 Ja|N?&{|`Wc8_56w literal 0 HcmV?d00001 diff --git a/0.3/img/hm-sensor_rows.html b/0.3/img/hm-sensor_rows.html new file mode 100644 index 00000000..f739577e --- /dev/null +++ b/0.3/img/hm-sensor_rows.html @@ -0,0 +1,627 @@ + + + + + + + + + + + + + + +Sensor Row Count per Time Segment For All Participants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + + +
    + + + + + + + + + + + + + + + diff --git a/0.3/img/hm-sensor_rows.png b/0.3/img/hm-sensor_rows.png new file mode 100644 index 0000000000000000000000000000000000000000..9857f0a49d7e9a64308f4a2a323dcc5222e7b0bb GIT binary patch literal 54662 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

    |8b4&nIiYE#wdlS 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 literal 0 HcmV?d00001 diff --git a/0.3/index.html b/0.3/index.html new file mode 100644 index 00000000..8d2c536d --- /dev/null +++ b/0.3/index.html @@ -0,0 +1,1254 @@ + + + + + + + + + + + + + + + + + + + + + + + RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    Welcome to RAPIDS documentation

    +

    Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows.

    +

    RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices.

    +
    +

    Tip

    +

    Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack.

    +

    Bugs and feature requests should be posted on Github.

    +

    Join our discussions on our algorithms and assumptions for feature processing.

    +

    Ready to start? Go to Installation, then to Configuration, and then to Execution

    +

    Are you upgrading from RAPIDS beta? Follow this guide

    +
    +

    How does it work?

    +

    RAPIDS is formed by R and Python scripts orchestrated by Snakemake. We suggest you read Snakemake’s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.

    +

    What are the benefits of using RAPIDS?

    +
      +
    1. Consistent analysis. Every participant sensor dataset is analyzed in the exact same way and isolated from each other.
    2. +
    3. Efficient analysis. Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated.
    4. +
    5. Parallel execution. Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code.
    6. +
    7. Code-free features. Extract any of the behavioral features offered by RAPIDS without writing any code.
    8. +
    9. Extensible code. You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations.
    10. +
    11. Timezone aware. Your data is adjusted to the specified timezone (multiple timezones suport coming soon).
    12. +
    13. Flexible time segments. You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses).
    14. +
    15. Tested code. We are constantly adding tests to make sure our behavioral features are correct.
    16. +
    17. Reproducible code. If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead.
    18. +
    19. Private. All your data is processed locally.
    20. +
    +

    How is it organized?

    +

    In broad terms the config.yaml, .env file, participants files, and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/. For more information see RAPIDS’ File Structure.

    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/javascripts/extra.js b/0.3/javascripts/extra.js new file mode 100644 index 00000000..b6d5686d --- /dev/null +++ b/0.3/javascripts/extra.js @@ -0,0 +1,14 @@ +window.addEventListener("DOMContentLoaded", function() { + var xhr = new XMLHttpRequest(); + xhr.open("GET", window.location.origin + "/versions.json"); + xhr.onload = function() { + var versions = JSON.parse(this.responseText); + latest_version = "" + for(id in versions) + if(versions[id]["aliases"].length > 0 && versions[id]["aliases"].includes("latest")) + latest_version = "/" + versions[id].version + "/" + if(!window.location.pathname.includes("/latest/") && (latest_version.length > 0 && !window.location.pathname.includes(latest_version))) + document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are seeing the docs for a previous version of RAPIDS, click here to go to the latest
    " + }; + xhr.send(); + }); diff --git a/0.3/migrating-from-old-versions/index.html b/0.3/migrating-from-old-versions/index.html new file mode 100644 index 00000000..b8968377 --- /dev/null +++ b/0.3/migrating-from-old-versions/index.html @@ -0,0 +1,1192 @@ + + + + + + + + + + + + + + + + + + + + + + + Migrating from beta - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    Migrating from RAPIDS beta

    +

    If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS.

    +

    You can start using the new RAPIDS (we are starting with v0.1.0) right away, just take into account the following:

    +
      +
    1. Install a new copy of RAPIDS (the R and Python virtual environments didn’t change so the cached versions will be reused)
        +
      1. Make sure you don’t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids
      2. +
      +
    2. +
    3. Follow the new Configuration guide.
        +
      1. You can copy and paste your old .env file
      2. +
      3. You can migrate your old participant files: +
        python tools/update_format_participant_files.py
        +
      4. +
      +
    4. +
    5. Get familiar with the new way of Executing RAPIDS
    6. +
    7. You can proceed to reconfigure your config.yaml, its structure is more consistent and should be familiar to you.
    8. +
    +
    +

    Info

    +

    If you have any questions reach out to us on Slack.

    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/search/search_index.json b/0.3/search/search_index.json new file mode 100644 index 00000000..6ea7075f --- /dev/null +++ b/0.3/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows. RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Tip Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack . Bugs and feature requests should be posted on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution Are you upgrading from RAPIDS beta ? Follow this guide How does it work? \u00b6 RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant. What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally. How is it organized? \u00b6 In broad terms the config.yaml , .env file , participants files , and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows. RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Tip Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack . Bugs and feature requests should be posted on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution Are you upgrading from RAPIDS beta ? Follow this guide","title":"Welcome to RAPIDS documentation"},{"location":"#how-does-it-work","text":"RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.","title":"How does it work?"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#how-is-it-organized","text":"In broad terms the config.yaml , .env file , participants files , and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"How is it organized?"},{"location":"change-log/","text":"Change Log \u00b6 0.3.0 \u00b6 Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README v0.2.6 \u00b6 Fix old versions banner on nested pages v0.2.5 \u00b6 Fix docs deploy typo v0.2.4 \u00b6 Fix broken links in landing page and docs deploy v0.2.3 \u00b6 Fix participant IDS in the example analysis workflow v0.2.2 \u00b6 Fix readme link to docs v0.2.1 \u00b6 FIx link to the most recent version in the old version banner v0.2.0 \u00b6 Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item v0.1.0 \u00b6 New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"Change Log"},{"location":"change-log/#change-log","text":"","title":"Change Log"},{"location":"change-log/#030","text":"Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README","title":"0.3.0"},{"location":"change-log/#v026","text":"Fix old versions banner on nested pages","title":"v0.2.6"},{"location":"change-log/#v025","text":"Fix docs deploy typo","title":"v0.2.5"},{"location":"change-log/#v024","text":"Fix broken links in landing page and docs deploy","title":"v0.2.4"},{"location":"change-log/#v023","text":"Fix participant IDS in the example analysis workflow","title":"v0.2.3"},{"location":"change-log/#v022","text":"Fix readme link to docs","title":"v0.2.2"},{"location":"change-log/#v021","text":"FIx link to the most recent version in the old version banner","title":"v0.2.1"},{"location":"change-log/#v020","text":"Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item","title":"v0.2.0"},{"location":"change-log/#v010","text":"New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"v0.1.0"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Doryab (bluetooth) \u00b6 If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#doryab-bluetooth","text":"If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394","title":"Doryab (bluetooth)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"faq/","text":"Frequently Asked Questions \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda Embedded nul in string \u00b6 Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: If it\u2019s only a few rows that are causing this problem, remove the the null character from the conflictive table cell. If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Liunx: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL) In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"FAQ"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"faq/#embedded-nul-in-string","text":"Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: If it\u2019s only a few rows that are causing this problem, remove the the null character from the conflictive table cell. If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Liunx: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL) In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"Embedded nul in string"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"migrating-from-old-versions/","text":"Migrating from RAPIDS beta \u00b6 If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the new RAPIDS (we are starting with v0.1.0 ) right away, just take into account the following: Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Follow the new Configuration guide. You can copy and paste your old .env file You can migrate your old participant files: python tools/update_format_participant_files.py Get familiar with the new way of Executing RAPIDS You can proceed to reconfigure your config.yaml , its structure is more consistent and should be familiar to you. Info If you have any questions reach out to us on Slack .","title":"Migrating from beta"},{"location":"migrating-from-old-versions/#migrating-from-rapids-beta","text":"If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the new RAPIDS (we are starting with v0.1.0 ) right away, just take into account the following: Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Follow the new Configuration guide. You can copy and paste your old .env file You can migrate your old participant files: python tools/update_format_participant_files.py Get familiar with the new way of Executing RAPIDS You can proceed to reconfigure your config.yaml , its structure is more consistent and should be familiar to you. Info If you have any questions reach out to us on Slack .","title":"Migrating from RAPIDS beta"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/git-flow/","text":"Git Flow \u00b6 We use the develop/master variation of the OneFlow git flow Add New Features \u00b6 We use feature (topic) branches to implement new features Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Integrate your new feature to develop Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. git checkout feature/feature1 git fetch origin develop git rebase -i develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Push your feature branch online git push --set-upstream origin feature/external-test Then open a pull request to the develop branch using Github\u2019s GUI Release a New Version \u00b6 Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log) Release a Hotfix \u00b6 Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Git Flow"},{"location":"developers/git-flow/#git-flow","text":"We use the develop/master variation of the OneFlow git flow","title":"Git Flow"},{"location":"developers/git-flow/#add-new-features","text":"We use feature (topic) branches to implement new features Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Integrate your new feature to develop Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. git checkout feature/feature1 git fetch origin develop git rebase -i develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Push your feature branch online git push --set-upstream origin feature/external-test Then open a pull request to the develop branch using Github\u2019s GUI","title":"Add New Features"},{"location":"developers/git-flow/#release-a-new-version","text":"Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log)","title":"Release a New Version"},{"location":"developers/git-flow/#release-a-hotfix","text":"Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Release a Hotfix"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Python Virtual Environment \u00b6 Add new packages \u00b6 Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ). Remove packages \u00b6 Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME Updating all packages \u00b6 Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all Update your conda environment.yaml \u00b6 After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml R Virtual Environment \u00b6 Add new packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\") Remove packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\") Updating all packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update() Update your R renv.lock \u00b6 After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Virtual Environments"},{"location":"developers/virtual-environments/#python-virtual-environment","text":"","title":"Python Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ).","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages","text":"Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages","text":"Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#r-virtual-environment","text":"","title":"R Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\")","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\")","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update()","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-r-renvlock","text":"After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Update your R renv.lock"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider DORYAB provider \u00b6 This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/#doryab-provider","text":"This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"DORYAB provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"visualizations/data-quality-visualizations/","text":"Data Quality Visualizations \u00b6 We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.) 1. Histograms of phone data yield \u00b6 RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night) 2. Heatmaps of overall data yield \u00b6 These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants 3. Heatmap of recorded phone sensors \u00b6 In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 8 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant 4. Heatmap of sensor row count \u00b6 These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 16 phone sensors (including data yield) of t01\u2019s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"Data Quality"},{"location":"visualizations/data-quality-visualizations/#data-quality-visualizations","text":"We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.)","title":"Data Quality Visualizations"},{"location":"visualizations/data-quality-visualizations/#1-histograms-of-phone-data-yield","text":"RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night)","title":"1. Histograms of phone data yield"},{"location":"visualizations/data-quality-visualizations/#2-heatmaps-of-overall-data-yield","text":"These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants","title":"2. Heatmaps of overall data yield"},{"location":"visualizations/data-quality-visualizations/#3-heatmap-of-recorded-phone-sensors","text":"In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 8 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant","title":"3. Heatmap of recorded phone sensors"},{"location":"visualizations/data-quality-visualizations/#4-heatmap-of-sensor-row-count","text":"These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 16 phone sensors (including data yield) of t01\u2019s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"4. Heatmap of sensor row count"},{"location":"visualizations/feature-visualizations/","text":"Feature Visualizations \u00b6 1. Heatmap Correlation Matrix \u00b6 Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"Features"},{"location":"visualizations/feature-visualizations/#feature-visualizations","text":"","title":"Feature Visualizations"},{"location":"visualizations/feature-visualizations/#1-heatmap-correlation-matrix","text":"Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"1. Heatmap Correlation Matrix"},{"location":"workflow-examples/analysis/","text":"Analysis Workflow Example \u00b6 TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers Why should I integrate my analysis in RAPIDS? \u00b6 Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS. Analysis workflow structure \u00b6 To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules . Description of the study modeled in our analysis workflow example \u00b6 Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation Configure and run the analysis workflow example \u00b6 Install RAPIDS Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The config file where you need to modify the DATABASE_GROUP is at example_profile/example_config.yaml . Unzip the test database to data/external/rapids_example.sql and run: ./rapids -j1 restore_sql_file --profile example_profile Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Modules of our analysis workflow example \u00b6 1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Analysis"},{"location":"workflow-examples/analysis/#analysis-workflow-example","text":"TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers","title":"Analysis Workflow Example"},{"location":"workflow-examples/analysis/#why-should-i-integrate-my-analysis-in-rapids","text":"Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS.","title":"Why should I integrate my analysis in RAPIDS?"},{"location":"workflow-examples/analysis/#analysis-workflow-structure","text":"To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules .","title":"Analysis workflow structure"},{"location":"workflow-examples/analysis/#description-of-the-study-modeled-in-our-analysis-workflow-example","text":"Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation","title":"Description of the study modeled in our analysis workflow example"},{"location":"workflow-examples/analysis/#configure-and-run-the-analysis-workflow-example","text":"Install RAPIDS Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The config file where you need to modify the DATABASE_GROUP is at example_profile/example_config.yaml . Unzip the test database to data/external/rapids_example.sql and run: ./rapids -j1 restore_sql_file --profile example_profile Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile","title":"Configure and run the analysis workflow example"},{"location":"workflow-examples/analysis/#modules-of-our-analysis-workflow-example","text":"1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Modules of our analysis workflow example"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file diff --git a/0.3/setup/configuration/index.html b/0.3/setup/configuration/index.html new file mode 100644 index 00000000..b618ab59 --- /dev/null +++ b/0.3/setup/configuration/index.html @@ -0,0 +1,1930 @@ + + + + + + + + + + + + + + + + + + + + + + + Configuration - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + +
    +
    + + + + + + + +

    Configuration

    +

    You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features

    +
      +
    1. Add your database credentials
    2. +
    3. Choose the timezone of your study
    4. +
    5. Create your participants files
    6. +
    7. Select what time segments you want to extract features on
    8. +
    9. Modify your device data source configuration
    10. +
    11. Select what sensors and features you want to process
    12. +
    +

    When you are done with this configuration, go to executing RAPIDS.

    +
    +

    Hint

    +

    Every time you see config["KEY"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.

    +
    +
    +

    Database credentials

    +
      +
    1. Create an empty file called .env in your RAPIDS root directory
    2. +
    3. Add the following lines and replace your database-specific credentials (user, password, host, and database):
    4. +
    +
    [MY_GROUP]
    +user=MY_USER
    +password=MY_PASSWORD
    +host=MY_HOST
    +port=3306
    +database=MY_DATABASE
    +
    +
    +

    Warning

    +

    The label MY_GROUP is arbitrary but it has to match the following config.yaml key:

    +
    DATABASE_GROUP: &database_group
    +  MY_GROUP
    +
    +
    +
    +

    Note

    +

    You can ignore this step if you are only processing Fitbit data in CSV files.

    +
    +
    +

    Timezone of your study

    +

    Single timezone

    +

    If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST

    +
    TIMEZONE: &timezone
    +  America/New_York
    +
    +

    Multiple timezones

    +

    Support coming soon.

    +
    +

    Participant files

    +

    Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically. Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure.

    +
    +

    Note

    +

    The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml, p02.yaml and p03.yaml files in /data/external/participant_files/, then PIDS should be: +

    PIDS: [p01, p02, p03] 
    +

    +
    +
    +

    Tip

    +

    Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both.

    +
    +
    Optional: Migrating participants files with the old format

    If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/

    +
    python tools/update_format_participant_files.py
    +
    +
    +

    Structure of participants files

    +
    +

    Example of the structure of a participant file

    +

    In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23rd 2020 and Oct 28th 2020

    +
    PHONE:
    +  DEVICE_IDS: [a748ee1a-1d0b-4ae9-9074-279a2b6ba524, dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43]
    +  PLATFORMS: [android,ios]
    +  LABEL: test01
    +  START_DATE: 2020-04-23
    +  END_DATE: 2020-10-28
    +FITBIT:
    +  DEVICE_IDS: [fitbit1]
    +  LABEL: test01
    +  START_DATE: 2020-04-23
    +  END_DATE: 2020-10-28
    +
    +
    +

    For [PHONE]

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Key                     Description
    [DEVICE_IDS]An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list.
    [PLATFORMS]An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically.
    [LABEL]A string that is used in reports and visualizations.
    [START_DATE]A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis
    [END_DATE]A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis
    +

    For [FITBIT]

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Key                     Description
    [DEVICE_IDS]An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list.
    [LABEL]A string that is used in reports and visualizations.
    [START_DATE]A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis
    [END_DATE]A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis
    +

    Automatic creation of participant files

    +

    You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml, set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS].

    +
    +

    Set the following keys in your config.yaml

    +
    CREATE_PARTICIPANT_FILES:
    +  SOURCE:
    +    TYPE: AWARE_DEVICE_TABLE
    +    DATABASE_GROUP: *database_group
    +    CSV_FILE_PATH: ""
    +    TIMEZONE: *timezone
    +  PHONE_SECTION:
    +    ADD: TRUE # or FALSE
    +    DEVICE_ID_COLUMN: device_id # column name
    +    IGNORED_DEVICE_IDS: []
    +  FITBIT_SECTION:
    +    ADD: TRUE # or FALSE
    +    DEVICE_ID_COLUMN: fitbit_id # column name
    +    IGNORED_DEVICE_IDS: []
    +
    +

    Then run

    +
    snakemake -j1 create_participants_files
    +
    +
    +
    +

    Set the following keys in your config.yaml.

    +

    CREATE_PARTICIPANT_FILES:
    +  SOURCE:
    +    TYPE: CSV_FILE
    +    DATABASE_GROUP: ""
    +    CSV_FILE_PATH: "your_path/to_your.csv"
    +    TIMEZONE: *timezone
    +  PHONE_SECTION:
    +    ADD: TRUE # or FALSE
    +    DEVICE_ID_COLUMN: device_id # column name
    +    IGNORED_DEVICE_IDS: []
    +  FITBIT_SECTION:
    +    ADD: TRUE # or FALSE
    +    DEVICE_ID_COLUMN: fitbit_id # column name
    +    IGNORED_DEVICE_IDS: []
    +
    +Your CSV file ([SOURCE][CSV_FILE_PATH]) should have the following columns but you can omit any values you don’t have on each column:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ColumnDescription
    phone device idThe name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN]. Separate multiple ids with ;
    fitbit device idThe name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN]. Separate multiple ids with ;
    pidUnique identifiers with the format pXXX (your participant files will be named with this string
    platformUse android, ios or multiple as explained above, separate values with ;
    labelA human readable string that is used in reports and visualizations.
    start_dateA string with format YYY-MM-DD.
    end_dateA string with format YYY-MM-DD.
    +
    +

    Example

    +
    device_id,pid,label,platform,start_date,end_date,fitbit_id
    +a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1
    +4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2
    +
    +
    +

    Then run

    +
    snakemake -j1 create_participants_files
    +
    +
    +
    +
    +

    Time Segments

    +

    Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples.

    +
    +

    These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml

    +
    TIME_SEGMENTS: &time_segments
    +  TYPE: FREQUENCY
    +  FILE: "data/external/your_frequency_segments.csv"
    +  INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE
    +
    +

    The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row.

    + + + + + + + + + + + + + + + + + +
    ColumnDescription
    labelA string that is used as a prefix in the name of your time segments
    lengthAn integer representing the duration of your time segments in minutes
    +
    +

    Example

    +
    label,length
    +thirtyminutes,30
    +
    +

    This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example:

    +
    start_time,length,label
    +00:00,30,thirtyminutes0000
    +00:30,30,thirtyminutes0001
    +01:00,30,thirtyminutes0002
    +01:30,30,thirtyminutes0003
    +...
    +
    +
    +
    +
    +

    These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml.

    +
    TIME_SEGMENTS: &time_segments
    +  TYPE: PERIODIC
    +  FILE: "data/external/your_periodic_segments.csv"
    +  INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # or TRUE
    +
    +

    If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE, RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8th if FALSE.

    +

    The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ColumnDescription
    labelA string that is used as a prefix in the name of your time segments. It has to be unique between rows
    start_timeA string with format HH:MM:SS representing the starting time of this segment on any day
    lengthA string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S
    repeats_onOne of the follow options every_day, wday, qday, mday, and yday. The last four represent a week, quarter, month and year day
    repeats_valueAn integer complementing repeats_on. If you set repeats_on to every_day set this to 0, otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday, 1-91 represent a qday, and 1-366 represent a yday
    +
    +

    Example

    +
    label,start_time,length,repeats_on,repeats_value
    +daily,00:00:00,23H 59M 59S,every_day,0
    +morning,06:00:00,5H 59M 59S,every_day,0
    +afternoon,12:00:00,5H 59M 59S,every_day,0
    +evening,18:00:00,5H 59M 59S,every_day,0
    +night,00:00:00,5H 59M 59S,every_day,0
    +
    +

    This configuration will create five segments instances (daily, morning, afternoon, evening, night) on any given day (every_day set to 0). The daily segment will start at midnight and will last 23:59:59, the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59.

    +
    +
    +
    +

    These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml.

    +
    TIME_SEGMENTS: &time_segments
    +  TYPE: EVENT
    +  FILE: "data/external/your_event_segments.csv"
    +  INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # or TRUE
    +
    +

    The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ColumnDescription
    labelA string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error)
    event_timestampA UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length, shift, and shift_direction
    lengthA string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S
    shiftA string representing the time shift from event_timestamp. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S. Use this value to change the start of a segment with respect to its event_timestamp. For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest (shift_direction determines if it’s before or after).
    shift_directionAn integer representing whether the shift is before (-1) or after (1) an event_timestamp
    device_idThe device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them
    +
    +

    Example

    +
    label,event_timestamp,length,shift,shift_direction,device_id
    +stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +
    +

    This example will create eight segments for a single participant (a748ee1a...), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1, stress3, and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15th at 1pm EST (1584291600000), the time segment will start on that day at 9am and end at 4pm).

    +

    The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.

    +
    +
    +
    +

    Segment Examples

    +
    +

    Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study +

    label,length
    +fiveminutes,5
    +

    +
    +
    +

    Use the following Periodic segment file to create daily segments starting from midnight of every day in your study +

    label,start_time,length,repeats_on,repeats_value
    +daily,00:00:00,23H 59M 59S,every_day,0
    +

    +
    +
    +

    Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study +

    label,start_time,length,repeats_on,repeats_value
    +morning,06:00:00,5H 59M 59S,every_day,0
    +

    +
    +
    +

    Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study +

    label,start_time,length,repeats_on,repeats_value
    +morning,20:00:00,11H 59M 59S,every_day,0
    +

    +
    +
    +

    Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study +

    label,start_time,length,repeats_on,repeats_value
    +weekly,00:00:00,6D 23H 59M 59S,wday,1
    +
    +Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study +
    label,start_time,length,repeats_on,repeats_value
    +weekly,00:00:00,6D 23H 59M 59S,every_day,0
    +

    +
    +
    +

    Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study +

    label,start_time,length,repeats_on,repeats_value
    +weekend,00:00:00,1D 23H 59M 59S,wday,6
    +

    +
    +
    +

    Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants +

    label,event_timestamp,length,shift,shift_direction,device_id
    +survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524
    +survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr
    +survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr
    +survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3
    +survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3
    +

    +
    +
    +
    +

    Device Data Source Configuration

    +

    You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices.

    +
    +

    The relevant config.yaml section looks like this by default:

    +
    PHONE_DATA_CONFIGURATION:
    +  SOURCE: 
    +    TYPE: DATABASE
    +    DATABASE_GROUP: *database_group
    +    DEVICE_ID_COLUMN: device_id # column name
    +  TIMEZONE: 
    +    TYPE: SINGLE # SINGLE (MULTIPLE support coming soon)
    +    VALUE: *timezone
    +
    +

    Parameters for [PHONE_DATA_CONFIGURATION]

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KeyDescription
    [SOURCE] [TYPE]Only DATABASE is supported (phone data will be pulled from a database)
    [SOURCE] [DATABASE_GROUP]*database_group points to the value defined before in Database credentials
    [SOURCE] [DEVICE_ID_COLUMN]A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id
    [TIMEZONE] [TYPE]Only SINGLE is supported for now
    [TIMEZONE] [VALUE]*timezone points to the value defined before in Timezone of your study
    +
    +
    +

    The relevant config.yaml section looks like this by default:

    +
    FITBIT_DATA_CONFIGURATION:
    +  SOURCE: 
    +    TYPE: DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly)
    +    COLUMN_FORMAT: JSON # JSON or PLAIN_TEXT
    +    DATABASE_GROUP: *database_group
    +    DEVICE_ID_COLUMN: device_id # column name
    +  TIMEZONE: 
    +    TYPE: SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE 
    +    VALUE: *timezone
    +
    +

    Parameters for For [FITBIT_DATA_CONFIGURATION]

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KeyDescription
    [SOURCE] [TYPE]DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path)
    [SOURCE] [COLUMN_FORMAT]JSON or PLAIN_TEXT. Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format
    [SOURCE] [DATABASE_GROUP]*database_group points to the value defined before in Database credentials. Only used if [TYPE] is DATABASE .
    [SOURCE] [DEVICE_ID_COLUMN]A column that contains strings that uniquely identify Fitbit devices.
    [TIMEZONE] [TYPE]Only SINGLE is supported (Fitbit devices always store data in local time).
    [TIMEZONE] [VALUE]*timezone points to the value defined before in Timezone of your study
    +
    +
    +
    +

    Sensor and Features to Process

    +

    Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature (DEVICE_SENSOR) and parameter structure which we explain in the Behavioral Features Introduction.

    +
    +

    Done

    +

    Head over to Execution to learn how to execute RAPIDS.

    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/setup/execution/index.html b/0.3/setup/execution/index.html new file mode 100644 index 00000000..c1bc0321 --- /dev/null +++ b/0.3/setup/execution/index.html @@ -0,0 +1,1204 @@ + + + + + + + + + + + + + + + + + + + + + + + Execution - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    Execution

    +

    After you have installed and configured RAPIDS, use the following command to execute it.

    +
    ./rapids -j1
    +
    +
    +

    Ready to extract behavioral features

    +

    If you are ready to extract features head over to the Behavioral Features Introduction

    +
    +
    +

    Info

    +

    The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1).

    +
    +
    +

    Updating RAPIDS output after modifying config.yaml

    +

    Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features.

    +
    +
    +

    Multi-core

    +

    You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However, take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again.

    +

    As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer).

    +
    +
    +

    Forcing a complete rerun

    +

    If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using:

    +
    ./rapids -j1 -R download_phone_data
    +./rapids -j1 -R download_fitbit_data
    +
    +
    +
    +

    Deleting RAPIDS output

    +

    If you want to delete all the output files RAPIDS produces you can execute the following command:

    +
    ./rapids -j1 --delete-all-output
    +
    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/setup/installation/index.html b/0.3/setup/installation/index.html new file mode 100644 index 00000000..003e5f5f --- /dev/null +++ b/0.3/setup/installation/index.html @@ -0,0 +1,1372 @@ + + + + + + + + + + + + + + + + + + + + + + + Installation - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    Installation

    +

    You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu

    +
    +
      +
    1. +

      Install Docker

      +
    2. +
    3. +

      Pull our RAPIDS container +

      docker pull agamk/rapids:latest`
      +

      +
    4. +
    5. +

      Run RAPIDS' container (after this step is done you should see a + prompt in the main RAPIDS folder with its python environment active)

      +
      docker run -it agamk/rapids:latest
      +
      +
    6. +
    7. +

      Pull the latest version of RAPIDS

      +
      git pull
      +
      +
    8. +
    9. +

      Make RAPIDS script executable +

      chmod +x rapids
      +

      +
    10. +
    11. +

      Check that RAPIDS is working +

      ./rapids -j1
      +

      +
    12. +
    13. +

      Optional. You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension

      +
      How to configure Remote Containers extension
        +
      • Make sure RAPIDS container is running
          +
        • Install the Remote - Containers extension
        • +
        • Go to the Remote Explorer panel on the left hand sidebar
        • +
        • On the top right dropdown menu choose Containers
        • +
        • Double click on the agamk/rapids container in theCONTAINERS tree
        • +
        • A new VS Code session should open on RAPIDS main folder insidethe container.
        • +
        +
      • +
      +
      +
    14. +
    +
    +
    +

    We tested these instructions in Catalina

    +
      +
    1. +

      Install brew

      +
    2. +
    3. +

      Install MySQL

      +
      brew install mysql
      +brew services start mysql
      +
      +
    4. +
    5. +

      Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them

      +
      brew install r
      +brew install pandoc
      +Rscript --vanilla -e 'install.packages("rmarkdown", repos="http://cran.us.r-project.org")'
      +
      +
    6. +
    7. +

      Install miniconda (restart your terminal afterwards)

      +
      brew cask install miniconda
      +conda init zsh # (or conda init bash)
      +
      +
    8. +
    9. +

      Clone our repo

      +
      git clone https://github.com/carissalow/rapids
      +
      +
    10. +
    11. +

      Create a python virtual environment

      +
      cd rapids
      +conda env create -f environment.yml -n rapids
      +conda activate rapids
      +
      +
    12. +
    13. +

      Install R packages and virtual environment:

      +
      snakemake -j1 renv_install
      +snakemake -j1 renv_restore
      +
      +
      +

      Note

      This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion.

      +

      +
      +
    14. +
    15. +

      Make RAPIDS script executable +

      chmod +x rapids
      +

      +
    16. +
    17. +

      Check that RAPIDS is working +

      ./rapids -j1
      +

      +
    18. +
    +
    +
    +

    We tested on Ubuntu 18.04 & 20.04

    +
      +
    1. +

      Install dependencies

      +
      sudo apt install libcurl4-openssl-dev
      +sudo apt install libssl-dev
      +sudo apt install libxml2-dev
      +
      +
    2. +
    3. +

      Install MySQL

      +
      sudo apt install libmysqlclient-dev
      +sudo apt install mysql-server
      +
      +
    4. +
    5. +

      Add key for R’s repository.

      +
      sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
      +
      +
    6. +
    7. +

      Add R’s repository

      +
        +
      1. +

        For 18.04
        +

        sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/'
        +

        +
      2. +
      3. +

        For 20.04 +

        sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/'
        +

        +
      4. +
      +
    8. +
    9. +

      Install R 4.0. If you have other instances of R, we recommend uninstalling them

      +
      sudo apt update
      +sudo apt install r-base
      +
      +
    10. +
    11. +

      Install Pandoc and rmarkdown

      +
      sudo apt install pandoc
      +Rscript --vanilla -e 'install.packages("rmarkdown", repos="http://cran.us.r-project.org")'
      +
      +
    12. +
    13. +

      Install git

      +
      sudo apt install git
      +
      +
    14. +
    15. +

      Install miniconda

      +
    16. +
    17. +

      Restart your current shell

      +
    18. +
    19. +

      Clone our repo:

      +
      git clone https://github.com/carissalow/rapids
      +
      +
    20. +
    21. +

      Create a python virtual environment:

      +
      cd rapids
      +conda env create -f environment.yml -n MY_ENV_NAME
      +conda activate MY_ENV_NAME
      +
      +
    22. +
    23. +

      Install R packages and virtual environment:

      +
      snakemake -j1 renv_install
      +snakemake -j1 renv_restore
      +
      +
      +

      Note

      This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion.

      +

      +
      +
    24. +
    25. +

      Make RAPIDS script executable +

      chmod +x rapids
      +

      +
    26. +
    27. +

      Check that RAPIDS is working +

      ./rapids -j1
      +

      +
    28. +
    +
    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/sitemap.xml b/0.3/sitemap.xml new file mode 100644 index 00000000..4968cdd6 --- /dev/null +++ b/0.3/sitemap.xml @@ -0,0 +1,171 @@ + + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + None + 2020-12-20 + daily + + \ No newline at end of file diff --git a/0.3/sitemap.xml.gz b/0.3/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..5e2d4921956f1131a600e2a6bb02c2b0839610ff GIT binary patch literal 216 zcmV;}04M(+iwFo{;NM>Y|8r?{Wo=<_E_iKh0PW4O4uUWg1<;+ZXu3m7CpD#Pj!yak zq*Ne*7I{_l?*)U2qaSd)w7u`X99=$#o;}<|UGN3ZGs&6rHq@PO3Vt~s(;Y8OqVH2r zF0!TUso-sl<3Wgdo-^vA8>*4AFg1c~yL?D&p^(|0n|0SDY(2UU)|`TOTCA^cSWz58 zZIo0p%~h)8GTySSV%y3$?mD@fsjIGkY4MYMI$Ep@ELgB$!GZ+~7A#n>V8Ma~3l^;Z St>kl&i{=dtql9ZE5&!`D$YqTH literal 0 HcmV?d00001 diff --git a/0.3/stylesheets/extra.css b/0.3/stylesheets/extra.css new file mode 100644 index 00000000..83eba024 --- /dev/null +++ b/0.3/stylesheets/extra.css @@ -0,0 +1,28 @@ +@media screen and (min-width: 76.25em) { + .md-nav__item--section { + display: block; + margin: 1.75em 0; + } + + .md-nav :not(.md-nav--primary) > .md-nav__list { + padding-left: 7px; + } +} +.md-nav__item .md-nav__link--active { + color: var(--md-typeset-a-color); + background-color: var(--md-code-bg-color); +} + +div[data-md-component=announce] { + background-color: rgba(255,145,0,.1); +} +div[data-md-component=announce]>div#announce-msg{ + color: var(--md-admonition-fg-color); + font-size: .8rem; + text-align: center; + margin: 15px; +} +div[data-md-component=announce]>div#announce-msg>a{ + color: var(--md-typeset-a-color); + text-decoration: underline; +} \ No newline at end of file diff --git a/0.3/team/index.html b/0.3/team/index.html new file mode 100644 index 00000000..0c2e8850 --- /dev/null +++ b/0.3/team/index.html @@ -0,0 +1,1498 @@ + + + + + + + + + + + + + + + + + + + + + + + Team - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    RAPIDS Team

    +

    If you are interested in contributing feel free to submit a pull request or contact us.

    +

    Core Team

    +

    Julio Vega (Designer and Lead Developer)

    +
    About

    Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data.

    + +
    +

    Meng Li

    +
    About

    Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field.

    + +
    +

    Abhineeth Reddy Kunta

    +
    About

    Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master’s degree in Computer Science from George Mason University.

    +
    +

    Kwesi Aguillera

    +
    About

    Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis.

    + +
    +

    Echhit Joshi

    +
    About

    Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics.

    + +
    +

    Nicolas Leo

    +
    About

    Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.

    +
    +

    Nikunj Goel

    +
    About

    Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning.

    + +
    +

    Community Contributors

    +

    Agam Kumar

    +
    About

    Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine.

    + +
    +

    Yasaman S. Sefidgar

    +
    About +
    +

    Advisors

    +

    Afsaneh Doryab

    +
    About +
    +

    Carissa Low

    +
    About +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/visualizations/data-quality-visualizations/index.html b/0.3/visualizations/data-quality-visualizations/index.html new file mode 100644 index 00000000..6270bc47 --- /dev/null +++ b/0.3/visualizations/data-quality-visualizations/index.html @@ -0,0 +1,1312 @@ + + + + + + + + + + + + + + + + + + + + + + + Data Quality - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + +
    +
    + + + + + + + +

    Data Quality Visualizations

    +

    We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night).

    +
    +

    Note

    +

    Time segments (e.g. daily, morning, etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.)

    +
    +

    1. Histograms of phone data yield

    +

    RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours, respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes.

    +

    These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes.

    +
    +

    Example

    +

    Click here to see an example of these interactive visualizations in HTML format

    +
    +
    + +
    Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night)
    +
    + +

    2. Heatmaps of overall data yield

    +

    These heatmaps are a break down per time segment and per participant of Visualization 1. Heatmap’s rows represent participants, columns represent time segment instances and the cells’ color represent the valid yielded minute or hour ratio for a participant during a time segment instance.

    +

    As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment.

    +

    The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones).

    +
    +

    Example

    +

    Click here to see an example of these interactive visualizations in HTML format

    +
    +
    + +
    Overall compliance heatmap for all participants
    +
    + +

    3. Heatmap of recorded phone sensors

    +

    In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells’ color shows the number of phone sensors that logged at least one row of data during those 1-minute windows.

    +

    RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes).

    +

    The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23rd 2020 to May 4th 2020. We can infer that for most of the monitoring time, the participant’s phone logged data from at least 8 sensors each minute.

    +
    +

    Example

    +

    Click here to see an example of these interactive visualizations in HTML format

    +
    +
    + +
    Heatmap of the recorded phone sensors per minute and per time segment of a single participant
    +
    + +

    4. Heatmap of sensor row count

    +

    These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2. Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2.

    +

    In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell’s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis.

    +

    The figure below shows data for 16 phone sensors (including data yield) of t01’s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23rd), peaks of location coordinates on Apr 26th and Apr 30th, and no sent or received SMS except for Apr 23rd, Apr 29th and Apr 30th (unlabeled row between screen and locations).

    +
    +

    Example

    +

    Click here to see an example of these interactive visualizations in HTML format

    +
    +
    + +
    Heatmap of the sensor row count per time segment of a single participant
    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/visualizations/feature-visualizations/index.html b/0.3/visualizations/feature-visualizations/index.html new file mode 100644 index 00000000..7961a0fb --- /dev/null +++ b/0.3/visualizations/feature-visualizations/index.html @@ -0,0 +1,1226 @@ + + + + + + + + + + + + + + + + + + + + + + + Features - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    Feature Visualizations

    +

    1. Heatmap Correlation Matrix

    +

    Columns and rows are the behavioral features computed in RAPIDS, cells’ color represents the correlation coefficient between all days of data for every pair of features of all participants.

    +

    The user can specify a minimum number of observations (time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default).

    +
    +

    Example

    +

    Click here to see an example of these interactive visualizations in HTML format

    +
    +
    + +
    Correlation matrix heatmap for all the features of all participants
    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/workflow-examples/analysis/index.html b/0.3/workflow-examples/analysis/index.html new file mode 100644 index 00000000..4c706cb8 --- /dev/null +++ b/0.3/workflow-examples/analysis/index.html @@ -0,0 +1,1342 @@ + + + + + + + + + + + + + + + + + + + + + + + Analysis - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + +
    +
    + + + + + + + +

    Analysis Workflow Example

    +
    +

    TL;DR

    +
      +
    • In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models)
    • +
    • We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation
    • +
    • Use this example as a guide to structure your own analysis within RAPIDS
    • +
    • RAPIDS analysis workflows are compatible with your favorite data science tools and libraries
    • +
    • RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers
    • +
    +
    +

    Why should I integrate my analysis in RAPIDS?

    +

    Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS.

    +

    We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is.

    +

    In the following sections we share an example of how we structured an analysis workflow in RAPIDS.

    +

    Analysis workflow structure

    +

    To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step).

    +

    Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern.

    +
    +

    Hint

    +

    The example’s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile. The config file is already configured to process the sensor data as explained in Analysis workflow modules.

    +
    +

    Description of the study modeled in our analysis workflow example

    +

    Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score.

    +

    The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model.

    +

    In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository.

    +
    + +
    Modules of RAPIDS example workflow, from raw data to model evaluation
    +
    + +

    Configure and run the analysis workflow example

    +
      +
    1. Install RAPIDS
    2. +
    3. Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The config file where you need to modify the DATABASE_GROUP is at example_profile/example_config.yaml.
    4. +
    5. Unzip the test database to data/external/rapids_example.sql and run: +
      ./rapids -j1 restore_sql_file --profile example_profile
      +
    6. +
    7. Create the participant files for this example by running: +
      ./rapids -j1 create_example_participant_files
      +
    8. +
    9. Run the example pipeline with: +
      ./rapids -j1 --profile example_profile
      +
    10. +
    +

    Modules of our analysis workflow example

    +
    1. Feature extraction

    We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant.

    +
    +
    2. Extract demographic data.

    It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants’ age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk.

    +
    +
    3. Create target labels.

    The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk.

    +
    +
    4. Feature merging.

    These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk.

    +
    +
    5. Data visualization.

    At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots.

    +
    +
    6. Feature cleaning.

    In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml.

    +

    After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones.

    +

    Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk.

    +
    +
    7. Merge features and targets.

    In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk. Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk. These two merged files are the input for our individual and population models.

    +
    +
    8. Modelling.

    This stage has three phases: model building, training and evaluation.

    +

    In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package’s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml.

    +

    In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml.

    +

    Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle.

    +

    Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk.

    +
    +
    9. Compute model baselines.

    We create three baselines to evaluate our classification models.

    +

    First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model.

    +

    Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk.

    +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.3/workflow-examples/minimal/index.html b/0.3/workflow-examples/minimal/index.html new file mode 100644 index 00000000..d5902fd0 --- /dev/null +++ b/0.3/workflow-examples/minimal/index.html @@ -0,0 +1,1245 @@ + + + + + + + + + + + + + + + + + + + + + + + Minimal - RAPIDS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + +

    Minimal Working Example

    +

    This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast.

    +
      +
    1. Install RAPIDS and make sure your conda environment is active (see Installation)
    2. +
    3. +

      Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done)

      +
      Things to change on each configuration step

      1. Setup your database connection credentials in .env. We assume your credentials group is called MY_GROUP.

      +

      2. America/New_York should be the default timezone

      +

      3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml. The following would be the content of your p01.yaml participant file: +

      PHONE:
      +    DEVICE_IDS: [aaaaaaaa-1111-bbbb-2222-cccccccccccc] # your participant's AWARE device id
      +    PLATFORMS: [android] # or ios
      +    LABEL: MyTestP01 # any string
      +    START_DATE: 2020-01-01 # this can also be empty
      +    END_DATE: 2021-01-01 # this can also be empty
      +

      +

      4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC. Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: +

      label,start_time,length,repeats_on,repeats_value
      +daily,00:00:00,23H 59M 59S,every_day,0
      +night,00:00:00,5H 59M 59S,every_day,0
      +

      +

      5. If you collected data with AWARE you won’t need to modify the attributes of [DEVICE_DATA][PHONE]

      +

      6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True

      +
      +
      Example of the config.yaml sections after the changes outlined above
      PIDS: [p01]
      +
      +TIMEZONE: &timezone
      +America/New_York
      +
      +DATABASE_GROUP: &database_group
      +MY_GROUP
      +
      +# ... other irrelevant sections
      +
      +TIME_SEGMENTS: &time_segments
      +    TYPE: PERIODIC
      +    FILE: "data/external/timesegments_periodic.csv" # make sure the three lines specified above are in the file
      +    INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE
      +
      +# No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env`
      +DEVICE_DATA:
      +    PHONE:
      +        SOURCE: 
      +            TYPE: DATABASE
      +            DATABASE_GROUP: *database_group
      +            DEVICE_ID_COLUMN: device_id # column name
      +        TIMEZONE: 
      +            TYPE: SINGLE # SINGLE or MULTIPLE
      +            VALUE: *timezone 
      +
      +
      +############## PHONE ###########################################################
      +################################################################################
      +
      +# ... other irrelevant sections
      +
      +# Communication call features config, TYPES and FEATURES keys need to match
      +PHONE_CALLS:
      +    TABLE: calls # change if your calls table has a different name
      +    PROVIDERS:
      +        RAPIDS:
      +            COMPUTE: True # set this to True!
      +            CALL_TYPES: ...
      +
      +
      +
    4. +
    5. +

      Run RAPIDS +

      ./rapids -j1
      +

      +
    6. +
    7. The call features for daily and morning time segments will be in +
      /data/processed/features/p01/phone_calls.csv
      +
    8. +
    + + + + + + + +
    +
    +
    +
    + + + + +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/latest/404.html b/latest/404.html index a68a9c8f..45ee5e14 100644 --- a/latest/404.html +++ b/latest/404.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -69,6 +76,8 @@ + +
    - - + + diff --git a/latest/assets/javascripts/bundle.d371fdb2.min.js b/latest/assets/javascripts/bundle.d371fdb2.min.js deleted file mode 100644 index 48ceea7d..00000000 --- a/latest/assets/javascripts/bundle.d371fdb2.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){for(var c in t)e[c]=t[c]}(window,function(e){function t(t){for(var a,o,i=t[0],s=t[1],b=t[2],p=0,l=[];pObject(o.a)(new H.a(e=>{for(const t of e)q.next(t)}))).pipe(Object(f.a)(e=>Object(p.a)(Object(o.a)(e),b.a).pipe(Object(U.a)(()=>e.disconnect()))),Object(l.a)({bufferSize:1,refCount:!0}));function W(e){return I.pipe(Object(g.a)(t=>t.observe(e)),Object(f.a)(t=>q.pipe(Object($.a)(({target:t})=>t===e),Object(U.a)(()=>t.unobserve(e)),Object(j.a)(({contentRect:e})=>({width:e.width,height:e.height})))),Object(R.a)(function(e){return{width:e.offsetWidth,height:e.offsetHeight}}(e)))}var D=c(73);var F=c(60);function J(e,t=location){return e.host===t.host&&/^(?:\/[\w-]+)*(?:\/?|\.html)$/i.test(e.pathname)}function Y(e,t=location){return e.pathname===t.pathname&&e.hash.length>0}function K(){return new F.a(new URL(location.href))}function B(){return location.hash.substring(1)}function Q(e){const t=M("a");t.href=e,t.addEventListener("click",e=>e.stopPropagation()),t.click()}var X=c(5);function V(e){const t=matchMedia(e);return new X.a(e=>{t.addListener(t=>e.next(t.matches))}).pipe(Object(R.a)(t.matches),Object(l.a)({bufferSize:1,refCount:!0}))}const G={drawer:T("[data-md-toggle=drawer]"),search:T("[data-md-toggle=search]")};function Z(e,t){G[e].checked!==t&&G[e].click()}function ee(e){const t=G[e];return Object(i.a)(t,"change").pipe(Object(j.a)(()=>t.checked),Object(R.a)(t.checked))}function te(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function ce({x:e,y:t}){window.scrollTo(e||0,t||0)}function ae(){return{width:innerWidth,height:innerHeight}}function ne(e,{header$:t,viewport$:c}){const a=c.pipe(Object(x.a)("size")),n=Object(r.a)([a,t]).pipe(Object(j.a)(()=>({x:e.offsetLeft,y:e.offsetTop})));return Object(r.a)([t,c,n]).pipe(Object(j.a)(([{height:e},{offset:t,size:c},{x:a,y:n}])=>({offset:{x:t.x-a,y:t.y-n+e},size:c})))}var re=c(62),oe=c(63);var ie=c(12),se=c(76);let be;function ue(e){return be.pipe(Object(f.a)(t=>void 0!==t[e]?Object(o.a)(t[e]):ie.a),Object(O.a)())}var pe=c(27),le=c(65);function fe({document$:e,viewport$:t}){return Object(pe.a)(Object(f.a)(c=>{const a=function(e,{document$:t}){return t.pipe(Object(j.a)(()=>{const t=getComputedStyle(e);return["sticky","-webkit-sticky"].includes(t.position)}),Object(O.a)(),Object(f.a)(t=>t?W(e).pipe(Object(j.a)(({height:e})=>({sticky:!0,height:e}))):Object(o.a)({sticky:!1,height:0})),Object(l.a)({bufferSize:1,refCount:!0}))}(c,{document$:e}),n=ue("main").pipe(Object(j.a)(e=>E("h1, h2, h3, h4, h5, h6",e)),Object($.a)(e=>void 0!==e),Object(le.a)(ue("header-title")),Object(f.a)(([e,c])=>ne(e,{header$:a,viewport$:t}).pipe(Object(j.a)(({offset:{y:t}})=>t>=e.offsetHeight?"page":"site"),Object(O.a)(),function(e){return Object(pe.a)(Object(h.a)(u.a),Object(g.a)(t=>{!function(e,t){e.setAttribute("data-md-state",t?"active":"")}(e,"page"===t)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(e)}))}(c))),Object(R.a)("site"));return Object(r.a)([a,n]).pipe(Object(j.a)(([e,t])=>Object.assign({type:t},e)))}))}var de=c(10);function he({header$:e,viewport$:t}){const c=new N.a;return ue("header").pipe(Object(f.a)(e=>{return c.pipe(Object(x.a)("active"),(t=e,Object(pe.a)(Object(h.a)(u.a),Object(g.a)(({active:e})=>{!function(e,t){e.setAttribute("data-md-state",t?"shadow":"")}(t,e)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(t)}))));var t})).subscribe(de.a),Object(pe.a)(Object(f.a)(c=>function(e,{header$:t,viewport$:c}){const a=t.pipe(Object(j.a)(({height:e})=>e),Object(O.a)()),n=a.pipe(Object(f.a)(()=>W(e).pipe(Object(j.a)(({height:t})=>({top:e.offsetTop,bottom:e.offsetTop+t})),Object(x.a)("bottom"))));return Object(r.a)([a,n,c]).pipe(Object(j.a)(([e,{top:t,bottom:c},{offset:{y:a},size:{height:n}}])=>({offset:t-e,height:n=Math.max(0,n-Math.max(0,t-a,e)-Math.max(0,n+a-c)),active:t-e<=a})),Object(O.a)((e,t)=>e.offset===t.offset&&e.height===t.height&&e.active===t.active))}(c,{header$:e,viewport$:t})),Object(g.a)(e=>c.next(e)),Object(U.a)(()=>c.complete()))}function je(e){e.style.top=""}function Oe(e,{main$:t,viewport$:c}){const a=e.parentElement.offsetTop-e.parentElement.parentElement.offsetTop;return Object(r.a)([t,c]).pipe(Object(j.a)(([{offset:e,height:t},{offset:{y:c}}])=>({height:t=t+Math.min(a,Math.max(0,c-e))-a,lock:c>=e+a})),Object(O.a)((e,t)=>e.height===t.height&&e.lock===t.lock))}function me(e,{header$:t}){return Object(pe.a)(Object(h.a)(u.a),Object(d.a)(t),Object(g.a)(([{height:t,lock:c},{height:a}])=>{!function(e,t){const c=e.firstElementChild;c.style.height=t-2*c.offsetTop+"px"}(e,t),c?function(e,t){e.style.top=t+"px"}(e,a):je(e)}),Object(j.a)(([e])=>e),Object(U.a)(()=>{je(e),function(e){e.firstElementChild.style.height=""}(e)}))}var ge=c(67);c(43);function ve(e){const t=new RegExp(e.separator,"img"),c=(e,t,c)=>`${t}${c}`;return a=>{a=a.replace(/[\s*+\-:~^]+/g," ").trim();const n=new RegExp(`(^|${e.separator})(${a.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(t,"|")})`,"img");return e=>e.replace(n,c).replace(/<\/mark>(\s+)]*>/gim,"$1")}}function $e(e){return e.split(/"([^"]+)"/g).map((e,t)=>1&t?e.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):e).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}function ye(e,t){if("string"==typeof t||"number"==typeof t)e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(const c of t)ye(e,c)}function we(e,t,...c){const a=document.createElement(e);if(t)for(const e of Object.keys(t))"boolean"!=typeof t[e]?a.setAttribute(e,t[e]):t[e]&&a.setAttribute(e,"");for(const e of c)ye(a,e);return a}let xe;function Se(e,t){if(void 0===xe){const e=T("#__lang");xe=JSON.parse(e.textContent)}if(void 0===xe[e])throw new ReferenceError("Invalid translation: "+e);return void 0!==t?xe[e].replace("#",t.toString()):xe[e]}function _e(e){if(e>999){return((e+1e-6)/1e3).toFixed(+((e-950)%1e3>99))+"k"}return e.toString()}var ke;function Ee(e){return e.type===ke.READY}function Te(e){return e.type===ke.QUERY}function Ae(e){return e.type===ke.RESULT}function Ce({config:e,docs:t,index:c,options:a}){1===e.lang.length&&"en"===e.lang[0]&&(e.lang=[Se("search.config.lang")]),"[\\s\\-]+"===e.separator&&(e.separator=Se("search.config.separator"));const n=Se("search.config.pipeline").split(/\s*,\s*/).filter(Boolean);return{config:e,docs:t,index:c,options:Object.assign(Object.assign({},a),{pipeline:n,suggestions:!0})}}function Me(e,{index$:t,base$:c}){const a=new Worker(e),n=new N.a,r=function(e,{tx$:t}){const c=Object(i.a)(e,"message").pipe(Object(j.a)(({data:e})=>e));return t.pipe(Object(re.a)(()=>c,{leading:!0,trailing:!0}),Object(g.a)(t=>e.postMessage(t)),Object(oe.a)(c),Object(D.a)())}(a,{tx$:n}).pipe(Object(d.a)(c),Object(j.a)(([e,t])=>{if(Ae(e))for(const c of e.data.items)for(const e of c)e.location=`${t}/${e.location}`;return e}),Object(D.a)());return t.pipe(Object(j.a)(e=>({type:ke.SETUP,data:Ce(e)})),Object(h.a)(s.b)).subscribe(n.next.bind(n)),{tx$:n,rx$:r}}!function(e){e[e.SETUP=0]="SETUP",e[e.READY=1]="READY",e[e.QUERY=2]="QUERY",e[e.RESULT=3]="RESULT"}(ke||(ke={}));var Le,Re=c(36);function Pe(e,t){const c=t&Le.PARENT,a=t&Le.TEASER,n=Object.keys(e.terms).filter(t=>!e.terms[t]).map(e=>[we("del",null,e)," "]).flat().slice(0,-1),r=new URL(e.location);r.searchParams.append("h",Object.entries(e.terms).reduce((e,[t,c])=>`${e} ${c?t:""}`,"").replace(/%20/g,"+"));return we("a",{href:""+r,class:"md-search-result__link",tabIndex:-1},we("article",{class:["md-search-result__article",...c?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},c>0&&we("div",{class:"md-search-result__icon md-icon"}),we("h1",{class:"md-search-result__title"},e.title),a>0&&e.text.length>0&&we("p",{class:"md-search-result__teaser"},function(e,t){let c=t;if(e.length>c){for(;" "!==e[c]&&--c>0;);return e.substring(0,c)+"..."}return e}(e.text,320)),a>0&&n.length>0&&we("p",{class:"md-search-result__terms"},Se("search.result.term.missing"),": ",n)))}function ze(e,t=1/0){const c=[...e],a=c.findIndex(e=>!e.location.includes("#")),[n]=c.splice(a,1);let r=c.findIndex(e=>e.scorePe(e,Le.TEASER)),...i.length?[we("details",{class:"md-search-result__more"},we("summary",{tabIndex:-1},i.length>0&&1===i.length?Se("search.result.more.one"):Se("search.result.more.other",i.length)),i.map(e=>Pe(e,Le.TEASER)))]:[]];return we("li",{class:"md-search-result__item"},s)}function He(e){return we("ul",{class:"md-source__facts"},e.map(e=>we("li",{class:"md-source__fact"},e)))}function Ne({document$:e,dialog$:t}){if(!Re.isSupported())return b.a;e.subscribe(()=>{C("pre > code").forEach((e,t)=>{const c=e.parentElement;var a;c.id="__code_"+t,c.insertBefore((a=c.id,we("button",{class:"md-clipboard md-icon",title:Se("clipboard.copy"),"data-clipboard-target":`#${a} > code`})),e)})});const c=new X.a(e=>{new Re(".md-clipboard").on("success",t=>e.next(t))}).pipe(Object(D.a)());return c.pipe(Object(g.a)(e=>e.clearSelection()),Object(S.a)(Se("clipboard.copied"))).subscribe(t),c}!function(e){e[e.TEASER=1]="TEASER",e[e.PARENT=2]="PARENT"}(Le||(Le={}));var Ue=c(68),qe=c(77);function Ie(e,{document$:t,viewport$:c,location$:a}){"scrollRestoration"in history&&(history.scrollRestoration="manual"),Object(i.a)(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"});const r=E('link[rel="shortcut icon"]');void 0!==r&&(r.href=r.href);const s=Object(i.a)(document.body,"click").pipe(Object($.a)(e=>!(e.metaKey||e.ctrlKey)),Object(f.a)(t=>{if(t.target instanceof HTMLElement){const c=t.target.closest("a");if(c&&!c.target&&J(c)&&e.includes(c.href))return Y(c)||t.preventDefault(),Object(o.a)(c)}return b.a}),Object(j.a)(e=>({url:new URL(e.href)})),Object(D.a)());s.subscribe(()=>{Z("search",!1)});const u=s.pipe(Object($.a)(({url:e})=>!Y(e)),Object(D.a)()),l=Object(i.a)(window,"popstate").pipe(Object($.a)(e=>null!==e.state),Object(j.a)(e=>({url:new URL(location.href),offset:e.state})),Object(D.a)());Object(p.a)(u,l).pipe(Object(O.a)((e,t)=>e.url.href===t.url.href),Object(j.a)(({url:e})=>e)).subscribe(a);const d=a.pipe(Object(x.a)("pathname"),Object(Ue.a)(1),Object(f.a)(e=>Object(n.a)(fetch(e.href,{credentials:"same-origin"}).then(e=>e.text())).pipe(Object(m.a)(()=>(function(e){location.href=e.href}(e),b.a)))),Object(D.a)());u.pipe(Object(ge.a)(d)).subscribe(({url:e})=>{history.pushState({},"",e.toString())});const h=new DOMParser;d.pipe(Object(j.a)(e=>h.parseFromString(e,"text/html"))).subscribe(t);Object(p.a)(u,l).pipe(Object(ge.a)(t)).subscribe(({url:e,offset:t})=>{e.hash&&!t?Q(e.hash):ce(t||{y:0})}),t.pipe(Object(Ue.a)(1)).subscribe(({title:e,head:t})=>{document.title=e;for(const e of['link[rel="canonical"]','meta[name="author"]','meta[name="description"]']){const c=E(e,t),a=E(e,document.head);void 0!==c&&void 0!==a&&L(a,c)}document.dispatchEvent(new CustomEvent("DOMContentSwitch"))}),c.pipe(Object(qe.a)(250),Object(x.a)("offset")).subscribe(({offset:e})=>{history.replaceState(e,"")}),Object(p.a)(s,l).pipe(Object(w.a)(2,1),Object($.a)(([e,t])=>e.url.pathname===t.url.pathname&&!Y(t.url)),Object(j.a)(([,e])=>e)).subscribe(({offset:e})=>{ce(e||{y:0})})}function We(){const e=Object(i.a)(window,"keydown").pipe(Object($.a)(e=>!(e.metaKey||e.ctrlKey)),Object(j.a)(e=>({type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),Object(D.a)()).pipe(Object(j.a)(e=>{return Object.assign({mode:(t="search",G[t].checked?"search":"global")},e);var t}),Object($.a)(({mode:e})=>{if("global"===e){const e=A();if(void 0!==e)return!function(e){switch(e.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return!0;default:return e.isContentEditable}}(e)}return!0}),Object(D.a)());return e.pipe(Object($.a)(({mode:e})=>"search"===e),Object(d.a)(ue("search-query"),ue("search-result"),ue("search-suggest"))).subscribe(([e,t,c,a])=>{const n=A();switch(e.type){case"Enter":if(n===t){const t=new Map;for(const e of C(":first-child [href]",c)){const c=e.firstElementChild;t.set(e,parseFloat(c.getAttribute("data-md-score")))}if(t.size){const[[e]]=[...t].sort(([,e],[,t])=>t-e);e.click()}e.claim()}break;case"Escape":case"Tab":Z("search",!1),P(t,!1);break;case"ArrowUp":case"ArrowDown":if(void 0===n)P(t);else{const a=[t,...C(":not(details) > [href], summary, details[open] [href]",c)],r=Math.max(0,(Math.max(0,a.indexOf(n))+a.length+("ArrowUp"===e.type?-1:1))%a.length);P(a[r])}e.claim();break;case"ArrowRight":a.innerText.length&&t.selectionStart===t.value.length&&(t.value=a.innerText);break;default:t!==A()&&P(t)}}),e.pipe(Object($.a)(({mode:e})=>"global"===e),Object(d.a)(ue("search-query"))).subscribe(([e,t])=>{switch(e.type){case"f":case"s":case"/":P(t),function(e){if(!(e instanceof HTMLInputElement))throw new Error("Not implemented");e.select()}(t),e.claim();break;case"p":case",":const c=E("[href][rel=prev]");void 0!==c&&c.click();break;case"n":case".":const a=E("[href][rel=next]");void 0!==a&&a.click()}}),e}function De(e){e.placeholder=Se("search.placeholder")}function Fe(e,{transform:t}={}){const c=t||$e,a=Object(p.a)(Object(i.a)(e,"keyup"),Object(i.a)(e,"focus").pipe(Object(v.a)(1))).pipe(Object(j.a)(()=>c(e.value)),Object(R.a)(c(e.value)),Object(O.a)()),n=function(e){return Object(p.a)(Object(i.a)(e,"focus"),Object(i.a)(e,"blur")).pipe(Object(j.a)(({type:e})=>"focus"===e),Object(R.a)(e===A()))}(e);return Object(r.a)([a,n]).pipe(Object(j.a)(([e,t])=>({value:e,focus:t})))}function Je({tx$:e},t={}){return Object(pe.a)(Object(f.a)(c=>{const a=Fe(c,t);return a.pipe(Object(x.a)("value"),Object(j.a)(({value:e})=>({type:ke.QUERY,data:e}))).subscribe(e.next.bind(e)),a.pipe(Object(x.a)("focus")).subscribe(({focus:e})=>{e&&Z("search",e)}),a.pipe(function(e){return Object(pe.a)(Object(g.a)(({focus:t})=>{t?function(e,t){e.placeholder=t}(e,""):De(e)}),Object(U.a)(()=>{De(e)}))}(c))}))}function Ye(){return Object(pe.a)(Object(f.a)(e=>function(e){return Object(i.a)(e,"click").pipe(Object(S.a)(void 0))}(e).pipe(Object(oe.a)(ue("search-query")),Object(g.a)(P),Object(S.a)(void 0))),Object(R.a)(void 0))}function Ke(e,t){e.appendChild(t)}function Be(e,{query$:t,fetch$:c}){const a=T(".md-search-result__list",e),n=T(".md-search-result__meta",e);return Object(pe.a)(Object(d.a)(t),Object(j.a)(([e,t])=>{const{items:c}=e;return t.value?function(e,t){switch(t){case 0:e.textContent=Se("search.result.none");break;case 1:e.textContent=Se("search.result.one");break;default:e.textContent=Se("search.result.other",t)}}(n,c.length):function(e){e.textContent=Se("search.result.placeholder")}(n),e}),Object(f.a)(t=>{const{items:n}=t,r=[...n.map(([e])=>e.score),0];return c.pipe(Object(h.a)(u.a),Object(se.a)(t=>{const c=e.parentElement;for(;t16)););return t},0),Object(S.a)(t),Object(U.a)(()=>{!function(e){e.innerHTML=""}(a)}))}))}function Qe({rx$:e},{query$:t}){return Object(pe.a)(Object(f.a)(c=>{const a=c.parentElement,n=function(e){return Object(p.a)(Object(i.a)(e,"scroll"),Object(i.a)(window,"resize")).pipe(Object(j.a)(()=>z(e)),Object(R.a)(z(e)))}(a).pipe(Object(j.a)(({y:e})=>e>=a.scrollHeight-a.offsetHeight-16),Object(O.a)(),Object($.a)(Boolean));return e.pipe(Object($.a)(Ae),Object(j.a)(({data:e})=>e),Be(c,{query$:t,fetch$:n}))}))}function Xe({header$:e,viewport$:t,screen$:c}){return Object(pe.a)(Object(f.a)(a=>c.pipe(Object(f.a)(c=>c?ne(a,{header$:e,viewport$:t}).pipe(Object(j.a)(({offset:{y:e}})=>({hidden:e>=10})),Object(x.a)("hidden"),function(e){return Object(pe.a)(Object(h.a)(u.a),Object(g.a)(({hidden:t})=>{!function(e,t){e.setAttribute("data-md-state",t?"hidden":"")}(e,t)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(e)}))}(a)):Object(o.a)({hidden:!0})))))}function Ve(e){e.removeAttribute("data-md-state")}function Ge(e){e.classList.remove("md-nav__link--active")}function Ze({header$:e,main$:t,viewport$:c,tablet$:a}){return Object(pe.a)(Object(f.a)(n=>a.pipe(Object(f.a)(a=>{if(a){const a=C(".md-nav__link",n),o=Oe(n,{main$:t,viewport$:c}).pipe(me(n,{header$:e})),i=function(e,{header$:t,viewport$:c}){const a=new Map;for(const t of e){const e=E(`[id="${decodeURIComponent(t.hash.substring(1))}"]`);void 0!==e&&a.set(t,e)}const n=t.pipe(Object(j.a)(e=>18+e.height));return W(document.body).pipe(Object(x.a)("height"),Object(j.a)(()=>{let e=[];return[...a].reduce((t,[c,n])=>{for(;e.length;){if(!(a.get(e[e.length-1]).tagName>=n.tagName))break;e.pop()}let r=n.offsetTop;for(;!r&&n.parentElement;)r=(n=n.parentElement).offsetTop;return t.set([...e=[...e,c]].reverse(),r)},new Map)}),Object(f.a)(e=>Object(r.a)([n,c]).pipe(Object(se.a)(([e,t],[c,{offset:{y:a}}])=>{for(;t.length;){const[,n]=t[0];if(!(n-c=a))break;t=[e.pop(),...t]}return[e,t]},[[],[...e]]),Object(O.a)((e,t)=>e[0]===t[0]&&e[1]===t[1])))).pipe(Object(j.a)(([e,t])=>({prev:e.map(([e])=>e),next:t.map(([e])=>e)})),Object(R.a)({prev:[],next:[]}),Object(w.a)(2,1),Object(j.a)(([e,t])=>e.prev.length{for(const[e]of t)Ge(e),Ve(e);e.forEach(([t],c)=>{!function(e,t){e.classList.toggle("md-nav__link--active",t)}(t,c===e.length-1),function(e,t){e.setAttribute("data-md-state",t?"blur":"")}(t,!0)})}),Object(U.a)(()=>{for(const t of e)Ge(t),Ve(t)}))}(a));return Object(r.a)([o,i]).pipe(Object(j.a)(([e,t])=>({sidebar:e,anchors:t})))}return Object(o.a)({})}))))}var et=c(71);var tt=c(72);function ct(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function at(e){const[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":const[,t,c]=e.match(/^.+github\.com\/([^\/]+)\/?([^\/]+)?/i);return function(e,t){const c=void 0!==t?`https://api.github.com/repos/${e}/${t}`:"https://api.github.com/users/"+e;return Object(n.a)(fetch(c).then(e=>e.json())).pipe(Object(j.a)(e=>{if(void 0!==t){const{stargazers_count:t,forks_count:c}=e;return[_e(t||0)+" Stars",_e(c||0)+" Forks"]}{const{public_repos:t}=e;return[_e(t||0)+" Repositories"]}}))}(t,c);case"gitlab":const[,a,r]=e.match(/^.+?([^\/]*gitlab[^\/]+)\/(.+?)\/?$/i);return function(e,t){const c=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Object(n.a)(fetch(c).then(e=>e.json())).pipe(Object(j.a)(({star_count:e,forks_count:t})=>[_e(e)+" Stars",_e(t)+" Forks"]))}(a,r);default:return b.a}}function nt({document$:e}){e.pipe(Object(j.a)(()=>T(".md-source[href]")),Object(f.a)(({href:e})=>{return t=""+function(e){let t=0;for(let c=0,a=e.length;cat(e),Object(a.a)(()=>{const e=sessionStorage.getItem(t);if(e)return Object(o.a)(JSON.parse(e));{const e=c();return e.subscribe(e=>{try{sessionStorage.setItem(t,JSON.stringify(e))}catch(e){}}),e}});var t,c}),Object(m.a)(()=>b.a)).subscribe(e=>{for(const t of C(".md-source__repository"))t.hasAttribute("data-md-state")||(t.setAttribute("data-md-state","done"),t.appendChild(He(e)))})}function rt(e,t){e.setAttribute("data-md-state","lock"),e.style.top=`-${t}px`}function ot(e){const t=-1*parseInt(e.style.top,10);e.removeAttribute("data-md-state"),e.style.top="",t&&window.scrollTo(0,t)}function it(e){if(!function(e){return"object"==typeof e&&"string"==typeof e.base&&"object"==typeof e.features&&"object"==typeof e.search}(e))throw new SyntaxError("Invalid configuration: "+JSON.stringify(e));const t=function(){const e=new k.a;return Object(i.a)(document,"DOMContentLoaded").pipe(Object(S.a)(document)).subscribe(e),e}(),c=K(),T=function(e,{location$:t}){return t.pipe(Object(y.a)(1),Object(j.a)(({href:t})=>new URL(e,t).toString().replace(/\/$/,"")),Object(l.a)({bufferSize:1,refCount:!0}))}(e.base,{location$:c}),A=Object(i.a)(window,"hashchange").pipe(Object(j.a)(B),Object(R.a)(B()),Object($.a)(e=>e.length>0),Object(D.a)()),P=Object(r.a)([Object(p.a)(Object(i.a)(window,"scroll",{passive:!0}),Object(i.a)(window,"resize",{passive:!0})).pipe(Object(j.a)(te),Object(R.a)(te())),Object(i.a)(window,"resize",{passive:!0}).pipe(Object(j.a)(ae),Object(R.a)(ae()))]).pipe(Object(j.a)(([e,t])=>({offset:e,size:t})),Object(l.a)({bufferSize:1,refCount:!0})),z=V("(min-width: 960px)"),H=V("(min-width: 1220px)");!function(e,{document$:t}){be=t.pipe(Object(j.a)(t=>e.reduce((e,c)=>{const a=E(`[data-md-component=${c}]`,t);return Object.assign(Object.assign({},e),void 0!==a?{[c]:a}:{})},{})),Object(se.a)((t,c)=>{for(const a of e)switch(a){case"announce":case"header-topic":case"container":case"skip":a in t&&void 0!==t[a]&&(L(t[a],c[a]),t[a]=c[a]);break;default:void 0!==c[a]?t[a]=E(`[data-md-component=${a}]`):delete t[a]}return t}),Object(l.a)({bufferSize:1,refCount:!0}))}(["announce","container","header","header-title","header-topic","main","navigation","search","search-query","search-reset","search-result","search-suggest","skip","tabs","toc"],{document$:t});const U=We();matchMedia("(hover)").matches&&function({document$:e,viewport$:t}){const c=e.pipe(Object(j.a)(()=>C("pre > code"))),a=t.pipe(Object(x.a)("size"));Object(r.a)([c,a]).subscribe(([e])=>{for(const t of e)t.scrollWidth>t.clientWidth?t.setAttribute("tabindex","0"):t.removeAttribute("tabindex")})}({document$:t,viewport$:P}),function({document$:e,hash$:t}){const c=e.pipe(Object(j.a)(()=>C("details")));Object(p.a)(V("print").pipe(Object($.a)(Boolean)),Object(i.a)(window,"beforeprint")).pipe(Object(oe.a)(c)).subscribe(e=>{for(const t of e)t.setAttribute("open","")}),t.pipe(Object(j.a)(e=>E(`[id="${e}"]`)),Object($.a)(e=>void 0!==e),Object(g.a)(e=>{const t=e.closest("details");t&&!t.open&&t.setAttribute("open","")})).subscribe(e=>e.scrollIntoView())}({document$:t,hash$:A}),function({document$:e}){e.pipe(Object(Ue.a)(1),Object(d.a)(ue("container")),Object(j.a)(([,e])=>C("script",e))).pipe(Object(f.a)(e=>Object(o.a)(...e)),Object(et.a)(e=>{const t=M("script");return e.src?(t.src=e.src,L(e,t),new X.a(e=>{t.onload=()=>e.complete()})):(t.textContent=e.textContent,L(e,t),ie.a)})).subscribe(de.a)}({document$:t}),nt({document$:t}),function({document$:e}){const t=M("table");e.pipe(Object(j.a)(()=>C("table:not([class])"))).subscribe(e=>{for(const c of e)L(c,t),L(t,we("div",{class:"md-typeset__scrollwrap"},we("div",{class:"md-typeset__table"},c)))})}({document$:t}),function({document$:e}){const t=e.pipe(Object(j.a)(()=>C("[data-md-scrollfix]")),Object(l.a)({bufferSize:1,refCount:!0}));t.subscribe(e=>{for(const t of e)t.removeAttribute("data-md-scrollfix")}),Object(tt.a)(ct,t,b.a).pipe(Object(f.a)(e=>Object(p.a)(...e.map(e=>Object(i.a)(e,"touchstart").pipe(Object(S.a)(e)))))).subscribe(e=>{const t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})}({document$:t});const q=function({duration:e}={}){const t=new N.a,c=M("div");return c.classList.add("md-dialog","md-typeset"),t.pipe(Object(f.a)(t=>Object(o.a)(document.body).pipe(Object(j.a)(e=>e.appendChild(c)),Object(h.a)(u.a),Object(v.a)(1),Object(g.a)(e=>{e.innerHTML=t,e.setAttribute("data-md-state","open")}),Object(v.a)(e||2e3),Object(g.a)(e=>e.removeAttribute("data-md-state")),Object(v.a)(400),Object(g.a)(e=>{e.innerHTML="",e.remove()})))).subscribe(de.a),t}(),I=Ne({document$:t,dialog$:q}),W=ue("header").pipe(fe({document$:t,viewport$:P}),Object(l.a)({bufferSize:1,refCount:!0})),F=ue("main").pipe(he({header$:W,viewport$:P}),Object(l.a)({bufferSize:1,refCount:!0})),Y=ue("navigation").pipe(function({header$:e,main$:t,viewport$:c,screen$:a}){return Object(pe.a)(Object(f.a)(n=>a.pipe(Object(f.a)(a=>a?Oe(n,{main$:t,viewport$:c}).pipe(me(n,{header$:e}),Object(j.a)(e=>({sidebar:e}))):Object(o.a)({})))))}({header$:W,main$:F,viewport$:P,screen$:H}),Object(l.a)({bufferSize:1,refCount:!0})),G=ue("toc").pipe(Ze({header$:W,main$:F,viewport$:P,tablet$:z}),Object(l.a)({bufferSize:1,refCount:!0})),ce=ue("tabs").pipe(Xe({header$:W,viewport$:P,screen$:H}),Object(l.a)({bufferSize:1,refCount:!0})),ne=ue("search").pipe(Object(f.a)(()=>Object(a.a)(()=>{const t=e.search&&e.search.index?e.search.index:void 0,a=void 0!==t?Object(n.a)(t):T.pipe(Object(f.a)(e=>fetch(e+"/search/search_index.json",{credentials:"same-origin"}).then(e=>e.json())));return e.features.includes("search.highlight")&&Object(r.a)([c,a]).subscribe(([e,t])=>{if(!e.searchParams.has("h"))return;const c=ve(t.config)(e.searchParams.get("h"));let a=e.hash?E(`[id="${e.hash.slice(1)}"]`):E("article");if(void 0!==a)for(;a;){const e=document.createNodeIterator(a,NodeFilter.SHOW_TEXT),t=[];for(;;){const c=e.nextNode();if(!c)break;t.push(c)}for(const e of t)e.textContent.trim()&&e.replaceWith(we("span",null,c(e.textContent)));if("article"===a.tagName)break;{const e=a.nextSibling;if(e instanceof HTMLElement&&e.tagName.match(/^H[1-6]/))break;a=e}}}),Object(o.a)(Me(e.search.worker,{base$:T,index$:a}))}))).pipe(Object(f.a)(t=>{const c=ue("search-query").pipe(Je(t,{transform:e.search.transform}),Object(l.a)({bufferSize:1,refCount:!0})),a=ue("search-reset").pipe(Ye(),Object(l.a)({bufferSize:1,refCount:!0})),n=ue("search-result").pipe(Qe(t,{query$:c}),Object(l.a)({bufferSize:1,refCount:!0}));return e.features.includes("search.suggest")&&(n.pipe(Object(d.a)(c)).subscribe(([{suggestions:e},t])=>{if(void 0!==e){const c=document.querySelector(".md-search__suggest"),a=t.value.split(/([\s-]+)/);if(e.length){const[n]=e.slice(-1);if(e.length>=t.value.split(/[\s-]+/).length&&n.startsWith(a[a.length-1])){const e=document.createElement("span");e.innerHTML=[...a.slice(0,-1),n].join(""),c.innerHTML="",c.appendChild(e)}else c.innerHTML=""}else c.innerHTML=""}}),ue("search-query").pipe(Object(f.a)(e=>Object(i.a)(e,"keydown").pipe(Object(h.a)(s.b),Object(j.a)(()=>e.value),Object(O.a)(),Object(j.a)(()=>{const t=document.querySelector(".md-search__suggest span");t&&(t.innerHTML.startsWith(e.value)&&!e.value.endsWith(" ")&&0!==e.value.length||(t.innerHTML=""))})))).subscribe()),ue("search").pipe(function({rx$:e,tx$:t},{query$:c,reset$:a,result$:n}){return Object(pe.a)(Object(f.a)(()=>{const o=e.pipe(Object($.a)(Ee),Object(S.a)("ready"),Object(R.a)("waiting"));return t.pipe(Object($.a)(Te),Object(ge.a)(o),Object(y.a)(1)).subscribe(t.next.bind(t)),Object(r.a)([o,c,n,a]).pipe(Object(j.a)(([e,t,c])=>({status:e,query:t,result:c})))}))}(t,{query$:c,reset$:a,result$:n}))}),Object(m.a)(()=>(ue("search").subscribe(e=>e.hidden=!0),b.a)),Object(l.a)({bufferSize:1,refCount:!0}));if(A.pipe(Object(g.a)(()=>Z("search",!1)),Object(v.a)(125)).subscribe(e=>Q("#"+e)),Object(r.a)([ee("search"),z]).pipe(Object(d.a)(P),Object(f.a)(([[e,c],{offset:{y:a}}])=>{const n=e&&!c;return t.pipe(Object(v.a)(n?400:100),Object(h.a)(u.a),Object(g.a)(({body:e})=>n?rt(e,a):ot(e)))})).subscribe(),Object(i.a)(document.body,"click").pipe(Object($.a)(e=>!(e.metaKey||e.ctrlKey)),Object($.a)(e=>{if(e.target instanceof HTMLElement){const t=e.target.closest("a");if(t&&J(t))return!0}return!1})).subscribe(()=>{Z("drawer",!1)}),e.features.includes("navigation.instant")&&"file:"!==location.protocol){const e=new DOMParser;T.pipe(Object(f.a)(t=>Object(n.a)(fetch(t+"/sitemap.xml").then(e=>e.text()).then(t=>e.parseFromString(t,"text/xml")))),Object(d.a)(T),Object(j.a)(([e,t])=>{const c=C("loc",e).map(e=>e.textContent);if(c.length>1){const[e,a]=c.sort((e,t)=>e.length-t.length);let n=0;if(e===a)n=e.length;else for(;e.charAt(n)===a.charAt(n);)n++;for(let a=0;a{Ie(e,{document$:t,location$:c,viewport$:P})})}U.pipe(Object($.a)(e=>"global"===e.mode&&"Tab"===e.type),Object(y.a)(1)).subscribe(()=>{for(const e of C(".headerlink"))e.style.visibility="visible"}),t.subscribe(()=>{const e=C("[data-md-state=indeterminate]");for(const t of e)t.dataset.mdState="",t.indeterminate=!0,t.checked=!1});const re=C("[data-md-option=palette]");for(let e=0;e{for(const e of["mdColorScheme","mdColorPrimary","mdColorAccent"])t.dataset[e]&&(document.body.dataset[e]=t.dataset[e]);re[e].dataset.mdState="hidden";const c=re[(e+1)%re.length];c.dataset.mdState="",c.focus(),localStorage.setItem("__palette",JSON.stringify({index:e,color:{scheme:t.dataset.mdColorScheme,primary:t.dataset.mdColorPrimary,accent:t.dataset.mdColorAccent}}))})}if(re.length){const{index:e}=JSON.parse(localStorage.getItem("__palette")||'{ "index": 0 }');re[(+e+1)%re.length].dataset.mdState=""}if(e.features.includes("header.autohide")&&P.pipe(Object(j.a)(({offset:e})=>e.y),Object(w.a)(2,1),Object(j.a)(([e,t])=>[eP.pipe(Object(j.a)(({offset:e})=>e.y),Object($.a)(e=>e>400),Object(j.a)(e=>Math.abs(t-e)),Object($.a)(e=>e>100),Object(S.a)(e),Object(y.a)(1)))).subscribe(e=>{const t=E("[data-md-component=header]");null==t||t.setAttribute("data-md-state",e?"hidden":"shadow")}),void 0!==e.version&&"mike"===e.version.method){const e=T.pipe(Object(f.a)(e=>fetch(e+"/../versions.json",{credentials:"same-origin"}).then(e=>e.json())),Object(m.a)(()=>(console.log("Couldn't load versions.json"),b.a)));ue("header-title").pipe(Object(j.a)(e=>e.querySelector(".md-header-nav__topic")),Object(_.a)(T,e)).subscribe(([e,t,c])=>{e.appendChild(function(e,t){const[,c]=e.match(/([^\/]+)\/?$/);return we("div",{class:"md-version"},we("span",{class:"md-version__current"},(t.find(({version:e})=>e===c)||t[0]).version),we("ul",{class:"md-version__list"},t.map(t=>we("li",{class:"md-version__item"},we("a",{class:"md-version__link",href:`${e}/../${t.version}/`},t.title)))))}(t,c))})}const le={document$:t,location$:c,viewport$:P,header$:W,main$:F,navigation$:Y,search$:ne,tabs$:ce,toc$:G,clipboard$:I,keyboard$:U,dialog$:q};return Object(p.a)(...Object.values(le)).subscribe(),le}document.documentElement.classList.remove("no-js"),document.documentElement.classList.add("js"),navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&document.documentElement.classList.add("ios")}})); \ No newline at end of file diff --git a/latest/assets/javascripts/bundle.f4f0c901.min.js b/latest/assets/javascripts/bundle.f4f0c901.min.js new file mode 100644 index 00000000..89bac06c --- /dev/null +++ b/latest/assets/javascripts/bundle.f4f0c901.min.js @@ -0,0 +1 @@ +!function(e,t){for(var a in t)e[a]=t[a]}(window,function(e){function t(t){for(var c,o,i=t[0],s=t[1],b=t[2],p=0,l=[];pObject(s.a)(new q.a(e=>{for(const t of e)I.next(t)}))).pipe(Object(d.a)(e=>Object(l.a)(Object(s.a)(e),n.a).pipe(Object(U.a)(()=>e.disconnect()))),Object(f.a)({bufferSize:1,refCount:!0}));function D(e){return W.pipe(Object($.a)(t=>t.observe(e)),Object(d.a)(t=>I.pipe(Object(h.a)(({target:t})=>t===e),Object(U.a)(()=>t.unobserve(e)),Object(m.a)(({contentRect:e})=>({width:e.width,height:e.height})))),Object(P.a)(function(e){return{width:e.offsetWidth,height:e.offsetHeight}}(e)))}var F=a(74);var J=a(60);function Y(e,t=location){return e.host===t.host&&/^(?:\/[\w-]+)*(?:\/?|\.html)$/i.test(e.pathname)}function K(e,t=location){return e.pathname===t.pathname&&e.hash.length>0}function B(){return new J.a(new URL(location.href))}function Q(){return location.hash.substring(1)}function X(e){const t=L("a");t.href=e,t.addEventListener("click",e=>e.stopPropagation()),t.click()}var V=a(5);function G(e){const t=matchMedia(e);return new V.a(e=>{t.addListener(t=>e.next(t.matches))}).pipe(Object(P.a)(t.matches),Object(f.a)({bufferSize:1,refCount:!0}))}const Z={drawer:A("[data-md-toggle=drawer]"),search:A("[data-md-toggle=search]")};function ee(e,t){Z[e].checked!==t&&Z[e].click()}function te(e){const t=Z[e];return Object(b.a)(t,"change").pipe(Object(m.a)(()=>t.checked),Object(P.a)(t.checked))}function ae(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function ce({x:e,y:t}){window.scrollTo(e||0,t||0)}function ne(){return{width:innerWidth,height:innerHeight}}function re(e,{header$:t,viewport$:a}){const c=a.pipe(Object(S.a)("size")),n=Object(i.a)([c,t]).pipe(Object(m.a)(()=>({x:e.offsetLeft,y:e.offsetTop})));return Object(i.a)([t,a,n]).pipe(Object(m.a)(([{height:e},{offset:t,size:a},{x:c,y:n}])=>({offset:{x:t.x-c,y:t.y-n+e},size:a})))}var oe=a(62),ie=a(63);var se=a(12),be=a(77);let ue;function pe(e){return ue.pipe(Object(d.a)(t=>void 0!==t[e]?Object(s.a)(t[e]):se.a),Object(g.a)())}var le=a(28),fe=a(65);function de({document$:e,viewport$:t}){return Object(le.a)(Object(d.a)(a=>{const c=function(e,{document$:t}){return t.pipe(Object(m.a)(()=>{const t=getComputedStyle(e);return["sticky","-webkit-sticky"].includes(t.position)}),Object(g.a)(),Object(d.a)(t=>t?D(e).pipe(Object(m.a)(({height:e})=>({sticky:!0,height:e}))):Object(s.a)({sticky:!1,height:0})),Object(f.a)({bufferSize:1,refCount:!0}))}(a,{document$:e}),n=pe("main").pipe(Object(m.a)(e=>T("h1, h2, h3, h4, h5, h6",e)),Object(h.a)(e=>void 0!==e),Object(fe.a)(pe("header-title")),Object(d.a)(([e,a])=>re(e,{header$:c,viewport$:t}).pipe(Object(m.a)(({offset:{y:t}})=>t>=e.offsetHeight?"page":"site"),Object(g.a)(),function(e){return Object(le.a)(Object(O.a)(p.a),Object($.a)(t=>{!function(e,t){e.setAttribute("data-md-state",t?"active":"")}(e,"page"===t)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(e)}))}(a))),Object(P.a)("site"));return Object(i.a)([c,n]).pipe(Object(m.a)(([e,t])=>Object.assign({type:t},e)))}))}var he=a(10);function je({header$:e,viewport$:t}){const a=new N.a;return pe("header").pipe(Object(d.a)(e=>{return a.pipe(Object(S.a)("active"),(t=e,Object(le.a)(Object(O.a)(p.a),Object($.a)(({active:e})=>{!function(e,t){e.setAttribute("data-md-state",t?"shadow":"")}(t,e)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(t)}))));var t})).subscribe(he.a),Object(le.a)(Object(d.a)(a=>function(e,{header$:t,viewport$:a}){const c=t.pipe(Object(m.a)(({height:e})=>e),Object(g.a)()),n=c.pipe(Object(d.a)(()=>D(e).pipe(Object(m.a)(({height:t})=>({top:e.offsetTop,bottom:e.offsetTop+t})),Object(S.a)("bottom"))));return Object(i.a)([c,n,a]).pipe(Object(m.a)(([e,{top:t,bottom:a},{offset:{y:c},size:{height:n}}])=>({offset:t-e,height:n=Math.max(0,n-Math.max(0,t-c,e)-Math.max(0,n+c-a)),active:t-e<=c})),Object(g.a)((e,t)=>e.offset===t.offset&&e.height===t.height&&e.active===t.active))}(a,{header$:e,viewport$:t})),Object($.a)(e=>a.next(e)),Object(U.a)(()=>a.complete()))}function Oe(e){e.style.top=""}function me(e,{main$:t,viewport$:a}){const c=e.parentElement.offsetTop-e.parentElement.parentElement.offsetTop;return Object(i.a)([t,a]).pipe(Object(m.a)(([{offset:e,height:t},{offset:{y:a}}])=>({height:t=t+Math.min(c,Math.max(0,a-e))-c,lock:a>=e+c})),Object(g.a)((e,t)=>e.height===t.height&&e.lock===t.lock))}function ge(e,{header$:t}){return Object(le.a)(Object(O.a)(p.a),Object(j.a)(t),Object($.a)(([{height:t,lock:a},{height:c}])=>{!function(e,t){const a=e.firstElementChild;a.style.height=t-2*a.offsetTop+"px"}(e,t),a?function(e,t){e.style.top=t+"px"}(e,c):Oe(e)}),Object(m.a)(([e])=>e),Object(U.a)(()=>{Oe(e),function(e){e.firstElementChild.style.height=""}(e)}))}var ve=a(67);function $e(e){const t=new RegExp(e.separator,"img"),a=(e,t,a)=>`${t}${a}`;return c=>{c=c.replace(/[\s*+\-:~^]+/g," ").trim();const n=new RegExp(`(^|${e.separator})(${c.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(t,"|")})`,"img");return e=>e.replace(n,a).replace(/<\/mark>(\s+)]*>/gim,"$1")}}function ye(e){return e.split(/"([^"]+)"/g).map((e,t)=>1&t?e.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):e).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}function we(e,t){if("string"==typeof t||"number"==typeof t)e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(const a of t)we(e,a)}function xe(e,t,...a){const c=document.createElement(e);if(t)for(const e of Object.keys(t))"boolean"!=typeof t[e]?c.setAttribute(e,t[e]):t[e]&&c.setAttribute(e,"");for(const e of a)we(c,e);return c}let Se;function ke(e,t){if(void 0===Se){const e=A("#__lang");Se=JSON.parse(e.textContent)}if(void 0===Se[e])throw new ReferenceError("Invalid translation: "+e);return void 0!==t?Se[e].replace("#",t.toString()):Se[e]}function _e(e){if(e>999){return((e+1e-6)/1e3).toFixed(+((e-950)%1e3>99))+"k"}return e.toString()}var Ee;function Te(e){return e.type===Ee.READY}function Ae(e){return e.type===Ee.QUERY}function Ce(e){return e.type===Ee.RESULT}function Me({config:e,docs:t,index:a,options:c}){1===e.lang.length&&"en"===e.lang[0]&&(e.lang=[ke("search.config.lang")]),"[\\s\\-]+"===e.separator&&(e.separator=ke("search.config.separator"));const n=ke("search.config.pipeline").split(/\s*,\s*/).filter(Boolean);return{config:e,docs:t,index:a,options:Object.assign(Object.assign({},c),{pipeline:n,suggestions:!0})}}function Le(e,{index$:t,base$:a}){const c=new Worker(e),n=new N.a,r=function(e,{tx$:t}){const a=Object(b.a)(e,"message").pipe(Object(m.a)(({data:e})=>e));return t.pipe(Object(oe.a)(()=>a,{leading:!0,trailing:!0}),Object($.a)(t=>e.postMessage(t)),Object(ie.a)(a),Object(F.a)())}(c,{tx$:n}).pipe(Object(j.a)(a),Object(m.a)(([e,t])=>{if(Ce(e))for(const a of e.data.items)for(const e of a)e.location=`${t}/${e.location}`;return e}),Object(F.a)());return t.pipe(Object(m.a)(e=>({type:Ee.SETUP,data:Me(e)})),Object(O.a)(u.b)).subscribe(n.next.bind(n)),{tx$:n,rx$:r}}!function(e){e[e.SETUP=0]="SETUP",e[e.READY=1]="READY",e[e.QUERY=2]="QUERY",e[e.RESULT=3]="RESULT"}(Ee||(Ee={}));var Re,Pe=a(37);function ze(e,t){const a=t&Re.PARENT,c=t&Re.TEASER,n=Object.keys(e.terms).filter(t=>!e.terms[t]).map(e=>[xe("del",null,e)," "]).flat().slice(0,-1),r=new URL(e.location);r.searchParams.append("h",Object.entries(e.terms).reduce((e,[t,a])=>`${e} ${a?t:""}`,"").replace(/%20/g,"+"));return xe("a",{href:""+r,class:"md-search-result__link",tabIndex:-1},xe("article",{class:["md-search-result__article",...a?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},a>0&&xe("div",{class:"md-search-result__icon md-icon"}),xe("h1",{class:"md-search-result__title"},e.title),c>0&&e.text.length>0&&xe("p",{class:"md-search-result__teaser"},function(e,t){let a=t;if(e.length>a){for(;" "!==e[a]&&--a>0;);return e.substring(0,a)+"..."}return e}(e.text,320)),c>0&&n.length>0&&xe("p",{class:"md-search-result__terms"},ke("search.result.term.missing"),": ",n)))}function He(e,t=1/0){const a=[...e],c=a.findIndex(e=>!e.location.includes("#")),[n]=a.splice(c,1);let r=a.findIndex(e=>e.scoreze(e,Re.TEASER)),...i.length?[xe("details",{class:"md-search-result__more"},xe("summary",{tabIndex:-1},i.length>0&&1===i.length?ke("search.result.more.one"):ke("search.result.more.other",i.length)),i.map(e=>ze(e,Re.TEASER)))]:[]];return xe("li",{class:"md-search-result__item"},s)}function qe(e){return xe("ul",{class:"md-source__facts"},e.map(e=>xe("li",{class:"md-source__fact"},e)))}function Ne({document$:e,dialog$:t}){if(!Pe.isSupported())return n.a;e.subscribe(()=>{M("pre > code").forEach((e,t)=>{const a=e.parentElement;var c;a.id="__code_"+t,a.insertBefore((c=a.id,xe("button",{class:"md-clipboard md-icon",title:ke("clipboard.copy"),"data-clipboard-target":`#${c} > code`})),e)})});const a=new V.a(e=>{new Pe(".md-clipboard").on("success",t=>e.next(t))}).pipe(Object(F.a)());return a.pipe(Object($.a)(e=>e.clearSelection()),Object(k.a)(ke("clipboard.copied"))).subscribe(t),a}!function(e){e[e.TEASER=1]="TEASER",e[e.PARENT=2]="PARENT"}(Re||(Re={}));var Ue=a(68),Ie=a(78);function We(e,{document$:t,viewport$:a,location$:c}){"scrollRestoration"in history&&(history.scrollRestoration="manual"),Object(b.a)(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"});const r=T('link[rel="shortcut icon"]');void 0!==r&&(r.href=r.href);const i=Object(b.a)(document.body,"click").pipe(Object(h.a)(e=>!(e.metaKey||e.ctrlKey)),Object(d.a)(t=>{if(t.target instanceof HTMLElement){const a=t.target.closest("a");if(a&&!a.target&&Y(a)&&e.includes(a.href))return K(a)||t.preventDefault(),Object(s.a)(a)}return n.a}),Object(m.a)(e=>({url:new URL(e.href)})),Object(F.a)());i.subscribe(()=>{ee("search",!1)});const u=i.pipe(Object(h.a)(({url:e})=>!K(e)),Object(F.a)()),p=Object(b.a)(window,"popstate").pipe(Object(h.a)(e=>null!==e.state),Object(m.a)(e=>({url:new URL(location.href),offset:e.state})),Object(F.a)());Object(l.a)(u,p).pipe(Object(g.a)((e,t)=>e.url.href===t.url.href),Object(m.a)(({url:e})=>e)).subscribe(c);const f=c.pipe(Object(S.a)("pathname"),Object(Ue.a)(1),Object(d.a)(e=>Object(o.a)(fetch(e.href,{credentials:"same-origin"}).then(e=>e.text())).pipe(Object(v.a)(()=>(function(e){location.href=e.href}(e),n.a)))),Object(F.a)());u.pipe(Object(ve.a)(f)).subscribe(({url:e})=>{history.pushState({},"",e.toString())});const j=new DOMParser;f.pipe(Object(m.a)(e=>j.parseFromString(e,"text/html"))).subscribe(t);Object(l.a)(u,p).pipe(Object(ve.a)(t)).subscribe(({url:e,offset:t})=>{e.hash&&!t?X(e.hash):ce(t||{y:0})}),t.pipe(Object(Ue.a)(1)).subscribe(({title:e,head:t})=>{document.title=e;for(const e of['link[rel="canonical"]','meta[name="author"]','meta[name="description"]']){const a=T(e,t),c=T(e,document.head);void 0!==a&&void 0!==c&&R(c,a)}document.dispatchEvent(new CustomEvent("DOMContentSwitch"))}),a.pipe(Object(Ie.a)(250),Object(S.a)("offset")).subscribe(({offset:e})=>{history.replaceState(e,"")}),Object(l.a)(i,p).pipe(Object(x.a)(2,1),Object(h.a)(([e,t])=>e.url.pathname===t.url.pathname&&!K(t.url)),Object(m.a)(([,e])=>e)).subscribe(({offset:e})=>{ce(e||{y:0})})}function De(){const e=Object(b.a)(window,"keydown").pipe(Object(h.a)(e=>!(e.metaKey||e.ctrlKey)),Object(m.a)(e=>({type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),Object(F.a)()).pipe(Object(m.a)(e=>{return Object.assign({mode:(t="search",Z[t].checked?"search":"global")},e);var t}),Object(h.a)(({mode:e})=>{if("global"===e){const e=C();if(void 0!==e)return!function(e){switch(e.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return!0;default:return e.isContentEditable}}(e)}return!0}),Object(F.a)());return e.pipe(Object(h.a)(({mode:e})=>"search"===e),Object(j.a)(pe("search-query"),pe("search-result"),pe("search-suggest"))).subscribe(([e,t,a,c])=>{const n=C();switch(e.type){case"Enter":if(n===t){const t=new Map;for(const e of M(":first-child [href]",a)){const a=e.firstElementChild;t.set(e,parseFloat(a.getAttribute("data-md-score")))}if(t.size){const[[e]]=[...t].sort(([,e],[,t])=>t-e);e.click()}e.claim()}break;case"Escape":case"Tab":ee("search",!1),z(t,!1);break;case"ArrowUp":case"ArrowDown":if(void 0===n)z(t);else{const c=[t,...M(":not(details) > [href], summary, details[open] [href]",a)],r=Math.max(0,(Math.max(0,c.indexOf(n))+c.length+("ArrowUp"===e.type?-1:1))%c.length);z(c[r])}e.claim();break;case"ArrowRight":c.innerText.length&&t.selectionStart===t.value.length&&(t.value=c.innerText);break;default:t!==C()&&z(t)}}),e.pipe(Object(h.a)(({mode:e})=>"global"===e),Object(j.a)(pe("search-query"))).subscribe(([e,t])=>{switch(e.type){case"f":case"s":case"/":z(t),function(e){if(!(e instanceof HTMLInputElement))throw new Error("Not implemented");e.select()}(t),e.claim();break;case"p":case",":const a=T("[href][rel=prev]");void 0!==a&&a.click();break;case"n":case".":const c=T("[href][rel=next]");void 0!==c&&c.click()}}),e}function Fe(e){e.placeholder=ke("search.placeholder")}function Je(e,{transform:t}={}){const a=t||ye,c=Object(l.a)(Object(b.a)(e,"keyup"),Object(b.a)(e,"focus").pipe(Object(y.a)(1))).pipe(Object(m.a)(()=>a(e.value)),Object(P.a)(a(e.value)),Object(g.a)()),n=function(e){return Object(l.a)(Object(b.a)(e,"focus"),Object(b.a)(e,"blur")).pipe(Object(m.a)(({type:e})=>"focus"===e),Object(P.a)(e===C()))}(e);return Object(i.a)([c,n]).pipe(Object(m.a)(([e,t])=>({value:e,focus:t})))}function Ye({tx$:e},t={}){return Object(le.a)(Object(d.a)(a=>{const c=Je(a,t);return c.pipe(Object(S.a)("value"),Object(m.a)(({value:e})=>({type:Ee.QUERY,data:e}))).subscribe(e.next.bind(e)),c.pipe(Object(S.a)("focus")).subscribe(({focus:e})=>{e&&ee("search",e)}),c.pipe(function(e){return Object(le.a)(Object($.a)(({focus:t})=>{t?function(e,t){e.placeholder=t}(e,""):Fe(e)}),Object(U.a)(()=>{Fe(e)}))}(a))}))}function Ke(){return Object(le.a)(Object(d.a)(e=>function(e){return Object(b.a)(e,"click").pipe(Object(k.a)(void 0))}(e).pipe(Object(ie.a)(pe("search-query")),Object($.a)(z),Object(k.a)(void 0))),Object(P.a)(void 0))}function Be(e,t){e.appendChild(t)}function Qe(e,{query$:t,fetch$:a}){const c=A(".md-search-result__list",e),n=A(".md-search-result__meta",e);return Object(le.a)(Object(j.a)(t),Object(m.a)(([e,t])=>{const{items:a}=e;return t.value?function(e,t){switch(t){case 0:e.textContent=ke("search.result.none");break;case 1:e.textContent=ke("search.result.one");break;default:e.textContent=ke("search.result.other",t)}}(n,a.length):function(e){e.textContent=ke("search.result.placeholder")}(n),e}),Object(d.a)(t=>{const{items:n}=t,r=[...n.map(([e])=>e.score),0];return a.pipe(Object(O.a)(p.a),Object(be.a)(t=>{const a=e.parentElement;for(;t16)););return t},0),Object(k.a)(t),Object(U.a)(()=>{!function(e){e.innerHTML=""}(c)}))}))}function Xe({rx$:e},{query$:t}){return Object(le.a)(Object(d.a)(a=>{const c=a.parentElement,n=function(e){return Object(l.a)(Object(b.a)(e,"scroll"),Object(b.a)(window,"resize")).pipe(Object(m.a)(()=>H(e)),Object(P.a)(H(e)))}(c).pipe(Object(m.a)(({y:e})=>e>=c.scrollHeight-c.offsetHeight-16),Object(g.a)(),Object(h.a)(Boolean));return e.pipe(Object(h.a)(Ce),Object(m.a)(({data:e})=>e),Qe(a,{query$:t,fetch$:n}))}))}function Ve({header$:e,viewport$:t,screen$:a}){return Object(le.a)(Object(d.a)(c=>a.pipe(Object(d.a)(a=>a?re(c,{header$:e,viewport$:t}).pipe(Object(m.a)(({offset:{y:e}})=>({hidden:e>=10})),Object(S.a)("hidden"),function(e){return Object(le.a)(Object(O.a)(p.a),Object($.a)(({hidden:t})=>{!function(e,t){e.setAttribute("data-md-state",t?"hidden":"")}(e,t)}),Object(U.a)(()=>{!function(e){e.removeAttribute("data-md-state")}(e)}))}(c)):Object(s.a)({hidden:!0})))))}function Ge(e){e.removeAttribute("data-md-state")}function Ze(e){e.classList.remove("md-nav__link--active")}function et({header$:e,main$:t,viewport$:a,tablet$:c}){return Object(le.a)(Object(d.a)(n=>c.pipe(Object(d.a)(c=>{if(c){const c=M(".md-nav__link",n),r=me(n,{main$:t,viewport$:a}).pipe(ge(n,{header$:e})),o=function(e,{header$:t,viewport$:a}){const c=new Map;for(const t of e){const e=T(`[id="${decodeURIComponent(t.hash.substring(1))}"]`);void 0!==e&&c.set(t,e)}const n=t.pipe(Object(m.a)(e=>18+e.height));return D(document.body).pipe(Object(S.a)("height"),Object(m.a)(()=>{let e=[];return[...c].reduce((t,[a,n])=>{for(;e.length;){if(!(c.get(e[e.length-1]).tagName>=n.tagName))break;e.pop()}let r=n.offsetTop;for(;!r&&n.parentElement;)r=(n=n.parentElement).offsetTop;return t.set([...e=[...e,a]].reverse(),r)},new Map)}),Object(d.a)(e=>Object(i.a)([n,a]).pipe(Object(be.a)(([e,t],[a,{offset:{y:c}}])=>{for(;t.length;){const[,n]=t[0];if(!(n-a=c))break;t=[e.pop(),...t]}return[e,t]},[[],[...e]]),Object(g.a)((e,t)=>e[0]===t[0]&&e[1]===t[1])))).pipe(Object(m.a)(([e,t])=>({prev:e.map(([e])=>e),next:t.map(([e])=>e)})),Object(P.a)({prev:[],next:[]}),Object(x.a)(2,1),Object(m.a)(([e,t])=>e.prev.length{for(const[e]of t)Ze(e),Ge(e);e.forEach(([t],a)=>{!function(e,t){e.classList.toggle("md-nav__link--active",t)}(t,a===e.length-1),function(e,t){e.setAttribute("data-md-state",t?"blur":"")}(t,!0)})}),Object(U.a)(()=>{for(const t of e)Ze(t),Ge(t)}))}(c));return Object(i.a)([r,o]).pipe(Object(m.a)(([e,t])=>({sidebar:e,anchors:t})))}return Object(s.a)({})}))))}var tt=a(71);var at=a(72);function ct(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}var nt=a(73);function rt(e){const[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":const[,t,a]=e.match(/^.+github\.com\/([^\/]+)\/?([^\/]+)?/i);return function(e,t){const a=void 0!==t?`https://api.github.com/repos/${e}/${t}`:"https://api.github.com/users/"+e;return Object(o.a)(fetch(a)).pipe(Object(h.a)(e=>200===e.status),Object(d.a)(e=>e.json()),Object(m.a)(e=>{if(void 0!==t){const{stargazers_count:t,forks_count:a}=e;return[_e(t)+" Stars",_e(a)+" Forks"]}{const{public_repos:t}=e;return[_e(t)+" Repositories"]}}),Object(nt.a)([]),Object(F.a)())}(t,a);case"gitlab":const[,c,r]=e.match(/^.+?([^\/]*gitlab[^\/]+)\/(.+?)\/?$/i);return function(e,t){const a=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Object(o.a)(fetch(a)).pipe(Object(h.a)(e=>200===e.status),Object(d.a)(e=>e.json()),Object(m.a)(({star_count:e,forks_count:t})=>[_e(e)+" Stars",_e(t)+" Forks"]),Object(nt.a)([]),Object(F.a)())}(c,r);default:return n.a}}function ot({document$:e}){e.pipe(Object(m.a)(()=>A(".md-source[href]")),Object(d.a)(({href:e})=>{return t=""+function(e){let t=0;for(let a=0,c=e.length;art(e),Object(r.a)(()=>{const e=sessionStorage.getItem(t);if(e)return Object(s.a)(JSON.parse(e));{const e=a();return e.subscribe(e=>{try{sessionStorage.setItem(t,JSON.stringify(e))}catch(e){}}),e}});var t,a}),Object(h.a)(e=>e.length>0),Object(v.a)(()=>n.a)).subscribe(e=>{for(const t of M(".md-source__repository"))t.hasAttribute("data-md-state")||(t.setAttribute("data-md-state","done"),t.appendChild(qe(e)))})}function it(e,t){e.setAttribute("data-md-state","lock"),e.style.top=`-${t}px`}function st(e){const t=-1*parseInt(e.style.top,10);e.removeAttribute("data-md-state"),e.style.top="",t&&window.scrollTo(0,t)}function bt(e){if(!function(e){return"object"==typeof e&&"string"==typeof e.base&&"object"==typeof e.features&&"object"==typeof e.search}(e))throw new SyntaxError("Invalid configuration: "+JSON.stringify(e));const t=function(){const e=new E.a;return Object(b.a)(document,"DOMContentLoaded").pipe(Object(k.a)(document)).subscribe(e),e}(),a=B(),A=function(e,{location$:t}){return t.pipe(Object(w.a)(1),Object(m.a)(({href:t})=>new URL(e,t).toString().replace(/\/$/,"")),Object(f.a)({bufferSize:1,refCount:!0}))}(e.base,{location$:a}),C=Object(b.a)(window,"hashchange").pipe(Object(m.a)(Q),Object(P.a)(Q()),Object(h.a)(e=>e.length>0),Object(F.a)()),z=Object(i.a)([Object(l.a)(Object(b.a)(window,"scroll",{passive:!0}),Object(b.a)(window,"resize",{passive:!0})).pipe(Object(m.a)(ae),Object(P.a)(ae())),Object(b.a)(window,"resize",{passive:!0}).pipe(Object(m.a)(ne),Object(P.a)(ne()))]).pipe(Object(m.a)(([e,t])=>({offset:e,size:t})),Object(f.a)({bufferSize:1,refCount:!0})),H=G("(min-width: 960px)"),q=G("(min-width: 1220px)");!function(e,{document$:t}){ue=t.pipe(Object(m.a)(t=>e.reduce((e,a)=>{const c=T(`[data-md-component=${a}]`,t);return Object.assign(Object.assign({},e),void 0!==c?{[a]:c}:{})},{})),Object(be.a)((t,a)=>{for(const c of e)switch(c){case"announce":case"header-topic":case"container":case"skip":c in t&&void 0!==t[c]&&(R(t[c],a[c]),t[c]=a[c]);break;default:void 0!==a[c]?t[c]=T(`[data-md-component=${c}]`):delete t[c]}return t}),Object(f.a)({bufferSize:1,refCount:!0}))}(["announce","container","header","header-title","header-topic","main","navigation","search","search-query","search-reset","search-result","search-suggest","skip","tabs","toc"],{document$:t});const U=De();matchMedia("(hover)").matches&&function({document$:e,viewport$:t}){const a=e.pipe(Object(m.a)(()=>M("pre > code"))),c=t.pipe(Object(S.a)("size"));Object(i.a)([a,c]).subscribe(([e])=>{for(const t of e)t.scrollWidth>t.clientWidth?t.setAttribute("tabindex","0"):t.removeAttribute("tabindex")})}({document$:t,viewport$:z}),function({document$:e,hash$:t}){const a=e.pipe(Object(m.a)(()=>M("details")));Object(l.a)(G("print").pipe(Object(h.a)(Boolean)),Object(b.a)(window,"beforeprint")).pipe(Object(ie.a)(a)).subscribe(e=>{for(const t of e)t.setAttribute("open","")}),t.pipe(Object(m.a)(e=>T(`[id="${e}"]`)),Object(h.a)(e=>void 0!==e),Object($.a)(e=>{const t=e.closest("details");t&&!t.open&&t.setAttribute("open","")})).subscribe(e=>e.scrollIntoView())}({document$:t,hash$:C}),function({document$:e}){e.pipe(Object(Ue.a)(1),Object(j.a)(pe("container")),Object(m.a)(([,e])=>M("script",e))).pipe(Object(d.a)(e=>Object(s.a)(...e)),Object(tt.a)(e=>{const t=L("script");return e.src?(t.src=e.src,R(e,t),new V.a(e=>{t.onload=()=>e.complete()})):(t.textContent=e.textContent,R(e,t),se.a)})).subscribe(he.a)}({document$:t}),ot({document$:t}),function({document$:e}){const t=L("table");e.pipe(Object(m.a)(()=>M("table:not([class])"))).subscribe(e=>{for(const a of e)R(a,t),R(t,xe("div",{class:"md-typeset__scrollwrap"},xe("div",{class:"md-typeset__table"},a)))})}({document$:t}),function({document$:e}){const t=e.pipe(Object(m.a)(()=>M("[data-md-scrollfix]")),Object(f.a)({bufferSize:1,refCount:!0}));t.subscribe(e=>{for(const t of e)t.removeAttribute("data-md-scrollfix")}),Object(at.a)(ct,t,n.a).pipe(Object(d.a)(e=>Object(l.a)(...e.map(e=>Object(b.a)(e,"touchstart").pipe(Object(k.a)(e)))))).subscribe(e=>{const t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})}({document$:t});const I=function({duration:e}={}){const t=new N.a,a=L("div");return a.classList.add("md-dialog","md-typeset"),t.pipe(Object(d.a)(t=>Object(s.a)(document.body).pipe(Object(m.a)(e=>e.appendChild(a)),Object(O.a)(p.a),Object(y.a)(1),Object($.a)(e=>{e.innerHTML=t,e.setAttribute("data-md-state","open")}),Object(y.a)(e||2e3),Object($.a)(e=>e.removeAttribute("data-md-state")),Object(y.a)(400),Object($.a)(e=>{e.innerHTML="",e.remove()})))).subscribe(he.a),t}(),W=Ne({document$:t,dialog$:I}),D=pe("header").pipe(de({document$:t,viewport$:z}),Object(f.a)({bufferSize:1,refCount:!0})),J=pe("main").pipe(je({header$:D,viewport$:z}),Object(f.a)({bufferSize:1,refCount:!0})),K=pe("navigation").pipe(function({header$:e,main$:t,viewport$:a,screen$:c}){return Object(le.a)(Object(d.a)(n=>c.pipe(Object(d.a)(c=>c?me(n,{main$:t,viewport$:a}).pipe(ge(n,{header$:e}),Object(m.a)(e=>({sidebar:e}))):Object(s.a)({})))))}({header$:D,main$:J,viewport$:z,screen$:q}),Object(f.a)({bufferSize:1,refCount:!0})),Z=pe("toc").pipe(et({header$:D,main$:J,viewport$:z,tablet$:H}),Object(f.a)({bufferSize:1,refCount:!0})),ce=e.features.includes("navigation.tabs.sticky")?n.a:pe("tabs").pipe(Ve({header$:D,viewport$:z,screen$:q}),Object(f.a)({bufferSize:1,refCount:!0})),re=pe("search").pipe(Object(d.a)(()=>Object(r.a)(()=>{const t=e.search&&e.search.index?e.search.index:void 0,n=void 0!==t?Object(o.a)(t):A.pipe(Object(d.a)(e=>fetch(e+"/search/search_index.json",{credentials:"same-origin"}).then(e=>e.json())));return e.features.includes("search.highlight")&&Object(i.a)([a,n]).subscribe(([e,t])=>{if(!e.searchParams.has("h"))return;const a=$e(t.config)(e.searchParams.get("h"));let n=e.hash?T(`[id="${e.hash.slice(1)}"]`):T("article");if(void 0!==n)for(;n;){const e=document.createNodeIterator(n,NodeFilter.SHOW_TEXT),t=[];for(;;){const a=e.nextNode();if(!a)break;t.push(a)}for(const e of t)e.textContent.trim()&&e.replaceWith(xe("span",null,a(c(e.textContent))));if("article"===n.tagName)break;{const e=n.nextSibling;if(e instanceof HTMLElement&&e.tagName.match(/^H[1-6]/))break;n=e}}}),Object(s.a)(Le(e.search.worker,{base$:A,index$:n}))}))).pipe(Object(d.a)(t=>{const a=new URLSearchParams(document.location.search);a.get("q")&&(pe("search-suggest").subscribe(e=>{e.innerText=a.get("q"),pe("search-query").subscribe(e=>e.focus())}),t.rx$.pipe(Object(h.a)(Te),Object(d.a)(()=>pe("search-query"))).subscribe(e=>{e.blur(),e.value=a.get("q"),e.focus()}));const c=pe("search-query").pipe(Ye(t,{transform:e.search.transform}),Object(f.a)({bufferSize:1,refCount:!0})),n=pe("search-reset").pipe(Ke(),Object(f.a)({bufferSize:1,refCount:!0})),r=pe("search-result").pipe(Xe(t,{query$:c}),Object(f.a)({bufferSize:1,refCount:!0}));return e.features.includes("search.suggest")&&(r.pipe(Object(j.a)(c)).subscribe(([{suggestions:e},t])=>{if(void 0!==e){const a=document.querySelector(".md-search__suggest"),c=t.value.split(/([\s-]+)/);if(e.length){const[n]=e.slice(-1);if(e.length>=t.value.split(/[\s-]+/).length&&n.startsWith(c[c.length-1])){const e=document.createElement("span");e.innerHTML=[...c.slice(0,-1),n].join(""),a.innerHTML="",a.appendChild(e)}else a.innerHTML=""}else a.innerHTML=""}}),pe("search-query").pipe(Object(d.a)(e=>Object(b.a)(e,"keydown").pipe(Object(O.a)(u.b),Object(m.a)(()=>e.value),Object(g.a)(),Object(m.a)(()=>{const t=document.querySelector(".md-search__suggest span");t&&(t.innerHTML.startsWith(e.value)&&!e.value.endsWith(" ")&&0!==e.value.length||(t.innerHTML=""))})))).subscribe()),pe("search").pipe(function({rx$:e,tx$:t},{query$:a,reset$:c,result$:n}){return Object(le.a)(Object(d.a)(()=>{const r=e.pipe(Object(h.a)(Te),Object(k.a)("ready"),Object(P.a)("waiting"));return t.pipe(Object(h.a)(Ae),Object(ve.a)(r),Object(w.a)(1)).subscribe(t.next.bind(t)),Object(i.a)([r,a,n,c]).pipe(Object(m.a)(([e,t,a])=>({status:e,query:t,result:a})))}))}(t,{query$:c,reset$:n,result$:r}))}),Object(v.a)(()=>(pe("search").subscribe(e=>e.hidden=!0),n.a)),Object(f.a)({bufferSize:1,refCount:!0}));if(C.pipe(Object($.a)(()=>ee("search",!1)),Object(y.a)(125)).subscribe(e=>X("#"+e)),Object(i.a)([te("search"),H]).pipe(Object(j.a)(z),Object(d.a)(([[e,a],{offset:{y:c}}])=>{const n=e&&!a;return t.pipe(Object(y.a)(n?400:100),Object(O.a)(p.a),Object($.a)(({body:e})=>n?it(e,c):st(e)))})).subscribe(),Object(b.a)(document.body,"click").pipe(Object(h.a)(e=>!(e.metaKey||e.ctrlKey)),Object(h.a)(e=>{if(e.target instanceof HTMLElement){const t=e.target.closest("a");if(t&&Y(t))return!0}return!1})).subscribe(()=>{ee("drawer",!1)}),e.features.includes("navigation.instant")&&"file:"!==location.protocol){const e=new DOMParser;A.pipe(Object(d.a)(t=>Object(o.a)(fetch(t+"/sitemap.xml").then(e=>e.text()).then(t=>e.parseFromString(t,"text/xml")))),Object(j.a)(A),Object(m.a)(([e,t])=>{const a=M("loc",e).map(e=>e.textContent);if(a.length>1){const[e,c]=a.sort((e,t)=>e.length-t.length);let n=0;if(e===c)n=e.length;else for(;e.charAt(n)===c.charAt(n);)n++;for(let c=0;c{We(e,{document$:t,location$:a,viewport$:z})})}U.pipe(Object(h.a)(e=>"global"===e.mode&&"Tab"===e.type),Object(w.a)(1)).subscribe(()=>{for(const e of M(".headerlink"))e.style.visibility="visible"}),t.subscribe(()=>{const e=M("[data-md-state=indeterminate]");for(const t of e)t.dataset.mdState="",t.indeterminate=!0,t.checked=!1});const oe=M("[data-md-option=palette]");for(let e=0;e{for(const e of["mdColorScheme","mdColorPrimary","mdColorAccent"])t.dataset[e]&&(document.body.dataset[e]=t.dataset[e]);oe[e].dataset.mdState="hidden";const a=oe[(e+1)%oe.length];a.dataset.mdState="",a.focus(),localStorage.setItem("__palette",JSON.stringify({index:e,color:{scheme:t.dataset.mdColorScheme,primary:t.dataset.mdColorPrimary,accent:t.dataset.mdColorAccent}}))})}if(oe.length){const{index:e}=JSON.parse(localStorage.getItem("__palette")||'{ "index": 0 }');oe[(+e+1)%oe.length].dataset.mdState=""}if(e.features.includes("header.autohide")&&z.pipe(Object(m.a)(({offset:e})=>e.y),Object(x.a)(2,1),Object(m.a)(([e,t])=>[ez.pipe(Object(m.a)(({offset:e})=>e.y),Object(h.a)(e=>e>400),Object(m.a)(e=>Math.abs(t-e)),Object(h.a)(e=>e>100),Object(k.a)(e),Object(w.a)(1)))).subscribe(e=>{const t=T("[data-md-component=header]");null==t||t.setAttribute("data-md-state",e?"hidden":"shadow")}),void 0!==e.version&&"mike"===e.version.method){const e=A.pipe(Object(d.a)(e=>fetch(e+"/../versions.json",{credentials:"same-origin"}).then(e=>e.json())),Object(v.a)(()=>(console.log("Couldn't load versions.json"),n.a)));pe("header-title").pipe(Object(m.a)(e=>e.querySelector(".md-header-nav__topic")),Object(_.a)(A,e)).subscribe(([e,t,a])=>{e.appendChild(function(e,t){const[,a]=e.match(/([^\/]+)\/?$/);return xe("div",{class:"md-version"},xe("span",{class:"md-version__current"},(t.find(({version:e})=>e===a)||t[0]).version),xe("ul",{class:"md-version__list"},t.map(t=>xe("li",{class:"md-version__item"},xe("a",{class:"md-version__link",href:`${e}/../${t.version}/`},t.title)))))}(t,a))})}const fe={document$:t,location$:a,viewport$:z,header$:D,main$:J,navigation$:K,search$:re,tabs$:ce,toc$:Z,clipboard$:W,keyboard$:U,dialog$:I};return Object(l.a)(...Object.values(fe)).subscribe(),fe}document.documentElement.classList.remove("no-js"),document.documentElement.classList.add("js"),navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&document.documentElement.classList.add("ios")}})); \ No newline at end of file diff --git a/latest/assets/javascripts/vendor.49293c47.min.js b/latest/assets/javascripts/vendor.49293c47.min.js new file mode 100644 index 00000000..6c356e4a --- /dev/null +++ b/latest/assets/javascripts/vendor.49293c47.min.js @@ -0,0 +1,15 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return o}));var r=n(2);function i(t){return Object(r.a)(null==t?void 0:t.lift)}function o(t){return e=>{if(i(e))return e.lift((function(e){try{return t(e,this)}catch(t){this.error(t)}}));throw new TypeError("Unable to lift unknown Observable type")}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(16);class i extends r.b{constructor(t,e,n,r,i){super(t),this.onUnsubscribe=i,e&&(this._next=function(t){try{e(t)}catch(t){this.destination.error(t)}}),n&&(this._error=function(t){try{n(t)}catch(t){this.destination.error(t)}this.unsubscribe()}),r&&(this._complete=function(){try{r()}catch(t){this.destination.error(t)}this.unsubscribe()})}unsubscribe(){var t;!this.closed&&(null===(t=this.onUnsubscribe)||void 0===t||t.call(this)),super.unsubscribe()}}},function(t,e,n){"use strict";function r(t){return"function"==typeof t}n.d(e,"a",(function(){return r}))},,,function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var r=n(16),i=n(7),o=n(14),s=n(28),c=n(13),u=n(18),a=n(2);class l{constructor(t){t&&(this._subscribe=t)}lift(t){const e=new l;return e.source=this,e.operator=t,e}subscribe(t,e,n){const o=(s=t)&&s instanceof r.b||function(t){return t&&Object(a.a)(t.next)&&Object(a.a)(t.error)&&Object(a.a)(t.complete)}(s)&&Object(i.c)(s)?t:new r.a(t,e,n);var s;const{operator:u,source:l}=this;return o.add(u?u.call(o,l):l||c.a.useDeprecatedSynchronousErrorHandling?this._subscribe(o):this._trySubscribe(o)),o}_trySubscribe(t){try{return this._subscribe(t)}catch(e){if(c.a.useDeprecatedSynchronousErrorHandling)throw e;!function(t){for(;t;){const{closed:e,destination:n,isStopped:i}=t;if(e||i)return!1;t=n&&n instanceof r.b?n:null}return!0}(t)?Object(u.a)(e):t.error(e)}}forEach(t,e){return new(e=d(e))((e,n)=>{let r;r=this.subscribe(e=>{try{t(e)}catch(t){n(t),null==r||r.unsubscribe()}},n,e)})}_subscribe(t){var e;return null===(e=this.source)||void 0===e?void 0:e.subscribe(t)}[o.a](){return this}pipe(...t){return t.length?Object(s.b)(t)(this):this}toPromise(t){return new(t=d(t))((t,e)=>{let n;this.subscribe(t=>n=t,t=>e(t),()=>t(n))})}}function d(t){var e;return null!==(e=null!=t?t:c.a.Promise)&&void 0!==e?e:Promise}l.create=t=>new l(t)},function(t,e,n){"use strict";n.d(e,"a",(function(){return g})),n.d(e,"c",(function(){return _})),n.d(e,"b",(function(){return O}));function r(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function c(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,c)}u((r=r.apply(t,e||[])).next())}))}Object.create;function i(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function o(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=i(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,i){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)})(r,i,(e=t[n](e)).done,e.value)}))}}}Object.create;var s=n(20),c=n(2);function u(t){return Object(c.a)(null==t?void 0:t.then)}const a="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";var l=n(14),d=n(5),f=n(7);var h=n(21);function b(t){return Object(c.a)(t[l.a])}function v(t){return Object(c.a)(null==t?void 0:t[a])}function p(t){return Symbol.asyncIterator&&Object(c.a)(null==t?void 0:t[Symbol.asyncIterator])}function m(t){return new TypeError(`You provided ${null!==t&&"object"==typeof t?"an invalid object":`'${t}'`} where a stream was expected. You can provide an Observable, Promise, Array, AsyncIterable, or Iterable.`)}function y(t,e){if(null!=t){if(b(t))return function(t,e){return new d.a(n=>{const r=new f.b;return r.add(e.schedule(()=>{const i=t[l.a]();r.add(i.subscribe({next(t){r.add(e.schedule(()=>n.next(t)))},error(t){r.add(e.schedule(()=>n.error(t)))},complete(){r.add(e.schedule(()=>n.complete()))}}))})),r})}(t,e);if(Object(s.a)(t))return Object(h.a)(t,e);if(u(t))return function(t,e){return new d.a(n=>e.schedule(()=>t.then(t=>{n.add(e.schedule(()=>{n.next(t),n.add(e.schedule(()=>n.complete()))}))},t=>{n.add(e.schedule(()=>n.error(t)))})))}(t,e);if(p(t))return function(t,e){if(!t)throw new Error("Iterable cannot be null");return new d.a(n=>{const r=new f.b;return r.add(e.schedule(()=>{const i=t[Symbol.asyncIterator]();r.add(e.schedule((function(){i.next().then(t=>{t.done?n.complete():(n.next(t.value),this.schedule())})})))})),r})}(t,e);if(v(t))return function(t,e){return new d.a(n=>{let r;return n.add(e.schedule(()=>{r=t[a](),function(t,e,n,r=0){const i=e.schedule((function(){try{n.call(this)}catch(e){t.error(e)}}),r);t.add(i)}(n,e,(function(){const{value:t,done:e}=r.next();e?n.complete():(n.next(t),this.schedule())}))})),()=>Object(c.a)(null==r?void 0:r.return)&&r.return()})}(t,e)}throw m(t)}var w=n(18);function g(t,e){return e?y(t,e):_(t)}function _(t){if(t instanceof d.a)return t;if(null!=t){if(b(t))return f=t,new d.a(t=>{const e=f[l.a]();if(Object(c.a)(e.subscribe))return e.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")});if(Object(s.a)(t))return O(t);if(u(t))return i=t,new d.a(t=>{i.then(e=>{t.closed||(t.next(e),t.complete())},e=>t.error(e)).then(null,w.a)});if(p(t))return n=t,new d.a(t=>{(function(t,e){var n,i,s,c;return r(this,void 0,void 0,(function*(){try{for(n=o(t);!(i=yield n.next()).done;){const t=i.value;e.next(t)}}catch(t){s={error:t}}finally{try{i&&!i.done&&(c=n.return)&&(yield c.call(n))}finally{if(s)throw s.error}}e.complete()}))})(n,t).catch(e=>t.error(e))});if(v(t))return e=t,new d.a(t=>{const n=e[a]();for(;!t.closed;){const{done:e,value:r}=n.next();e?t.complete():t.next(r)}return()=>Object(c.a)(null==n?void 0:n.return)&&n.return()})}var e,n,i,f;throw m(t)}function O(t){return new d.a(e=>{for(let n=0;nfunction(e){t(this),this.message=e?`${e.length} errors occurred during unsubscription:\n${e.map((t,e)=>`${e+1}) ${t.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=e});var s=n(11);class c{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._teardowns=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;const{_parentage:e}=this;if(Array.isArray(e))for(const t of e)t.remove(this);else null==e||e.remove(this);const{initialTeardown:n}=this;if(Object(r.a)(n))try{n()}catch(e){t=e instanceof o?e.errors:[e]}const{_teardowns:i}=this;if(i){this._teardowns=null;for(const e of i)try{l(e)}catch(e){t=null!=t?t:[],e instanceof o?t=[...t,...e.errors]:t.push(e)}}if(t)throw new o(t)}}add(t){var e;if(t&&t!==this)if(this.closed)l(t);else{if(t instanceof c){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=null!==(e=this._teardowns)&&void 0!==e?e:[]).push(t)}}_hasParent(t){const{_parentage:e}=this;return e===t||Array.isArray(e)&&e.includes(t)}_addParent(t){const{_parentage:e}=this;this._parentage=Array.isArray(e)?(e.push(t),e):e?[e,t]:t}_removeParent(t){const{_parentage:e}=this;e===t?this._parentage=null:Array.isArray(e)&&Object(s.a)(e,t)}remove(t){const{_teardowns:e}=this;e&&Object(s.a)(e,t),t instanceof c&&t._removeParent(this)}}c.EMPTY=(()=>{const t=new c;return t.closed=!0,t})();const u=c.EMPTY;function a(t){return t instanceof c||t&&"closed"in t&&Object(r.a)(t.remove)&&Object(r.a)(t.add)&&Object(r.a)(t.unsubscribe)}function l(t){Object(r.a)(t)?t():t.unsubscribe()}},function(t,e,n){"use strict";n.d(e,"b",(function(){return s})),n.d(e,"c",(function(){return c})),n.d(e,"a",(function(){return u}));var r=n(2),i=n(31);function o(t){return t[t.length-1]}function s(t){return Object(r.a)(o(t))?t.pop():void 0}function c(t){return Object(i.a)(o(t))?t.pop():void 0}function u(t,e){return"number"==typeof o(t)?t.pop():e}},function(t,e,n){"use strict";function r(t){return t}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";function r(){}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";function r(t,e){if(t){const n=t.indexOf(e);0<=n&&t.splice(n,1)}}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(5);const i=new r.a(t=>t.complete())},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r={onUnhandledError:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r="function"==typeof Symbol&&Symbol.observable||"@@observable"},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(21),i=n(6);function o(t,e){return e?Object(r.a)(t,e):Object(i.b)(t)}},function(t,e,n){"use strict";n.d(e,"b",(function(){return u})),n.d(e,"a",(function(){return a}));var r=n(2),i=n(7),o=n(13),s=n(18),c=n(10);class u extends i.b{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,Object(i.c)(t)&&t.add(this)):this.destination=d}static create(t,e,n){return new a(t,e,n)}next(t){this.isStopped||this._next(t)}error(t){this.isStopped||(this.isStopped=!0,this._error(t))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(t){this.destination.next(t)}_error(t){this.destination.error(t),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}}class a extends u{constructor(t,e,n){if(super(),this.destination=d,(t||e||n)&&t!==d){let i;if(Object(r.a)(t))i=t;else if(t){let r;({next:i,error:e,complete:n}=t),this&&o.a.useDeprecatedNextContext?(r=Object.create(t),r.unsubscribe=()=>this.unsubscribe()):r=t,i=null==i?void 0:i.bind(r),e=null==e?void 0:e.bind(r),n=null==n?void 0:n.bind(r)}this.destination={next:i||c.a,error:e||l,complete:n||c.a}}}}function l(t){if(o.a.useDeprecatedSynchronousErrorHandling)throw t;Object(s.a)(t)}const d={closed:!0,next:c.a,error:l,complete:c.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(30),i=n(6),o=n(0),s=n(1);var c=n(2);function u(t,e,n=1/0){return Object(c.a)(e)?u((n,o)=>Object(r.a)((t,r)=>e(n,t,o,r))(Object(i.c)(t(n,o))),n):("number"==typeof e&&(n=e),Object(o.b)((e,r)=>function(t,e,n,r,o,c,u,a){let l=[],d=0,f=0,h=!1;const b=()=>{!h||l.length||d||e.complete()},v=t=>d{c&&e.next(t),d++,Object(i.c)(n(t,f++)).subscribe(new s.a(e,t=>{null==o||o(t),c?v(t):e.next(t)},void 0,()=>{for(d--;l.length&&dp(t))):p(t)}b()}))};return t.subscribe(new s.a(e,v,void 0,()=>{h=!0,b()})),()=>{l=null,null==a||a()}}(e,r,t,n)))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(13);function i(t){setTimeout(()=>{const{onUnhandledError:e}=r.a;if(!e)throw t;e(t)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(30);const{isArray:i}=Array;function o(t){return Object(r.a)(e=>function(t,e){return i(e)?t(...e):t(e)}(t,e))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r=t=>t&&"number"==typeof t.length&&"function"!=typeof t},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(5);function i(t,e){return new r.a(n=>{let r=0;return e.schedule((function(){r===t.length?n.complete():(n.next(t[r++]),n.closed||this.schedule())}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));const{isArray:r}=Array;function i(t){return 1===t.length&&r(t[0])?t[0]:t}},function(t,e,n){"use strict";n.d(e,"b",(function(){return i})),n.d(e,"a",(function(){return o}));var r=n(33);const i=new(n(35).a)(r.a),o=i},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(5),i=n(7),o=n(27);const s=Object(o.a)(t=>function(){t(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var c=n(11);class u extends r.a{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(t){const e=new a(this,this);return e.operator=t,e}_throwIfClosed(){if(this.closed)throw new s}next(t){if(this._throwIfClosed(),!this.isStopped){const e=this.observers.slice();for(const n of e)n.next(t)}}error(t){if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=t;const{observers:e}=this;for(;e.length;)e.shift().error(t)}}complete(){if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;const{observers:t}=this;for(;t.length;)t.shift().complete()}}unsubscribe(){this.isStopped=this.closed=!0,this.observers=null}_trySubscribe(t){return this._throwIfClosed(),super._trySubscribe(t)}_subscribe(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)}_innerSubscribe(t){const{hasError:e,isStopped:n,observers:r}=this;return e||n?i.a:(r.push(t),new i.b(()=>Object(c.a)(this.observers,t)))}_checkFinalizedStatuses(t){const{hasError:e,thrownError:n,isStopped:r}=this;e?t.error(n):r&&t.complete()}asObservable(){const t=new r.a;return t.source=this,t}}u.create=(t,e)=>new a(t,e);class a extends u{constructor(t,e){super(),this.destination=t,this.source=e}next(t){var e,n;null===(n=null===(e=this.destination)||void 0===e?void 0:e.next)||void 0===n||n.call(e,t)}error(t){var e,n;null===(n=null===(e=this.destination)||void 0===e?void 0:e.error)||void 0===n||n.call(e,t)}complete(){var t,e;null===(e=null===(t=this.destination)||void 0===t?void 0:t.complete)||void 0===e||e.call(t)}_subscribe(t){var e,n;return null!==(n=null===(e=this.source)||void 0===e?void 0:e.subscribe(t))&&void 0!==n?n:i.a}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(32);var i=n(15),o=n(8);function s(...t){return Object(r.a)(1)(Object(i.a)(t,Object(o.c)(t)))}},function(t,e,n){"use strict"; +/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var r=/["'&<>]/;t.exports=function(t){var e,n=""+t,i=r.exec(n);if(!i)return n;var o="",s=0,c=0;for(s=i.index;s{Error.call(t),t.stack=(new Error).stack});return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return o}));var r=n(9);function i(...t){return o(t)}function o(t){return 0===t.length?r.a:1===t.length?t[0]:function(e){return t.reduce((t,e)=>e(t),e)}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));const r={now:()=>(r.delegate||Date).now(),delegate:void 0}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return Object(r.b)((n,r)=>{let o=0;n.subscribe(new i.a(r,n=>{r.next(t.call(e,n,o++))}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(2);function i(t){return t&&Object(r.a)(t.schedule)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(17),i=n(9);function o(t=1/0){return Object(r.a)(i.a,t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(7);class i extends r.b{constructor(t,e){super()}schedule(t,e=0){return this}}const o={setInterval(...t){const{delegate:e}=o;return((null==e?void 0:e.setInterval)||setInterval)(...t)},clearInterval(t){const{delegate:e}=o;return((null==e?void 0:e.clearInterval)||clearInterval)(t)},delegate:void 0};var s=n(11);class c extends i{constructor(t,e){super(t,e),this.scheduler=t,this.work=e,this.pending=!1}schedule(t,e=0){if(this.closed)return this;this.state=t;const n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,e)),this.pending=!0,this.delay=e,this.id=this.id||this.requestAsyncId(r,this.id,e),this}requestAsyncId(t,e,n=0){return o.setInterval(t.flush.bind(t,this),n)}recycleAsyncId(t,e,n=0){if(null!=n&&this.delay===n&&!1===this.pending)return e;o.clearInterval(e)}execute(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(t,e){let n,r=!1;try{this.work(t)}catch(t){r=!0,n=!!t&&t||new Error(t)}if(r)return this.unsubscribe(),n}unsubscribe(){if(!this.closed){const{id:t,scheduler:e}=this,{actions:n}=e;this.work=this.state=this.scheduler=null,this.pending=!1,Object(s.a)(n,this),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null,super.unsubscribe()}}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(5),i=n(23),o=n(31);function s(t=0,e,n=i.a){let s=-1;return null!=e&&(Object(o.a)(e)?n=e:s=e),new r.a(e=>{let r=(i=t)instanceof Date&&!isNaN(i)?+t-n.now():t;var i;r<0&&(r=0);let o=0;return n.schedule((function(){e.closed||(e.next(o++),0<=s?this.schedule(void 0,s):e.complete())}),r)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(29);class i{constructor(t,e=i.now){this.schedulerActionCtor=t,this.now=e}schedule(t,e=0,n){return new this.schedulerActionCtor(this,t).schedule(n,e)}}i.now=r.a.now;class o extends i{constructor(t,e=i.now){super(t,e),this.actions=[],this.active=!1,this.scheduled=void 0}flush(t){const{actions:e}=this;if(this.active)return void e.push(t);let n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(6),i=n(0),o=n(1);function s(t,e){return Object(i.b)((n,i)=>{let s=null,c=0,u=!1;const a=()=>u&&!s&&i.complete();n.subscribe(new o.a(i,n=>{null==s||s.unsubscribe();let u=0;const l=c++;Object(r.c)(t(n,l)).subscribe(s=new o.a(i,t=>i.next(e?e(n,t,l,u++):t),void 0,()=>{s=null,a()}))},void 0,()=>{u=!0,a()}))})}},function(t,e,n){ +/*! + * clipboard.js v2.0.6 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +var r;r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=6)}([function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(t),r.removeAllRanges(),r.addRange(i),e=r.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var r=this.e||(this.e={});return(r[t]||(r[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var r=this;function i(){r.off(t,i),e.apply(n,arguments)}return i._=e,this.on(t,i,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),r=0,i=n.length;r0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=i()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=i()(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":o(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}(),u=n(1),a=n.n(u),l=n(2),d=n.n(l),f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===f(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=d()(t,"click",(function(t){return e.onClick(t)}))}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return v("action",t)}},{key:"defaultTarget",value:function(t){var e=v("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return v("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach((function(t){n=n&&!!document.queryCommandSupported(t)})),n}}]),e}(a.a);function v(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}e.default=b}]).default},t.exports=r()},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(24),i=n(29);class o extends r.a{constructor(t=1/0,e=1/0,n=i.a){super(),this.bufferSize=t,this.windowTime=e,this.timestampProvider=n,this.buffer=[],this.infiniteTimeWindow=!0,this.infiniteTimeWindow=e===1/0,this.bufferSize=Math.max(1,t),this.windowTime=Math.max(1,e)}next(t){const{isStopped:e,buffer:n,infiniteTimeWindow:r,timestampProvider:i,windowTime:o}=this;e||(n.push(t),!r&&n.push(i.now()+o)),this.trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this.trimBuffer();const e=this._innerSubscribe(t),{infiniteTimeWindow:n,buffer:r}=this,i=r.slice();for(let e=0;e0},t.prototype.connect_=function(){r&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),c?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},t.prototype.disconnect_=function(){r&&this.connected_&&(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},t.prototype.onTransitionEnd_=function(t){var e=t.propertyName,n=void 0===e?"":e;s.some((function(t){return!!~n.indexOf(t)}))&&this.refresh()},t.getInstance=function(){return this.instance_||(this.instance_=new t),this.instance_},t.instance_=null,t}(),a=function(t,e){for(var n=0,r=Object.keys(e);n0},t}(),_="undefined"!=typeof WeakMap?new WeakMap:new n,O=function t(e){if(!(this instanceof t))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=u.getInstance(),r=new g(e,n,this);_.set(this,r)};["observe","unobserve","disconnect"].forEach((function(t){O.prototype[t]=function(){var e;return(e=_.get(this))[t].apply(e,arguments)}}));var j=void 0!==i.ResizeObserver?i.ResizeObserver:O;e.a=j}).call(this,n(46))},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(5),i=n(6);function o(t){return new r.a(e=>{Object(i.c)(t()).subscribe(e)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return Object(r.b)((n,r)=>{let o=0;n.subscribe(new i.a(r,n=>t.call(e,n,o++)&&r.next(n)))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(12),i=n(0),o=n(1);function s(t){return t<=0?()=>r.a:Object(i.b)((e,n)=>{let r=0;e.subscribe(new o.a(n,e=>{++r<=t&&(n.next(e),t<=r&&n.complete())}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e){return t=null!=t?t:s,Object(r.b)((n,r)=>{let o,s=!0;n.subscribe(new i.a(r,n=>{(s&&(o=n,1)||!t(o,o=e?e(n):n))&&r.next(n),s=!1}))})}function s(t,e){return t===e}},function(t,e,n){"use strict";n.d(e,"a",(function(){return b})),n.d(e,"b",(function(){return p}));var r=n(5);const{isArray:i}=Array,{getPrototypeOf:o,prototype:s,keys:c}=Object;function u(t){if(1===t.length){const n=t[0];if(i(n))return{args:n,keys:null};if((e=n)&&"object"==typeof e&&o(e)===s){const t=c(n);return{args:t.map(t=>n[t]),keys:t}}}var e;return{args:t,keys:null}}var a=n(16),l=n(6),d=n(9),f=n(19),h=n(8);function b(...t){const e=Object(h.c)(t),n=Object(h.b)(t),{args:i,keys:o}=u(t),s=new r.a(p(i,e,o?t=>{const e={};for(let n=0;n{m(e,()=>{const{length:i}=t,o=new Array(i);let s=i;const c=t.map(()=>!1);let u=!0;for(let a=0;a{Object(l.a)(t[a],e).subscribe(new v(r,t=>{o[a]=t,u&&(c[a]=!0,u=!c.every(d.a)),u||r.next(n(o.slice()))},()=>0==--s))},r)}},r)}}function m(t,e,n){t?n.add(t.schedule(e)):e()}},function(t,e,n){!function(){"use strict";function t(t){var e=!0,n=!1,r=null,i={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function o(t){return!!(t&&t!==document&&"HTML"!==t.nodeName&&"BODY"!==t.nodeName&&"classList"in t&&"contains"in t.classList)}function s(t){t.classList.contains("focus-visible")||(t.classList.add("focus-visible"),t.setAttribute("data-focus-visible-added",""))}function c(t){e=!1}function u(){document.addEventListener("mousemove",a),document.addEventListener("mousedown",a),document.addEventListener("mouseup",a),document.addEventListener("pointermove",a),document.addEventListener("pointerdown",a),document.addEventListener("pointerup",a),document.addEventListener("touchmove",a),document.addEventListener("touchstart",a),document.addEventListener("touchend",a)}function a(t){t.target.nodeName&&"html"===t.target.nodeName.toLowerCase()||(e=!1,document.removeEventListener("mousemove",a),document.removeEventListener("mousedown",a),document.removeEventListener("mouseup",a),document.removeEventListener("pointermove",a),document.removeEventListener("pointerdown",a),document.removeEventListener("pointerup",a),document.removeEventListener("touchmove",a),document.removeEventListener("touchstart",a),document.removeEventListener("touchend",a))}document.addEventListener("keydown",(function(n){n.metaKey||n.altKey||n.ctrlKey||(o(t.activeElement)&&s(t.activeElement),e=!0)}),!0),document.addEventListener("mousedown",c,!0),document.addEventListener("pointerdown",c,!0),document.addEventListener("touchstart",c,!0),document.addEventListener("visibilitychange",(function(t){"hidden"===document.visibilityState&&(n&&(e=!0),u())}),!0),u(),t.addEventListener("focus",(function(t){var n,r,c;o(t.target)&&(e||(n=t.target,r=n.type,"INPUT"===(c=n.tagName)&&i[r]&&!n.readOnly||"TEXTAREA"===c&&!n.readOnly||n.isContentEditable))&&s(t.target)}),!0),t.addEventListener("blur",(function(t){var e;o(t.target)&&(t.target.classList.contains("focus-visible")||t.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(r),r=window.setTimeout((function(){n=!1}),100),(e=t.target).hasAttribute("data-focus-visible-added")&&(e.classList.remove("focus-visible"),e.removeAttribute("data-focus-visible-added")))}),!0),t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host?t.host.setAttribute("data-js-focus-visible",""):t.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if("undefined"!=typeof window&&"undefined"!=typeof document){var e;window.applyFocusVisiblePolyfill=t;try{e=new CustomEvent("focus-visible-polyfill-ready")}catch(t){(e=document.createEvent("CustomEvent")).initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(e)}"undefined"!=typeof document&&t(document)}()},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},,,,,function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(5),i=n(17),o=n(20),s=n(2),c=n(19),u=n(15);const a=["addListener","removeListener"],l=["addEventListener","removeEventListener"],d=["on","off"];function f(t,e,n,b){if(Object(s.a)(n)&&(b=n,n=void 0),b)return f(t,e,n).pipe(Object(c.a)(b));const[v,p]=function(t){return Object(s.a)(t.addEventListener)&&Object(s.a)(t.removeEventListener)}(t)?l.map(r=>i=>t[r](e,i,n)):function(t){return Object(s.a)(t.addListener)&&Object(s.a)(t.removeListener)}(t)?a.map(h(t,e)):function(t){return Object(s.a)(t.on)&&Object(s.a)(t.off)}(t)?d.map(h(t,e)):[];return!v&&Object(o.a)(t)?Object(i.a)(t=>f(t,e,n))(Object(u.a)(t)):new r.a(t=>{if(!v)throw new TypeError("Invalid event target");const e=(...e)=>t.next(1p(e)})}function h(t,e){return n=>r=>t[n](e,r)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t){return Object(r.b)((e,n)=>{e.subscribe(new i.a(n,()=>n.next(t)))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(32),i=n(15),o=n(22),s=n(6),c=n(12),u=n(8);function a(...t){const e=Object(u.c)(t),n=Object(u.a)(t,1/0);return(t=Object(o.a)(t)).length?1===t.length?Object(s.c)(t[0]):Object(r.a)(n)(Object(i.a)(t,e)):c.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(25),i=n(8),o=n(0);function s(...t){const e=Object(i.c)(t);return Object(o.b)((n,i)=>{(e?Object(r.a)(t,n,e):Object(r.a)(t,n)).subscribe(i)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(15),i=n(21),o=n(8);function s(...t){const e=Object(o.c)(t);return e?Object(i.a)(t,e):Object(r.a)(t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(5),i=n(10);const o=new r.a(i.a)},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(0);function i(t){return Object(r.b)((e,n)=>{e.subscribe(n),n.add(t)})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(38),i=n(0);function o(t,e,n){let o;return o=t&&"object"==typeof t?t:{bufferSize:t,windowTime:e,refCount:!1,scheduler:n},Object(i.b)(function({bufferSize:t=1/0,windowTime:e=1/0,refCount:n,scheduler:i}){let o,s,c=0;return(u,a)=>{let l;c++,o?l=o.subscribe(a):(o=new r.a(t,e,i),l=o.subscribe(a),s=u.subscribe({next(t){o.next(t)},error(t){const e=o;s=void 0,o=void 0,e.error(t)},complete(){s=void 0,o.complete()}}),s.closed&&(s=void 0)),a.add(()=>{c--,l.unsubscribe(),n&&0===c&&s&&(s.unsubscribe(),s=void 0,o=void 0)})}}(o))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(2),i=n(0),o=n(1),s=n(9);function c(t,e,n){const c=Object(r.a)(t)||e||n?{next:t,error:e,complete:n}:t;return c?Object(i.b)((t,e)=>{t.subscribe(new o.a(e,t=>{var n;null===(n=c.next)||void 0===n||n.call(c,t),e.next(t)},t=>{var n;null===(n=c.error)||void 0===n||n.call(c,t),e.error(t)},()=>{var t;null===(t=c.complete)||void 0===t||t.call(c),e.complete()}))}):s.a}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(24);class i extends r.a{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){const e=super._subscribe(t);return!e.closed&&t.next(this._value),e}getValue(){const{hasError:t,thrownError:e,_value:n}=this;if(t)throw e;return this._throwIfClosed(),n}next(t){super.next(this._value=t)}}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(43);function i(t,e){return Object(r.a)((n,r)=>e?e(n[t],r[t]):n[t]===r[t])}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));var r=n(0),i=n(1),o=n(6);const s={leading:!0,trailing:!1};function c(t,{leading:e,trailing:n}=s){return Object(r.b)((r,s)=>{let c=!1,u=null,a=null,l=!1;const d=()=>{null==a||a.unsubscribe(),a=null,n&&(h(),l&&s.complete())},f=e=>a=Object(o.c)(t(e)).subscribe(new i.a(s,d,void 0,d)),h=()=>{c&&(s.next(u),!l&&f(u)),c=!1,u=null};r.subscribe(new i.a(s,t=>{c=!0,u=t,(!a||a.closed)&&(e?h():f(t))},void 0,()=>{l=!0,(!(n&&c&&a)||a.closed)&&s.complete()}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(36);function i(t,e){return e?Object(r.a)(()=>t,e):Object(r.a)(()=>t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t,e=0){return Object(r.b)((n,r)=>{n.subscribe(new i.a(r,n=>r.add(t.schedule(()=>r.next(n),e)),n=>r.add(t.schedule(()=>r.error(n),e)),()=>r.add(t.schedule(()=>r.complete(),e))))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(44),i=n(0),o=n(22),s=n(19),c=n(28),u=n(8);function a(...t){return function t(...e){const n=Object(u.b)(e);return n?Object(c.a)(t(...e),Object(s.a)(n)):Object(i.b)((t,n)=>{Object(r.b)([t,...Object(o.a)(e)])(n)})}(...t)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(0),i=n(1),o=n(6),s=n(9),c=n(10),u=n(8);function a(...t){const e=Object(u.b)(t);return Object(r.b)((n,r)=>{const u=t.length,a=new Array(u);let l=t.map(()=>!1),d=!1;n.subscribe(new i.a(r,t=>{if(d){const n=[t,...a];r.next(e?e(...n):n)}}));for(let e=0;e{a[e]=t,d||l[e]||(l[e]=!0,(d=l.every(s.a))&&(l=null))},void 0,c.a))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t){return Object(r.b)((e,n)=>{let r=!1,o=null;e.subscribe(new i.a(n,t=>{r=!0,o=t}));const s=()=>{if(r){r=!1;const t=o;o=null,n.next(t)}};t.subscribe(new i.a(n,s,void 0,s))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));var r=n(41);function i(t){return Object(r.a)((e,n)=>t<=n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(6),i=n(1),o=n(0);function s(t){return Object(o.b)((e,n)=>{let o,c=null,u=!1;c=e.subscribe(new i.a(n,void 0,i=>{o=Object(r.c)(t(i,s(t)(e))),c?(c.unsubscribe(),c=null,o.subscribe(n)):u=!0})),u&&(c.unsubscribe(),c=null,o.subscribe(n))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(0),i=n(1),o=n(11);function s(t,e=null){return e=null!=e?e:t,Object(r.b)((n,r)=>{let s=[],c=0;n.subscribe(new i.a(r,n=>{let i=null;c++%e==0&&s.push([]);for(const e of s)e.push(n),t<=e.length&&(i=null!=i?i:[],i.push(e));if(i)for(const t of i)Object(o.a)(s,t),r.next(t)},void 0,()=>{for(const t of s)r.next(t);r.complete()},()=>{s=null}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(17),i=n(2);function o(t,e){return Object(i.a)(e)?Object(r.a)(t,e,1):Object(r.a)(t,1)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(40),i=n(12);function o(t,e=i.a,n=i.a){return Object(r.a)(()=>t()?e:n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n(0),i=n(1);function o(t=null){return Object(r.b)((e,n)=>{let r=!1;e.subscribe(new i.a(n,t=>{r=!0,n.next(t)},void 0,()=>{r||n.next(t),n.complete()}))})}},function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(5),i=n(7),o=n(0),s=n(1);function c(){return Object(o.b)((t,e)=>{let n=null;t._refCount++;const r=new s.a(e,void 0,void 0,void 0,()=>{if(!t||t._refCount<=0||0<--t._refCount)return void(n=null);const r=t._connection,i=n;n=null,!r||i&&r!==i||r.unsubscribe(),e.unsubscribe()});t.subscribe(r),r.closed||(n=t.connect())})}class u extends r.a{constructor(t,e){super(),this.source=t,this.subjectFactory=e,this._subject=null,this._refCount=0,this._connection=null}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;const{_connection:t}=this;this._subject=this._connection=null,null==t||t.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new i.b;const e=this.getSubject();t.add(this.source.subscribe(new s.a(e,void 0,t=>{this._teardown(),e.error(t)},()=>{this._teardown(),e.complete()},()=>this._teardown()))),t.closed&&(this._connection=null,t=i.b.EMPTY)}return t}refCount(){return c()(this)}}var a=n(2);var l=n(24);function d(){return new l.a}function f(){return t=>c()(function(t,e){const n=Object(a.a)(t)?t:()=>t;return Object(a.a)(e)?Object(o.b)((t,r)=>{const i=n();e(i).subscribe(r).add(t.subscribe(i))}):t=>{const e=new u(t,n);return Object(o.a)(t)&&(e.lift=t.lift),e.source=t,e.subjectFactory=n,e}}(d)(t))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return a}));var r=n(33),i=n(7);const o={schedule(t){let e=requestAnimationFrame,n=cancelAnimationFrame;const{delegate:r}=o;r&&(e=r.requestAnimationFrame,n=r.cancelAnimationFrame);const s=e(e=>{n=void 0,t(e)});return new i.b(()=>null==n?void 0:n(s))},requestAnimationFrame(...t){const{delegate:e}=o;return((null==e?void 0:e.requestAnimationFrame)||requestAnimationFrame)(...t)},cancelAnimationFrame(...t){const{delegate:e}=o;return((null==e?void 0:e.cancelAnimationFrame)||cancelAnimationFrame)(...t)},delegate:void 0};class s extends r.a{constructor(t,e){super(t,e),this.scheduler=t,this.work=e}requestAsyncId(t,e,n=0){return null!==n&&n>0?super.requestAsyncId(t,e,n):(t.actions.push(this),t.scheduled||(t.scheduled=o.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,e,n=0){if(null!=n&&n>0||null==n&&this.delay>0)return super.recycleAsyncId(t,e,n);0===t.actions.length&&(o.cancelAnimationFrame(e),t.scheduled=void 0)}}var c=n(35);class u extends c.a{flush(t){this.active=!0,this.scheduled=void 0;const{actions:e}=this;let n,r=-1;t=t||e.shift();const i=e.length;do{if(n=t.execute(t.state,t.delay))break}while(++rObject(s.a)(e.pipe(Object(c.a)(1),Object(i.b)((t,e)=>{t.subscribe(new o.a(e,u.a))})),n.pipe(a(t))):Object(i.b)((e,n)=>{let r=0,i=!1,s=0;const c=()=>i&&!s&&n.complete();e.subscribe(new o.a(n,e=>{let i=!1;const u=()=>{n.next(e),null==a||a.unsubscribe(),i||(s--,i=!0,c())},a=new o.a(n,u,void 0,u);s++,t(e,r++).subscribe(a)},void 0,()=>{i=!0,c()}))})}var l=n(34);function d(t,e=r.b){const n=Object(l.a)(t,e);return a(()=>n)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var r=n(0),i=n(1);function o(t,e,n,r,o){return(s,c)=>{let u=n,a=e,l=0;s.subscribe(new i.a(c,e=>{const n=l++;a=u?t(a,e,n):(u=!0,e),r&&c.next(a)},void 0,o&&(()=>{u&&c.next(a),c.complete()})))}}function s(t,e){return Object(r.b)(o(t,e,arguments.length>=2,!0))}},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(23),i=n(0),o=n(1),s=n(6);var c=n(34);function u(t,e=r.b){const n=Object(c.a)(t,e);return u=()=>n,Object(i.b)((t,e)=>{let n=!1,r=null,i=null;const c=()=>{if(null==i||i.unsubscribe(),i=null,n){n=!1;const t=r;r=null,e.next(t)}};t.subscribe(new o.a(e,t=>{null==i||i.unsubscribe(),n=!0,r=t,i=new o.a(e,c,void 0,c),Object(s.c)(u(t)).subscribe(i)},void 0,()=>{c(),e.complete()},()=>{r=i=null}))});var u}},function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var r=n(5),i=n(6),o=n(22),s=n(12),c=n(1),u=n(8);var a=n(0);function l(...t){return Object(a.b)((e,n)=>{(function(...t){const e=Object(u.b)(t);return(t=Object(o.a)(t)).length?new r.a(n=>{let r=t.map(()=>[]),o=t.map(()=>!1);n.add(()=>{r=o=null});for(let s=0;!n.closed&&s{if(r[s].push(t),r.every(t=>t.length)){const t=r.map(t=>t.shift());n.next(e?e(...t):t),r.some((t,e)=>!t.length&&o[e])&&n.complete()}},void 0,()=>{o[s]=!0,!r[s].length&&n.complete()}));return()=>{r=o=null}}):s.a})(e,...t).subscribe(n)})}function d(...t){return l(...t)}}]]); \ No newline at end of file diff --git a/latest/assets/stylesheets/main.9526ea36.min.css b/latest/assets/stylesheets/main.9526ea36.min.css new file mode 100644 index 00000000..f1ba1793 --- /dev/null +++ b/latest/assets/stylesheets/main.9526ea36.min.css @@ -0,0 +1 @@ +html{box-sizing:border-box;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}*,*::before,*::after{box-sizing:inherit}body{margin:0}a,button,label,input{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{display:block;box-sizing:content-box;height:.05rem;padding:0;overflow:visible;border:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{margin:0;padding:0;font-size:inherit;background:transparent;border:0}input{border:0;outline:none}:root{--md-default-fg-color: hsla(0, 0%, 0%, 0.87);--md-default-fg-color--light: hsla(0, 0%, 0%, 0.54);--md-default-fg-color--lighter: hsla(0, 0%, 0%, 0.32);--md-default-fg-color--lightest: hsla(0, 0%, 0%, 0.07);--md-default-bg-color: hsla(0, 0%, 100%, 1);--md-default-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-default-bg-color--lighter: hsla(0, 0%, 100%, 0.3);--md-default-bg-color--lightest: hsla(0, 0%, 100%, 0.12);--md-primary-fg-color: hsla(231, 48%, 48%, 1);--md-primary-fg-color--light: hsla(231, 44%, 56%, 1);--md-primary-fg-color--dark: hsla(232, 54%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-accent-fg-color: hsla(231, 99%, 66%, 1);--md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}:root>*{--md-code-fg-color: hsla(200, 18%, 26%, 1);--md-code-bg-color: hsla(0, 0%, 96%, 1);--md-code-hl-color: hsla(60, 100%, 50%, 0.5);--md-code-hl-number-color: hsla(0, 67%, 50%, 1);--md-code-hl-special-color: hsla(340, 83%, 47%, 1);--md-code-hl-function-color: hsla(291, 45%, 50%, 1);--md-code-hl-constant-color: hsla(250, 63%, 60%, 1);--md-code-hl-keyword-color: hsla(219, 54%, 51%, 1);--md-code-hl-string-color: hsla(150, 63%, 30%, 1);--md-code-hl-name-color: var(--md-code-fg-color);--md-code-hl-operator-color: var(--md-default-fg-color--light);--md-code-hl-punctuation-color: var(--md-default-fg-color--light);--md-code-hl-comment-color: var(--md-default-fg-color--light);--md-code-hl-generic-color: var(--md-default-fg-color--light);--md-code-hl-variable-color: var(--md-default-fg-color--light);--md-typeset-color: var(--md-default-fg-color);--md-typeset-a-color: var(--md-primary-fg-color);--md-typeset-mark-color: hsla(60, 100%, 50%, 0.5);--md-typeset-del-color: hsla(6, 90%, 60%, 0.15);--md-typeset-ins-color: hsla(150, 90%, 44%, 0.15);--md-typeset-kbd-color: hsla(0, 0%, 98%, 1);--md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);--md-typeset-kbd-border-color: hsla(0, 0%, 72%, 1);--md-admonition-fg-color: var(--md-default-fg-color);--md-admonition-bg-color: var(--md-default-bg-color);--md-footer-fg-color: hsla(0, 0%, 100%, 1);--md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7);--md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3);--md-footer-bg-color: hsla(0, 0%, 0%, 0.87);--md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32)}.md-icon svg{display:block;width:1.2rem;height:1.2rem;fill:currentColor}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:var(--md-typeset-color);font-feature-settings:"kern","liga";font-family:-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,pre,kbd{color:var(--md-typeset-color);font-feature-settings:"kern";font-family:SFMono-Regular,Consolas,Menlo,monospace}:root{--md-typeset-table--ascending: url("data:image/svg+xml;charset=utf-8,");--md-typeset-table--descending: url("data:image/svg+xml;charset=utf-8,")}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact;color-adjust:exact}@media print{.md-typeset{font-size:.68rem}}.md-typeset p,.md-typeset ul,.md-typeset ol,.md-typeset dl,.md-typeset blockquote{display:flow-root;margin:1em 0}.md-typeset h1{display:flow-root;margin:0 0 1.25em;color:var(--md-default-fg-color--light);font-weight:300;font-size:2em;line-height:1.3;letter-spacing:-0.01em}.md-typeset h2{display:flow-root;margin:1.6em 0 .64em;font-weight:300;font-size:1.5625em;line-height:1.4;letter-spacing:-0.01em}.md-typeset h3{display:flow-root;margin:1.6em 0 .8em;font-weight:400;font-size:1.25em;line-height:1.5;letter-spacing:-0.01em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{display:flow-root;margin:1em 0;font-weight:700;letter-spacing:-0.01em}.md-typeset h5,.md-typeset h6{display:flow-root;margin:1.25em 0;color:var(--md-default-fg-color--light);font-weight:700;font-size:.8em;letter-spacing:-0.01em}.md-typeset h5{text-transform:uppercase}.md-typeset hr{display:flow-root;margin:1.5em 0;border-bottom:.05rem solid var(--md-default-fg-color--lighter)}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a::before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset code,.md-typeset pre,.md-typeset kbd{color:var(--md-code-fg-color);direction:ltr}@media print{.md-typeset code,.md-typeset pre,.md-typeset kbd{white-space:pre-wrap}}.md-typeset code{padding:0 .2941176471em;font-size:.85em;word-break:break-word;background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset code:not(.focus-visible){outline:none;-webkit-tap-highlight-color:transparent}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:initial;padding:initial;background-color:transparent;box-shadow:none}.md-typeset a>code{color:currentColor}.md-typeset pre{position:relative;display:flow-root;margin:1em 0;line-height:1.4}.md-typeset pre>code{display:block;margin:0;padding:.7720588235em 1.1764705882em;overflow:auto;word-break:normal;box-shadow:none;-webkit-box-decoration-break:slice;box-decoration-break:slice;touch-action:auto;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width: 44.9375em){.md-typeset>pre{margin:1em -0.8rem}.md-typeset>pre code{border-radius:0}}.md-typeset kbd{display:inline-block;padding:0 .6666666667em;color:var(--md-default-fg-color);font-size:.75em;vertical-align:text-top;word-break:break-word;background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -0.1rem .2rem var(--md-typeset-kbd-accent-color) inset}.md-typeset mark{color:inherit;word-break:break-word;background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{text-decoration:none;border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help}@media(hover: none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:focus::after,.md-typeset abbr[title]:hover::after{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:absolute;left:0;display:inline-block;width:auto;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;max-width:80%;margin-top:2em;padding:.2rem .3rem;color:var(--md-default-bg-color);font-size:.7rem;background-color:var(--md-default-fg-color);border-radius:.1rem;content:attr(title)}}.md-typeset small{opacity:.75}.md-typeset sup,.md-typeset sub{margin-left:.078125em}[dir=rtl] .md-typeset sup,[dir=rtl] .md-typeset sub{margin-right:.078125em;margin-left:initial}.md-typeset blockquote{padding-left:.6rem;color:var(--md-default-fg-color--light);border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:initial;border-right:.2rem solid var(--md-default-fg-color--lighter);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ul,.md-typeset ol{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ul,[dir=rtl] .md-typeset ol{margin-right:.625em;margin-left:initial}.md-typeset ul ol,.md-typeset ol ol{list-style-type:lower-alpha}.md-typeset ul ol ol,.md-typeset ol ol ol{list-style-type:lower-roman}.md-typeset ul li,.md-typeset ol li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ul li,[dir=rtl] .md-typeset ol li{margin-right:1.25em;margin-left:initial}.md-typeset ul li p,.md-typeset ul li blockquote,.md-typeset ol li p,.md-typeset ol li blockquote{margin:.5em 0}.md-typeset ul li:last-child,.md-typeset ol li:last-child{margin-bottom:0}.md-typeset ul li ul,.md-typeset ul li ol,.md-typeset ol li ul,.md-typeset ol li ol{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ul li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ol li ol{margin-right:.625em;margin-left:initial}.md-typeset dd{margin:1em 0 1.5em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:initial}.md-typeset img,.md-typeset svg{max-width:100%;height:auto}.md-typeset img[align=left],.md-typeset svg[align=left]{margin:1em;margin-left:0}.md-typeset img[align=right],.md-typeset svg[align=right]{margin:1em;margin-right:0}.md-typeset img[align]:only-child,.md-typeset svg[align]:only-child{margin-top:0}.md-typeset figure{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;margin:0 auto;text-align:center}.md-typeset figcaption{max-width:24rem;margin:.5em auto 2em;font-style:italic}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){display:inline-block;max-width:100%;overflow:auto;font-size:.64rem;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1);touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) th>*:first-child,.md-typeset table:not([class]) td>*:first-child{margin-top:0}.md-typeset table:not([class]) th>*:last-child,.md-typeset table:not([class]) td>*:last-child{margin-bottom:0}.md-typeset table:not([class]) th:not([align]),.md-typeset table:not([class]) td:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) th:not([align]),[dir=rtl] .md-typeset table:not([class]) td:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.9375em 1.25em;color:var(--md-default-bg-color);vertical-align:top;background-color:var(--md-default-fg-color--light)}.md-typeset table:not([class]) th a{color:inherit}.md-typeset table:not([class]) td{padding:.9375em 1.25em;vertical-align:top;border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-typeset table:not([class]) tr{transition:background-color 125ms}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}.md-typeset table th[role=columnheader]::after{display:inline-block;width:1.2em;height:1.2em;margin-left:.5em;vertical-align:sub;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset table th[role=columnheader][aria-sort=ascending]::after{background-color:currentColor;-webkit-mask-image:var(--md-typeset-table--ascending);mask-image:var(--md-typeset-table--ascending)}.md-typeset table th[role=columnheader][aria-sort=descending]::after{background-color:currentColor;-webkit-mask-image:var(--md-typeset-table--descending);mask-image:var(--md-typeset-table--descending)}.md-typeset__scrollwrap{margin:1em -0.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{height:100%;font-size:125%}@media screen and (min-width: 100em){html{font-size:137.5%}}@media screen and (min-width: 125em){html{font-size:150%}}body{position:relative;display:flex;flex-direction:column;width:100%;min-height:100%;font-size:.5rem;background-color:var(--md-default-bg-color)}@media print{body{display:block}}@media screen and (max-width: 59.9375em){body[data-md-state=lock]{position:fixed}}.md-grid{max-width:61rem;margin-right:auto;margin-left:auto}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.md-toggle{display:none}.md-skip{position:fixed;z-index:-1;margin:.5rem;padding:.3rem .5rem;color:var(--md-default-bg-color);font-size:.64rem;background-color:var(--md-default-fg-color);border-radius:.1rem;transform:translateY(0.4rem);opacity:0}.md-skip:focus{z-index:10;transform:translateY(0);opacity:1;transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),opacity 175ms 75ms}@page{margin:25mm}.md-announce{overflow:auto;background-color:var(--md-footer-bg-color)}@media print{.md-announce{display:none}}.md-announce__inner{margin:.6rem auto;padding:0 .8rem;color:var(--md-footer-fg-color);font-size:.7rem}.md-typeset .md-button{display:inline-block;padding:.625em 2em;color:var(--md-primary-fg-color);font-weight:700;border:.1rem solid currentColor;border-radius:.1rem;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{color:var(--md-accent-bg-color);background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color)}:root{--md-clipboard-icon: url("data:image/svg+xml;charset=utf-8,")}.md-clipboard{position:absolute;top:.5em;right:.5em;z-index:1;width:1.5em;height:1.5em;color:var(--md-default-fg-color--lightest);border-radius:.1rem;cursor:pointer;transition:color 250ms}@media print{.md-clipboard{display:none}}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard::after{display:block;width:1.125em;height:1.125em;margin:0 auto;background-color:currentColor;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-content{flex-grow:1;overflow:auto;scroll-padding-top:51.2rem}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width: 76.25em){.md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem;margin-left:.8rem}.md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-right:.8rem;margin-left:1.2rem}}.md-content__inner::before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__button{float:right;margin:.4rem 0;margin-left:.4rem;padding:0}@media print{.md-content__button{display:none}}[dir=rtl] .md-content__button{float:left;margin-right:.4rem;margin-left:initial}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}.md-dialog{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;right:.8rem;bottom:.8rem;left:initial;z-index:2;display:block;min-width:11.1rem;padding:.4rem .6rem;color:var(--md-default-bg-color);font-size:.7rem;background-color:var(--md-default-fg-color);border:none;border-radius:.1rem;transform:translateY(100%);opacity:0;transition:transform 0ms 400ms,opacity 400ms}@media print{.md-dialog{display:none}}[dir=rtl] .md-dialog{right:initial;left:.8rem}.md-dialog[data-md-state=open]{transform:translateY(0);opacity:1;transition:transform 400ms cubic-bezier(0.075, 0.85, 0.175, 1),opacity 400ms}.md-header{position:-webkit-sticky;position:sticky;top:0;right:0;left:0;z-index:2;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem rgba(0,0,0,0),0 .2rem .4rem rgba(0,0,0,0);transition:color 250ms,background-color 250ms}@media print{.md-header{display:none}}.md-header[data-md-state=shadow]{box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);transition:transform 250ms cubic-bezier(0.1, 0.7, 0.1, 1),color 250ms,background-color 250ms,box-shadow 250ms}.md-header[data-md-state=hidden]{transform:translateY(-100%);transition:transform 250ms cubic-bezier(0.8, 0, 0.6, 1),color 250ms,background-color 250ms,box-shadow 250ms}.md-header-nav{display:flex;align-items:center;padding:0 .2rem}.md-header-nav__button{position:relative;z-index:1;display:inline-block;margin:.2rem;padding:.4rem;color:currentColor;vertical-align:middle;cursor:pointer;transition:opacity 250ms}.md-header-nav__button:focus,.md-header-nav__button:hover{opacity:.7}.md-header-nav__button:not(.focus-visible){outline:none}.md-header-nav__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width: 76.1875em){.md-header-nav__button.md-logo{display:none}}.md-header-nav__button.md-logo img,.md-header-nav__button.md-logo svg{display:block;width:1.2rem;height:1.2rem;fill:currentColor}@media screen and (min-width: 60em){.md-header-nav__button[for=__search]{display:none}}.no-js .md-header-nav__button[for=__search]{display:none}[dir=rtl] .md-header-nav__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width: 76.25em){.md-header-nav__button[for=__drawer]{display:none}}.md-header-nav__topic{position:absolute;display:flex;max-width:100%;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms}.md-header-nav__topic+.md-header-nav__topic{z-index:-1;transform:translateX(1.25rem);opacity:0;transition:transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1),opacity 150ms;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{transform:translateX(-1.25rem)}.md-header-nav__title{flex-grow:1;height:2.4rem;margin-right:.4rem;margin-left:1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{z-index:-1;transform:translateX(-1.25rem);opacity:0;transition:transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1),opacity 150ms;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{z-index:0;transform:translateX(0);opacity:1;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms;pointer-events:initial}.md-header-nav__title>.md-header-nav__ellipsis{position:relative;width:100%;height:100%}.md-header-nav__options{display:flex;flex-shrink:0;max-width:100%;white-space:nowrap;transition:max-width 0ms 250ms,opacity 250ms 250ms}.md-header-nav__options>[data-md-state=hidden]{display:none}[data-md-toggle=search]:checked~.md-header .md-header-nav__options{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header-nav__source{display:none}@media screen and (min-width: 60em){.md-header-nav__source{display:block;width:11.7rem;max-width:11.7rem;margin-left:1rem}[dir=rtl] .md-header-nav__source{margin-right:1rem;margin-left:initial}}@media screen and (min-width: 76.25em){.md-header-nav__source{margin-left:1.4rem}[dir=rtl] .md-header-nav__source{margin-right:1.4rem}}.md-footer{color:var(--md-footer-fg-color);background-color:var(--md-footer-bg-color)}@media print{.md-footer{display:none}}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{display:flex;padding-top:1.4rem;padding-bottom:.4rem;transition:opacity 250ms}@media screen and (min-width: 45em){.md-footer-nav__link{width:50%}}.md-footer-nav__link:focus,.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{float:left}@media screen and (max-width: 44.9375em){.md-footer-nav__link--prev{width:25%}.md-footer-nav__link--prev .md-footer-nav__title{display:none}}[dir=rtl] .md-footer-nav__link--prev{float:right}[dir=rtl] .md-footer-nav__link--prev svg{transform:scaleX(-1)}.md-footer-nav__link--next{float:right;text-align:right}@media screen and (max-width: 44.9375em){.md-footer-nav__link--next{width:75%}}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}[dir=rtl] .md-footer-nav__link--next svg{transform:scaleX(-1)}.md-footer-nav__title{position:relative;flex-grow:1;max-width:calc(100% - 2.4rem);padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__button{margin:.2rem;padding:.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-footer-copyright{width:100%;margin:auto .6rem;padding:.4rem 0;color:var(--md-footer-fg-color--lighter);font-size:.64rem}@media screen and (min-width: 45em){.md-footer-copyright{width:auto}}.md-footer-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width: 45em){.md-footer-social{padding:.6rem 0}}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;text-align:center}.md-footer-social__link::before{line-height:1.9}.md-footer-social__link svg{max-height:.8rem;vertical-align:-25%;fill:currentColor}:root{--md-nav-icon--prev: url("data:image/svg+xml;charset=utf-8,");--md-nav-icon--next: url("data:image/svg+xml;charset=utf-8,");--md-toc-icon: url("data:image/svg+xml;charset=utf-8,")}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;overflow:hidden;font-weight:700;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{width:auto;height:100%}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{display:block;width:2.4rem;height:2.4rem;fill:currentColor}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__link{display:block;margin-top:.625em;overflow:hidden;text-overflow:ellipsis;cursor:pointer;transition:color 125ms;scroll-snap-align:start}.md-nav__link[data-md-state=blur]{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon::after{display:block;width:100%;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);background-color:currentColor}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__source{display:none}@media screen and (max-width: 76.1875em){.md-nav--primary,.md-nav--primary .md-nav{position:absolute;top:0;right:0;left:0;z-index:1;display:flex;flex-direction:column;height:100%;background-color:var(--md-default-bg-color)}.md-nav--primary .md-nav__title,.md-nav--primary .md-nav__item{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;color:var(--md-default-fg-color--light);font-weight:400;line-height:2.4rem;white-space:nowrap;background-color:var(--md-default-fg-color--lightest);cursor:pointer}.md-nav--primary .md-nav__title .md-nav__icon{position:absolute;top:.4rem;left:.4rem;display:block;width:1.2rem;height:1.2rem;margin:.2rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem;left:initial}.md-nav--primary .md-nav__title .md-nav__icon::after{display:block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-nav--primary .md-nav__title~.md-nav__list{overflow-y:auto;background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color)}.md-nav--primary .md-nav__title .md-logo{position:absolute;top:.2rem;left:.2rem;display:block;margin:.2rem;padding:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-logo{right:.2rem;left:initial}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link .md-nav__icon{position:absolute;top:50%;right:.6rem;width:1.2rem;height:1.2rem;margin-top:-0.6rem;color:inherit;font-size:1.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{right:initial;left:.6rem}.md-nav--primary .md-nav__link .md-nav__icon::after{display:block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-nav--primary .md-nav__icon::after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:initial}.md-nav--secondary{background-color:transparent}.md-nav__toggle~.md-nav{display:flex;transform:translateX(100%);opacity:0;transition:transform 250ms cubic-bezier(0.8, 0, 0.6, 1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{transform:translateX(0);opacity:1;transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width: 59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__link[for=__toc]{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__link[for=__toc] .md-icon::after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{display:block;padding:0 .2rem;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color--dark)}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:block;padding-right:2.4rem;scroll-snap-align:initial}[dir=rtl] .md-nav--integrated .md-nav__link[for=__toc]{padding-right:.8rem;padding-left:2.4rem}.md-nav--integrated .md-nav__link[for=__toc] .md-icon::after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width: 60em){.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width: 76.25em){.md-nav{transition:max-height 250ms cubic-bezier(0.86, 0, 0.07, 1)}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__title{display:block;padding:0;pointer-events:none;scroll-snap-align:start}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{float:right;width:.9rem;height:.9rem;transition:transform 250ms}[dir=rtl] .md-nav__icon{float:left;transform:rotate(180deg)}.md-nav__icon::after{display:inline-block;width:100%;height:100%;vertical-align:-0.1rem;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav>.md-nav__title{display:block;padding:0 .6rem;pointer-events:none;scroll-snap-align:start}.md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav__item{padding-right:.6rem}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:block;margin-bottom:1.25em;border-left:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav>.md-nav__title{display:none}}:root{--md-search-result-icon: url("data:image/svg+xml;charset=utf-8,")}.md-search{position:relative}@media screen and (min-width: 60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{z-index:1;opacity:0}@media screen and (max-width: 59.9375em){.md-search__overlay{position:absolute;top:.2rem;left:-2.2rem;width:2rem;height:2rem;overflow:hidden;background-color:var(--md-default-bg-color);border-radius:1rem;transform-origin:center;transition:transform 300ms 100ms,opacity 200ms 200ms;pointer-events:none}[dir=rtl] .md-search__overlay{right:-2.2rem;left:initial}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform 400ms,opacity 100ms}}@media screen and (min-width: 60em){.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;background-color:rgba(0,0,0,.54);cursor:pointer;transition:width 0ms 250ms,height 0ms 250ms,opacity 250ms}[dir=rtl] .md-search__overlay{right:0;left:initial}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;opacity:1;transition:width 0ms,height 0ms,opacity 250ms}}@media screen and (max-width: 29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width: 30em)and (max-width: 44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width: 45em)and (max-width: 59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width: 59.9375em){.md-search__inner{position:fixed;top:0;left:100%;z-index:2;width:100%;height:100%;transform:translateX(5%);opacity:0;transition:right 0ms 300ms,left 0ms 300ms,transform 150ms 150ms cubic-bezier(0.4, 0, 0.2, 1),opacity 150ms 150ms}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;transform:translateX(0);opacity:1;transition:right 0ms 0ms,left 0ms 0ms,transform 150ms 150ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms 150ms}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:initial}html [dir=rtl] .md-search__inner{right:100%;left:initial;transform:translateX(-5%)}}@media screen and (min-width: 60em){.md-search__inner{position:relative;float:right;width:11.7rem;padding:.1rem 0;transition:width 250ms cubic-bezier(0.1, 0.7, 0.1, 1)}[dir=rtl] .md-search__inner{float:left}}@media screen and (min-width: 60em)and (max-width: 76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width: 76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{position:relative;z-index:2;height:2.4rem;background-color:var(--md-default-bg-color);transition:color 250ms,background-color 250ms}@media screen and (min-width: 60em){.md-search__form{height:1.8rem;background-color:rgba(0,0,0,.26);border-radius:.1rem}.md-search__form:hover{background-color:rgba(255,255,255,.12)}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0}.md-search__input{position:relative;z-index:2;width:100%;height:100%;padding:0 2.2rem 0 3.6rem;font-size:.9rem;text-overflow:ellipsis;background:transparent}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{-webkit-transition:color 250ms;transition:color 250ms}.md-search__input::-moz-placeholder{-moz-transition:color 250ms;transition:color 250ms}.md-search__input::-ms-input-placeholder{-ms-transition:color 250ms;transition:color 250ms}.md-search__input::placeholder{transition:color 250ms}.md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input~.md-search__icon,.md-search__input::placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (min-width: 60em){.md-search__input{padding-left:2.2rem;color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input::-webkit-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{color:var(--md-default-fg-color);text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__suggest{position:absolute;top:0;display:flex;align-items:center;width:100%;height:100%;padding:0 2.2rem 0 3.6rem;color:var(--md-default-fg-color--lighter);font-size:.9rem;white-space:nowrap;opacity:0;transition:opacity 50ms}[dir=rtl] .md-search__suggest{padding:0 3.6rem 0 2.2rem}@media screen and (min-width: 60em){.md-search__suggest{padding-left:2.2rem;font-size:.8rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity 300ms 100ms}.md-search__icon{position:absolute;z-index:2;width:1.2rem;height:1.2rem;cursor:pointer;transition:color 250ms,opacity 250ms}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:initial}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width: 59.9375em){.md-search__icon[for=__search]{top:.6rem;left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem;left:initial}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width: 60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}.md-search__icon[type=reset]{top:.3rem;right:.5rem;transform:scale(0.75);opacity:0;transition:transform 150ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms;pointer-events:none}[dir=rtl] .md-search__icon[type=reset]{right:initial;left:.5rem}@media screen and (max-width: 59.9375em){.md-search__icon[type=reset]{top:.6rem;right:.8rem}[dir=rtl] .md-search__icon[type=reset]{right:initial;left:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{transform:scale(1);opacity:1;pointer-events:initial}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;z-index:1;width:100%;overflow:hidden;border-radius:0 0 .1rem .1rem}@media screen and (max-width: 59.9375em){.md-search__output{top:2.4rem;bottom:0}}@media screen and (min-width: 60em){.md-search__output{top:1.9rem;opacity:0;transition:opacity 400ms}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}}.md-search__scrollwrap{height:100%;overflow-y:auto;background-color:var(--md-default-bg-color);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}@media(-webkit-max-device-pixel-ratio: 1), (max-resolution: 1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width: 76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width: 60em){.md-search__scrollwrap{max-height:0;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{padding:0 .8rem;color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;background-color:var(--md-default-fg-color--lightest);scroll-snap-align:start}@media screen and (min-width: 60em){.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:initial}}.md-search-result__list{margin:0;padding:0;list-style:none}.md-search-result__item{box-shadow:0 -0.05rem 0 var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;transition:background-color 250ms;scroll-snap-align:start}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{display:block;padding:.75em .8rem;color:var(--md-typeset-a-color);font-size:.64rem;outline:0;cursor:pointer;transition:color 250ms,background-color 250ms;scroll-snap-align:start}@media screen and (min-width: 60em){.md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem;padding-left:.8rem}}.md-search-result__more summary:focus,.md-search-result__more summary:hover{color:var(--md-accent-fg-color);background-color:var(--md-accent-fg-color--transparent)}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{position:relative;padding:0 .8rem;overflow:hidden}@media screen and (min-width: 60em){.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-weight:400;font-size:.8rem;line-height:1.4}.md-search-result__icon{position:absolute;left:0;width:1.2rem;height:1.2rem;margin:.5rem;color:var(--md-default-fg-color--light)}@media screen and (max-width: 59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon::after{display:inline-block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-search-result__icon{right:0;left:initial}[dir=rtl] .md-search-result__icon::after{transform:scaleX(-1)}.md-search-result__title{margin:.5em 0;font-weight:700;font-size:.64rem;line-height:1.6}.md-search-result__teaser{display:-webkit-box;max-height:2rem;margin:.5em 0;overflow:hidden;color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}@media screen and (max-width: 44.9375em){.md-search-result__teaser{max-height:3rem;-webkit-line-clamp:3}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-search-result__teaser{max-height:3rem;-webkit-line-clamp:3}}.md-search-result__teaser mark{text-decoration:underline;background-color:transparent}.md-search-result__terms{margin:.5em 0;font-size:.64rem;font-style:italic}.md-search-result mark{color:var(--md-accent-fg-color);background-color:transparent}.md-select{position:relative;z-index:1}.md-select__inner{position:absolute;top:calc(100% - 0.2rem);left:50%;max-height:0;margin-top:.2rem;color:var(--md-default-fg-color);background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.1),0 0 .05rem rgba(0,0,0,.25);transform:translate3d(-50%, 0.3rem, 0);opacity:0;transition:transform 250ms 375ms,opacity 250ms 250ms,max-height 0ms 500ms}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;transform:translate3d(-50%, 0, 0);opacity:1;transition:transform 250ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 250ms,max-height 250ms}.md-select__inner::after{position:absolute;top:0;left:50%;width:0;height:0;margin-top:-0.2rem;margin-left:-0.2rem;border:.2rem solid transparent;border-top:0;border-bottom-color:var(--md-default-bg-color);content:""}.md-select__list{max-height:inherit;margin:0;padding:0;overflow:auto;font-size:.8rem;list-style-type:none;border-radius:.1rem}.md-select__item{line-height:1.8rem}.md-select__link{display:block;width:100%;padding-right:1.2rem;padding-left:.6rem;cursor:pointer;transition:background-color 250ms,color 250ms;scroll-snap-align:start}[dir=rtl] .md-select__link{padding-right:.6rem;padding-left:1.2rem}.md-select__link:focus,.md-select__link:hover{background-color:var(--md-default-fg-color--lightest)}@-webkit-keyframes md-sidebar__scrollwrap--hack{0%,99%{-webkit-scroll-snap-type:none;scroll-snap-type:none}100%{-webkit-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}}@keyframes md-sidebar__scrollwrap--hack{0%,99%{-webkit-scroll-snap-type:none;-ms-scroll-snap-type:none;scroll-snap-type:none}100%{-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}}.md-sidebar{position:-webkit-sticky;position:sticky;top:2.4rem;flex-shrink:0;align-self:flex-start;width:12.1rem;height:0;padding:1.2rem 0}@media print{.md-sidebar{display:none}}@media screen and (max-width: 76.1875em){.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;z-index:3;display:block;width:12.1rem;height:100%;background-color:var(--md-default-bg-color);transform:translateX(0);transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 250ms}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:initial}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{position:absolute;top:0;right:0;bottom:0;left:0;margin:0;-webkit-scroll-snap-type:none;-ms-scroll-snap-type:none;scroll-snap-type:none;overflow:hidden}}@media screen and (min-width: 76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width: 60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}.js .md-sidebar__scrollwrap{-webkit-animation:md-sidebar__scrollwrap--hack 1000ms forwards;animation:md-sidebar__scrollwrap--hack 1000ms forwards}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width: 76.1875em){.md-overlay{position:fixed;top:0;z-index:3;width:0;height:0;background-color:rgba(0,0,0,.54);opacity:0;transition:width 0ms 250ms,height 0ms 250ms,opacity 250ms}[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;opacity:1;transition:width 0ms,height 0ms,opacity 250ms}}@-webkit-keyframes md-source__facts--done{0%{height:0}100%{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}100%{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{transform:translateY(100%);opacity:0}50%{opacity:0}100%{transform:translateY(0%);opacity:1}}@keyframes md-source__fact--done{0%{transform:translateY(100%);opacity:0}50%{opacity:0}100%{transform:translateY(0%);opacity:1}}.md-source{display:block;font-size:.65rem;line-height:1.2;white-space:nowrap;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:opacity 250ms}.md-source:focus,.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;width:2.4rem;height:2.4rem;vertical-align:middle}.md-source__icon svg{margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:initial}.md-source__icon+.md-source__repository{margin-left:-2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem;margin-left:initial;padding-right:2rem;padding-left:initial}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);margin-left:.6rem;overflow:hidden;font-weight:700;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{margin:0;padding:0;overflow:hidden;font-weight:700;font-size:.55rem;list-style-type:none;opacity:.75}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done 250ms ease-in;animation:md-source__facts--done 250ms ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done 400ms ease-out;animation:md-source__fact--done 400ms ease-out}.md-source__fact::before{margin:0 .1rem;content:"·"}.md-source__fact:first-child::before{display:none}.md-tabs{width:100%;overflow:auto;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);transition:background-color 250ms}@media print{.md-tabs{display:none}}@media screen and (max-width: 76.1875em){.md-tabs{display:none}}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{transform:translateY(50%);opacity:0;transition:transform 0ms 100ms,opacity 100ms}.md-tabs__list{margin:0;margin-left:.2rem;padding:0;white-space:nowrap;list-style:none;contain:content}[dir=rtl] .md-tabs__list{margin-right:.2rem;margin-left:initial}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;font-size:.7rem;-webkit-backface-visibility:hidden;backface-visibility:hidden;opacity:.7;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 250ms}.md-tabs__link--active,.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:100ms}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:120ms}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:140ms}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:160ms}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:180ms}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:200ms}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:220ms}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:240ms}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:260ms}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:280ms}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:300ms}:root{--md-version-icon: url( "data:image/svg+xml;charset=utf-8," )}.md-version{flex-shrink:0;height:2.4rem;font-size:.8rem}.md-version__current{position:relative;top:.05rem;margin-right:.4rem;margin-left:1.4rem}[dir=rtl] .md-version__current{margin-right:1.4rem;margin-left:.4rem}.md-version__current::after{display:inline-block;width:.4rem;height:.6rem;margin-left:.4rem;background-color:currentColor;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:""}[dir=rtl] .md-version__current::after{margin-right:.4rem;margin-left:initial}.md-version__list{position:absolute;top:.15rem;max-height:1.8rem;margin:.2rem .8rem;padding:0;overflow:auto;color:var(--md-default-fg-color);list-style-type:none;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.1),0 0 .05rem rgba(0,0,0,.25);opacity:0;transition:max-height 0ms 500ms,opacity 250ms 250ms;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.md-version__list:focus-within,.md-version__list:hover{max-height:10rem;opacity:1;transition:max-height 250ms,opacity 250ms}.md-version__item{line-height:1.8rem}.md-version__link{display:block;width:100%;padding-right:1.2rem;padding-left:.6rem;cursor:pointer;transition:color 250ms,background-color 250ms;scroll-snap-align:start}[dir=rtl] .md-version__link{padding-right:.6rem;padding-left:1.2rem}.md-version__link:focus,.md-version__link:hover{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--abstract: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--info: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--tip: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--success: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--question: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--warning: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--failure: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--danger: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--bug: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--example: url( "data:image/svg+xml;charset=utf-8," );--md-admonition-icon--quote: url( "data:image/svg+xml;charset=utf-8," )}.md-typeset .admonition,.md-typeset details{margin:1.5625em 0;padding:0 .6rem;overflow:hidden;color:var(--md-admonition-fg-color);font-size:.64rem;page-break-inside:avoid;background-color:var(--md-admonition-bg-color);border-left:.2rem solid #448aff;border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 .025rem .05rem rgba(0,0,0,.05)}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}.md-typeset .admonition .admonition,.md-typeset details .admonition,.md-typeset .admonition details,.md-typeset details details{margin:1em 0}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -0.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition-title,.md-typeset summary{position:relative;margin:0 -0.6rem 0 -0.8rem;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(68,138,255,.1);border-left:.2rem solid #448aff}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{margin:0 -0.8rem 0 -0.6rem;padding:.4rem 2rem .4rem .6rem;border-right:.2rem solid #448aff;border-left:none}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}.md-typeset .admonition-title::before,.md-typeset summary::before{position:absolute;left:.6rem;width:1rem;height:1rem;background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .admonition-title::before,[dir=rtl] .md-typeset summary::before{right:.6rem;left:initial}.md-typeset .admonition-title code,.md-typeset summary code{margin:initial;padding:initial;color:currentColor;background-color:transparent;border-radius:initial;box-shadow:none}.md-typeset .admonition-title+.tabbed-set:last-child,.md-typeset summary+.tabbed-set:last-child{margin-top:0}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:rgba(68,138,255,.1);border-color:#448aff}.md-typeset .note>.admonition-title::before,.md-typeset .note>summary::before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.abstract,.md-typeset details.abstract,.md-typeset .admonition.tldr,.md-typeset details.tldr,.md-typeset .admonition.summary,.md-typeset details.summary{border-color:#00b0ff}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary,.md-typeset .tldr>.admonition-title,.md-typeset .tldr>summary,.md-typeset .summary>.admonition-title,.md-typeset .summary>summary{background-color:rgba(0,176,255,.1);border-color:#00b0ff}.md-typeset .abstract>.admonition-title::before,.md-typeset .abstract>summary::before,.md-typeset .tldr>.admonition-title::before,.md-typeset .tldr>summary::before,.md-typeset .summary>.admonition-title::before,.md-typeset .summary>summary::before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.info,.md-typeset details.info,.md-typeset .admonition.todo,.md-typeset details.todo{border-color:#00b8d4}.md-typeset .info>.admonition-title,.md-typeset .info>summary,.md-typeset .todo>.admonition-title,.md-typeset .todo>summary{background-color:rgba(0,184,212,.1);border-color:#00b8d4}.md-typeset .info>.admonition-title::before,.md-typeset .info>summary::before,.md-typeset .todo>.admonition-title::before,.md-typeset .todo>summary::before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.tip,.md-typeset details.tip,.md-typeset .admonition.important,.md-typeset details.important,.md-typeset .admonition.hint,.md-typeset details.hint{border-color:#00bfa5}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary,.md-typeset .important>.admonition-title,.md-typeset .important>summary,.md-typeset .hint>.admonition-title,.md-typeset .hint>summary{background-color:rgba(0,191,165,.1);border-color:#00bfa5}.md-typeset .tip>.admonition-title::before,.md-typeset .tip>summary::before,.md-typeset .important>.admonition-title::before,.md-typeset .important>summary::before,.md-typeset .hint>.admonition-title::before,.md-typeset .hint>summary::before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.success,.md-typeset details.success,.md-typeset .admonition.done,.md-typeset details.done,.md-typeset .admonition.check,.md-typeset details.check{border-color:#00c853}.md-typeset .success>.admonition-title,.md-typeset .success>summary,.md-typeset .done>.admonition-title,.md-typeset .done>summary,.md-typeset .check>.admonition-title,.md-typeset .check>summary{background-color:rgba(0,200,83,.1);border-color:#00c853}.md-typeset .success>.admonition-title::before,.md-typeset .success>summary::before,.md-typeset .done>.admonition-title::before,.md-typeset .done>summary::before,.md-typeset .check>.admonition-title::before,.md-typeset .check>summary::before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.question,.md-typeset details.question,.md-typeset .admonition.faq,.md-typeset details.faq,.md-typeset .admonition.help,.md-typeset details.help{border-color:#64dd17}.md-typeset .question>.admonition-title,.md-typeset .question>summary,.md-typeset .faq>.admonition-title,.md-typeset .faq>summary,.md-typeset .help>.admonition-title,.md-typeset .help>summary{background-color:rgba(100,221,23,.1);border-color:#64dd17}.md-typeset .question>.admonition-title::before,.md-typeset .question>summary::before,.md-typeset .faq>.admonition-title::before,.md-typeset .faq>summary::before,.md-typeset .help>.admonition-title::before,.md-typeset .help>summary::before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.warning,.md-typeset details.warning,.md-typeset .admonition.attention,.md-typeset details.attention,.md-typeset .admonition.caution,.md-typeset details.caution{border-color:#ff9100}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary,.md-typeset .attention>.admonition-title,.md-typeset .attention>summary,.md-typeset .caution>.admonition-title,.md-typeset .caution>summary{background-color:rgba(255,145,0,.1);border-color:#ff9100}.md-typeset .warning>.admonition-title::before,.md-typeset .warning>summary::before,.md-typeset .attention>.admonition-title::before,.md-typeset .attention>summary::before,.md-typeset .caution>.admonition-title::before,.md-typeset .caution>summary::before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.failure,.md-typeset details.failure,.md-typeset .admonition.missing,.md-typeset details.missing,.md-typeset .admonition.fail,.md-typeset details.fail{border-color:#ff5252}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary,.md-typeset .missing>.admonition-title,.md-typeset .missing>summary,.md-typeset .fail>.admonition-title,.md-typeset .fail>summary{background-color:rgba(255,82,82,.1);border-color:#ff5252}.md-typeset .failure>.admonition-title::before,.md-typeset .failure>summary::before,.md-typeset .missing>.admonition-title::before,.md-typeset .missing>summary::before,.md-typeset .fail>.admonition-title::before,.md-typeset .fail>summary::before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.danger,.md-typeset details.danger,.md-typeset .admonition.error,.md-typeset details.error{border-color:#ff1744}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary,.md-typeset .error>.admonition-title,.md-typeset .error>summary{background-color:rgba(255,23,68,.1);border-color:#ff1744}.md-typeset .danger>.admonition-title::before,.md-typeset .danger>summary::before,.md-typeset .error>.admonition-title::before,.md-typeset .error>summary::before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:rgba(245,0,87,.1);border-color:#f50057}.md-typeset .bug>.admonition-title::before,.md-typeset .bug>summary::before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.example,.md-typeset details.example{border-color:#651fff}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:rgba(101,31,255,.1);border-color:#651fff}.md-typeset .example>.admonition-title::before,.md-typeset .example>summary::before{background-color:#651fff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.quote,.md-typeset details.quote,.md-typeset .admonition.cite,.md-typeset details.cite{border-color:#9e9e9e}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary,.md-typeset .cite>.admonition-title,.md-typeset .cite>summary{background-color:rgba(158,158,158,.1);border-color:#9e9e9e}.md-typeset .quote>.admonition-title::before,.md-typeset .quote>summary::before,.md-typeset .cite>.admonition-title::before,.md-typeset .cite>summary::before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}:root{--md-footnotes-icon: url("data:image/svg+xml;charset=utf-8,")}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{transition:color 125ms}.md-typeset .footnote li:target{color:var(--md-default-fg-color)}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{transform:translateX(0);opacity:1}.md-typeset .footnote li>:first-child{margin-top:0}.md-typeset .footnote-backref{display:inline-block;color:var(--md-typeset-a-color);font-size:0;vertical-align:text-bottom;transform:translateX(0.25rem);opacity:0;transition:color 250ms,transform 250ms 250ms,opacity 125ms 250ms}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);transform:translateX(0);opacity:1}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-0.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref::before{display:inline-block;width:.8rem;height:.8rem;background-color:currentColor;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .footnote-backref::before svg{transform:scaleX(-1)}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;color:var(--md-default-fg-color--lighter);opacity:0;transition:color 250ms,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:initial}.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink,.md-typeset .headerlink:focus{opacity:1;transition:color 250ms,opacity 125ms}.md-typeset :target>.headerlink,.md-typeset .headerlink:focus,.md-typeset .headerlink:hover{color:var(--md-accent-fg-color)}.md-typeset :target{scroll-margin-top:3.6rem}@media screen and (min-width: 76.25em){.md-header--lifted~.md-container .md-typeset :target{scroll-margin-top:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{scroll-margin-top:3.4rem}@media screen and (min-width: 76.25em){.md-header--lifted~.md-container .md-typeset h1:target,.md-header--lifted~.md-container .md-typeset h2:target,.md-header--lifted~.md-container .md-typeset h3:target{scroll-margin-top:5.8rem}}.md-typeset h4:target{scroll-margin-top:3.45rem}@media screen and (min-width: 76.25em){.md-header--lifted~.md-container .md-typeset h4:target{scroll-margin-top:5.85rem}}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width: 44.9375em){.md-typeset div.arithmatex{margin:0 -0.8rem}}.md-typeset div.arithmatex>*{width:-webkit-min-content;width:-moz-min-content;width:min-content;margin:1em auto !important;padding:0 .8rem;overflow:auto;touch-action:auto}.md-typeset del.critic,.md-typeset ins.critic,.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment::before{content:"/* "}.md-typeset .critic.comment::after{content:" */"}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;overflow:auto;box-shadow:none}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon: url("data:image/svg+xml;charset=utf-8,")}.md-typeset details{display:flow-root;padding-top:0;overflow:visible}.md-typeset details[open]>summary::after{transform:rotate(90deg)}.md-typeset details:not([open]){padding-bottom:0;box-shadow:none}.md-typeset details:not([open])>summary{border-radius:.1rem}.md-typeset summary{display:block;min-height:1rem;padding:.4rem 1.8rem .4rem 2rem;border-top-left-radius:.1rem;border-top-right-radius:.1rem;cursor:pointer}[dir=rtl] .md-typeset summary{padding:.4rem 2.2rem .4rem 1.8rem}.md-typeset summary:not(.focus-visible){outline:none;-webkit-tap-highlight-color:transparent}.md-typeset summary::after{position:absolute;top:.4rem;right:.4rem;width:1rem;height:1rem;background-color:currentColor;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transform:rotate(0deg);transition:transform 250ms;content:""}[dir=rtl] .md-typeset summary::after{right:initial;left:.4rem;transform:rotate(180deg)}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .twemoji,.md-typeset .gemoji{display:inline-block;height:1.125em;vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .twemoji svg,.md-typeset .gemoji svg{width:1.125em;max-height:100%;fill:currentColor}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .sb,.highlight .sc,.highlight .s2,.highlight .si,.highlight .s1,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .il,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .no,.highlight .nb,.highlight .bp{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .cm,.highlight .c1,.highlight .ch,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gr,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gs,.highlight .gu,.highlight .gt{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{margin:0 -0.125em;padding:0 .125em;border-radius:.1rem}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em;background-color:var(--md-code-hl-color)}.highlight [data-linenos]::before{position:-webkit-sticky;position:sticky;left:-1.1764705882em;float:left;margin-right:1.1764705882em;margin-left:-1.1764705882em;padding-left:1.1764705882em;color:var(--md-default-fg-color--light);background-color:var(--md-code-bg-color);box-shadow:-0.05rem 0 var(--md-default-fg-color--lightest) inset;content:attr(data-linenos);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlighttable{display:flow-root;overflow:hidden}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable .linenos{padding:.7720588235em 1.1764705882em;padding-right:0;font-size:.85em;background-color:var(--md-code-bg-color);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlighttable .linenodiv{padding-right:.5882352941em;box-shadow:-0.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;overflow:hidden}.md-typeset .highlighttable{margin:1em 0;direction:ltr;border-radius:.1rem}.md-typeset .highlighttable code{border-radius:0}@media screen and (max-width: 44.9375em){.md-typeset>.highlight{margin:1em -0.8rem}.md-typeset>.highlight .hll{margin:0 -0.8rem;padding:0 .8rem}.md-typeset>.highlight code{border-radius:0}.md-typeset>.highlighttable{margin:1em -0.8rem;border-radius:0}.md-typeset>.highlighttable .hll{margin:0 -0.8rem;padding:0 .8rem}}.md-typeset .keys kbd::before,.md-typeset .keys kbd::after{position:relative;margin:0;color:inherit;-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.md-typeset .keys span{padding:0 .2em;color:var(--md-default-fg-color--light)}.md-typeset .keys .key-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-left-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-right-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-left-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-right-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-left-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-right-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-left-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-right-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-left-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-right-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-left-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-right-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-left-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-right-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-left-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-right-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-arrow-down::before{padding-right:.4em;content:"↓"}.md-typeset .keys .key-arrow-left::before{padding-right:.4em;content:"←"}.md-typeset .keys .key-arrow-right::before{padding-right:.4em;content:"→"}.md-typeset .keys .key-arrow-up::before{padding-right:.4em;content:"↑"}.md-typeset .keys .key-backspace::before{padding-right:.4em;content:"⌫"}.md-typeset .keys .key-backtab::before{padding-right:.4em;content:"⇤"}.md-typeset .keys .key-caps-lock::before{padding-right:.4em;content:"⇪"}.md-typeset .keys .key-clear::before{padding-right:.4em;content:"⌧"}.md-typeset .keys .key-context-menu::before{padding-right:.4em;content:"☰"}.md-typeset .keys .key-delete::before{padding-right:.4em;content:"⌦"}.md-typeset .keys .key-eject::before{padding-right:.4em;content:"⏏"}.md-typeset .keys .key-end::before{padding-right:.4em;content:"⤓"}.md-typeset .keys .key-escape::before{padding-right:.4em;content:"⎋"}.md-typeset .keys .key-home::before{padding-right:.4em;content:"⤒"}.md-typeset .keys .key-insert::before{padding-right:.4em;content:"⎀"}.md-typeset .keys .key-page-down::before{padding-right:.4em;content:"⇟"}.md-typeset .keys .key-page-up::before{padding-right:.4em;content:"⇞"}.md-typeset .keys .key-print-screen::before{padding-right:.4em;content:"⎙"}.md-typeset .keys .key-tab::after{padding-left:.4em;content:"⇥"}.md-typeset .keys .key-num-enter::after{padding-left:.4em;content:"⌤"}.md-typeset .keys .key-enter::after{padding-left:.4em;content:"⏎"}.md-typeset .tabbed-content{display:none;order:99;width:100%;box-shadow:0 -0.05rem var(--md-default-fg-color--lightest)}@media print{.md-typeset .tabbed-content{display:block;order:initial}}.md-typeset .tabbed-content>pre:only-child,.md-typeset .tabbed-content>.highlight:only-child pre,.md-typeset .tabbed-content>.highlighttable:only-child{margin:0}.md-typeset .tabbed-content>pre:only-child>code,.md-typeset .tabbed-content>.highlight:only-child pre>code,.md-typeset .tabbed-content>.highlighttable:only-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-content>.tabbed-set{margin:0}.md-typeset .tabbed-set{position:relative;display:flex;flex-wrap:wrap;margin:1em 0;border-radius:.1rem}.md-typeset .tabbed-set>input{position:absolute;width:0;height:0;opacity:0}.md-typeset .tabbed-set>input:checked+label{color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:checked+label+.tabbed-content{display:block}.md-typeset .tabbed-set>input:focus+label{outline-style:auto}.md-typeset .tabbed-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.md-typeset .tabbed-set>label{z-index:1;width:auto;padding:.9375em 1.25em .78125em;color:var(--md-default-fg-color--light);font-weight:700;font-size:.64rem;border-bottom:.1rem solid transparent;cursor:pointer;transition:color 250ms}.md-typeset .tabbed-set>label:hover{color:var(--md-accent-fg-color)}:root{--md-tasklist-icon: url( "data:image/svg+xml;charset=utf-8," );--md-tasklist-icon--checked: url( "data:image/svg+xml;charset=utf-8," )}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:initial}.md-typeset .task-list-control [type=checkbox]{z-index:-1;opacity:0}.md-typeset .task-list-indicator::before{position:absolute;top:.15em;left:-1.5em;width:1.25em;height:1.25em;background-color:var(--md-default-fg-color--lightest);-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .task-list-indicator::before{right:-1.5em;left:initial}.md-typeset [type=checkbox]:checked+.task-list-indicator::before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media screen and (min-width: 45em){.md-typeset .inline{float:left;width:11.7rem;margin-top:0;margin-right:.8rem;margin-bottom:.8rem}[dir=rtl] .md-typeset .inline{float:right;margin-right:0;margin-left:.8rem}.md-typeset .inline.end{float:right;margin-right:0;margin-left:.8rem}[dir=rtl] .md-typeset .inline.end{float:left;margin-right:.8rem;margin-left:0}} diff --git a/latest/assets/stylesheets/main.a2a6bca7.min.css b/latest/assets/stylesheets/main.a2a6bca7.min.css deleted file mode 100644 index ea83facd..00000000 --- a/latest/assets/stylesheets/main.a2a6bca7.min.css +++ /dev/null @@ -1 +0,0 @@ -html{box-sizing:border-box;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}*,*::before,*::after{box-sizing:inherit}body{margin:0}hr{box-sizing:content-box;overflow:visible}a,button,label,input{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:normal;vertical-align:top}button{margin:0;padding:0;font-size:inherit;background:transparent;border:0}input{border:0;outline:none}:root{--md-default-fg-color: hsla(0, 0%, 0%, 0.87);--md-default-fg-color--light: hsla(0, 0%, 0%, 0.54);--md-default-fg-color--lighter: hsla(0, 0%, 0%, 0.32);--md-default-fg-color--lightest: hsla(0, 0%, 0%, 0.07);--md-default-bg-color: hsla(0, 0%, 100%, 1);--md-default-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-default-bg-color--lighter: hsla(0, 0%, 100%, 0.3);--md-default-bg-color--lightest: hsla(0, 0%, 100%, 0.12);--md-primary-fg-color: hsla(231, 48%, 48%, 1);--md-primary-fg-color--light: hsla(231, 44%, 56%, 1);--md-primary-fg-color--dark: hsla(232, 54%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-accent-fg-color: hsla(231, 99%, 66%, 1);--md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}:root>*{--md-code-fg-color: hsla(200, 18%, 26%, 1);--md-code-bg-color: hsla(0, 0%, 96%, 1);--md-code-hl-color: hsla(60, 100%, 50%, 0.5);--md-code-hl-number-color: hsla(0, 67%, 50%, 1);--md-code-hl-special-color: hsla(340, 83%, 47%, 1);--md-code-hl-function-color: hsla(291, 45%, 50%, 1);--md-code-hl-constant-color: hsla(250, 63%, 60%, 1);--md-code-hl-keyword-color: hsla(219, 54%, 51%, 1);--md-code-hl-string-color: hsla(150, 63%, 30%, 1);--md-code-hl-name-color: var(--md-code-fg-color);--md-code-hl-operator-color: var(--md-default-fg-color--light);--md-code-hl-punctuation-color: var(--md-default-fg-color--light);--md-code-hl-comment-color: var(--md-default-fg-color--light);--md-code-hl-generic-color: var(--md-default-fg-color--light);--md-code-hl-variable-color: var(--md-default-fg-color--light);--md-typeset-color: var(--md-default-fg-color);--md-typeset-a-color: var(--md-primary-fg-color);--md-typeset-mark-color: hsla(60, 100%, 50%, 0.5);--md-typeset-del-color: hsla(6, 90%, 60%, 0.15);--md-typeset-ins-color: hsla(150, 90%, 44%, 0.15);--md-typeset-kbd-color: hsla(0, 0%, 98%, 1);--md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);--md-typeset-kbd-border-color: hsla(0, 0%, 72%, 1);--md-admonition-fg-color: var(--md-default-fg-color);--md-admonition-bg-color: var(--md-default-bg-color);--md-footer-fg-color: hsla(0, 0%, 100%, 1);--md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7);--md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3);--md-footer-bg-color: hsla(0, 0%, 0%, 0.87);--md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32)}.md-icon svg{display:block;width:1.2rem;height:1.2rem;fill:currentColor}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:var(--md-typeset-color);font-feature-settings:"kern","liga";font-family:-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,pre,kbd{color:var(--md-typeset-color);font-feature-settings:"kern";font-family:SFMono-Regular,Consolas,Menlo,monospace}:root{--md-typeset-table--ascending: url("data:image/svg+xml;charset=utf-8,");--md-typeset-table--descending: url("data:image/svg+xml;charset=utf-8,")}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact;color-adjust:exact}@media print{.md-typeset{font-size:.68rem}}.md-typeset p,.md-typeset ul,.md-typeset ol,.md-typeset blockquote{margin:1em 0}.md-typeset h1{margin:0 0 1.25em;color:var(--md-default-fg-color--light);font-weight:300;font-size:2em;line-height:1.3;letter-spacing:-0.01em}.md-typeset h2{margin:1.6em 0 .64em;font-weight:300;font-size:1.5625em;line-height:1.4;letter-spacing:-0.01em}.md-typeset h3{margin:1.6em 0 .8em;font-weight:400;font-size:1.25em;line-height:1.5;letter-spacing:-0.01em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{margin:1em 0;font-weight:700;letter-spacing:-0.01em}.md-typeset h5,.md-typeset h6{margin:1.25em 0;color:var(--md-default-fg-color--light);font-weight:700;font-size:.8em;letter-spacing:-0.01em}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.05rem dotted var(--md-default-fg-color--lighter)}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a::before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset code,.md-typeset pre,.md-typeset kbd{color:var(--md-code-fg-color);direction:ltr}@media print{.md-typeset code,.md-typeset pre,.md-typeset kbd{white-space:pre-wrap}}.md-typeset code{padding:0 .2941176471em;font-size:.85em;word-break:break-word;background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset code:not(.focus-visible){outline:none;-webkit-tap-highlight-color:transparent}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:initial;padding:initial;background-color:transparent;box-shadow:none}.md-typeset a>code{color:currentColor}.md-typeset pre{position:relative;margin:1em 0;line-height:1.4}.md-typeset pre>code{display:block;margin:0;padding:.7720588235em 1.1764705882em;overflow:auto;word-break:normal;box-shadow:none;-webkit-box-decoration-break:slice;box-decoration-break:slice;touch-action:auto;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@media screen and (max-width: 44.9375em){.md-typeset>pre{margin:1em -0.8rem}.md-typeset>pre code{border-radius:0}}.md-typeset kbd{display:inline-block;padding:0 .6666666667em;color:var(--md-default-fg-color);font-size:.75em;vertical-align:text-top;word-break:break-word;background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -0.1rem .2rem var(--md-typeset-kbd-accent-color) inset}.md-typeset mark{color:inherit;word-break:break-word;background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{text-decoration:none;border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help}@media(hover: none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:focus::after,.md-typeset abbr[title]:hover::after{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:absolute;left:0;display:inline-block;width:auto;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;max-width:80%;margin-top:2em;padding:.2rem .3rem;color:var(--md-default-bg-color);font-size:.7rem;background-color:var(--md-default-fg-color);border-radius:.1rem;content:attr(title)}}.md-typeset small{opacity:.75}.md-typeset sup,.md-typeset sub{margin-left:.078125em}[dir=rtl] .md-typeset sup,[dir=rtl] .md-typeset sub{margin-right:.078125em;margin-left:initial}.md-typeset blockquote{padding-left:.6rem;color:var(--md-default-fg-color--light);border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:initial;border-right:.2rem solid var(--md-default-fg-color--lighter);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ul,.md-typeset ol{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ul,[dir=rtl] .md-typeset ol{margin-right:.625em;margin-left:initial}.md-typeset ul ol,.md-typeset ol ol{list-style-type:lower-alpha}.md-typeset ul ol ol,.md-typeset ol ol ol{list-style-type:lower-roman}.md-typeset ul li,.md-typeset ol li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ul li,[dir=rtl] .md-typeset ol li{margin-right:1.25em;margin-left:initial}.md-typeset ul li p,.md-typeset ul li blockquote,.md-typeset ol li p,.md-typeset ol li blockquote{margin:.5em 0}.md-typeset ul li:last-child,.md-typeset ol li:last-child{margin-bottom:0}.md-typeset ul li ul,.md-typeset ul li ol,.md-typeset ol li ul,.md-typeset ol li ol{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ul li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ol li ol{margin-right:.625em;margin-left:initial}.md-typeset dd{margin:1em 0 1.5em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:initial}.md-typeset img,.md-typeset svg{max-width:100%;height:auto}.md-typeset img[align=left],.md-typeset svg[align=left]{margin:1em;margin-left:0}.md-typeset img[align=right],.md-typeset svg[align=right]{margin:1em;margin-right:0}.md-typeset img[align]:only-child,.md-typeset svg[align]:only-child{margin-top:0}.md-typeset figure{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:100%;margin:0 auto;text-align:center}.md-typeset figcaption{max-width:24rem;margin:.5em auto 2em;font-style:italic}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){display:inline-block;max-width:100%;overflow:auto;font-size:.64rem;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1);touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) th>*:first-child,.md-typeset table:not([class]) td>*:first-child{margin-top:0}.md-typeset table:not([class]) th>*:last-child,.md-typeset table:not([class]) td>*:last-child{margin-bottom:0}.md-typeset table:not([class]) th:not([align]),.md-typeset table:not([class]) td:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) th:not([align]),[dir=rtl] .md-typeset table:not([class]) td:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.9375em 1.25em;color:var(--md-default-bg-color);vertical-align:top;background-color:var(--md-default-fg-color--light)}.md-typeset table:not([class]) th a{color:inherit}.md-typeset table:not([class]) td{padding:.9375em 1.25em;vertical-align:top;border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-typeset table:not([class]) tr{transition:background-color 125ms}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}.md-typeset table th[role=columnheader]::after{display:inline-block;width:1.2em;height:1.2em;margin-left:.5em;vertical-align:sub;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset table th[role=columnheader][aria-sort=ascending]::after{background-color:currentColor;-webkit-mask-image:var(--md-typeset-table--ascending);mask-image:var(--md-typeset-table--ascending)}.md-typeset table th[role=columnheader][aria-sort=descending]::after{background-color:currentColor;-webkit-mask-image:var(--md-typeset-table--descending);mask-image:var(--md-typeset-table--descending)}.md-typeset__scrollwrap{margin:1em -0.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{height:100%;overflow-x:hidden;font-size:125%}@media screen and (min-width: 100em){html{font-size:137.5%}}@media screen and (min-width: 125em){html{font-size:150%}}body{position:relative;display:flex;flex-direction:column;width:100%;min-height:100%;font-size:.5rem;background-color:var(--md-default-bg-color)}@media screen and (max-width: 59.9375em){body[data-md-state=lock]{position:fixed}}@media print{body{display:block}}hr{display:block;height:.05rem;padding:0;border:0}.md-grid{max-width:61rem;margin-right:auto;margin-left:auto}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.md-toggle{display:none}.md-overlay{position:fixed;top:0;z-index:3;width:0;height:0;background-color:rgba(0,0,0,.54);opacity:0;transition:width 0ms 250ms,height 0ms 250ms,opacity 250ms}@media screen and (max-width: 76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;opacity:1;transition:width 0ms,height 0ms,opacity 250ms}}.md-skip{position:fixed;z-index:-1;margin:.5rem;padding:.3rem .5rem;color:var(--md-default-bg-color);font-size:.64rem;background-color:var(--md-default-fg-color);border-radius:.1rem;transform:translateY(0.4rem);opacity:0}.md-skip:focus{z-index:10;transform:translateY(0);opacity:1;transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),opacity 175ms 75ms}@page{margin:25mm}.md-announce{overflow:auto;background-color:var(--md-footer-bg-color)}.md-announce__inner{margin:.6rem auto;padding:0 .8rem;color:var(--md-footer-fg-color);font-size:.7rem}@media print{.md-announce{display:none}}.md-typeset .md-button{display:inline-block;padding:.625em 2em;color:var(--md-primary-fg-color);font-weight:700;border:.1rem solid currentColor;border-radius:.1rem;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{color:var(--md-accent-bg-color);background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color)}:root{--md-clipboard-icon: url("data:image/svg+xml;charset=utf-8,")}.md-clipboard{position:absolute;top:.5em;right:.5em;z-index:1;width:1.5em;height:1.5em;color:var(--md-default-fg-color--lightest);border-radius:.1rem;cursor:pointer;transition:color 250ms}@media print{.md-clipboard{display:none}}.md-clipboard::after{display:block;width:1.125em;height:1.125em;margin:0 auto;background-color:currentColor;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}pre:hover .md-clipboard{color:var(--md-default-fg-color--light)}pre .md-clipboard:focus,pre .md-clipboard:hover{color:var(--md-accent-fg-color)}.md-content{flex-grow:1;overflow:auto}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width: 76.25em){.md-sidebar--primary:not([hidden])~.md-content .md-content__inner{margin-left:1.2rem}[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content .md-content__inner{margin-right:1.2rem;margin-left:.8rem}.md-sidebar--secondary:not([hidden])~.md-content .md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content .md-content__inner{margin-right:.8rem;margin-left:1.2rem}}.md-content__inner::before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__button{float:right;margin:.4rem 0;margin-left:.4rem;padding:0}[dir=rtl] .md-content__button{float:left;margin-right:.4rem;margin-left:initial}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}@media print{.md-content__button{display:none}}.md-dialog{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:fixed;right:.8rem;bottom:.8rem;left:initial;z-index:2;display:block;min-width:11.1rem;padding:.4rem .6rem;color:var(--md-default-bg-color);font-size:.7rem;background-color:var(--md-default-fg-color);border:none;border-radius:.1rem;transform:translateY(100%);opacity:0;transition:transform 0ms 400ms,opacity 400ms}[dir=rtl] .md-dialog{right:initial;left:.8rem}.md-dialog[data-md-state=open]{transform:translateY(0);opacity:1;transition:transform 400ms cubic-bezier(0.075, 0.85, 0.175, 1),opacity 400ms}@media print{.md-dialog{display:none}}.md-header{position:-webkit-sticky;position:sticky;top:0;right:0;left:0;z-index:2;height:2.4rem;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem rgba(0,0,0,0),0 .2rem .4rem rgba(0,0,0,0);transition:color 250ms,background-color 250ms}.no-js .md-header{box-shadow:none;transition:none}.md-header[data-md-state=shadow]{box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);transition:transform 250ms cubic-bezier(0.1, 0.7, 0.1, 1),color 250ms,background-color 250ms,box-shadow 250ms}.md-header[data-md-state=hidden]{transform:translateY(-100%);transition:transform 250ms cubic-bezier(0.8, 0, 0.6, 1),color 250ms,background-color 250ms,box-shadow 250ms}@media print{.md-header{display:none}}.md-header-nav{display:flex;padding:0 .2rem}.md-header-nav__button{position:relative;z-index:1;display:block;margin:.2rem;padding:.4rem;color:currentColor;cursor:pointer;transition:opacity 250ms}.md-header-nav__button:not(.focus-visible){outline:none}.md-header-nav__button:focus,.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo{margin:.2rem;padding:.4rem}.md-header-nav__button.md-logo img,.md-header-nav__button.md-logo svg{display:block;width:1.2rem;height:1.2rem;fill:currentColor}[dir=rtl] .md-header-nav__button[for=__search] svg{transform:scaleX(-1)}.no-js .md-header-nav__button[for=__search]{display:none}@media screen and (min-width: 60em){.md-header-nav__button[for=__search]{display:none}}@media screen and (max-width: 76.1875em){.md-header-nav__button.md-logo{display:none}}@media screen and (min-width: 76.25em){.md-header-nav__button[for=__drawer]{display:none}}.md-header-nav__topic{position:absolute;display:flex;max-width:100%;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms}.md-header-nav__topic+.md-header-nav__topic{z-index:-1;transform:translateX(1.25rem);opacity:0;transition:transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1),opacity 150ms;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{transform:translateX(-1.25rem)}.no-js .md-header-nav__topic{position:initial}.no-js .md-header-nav__topic+.md-header-nav__topic{display:none}.md-header-nav__title{flex-grow:1;margin-right:.4rem;margin-left:1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{z-index:-1;transform:translateX(-1.25rem);opacity:0;transition:transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1),opacity 150ms;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{z-index:0;transform:translateX(0);opacity:1;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms;pointer-events:initial}.md-header-nav__title>.md-header-nav__ellipsis{position:relative;width:100%;height:100%}.md-header-nav__options{max-width:100%;transition:max-width 0ms 250ms,opacity 250ms 250ms}[data-md-toggle=search]:checked~.md-header .md-header-nav__options{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header-nav__options>[data-md-state=hidden]{display:none}.md-header-nav__source{display:none}@media screen and (min-width: 60em){.md-header-nav__source{display:block;width:11.7rem;max-width:11.7rem;margin-left:1rem}[dir=rtl] .md-header-nav__source{margin-right:1rem;margin-left:initial}}@media screen and (min-width: 76.25em){.md-header-nav__source{margin-left:1.4rem}[dir=rtl] .md-header-nav__source{margin-right:1.4rem}}.md-footer{color:var(--md-footer-fg-color);background-color:var(--md-footer-bg-color)}@media print{.md-footer{display:none}}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{display:flex;padding-top:1.4rem;padding-bottom:.4rem;transition:opacity 250ms}@media screen and (min-width: 45em){.md-footer-nav__link{width:50%}}.md-footer-nav__link:focus,.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{float:left}[dir=rtl] .md-footer-nav__link--prev{float:right}[dir=rtl] .md-footer-nav__link--prev svg{transform:scaleX(-1)}@media screen and (max-width: 44.9375em){.md-footer-nav__link--prev{width:25%}.md-footer-nav__link--prev .md-footer-nav__title{display:none}}.md-footer-nav__link--next{float:right;text-align:right}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}[dir=rtl] .md-footer-nav__link--next svg{transform:scaleX(-1)}@media screen and (max-width: 44.9375em){.md-footer-nav__link--next{width:75%}}.md-footer-nav__title{position:relative;flex-grow:1;max-width:calc(100% - 2.4rem);padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__button{margin:.2rem;padding:.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-footer-copyright{width:100%;margin:auto .6rem;padding:.4rem 0;color:var(--md-footer-fg-color--lighter);font-size:.64rem}@media screen and (min-width: 45em){.md-footer-copyright{width:auto}}.md-footer-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width: 45em){.md-footer-social{padding:.6rem 0}}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;text-align:center}.md-footer-social__link::before{line-height:1.9}.md-footer-social__link svg{max-height:.8rem;vertical-align:-25%;fill:currentColor}:root{--md-nav-icon--prev: url("data:image/svg+xml;charset=utf-8,");--md-nav-icon--next: url("data:image/svg+xml;charset=utf-8,");--md-toc-icon: url("data:image/svg+xml;charset=utf-8,")}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;overflow:hidden;font-weight:700;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{width:100%;height:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{display:block;width:2.4rem;height:2.4rem}.md-nav__title .md-nav__button.md-logo svg{fill:currentColor}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__link{display:block;margin-top:.625em;overflow:hidden;text-overflow:ellipsis;cursor:pointer;transition:color 125ms;scroll-snap-align:start}html .md-nav__link[for=__toc]{display:none}html .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav__source{display:none}@media screen and (max-width: 76.1875em){.md-nav--primary,.md-nav--primary .md-nav{position:absolute;top:0;right:0;left:0;z-index:1;display:flex;flex-direction:column;height:100%;background-color:var(--md-default-bg-color)}.md-nav--primary .md-nav__title,.md-nav--primary .md-nav__item{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;color:var(--md-default-fg-color--light);font-weight:400;line-height:2.4rem;white-space:nowrap;background-color:var(--md-default-fg-color--lightest);cursor:pointer}.md-nav--primary .md-nav__title .md-nav__icon{position:absolute;top:.4rem;left:.4rem;display:block;width:1.2rem;height:1.2rem;margin:.2rem}.md-nav--primary .md-nav__title .md-nav__icon::after{display:block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem;left:initial}.md-nav--primary .md-nav__title~.md-nav__list{overflow-y:auto;background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color)}.md-nav--primary .md-nav__title[for=__drawer] .md-nav__button{position:absolute;top:.2rem;left:.2rem;display:block;margin:.2rem;padding:.4rem}html [dir=rtl] .md-nav--primary .md-nav__title[for=__drawer] .md-nav__button{right:.2rem;left:initial}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid var(--md-default-fg-color--lightest)}[dir=rtl] .md-nav--primary .md-nav__item{padding:0}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link .md-nav__icon{position:absolute;top:50%;right:.6rem;width:1.2rem;height:1.2rem;margin-top:-0.6rem;color:inherit;font-size:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon::after{display:block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{right:initial;left:.6rem}[dir=rtl] .md-nav--primary .md-nav__icon::after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:initial}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:initial}.md-nav--secondary{background-color:transparent}.md-nav__toggle~.md-nav{display:flex;transform:translateX(100%);opacity:0;transition:transform 250ms cubic-bezier(0.8, 0, 0.6, 1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{transform:translateX(0);opacity:1;transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width: 59.9375em){html .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}html .md-nav__link[for=__toc]+.md-nav__link{display:none}html .md-nav__link[for=__toc] .md-icon::after{display:block;width:100%;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);background-color:currentColor;content:""}html .md-nav__link[for=__toc]~.md-nav{display:flex}html [dir=rtl] .md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav__source{display:block;padding:0 .2rem;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color--dark)}}@media screen and (min-width: 60em){.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width: 76.25em){.md-nav{transition:max-height 250ms cubic-bezier(0.86, 0, 0.07, 1)}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__title{display:block;padding:0;pointer-events:none;scroll-snap-align:start}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{float:right;width:.9rem;height:.9rem;transition:transform 250ms}[dir=rtl] .md-nav__icon{float:left;transform:rotate(180deg)}.md-nav__icon::after{display:inline-block;width:100%;height:100%;vertical-align:-0.1rem;background-color:currentColor;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}}:root{--md-search-result-icon: url("data:image/svg+xml;charset=utf-8,")}.md-search{position:relative}.no-js .md-search{display:none}@media screen and (min-width: 60em){.md-search{padding:.2rem 0}}.md-search__overlay{z-index:1;opacity:0}@media screen and (max-width: 59.9375em){.md-search__overlay{position:absolute;top:.2rem;left:-2.2rem;width:2rem;height:2rem;overflow:hidden;background-color:var(--md-default-bg-color);border-radius:1rem;transform-origin:center;transition:transform 300ms 100ms,opacity 200ms 200ms;pointer-events:none}[dir=rtl] .md-search__overlay{right:-2.2rem;left:initial}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform 400ms,opacity 100ms}}@media screen and (max-width: 29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width: 30em)and (max-width: 44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width: 45em)and (max-width: 59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}@media screen and (min-width: 60em){.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;background-color:rgba(0,0,0,.54);cursor:pointer;transition:width 0ms 250ms,height 0ms 250ms,opacity 250ms}[dir=rtl] .md-search__overlay{right:0;left:initial}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;opacity:1;transition:width 0ms,height 0ms,opacity 250ms}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width: 59.9375em){.md-search__inner{position:fixed;top:0;left:100%;z-index:2;width:100%;height:100%;transform:translateX(5%);opacity:0;transition:right 0ms 300ms,left 0ms 300ms,transform 150ms 150ms cubic-bezier(0.4, 0, 0.2, 1),opacity 150ms 150ms}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;transform:translateX(0);opacity:1;transition:right 0ms 0ms,left 0ms 0ms,transform 150ms 150ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms 150ms}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:initial}html [dir=rtl] .md-search__inner{right:100%;left:initial;transform:translateX(-5%)}}@media screen and (min-width: 60em){.md-search__inner{position:relative;float:right;width:11.7rem;padding:.1rem 0;transition:width 250ms cubic-bezier(0.1, 0.7, 0.1, 1)}[dir=rtl] .md-search__inner{float:left}}@media screen and (min-width: 60em)and (max-width: 76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width: 76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{position:relative;z-index:2;height:2.4rem;background-color:var(--md-default-bg-color);transition:color 250ms,background-color 250ms}@media screen and (min-width: 60em){.md-search__form{height:1.8rem;background-color:rgba(0,0,0,.26);border-radius:.1rem}.md-search__form:hover{background-color:rgba(255,255,255,.12)}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0}.md-search__input{position:relative;z-index:2;width:100%;height:100%;padding:0 2.2rem 0 3.6rem;font-size:.9rem;text-overflow:ellipsis;background:transparent}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{-webkit-transition:color 250ms;transition:color 250ms}.md-search__input::-moz-placeholder{-moz-transition:color 250ms;transition:color 250ms}.md-search__input::-ms-input-placeholder{-ms-transition:color 250ms;transition:color 250ms}.md-search__input::placeholder{transition:color 250ms}.md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input~.md-search__icon,.md-search__input::placeholder{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (min-width: 60em){.md-search__input{padding-left:2.2rem;color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}.md-search__input::-webkit-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::-moz-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::-ms-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input{color:var(--md-default-fg-color);text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__suggest{position:absolute;top:0;display:flex;align-items:center;width:100%;height:100%;padding:0 2.2rem 0 3.6rem;color:var(--md-default-fg-color--lighter);font-size:.9rem;white-space:nowrap;opacity:0;transition:opacity 50ms}[dir=rtl] .md-search__suggest{padding:0 3.6rem 0 2.2rem}@media screen and (min-width: 60em){.md-search__suggest{padding-left:2.2rem;font-size:.8rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity 300ms 100ms}.md-search__icon{position:absolute;z-index:2;width:1.2rem;height:1.2rem;cursor:pointer;transition:color 250ms,opacity 250ms}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:initial}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width: 59.9375em){.md-search__icon[for=__search]{top:.6rem;left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem;left:initial}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width: 60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}.md-search__icon[type=reset]{top:.3rem;right:.5rem;transform:scale(0.75);opacity:0;transition:transform 150ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 150ms;pointer-events:none}[dir=rtl] .md-search__icon[type=reset]{right:initial;left:.5rem}@media screen and (max-width: 59.9375em){.md-search__icon[type=reset]{top:.6rem;right:.8rem}[dir=rtl] .md-search__icon[type=reset]{right:initial;left:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__input:not(:-moz-placeholder-shown)~.md-search__icon[type=reset]{transform:scale(1);opacity:1;pointer-events:initial}[data-md-toggle=search]:checked~.md-header .md-search__input:not(:placeholder-shown)~.md-search__icon[type=reset]{transform:scale(1);opacity:1;pointer-events:initial}[data-md-toggle=search]:checked~.md-header .md-search__input:not(:-moz-placeholder-shown)~.md-search__icon[type=reset]:hover{opacity:.7}[data-md-toggle=search]:checked~.md-header .md-search__input:not(:placeholder-shown)~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;z-index:1;width:100%;overflow:hidden;border-radius:0 0 .1rem .1rem}@media screen and (max-width: 59.9375em){.md-search__output{top:2.4rem;bottom:0}}@media screen and (min-width: 60em){.md-search__output{top:1.9rem;opacity:0;transition:opacity 400ms}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}}.md-search__scrollwrap{height:100%;overflow-y:auto;background-color:var(--md-default-bg-color);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}@media(-webkit-max-device-pixel-ratio: 1), (max-resolution: 1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width: 76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width: 60em){.md-search__scrollwrap{max-height:0;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{padding:0 .8rem;color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;background-color:var(--md-default-fg-color--lightest);scroll-snap-align:start}@media screen and (min-width: 60em){.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:initial}}.md-search-result__list{margin:0;padding:0;list-style:none}.md-search-result__item{box-shadow:0 -0.05rem 0 var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;transition:background-color 250ms;scroll-snap-align:start}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:focus .md-search-result__article::before,.md-search-result__link:hover .md-search-result__article::before{opacity:.7}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{display:block;padding:.75em .8rem;color:var(--md-typeset-a-color);font-size:.64rem;outline:0;cursor:pointer;transition:color 250ms,background-color 250ms;scroll-snap-align:start}.md-search-result__more summary:focus,.md-search-result__more summary:hover{color:var(--md-accent-fg-color);background-color:var(--md-accent-fg-color--transparent)}@media screen and (min-width: 60em){.md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem;padding-left:.8rem}}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{position:relative;padding:0 .8rem;overflow:hidden}@media screen and (min-width: 60em){.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-weight:400;font-size:.8rem;line-height:1.4}.md-search-result__icon{position:absolute;left:0;width:1.2rem;height:1.2rem;margin:.5rem;color:var(--md-default-fg-color--light)}.md-search-result__icon::after{display:inline-block;width:100%;height:100%;background-color:currentColor;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-search-result__icon{right:0;left:initial}[dir=rtl] .md-search-result__icon::after{transform:scaleX(-1)}@media screen and (max-width: 59.9375em){.md-search-result__icon{display:none}}.md-search-result__title{margin:.5em 0;font-weight:700;font-size:.64rem;line-height:1.6}.md-search-result__teaser{display:-webkit-box;max-height:2rem;margin:.5em 0;overflow:hidden;color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}@media screen and (max-width: 44.9375em){.md-search-result__teaser{max-height:3rem;-webkit-line-clamp:3}}@media screen and (min-width: 60em)and (max-width: 76.1875em){.md-search-result__teaser{max-height:3rem;-webkit-line-clamp:3}}.md-search-result__teaser mark{text-decoration:underline;background-color:transparent}.md-search-result__terms{margin:.5em 0;font-size:.64rem;font-style:italic}.md-search-result mark{color:var(--md-accent-fg-color);background-color:transparent}@-webkit-keyframes md-sidebar__scrollwrap--hack{0%,99%{-webkit-scroll-snap-type:none;scroll-snap-type:none}100%{-webkit-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}}@keyframes md-sidebar__scrollwrap--hack{0%,99%{-webkit-scroll-snap-type:none;-ms-scroll-snap-type:none;scroll-snap-type:none}100%{-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}}.md-sidebar{position:-webkit-sticky;position:sticky;top:2.4rem;flex-shrink:0;align-self:flex-start;width:12.1rem;height:0;padding:1.2rem 0}@media print{.md-sidebar{display:none}}@media screen and (max-width: 76.1875em){.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;z-index:3;display:block;width:12.1rem;height:100%;background-color:var(--md-default-bg-color);transform:translateX(0);transition:transform 250ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 250ms}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:initial}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden}}@media screen and (min-width: 76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width: 60em){.md-sidebar--secondary{height:0}.md-sidebar--secondary:not([hidden]){display:block}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:var(--md-default-fg-color--lighter) transparent}.js .md-sidebar__scrollwrap{-webkit-animation:md-sidebar__scrollwrap--hack 1000ms forwards;animation:md-sidebar__scrollwrap--hack 1000ms forwards}@media screen and (max-width: 76.1875em){.md-sidebar--primary .md-sidebar__scrollwrap{position:absolute;top:0;right:0;bottom:0;left:0;margin:0;-webkit-scroll-snap-type:none;-ms-scroll-snap-type:none;scroll-snap-type:none}}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@-webkit-keyframes md-source__facts--done{0%{height:0}100%{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}100%{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{transform:translateY(100%);opacity:0}50%{opacity:0}100%{transform:translateY(0%);opacity:1}}@keyframes md-source__fact--done{0%{transform:translateY(100%);opacity:0}50%{opacity:0}100%{transform:translateY(0%);opacity:1}}.md-source{display:block;font-size:.65rem;line-height:1.2;white-space:nowrap;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:opacity 250ms}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;width:2.4rem;height:2.4rem;vertical-align:middle}.md-source__icon svg{margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:initial}.md-source__icon+.md-source__repository{margin-left:-2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem;margin-left:initial;padding-right:2rem;padding-left:initial}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);margin-left:.6rem;overflow:hidden;font-weight:700;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{margin:0;padding:0;overflow:hidden;font-weight:700;font-size:.55rem;list-style-type:none;opacity:.75}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done 250ms ease-in;animation:md-source__facts--done 250ms ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done 400ms ease-out;animation:md-source__fact--done 400ms ease-out}.md-source__fact::before{margin:0 .1rem;content:"·"}.md-source__fact:first-child::before{display:none}.md-tabs{width:100%;overflow:auto;color:var(--md-primary-bg-color);background-color:var(--md-primary-fg-color);transition:background-color 250ms}.no-js .md-tabs{transition:none}@media screen and (max-width: 76.1875em){.md-tabs{display:none}}@media print{.md-tabs{display:none}}.md-tabs__list{margin:0;margin-left:.2rem;padding:0;white-space:nowrap;list-style:none;contain:content}[dir=rtl] .md-tabs__list{margin-right:.2rem;margin-left:initial}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;font-size:.7rem;opacity:.7;transition:transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1),opacity 250ms}.no-js .md-tabs__link{transition:none}.md-tabs__link--active,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:100ms}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:120ms}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:140ms}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:160ms}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:180ms}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:200ms}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:220ms}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:240ms}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:260ms}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:280ms}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:300ms}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{transform:translateY(50%);opacity:0;transition:color 250ms,transform 0ms 400ms,opacity 100ms}@media screen and (min-width: 76.25em){.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__title{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active>.md-nav__link{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active>.md-nav>.md-nav__title{display:block;padding:0 .6rem;pointer-events:none;scroll-snap-align:start}.md-tabs--active~.md-main .md-nav[data-md-level="1"]{display:block}}:root{--md-version-icon: url( "data:image/svg+xml;charset=utf-8," )}.md-version{flex-shrink:0;height:2.4rem;font-size:.8rem}.md-version__current{position:relative;top:.05rem;margin-right:.4rem;margin-left:1.4rem}[dir=rtl] .md-version__current{margin-right:1.4rem;margin-left:.4rem}.md-version__current::after{display:inline-block;width:.4rem;height:.6rem;margin-left:.4rem;background-color:currentColor;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;content:""}[dir=rtl] .md-version__current::after{margin-right:.4rem;margin-left:initial}.md-version__list{position:absolute;top:.05rem;max-height:2rem;margin:.2rem .8rem;padding:0;overflow:scroll;color:var(--md-default-fg-color);list-style-type:none;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.1),0 0 .05rem rgba(0,0,0,.25);opacity:0;transition:opacity 250ms 250ms,max-height 0ms 500ms;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory}.md-version__list:focus-within,.md-version__list:hover{max-height:10rem;opacity:1;transition:opacity 250ms,max-height 250ms}.md-version__item{line-height:2rem}.md-version__link{display:block;width:100%;padding-right:1.2rem;padding-left:.6rem;cursor:pointer;transition:background-color 250ms,color 250ms;scroll-snap-align:start}[dir=rtl] .md-version__link{padding-right:.6rem;padding-left:1.2rem}.md-version__link:focus,.md-version__link:hover{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--abstract: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--info: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--tip: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--success: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--question: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--warning: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--failure: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--danger: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--bug: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--example: url("data:image/svg+xml;charset=utf-8,");--md-admonition-icon--quote: url("data:image/svg+xml;charset=utf-8,")}.md-typeset .admonition,.md-typeset details{margin:1.5625em 0;padding:0 .6rem;overflow:hidden;color:var(--md-admonition-fg-color);font-size:.64rem;page-break-inside:avoid;background-color:var(--md-admonition-bg-color);border-left:.2rem solid #448aff;border-radius:.1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1)}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition .admonition,.md-typeset details .admonition,.md-typeset .admonition details,.md-typeset details details{margin:1em 0}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -0.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}.md-typeset .admonition-title,.md-typeset summary{position:relative;margin:0 -0.6rem 0 -0.8rem;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(68,138,255,.1);border-left:.2rem solid #448aff}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{margin:0 -0.8rem 0 -0.6rem;padding:.4rem 2rem .4rem .6rem}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}.md-typeset .admonition-title::before,.md-typeset summary::before{position:absolute;left:.6rem;width:1rem;height:1rem;background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .admonition-title::before,[dir=rtl] .md-typeset summary::before{right:.8rem;left:initial}.md-typeset .admonition-title code,.md-typeset summary code{margin:initial;padding:initial;color:currentColor;background-color:transparent;border-radius:initial;box-shadow:none}.md-typeset .admonition-title+.tabbed-set:last-child,.md-typeset summary+.tabbed-set:last-child{margin-top:0}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:rgba(68,138,255,.1);border-color:#448aff}.md-typeset .note>.admonition-title::before,.md-typeset .note>summary::before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.abstract,.md-typeset details.abstract,.md-typeset .admonition.tldr,.md-typeset details.tldr,.md-typeset .admonition.summary,.md-typeset details.summary{border-color:#00b0ff}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary,.md-typeset .tldr>.admonition-title,.md-typeset .tldr>summary,.md-typeset .summary>.admonition-title,.md-typeset .summary>summary{background-color:rgba(0,176,255,.1);border-color:#00b0ff}.md-typeset .abstract>.admonition-title::before,.md-typeset .abstract>summary::before,.md-typeset .tldr>.admonition-title::before,.md-typeset .tldr>summary::before,.md-typeset .summary>.admonition-title::before,.md-typeset .summary>summary::before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.info,.md-typeset details.info,.md-typeset .admonition.todo,.md-typeset details.todo{border-color:#00b8d4}.md-typeset .info>.admonition-title,.md-typeset .info>summary,.md-typeset .todo>.admonition-title,.md-typeset .todo>summary{background-color:rgba(0,184,212,.1);border-color:#00b8d4}.md-typeset .info>.admonition-title::before,.md-typeset .info>summary::before,.md-typeset .todo>.admonition-title::before,.md-typeset .todo>summary::before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.tip,.md-typeset details.tip,.md-typeset .admonition.important,.md-typeset details.important,.md-typeset .admonition.hint,.md-typeset details.hint{border-color:#00bfa5}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary,.md-typeset .important>.admonition-title,.md-typeset .important>summary,.md-typeset .hint>.admonition-title,.md-typeset .hint>summary{background-color:rgba(0,191,165,.1);border-color:#00bfa5}.md-typeset .tip>.admonition-title::before,.md-typeset .tip>summary::before,.md-typeset .important>.admonition-title::before,.md-typeset .important>summary::before,.md-typeset .hint>.admonition-title::before,.md-typeset .hint>summary::before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.success,.md-typeset details.success,.md-typeset .admonition.done,.md-typeset details.done,.md-typeset .admonition.check,.md-typeset details.check{border-color:#00c853}.md-typeset .success>.admonition-title,.md-typeset .success>summary,.md-typeset .done>.admonition-title,.md-typeset .done>summary,.md-typeset .check>.admonition-title,.md-typeset .check>summary{background-color:rgba(0,200,83,.1);border-color:#00c853}.md-typeset .success>.admonition-title::before,.md-typeset .success>summary::before,.md-typeset .done>.admonition-title::before,.md-typeset .done>summary::before,.md-typeset .check>.admonition-title::before,.md-typeset .check>summary::before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.question,.md-typeset details.question,.md-typeset .admonition.faq,.md-typeset details.faq,.md-typeset .admonition.help,.md-typeset details.help{border-color:#64dd17}.md-typeset .question>.admonition-title,.md-typeset .question>summary,.md-typeset .faq>.admonition-title,.md-typeset .faq>summary,.md-typeset .help>.admonition-title,.md-typeset .help>summary{background-color:rgba(100,221,23,.1);border-color:#64dd17}.md-typeset .question>.admonition-title::before,.md-typeset .question>summary::before,.md-typeset .faq>.admonition-title::before,.md-typeset .faq>summary::before,.md-typeset .help>.admonition-title::before,.md-typeset .help>summary::before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.warning,.md-typeset details.warning,.md-typeset .admonition.attention,.md-typeset details.attention,.md-typeset .admonition.caution,.md-typeset details.caution{border-color:#ff9100}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary,.md-typeset .attention>.admonition-title,.md-typeset .attention>summary,.md-typeset .caution>.admonition-title,.md-typeset .caution>summary{background-color:rgba(255,145,0,.1);border-color:#ff9100}.md-typeset .warning>.admonition-title::before,.md-typeset .warning>summary::before,.md-typeset .attention>.admonition-title::before,.md-typeset .attention>summary::before,.md-typeset .caution>.admonition-title::before,.md-typeset .caution>summary::before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.failure,.md-typeset details.failure,.md-typeset .admonition.missing,.md-typeset details.missing,.md-typeset .admonition.fail,.md-typeset details.fail{border-color:#ff5252}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary,.md-typeset .missing>.admonition-title,.md-typeset .missing>summary,.md-typeset .fail>.admonition-title,.md-typeset .fail>summary{background-color:rgba(255,82,82,.1);border-color:#ff5252}.md-typeset .failure>.admonition-title::before,.md-typeset .failure>summary::before,.md-typeset .missing>.admonition-title::before,.md-typeset .missing>summary::before,.md-typeset .fail>.admonition-title::before,.md-typeset .fail>summary::before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.danger,.md-typeset details.danger,.md-typeset .admonition.error,.md-typeset details.error{border-color:#ff1744}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary,.md-typeset .error>.admonition-title,.md-typeset .error>summary{background-color:rgba(255,23,68,.1);border-color:#ff1744}.md-typeset .danger>.admonition-title::before,.md-typeset .danger>summary::before,.md-typeset .error>.admonition-title::before,.md-typeset .error>summary::before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:rgba(245,0,87,.1);border-color:#f50057}.md-typeset .bug>.admonition-title::before,.md-typeset .bug>summary::before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.example,.md-typeset details.example{border-color:#651fff}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:rgba(101,31,255,.1);border-color:#651fff}.md-typeset .example>.admonition-title::before,.md-typeset .example>summary::before{background-color:#651fff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.md-typeset .admonition.quote,.md-typeset details.quote,.md-typeset .admonition.cite,.md-typeset details.cite{border-color:#9e9e9e}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary,.md-typeset .cite>.admonition-title,.md-typeset .cite>summary{background-color:rgba(158,158,158,.1);border-color:#9e9e9e}.md-typeset .quote>.admonition-title::before,.md-typeset .quote>summary::before,.md-typeset .cite>.admonition-title::before,.md-typeset .cite>summary::before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.codehilite .o,.highlight .o,.codehilite .ow,.highlight .ow{color:var(--md-code-hl-operator-color)}.codehilite .p,.highlight .p{color:var(--md-code-hl-punctuation-color)}.codehilite .cpf,.highlight .cpf,.codehilite .l,.highlight .l,.codehilite .s,.highlight .s,.codehilite .sb,.highlight .sb,.codehilite .sc,.highlight .sc,.codehilite .s2,.highlight .s2,.codehilite .si,.highlight .si,.codehilite .s1,.highlight .s1,.codehilite .ss,.highlight .ss{color:var(--md-code-hl-string-color)}.codehilite .cp,.highlight .cp,.codehilite .se,.highlight .se,.codehilite .sh,.highlight .sh,.codehilite .sr,.highlight .sr,.codehilite .sx,.highlight .sx{color:var(--md-code-hl-special-color)}.codehilite .m,.highlight .m,.codehilite .mf,.highlight .mf,.codehilite .mh,.highlight .mh,.codehilite .mi,.highlight .mi,.codehilite .il,.highlight .il,.codehilite .mo,.highlight .mo{color:var(--md-code-hl-number-color)}.codehilite .k,.highlight .k,.codehilite .kd,.highlight .kd,.codehilite .kn,.highlight .kn,.codehilite .kp,.highlight .kp,.codehilite .kr,.highlight .kr,.codehilite .kt,.highlight .kt{color:var(--md-code-hl-keyword-color)}.codehilite .kc,.highlight .kc,.codehilite .n,.highlight .n{color:var(--md-code-hl-name-color)}.codehilite .no,.highlight .no,.codehilite .nb,.highlight .nb,.codehilite .bp,.highlight .bp{color:var(--md-code-hl-constant-color)}.codehilite .nc,.highlight .nc,.codehilite .ne,.highlight .ne,.codehilite .nf,.highlight .nf,.codehilite .nn,.highlight .nn{color:var(--md-code-hl-function-color)}.codehilite .nd,.highlight .nd,.codehilite .ni,.highlight .ni,.codehilite .nl,.highlight .nl,.codehilite .nt,.highlight .nt{color:var(--md-code-hl-keyword-color)}.codehilite .c,.highlight .c,.codehilite .cm,.highlight .cm,.codehilite .c1,.highlight .c1,.codehilite .ch,.highlight .ch,.codehilite .cs,.highlight .cs,.codehilite .sd,.highlight .sd{color:var(--md-code-hl-comment-color)}.codehilite .na,.highlight .na,.codehilite .nv,.highlight .nv,.codehilite .vc,.highlight .vc,.codehilite .vg,.highlight .vg,.codehilite .vi,.highlight .vi{color:var(--md-code-hl-variable-color)}.codehilite .ge,.highlight .ge,.codehilite .gr,.highlight .gr,.codehilite .gh,.highlight .gh,.codehilite .go,.highlight .go,.codehilite .gp,.highlight .gp,.codehilite .gs,.highlight .gs,.codehilite .gu,.highlight .gu,.codehilite .gt,.highlight .gt{color:var(--md-code-hl-generic-color)}.codehilite .gd,.highlight .gd,.codehilite .gi,.highlight .gi{margin:0 -0.125em;padding:0 .125em;border-radius:.1rem}.codehilite .gd,.highlight .gd{background-color:var(--md-typeset-del-color)}.codehilite .gi,.highlight .gi{background-color:var(--md-typeset-ins-color)}.codehilite .hll,.highlight .hll{display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em;background-color:var(--md-code-hl-color)}.codehilitetable,.highlighttable{display:block;overflow:hidden}.codehilitetable tbody,.highlighttable tbody,.codehilitetable td,.highlighttable td{display:block;padding:0}.codehilitetable tr,.highlighttable tr{display:flex}.codehilitetable pre,.highlighttable pre{margin:0}.codehilitetable .linenos,.highlighttable .linenos{padding:.7720588235em 1.1764705882em;padding-right:0;font-size:.85em;background-color:var(--md-code-bg-color);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.codehilitetable .linenodiv,.highlighttable .linenodiv{padding-right:.5882352941em;box-shadow:-0.05rem 0 var(--md-default-fg-color--lighter) inset}.codehilitetable .linenodiv pre,.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.codehilitetable .code,.highlighttable .code{flex:1;overflow:hidden}.md-typeset .codehilitetable,.md-typeset .highlighttable{margin:1em 0;direction:ltr;border-radius:.1rem}.md-typeset .codehilitetable code,.md-typeset .highlighttable code{border-radius:0}@media screen and (max-width: 44.9375em){.md-typeset>.codehilite,.md-typeset>.highlight{margin:1em -0.8rem}.md-typeset>.codehilite .hll,.md-typeset>.highlight .hll{margin:0 -0.8rem;padding:0 .8rem}.md-typeset>.codehilite code,.md-typeset>.highlight code{border-radius:0}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{margin:1em -0.8rem;border-radius:0}.md-typeset>.codehilitetable .hll,.md-typeset>.highlighttable .hll{margin:0 -0.8rem;padding:0 .8rem}}:root{--md-footnotes-icon: url("data:image/svg+xml;charset=utf-8,")}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{transition:color 125ms}.md-typeset .footnote li:target{color:var(--md-default-fg-color)}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-ref{display:inline-block;pointer-events:initial}.md-typeset .footnote-backref{display:inline-block;color:var(--md-typeset-a-color);font-size:0;vertical-align:text-bottom;transform:translateX(0.25rem);opacity:0;transition:color 250ms,transform 250ms 250ms,opacity 125ms 250ms}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-0.25rem)}.md-typeset .footnote-backref::before{display:inline-block;width:.8rem;height:.8rem;background-color:currentColor;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .footnote-backref::before svg{transform:scaleX(-1)}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);transform:translateX(0);opacity:1}}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;visibility:hidden;opacity:0;transition:color 250ms,visibility 0ms 500ms,opacity 125ms}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:initial}html body .md-typeset .headerlink{color:var(--md-default-fg-color--lighter)}@media print{.md-typeset .headerlink{display:none}}.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink,.md-typeset .headerlink:focus{visibility:visible;opacity:1;transition:color 250ms,visibility 0ms,opacity 125ms}.md-typeset :target>.headerlink,.md-typeset .headerlink:focus,.md-typeset .headerlink:hover{color:var(--md-accent-fg-color)}.md-typeset :target{scroll-margin-top:3.6rem}.md-typeset h3:target,.md-typeset h2:target,.md-typeset h1:target{scroll-margin-top:3.4rem}.md-typeset h4:target{scroll-margin-top:3.45rem}.md-typeset div.arithmatex{overflow-x:scroll}@media screen and (max-width: 44.9375em){.md-typeset div.arithmatex{margin:0 -0.8rem}}.md-typeset div.arithmatex>*{width:-webkit-min-content;width:-moz-min-content;width:min-content;margin:1em auto !important;padding:0 .8rem;overflow:auto;touch-action:auto}.md-typeset del.critic,.md-typeset ins.critic,.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment::before{content:"/* "}.md-typeset .critic.comment::after{content:" */"}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;overflow:auto;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}:root{--md-details-icon: url("data:image/svg+xml;charset=utf-8,")}.md-typeset details{display:block;padding-top:0;overflow:visible}.md-typeset details[open]>summary::after{transform:rotate(90deg)}.md-typeset details:not([open]){padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}.md-typeset details::after{display:table;content:""}.md-typeset summary{display:block;min-height:1rem;padding:.4rem 1.8rem .4rem 2rem;border-top-left-radius:.1rem;border-top-right-radius:.1rem;cursor:pointer}.md-typeset summary:not(.focus-visible){outline:none;-webkit-tap-highlight-color:transparent}[dir=rtl] .md-typeset summary{padding:.4rem 2.2rem .4rem 1.8rem}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset summary::after{position:absolute;top:.4rem;right:.4rem;width:1rem;height:1rem;background-color:currentColor;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transform:rotate(0deg);transition:transform 250ms;content:""}[dir=rtl] .md-typeset summary::after{right:initial;left:.4rem;transform:rotate(180deg)}.md-typeset img.emojione,.md-typeset img.twemoji,.md-typeset img.gemoji{width:1.125em;max-height:100%;vertical-align:-15%}.md-typeset span.twemoji{display:inline-block;height:1.125em;vertical-align:text-top}.md-typeset span.twemoji svg{width:1.125em;max-height:100%;fill:currentColor}.highlight [data-linenos]::before{position:-webkit-sticky;position:sticky;left:-1.1764705882em;float:left;margin-right:1.1764705882em;margin-left:-1.1764705882em;padding-left:1.1764705882em;color:var(--md-default-fg-color--light);background-color:var(--md-code-bg-color);box-shadow:-0.05rem 0 var(--md-default-fg-color--lighter) inset;content:attr(data-linenos);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .keys kbd::before,.md-typeset .keys kbd::after{position:relative;margin:0;color:inherit;-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.md-typeset .keys span{padding:0 .2em;color:var(--md-default-fg-color--light)}.md-typeset .keys .key-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-left-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-right-alt::before{padding-right:.4em;content:"⎇"}.md-typeset .keys .key-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-left-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-right-command::before{padding-right:.4em;content:"⌘"}.md-typeset .keys .key-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-left-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-right-control::before{padding-right:.4em;content:"⌃"}.md-typeset .keys .key-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-left-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-right-meta::before{padding-right:.4em;content:"◆"}.md-typeset .keys .key-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-left-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-right-option::before{padding-right:.4em;content:"⌥"}.md-typeset .keys .key-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-left-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-right-shift::before{padding-right:.4em;content:"⇧"}.md-typeset .keys .key-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-left-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-right-super::before{padding-right:.4em;content:"❖"}.md-typeset .keys .key-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-left-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-right-windows::before{padding-right:.4em;content:"⊞"}.md-typeset .keys .key-arrow-down::before{padding-right:.4em;content:"↓"}.md-typeset .keys .key-arrow-left::before{padding-right:.4em;content:"←"}.md-typeset .keys .key-arrow-right::before{padding-right:.4em;content:"→"}.md-typeset .keys .key-arrow-up::before{padding-right:.4em;content:"↑"}.md-typeset .keys .key-backspace::before{padding-right:.4em;content:"⌫"}.md-typeset .keys .key-backtab::before{padding-right:.4em;content:"⇤"}.md-typeset .keys .key-caps-lock::before{padding-right:.4em;content:"⇪"}.md-typeset .keys .key-clear::before{padding-right:.4em;content:"⌧"}.md-typeset .keys .key-context-menu::before{padding-right:.4em;content:"☰"}.md-typeset .keys .key-delete::before{padding-right:.4em;content:"⌦"}.md-typeset .keys .key-eject::before{padding-right:.4em;content:"⏏"}.md-typeset .keys .key-end::before{padding-right:.4em;content:"⤓"}.md-typeset .keys .key-escape::before{padding-right:.4em;content:"⎋"}.md-typeset .keys .key-home::before{padding-right:.4em;content:"⤒"}.md-typeset .keys .key-insert::before{padding-right:.4em;content:"⎀"}.md-typeset .keys .key-page-down::before{padding-right:.4em;content:"⇟"}.md-typeset .keys .key-page-up::before{padding-right:.4em;content:"⇞"}.md-typeset .keys .key-print-screen::before{padding-right:.4em;content:"⎙"}.md-typeset .keys .key-tab::after{padding-left:.4em;content:"⇥"}.md-typeset .keys .key-num-enter::after{padding-left:.4em;content:"⌤"}.md-typeset .keys .key-enter::after{padding-left:.4em;content:"⏎"}.md-typeset .tabbed-content{display:none;order:99;width:100%;box-shadow:0 -0.05rem var(--md-default-fg-color--lightest)}@media print{.md-typeset .tabbed-content{display:block;order:initial}}.md-typeset .tabbed-content>pre:only-child,.md-typeset .tabbed-content>.codehilite:only-child pre,.md-typeset .tabbed-content>.codehilitetable:only-child,.md-typeset .tabbed-content>.highlight:only-child pre,.md-typeset .tabbed-content>.highlighttable:only-child{margin:0}.md-typeset .tabbed-content>pre:only-child>code,.md-typeset .tabbed-content>.codehilite:only-child pre>code,.md-typeset .tabbed-content>.codehilitetable:only-child>code,.md-typeset .tabbed-content>.highlight:only-child pre>code,.md-typeset .tabbed-content>.highlighttable:only-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-content>.tabbed-set{margin:0}.md-typeset .tabbed-set{position:relative;display:flex;flex-wrap:wrap;margin:1em 0;border-radius:.1rem}.md-typeset .tabbed-set>input{position:absolute;width:0;height:0;opacity:0}.md-typeset .tabbed-set>input:checked+label{color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:checked+label+.tabbed-content{display:block}.md-typeset .tabbed-set>input:focus+label{outline-style:auto}.md-typeset .tabbed-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.md-typeset .tabbed-set>label{z-index:1;width:auto;padding:.9375em 1.25em .78125em;color:var(--md-default-fg-color--light);font-weight:700;font-size:.64rem;border-bottom:.1rem solid transparent;cursor:pointer;transition:color 250ms}html .md-typeset .tabbed-set>label:hover{color:var(--md-accent-fg-color)}:root{--md-tasklist-icon: url( "data:image/svg+xml;charset=utf-8," );--md-tasklist-icon--checked: url( "data:image/svg+xml;charset=utf-8," )}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:initial}.md-typeset .task-list-control .task-list-indicator::before{position:absolute;top:.15em;left:-1.5em;width:1.25em;height:1.25em;background-color:var(--md-default-fg-color--lightest);-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}[dir=rtl] .md-typeset .task-list-control .task-list-indicator::before{right:-1.5em;left:initial}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator::before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}.md-typeset .task-list-control [type=checkbox]{z-index:-1;opacity:0} diff --git a/latest/assets/stylesheets/palette.47d7edde.min.css b/latest/assets/stylesheets/palette.47d7edde.min.css new file mode 100644 index 00000000..e990a89a --- /dev/null +++ b/latest/assets/stylesheets/palette.47d7edde.min.css @@ -0,0 +1 @@ +[data-md-color-accent=red]{--md-accent-fg-color: hsla(348, 100%, 55%, 1);--md-accent-fg-color--transparent: hsla(348, 100%, 55%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=pink]{--md-accent-fg-color: hsla(339, 100%, 48%, 1);--md-accent-fg-color--transparent: hsla(339, 100%, 48%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=purple]{--md-accent-fg-color: hsla(291, 96%, 62%, 1);--md-accent-fg-color--transparent: hsla(291, 96%, 62%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=deep-purple]{--md-accent-fg-color: hsla(256, 100%, 65%, 1);--md-accent-fg-color--transparent: hsla(256, 100%, 65%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=indigo]{--md-accent-fg-color: hsla(231, 99%, 66%, 1);--md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=blue]{--md-accent-fg-color: hsla(218, 100%, 63%, 1);--md-accent-fg-color--transparent: hsla(218, 100%, 63%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=light-blue]{--md-accent-fg-color: hsla(203, 100%, 46%, 1);--md-accent-fg-color--transparent: hsla(203, 100%, 46%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=cyan]{--md-accent-fg-color: hsla(188, 100%, 42%, 1);--md-accent-fg-color--transparent: hsla(188, 100%, 42%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=teal]{--md-accent-fg-color: hsla(172, 100%, 37%, 1);--md-accent-fg-color--transparent: hsla(172, 100%, 37%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=green]{--md-accent-fg-color: hsla(145, 100%, 39%, 1);--md-accent-fg-color--transparent: hsla(145, 100%, 39%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=light-green]{--md-accent-fg-color: hsla(97, 81%, 48%, 1);--md-accent-fg-color--transparent: hsla(97, 81%, 48%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-accent=lime]{--md-accent-fg-color: hsla(75, 100%, 46%, 1);--md-accent-fg-color--transparent: hsla(75, 100%, 46%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=yellow]{--md-accent-fg-color: hsla(50, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(50, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=amber]{--md-accent-fg-color: hsla(40, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(40, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=orange]{--md-accent-fg-color: hsla(34, 100%, 50%, 1);--md-accent-fg-color--transparent: hsla(34, 100%, 50%, 0.1);--md-accent-bg-color: hsla(0, 0%, 0%, 0.87);--md-accent-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-accent=deep-orange]{--md-accent-fg-color: hsla(14, 100%, 63%, 1);--md-accent-fg-color--transparent: hsla(14, 100%, 63%, 0.1);--md-accent-bg-color: hsla(0, 0%, 100%, 1);--md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=red]{--md-primary-fg-color: hsla(1, 83%, 63%, 1);--md-primary-fg-color--light: hsla(0, 69%, 67%, 1);--md-primary-fg-color--dark: hsla(1, 77%, 55%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=pink]{--md-primary-fg-color: hsla(340, 82%, 52%, 1);--md-primary-fg-color--light: hsla(340, 82%, 59%, 1);--md-primary-fg-color--dark: hsla(336, 78%, 43%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=purple]{--md-primary-fg-color: hsla(291, 47%, 51%, 1);--md-primary-fg-color--light: hsla(291, 47%, 60%, 1);--md-primary-fg-color--dark: hsla(287, 65%, 40%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=deep-purple]{--md-primary-fg-color: hsla(262, 47%, 55%, 1);--md-primary-fg-color--light: hsla(262, 47%, 63%, 1);--md-primary-fg-color--dark: hsla(262, 52%, 47%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=indigo]{--md-primary-fg-color: hsla(231, 48%, 48%, 1);--md-primary-fg-color--light: hsla(231, 44%, 56%, 1);--md-primary-fg-color--dark: hsla(232, 54%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=blue]{--md-primary-fg-color: hsla(207, 90%, 54%, 1);--md-primary-fg-color--light: hsla(207, 90%, 61%, 1);--md-primary-fg-color--dark: hsla(210, 79%, 46%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=light-blue]{--md-primary-fg-color: hsla(199, 98%, 48%, 1);--md-primary-fg-color--light: hsla(199, 92%, 56%, 1);--md-primary-fg-color--dark: hsla(201, 98%, 41%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=cyan]{--md-primary-fg-color: hsla(187, 100%, 42%, 1);--md-primary-fg-color--light: hsla(187, 71%, 50%, 1);--md-primary-fg-color--dark: hsla(186, 100%, 33%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=teal]{--md-primary-fg-color: hsla(174, 100%, 29%, 1);--md-primary-fg-color--light: hsla(174, 63%, 40%, 1);--md-primary-fg-color--dark: hsla(173, 100%, 24%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=green]{--md-primary-fg-color: hsla(122, 39%, 49%, 1);--md-primary-fg-color--light: hsla(123, 38%, 57%, 1);--md-primary-fg-color--dark: hsla(123, 43%, 39%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=light-green]{--md-primary-fg-color: hsla(88, 50%, 53%, 1);--md-primary-fg-color--light: hsla(88, 50%, 60%, 1);--md-primary-fg-color--dark: hsla(92, 48%, 42%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=lime]{--md-primary-fg-color: hsla(66, 70%, 54%, 1);--md-primary-fg-color--light: hsla(66, 70%, 61%, 1);--md-primary-fg-color--dark: hsla(62, 61%, 44%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=yellow]{--md-primary-fg-color: hsla(54, 100%, 62%, 1);--md-primary-fg-color--light: hsla(54, 100%, 67%, 1);--md-primary-fg-color--dark: hsla(43, 96%, 58%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=amber]{--md-primary-fg-color: hsla(45, 100%, 51%, 1);--md-primary-fg-color--light: hsla(45, 100%, 58%, 1);--md-primary-fg-color--dark: hsla(38, 100%, 50%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=orange]{--md-primary-fg-color: hsla(36, 100%, 57%, 1);--md-primary-fg-color--light: hsla(36, 100%, 57%, 1);--md-primary-fg-color--dark: hsla(33, 100%, 49%, 1);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54)}[data-md-color-primary=deep-orange]{--md-primary-fg-color: hsla(14, 100%, 63%, 1);--md-primary-fg-color--light: hsla(14, 100%, 70%, 1);--md-primary-fg-color--dark: hsla(14, 91%, 54%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=brown]{--md-primary-fg-color: hsla(16, 25%, 38%, 1);--md-primary-fg-color--light: hsla(16, 18%, 47%, 1);--md-primary-fg-color--dark: hsla(14, 26%, 29%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=grey]{--md-primary-fg-color: hsla(0, 0%, 46%, 1);--md-primary-fg-color--light: hsla(0, 0%, 62%, 1);--md-primary-fg-color--dark: hsla(0, 0%, 38%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=blue-grey]{--md-primary-fg-color: hsla(199, 18%, 40%, 1);--md-primary-fg-color--light: hsla(200, 18%, 46%, 1);--md-primary-fg-color--dark: hsla(199, 18%, 33%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7)}[data-md-color-primary=white]{--md-primary-fg-color: hsla(0, 0%, 100%, 1);--md-primary-fg-color--light: hsla(0, 0%, 100%, 0.7);--md-primary-fg-color--dark: hsla(0, 0%, 0%, 0.07);--md-primary-bg-color: hsla(0, 0%, 0%, 0.87);--md-primary-bg-color--light: hsla(0, 0%, 0%, 0.54);--md-typeset-a-color: hsla(231, 48%, 48%, 1)}@media screen and (min-width: 60em){[data-md-color-primary=white] .md-search__form{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:rgba(0,0,0,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:rgba(0,0,0,.87)}}@media screen and (min-width: 76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07)}}[data-md-color-primary=black]{--md-primary-fg-color: hsla(0, 0%, 0%, 1);--md-primary-fg-color--light: hsla(0, 0%, 0%, 0.54);--md-primary-fg-color--dark: hsla(0, 0%, 0%, 1);--md-primary-bg-color: hsla(0, 0%, 100%, 1);--md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7);--md-typeset-a-color: hsla(231, 48%, 48%, 1)}[data-md-color-primary=black] .md-header{background-color:#000}@media screen and (max-width: 59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:rgba(0,0,0,.87)}}@media screen and (min-width: 60em){[data-md-color-primary=black] .md-search__form{background-color:rgba(255,255,255,.12)}[data-md-color-primary=black] .md-search__form:hover{background-color:rgba(255,255,255,.3)}}@media screen and (max-width: 76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width: 76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}}@media screen{[data-md-color-scheme=slate]{--md-hue: 232;--md-default-fg-color: hsla(var(--md-hue), 75%, 95%, 1);--md-default-fg-color--light: hsla(var(--md-hue), 75%, 90%, 0.62);--md-default-fg-color--lighter: hsla(var(--md-hue), 75%, 90%, 0.32);--md-default-fg-color--lightest: hsla(var(--md-hue), 75%, 90%, 0.12);--md-default-bg-color: hsla(var(--md-hue), 15%, 21%, 1);--md-default-bg-color--light: hsla(var(--md-hue), 15%, 21%, 0.54);--md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 21%, 0.26);--md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 21%, 0.07);--md-code-fg-color: hsla(var(--md-hue), 18%, 86%, 1);--md-code-bg-color: hsla(var(--md-hue), 15%, 15%, 1);--md-code-hl-color: hsla(218, 100%, 63%, 0.15);--md-code-hl-number-color: hsla(6, 74%, 63%, 1);--md-code-hl-special-color: hsla(340, 83%, 66%, 1);--md-code-hl-function-color: hsla(291, 57%, 65%, 1);--md-code-hl-constant-color: hsla(250, 62%, 70%, 1);--md-code-hl-keyword-color: hsla(219, 66%, 64%, 1);--md-code-hl-string-color: hsla(150, 58%, 44%, 1);--md-typeset-a-color: var(--md-primary-fg-color--light);--md-typeset-mark-color: hsla(218, 100%, 63%, 0.3);--md-typeset-kbd-color: hsla(var(--md-hue), 15%, 94%, 0.12);--md-typeset-kbd-accent-color: hsla(var(--md-hue), 15%, 94%, 0.2);--md-typeset-kbd-border-color: hsla(var(--md-hue), 15%, 14%, 1);--md-admonition-bg-color: hsla(var(--md-hue), 0%, 100%, 0.025);--md-footer-bg-color: hsla(var(--md-hue), 15%, 12%, 0.87);--md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 10%, 1)}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color: hsla(231, 44%, 56%, 1)}} diff --git a/latest/change-log/index.html b/latest/change-log/index.html index c32dc0f5..c1c0f0cd 100644 --- a/latest/change-log/index.html +++ b/latest/change-log/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/citation/index.html b/latest/citation/index.html index c6651bcd..a0da12c0 100644 --- a/latest/citation/index.html +++ b/latest/citation/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/code_of_conduct/index.html b/latest/code_of_conduct/index.html index 9ae55900..9a3b87a2 100644 --- a/latest/code_of_conduct/index.html +++ b/latest/code_of_conduct/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/developers/documentation/index.html b/latest/developers/documentation/index.html index e664be34..efade6c0 100644 --- a/latest/developers/documentation/index.html +++ b/latest/developers/documentation/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/developers/git-flow/index.html b/latest/developers/git-flow/index.html index 11421fff..d71776b4 100644 --- a/latest/developers/git-flow/index.html +++ b/latest/developers/git-flow/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/developers/test-cases/index.html b/latest/developers/test-cases/index.html index f511c774..467a2b43 100644 --- a/latest/developers/test-cases/index.html +++ b/latest/developers/test-cases/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/developers/testing/index.html b/latest/developers/testing/index.html index f5612999..da6bedf3 100644 --- a/latest/developers/testing/index.html +++ b/latest/developers/testing/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/developers/virtual-environments/index.html b/latest/developers/virtual-environments/index.html index c214dece..e7e52dde 100644 --- a/latest/developers/virtual-environments/index.html +++ b/latest/developers/virtual-environments/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/add-new-features/index.html b/latest/features/add-new-features/index.html index 19095a9d..89362b94 100644 --- a/latest/features/add-new-features/index.html +++ b/latest/features/add-new-features/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/feature-introduction/index.html b/latest/features/feature-introduction/index.html index 220aa34b..5594ada3 100644 --- a/latest/features/feature-introduction/index.html +++ b/latest/features/feature-introduction/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/fitbit-heartrate-intraday/index.html b/latest/features/fitbit-heartrate-intraday/index.html index 5d66fc5c..efadd2f1 100644 --- a/latest/features/fitbit-heartrate-intraday/index.html +++ b/latest/features/fitbit-heartrate-intraday/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/fitbit-heartrate-summary/index.html b/latest/features/fitbit-heartrate-summary/index.html index 422ee80c..dec62033 100644 --- a/latest/features/fitbit-heartrate-summary/index.html +++ b/latest/features/fitbit-heartrate-summary/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/fitbit-sleep-summary/index.html b/latest/features/fitbit-sleep-summary/index.html index cfe2a4a1..f3ebf2b5 100644 --- a/latest/features/fitbit-sleep-summary/index.html +++ b/latest/features/fitbit-sleep-summary/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/fitbit-steps-intraday/index.html b/latest/features/fitbit-steps-intraday/index.html index a78938a1..4c06cde5 100644 --- a/latest/features/fitbit-steps-intraday/index.html +++ b/latest/features/fitbit-steps-intraday/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/fitbit-steps-summary/index.html b/latest/features/fitbit-steps-summary/index.html index 3f30ad10..7cbad13a 100644 --- a/latest/features/fitbit-steps-summary/index.html +++ b/latest/features/fitbit-steps-summary/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-accelerometer/index.html b/latest/features/phone-accelerometer/index.html index a0f0f2e0..f34340fb 100644 --- a/latest/features/phone-accelerometer/index.html +++ b/latest/features/phone-accelerometer/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-activity-recognition/index.html b/latest/features/phone-activity-recognition/index.html index 3d06d640..daa2276b 100644 --- a/latest/features/phone-activity-recognition/index.html +++ b/latest/features/phone-activity-recognition/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-applications-foreground/index.html b/latest/features/phone-applications-foreground/index.html index 5f538757..b173fdcf 100644 --- a/latest/features/phone-applications-foreground/index.html +++ b/latest/features/phone-applications-foreground/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-battery/index.html b/latest/features/phone-battery/index.html index a68e5b22..25c099ae 100644 --- a/latest/features/phone-battery/index.html +++ b/latest/features/phone-battery/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-bluetooth/index.html b/latest/features/phone-bluetooth/index.html index 5c0d460a..8e153b35 100644 --- a/latest/features/phone-bluetooth/index.html +++ b/latest/features/phone-bluetooth/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-calls/index.html b/latest/features/phone-calls/index.html index 2cb66022..41290c9e 100644 --- a/latest/features/phone-calls/index.html +++ b/latest/features/phone-calls/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-conversation/index.html b/latest/features/phone-conversation/index.html index f6724e22..04f4746c 100644 --- a/latest/features/phone-conversation/index.html +++ b/latest/features/phone-conversation/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-data-yield/index.html b/latest/features/phone-data-yield/index.html index 6cf88bc9..8801fab2 100644 --- a/latest/features/phone-data-yield/index.html +++ b/latest/features/phone-data-yield/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-light/index.html b/latest/features/phone-light/index.html index 6d924788..c7f35e9a 100644 --- a/latest/features/phone-light/index.html +++ b/latest/features/phone-light/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-locations/index.html b/latest/features/phone-locations/index.html index eea5fb60..e5a907ad 100644 --- a/latest/features/phone-locations/index.html +++ b/latest/features/phone-locations/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-screen/index.html b/latest/features/phone-screen/index.html index acb3c681..3b43dfe5 100644 --- a/latest/features/phone-screen/index.html +++ b/latest/features/phone-screen/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-wifi-connected/index.html b/latest/features/phone-wifi-connected/index.html index a513879c..5cc1c621 100644 --- a/latest/features/phone-wifi-connected/index.html +++ b/latest/features/phone-wifi-connected/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/features/phone-wifi-visible/index.html b/latest/features/phone-wifi-visible/index.html index 7fb79c45..ed8f1c82 100644 --- a/latest/features/phone-wifi-visible/index.html +++ b/latest/features/phone-wifi-visible/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/file-structure/index.html b/latest/file-structure/index.html index b31328c0..ff7e5c1c 100644 --- a/latest/file-structure/index.html +++ b/latest/file-structure/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/index.html b/latest/index.html index 4b13376f..8d2c536d 100644 --- a/latest/index.html +++ b/latest/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +

    How does it work?

    RAPIDS is formed by R and Python scripts orchestrated by Snakemake. We suggest you read Snakemake’s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.

    @@ -1090,7 +1157,7 @@
  • Private. All your data is processed locally.
  • How is it organized?

    -

    In broad terms the config.yaml, .env file, participants files, and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/. For more information see RAPIDS’ File Structure.

    +

    In broad terms the config.yaml, .env file, participants files, and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/. For more information see RAPIDS’ File Structure.

    @@ -1137,7 +1204,7 @@ Made with - + Material for MkDocs Insiders @@ -1162,17 +1229,17 @@
    - - + + diff --git a/latest/javascripts/extra.js b/latest/javascripts/extra.js index 47b2f759..b6d5686d 100644 --- a/latest/javascripts/extra.js +++ b/latest/javascripts/extra.js @@ -1,6 +1,6 @@ window.addEventListener("DOMContentLoaded", function() { var xhr = new XMLHttpRequest(); - xhr.open("GET", window.location + "../versions.json"); + xhr.open("GET", window.location.origin + "/versions.json"); xhr.onload = function() { var versions = JSON.parse(this.responseText); latest_version = "" diff --git a/latest/migrating-from-old-versions/index.html b/latest/migrating-from-old-versions/index.html index b341b6ac..b8968377 100644 --- a/latest/migrating-from-old-versions/index.html +++ b/latest/migrating-from-old-versions/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/search/search_index.json b/latest/search/search_index.json index 1b025ff8..6ea7075f 100644 --- a/latest/search/search_index.json +++ b/latest/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows. RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Tip Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack . Bugs and feature requests should be posted on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution How does it work? \u00b6 RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant. What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally. How is it organized? \u00b6 In broad terms the config.yaml , .env file , participants files , and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows. RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Tip Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack . Bugs and feature requests should be posted on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution","title":"Welcome to RAPIDS documentation"},{"location":"#how-does-it-work","text":"RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.","title":"How does it work?"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#how-is-it-organized","text":"In broad terms the config.yaml , .env file , participants files , and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"How is it organized?"},{"location":"change-log/","text":"Change Log \u00b6 v0.2.3 \u00b6 Fix participant IDS in the example analysis workflow v0.2.2 \u00b6 Fix readme link to docs v0.2.1 \u00b6 FIx link to the most recent version in the old version banner v0.2.0 \u00b6 Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item v0.1.0 \u00b6 New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"Change Log"},{"location":"change-log/#change-log","text":"","title":"Change Log"},{"location":"change-log/#v023","text":"Fix participant IDS in the example analysis workflow","title":"v0.2.3"},{"location":"change-log/#v022","text":"Fix readme link to docs","title":"v0.2.2"},{"location":"change-log/#v021","text":"FIx link to the most recent version in the old version banner","title":"v0.2.1"},{"location":"change-log/#v020","text":"Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item","title":"v0.2.0"},{"location":"change-log/#v010","text":"New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"v0.1.0"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Doryab (bluetooth) \u00b6 If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#doryab-bluetooth","text":"If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394","title":"Doryab (bluetooth)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"faq/","text":"Frequently Asked Questions \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda Embedded nul in string \u00b6 Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: If it\u2019s only a few rows that are causing this problem, remove the the null character from the conflictive table cell. If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Liunx: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL) In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"FAQ"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"faq/#embedded-nul-in-string","text":"Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: If it\u2019s only a few rows that are causing this problem, remove the the null character from the conflictive table cell. If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Liunx: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL) In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"Embedded nul in string"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"migrating-from-old-versions/","text":"Migrating from RAPIDS beta \u00b6 If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the new RAPIDS (we are starting with v0.1.0 ) right away, just take into account the following: Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Follow the new Configuration guide. You can copy and paste your old .env file You can migrate your old participant files: python tools/update_format_participant_files.py Get familiar with the new way of Executing RAPIDS You can proceed to reconfigure your config.yaml , its structure is more consistent and should be familiar to you. Info If you have any questions reach out to us on Slack .","title":"Migrating from beta"},{"location":"migrating-from-old-versions/#migrating-from-rapids-beta","text":"If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the new RAPIDS (we are starting with v0.1.0 ) right away, just take into account the following: Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Follow the new Configuration guide. You can copy and paste your old .env file You can migrate your old participant files: python tools/update_format_participant_files.py Get familiar with the new way of Executing RAPIDS You can proceed to reconfigure your config.yaml , its structure is more consistent and should be familiar to you. Info If you have any questions reach out to us on Slack .","title":"Migrating from RAPIDS beta"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/git-flow/","text":"Git Flow \u00b6 We use the develop/master variation of the OneFlow git flow Add New Features \u00b6 We use feature (topic) branches to implement new features Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Integrate your new feature to develop Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. git checkout feature/feature1 git pull origin develop git rebase -i develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Push your feature branch online git push --set-upstream origin feature/external-test Then open a pull request to the develop branch using Github\u2019s GUI Release a New Version \u00b6 Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log) Release a Hotfix \u00b6 Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Git Flow"},{"location":"developers/git-flow/#git-flow","text":"We use the develop/master variation of the OneFlow git flow","title":"Git Flow"},{"location":"developers/git-flow/#add-new-features","text":"We use feature (topic) branches to implement new features Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Integrate your new feature to develop Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. git checkout feature/feature1 git pull origin develop git rebase -i develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Push your feature branch online git push --set-upstream origin feature/external-test Then open a pull request to the develop branch using Github\u2019s GUI","title":"Add New Features"},{"location":"developers/git-flow/#release-a-new-version","text":"Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log)","title":"Release a New Version"},{"location":"developers/git-flow/#release-a-hotfix","text":"Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Release a Hotfix"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Python Virtual Environment \u00b6 Add new packages \u00b6 Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ). Remove packages \u00b6 Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME Update your conda environment.yaml \u00b6 After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml R Virtual Environment \u00b6 Add new packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\") Remove packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\") Update your R renv.lock \u00b6 After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Virtual Environments"},{"location":"developers/virtual-environments/#python-virtual-environment","text":"","title":"Python Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ).","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages","text":"Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME","title":"Remove packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#r-virtual-environment","text":"","title":"R Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\")","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\")","title":"Remove packages"},{"location":"developers/virtual-environments/#update-your-r-renvlock","text":"After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Update your R renv.lock"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider DORYAB provider \u00b6 This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/#doryab-provider","text":"This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"DORYAB provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"visualizations/data-quality-visualizations/","text":"Data Quality Visualizations \u00b6 We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.) 1. Histograms of phone data yield \u00b6 RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night) 2. Heatmaps of overall data yield \u00b6 These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants 3. Heatmap of recorded phone sensors \u00b6 In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 8 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant 4. Heatmap of sensor row count \u00b6 These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 16 phone sensors (including data yield) of t01\u2019s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"Data Quality"},{"location":"visualizations/data-quality-visualizations/#data-quality-visualizations","text":"We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.)","title":"Data Quality Visualizations"},{"location":"visualizations/data-quality-visualizations/#1-histograms-of-phone-data-yield","text":"RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night)","title":"1. Histograms of phone data yield"},{"location":"visualizations/data-quality-visualizations/#2-heatmaps-of-overall-data-yield","text":"These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants","title":"2. Heatmaps of overall data yield"},{"location":"visualizations/data-quality-visualizations/#3-heatmap-of-recorded-phone-sensors","text":"In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 8 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant","title":"3. Heatmap of recorded phone sensors"},{"location":"visualizations/data-quality-visualizations/#4-heatmap-of-sensor-row-count","text":"These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 16 phone sensors (including data yield) of t01\u2019s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"4. Heatmap of sensor row count"},{"location":"visualizations/feature-visualizations/","text":"Feature Visualizations \u00b6 1. Heatmap Correlation Matrix \u00b6 Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"Features"},{"location":"visualizations/feature-visualizations/#feature-visualizations","text":"","title":"Feature Visualizations"},{"location":"visualizations/feature-visualizations/#1-heatmap-correlation-matrix","text":"Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"1. Heatmap Correlation Matrix"},{"location":"workflow-examples/analysis/","text":"Analysis Workflow Example \u00b6 TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers Why should I integrate my analysis in RAPIDS? \u00b6 Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS. Analysis workflow structure \u00b6 To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules . Description of the study modeled in our analysis workflow example \u00b6 Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation Configure and run the analysis workflow example \u00b6 Install RAPIDS Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The example config file is at example_profile/example_config.yaml . Unzip the test database to data/external/rapids_example.sql and run: ./rapids -j1 restore_sql_file --profile example_profile Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Modules of our analysis workflow example \u00b6 1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Analysis"},{"location":"workflow-examples/analysis/#analysis-workflow-example","text":"TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers","title":"Analysis Workflow Example"},{"location":"workflow-examples/analysis/#why-should-i-integrate-my-analysis-in-rapids","text":"Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS.","title":"Why should I integrate my analysis in RAPIDS?"},{"location":"workflow-examples/analysis/#analysis-workflow-structure","text":"To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules .","title":"Analysis workflow structure"},{"location":"workflow-examples/analysis/#description-of-the-study-modeled-in-our-analysis-workflow-example","text":"Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation","title":"Description of the study modeled in our analysis workflow example"},{"location":"workflow-examples/analysis/#configure-and-run-the-analysis-workflow-example","text":"Install RAPIDS Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The example config file is at example_profile/example_config.yaml . Unzip the test database to data/external/rapids_example.sql and run: ./rapids -j1 restore_sql_file --profile example_profile Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile","title":"Configure and run the analysis workflow example"},{"location":"workflow-examples/analysis/#modules-of-our-analysis-workflow-example","text":"1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Modules of our analysis workflow example"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file +{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to RAPIDS documentation \u00b6 Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows. RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Tip Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack . Bugs and feature requests should be posted on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution Are you upgrading from RAPIDS beta ? Follow this guide How does it work? \u00b6 RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant. What are the benefits of using RAPIDS? \u00b6 Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally. How is it organized? \u00b6 In broad terms the config.yaml , .env file , participants files , and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"Home"},{"location":"#welcome-to-rapids-documentation","text":"Reproducible Analysis Pipeline for Data Streams (RAPIDS) allows you to process smartphone and wearable data to extract and create behavioral features (a.k.a. digital biomarkers), visualize mobile sensor data and structure your analysis into reproducible workflows. RAPIDS is open source, documented, modular, tested, and reproducible. At the moment we support smartphone data collected with AWARE and wearable data from Fitbit devices. Tip Questions or feedback can be posted on the #rapids channel in AWARE Framework's slack . Bugs and feature requests should be posted on Github . Join our discussions on our algorithms and assumptions for feature processing . Ready to start? Go to Installation , then to Configuration , and then to Execution Are you upgrading from RAPIDS beta ? Follow this guide","title":"Welcome to RAPIDS documentation"},{"location":"#how-does-it-work","text":"RAPIDS is formed by R and Python scripts orchestrated by Snakemake . We suggest you read Snakemake\u2019s docs but in short: every link in the analysis chain is atomic and has files as input and output. Behavioral features are processed per sensor and per participant.","title":"How does it work?"},{"location":"#what-are-the-benefits-of-using-rapids","text":"Consistent analysis . Every participant sensor dataset is analyzed in the exact same way and isolated from each other. Efficient analysis . Every analysis step is executed only once. Whenever your data or configuration changes only the affected files are updated. Parallel execution . Thanks to Snakemake, your analysis can be executed over multiple cores without changing your code. Code-free features . Extract any of the behavioral features offered by RAPIDS without writing any code. Extensible code . You can easily add your own behavioral features in R or Python, share them with the community, and keep authorship and citations. Timezone aware . Your data is adjusted to the specified timezone (multiple timezones suport coming soon ). Flexible time segments . You can extract behavioral features on time windows of any length (e.g. 5 minutes, 3 hours, 2 days), on every day or particular days (e.g. weekends, Mondays, the 1 st of each month, etc.) or around events of interest (e.g. surveys or clinical relapses). Tested code . We are constantly adding tests to make sure our behavioral features are correct. Reproducible code . If you structure your analysis within RAPIDS, you can be sure your code will run in other computers as intended thanks to R and Python virtual environments. You can share your analysis code along your publications without any overhead. Private . All your data is processed locally.","title":"What are the benefits of using RAPIDS?"},{"location":"#how-is-it-organized","text":"In broad terms the config.yaml , .env file , participants files , and time segment files are the only ones that you will have to modify. All data is stored in data/ and all scripts are stored in src/ . For more information see RAPIDS\u2019 File Structure .","title":"How is it organized?"},{"location":"change-log/","text":"Change Log \u00b6 0.3.0 \u00b6 Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README v0.2.6 \u00b6 Fix old versions banner on nested pages v0.2.5 \u00b6 Fix docs deploy typo v0.2.4 \u00b6 Fix broken links in landing page and docs deploy v0.2.3 \u00b6 Fix participant IDS in the example analysis workflow v0.2.2 \u00b6 Fix readme link to docs v0.2.1 \u00b6 FIx link to the most recent version in the old version banner v0.2.0 \u00b6 Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item v0.1.0 \u00b6 New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"Change Log"},{"location":"change-log/#change-log","text":"","title":"Change Log"},{"location":"change-log/#030","text":"Update R and Python virtual environments Add GH actions CI support for tests and docker Add release and test badges to README","title":"0.3.0"},{"location":"change-log/#v026","text":"Fix old versions banner on nested pages","title":"v0.2.6"},{"location":"change-log/#v025","text":"Fix docs deploy typo","title":"v0.2.5"},{"location":"change-log/#v024","text":"Fix broken links in landing page and docs deploy","title":"v0.2.4"},{"location":"change-log/#v023","text":"Fix participant IDS in the example analysis workflow","title":"v0.2.3"},{"location":"change-log/#v022","text":"Fix readme link to docs","title":"v0.2.2"},{"location":"change-log/#v021","text":"FIx link to the most recent version in the old version banner","title":"v0.2.1"},{"location":"change-log/#v020","text":"Add new PHONE_BLUETOOTH DORYAB provider Deprecate PHONE_BLUETOOTH RAPIDS provider Fix bug in filter_data_by_segment for Python when dataset was empty Minor doc updates New FAQ item","title":"v0.2.0"},{"location":"change-log/#v010","text":"New and more consistent docs (this website). The previous docs are marked as beta Consolidate configuration instructions Flexible time segments Simplify Fitbit behavioral feature extraction and documentation Sensor\u2019s configuration and output is more consistent Update visualizations to handle flexible day segments Create a RAPIDS execution script that allows re-computation of the pipeline after configuration changes Add citation guide Update virtual environment guide Update analysis workflow example Add a Code of Conduct Update Team page","title":"v0.1.0"},{"location":"citation/","text":"Cite RAPIDS and providers \u00b6 RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you! RAPIDS \u00b6 If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246 Panda (accelerometer) \u00b6 If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047. Stachl (applications foreground) \u00b6 If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117 Doryab (bluetooth) \u00b6 If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Barnett (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845 Doryab (locations) \u00b6 If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Citation"},{"location":"citation/#cite-rapids-and-providers","text":"RAPIDS and the community RAPIDS is a community effort and as such we want to continue recognizing the contributions from other researchers. Besides citing RAPIDS, we ask you to cite any of the authors listed below if you used those sensor providers in your analysis, thank you!","title":"Cite RAPIDS and providers"},{"location":"citation/#rapids","text":"If you used RAPIDS, please cite this paper . RAPIDS et al. citation Vega J, Li M, Aguillera K, Goel N, Joshi E, Durica KC, Kunta AR, Low CA RAPIDS: Reproducible Analysis Pipeline for Data Streams Collected with Mobile Devices JMIR Preprints. 18/08/2020:23246 DOI: 10.2196/preprints.23246 URL: https://preprints.jmir.org/preprint/23246","title":"RAPIDS"},{"location":"citation/#panda-accelerometer","text":"If you computed accelerometer features using the provider [PHONE_ACCLEROMETER][PANDA] cite this paper in addition to RAPIDS. Panda et al. citation Panda N, Solsky I, Huang EJ, Lipsitz S, Pradarelli JC, Delisle M, Cusack JC, Gadd MA, Lubitz CC, Mullen JT, Qadan M, Smith BL, Specht M, Stephen AE, Tanabe KK, Gawande AA, Onnela JP, Haynes AB. Using Smartphones to Capture Novel Recovery Metrics After Cancer Surgery. JAMA Surg. 2020 Feb 1;155(2):123-129. doi: 10.1001/jamasurg.2019.4702. PMID: 31657854; PMCID: PMC6820047.","title":"Panda (accelerometer)"},{"location":"citation/#stachl-applications-foreground","text":"If you computed applications foreground features using the app category (genre) catalogue in [PHONE_APPLICATIONS_FOREGROUND][RAPIDS] cite this paper in addition to RAPIDS. Stachl et al. citation Clemens Stachl, Quay Au, Ramona Schoedel, Samuel D. Gosling, Gabriella M. Harari, Daniel Buschek, Sarah Theres V\u00f6lkel, Tobias Schuwerk, Michelle Oldemeier, Theresa Ullmann, Heinrich Hussmann, Bernd Bischl, Markus B\u00fchner. Proceedings of the National Academy of Sciences Jul 2020, 117 (30) 17680-17687; DOI: 10.1073/pnas.1920484117","title":"Stachl (applications foreground)"},{"location":"citation/#doryab-bluetooth","text":"If you computed bluetooth features using the provider [PHONE_BLUETOOTH][DORYAB] cite this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394","title":"Doryab (bluetooth)"},{"location":"citation/#barnett-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][BARNETT] cite this paper and this paper in addition to RAPIDS. Barnett et al. citation Ian Barnett, Jukka-Pekka Onnela, Inferring mobility measures from GPS traces with missing data, Biostatistics, Volume 21, Issue 2, April 2020, Pages e98\u2013e112, https://doi.org/10.1093/biostatistics/kxy059 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Barnett (locations)"},{"location":"citation/#doryab-locations","text":"If you computed locations features using the provider [PHONE_LOCATIONS][DORYAB] cite this paper and this paper in addition to RAPIDS. Doryab et al. citation Doryab, A., Chikarsel, P., Liu, X., & Dey, A. K. (2019). Extraction of Behavioral Features from Smartphone and Wearable Data. ArXiv:1812.10394 [Cs, Stat]. http://arxiv.org/abs/1812.10394 Canzian et al. citation Luca Canzian and Mirco Musolesi. 2015. Trajectories of depression: unobtrusive monitoring of depressive states by means of smartphone mobility traces analysis. In Proceedings of the 2015 ACM International Joint Conference on Pervasive and Ubiquitous Computing (UbiComp \u201815). Association for Computing Machinery, New York, NY, USA, 1293\u20131304. DOI: https://doi.org/10.1145/2750858.2805845","title":"Doryab (locations)"},{"location":"code_of_conduct/","text":"Contributor Covenant Code of Conduct \u00b6 Our Pledge \u00b6 We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Our Standards \u00b6 Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Enforcement Responsibilities \u00b6 Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. Scope \u00b6 This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Enforcement \u00b6 Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. Enforcement Guidelines \u00b6 Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 1. Correction \u00b6 Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 2. Warning \u00b6 Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 3. Temporary Ban \u00b6 Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 4. Permanent Ban \u00b6 Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community. Attribution \u00b6 This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Code of Conduct"},{"location":"code_of_conduct/#contributor-covenant-code-of-conduct","text":"","title":"Contributor Covenant Code of Conduct"},{"location":"code_of_conduct/#our-pledge","text":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","title":"Our Pledge"},{"location":"code_of_conduct/#our-standards","text":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others\u2019 private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","title":"Our Standards"},{"location":"code_of_conduct/#enforcement-responsibilities","text":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","title":"Enforcement Responsibilities"},{"location":"code_of_conduct/#scope","text":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","title":"Scope"},{"location":"code_of_conduct/#enforcement","text":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at moshi@pitt.edu . All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","title":"Enforcement"},{"location":"code_of_conduct/#enforcement-guidelines","text":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","title":"Enforcement Guidelines"},{"location":"code_of_conduct/#1-correction","text":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","title":"1. Correction"},{"location":"code_of_conduct/#2-warning","text":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","title":"2. Warning"},{"location":"code_of_conduct/#3-temporary-ban","text":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","title":"3. Temporary Ban"},{"location":"code_of_conduct/#4-permanent-ban","text":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","title":"4. Permanent Ban"},{"location":"code_of_conduct/#attribution","text":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla\u2019s code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","title":"Attribution"},{"location":"faq/","text":"Frequently Asked Questions \u00b6 Cannot connect to your MySQL server \u00b6 Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env . Cannot start mysql in linux via brew services start mysql \u00b6 Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start Every time I run force the download_dataset rule all rules are executed \u00b6 Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed. Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule. \u00b6 Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables. How do I install RAPIDS on Ubuntu 16.04 \u00b6 Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion. mysql.h cannot be found \u00b6 Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev No package libcurl found \u00b6 Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev Configuration failed because openssl was not found. \u00b6 Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev Configuration failed because libxml-2.0 was not found \u00b6 Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev SSL connection error when running RAPIDS \u00b6 Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here DB_TABLES key not found \u00b6 Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : [] Error while updating your conda environment in Ubuntu \u00b6 Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda Embedded nul in string \u00b6 Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: If it\u2019s only a few rows that are causing this problem, remove the the null character from the conflictive table cell. If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Liunx: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL) In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"FAQ"},{"location":"faq/#frequently-asked-questions","text":"","title":"Frequently Asked Questions"},{"location":"faq/#cannot-connect-to-your-mysql-server","text":"Problem **Error in .local ( drv, \\. .. ) :** **Failed to connect to database: Error: Can \\' t initialize character set unknown ( path: compiled \\_ in ) ** : Calls: dbConnect -> dbConnect -> .local -> .Call Execution halted [ Tue Mar 10 19 :40:15 2020 ] Error in rule download_dataset: jobid: 531 output: data/raw/p60/locations_raw.csv RuleException: CalledProcessError in line 20 of /home/ubuntu/rapids/rules/preprocessing.snakefile: Command 'set -euo pipefail; Rscript --vanilla /home/ubuntu/rapids/.snakemake/scripts/tmp_2jnvqs7.download_dataset.R' returned non-zero exit status 1 . File \"/home/ubuntu/rapids/rules/preprocessing.snakefile\" , line 20 , in __rule_download_dataset File \"/home/ubuntu/anaconda3/envs/moshi-env/lib/python3.7/concurrent/futures/thread.py\" , line 57 , in run Shutting down, this might take some time. Exiting because a job execution failed. Look above for error message Solution Please make sure the DATABASE_GROUP in config.yaml matches your DB credentials group in .env .","title":"Cannot connect to your MySQL server"},{"location":"faq/#cannot-start-mysql-in-linux-via-brew-services-start-mysql","text":"Problem Cannot start mysql in linux via brew services start mysql Solution Use mysql.server start","title":"Cannot start mysql in linux via brew services start mysql"},{"location":"faq/#every-time-i-run-force-the-download_dataset-rule-all-rules-are-executed","text":"Problem When running snakemake -j1 -R download_phone_data or ./rapids -j1 -R download_phone_data all the rules and files are re-computed Solution This is expected behavior. The advantage of using snakemake under the hood is that every time a file containing data is modified every rule that depends on that file will be re-executed to update their results. In this case, since download_dataset updates all the raw data, and you are forcing the rule with the flag -R every single rule that depends on those raw files will be executed.","title":"Every time I run force the download_dataset rule all rules are executed"},{"location":"faq/#error-table-xxx-doesnt-exist-while-running-the-download_phone_data-or-download_fitbit_data-rule","text":"Problem Error in .local ( conn, statement, ... ) : could not run statement: Table 'db_name.table_name' doesn ' t exist Calls: colnames ... .local -> dbSendQuery -> dbSendQuery -> .local -> .Call Execution halted Solution Please make sure the sensors listed in [PHONE_VALID_SENSED_BINS][PHONE_SENSORS] and the [TABLE] of each sensor you activated in config.yaml match your database tables.","title":"Error Table XXX doesn't exist while running the download_phone_data or download_fitbit_data rule."},{"location":"faq/#how-do-i-install-rapids-on-ubuntu-1604","text":"Solution Install dependencies (Homebrew - if not installed): sudo apt-get install libmariadb-client-lgpl-dev libxml2-dev libssl-dev Install brew for linux and add the following line to ~/.bashrc : export PATH=$HOME/.linuxbrew/bin:$PATH source ~/.bashrc Install MySQL brew install mysql brew services start mysql Install R, pandoc and rmarkdown: brew install r brew install gcc@6 (needed due to this bug ) HOMEBREW_CC=gcc-6 brew install pandoc Install miniconda using these instructions Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake renv_install snakemake renv_init snakemake renv_restore This step could take several minutes to complete. Please be patient and let it run until completion.","title":"How do I install RAPIDS on Ubuntu 16.04"},{"location":"faq/#mysqlh-cannot-be-found","text":"Problem -------------------------- [ ERROR MESSAGE ] ---------------------------- :1:10: fatal error: mysql.h: No such file or directory compilation terminated. ----------------------------------------------------------------------- ERROR: configuration failed for package 'RMySQL' Solution sudo apt install libmariadbclient-dev","title":"mysql.h cannot be found"},{"location":"faq/#no-package-libcurl-found","text":"Problem libcurl cannot be found Solution Install libcurl sudo apt install libcurl4-openssl-dev","title":"No package libcurl found"},{"location":"faq/#configuration-failed-because-openssl-was-not-found","text":"Problem openssl cannot be found Solution Install openssl sudo apt install libssl-dev","title":"Configuration failed because openssl was not found."},{"location":"faq/#configuration-failed-because-libxml-20-was-not-found","text":"Problem libxml-2.0 cannot be found Solution Install libxml-2.0 sudo apt install libxml2-dev","title":"Configuration failed because libxml-2.0 was not found"},{"location":"faq/#ssl-connection-error-when-running-rapids","text":"Problem You are getting the following error message when running RAPIDS: Error: Failed to connect: SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol. Solution This is a bug in Ubuntu 20.04 when trying to connect to an old MySQL server with MySQL client 8.0. You should get the same error message if you try to connect from the command line. There you can add the option --ssl-mode=DISABLED but we can't do this from the R connector. If you can't update your server, the quickest solution would be to import your database to another server or to a local environment. Alternatively, you could replace mysql-client and libmysqlclient-dev with mariadb-client and libmariadbclient-dev and reinstall renv. More info about this issue here","title":"SSL connection error when running RAPIDS"},{"location":"faq/#db_tables-key-not-found","text":"Problem If you get the following error KeyError in line 43 of preprocessing.smk: 'PHONE_SENSORS' , it means that the indentation of the key [PHONE_SENSORS] is not matching the other child elements of PHONE_VALID_SENSED_BINS Solution You need to add or remove any leading whitespaces as needed on that line. PHONE_VALID_SENSED_BINS : COMPUTE : False # This flag is automatically ignored (set to True) if you are extracting PHONE_VALID_SENSED_DAYS or screen or Barnett's location features BIN_SIZE : &bin_size 5 # (in minutes) PHONE_SENSORS : []","title":"DB_TABLES key not found"},{"location":"faq/#error-while-updating-your-conda-environment-in-ubuntu","text":"Problem You get the following error: CondaMultiError: CondaVerificationError: The package for tk located at /home/ubuntu/miniconda2/pkgs/tk-8.6.9-hed695b0_1003 appears to be corrupted. The path 'include/mysqlStubs.h' specified in the package manifest cannot be found. ClobberError: This transaction has incompatible packages due to a shared path. packages: conda-forge/linux-64::llvm-openmp-10.0.0-hc9558a2_0, anaconda/linux-64::intel-openmp-2019.4-243 path: 'lib/libiomp5.so' Solution Reinstall conda","title":"Error while updating your conda environment in Ubuntu"},{"location":"faq/#embedded-nul-in-string","text":"Problem You get the following error when downloading sensor data: Error in result_fetch ( res@ptr, n = n ) : embedded nul in string: Solution This problem is due to the way RMariaDB handles a mismatch between data types in R and MySQL (see this issue ). Since it seems this problem won\u2019t be handled by RMariaDB , you have two options: If it\u2019s only a few rows that are causing this problem, remove the the null character from the conflictive table cell. If it\u2019s not feasible to modify your data you can try swapping RMariaDB with RMySQL . Just have in mind you might have problems connecting to modern MySQL servers running in Liunx: Add RMySQL to the renv environment by running the following command in a terminal open on RAPIDS root folder R -e 'renv::install(\"RMySQL\")' Go to src/data/download_phone_data.R and replace library(RMariaDB) with library(RMySQL) In the same file replace dbEngine <- dbConnect(MariaDB(), default.file = \"./.env\", group = group) with dbEngine <- dbConnect(MySQL(), default.file = \"./.env\", group = group)","title":"Embedded nul in string"},{"location":"file-structure/","text":"File Structure \u00b6 Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"file-structure/#file-structure","text":"Tip Read this page if you want to learn more about how RAPIDS is structured. If you want to start using it go to Installation , then to Configuration , and then to Execution All paths mentioned in this page are relative to RAPIDS\u2019 root folder. If you want to extract the behavioral features that RAPIDS offers, you will only have to create or modify the .env file , participants files , time segment files , and the config.yaml file as instructed in the Configuration page . The config.yaml file is the heart of RAPIDS and includes parameters to manage participants, data sources, sensor data, visualizations and more. All data is saved in data/ . The data/external/ folder stores any data imported or created by the user, data/raw/ stores sensor data as imported from your database, data/interim/ has intermediate files necessary to compute behavioral features from raw data, and data/processed/ has all the final files with the behavioral features in folders per participant and sensor. RAPIDS source code is saved in src/ . The src/data/ folder stores scripts to download, clean and pre-process sensor data, src/features has scripts to extract behavioral features organized in their respective sensor subfolders , src/models/ can host any script to create models or statistical analyses with the behavioral features you extract, and src/visualization/ has scripts to create plots of the raw and processed data. There are other files and folders but only relevant if you are interested in extending RAPIDS (e.g. virtual env files, docs, tests, Dockerfile, the Snakefile, etc.). In the figure below, we represent the interactions between users and files. After a user modifies the configuration files mentioned above, the Snakefile file will search for and execute the Snakemake rules that contain the Python or R scripts necessary to generate or update the required output files (behavioral features, plots, etc.). Interaction diagram between the user, and important files in RAPIDS","title":"File Structure"},{"location":"migrating-from-old-versions/","text":"Migrating from RAPIDS beta \u00b6 If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the new RAPIDS (we are starting with v0.1.0 ) right away, just take into account the following: Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Follow the new Configuration guide. You can copy and paste your old .env file You can migrate your old participant files: python tools/update_format_participant_files.py Get familiar with the new way of Executing RAPIDS You can proceed to reconfigure your config.yaml , its structure is more consistent and should be familiar to you. Info If you have any questions reach out to us on Slack .","title":"Migrating from beta"},{"location":"migrating-from-old-versions/#migrating-from-rapids-beta","text":"If you were relying on the old docs and the most recent version of RAPIDS you are working with is from or before Oct 13, 2020 you are using the beta version of RAPIDS. You can start using the new RAPIDS (we are starting with v0.1.0 ) right away, just take into account the following: Install a new copy of RAPIDS (the R and Python virtual environments didn\u2019t change so the cached versions will be reused) Make sure you don\u2019t skip a new Installation step to give execution permissions to the RAPIDS script: chmod +x rapids Follow the new Configuration guide. You can copy and paste your old .env file You can migrate your old participant files: python tools/update_format_participant_files.py Get familiar with the new way of Executing RAPIDS You can proceed to reconfigure your config.yaml , its structure is more consistent and should be familiar to you. Info If you have any questions reach out to us on Slack .","title":"Migrating from RAPIDS beta"},{"location":"team/","text":"RAPIDS Team \u00b6 If you are interested in contributing feel free to submit a pull request or contact us. Core Team \u00b6 Julio Vega (Designer and Lead Developer) \u00b6 About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website Meng Li \u00b6 About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile Abhineeth Reddy Kunta \u00b6 About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University. Kwesi Aguillera \u00b6 About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile Echhit Joshi \u00b6 About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile Nicolas Leo \u00b6 About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems. Nikunj Goel \u00b6 About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile Community Contributors \u00b6 Agam Kumar \u00b6 About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile Yasaman S. Sefidgar \u00b6 About Linkedin Profile Advisors \u00b6 Afsaneh Doryab \u00b6 About Personal Website Carissa Low \u00b6 About Profile","title":"Team"},{"location":"team/#rapids-team","text":"If you are interested in contributing feel free to submit a pull request or contact us.","title":"RAPIDS Team"},{"location":"team/#core-team","text":"","title":"Core Team"},{"location":"team/#julio-vega-designer-and-lead-developer","text":"About Julio Vega is a postdoctoral associate at the Mobile Sensing + Health Institute. He is interested in personalized methodologies to monitor chronic conditions that affect daily human behavior using mobile and wearable data. vegaju at upmc . edu Personal Website","title":"Julio Vega (Designer and Lead Developer)"},{"location":"team/#meng-li","text":"About Meng Li received her Master of Science degree in Information Science from the University of Pittsburgh. She is interested in applying machine learning algorithms to the medical field. lim11 at upmc . edu Linkedin Profile Github Profile","title":"Meng Li"},{"location":"team/#abhineeth-reddy-kunta","text":"About Abhineeth Reddy Kunta is a Senior Software Engineer with the Mobile Sensing + Health Institute. He is experienced in software development and specializes in building solutions using machine learning. Abhineeth likes exploring ways to leverage technology in advancing medicine and education. Previously he worked as a Computer Programmer at Georgia Department of Public Health. He has a master\u2019s degree in Computer Science from George Mason University.","title":"Abhineeth Reddy Kunta"},{"location":"team/#kwesi-aguillera","text":"About Kwesi Aguillera is currently in his first year at the University of Pittsburgh pursuing a Master of Sciences in Information Science specializing in Big Data Analytics. He received his Bachelor of Science degree in Computer Science and Management from the University of the West Indies. Kwesi considers himself a full stack developer and looks forward to applying this knowledge to big data analysis. Linkedin Profile","title":"Kwesi Aguillera"},{"location":"team/#echhit-joshi","text":"About Echhit Joshi is a Masters student at the School of Computing and Information at University of Pittsburgh. His areas of interest are Machine/Deep Learning, Data Mining, and Analytics. Linkedin Profile","title":"Echhit Joshi"},{"location":"team/#nicolas-leo","text":"About Nicolas is a rising senior studying computer science at the University of Pittsburgh. His academic interests include databases, machine learning, and application development. After completing his undergraduate degree, he plans to attend graduate school for a MS in Computer Science with a focus on Intelligent Systems.","title":"Nicolas Leo"},{"location":"team/#nikunj-goel","text":"About Nik is a graduate student at the University of Pittsburgh pursuing Master of Science in Information Science. He earned his Bachelor of Technology degree in Information Technology from India. He is a Data Enthusiasts and passionate about finding the meaning out of raw data. In a long term, his goal is to create a breakthrough in Data Science and Deep Learning. Linkedin Profile","title":"Nikunj Goel"},{"location":"team/#community-contributors","text":"","title":"Community Contributors"},{"location":"team/#agam-kumar","text":"About Agam is a junior at Carnegie Mellon University studying Statistics and Machine Learning and pursuing an additional major in Computer Science. He is a member of the Data Science team in the Health and Human Performance Lab at CMU and has keen interests in software development and data science. His research interests include ML applications in medicine. Linkedin Profile Github Profile","title":"Agam Kumar"},{"location":"team/#yasaman-s-sefidgar","text":"About Linkedin Profile","title":"Yasaman S. Sefidgar"},{"location":"team/#advisors","text":"","title":"Advisors"},{"location":"team/#afsaneh-doryab","text":"About Personal Website","title":"Afsaneh Doryab"},{"location":"team/#carissa-low","text":"About Profile","title":"Carissa Low"},{"location":"developers/documentation/","text":"Documentation \u00b6 We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically. Set up development environment \u00b6 Make sure your conda environment is active pip install mkdocs pip install mkdocs-material Preview \u00b6 Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve File Structure \u00b6 The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation. Reference \u00b6 Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md ) Extras \u00b6 You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Documentation"},{"location":"developers/documentation/#documentation","text":"We use mkdocs with the material theme to write these docs. Whenever you make any changes, just push them back to the repo and the documentation will be deployed automatically.","title":"Documentation"},{"location":"developers/documentation/#set-up-development-environment","text":"Make sure your conda environment is active pip install mkdocs pip install mkdocs-material","title":"Set up development environment"},{"location":"developers/documentation/#preview","text":"Run the following command in RAPIDS root folder and go to http://127.0.0.1:8000 : mkdocs serve","title":"Preview"},{"location":"developers/documentation/#file-structure","text":"The documentation config file is /mkdocs.yml , if you are adding new .md files to the docs modify the nav attribute at the bottom of that file. You can use the hierarchy there to find all the files that appear in the documentation.","title":"File Structure"},{"location":"developers/documentation/#reference","text":"Check this page to get familiar with the different visual elements we can use in the docs (admonitions, code blocks, tables, etc.) You can also refer to /docs/setup/installation.md and /docs/setup/configuration.md to see practical examples of these elements. Hint Any links to internal pages should be relative to the current page. For example, any link from this page (documentation) which is inside ./developers should begin with ../ to go one folder level up like: [ mylink ]( ../setup/installation.md )","title":"Reference"},{"location":"developers/documentation/#extras","text":"You can insert emojis using this syntax :[SOURCE]-[ICON_NAME] from the following sources: https://materialdesignicons.com/ https://fontawesome.com/icons/tasks?style=solid https://primer.style/octicons/ You can use this page to create markdown tables more easily","title":"Extras"},{"location":"developers/git-flow/","text":"Git Flow \u00b6 We use the develop/master variation of the OneFlow git flow Add New Features \u00b6 We use feature (topic) branches to implement new features Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Integrate your new feature to develop Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. git checkout feature/feature1 git fetch origin develop git rebase -i develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Push your feature branch online git push --set-upstream origin feature/external-test Then open a pull request to the develop branch using Github\u2019s GUI Release a New Version \u00b6 Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log) Release a Hotfix \u00b6 Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Git Flow"},{"location":"developers/git-flow/#git-flow","text":"We use the develop/master variation of the OneFlow git flow","title":"Git Flow"},{"location":"developers/git-flow/#add-new-features","text":"We use feature (topic) branches to implement new features Pull the latest develop git checkout develop git pull Create your feature branch git checkout -b feature/feature1 Add, modify or delete the necessary files to add your new feature Update the change log ( docs/change-log.md ) Stage and commit your changes using VS Code git GUI or the following commands git add modified-file1 modified-file2 git commit -m \"Add my new feature\" # use a concise description Integrate your new feature to develop Internal Developer You are an internal developer if you have writing permissions to the repository. Most feature branches are never pushed to the repo, only do so if you expect that its development will take days (to avoid losing your work if you computer is damaged). Otherwise follow the following instructions to locally rebase your feature branch into develop and push those rebased changes online. git checkout feature/feature1 git fetch origin develop git rebase -i develop git checkout develop git merge --no-ff feature/feature1 # (use the default merge message) git push origin develop git branch -d feature/feature1 External Developer You are an external developer if you do NOT have writing permissions to the repository. Push your feature branch online git push --set-upstream origin feature/external-test Then open a pull request to the develop branch using Github\u2019s GUI","title":"Add New Features"},{"location":"developers/git-flow/#release-a-new-version","text":"Pull the latest develop git checkout develop git pull Create a new release branch git describe --abbrev = 0 --tags # Bump the release (0.1.0 to 0.2.0 => NEW_HOTFIX) git checkout -b release/v [ NEW_RELEASE ] develop Add new tag git tag v [ NEW_RELEASE ] Merge and push the release branch git checkout develop git merge release/v [ NEW_RELEASE ] git push --tags origin develop git branch -d release/v [ NEW_RELEASE ] Fast-forward master git checkout master git merge --ff-only develop git push Go to GitHub and create a new release based on the newest tag v[NEW_RELEASE] (remember to add the change log)","title":"Release a New Version"},{"location":"developers/git-flow/#release-a-hotfix","text":"Pull the latest master git checkout master git pull Start a hotfix branch git describe --abbrev = 0 --tags # Bump the hotfix (0.1.0 to 0.1.1 => NEW_HOTFIX) git checkout -b hotfix/v [ NEW_HOTFIX ] master Fix whatever needs to be fixed Update the change log Tag and merge the hotfix git tag v [ NEW_HOTFIX ] git checkout develop git merge hotfix/v [ NEW_HOTFIX ] git push --tags origin develop git branch -d hotfix/v [ NEW_HOTFIX ] Fast-forward master git checkout master git merge --ff-only v[NEW_HOTFIX] git push Go to GitHub and create a new release based on the newest tag v[NEW_HOTFIX] (remember to add the change log)","title":"Release a Hotfix"},{"location":"developers/remote-support/","text":"Remote Support \u00b6 We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/remote-support/#remote-support","text":"We use the Live Share extension of Visual Studio Code to debug bugs when sharing data or database credentials is not possible. Install Visual Studio Code Open you RAPIDS root folder in a new VSCode window Open a new Terminal Terminal > New terminal Install the Live Share extension pack Press Ctrl + P or Cmd + P and run this command: >live share: start collaboration session 6. Follow the instructions and share the session link you receive","title":"Remote Support"},{"location":"developers/test-cases/","text":"Test Cases \u00b6 Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available. Messages (SMS) \u00b6 The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Calls \u00b6 Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files Screen \u00b6 Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Battery \u00b6 Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files Bluetooth \u00b6 The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files. WIFI \u00b6 There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files. Light \u00b6 The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Application Foreground \u00b6 The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files. Activity Recognition \u00b6 The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files. Conversation \u00b6 The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Test cases"},{"location":"developers/test-cases/#test-cases","text":"Along with the continued development and the addition of new sensors and features to the RAPIDS pipeline, tests for the currently available sensors and features are being implemented. Since this is a Work In Progress this page will be updated with the list of sensors and features for which testing is available. For each of the sensors listed a description of the data used for testing (test cases) are outline. Currently for all intent and testing purposes the tests/data/raw/test01/ contains all the test data files for testing android data formats and tests/data/raw/test02/ contains all the test data files for testing iOS data formats. It follows that the expected (verified output) are contained in the tests/data/processed/test01/ and tests/data/processed/test02/ for Android and iOS respectively. tests/data/raw/test03/ and tests/data/raw/test04/ contain data files for testing empty raw data files for android and iOS respectively. The following is a list of the sensors that testing is currently available.","title":"Test Cases"},{"location":"developers/test-cases/#messages-sms","text":"The raw message data file contains data for 2 separate days. The data for the first day contains records 5 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The raw message data contains records for both message_types (i.e. recieved and sent ) in both days in all epochs. The number records with each message_types per epoch is randomly distributed There is at least one records with each message_types per epoch. There is one raw message data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Messages (SMS)"},{"location":"developers/test-cases/#calls","text":"Due to the difference in the format of the raw call data for iOS and Android the following is the expected results the calls_with_datetime_unified.csv . This would give a better idea of the use cases being tested since the calls_with_datetime_unified.csv would make both the iOS and Android data comparable. The call data would contain data for 2 days. The data for the first day contains 6 records for every epoch . The second day's data contains 6 records for each of only 2 epoch (currently morning and evening ) The call data contains records for all call_types (i.e. incoming , outgoing and missed ) in both days in all epochs. The number records with each of the call_types per epoch is randomly distributed. There is at least one records with each call_types per epoch. There is one call data file each, as described above, for testing both iOS and Android data. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Calls"},{"location":"developers/test-cases/#screen","text":"Due to the difference in the format of the raw screen data for iOS and Android the following is the expected results the screen_deltas.csv . This would give a better idea of the use cases being tested since the screen_eltas.csv would make both the iOS and Android data comparable These files are used to calculate the features for the screen sensor The screen delta data file contains data for 1 day. The screen delta data contains 1 record to represent an unlock episode that falls within an epoch for every epoch . The screen delta data contains 1 record to represent an unlock episode that falls across the boundary of 2 epochs. Namely the unlock episode starts in one epoch and ends in the next, thus there is a record for unlock episodes that fall across night to morning , morning to afternoon and finally afternoon to night The testing is done for unlock episode_type. There is one screen data file each for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Screen"},{"location":"developers/test-cases/#battery","text":"Due to the difference in the format of the raw battery data for iOS and Android as well as versions of iOS the following is the expected results the battery_deltas.csv . This would give a better idea of the use cases being tested since the battery_deltas.csv would make both the iOS and Android data comparable. These files are used to calculate the features for the battery sensor. The battery delta data file contains data for 1 day. The battery delta data contains 1 record each for a charging and discharging episode that falls within an epoch for every epoch . Thus, for the daily epoch there would be multiple charging and discharging episodes Since either a charging episode or a discharging episode and not both can occur across epochs, in order to test episodes that occur across epochs alternating episodes of charging and discharging episodes that fall across night to morning , morning to afternoon and finally afternoon to night are present in the battery delta data. This starts with a discharging episode that begins in night and end in morning . There is one battery data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files","title":"Battery"},{"location":"developers/test-cases/#bluetooth","text":"The raw Bluetooth data file contains data for 1 day. The raw Bluetooth data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) An option of 5 Bluetooth devices are randomly distributed throughout the data records. There is one raw Bluetooth data file each, for testing both iOS and Android data formats. There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Bluetooth"},{"location":"developers/test-cases/#wifi","text":"There are 2 data files ( wifi_raw.csv and sensor_wifi_raw.csv ) for each fake participant for each phone platform. The raw WIFI data files contain data for 1 day. The sensor_wifi_raw.csv data contains at least 2 records for each epoch . Each epoch has a record with a timestamp for the beginning boundary for that epoch and a record with a timestamp for the ending boundary for that epoch . (e.g. For the morning epoch there is a record with a timestamp for 6:00AM and another record with a timestamp for 11:59:59AM . These are to test edge cases) The wifi_raw.csv data contains 3 records with random timestamps for each epoch to represent visible broadcasting WIFI network. This file is empty for the iOS phone testing data. An option of 10 access point devices is randomly distributed throughout the data records. 5 each for sensor_wifi_raw.csv and wifi_raw.csv . There data files for testing both iOS and Android data formats. There are also additional empty data files for both android and iOS for testing empty data files.","title":"WIFI"},{"location":"developers/test-cases/#light","text":"The raw light data file contains data for 1 day. The raw light data contains 3 or 4 rows of data for each epoch except night . The single row of data for night is for testing features for single values inputs. (Example testing the standard deviation of one input value) Since light is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Light"},{"location":"developers/test-cases/#application-foreground","text":"The raw application foreground data file contains data for 1 day. The raw application foreground data contains 7 - 9 rows of data for each epoch . The records for each epoch contains apps that are randomly selected from a list of apps that are from the MULTIPLE_CATEGORIES and SINGLE_CATEGORIES (See testing_config.yaml ). There are also records in each epoch that have apps randomly selected from a list of apps that are from the EXCLUDED_CATEGORIES and EXCLUDED_APPS . This is to test that these apps are actually being excluded from the calculations of features. There are also records to test SINGLE_APPS calculations. Since application foreground is only available for Android there is only one file that contains data for Android. All other files (i.e. for iPhone) are empty data files.","title":"Application Foreground"},{"location":"developers/test-cases/#activity-recognition","text":"The raw Activity Recognition data file contains data for 1 day. The raw Activity Recognition data each epoch period contains rows that records 2 - 5 different activity_types . The is such that durations of activities can be tested. Additionally, there are records that mimic the duration of an activity over the time boundary of neighboring epochs. (For example, there a set of records that mimic the participant in_vehicle from afternoon into evening ) There is one file each with raw Activity Recognition data for testing both iOS and Android data formats. (plugin_google_activity_recognition_raw.csv for android and plugin_ios_activity_recognition_raw.csv for iOS) There is also an additional empty data file for both android and iOS for testing empty data files.","title":"Activity Recognition"},{"location":"developers/test-cases/#conversation","text":"The raw conversation data file contains data for 2 day. The raw conversation data contains records with a sample of both datatypes (i.e. voice/noise = 0 , and conversation = 2 ) as well as rows with for samples of each of the inference values (i.e. silence = 0 , noise = 1 , voice = 2 , and unknown = 3 ) for each epoch . The different datatype and inference records are randomly distributed throughout the epoch . Additionally there are 2 - 5 records for conversations ( datatype = 2, and inference = -1) in each epoch and for each epoch except night, there is a conversation record that has a double_convo_start timestamp that is from the previous epoch . This is to test the calculations of features across epochs . There is a raw conversation data file for both android and iOS platforms ( plugin_studentlife_audio_android_raw.csv and plugin_studentlife_audio_raw.csv respectively). Finally, there are also additional empty data files for both android and iOS for testing empty data files","title":"Conversation"},{"location":"developers/testing/","text":"Testing \u00b6 The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory Steps for Testing \u00b6 To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Testing"},{"location":"developers/testing/#testing","text":"The following is a simple guide to testing RAPIDS. All files necessary for testing are stored in the /tests directory","title":"Testing"},{"location":"developers/testing/#steps-for-testing","text":"To begin testing RAPIDS place the fake raw input data csv files in tests/data/raw/ . The fake participant files should be placed in tests/data/external/ . The expected output files of RAPIDS after processing the input data should be placed in tests/data/processesd/ . The Snakemake rule(s) that are to be tested must be placed in the tests/Snakemake file. The current tests/Snakemake is a good example of how to define them. (At the time of writing this documentation the snakefile contains rules messages (SMS), calls and screen) Edit the tests/settings/config.yaml . Add and/or remove the rules to be run for testing from the forcerun list. Edit the tests/settings/testing_config.yaml with the necessary configuration settings for running the rules to be tested. Add any additional testscripts in tests/scripts . Uncomment or comment off lines in the testing shell script tests/scripts/run_tests.sh . Run the testing shell script. tests/scripts/run_tests.sh The following is a snippet of the output you should see after running your test. test_sensors_files_exist ( test_sensor_features.TestSensorFeatures ) ... ok test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ... FAIL ====================================================================== FAIL: test_sensors_features_calculations ( test_sensor_features.TestSensorFeatures ) ---------------------------------------------------------------------- The results above show that the first test test_sensors_files_exist passed while test_sensors_features_calculations failed. In addition you should get the traceback of the failure (not shown here). For more information on how to implement test scripts and use unittest please see Unittest Documentation Testing of the RAPIDS sensors and features is a work-in-progress. Please see test-cases for a list of sensors and features that have testing currently available. Currently the repository is set up to test a number of sensors out of the box by simply running the tests/scripts/run_tests.sh command once the RAPIDS python environment is active.","title":"Steps for Testing"},{"location":"developers/virtual-environments/","text":"Python Virtual Environment \u00b6 Add new packages \u00b6 Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ). Remove packages \u00b6 Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME Updating all packages \u00b6 Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all Update your conda environment.yaml \u00b6 After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml R Virtual Environment \u00b6 Add new packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\") Remove packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\") Updating all packages \u00b6 Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update() Update your R renv.lock \u00b6 After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Virtual Environments"},{"location":"developers/virtual-environments/#python-virtual-environment","text":"","title":"Python Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages","text":"Try to install any new package using conda install -c CHANNEL PACKAGE_NAME (you can use pip if the package is only available there). Make sure your Python virtual environment is active ( conda activate YOUR_ENV ).","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages","text":"Uninstall packages using the same manager you used to install them conda remove PACKAGE_NAME or pip uninstall PACKAGE_NAME","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages","text":"Make sure your Python virtual environment is active ( conda activate YOUR_ENV ), then run conda update --all","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-conda-environmentyaml","text":"After installing or removing a package you can use the following command in your terminal to update your environment.yaml before publishing your pipeline. Note that we ignore the package version for libfortran and mkl to keep compatibility with Linux: conda env export --no-builds | sed 's/^.*libgfortran.*$/ - libgfortran/' | sed 's/^.*mkl=.*$/ - mkl/' > environment.yml","title":"Update your conda environment.yaml"},{"location":"developers/virtual-environments/#r-virtual-environment","text":"","title":"R Virtual Environment"},{"location":"developers/virtual-environments/#add-new-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::install(\"PACKAGE_NAME\")","title":"Add new packages"},{"location":"developers/virtual-environments/#remove-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::remove(\"PACKAGE_NAME\")","title":"Remove packages"},{"location":"developers/virtual-environments/#updating-all-packages_1","text":"Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::update()","title":"Updating all packages"},{"location":"developers/virtual-environments/#update-your-r-renvlock","text":"After installing or removing a package you can use the following command in your terminal to update your renv.lock before publishing your pipeline. Open your terminal and navigate to RAPIDS\u2019 root folder Run R to open an R interactive session Run renv::snapshot() (renv will ask you to confirm any updates to this file)","title":"Update your R renv.lock"},{"location":"features/add-new-features/","text":"Add New Features \u00b6 Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process. New Features for Existing Sensors \u00b6 You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday Modify the config.yaml file \u00b6 In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step) Create a provider folder, script and function \u00b6 In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider ) Implement your feature extraction code \u00b6 The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features New Features for Non-Existing Sensors \u00b6 If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"Add New Features"},{"location":"features/add-new-features/#add-new-features","text":"Hint We recommend reading the Behavioral Features Introduction before reading this page Hint You won\u2019t have to deal with time zones, dates, times, data cleaning or preprocessing. The data that RAPIDS pipes to your feature extraction code is ready to process.","title":"Add New Features"},{"location":"features/add-new-features/#new-features-for-existing-sensors","text":"You can add new features to any existing sensors (see list below) by adding a new provider in three steps: Modify the config.yaml file Create a provider folder, script and function Implement your features extraction code As a tutorial, we will add a new provider for PHONE_ACCELEROMETER called VEGA that extracts feature1 , feature2 , feature3 in Python and that it requires a parameter from the user called MY_PARAMETER . Existing Sensors An existing sensor is any of the phone or Fitbit sensors with a configuration entry in config.yaml : Phone Accelerometer Phone Activity Recognition Phone Applications Foreground Phone Battery Phone Bluetooth Phone Calls Phone Conversation Phone Data Yield Phone Light Phone Locations Phone Messages Phone Screen Phone WiFI Connected Phone WiFI Visible Fitbit Heart Rate Summary Fitbit Heart Rate Intraday Fitbit Sleep Summary Fitbit Steps Summary Fitbit Steps Intraday","title":"New Features for Existing Sensors"},{"location":"features/add-new-features/#modify-the-configyaml-file","text":"In this step you need to add your provider configuration section under the relevant sensor in config.yaml . See our example for our tutorial\u2019s VEGA provider for PHONE_ACCELEROMETER : Example configuration for a new accelerometer provider VEGA PHONE_ACCELEROMETER : TABLE : accelerometer PROVIDERS : RAPIDS : COMPUTE : False ... PANDA : COMPUTE : False ... VEGA : COMPUTE : False FEATURES : [ \"feature1\" , \"feature2\" , \"feature3\" ] MY_PARAMTER : a_string SRC_FOLDER : \"vega\" SRC_LANGUAGE : \"python\" Key Description [COMPUTE] Flag to activate/deactivate your provider [FEATURES] List of features your provider supports. Your provider code should only return the features on this list [MY_PARAMTER] An arbitrary parameter that our example provider VEGA needs. This can be a boolean, integer, float, string or an array of any of such types. [SRC_LANGUAGE] The programming language of your provider script, it can be python or r , in our example python [SRC_FOLDER] The name of your provider in lower case, in our example vega (this will be the name of your folder in the next step)","title":"Modify the config.yaml file"},{"location":"features/add-new-features/#create-a-provider-folder-script-and-function","text":"In this step you need to add a folder, script and function for your provider. Create your provider folder under src/feature/DEVICE_SENSOR/YOUR_PROVIDER , in our example src/feature/phone_accelerometer/vega (same as [SRC_FOLDER] in the step above). Create your provider script inside your provider folder, it can be a Python file called main.py or an R file called main.R . Add your provider function in your provider script. The name of such function should be [providername]_features , in our example vega_features Python function def [ providername ] _features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): R function [ providername ] _ features <- function ( sensor_data , time_segment , provider )","title":"Create a provider folder, script and function"},{"location":"features/add-new-features/#implement-your-feature-extraction-code","text":"The provider function that you created in the step above will receive the following parameters: Parameter Description sensor_data_files Path to the CSV file containing the data of a single participant. This data has been cleaned and preprocessed. Your function will be automatically called for each participant in your study (in the [PIDS] array in config.yaml ) time_segment The label of the time segment that should be processed. provider The parameters you configured for your provider in config.yaml will be available in this variable as a dictionary in Python or a list in R. In our example this dictionary contains {MY_PARAMETER:\"a_string\"} filter_data_by_segment Python only. A function that you will use to filter your data. In R this function is already available in the environment. *args Python only. Not used for now **kwargs Python only. Not used for now The code to extract your behavioral features should be implemented in your provider function and in general terms it will have three stages: 1. Read a participant\u2019s data by loading the CSV data stored in the file pointed by sensor_data_files acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) Note that phone\u2019s battery, screen, and activity recognition data is given as episodes instead of event rows (for example, start and end timestamps of the periods the phone screen was on) 2. Filter your data to process only those rows that belong to time_segment This step is only one line of code, but to undersand why we need it, keep reading. acc_data = filter_data_by_segment ( acc_data , time_segment ) You should use the filter_data_by_segment() function to process and group those rows that belong to each of the time segments RAPIDS could be configured with . Let\u2019s understand the filter_data_by_segment() function with an example. A RAPIDS user can extract features on any arbitrary time segment . A time segment is a period of time that has a label and one or more instances. For example, the user (or you) could have requested features on a daily, weekly, and week-end basis for p01 . The labels are arbritrary and the instances depend on the days a participant was monitored for: the daily segment could be named my_days and if p01 was monitored for 14 days, it would have 14 instances the weekly segment could be named my_weeks and if p01 was monitored for 14 days, it would have 2 instances. the weekend segment could be named my_weekends and if p01 was monitored for 14 days, it would have 2 instances. For this example, RAPIDS will call your provider function three times for p01 , once where time_segment is my_days , once where time_segment is my_weeks and once where time_segment is my_weekends . In this example not every row in p01 \u2018s data needs to take part in the feature computation for either segment and the rows need to be grouped differently. Thus filter_data_by_segment() comes in handy, it will return a data frame that contains the rows that were logged during a time segment plus an extra column called local_segment . This new column will have as many unique values as time segment instances exist (14, 2, and 2 for our p01 \u2018s my_days , my_weeks , and my_weekends examples). After filtering, you should group the data frame by this column and compute any desired features , for example: acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () The reason RAPIDS does not filter the participant\u2019s data set for you is because your code might need to compute something based on a participant\u2019s complete dataset before computing their features. For example, you might want to identify the number that called a participant the most throughout the study before computing a feature with the number of calls the participant received from this number. 3. Return a data frame with your features After filtering, grouping your data, and computing your features, your provider function should return a data frame that has: One row per time segment instance (e.g. 14 our p01 \u2018s my_days example) The local_segment column added by filter_data_by_segment() One column per feature. By convention the name of your features should only contain letters or numbers ( feature1 ). RAPIDS will automatically add the right sensor and provider prefix ( phone_accelerometr_vega_ ) PHONE_ACCELEROMETER Provider Example For your reference, this a short example of our own provider ( RAPIDS ) for PHONE_ACCELEROMETER that computes five acceleration features def rapids_features ( sensor_data_files , time_segment , provider , filter_data_by_segment , * args , ** kwargs ): acc_data = pd . read_csv ( sensor_data_files [ \"sensor_data\" ]) requested_features = provider [ \"FEATURES\" ] # name of the features this function can compute base_features_names = [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] # the subset of requested features this function can compute features_to_compute = list ( set ( requested_features ) & set ( base_features_names )) acc_features = pd . DataFrame ( columns = [ \"local_segment\" ] + features_to_compute ) if not acc_data . empty : acc_data = filter_data_by_segment ( acc_data , time_segment ) if not acc_data . empty : acc_features = pd . DataFrame () # get magnitude related features: magnitude = sqrt(x^2+y^2+z^2) magnitude = acc_data . apply ( lambda row : np . sqrt ( row [ \"double_values_0\" ] ** 2 + row [ \"double_values_1\" ] ** 2 + row [ \"double_values_2\" ] ** 2 ), axis = 1 ) acc_data = acc_data . assign ( magnitude = magnitude . values ) if \"maxmagnitude\" in features_to_compute : acc_features [ \"maxmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . max () if \"minmagnitude\" in features_to_compute : acc_features [ \"minmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . min () if \"avgmagnitude\" in features_to_compute : acc_features [ \"avgmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . mean () if \"medianmagnitude\" in features_to_compute : acc_features [ \"medianmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . median () if \"stdmagnitude\" in features_to_compute : acc_features [ \"stdmagnitude\" ] = acc_data . groupby ([ \"local_segment\" ])[ \"magnitude\" ] . std () acc_features = acc_features . reset_index () return acc_features","title":"Implement your feature extraction code"},{"location":"features/add-new-features/#new-features-for-non-existing-sensors","text":"If you want to add features for a device or a sensor that we do not support at the moment (those that do not appear in the \"Existing Sensors\" list above), contact us or request it on Slack and we can add the necessary code so you can follow the instructions above.","title":"New Features for Non-Existing Sensors"},{"location":"features/feature-introduction/","text":"Behavioral Features Introduction \u00b6 Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" Sensor Parameters \u00b6 Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page. Sensor Providers \u00b6 Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ). Provider Parameters \u00b6 Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page. Provider Features \u00b6 Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Introduction"},{"location":"features/feature-introduction/#behavioral-features-introduction","text":"Every phone or Fitbit sensor has a corresponding config section in config.yaml , these sections follow a similar structure and we\u2019ll use PHONE_ACCELEROMETER as an example to explain this structure. Hint We recommend reading this page if you are using RAPIDS for the first time All computed sensor features are stored under /data/processed/features on files per sensor, per participant and per study (all participants). Every time you change any sensor parameters, provider parameters or provider features, all the necessary files will be updated as soon as you execute RAPIDS. Config section example for PHONE_ACCELEROMETER # 1) Config section PHONE_ACCELEROMETER : # 2) Parameters for PHONE_ACCELEROMETER TABLE : accelerometer # 3) Providers for PHONE_ACCELEROMETER PROVIDERS : # 4) RAPIDS provider RAPIDS : # 4.1) Parameters of RAPIDS provider of PHONE_ACCELEROMETER COMPUTE : False # 4.2) Features of RAPIDS provider of PHONE_ACCELEROMETER FEATURES : [ \"maxmagnitude\" , \"minmagnitude\" , \"avgmagnitude\" , \"medianmagnitude\" , \"stdmagnitude\" ] SRC_FOLDER : \"rapids\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\" # 5) PANDA provider PANDA : # 5.1) Parameters of PANDA provider of PHONE_ACCELEROMETER COMPUTE : False VALID_SENSED_MINUTES : False # 5.2) Features of PANDA provider of PHONE_ACCELEROMETER FEATURES : exertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] nonexertional_activity_episode : [ \"sumduration\" , \"maxduration\" , \"minduration\" , \"avgduration\" , \"medianduration\" , \"stdduration\" ] SRC_FOLDER : \"panda\" # inside src/features/phone_accelerometer SRC_LANGUAGE : \"python\"","title":"Behavioral Features Introduction"},{"location":"features/feature-introduction/#sensor-parameters","text":"Each sensor configuration section has a \u201cparameters\u201d subsection (see #2 in the example). These are parameters that affect different aspects of how the raw data is downloaded, and processed. The TABLE parameter exists for every sensor, but some sensors will have extra parameters like [PHONE_LOCATIONS] . We explain these parameters in a table at the top of each sensor documentation page.","title":"Sensor Parameters"},{"location":"features/feature-introduction/#sensor-providers","text":"Each sensor configuration section can have zero, one or more behavioral feature providers (see #3 in the example). A provider is a script created by the core RAPIDS team or other researchers that extracts behavioral features for that sensor. In this example, accelerometer has two providers: RAPIDS (see #4 ) and PANDA (see #5 ).","title":"Sensor Providers"},{"location":"features/feature-introduction/#provider-parameters","text":"Each provider has parameters that affect the computation of the behavioral features it offers (see #4.1 or #5.1 in the example). These parameters will include at least a [COMPUTE] flag that you switch to True to extract a provider\u2019s behavioral features. We explain every provider\u2019s parameter in a table under the Parameters description heading on each provider documentation page.","title":"Provider Parameters"},{"location":"features/feature-introduction/#provider-features","text":"Each provider offers a set of behavioral features (see #4.2 or #5.2 in the example). For some providers these features are grouped in an array (like those for RAPIDS provider in #4.2 ) but for others they are grouped in a collection of arrays depending on the meaning and purpose of those features (like those for PANDAS provider in #5.2 ). In either case, you can delete the features you are not interested in and they will not be included in the sensor\u2019s output feature file. We explain each behavioral feature in a table under the Features description heading on each provider documentation page.","title":"Provider Features"},{"location":"features/fitbit-heartrate-intraday/","text":"Fitbit Heart Rate Intraday \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#fitbit-heart-rate-intraday","text":"Sensor parameters description for [FITBIT_HEARTRATE_INTRADAY] : Key Description [TABLE] Database table name or file path where the heart rate intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate heartrate_zone a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 68 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 67 outofrange a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 67 outofrange","title":"Fitbit Heart Rate Intraday"},{"location":"features/fitbit-heartrate-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_heartrate_intraday_raw.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed.csv - data/raw/ { pid } /fitbit_heartrate_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_intraday_features/fitbit_heartrate_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_intraday.csv Parameters description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate intraday data, see table below Features description for [FITBIT_HEARTRATE_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description maxhr beats/mins The maximum heart rate during a time segment. minhr beats/mins The minimum heart rate during a time segment. avghr beats/mins The average heart rate during a time segment. medianhr beats/mins The median of heart rate during a time segment. modehr beats/mins The mode of heart rate during a time segment. stdhr beats/mins The standard deviation of heart rate during a time segment. diffmaxmodehr beats/mins The difference between the maximum and mode heart rate during a time segment. diffminmodehr beats/mins The difference between the mode and minimum heart rate during a time segment. entropyhr nats Shannon\u2019s entropy measurement based on heart rate during a time segment. minutesonZONE minutes Number of minutes the user\u2019s heart rate fell within each heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed.","title":"RAPIDS provider"},{"location":"features/fitbit-heartrate-summary/","text":"Fitbit Heart Rate Summary \u00b6 Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#fitbit-heart-rate-summary","text":"Sensor parameters description for [FITBIT_HEARTRATE_SUMMARY] : Key Description [TABLE] Database table name or file path where the heart rate summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1200.6102,\u201dmax\u201d:88,\u201dmin\u201d:31,\u201dminutes\u201d:1058,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:760.3020,\u201dmax\u201d:120,\u201dmin\u201d:86,\u201dminutes\u201d:366,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:15.2048,\u201dmax\u201d:146,\u201dmin\u201d:120,\u201dminutes\u201d:2,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:72}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:68},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:67},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:67},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:1100.1120,\u201dmax\u201d:89,\u201dmin\u201d:30,\u201dminutes\u201d:921,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:660.0012,\u201dmax\u201d:118,\u201dmin\u201d:82,\u201dminutes\u201d:361,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:23.7088,\u201dmax\u201d:142,\u201dmin\u201d:108,\u201dminutes\u201d:3,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:221,\u201dmin\u201d:148,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:70}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:77},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:75},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:73},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201cactivities-heart\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:{\u201ccustomHeartRateZones\u201d:[],\u201dheartRateZones\u201d:[{\u201ccaloriesOut\u201d:750.3615,\u201dmax\u201d:77,\u201dmin\u201d:30,\u201dminutes\u201d:851,\u201dname\u201d:\u201dOut of Range\u201d},{\u201ccaloriesOut\u201d:734.1516,\u201dmax\u201d:107,\u201dmin\u201d:77,\u201dminutes\u201d:550,\u201dname\u201d:\u201dFat Burn\u201d},{\u201ccaloriesOut\u201d:131.8579,\u201dmax\u201d:130,\u201dmin\u201d:107,\u201dminutes\u201d:29,\u201dname\u201d:\u201dCardio\u201d},{\u201ccaloriesOut\u201d:0,\u201dmax\u201d:220,\u201dmin\u201d:130,\u201dminutes\u201d:0,\u201dname\u201d:\u201dPeak\u201d}],\u201drestingHeartRate\u201d:69}}],\u201dactivities-heart-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:90},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:89},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:88},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time heartrate_daily_restinghr heartrate_daily_caloriesoutofrange heartrate_daily_caloriesfatburn heartrate_daily_caloriescardio heartrate_daily_caloriespeak a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 72 1200.6102 760.3020 15.2048 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 70 1100.1120 660.0012 23.7088 0 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 69 750.3615 734.1516 131.8579 0","title":"Fitbit Heart Rate Summary"},{"location":"features/fitbit-heartrate-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_heartrate_summary_raw.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed.csv - data/raw/ { pid } /fitbit_heartrate_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_heartrate_summary_features/fitbit_heartrate_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_heartrate_summary.csv Parameters description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_HEARTRATE_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from heart rate summary data, see table below Features description for [FITBIT_HEARTRATE_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxrestinghr beats/mins The maximum daily resting heart rate during a time segment. minrestinghr beats/mins The minimum daily resting heart rate during a time segment. avgrestinghr beats/mins The average daily resting heart rate during a time segment. medianrestinghr beats/mins The median of daily resting heart rate during a time segment. moderestinghr beats/mins The mode of daily resting heart rate during a time segment. stdrestinghr beats/mins The standard deviation of daily resting heart rate during a time segment. diffmaxmoderestinghr beats/mins The difference between the maximum and mode daily resting heart rate during a time segment. diffminmoderestinghr beats/mins The difference between the mode and minimum daily resting heart rate during a time segment. entropyrestinghr nats Shannon\u2019s entropy measurement based on daily resting heart rate during a time segment. sumcaloriesZONE cals The total daily calories burned within heartrate_zone during a time segment. maxcaloriesZONE cals The maximum daily calories burned within heartrate_zone during a time segment. mincaloriesZONE cals The minimum daily calories burned within heartrate_zone during a time segment. avgcaloriesZONE cals The average daily calories burned within heartrate_zone during a time segment. mediancaloriesZONE cals The median of daily calories burned within heartrate_zone during a time segment. stdcaloriesZONE cals The standard deviation of daily calories burned within heartrate_zone during a time segment. entropycaloriesZONE nats Shannon\u2019s entropy measurement based on daily calories burned within heartrate_zone during a time segment. Assumptions/Observations There are four heart rate zones (ZONE): outofrange , fatburn , cardio , and peak . Please refer to Fitbit documentation for more information about the way they are computed. Calories\u2019 accuracy depends on the users\u2019 Fitbit profile (weight, height, etc.).","title":"RAPIDS provider"},{"location":"features/fitbit-sleep-summary/","text":"Fitbit Sleep Summary \u00b6 Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#fitbit-sleep-summary","text":"Sensor parameters description for [FITBIT_SLEEP_SUMMARY] : Key Description [TABLE] Database table name or file path where the sleep summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data with Fitbit\u2019s sleep API Version 1 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 2, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 10, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 8100000, \u201cefficiency\u201d: 91, \u201cendTime\u201d: \u201c2020-10-07T18:10:00.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14147921940, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c15:55:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:56:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c15:57:00\u201d, \u201cvalue\u201d: \u201c2\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 123, \u201cminutesAwake\u201d: 12, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 8, \u201crestlessDuration\u201d: 9, \u201cstartTime\u201d: \u201c2020-10-07T15:55:00.000\u201d, \u201ctimeInBed\u201d: 135}, {\u201cawakeCount\u201d: 0, \u201cawakeDuration\u201d: 0, \u201cawakeningsCount\u201d: 1, \u201cdateOfSleep\u201d: \u201c2020-10-07\u201d, \u201cduration\u201d: 3780000, \u201cefficiency\u201d: 100, \u201cendTime\u201d: \u201c2020-10-07T10:52:30.000\u201d, \u201cisMainSleep\u201d: false, \u201clogId\u201d: 14144903977, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c09:49:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:50:00\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c09:51:00\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 1, \u201cminutesAsleep\u201d: 62, \u201cminutesAwake\u201d: 0, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 1, \u201crestlessDuration\u201d: 1, \u201cstartTime\u201d: \u201c2020-10-07T09:49:00.000\u201d, \u201ctimeInBed\u201d: 63}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 185, \u201ctotalSleepRecords\u201d: 2, \u201ctotalTimeInBed\u201d: 198}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 3, \u201cawakeDuration\u201d: 21, \u201cawakeningsCount\u201d: 16, \u201cdateOfSleep\u201d: \u201c2020-10-08\u201d, \u201cduration\u201d: 19260000, \u201cefficiency\u201d: 89, \u201cendTime\u201d: \u201c2020-10-08T06:01:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14150613895, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:40:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:41:00\u201d, \u201cvalue\u201d: \u201c3\u201d}, {\u201cdateTime\u201d: \u201c00:42:00\u201d, \u201cvalue\u201d: \u201c3\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 275, \u201cminutesAwake\u201d: 33, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 13, \u201crestlessDuration\u201d: 25, \u201cstartTime\u201d: \u201c2020-10-08T00:40:00.000\u201d, \u201ctimeInBed\u201d: 321}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 275, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 321}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d: [{\u201cawakeCount\u201d: 1, \u201cawakeDuration\u201d: 3, \u201cawakeningsCount\u201d: 8, \u201cdateOfSleep\u201d: \u201c2020-10-09\u201d, \u201cduration\u201d: 19320000, \u201cefficiency\u201d: 96, \u201cendTime\u201d: \u201c2020-10-09T05:57:30.000\u201d, \u201cisMainSleep\u201d: true, \u201clogId\u201d: 14161136803, \u201cminuteData\u201d: [{\u201cdateTime\u201d: \u201c00:35:30\u201d, \u201cvalue\u201d: \u201c2\u201d}, {\u201cdateTime\u201d: \u201c00:36:30\u201d, \u201cvalue\u201d: \u201c1\u201d}, {\u201cdateTime\u201d: \u201c00:37:30\u201d, \u201cvalue\u201d: \u201c1\u201d},\u2026], \u201cminutesAfterWakeup\u201d: 0, \u201cminutesAsleep\u201d: 309, \u201cminutesAwake\u201d: 13, \u201cminutesToFallAsleep\u201d: 0, \u201crestlessCount\u201d: 7, \u201crestlessDuration\u201d: 10, \u201cstartTime\u201d: \u201c2020-10-09T00:35:30.000\u201d, \u201ctimeInBed\u201d: 322}], \u201csummary\u201d: {\u201ctotalMinutesAsleep\u201d: 309, \u201ctotalSleepRecords\u201d: 1, \u201ctotalTimeInBed\u201d: 322}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type count_awake duration_awake count_awakenings count_restless duration_restless a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 15:55:00 2020-10-07 18:10:00 91 0 123 12 0 135 1 classic 2 3 10 8 9 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 09:49:00 2020-10-07 10:52:30 100 1 62 0 0 63 0 classic 0 0 1 1 1 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 00:40:00 2020-10-08 06:01:30 89 0 275 33 0 321 1 classic 3 21 16 13 25 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 00:35:30 2020-10-09 05:57:30 96 0 309 13 0 322 1 classic 1 3 8 7 10 Example of the structure of source data with Fitbit\u2019s sleep API Version 1.2 JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:3600000,\u201defficiency\u201d:92,\u201dendTime\u201d:\u201d2020-10-10T16:37:00.000\u201d,\u201dinfoCode\u201d:2,\u201disMainSleep\u201d:false,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-10T15:37:30.000\u201d,\u201dlevel\u201d:\u201dasleep\u201d,\u201dseconds\u201d:660},{\u201cdateTime\u201d:\u201d2020-10-10T15:48:30.000\u201d,\u201dlevel\u201d:\u201drestless\u201d,\u201dseconds\u201d:60},\u2026], \u201csummary\u201d:{\u201casleep\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:56},\u201dawake\u201d:{\u201ccount\u201d:0,\u201dminutes\u201d:0},\u201drestless\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:4}}},\u201dlogId\u201d:26315914306,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:55,\u201dminutesAwake\u201d:5,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T15:36:30.000\u201d,\u201dtimeInBed\u201d:60,\u201dtype\u201d:\u201dclassic\u201d},{\u201cdateOfSleep\u201d:\u201d2020-10-10\u201d,\u201dduration\u201d:22980000,\u201defficiency\u201d:88,\u201dendTime\u201d:\u201d2020-10-10T08:10:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:420},{\u201cdateTime\u201d:\u201d2020-10-10T01:53:30.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:1230},{\u201cdateTime\u201d:\u201d2020-10-10T02:14:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:360},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:3,\u201dminutes\u201d:92,\u201dthirtyDayAvgMinutes\u201d:0},\u201dlight\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:193,\u201dthirtyDayAvgMinutes\u201d:0},\u201drem\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:33,\u201dthirtyDayAvgMinutes\u201d:0},\u201dwake\u201d:{\u201ccount\u201d:28,\u201dminutes\u201d:65,\u201dthirtyDayAvgMinutes\u201d:0}}},\u201dlogId\u201d:26311786557,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:318,\u201dminutesAwake\u201d:65,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-10T01:46:30.000\u201d,\u201dtimeInBed\u201d:383,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:92,\u201dlight\u201d:193,\u201drem\u201d:33,\u201dwake\u201d:65},\u201dtotalMinutesAsleep\u201d:373,\u201dtotalSleepRecords\u201d:2,\u201dtotalTimeInBed\u201d:443}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-11\u201d,\u201dduration\u201d:41640000,\u201defficiency\u201d:89,\u201dendTime\u201d:\u201d2020-10-11T11:47:00.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:450},{\u201cdateTime\u201d:\u201d2020-10-11T00:20:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:870},{\u201cdateTime\u201d:\u201d2020-10-11T00:34:30.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:780},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:52,\u201dthirtyDayAvgMinutes\u201d:62},\u201dlight\u201d:{\u201ccount\u201d:32,\u201dminutes\u201d:442,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:6,\u201dminutes\u201d:68,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:29,\u201dminutes\u201d:132,\u201dthirtyDayAvgMinutes\u201d:94}}},\u201dlogId\u201d:26589710670,\u201dminutesAfterWakeup\u201d:1,\u201dminutesAsleep\u201d:562,\u201dminutesAwake\u201d:132,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-11T00:12:30.000\u201d,\u201dtimeInBed\u201d:694,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:52,\u201dlight\u201d:442,\u201drem\u201d:68,\u201dwake\u201d:132},\u201dtotalMinutesAsleep\u201d:562,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:694}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 {\u201csleep\u201d:[{\u201cdateOfSleep\u201d:\u201d2020-10-12\u201d,\u201dduration\u201d:28980000,\u201defficiency\u201d:93,\u201dendTime\u201d:\u201d2020-10-12T09:34:30.000\u201d,\u201dinfoCode\u201d:0,\u201disMainSleep\u201d:true,\u201dlevels\u201d:{\u201cdata\u201d:[{\u201cdateTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dlevel\u201d:\u201dwake\u201d,\u201dseconds\u201d:600},{\u201cdateTime\u201d:\u201d2020-10-12T01:41:00.000\u201d,\u201dlevel\u201d:\u201dlight\u201d,\u201dseconds\u201d:60},{\u201cdateTime\u201d:\u201d2020-10-12T01:42:00.000\u201d,\u201dlevel\u201d:\u201ddeep\u201d,\u201dseconds\u201d:2340},\u2026], \u201csummary\u201d:{\u201cdeep\u201d:{\u201ccount\u201d:4,\u201dminutes\u201d:63,\u201dthirtyDayAvgMinutes\u201d:59},\u201dlight\u201d:{\u201ccount\u201d:27,\u201dminutes\u201d:257,\u201dthirtyDayAvgMinutes\u201d:364},\u201drem\u201d:{\u201ccount\u201d:5,\u201dminutes\u201d:94,\u201dthirtyDayAvgMinutes\u201d:58},\u201dwake\u201d:{\u201ccount\u201d:24,\u201dminutes\u201d:69,\u201dthirtyDayAvgMinutes\u201d:95}}},\u201dlogId\u201d:26589710673,\u201dminutesAfterWakeup\u201d:0,\u201dminutesAsleep\u201d:415,\u201dminutesAwake\u201d:68,\u201dminutesToFallAsleep\u201d:0,\u201dstartTime\u201d:\u201d2020-10-12T01:31:00.000\u201d,\u201dtimeInBed\u201d:483,\u201dtype\u201d:\u201dstages\u201d}],\u201dsummary\u201d:{\u201cstages\u201d:{\u201cdeep\u201d:63,\u201dlight\u201d:257,\u201drem\u201d:94,\u201dwake\u201d:69},\u201dtotalMinutesAsleep\u201d:415,\u201dtotalSleepRecords\u201d:1,\u201dtotalTimeInBed\u201d:483}} PLAIN_TEXT device_id local_start_date_time local_end_date_time efficiency minutes_after_wakeup minutes_asleep minutes_awake minutes_to_fall_asleep minutes_in_bed is_main_sleep type a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 15:36:30 2020-10-10 16:37:00 92 0 55 5 0 60 0 classic a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-10 01:46:30 2020-10-10 08:10:00 88 0 318 65 0 383 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-11 00:12:30 2020-10-11 11:47:00 89 1 562 132 0 694 1 stages a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-12 01:31:00 2020-10-12 09:34:30 93 0 415 68 0 483 1 stages","title":"Fitbit Sleep Summary"},{"location":"features/fitbit-sleep-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_sleep_summary_raw.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed.csv - data/raw/ { pid } /fitbit_sleep_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_sleep_summary_features/fitbit_sleep_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_sleep_summary.csv Parameters description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_SLEEP_SUMMARY features from the RAPIDS provider [SLEEP_TYPES] Types of sleep to be included in the feature extraction computation. Fitbit provides 3 types of sleep: main , nap , all . [FEATURES] Features to be computed from sleep summary data, see table below Features description for [FITBIT_SLEEP_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description countepisodeTYPE episodes Number of sleep episodes for a certain sleep type during a time segment. avgefficiencyTYPE scores Average sleep efficiency for a certain sleep type during a time segment. sumdurationafterwakeupTYPE minutes Total duration the user stayed in bed after waking up for a certain sleep type during a time segment. sumdurationasleepTYPE minutes Total sleep duration for a certain sleep type during a time segment. sumdurationawakeTYPE minutes Total duration the user stayed awake but still in bed for a certain sleep type during a time segment. sumdurationtofallasleepTYPE minutes Total duration the user spent to fall asleep for a certain sleep type during a time segment. sumdurationinbedTYPE minutes Total duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. avgdurationafterwakeupTYPE minutes Average duration the user stayed in bed after waking up for a certain sleep type during a time segment. avgdurationasleepTYPE minutes Average sleep duration for a certain sleep type during a time segment. avgdurationawakeTYPE minutes Average duration the user stayed awake but still in bed for a certain sleep type during a time segment. avgdurationtofallasleepTYPE minutes Average duration the user spent to fall asleep for a certain sleep type during a time segment. avgdurationinbedTYPE minutes Average duration the user stayed in bed (sumdurationtofallasleep + sumdurationawake + sumdurationasleep + sumdurationafterwakeup) for a certain sleep type during a time segment. Assumptions/Observations There are three sleep types (TYPE): main , nap , all . The all type contains both main sleep and naps. There are two versions of Fitbit\u2019s sleep API ( version 1 and version 1.2 ), and each provides raw sleep data in a different format: Count & duration summaries . v1 contains count_awake , duration_awake , count_awakenings , count_restless , and duration_restless fields for every sleep record but v1.2 does not. API columns . Features are computed based on the values provided by Fitbit\u2019s API: efficiency , minutes_after_wakeup , minutes_asleep , minutes_awake , minutes_to_fall_asleep , minutes_in_bed , is_main_sleep and type .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-intraday/","text":"Fitbit Steps Intraday \u00b6 Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0 RAPIDS provider \u00b6 Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#fitbit-steps-intraday","text":"Sensor parameters description for [FITBIT_STEPS_INTRADAY] : Key Description [TABLE] Database table name or file path where the steps intraday data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:00:00 5 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:01:00 3 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 00:02:00 0","title":"Fitbit Steps Intraday"},{"location":"features/fitbit-steps-intraday/#rapids-provider","text":"Available time segments Available for all time segments File Sequence - data/raw/ { pid } /fitbit_steps_intraday_raw.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed.csv - data/raw/ { pid } /fitbit_steps_intraday_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_intraday_features/fitbit_steps_intraday_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_intraday.csv Parameters description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_INTRADAY features from the RAPIDS provider [FEATURES] Features to be computed from steps intraday data, see table below [THRESHOLD_ACTIVE_BOUT] Every minute with Fitbit steps data wil be labelled as sedentary if its step count is below this threshold, otherwise, active . [INCLUDE_ZERO_STEP_ROWS] Whether or not to include time segments with a 0 step count during the whole day. Features description for [FITBIT_STEPS_INTRADAY][PROVIDERS][RAPIDS] : Feature Units Description sumsteps steps The total step count during a time segment. maxsteps steps The maximum step count during a time segment. minsteps steps The minimum step count during a time segment. avgsteps steps The average step count during a time segment. stdsteps steps The standard deviation of step count during a time segment. countepisodesedentarybout bouts Number of sedentary bouts during a time segment. sumdurationsedentarybout minutes Total duration of all sedentary bouts during a time segment. maxdurationsedentarybout minutes The maximum duration of any sedentary bout during a time segment. mindurationsedentarybout minutes The minimum duration of any sedentary bout during a time segment. avgdurationsedentarybout minutes The average duration of sedentary bouts during a time segment. stddurationsedentarybout minutes The standard deviation of the duration of sedentary bouts during a time segment. countepisodeactivebout bouts Number of active bouts during a time segment. sumdurationactivebout minutes Total duration of all active bouts during a time segment. maxdurationactivebout minutes The maximum duration of any active bout during a time segment. mindurationactivebout minutes The minimum duration of any active bout during a time segment. avgdurationactivebout minutes The average duration of active bouts during a time segment. stddurationactivebout minutes The standard deviation of the duration of active bouts during a time segment. Assumptions/Observations Active and sedentary bouts . If the step count per minute is smaller than THRESHOLD_ACTIVE_BOUT (default value is 10), that minute is labelled as sedentary, otherwise, is labelled as active. Active and sedentary bouts are periods of consecutive minutes labelled as active or sedentary .","title":"RAPIDS provider"},{"location":"features/fitbit-steps-summary/","text":"Fitbit Steps Summary \u00b6 Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998 RAPIDS provider \u00b6 Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#fitbit-steps-summary","text":"Sensor parameters description for [FITBIT_STEPS_SUMMARY] : Key Description [TABLE] Database table name or file path where the steps summary data is stored. The configuration keys in Device Data Source Configuration control whether this parameter is interpreted as table or file. The format of the column(s) containing the Fitbit sensor data can be JSON or PLAIN_TEXT . The data in JSON format is obtained directly from the Fitbit API. We support PLAIN_TEXT in case you already parsed your data and don\u2019t have access to your participants\u2019 Fitbit accounts anymore. If your data is in JSON format then summary and intraday data come packed together. We provide examples of the input format that RAPIDS expects, note that both examples for JSON and PLAIN_TEXT are tabular and the actual format difference comes in the fitbit_data column (we truncate the JSON example for brevity). Example of the structure of source data JSON device_id fitbit_data a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-07\u201d,\u201dvalue\u201d:\u201d1775\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:5},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:3},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-08\u201d,\u201dvalue\u201d:\u201d3201\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:14},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:11},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:10},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} a748ee1a-1d0b-4ae9-9074-279a2b6ba524 \u201cactivities-steps\u201d:[{\u201cdateTime\u201d:\u201d2020-10-09\u201d,\u201dvalue\u201d:\u201d998\u201d}],\u201dactivities-steps-intraday\u201d:{\u201cdataset\u201d:[{\u201ctime\u201d:\u201d00:00:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:01:00\u201d,\u201dvalue\u201d:0},{\u201ctime\u201d:\u201d00:02:00\u201d,\u201dvalue\u201d:0},\u2026],\u201ddatasetInterval\u201d:1,\u201ddatasetType\u201d:\u201dminute\u201d}} PLAIN_TEXT device_id local_date_time steps a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-07 1775 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-08 3201 a748ee1a-1d0b-4ae9-9074-279a2b6ba524 2020-10-09 998","title":"Fitbit Steps Summary"},{"location":"features/fitbit-steps-summary/#rapids-provider","text":"Available time segments Only available for segments that span 1 or more complete days (e.g. Jan 1 st 00:00 to Jan 3 rd 23:59) File Sequence - data/raw/ { pid } /fitbit_steps_summary_raw.csv - data/raw/ { pid } /fitbit_steps_summary_parsed.csv - data/raw/ { pid } /fitbit_steps_summary_parsed_with_datetime.csv - data/interim/ { pid } /fitbit_steps_summary_features/fitbit_steps_summary_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /fitbit_steps_summary.csv Parameters description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract FITBIT_STEPS_SUMMARY features from the RAPIDS provider [FEATURES] Features to be computed from steps summary data, see table below Features description for [FITBIT_STEPS_SUMMARY][PROVIDERS][RAPIDS] : Feature Units Description maxsumsteps steps The maximum daily step count during a time segment. minsumsteps steps The minimum daily step count during a time segment. avgsumsteps steps The average daily step count during a time segment. mediansumsteps steps The median of daily step count during a time segment. stdsumsteps steps The standard deviation of daily step count during a time segment. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/","text":"Phone Accelerometer \u00b6 Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. PANDA provider \u00b6 These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#phone-accelerometer","text":"Sensor parameters description for [PHONE_ACCELEROMETER] : Key Description [TABLE] Database table where the accelerometer data is stored","title":"Phone Accelerometer"},{"location":"features/phone-accelerometer/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][RAPIDS] : Feature Units Description maxmagnitude m/s 2 The maximum magnitude of acceleration ( \\(\\|acceleration\\| = \\sqrt{x^2 + y^2 + z^2}\\) ). minmagnitude m/s 2 The minimum magnitude of acceleration. avgmagnitude m/s 2 The average magnitude of acceleration. medianmagnitude m/s 2 The median magnitude of acceleration. stdmagnitude m/s 2 The standard deviation of acceleration. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem.","title":"RAPIDS provider"},{"location":"features/phone-accelerometer/#panda-provider","text":"These features are based on the work by Panda et al . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_accelerometer_raw.csv - data/raw/ { pid } /phone_accelerometer_with_datetime.csv - data/interim/ { pid } /phone_accelerometer_features/phone_accelerometer_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_accelerometer.csv Parameters description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Key Description [COMPUTE] Set to True to extract PHONE_ACCELEROMETER features from the PANDA provider [FEATURES] Features to be computed for exertional and non-exertional activity episodes, see table below Features description for [PHONE_ACCELEROMETER][PROVIDERS][PANDA] : Feature Units Description sumduration minutes Total duration of all exertional or non-exertional activity episodes. maxduration minutes Longest duration of any exertional or non-exertional activity episode. minduration minutes Shortest duration of any exertional or non-exertional activity episode. avgduration minutes Average duration of any exertional or non-exertional activity episode. medianduration minutes Median duration of any exertional or non-exertional activity episode. stdduration minutes Standard deviation of the duration of all exertional or non-exertional activity episodes. Assumptions/Observations Analyzing accelerometer data is a memory intensive task. If RAPIDS crashes is likely because the accelerometer dataset for a participant is to big to fit in memory. We are considering different alternatives to overcome this problem. See Panda et al for a definition of exertional and non-exertional activity episodes","title":"PANDA provider"},{"location":"features/phone-activity-recognition/","text":"Phone Activity Recognition \u00b6 Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#phone-activity-recognition","text":"Sensor parameters description for [PHONE_ACTIVITY_RECOGNITION] : Key Description [TABLE][ANDROID] Database table where the activity data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the activity data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same activity episode","title":"Phone Activity Recognition"},{"location":"features/phone-activity-recognition/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_activity_recognition_raw.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime.csv - data/raw/ { pid } /phone_activity_recognition_with_datetime_unified.csv - data/interim/ { pid } /phone_activity_recognition_episodes.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled.csv - data/interim/ { pid } /phone_activity_recognition_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_activity_recognition_features/phone_activity_recognition_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_activity_recognition.csv Parameters description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_ACTIVITY_RECOGNITION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [ACTIVITY_CLASSES][STATIONARY] An array of the activity labels to be considered in the STATIONARY category choose any of still , tilting [ACTIVITY_CLASSES][MOBILE] An array of the activity labels to be considered in the MOBILE category choose any of on_foot , walking , running , on_bicycle [ACTIVITY_CLASSES][VEHICLE] An array of the activity labels to be considered in the VEHICLE category choose any of in_vehicule Features description for [PHONE_ACTIVITY_RECOGNITION][PROVIDERS][RAPIDS] : Feature Units Description count rows Number of episodes. mostcommonactivity activity type The most common activity type (e.g. still , on_foot , etc.). If there is a tie, the first one is chosen. countuniqueactivities activity type Number of unique activities. durationstationary minutes The total duration of [ACTIVITY_CLASSES][STATIONARY] episodes durationmobile minutes The total duration of [ACTIVITY_CLASSES][MOBILE] episodes of on foot, running, and on bicycle activities durationvehicle minutes The total duration of [ACTIVITY_CLASSES][VEHICLE] episodes of on vehicle activity Assumptions/Observations iOS Activity Recognition names and types are unified with Android labels: iOS Activity Name Android Activity Name Android Activity Type walking walking 7 running running 8 cycling on_bicycle 1 automotive in_vehicle 0 stationary still 3 unknown unknown 4 In AWARE, Activity Recognition data for Android and iOS are stored in two different database tables, RAPIDS automatically infers what platform each participant belongs to based on their participant file .","title":"RAPIDS provider"},{"location":"features/phone-applications-foreground/","text":"Phone Applications Foreground \u00b6 Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored) RAPIDS provider \u00b6 The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#phone-applications-foreground","text":"Sensor parameters description for [PHONE_APPLICATIONS_FOREGROUND] (these parameters are used by the only provider available at the moment, RAPIDS): Key Description [TABLE] Database table where the applications foreground data is stored [APPLICATION_CATEGORIES][CATALOGUE_SOURCE] FILE or GOOGLE . If FILE , app categories (genres) are read from [CATALOGUE_FILE] . If [GOOGLE] , app categories (genres) are scrapped from the Play Store [APPLICATION_CATEGORIES][CATALOGUE_FILE] CSV file with a package_name and genre column. By default we provide the catalogue created by Stachl et al in data/external/stachl_application_genre_catalogue.csv [APPLICATION_CATEGORIES][UPDATE_CATALOGUE_FILE] if [CATALOGUE_SOURCE] is equal to FILE , this flag signals whether or not to update [CATALOGUE_FILE] , if [CATALOGUE_SOURCE] is equal to GOOGLE all scraped genres will be saved to [CATALOGUE_FILE] [APPLICATION_CATEGORIES][SCRAPE_MISSING_CATEGORIES] This flag signals whether or not to scrape categories (genres) missing from the [CATALOGUE_FILE] . If [CATALOGUE_SOURCE] is equal to GOOGLE , all genres are scraped anyway (this flag is ignored)","title":"Phone Applications Foreground"},{"location":"features/phone-applications-foreground/#rapids-provider","text":"The app category (genre) catalogue used in these features was originally created by Stachl et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_applications_foreground_raw.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime.csv - data/raw/ { pid } /phone_applications_foreground_with_datetime_with_categories.csv - data/interim/ { pid } /phone_applications_foreground_features/phone_applications_foreground_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_applications_foreground.csv Parameters description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_APPLICATIONS_FOREGROUND features from the RAPIDS provider [FEATURES] Features to be computed, see table below [SINGLE_CATEGORIES] An array of app categories to be included in the feature extraction computation. The special keyword all represents a category with all the apps from each participant. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [MULTIPLE_CATEGORIES] An array of collections representing meta-categories (a group of categories). They key of each element is the name of the meta-category and the value is an array of member app categories. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [SINGLE_APPS] An array of apps to be included in the feature extraction computation. Use their package name (e.g. com.google.android.youtube ) or the reserved keyword top1global (the most used app by a participant over the whole monitoring study) [EXCLUDED_CATEGORIES] An array of app categories to be excluded from the feature extraction computation. By default we use the category catalogue pointed by [APPLICATION_CATEGORIES][CATALOGUE_FILE] (see the Sensor parameters description table above) [EXCLUDED_APPS] An array of apps to be excluded from the feature extraction computation. Use their package name, for example: com.google.android.youtube Features description for [PHONE_APPLICATIONS_FOREGROUND][PROVIDERS][RAPIDS] : Feature Units Description count apps Number of times a single app or apps within a category were used (i.e. they were brought to the foreground either by tapping their icon or switching to it from another app) timeoffirstuse minutes The time in minutes between 12:00am (midnight) and the first use of a single app or apps within a category during a time_segment timeoflastuse minutes The time in minutes between 12:00am (midnight) and the last use of a single app or apps within a category during a time_segment frequencyentropy nats The entropy of the used apps within a category during a time_segment (each app is seen as a unique event, the more apps were used, the higher the entropy). This is especially relevant when computed over all apps. Entropy cannot be obtained for a single app Assumptions/Observations Features can be computed by app, by apps grouped under a single category (genre) and by multiple categories grouped together (meta-categories). For example, we can get features for Facebook (single app), for Social Network apps (a category including Facebook and other social media apps) or for Social (a meta-category formed by Social Network and Social Media Tools categories). Apps installed by default like YouTube are considered systems apps on some phones. We do an exact match to exclude apps where \u201cgenre\u201d == EXCLUDED_CATEGORIES or \u201cpackage_name\u201d == EXCLUDED_APPS . We provide three ways of classifying and app within a category (genre): a) by automatically scraping its official category from the Google Play Store, b) by using the catalogue created by Stachl et al. which we provide in RAPIDS ( data/external/stachl_application_genre_catalogue.csv ), or c) by manually creating a personalized catalogue. You can choose a, b or c by modifying [APPLICATION_GENRES] keys and values (see the Sensor parameters description table above).","title":"RAPIDS provider"},{"location":"features/phone-battery/","text":"Phone Battery \u00b6 Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"Phone Battery"},{"location":"features/phone-battery/#phone-battery","text":"Sensor parameters description for [PHONE_BATTERY] : Key Description [TABLE] Database table where the battery data is stored [EPISODE_THRESHOLD_BETWEEN_ROWS] Difference in minutes between any two rows for them to be considered part of the same battery charge or discharge episode","title":"Phone Battery"},{"location":"features/phone-battery/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_battery_raw.csv - data/interim/ { pid } /phone_battery_episodes.csv - data/interim/ { pid } /phone_battery_episodes_resampled.csv - data/interim/ { pid } /phone_battery_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_battery_features/phone_battery_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_battery.csv Parameters description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BATTERY features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BATTERY][PROVIDERS][RAPIDS] : Feature Units Description countdischarge episodes Number of discharging episodes. sumdurationdischarge minutes The total duration of all discharging episodes. countcharge episodes Number of battery charging episodes. sumdurationcharge minutes The total duration of all charging episodes. avgconsumptionrate episodes/minutes The average of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration maxconsumptionrate episodes/minutes The highest of all episodes\u2019 consumption rates. An episode\u2019s consumption rate is defined as the ratio between its battery delta and duration Assumptions/Observations We convert battery data collected with iOS client v1 (autodetected because battery status 4 do not exist) to match Android battery format: we swap status 3 for 5 and 1 for 3 We group battery data into discharge or charge episodes considering any contiguous rows with consecutive reductions or increases of the battery level if they are logged within [EPISODE_THRESHOLD_BETWEEN_ROWS] minutes from each other.","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/","text":"Phone Bluetooth \u00b6 Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored RAPIDS provider \u00b6 Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider DORYAB provider \u00b6 This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#phone-bluetooth","text":"Sensor parameters description for [PHONE_BLUETOOTH] : Key Description [TABLE] Database table where the bluetooth data is stored","title":"Phone Bluetooth"},{"location":"features/phone-bluetooth/#rapids-provider","text":"Warning The features of this provider are deprecated in favor of DORYAB provider (see below). Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_BLUETOOTH][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned devices during a time segment, a device can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique devices during a time segment as identified by their hardware ( bt_address ) address countscansmostuniquedevice scans Number of scans of the most sensed device within each time segment instance Assumptions/Observations From v0.2.0 countscans , uniquedevices , countscansmostuniquedevice were deprecated because they overlap with the respective features for ALL devices of the PHONE_BLUETOOTH DORYAB provider","title":"RAPIDS provider"},{"location":"features/phone-bluetooth/#doryab-provider","text":"This provider is adapted from the work by Doryab et al . Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_bluetooth_raw.csv - data/raw/ { pid } /phone_bluetooth_with_datetime.csv - data/interim/ { pid } /phone_bluetooth_features/phone_bluetooth_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_bluetooth.csv \" Parameters description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Key Description [COMPUTE] Set to True to extract PHONE_BLUETOOTH features from the DORYAB provider [FEATURES] Features to be computed, see table below. These features are computed for three device categories: all devices, own devices and other devices. Features description for [PHONE_BLUETOOTH][PROVIDERS][DORYAB] : Feature Units Description countscans scans Number of scans (rows) from the devices sensed during a time segment instance. The more scans a bluetooth device has the longer it remained within range of the participant\u2019s phone uniquedevices devices Number of unique bluetooth devices sensed during a time segment instance as identified by their hardware addresses ( bt_address ) meanscans scans Mean of the scans of every sensed device within each time segment instance stdscans scans Standard deviation of the scans of every sensed device within each time segment instance countscans most frequentdevice within segments scans Number of scans of the most sensed device within each time segment instance countscans least frequentdevice within segments scans Number of scans of the least sensed device within each time segment instance countscans most frequentdevice across segments scans Number of scans of the most sensed device across time segment instances of the same type countscans least frequentdevice across segments scans Number of scans of the least sensed device across time segment instances of the same type per device countscans most frequentdevice acrossdataset scans Number of scans of the most sensed device across the entire dataset of every participant countscans least frequentdevice acrossdataset scans Number of scans of the least sensed device across the entire dataset of every participant Assumptions/Observations Devices are classified as belonging to the participant ( own ) or to other people ( others ) using k-means based on the number of times and the number of days each device was detected across each participant\u2019s dataset. See Doryab et al for more details. If ownership cannot be computed because all devices were detected on only one day, they are all considered as other . Thus all and other features will be equal. The likelihood of this scenario decreases the more days of data you have. The most and least frequent devices will be the same across time segment instances and across the entire dataset when every time segment instance covers every hour of a dataset. For example, daily segments (00:00 to 23:59) fall in this category but morning segments (06:00am to 11:59am) or periodic 30-minute segments don\u2019t. Example Simplified raw bluetooth data The following is a simplified example with bluetooth data from three days and two time segments: morning and afternoon. There are two own devices: 5C836F5-487E-405F-8E28-21DBD40FA4FF detected seven times across two days and 499A1EAF-DDF1-4657-986C-EA5032104448 detected eight times on a single day. local_date segment bt_address own_device 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-29 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-29 afternoon 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2016-11-30 morning 48872A52-68DE-420D-98DA-73339A1C4685 0 2016-11-30 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2016-11-30 afternoon 55C836F5-487E-405F-8E28-21DBD40FA4FF 1 2017-05-07 morning 5C5A9C41-2F68-4CEB-96D0-77DE3729B729 0 2017-05-07 morning 25262DC7-780C-4AD5-AD3A-D9776AEF7FC1 0 2017-05-07 morning 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 morning 6C444841-FE64-4375-BC3F-FA410CDC0AC7 0 2017-05-07 morning 4DC7A22D-9F1F-4DEF-8576-086910AABCB5 0 2017-05-07 afternoon 5B1E6981-2E50-4D9A-99D8-67AED430C5A8 0 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 2017-05-07 afternoon 499A1EAF-DDF1-4657-986C-EA5032104448 1 The most and least frequent OTHER devices ( own_device == 0 ) during morning segments The most and least frequent ALL | OWN | OTHER devices are computed within each time segment instance, across time segment instances of the same type and across the entire dataset of each person. These are the most and least frequent devices for OTHER devices during morning segments. most frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) least frequent device across 2016-11-29 morning: '48872A52-68DE-420D-98DA-73339A1C4685' (this device is the only one in this instance) most frequent device across 2016-11-30 morning: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent device across 2016-11-30 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) least frequent device across 2017-05-07 morning: '25262DC7-780C-4AD5-AD3A-D9776AEF7FC1' (when tied, the first occurance is chosen) most frequent across morning segments: '5B1E6981-2E50-4D9A-99D8-67AED430C5A8' least frequent across morning segments: '6C444841-FE64-4375-BC3F-FA410CDC0AC7' (when tied, the first occurance is chosen) most frequent across dataset: '499A1EAF-DDF1-4657-986C-EA5032104448' (only taking into account \"morning\" segments) least frequent across dataset: '4DC7A22D-9F1F-4DEF-8576-086910AABCB5' (when tied, the first occurance is chosen) Bluetooth features for OTHER devices and morning segments For brevity we only show the following features for morning segments: OTHER : DEVICES : [ \"countscans\" , \"uniquedevices\" , \"meanscans\" , \"stdscans\" ] SCANS_MOST_FREQUENT_DEVICE : [ \"withinsegments\" , \"acrosssegments\" , \"acrossdataset\" ] Note that countscansmostfrequentdeviceacrossdatasetothers is all 0 s because 499A1EAF-DDF1-4657-986C-EA5032104448 is excluded from the count as is labelled as an own device (not other ). local_segment countscansothers uniquedevicesothers meanscansothers stdscansothers countscansmostfrequentdevicewithinsegmentsothers countscansmostfrequentdeviceacrosssegmentsothers countscansmostfrequentdeviceacrossdatasetothers 2016-11-29-morning 1 1 1.000000 NaN 1 0.0 0.0 2016-11-30-morning 4 3 1.333333 0.57735 2 2.0 2.0 2017-05-07-morning 5 5 1.000000 0.00000 1 1.0 1.0","title":"DORYAB provider"},{"location":"features/phone-calls/","text":"Phone Calls \u00b6 Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored RAPIDS Provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"Phone Calls"},{"location":"features/phone-calls/#phone-calls","text":"Sensor parameters description for [PHONE_CALLS] : Key Description [TABLE] Database table where the calls data is stored","title":"Phone Calls"},{"location":"features/phone-calls/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_calls_raw.csv - data/raw/ { pid } /phone_calls_with_datetime.csv - data/raw/ { pid } /phone_calls_with_datetime_unified.csv - data/interim/ { pid } /phone_calls_features/phone_calls_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_calls.csv Parameters description for [PHONE_CALLS][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CALLS features from the RAPIDS provider [CALL_TYPES] The particular call_type that will be analyzed. The options for this parameter are incoming, outgoing or missed. [FEATURES] Features to be computed for outgoing , incoming , and missed calls. Note that the same features are available for both incoming and outgoing calls, while missed calls has its own set of features. See the tables below. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] incoming and outgoing calls: Feature Units Description count calls Number of calls of a particular call_type occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular call_type for a particular time_segment meanduration seconds The mean duration of all calls of a particular call_type during a particular time_segment . sumduration seconds The sum of the duration of all calls of a particular call_type during a particular time_segment . minduration seconds The duration of the shortest call of a particular call_type during a particular time_segment . maxduration seconds The duration of the longest call of a particular call_type during a particular time_segment . stdduration seconds The standard deviation of the duration of all the calls of a particular call_type during a particular time_segment . modeduration seconds The mode of the duration of all the calls of a particular call_type during a particular time_segment . entropyduration nats The estimate of the Shannon entropy for the the duration of all the calls of a particular call_type during a particular time_segment . timefirstcall minutes The time in minutes between 12:00am (midnight) and the first call of call_type . timelastcall minutes The time in minutes between 12:00am (midnight) and the last call of call_type . countmostfrequentcontact calls The number of calls of a particular call_type during a particular time_segment of the most frequent contact throughout the monitored period. Features description for [PHONE_CALLS][PROVIDERS][RAPIDS] missed calls: Feature Units Description count calls Number of missed calls that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with missed calls for a particular time_segment timefirstcall minutes The time in hours from 12:00am (Midnight) that the first missed call occurred. timelastcall minutes The time in hours from 12:00am (Midnight) that the last missed call occurred. countmostfrequentcontact calls The number of missed calls during a particular time_segment of the most frequent contact throughout the monitored period. Assumptions/Observations Traces for iOS calls are unique even for the same contact calling a participant more than once which renders countmostfrequentcontact meaningless and distinctcontacts equal to the total number of traces. [CALL_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [CALL_TYPES] outgoing matches the [FEATURES] key outgoing iOS calls data is transformed to match Android calls data format. See our algorithm","title":"RAPIDS Provider"},{"location":"features/phone-conversation/","text":"Phone Conversation \u00b6 Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS) RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"Phone Conversation"},{"location":"features/phone-conversation/#phone-conversation","text":"Sensor parameters description for [PHONE_CONVERSATION] : Key Description [TABLE][ANDROID] Database table where the conversation data from Android devices is stored (the AWARE client saves this data on different tables for Android and iOS) [TABLE][IOS] Database table where the conversation data from iOS devices is stored (the AWARE client saves this data on different tables for Android and iOS)","title":"Phone Conversation"},{"location":"features/phone-conversation/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_conversation_raw.csv - data/raw/ { pid } /phone_conversation_with_datetime.csv - data/raw/ { pid } /phone_conversation_with_datetime_unified.csv - data/interim/ { pid } /phone_conversation_features/phone_conversation_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_conversation.csv Parameters description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_CONVERSATION features from the RAPIDS provider [FEATURES] Features to be computed, see table below [RECORDING_MINUTES] Minutes the plugin was recording audio (default 1 min) [PAUSED_MINUTES] Minutes the plugin was NOT recording audio (default 3 min) Features description for [PHONE_CONVERSATION][PROVIDERS][RAPIDS] : Feature Units Description minutessilence minutes Minutes labeled as silence minutesnoise minutes Minutes labeled as noise minutesvoice minutes Minutes labeled as voice minutesunknown minutes Minutes labeled as unknown sumconversationduration minutes Total duration of all conversations maxconversationduration minutes Longest duration of all conversations minconversationduration minutes Shortest duration of all conversations avgconversationduration minutes Average duration of all conversations sdconversationduration minutes Standard Deviation of the duration of all conversations timefirstconversation minutes Minutes since midnight when the first conversation for a time segment was detected timelastconversation minutes Minutes since midnight when the last conversation for a time segment was detected noisesumenergy L2-norm Sum of all energy values when inference is noise noiseavgenergy L2-norm Average of all energy values when inference is noise noisesdenergy L2-norm Standard Deviation of all energy values when inference is noise noiseminenergy L2-norm Minimum of all energy values when inference is noise noisemaxenergy L2-norm Maximum of all energy values when inference is noise voicesumenergy L2-norm Sum of all energy values when inference is voice voiceavgenergy L2-norm Average of all energy values when inference is voice voicesdenergy L2-norm Standard Deviation of all energy values when inference is voice voiceminenergy L2-norm Minimum of all energy values when inference is voice voicemaxenergy L2-norm Maximum of all energy values when inference is voice silencesensedfraction - Ratio between minutessilence and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) noisesensedfraction - Ratio between minutesnoise and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) voicesensedfraction - Ratio between minutesvoice and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) unknownsensedfraction - Ratio between minutesunknown and the sum of (minutessilence, minutesnoise, minutesvoice, minutesunknown) silenceexpectedfraction - Ration between minutessilence and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) noiseexpectedfraction - Ration between minutesnoise and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) voiceexpectedfraction - Ration between minutesvoice and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) unknownexpectedfraction - Ration between minutesunknown and the number of minutes that in theory should have been sensed based on the record and pause cycle of the plugin (1440 / recordingMinutes+pausedMinutes) Assumptions/Observations The timestamp of conversation rows in iOS is in seconds so we convert it to milliseconds to match Android\u2019s format","title":"RAPIDS provider"},{"location":"features/phone-data-yield/","text":"Phone Data Yield \u00b6 This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED RAPIDS provider \u00b6 Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#phone-data-yield","text":"This is a combinatorial sensor which means that we use the data from multiple sensors to extract data yield features. Data yield features can be used to remove rows ( time segments ) that do not contain enough data. You should decide what is your \u201cenough\u201d threshold depending on the type of sensors you collected (frequency vs event based, e.g. acceleroemter vs calls), the length of your study, and the rates of missing data that your analysis could handle. Why is data yield important? Imagine that you want to extract PHONE_CALL features on daily segments ( 00:00 to 23:59 ). Let\u2019s say that on day 1 the phone logged 10 calls and 23 hours of data from other sensors and on day 2 the phone logged 10 calls and only 2 hours of data from other sensors. It\u2019s more likely that other calls were placed on the 22 hours of data that you didn\u2019t log on day 2 than on the 1 hour of data you didn\u2019t log on day 1, and so including day 2 in your analysis could bias your results. Sensor parameters description for [PHONE_DATA_YIELD] : Key Description [SENSORS] One or more phone sensor config keys (e.g. PHONE_MESSAGE ). The more keys you include the more accurately RAPIDS can approximate the time an smartphone was sensing data. The supported phone sensors you can include in this list are outlined below ( do NOT include Fitbit sensors ). Supported phone sensors for [PHONE_DATA_YIELD][SENSORS] PHONE_ACCELEROMETER PHONE_ACTIVITY_RECOGNITION PHONE_APPLICATIONS_FOREGROUND PHONE_BATTERY PHONE_BLUETOOTH PHONE_CALLS PHONE_CONVERSATION PHONE_MESSAGES PHONE_LIGHT PHONE_LOCATIONS PHONE_SCREEN PHONE_WIFI_VISIBLE PHONE_WIFI_CONNECTED","title":"Phone Data Yield"},{"location":"features/phone-data-yield/#rapids-provider","text":"Before explaining the data yield features, let\u2019s define the following relevant concepts: A valid minute is any 60 second window when any phone sensor logged at least 1 row of data A valid hour is any 60 minute window with at least X valid minutes. The X or threshold is given by [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The timestamps of all sensors are concatenated and then grouped per time segment. Minute and hour windows are created from the beginning of each time segment instance and these windows are marked as valid based on the definitions above. The duration of each time segment is taken into account to compute the features described below. Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } / { sensor } _raw.csv # one for every [PHONE_DATA_YIELD][SENSORS] - data/interim/ { pid } /phone_yielded_timestamps.csv - data/interim/ { pid } /phone_yielded_timestamps_with_datetime.csv - data/interim/ { pid } /phone_data_yield_features/phone_data_yield_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_data_yield.csv Parameters description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_DATA_YIELD features from the RAPIDS provider [FEATURES] Features to be computed, see table below [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] The proportion [0.0 ,1.0] of valid minutes in a 60-minute window necessary to flag that window as valid. Features description for [PHONE_DATA_YIELD][PROVIDERS][RAPIDS] : Feature Units Description ratiovalidyieldedminutes rows The ratio between the number of valid minutes and the duration in minutes of a time segment. ratiovalidyieldedhours lux The ratio between the number of valid hours and the duration in hours of a time segment. If the time segment is shorter than 1 hour this feature will always be 1. Assumptions/Observations We recommend using ratiovalidyieldedminutes on time segments that are shorter than two or three hours and ratiovalidyieldedhours for longer segments. This is because relying on yielded minutes only can be misleading when a big chunk of those missing minutes are clustered together. For example, let\u2019s assume we are working with a 24-hour time segment that is missing 12 hours of data. Two extreme cases can occur: the 12 missing hours are from the beginning of the segment or 30 minutes could be missing from every hour (24 * 30 minutes = 12 hours). ratiovalidyieldedminutes would be 0.5 for both a and b (hinting the missing circumstances are similar). However, ratiovalidyieldedhours would be 0.5 for a and 1.0 for b if [MINUTE_RATIO_THRESHOLD_FOR_VALID_YIELDED_HOURS] is between [0.0 and 0.49] (hinting that the missing circumstances might be more favorable for b . In other words, sensed data for b is more evenly spread compared to a .","title":"RAPIDS provider"},{"location":"features/phone-light/","text":"Phone Light \u00b6 Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"Phone Light"},{"location":"features/phone-light/#phone-light","text":"Sensor parameters description for [PHONE_LIGHT] : Key Description [TABLE] Database table where the light data is stored","title":"Phone Light"},{"location":"features/phone-light/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_light_raw.csv - data/raw/ { pid } /phone_light_with_datetime.csv - data/interim/ { pid } /phone_light_features/phone_light_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_light.csv Parameters description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_LIGHT features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_LIGHT][PROVIDERS][RAPIDS] : Feature Units Description count rows Number light sensor rows recorded. maxlux lux The maximum ambient luminance. minlux lux The minimum ambient luminance. avglux lux The average ambient luminance. medianlux lux The median ambient luminance. stdlux lux The standard deviation of ambient luminance. Assumptions/Observations NA","title":"RAPIDS provider"},{"location":"features/phone-locations/","text":"Phone Locations \u00b6 Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know. BARNETT provider \u00b6 These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al . DORYAB provider \u00b6 These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"Phone Locations"},{"location":"features/phone-locations/#phone-locations","text":"Sensor parameters description for [PHONE_LOCATIONS] : Key Description [TABLE] Database table where the location data is stored [LOCATIONS_TO_USE] Type of location data to use, one of ALL , GPS or FUSED_RESAMPLED . This filter is based on the provider column of the AWARE locations table, ALL includes every row, GPS only includes rows where provider is gps, and FUSED_RESAMPLED only includes rows where provider is fused after being resampled. [FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled to the next valid timestamp (see the Assumptions/Observations below) only if the time difference between them is less or equal than this threshold (in minutes). [FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION] if FUSED_RESAMPLED is used, the original fused data has to be resampled, a location row will be resampled at most for this long (in minutes) Assumptions/Observations Types of location data to use AWARE Android and iOS clients can collect location coordinates through the phone's GPS, the network cellular towers around the phone or Google's fused location API. If you want to use only the GPS provider set [LOCATIONS_TO_USE] to GPS , if you want to use all providers (not recommended due to the difference in accuracy) set [LOCATIONS_TO_USE] to ALL , if your AWARE client was configured to use fused location only or want to focus only on this provider, set [LOCATIONS_TO_USE] to RESAMPLE_FUSED . RESAMPLE_FUSED takes the original fused location coordinates and replicates each pair forward in time as long as the phone was sensing data as indicated by the joined timestamps of [PHONE_DATA_YIELD][SENSORS] , this is done because Google's API only logs a new location coordinate pair when it is sufficiently different in time or space from the previous one. There are two parameters associated with resampling fused location. FUSED_RESAMPLED_CONSECUTIVE_THRESHOLD (in minutes, default 30) controls the maximum gap between any two coordinate pairs to replicate the last known pair (for example, participant A's phone did not collect data between 10.30am and 10:50am and between 11:05am and 11:40am, the last known coordinate pair will be replicated during the first period but not the second, in other words, we assume that we cannot longer guarantee the participant stayed at the last known location if the phone did not sense data for more than 30 minutes). FUSED_RESAMPLED_TIME_SINCE_VALID_LOCATION (in minutes, default 720 or 12 hours) stops the last known fused location from being replicated longer that this threshold even if the phone was sensing data continuously (for example, participant A went home at 9pm and their phone was sensing data without gaps until 11am the next morning, the last known location will only be replicated until 9am). If you have suggestions to modify or improve this resampling, let us know.","title":"Phone Locations"},{"location":"features/phone-locations/#barnett-provider","text":"These features are based on the original open-source implementation by Barnett et al and some features created by Canzian et al . Available time segments and platforms Available only for segments that start at 00:00:00 and end at 23:59:59 of the same day (daily segments) Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [ACCURACY_LIMIT] An integer in meters, any location rows with an accuracy higher than this will be dropped. This number means there\u2019s a 68% probability the true location is within this radius [TIMEZONE] Timezone where the location data was collected. By default points to the one defined in the Configuration [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] adapted from Beiwe Summary Statistics : Feature Units Description hometime minutes Time at home. Time spent at home in minutes. Home is the most visited significant location between 8 pm and 8 am including any pauses within a 200-meter radius. disttravelled meters Total distance travelled over a day (flights). rog meters The Radius of Gyration (rog) is a measure in meters of the area covered by a person over a day. A centroid is calculated for all the places (pauses) visited during a day and a weighted distance between all the places and that centroid is computed. The weights are proportional to the time spent in each place. maxdiam meters The maximum diameter is the largest distance between any two pauses. maxhomedist meters The maximum distance from home in meters. siglocsvisited locations The number of significant locations visited during the day. Significant locations are computed using k-means clustering over pauses found in the whole monitoring period. The number of clusters is found iterating k from 1 to 200 stopping until the centroids of two significant locations are within 400 meters of one another. avgflightlen meters Mean length of all flights. stdflightlen meters Standard deviation of the length of all flights. avgflightdur seconds Mean duration of all flights. stdflightdur seconds The standard deviation of the duration of all flights. probpause - The fraction of a day spent in a pause (as opposed to a flight) siglocentropy nats Shannon\u2019s entropy measurement based on the proportion of time spent at each significant location visited during a day. circdnrtn - A continuous metric quantifying a person\u2019s circadian routine that can take any value between 0 and 1, where 0 represents a daily routine completely different from any other sensed days and 1 a routine the same as every other sensed day. wkenddayrtn - Same as circdnrtn but computed separately for weekends and weekdays. Assumptions/Observations Barnett's et al features These features are based on a Pause-Flight model. A pause is defined as a mobiity trace (location pings) within a certain duration and distance (by default 300 seconds and 60 meters). A flight is any mobility trace between two pauses. Data is resampled and imputed before the features are computed. See Barnett et al for more information. In RAPIDS we only expose two parameters for these features (timezone and accuracy limit). You can change other parameters in src/features/phone_locations/barnett/library/MobilityFeatures.R . Significant Locations Significant locations are determined using K-means clustering on pauses longer than 10 minutes. The number of clusters (K) is increased until no two clusters are within 400 meters from each other. After this, pauses within a certain range of a cluster (200 meters by default) will count as a visit to that significant location. This description was adapted from the Supplementary Materials of Barnett et al . The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"BARNETT provider"},{"location":"features/phone-locations/#doryab-provider","text":"These features are based on the original implementation by Doryab et al. . Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_locations_raw.csv - data/interim/ { pid } /phone_locations_processed.csv - data/interim/ { pid } /phone_locations_processed_with_datetime.csv - data/interim/ { pid } /phone_locations_features/phone_locations_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_locations.csv Parameters description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Key Description [COMPUTE] Set to True to extract PHONE_LOCATIONS features from the BARNETT provider [FEATURES] Features to be computed, see table below [DBSCAN_EPS] The maximum distance in meters between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function. [DBSCAN_MINSAMPLES] The number of samples (or total weight) in a neighborhood for a point to be considered as a core point of a cluster. This includes the point itself. [THRESHOLD_STATIC] It is the threshold value in km/hr which labels a row as Static or Moving. [MAXIMUM_GAP_ALLOWED] The maximum gap (in seconds) allowed between any two consecutive rows for them to be considered part of the same displacement. If this threshold is too high, it can throw speed and distance calculations off for periods when the the phone was not sensing. [MINUTES_DATA_USED] Set to True to include an extra column in the final location feature file containing the number of minutes used to compute the features on each time segment. Use this for quality control purposes, the more data minutes exist for a period, the more reliable its features should be. For fused location, a single minute can contain more than one coordinate pair if the participant is moving fast enough. [SAMPLING_FREQUENCY] Expected time difference between any two location rows in minutes. If set to 0 , the sampling frequency will be inferred automatically as the median of all the differences between any two consecutive row timestamps (recommended if you are using FUSED_RESAMPLED data). This parameter impacts all the time calculations. Features description for [PHONE_LOCATIONS][PROVIDERS][BARNETT] : Feature Units Description locationvariance \\(meters^2\\) The sum of the variances of the latitude and longitude columns. loglocationvariance - Log of the sum of the variances of the latitude and longitude columns. totaldistance meters Total distance travelled in a time segment using the haversine formula. averagespeed km/hr Average speed in a time segment considering only the instances labeled as Moving. varspeed km/hr Speed variance in a time segment considering only the instances labeled as Moving. circadianmovement - \"It encodes the extent to which a person\u2019s location patterns follow a 24-hour circadian cycle.\" Doryab et al. . numberofsignificantplaces places Number of significant locations visited. It is calculated using the DBSCAN clustering algorithm which takes in EPS and MIN_SAMPLES as parameters to identify clusters. Each cluster is a significant place. numberlocationtransitions transitions Number of movements between any two clusters in a time segment. radiusgyration meters Quantifies the area covered by a participant timeattop1location minutes Time spent at the most significant location. timeattop2location minutes Time spent at the 2 nd most significant location. timeattop3location minutes Time spent at the 3 rd most significant location. movingtostaticratio - Ratio between the number of rows labeled Moving versus Static outlierstimepercent - Ratio between the number of rows that belong to non-significant clusters divided by the total number of rows in a time segment. maxlengthstayatclusters minutes Maximum time spent in a cluster (significant location). minlengthstayatclusters minutes Minimum time spent in a cluster (significant location). meanlengthstayatclusters minutes Average time spent in a cluster (significant location). stdlengthstayatclusters minutes Standard deviation of time spent in a cluster (significant location). locationentropy nats Shannon Entropy computed over the row count of each cluster (significant location), it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). normalizedlocationentropy nats Shannon Entropy computed over the row count of each cluster (significant location) divided by the number of clusters, it will be higher the more rows belong to a cluster (i.e. the more time a participant spent at a significant location). Assumptions/Observations Significant Locations Identified Significant locations are determined using DBSCAN clustering on locations that a patient visit over the course of the period of data collection. The Circadian Calculation For a detailed description of how this is calculated, see Canzian et al .","title":"DORYAB provider"},{"location":"features/phone-messages/","text":"Phone Messages \u00b6 Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"Phone Messages"},{"location":"features/phone-messages/#phone-messages","text":"Sensor parameters description for [PHONE_MESSAGES] : Key Description [TABLE] Database table where the messages data is stored","title":"Phone Messages"},{"location":"features/phone-messages/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_messages_raw.csv - data/raw/ { pid } /phone_messages_with_datetime.csv - data/interim/ { pid } /phone_messages_features/phone_messages_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_messages.csv Parameters description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_MESSAGES features from the RAPIDS provider [MESSAGES_TYPES] The messages_type that will be analyzed. The options for this parameter are received or sent . [FEATURES] Features to be computed, see table below for [MESSAGES_TYPES] received and sent Features description for [PHONE_MESSAGES][PROVIDERS][RAPIDS] : Feature Units Description count messages Number of messages of type messages_type that occurred during a particular time_segment . distinctcontacts contacts Number of distinct contacts that are associated with a particular messages_type during a particular time_segment . timefirstmessages minutes Number of minutes between 12:00am (midnight) and the first message of a particular messages_type during a particular time_segment . timelastmessages minutes Number of minutes between 12:00am (midnight) and the last message of a particular messages_type during a particular time_segment . countmostfrequentcontact messages Number of messages from the contact with the most messages of messages_type during a time_segment throughout the whole dataset of each participant. Assumptions/Observations [MESSAGES_TYPES] and [FEATURES] keys in config.yaml need to match. For example, [MESSAGES_TYPES] sent matches the [FEATURES] key sent","title":"RAPIDS provider"},{"location":"features/phone-screen/","text":"Phone Screen \u00b6 Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"Phone Screen"},{"location":"features/phone-screen/#phone-screen","text":"Sensor parameters description for [PHONE_SCREEN] : Key Description [TABLE] Database table where the screen data is stored","title":"Phone Screen"},{"location":"features/phone-screen/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_screen_raw.csv - data/raw/ { pid } /phone_screen_with_datetime.csv - data/raw/ { pid } /phone_screen_with_datetime_unified.csv - data/interim/ { pid } /phone_screen_episodes.csv - data/interim/ { pid } /phone_screen_episodes_resampled.csv - data/interim/ { pid } /phone_screen_episodes_resampled_with_datetime.csv - data/interim/ { pid } /phone_screen_features/phone_screen_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_screen.csv Parameters description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_SCREEN features from the RAPIDS provider [FEATURES] Features to be computed, see table below [REFERENCE_HOUR_FIRST_USE] The reference point from which firstuseafter is to be computed, default is midnight [IGNORE_EPISODES_SHORTER_THAN] Ignore episodes that are shorter than this threshold (minutes). Set to 0 to disable this filter. [IGNORE_EPISODES_LONGER_THAN] Ignore episodes that are longer than this threshold (minutes). Set to 0 to disable this filter. [EPISODE_TYPES] Currently we only support unlock episodes (from when the phone is unlocked until the screen is off) Features description for [PHONE_SCREEN][PROVIDERS][RAPIDS] : Feature Units Description sumduration minutes Total duration of all unlock episodes. maxduration minutes Longest duration of any unlock episode. minduration minutes Shortest duration of any unlock episode. avgduration minutes Average duration of all unlock episodes. stdduration minutes Standard deviation duration of all unlock episodes. countepisode episodes Number of all unlock episodes |firstuseafter |minutes |Minutes until the first unlock episode. Assumptions/Observations In Android, lock events can happen right after an off event, after a few seconds of an off event, or never happen depending on the phone's settings, therefore, an unlock episode is defined as the time between an unlock and a off event. In iOS, on and off events do not exist, so an unlock episode is defined as the time between an unlock and a lock event. Events in iOS are recorded reliably albeit some duplicated lock events within milliseconds from each other, so we only keep consecutive unlock/lock pairs. In Android you cand find multiple consecutive unlock or lock events, so we only keep consecutive unlock/off pairs. In our experiments these cases are less than 10% of the screen events collected and this happens because ACTION_SCREEN_OFF and ACTION_SCREEN_ON are sent when the device becomes non-interactive which may have nothing to do with the screen turning off . In addition to unlock/off episodes, in Android it is possible to measure the time spent on the lock screen before an unlock event as well as the total screen time (i.e. ON to OFF ) but these are not implemented at the moment. We transform iOS screen events to match Android\u2019s format, we replace lock episodes with off episodes (2 with 0) in iOS. However, as mentioned above this is still computing unlock to lock episodes.","title":"RAPIDS provider"},{"location":"features/phone-wifi-connected/","text":"Phone WiFi Connected \u00b6 Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"Phone WiFI Connected"},{"location":"features/phone-wifi-connected/#phone-wifi-connected","text":"Sensor parameters description for [PHONE_WIFI_CONNECTED] : Key Description [TABLE] Database table where the wifi (connected) data is stored","title":"Phone WiFi Connected"},{"location":"features/phone-wifi-connected/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android and iOS File Sequence - data/raw/ { pid } /phone_wifi_connected_raw.csv - data/raw/ { pid } /phone_wifi_connected_with_datetime.csv - data/interim/ { pid } /phone_wifi_connected_features/phone_wifi_connected_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_connected.csv Parameters description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_CONNECTED features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_CONNECTED][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points connected during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A connected WiFI access point is one that a phone was connected to. By default AWARE stores this data in the sensor_wifi table.","title":"RAPIDS provider"},{"location":"features/phone-wifi-visible/","text":"Phone WiFi Visible \u00b6 Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored RAPIDS provider \u00b6 Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"Phone WiFI Visible"},{"location":"features/phone-wifi-visible/#phone-wifi-visible","text":"Sensor parameters description for [PHONE_WIFI_VISIBLE] : Key Description [TABLE] Database table where the wifi (visible) data is stored","title":"Phone WiFi Visible"},{"location":"features/phone-wifi-visible/#rapids-provider","text":"Available time segments and platforms Available for all time segments Available for Android only File Sequence - data/raw/ { pid } /phone_wifi_visible_raw.csv - data/raw/ { pid } /phone_wifi_visible_with_datetime.csv - data/interim/ { pid } /phone_wifi_visible_features/phone_wifi_visible_ { language } _ { provider_key } .csv - data/processed/features/ { pid } /phone_wifi_visible.csv Parameters description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Key Description [COMPUTE] Set to True to extract PHONE_WIFI_VISIBLE features from the RAPIDS provider [FEATURES] Features to be computed, see table below Features description for [PHONE_WIFI_VISIBLE][PROVIDERS][RAPIDS] : Feature Units Description countscans devices Number of scanned WiFi access points visible during a time_segment, an access point can be detected multiple times over time and these appearances are counted separately uniquedevices devices Number of unique access point during a time_segment as identified by their hardware address countscansmostuniquedevice scans Number of scans of the most scanned access point during a time_segment across the whole monitoring period Assumptions/Observations A visible WiFI access point is one that a phone sensed around itself but that it was not connected to. Due to API restrictions, this sensor is not available on iOS. By default AWARE stores this data in the wifi table.","title":"RAPIDS provider"},{"location":"setup/configuration/","text":"Configuration \u00b6 You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file. Database credentials \u00b6 Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files. Timezone of your study \u00b6 Single timezone \u00b6 If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York Multiple timezones \u00b6 Support coming soon. Participant files \u00b6 Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py Structure of participants files \u00b6 Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis Automatic creation of participant files \u00b6 You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files Time Segments \u00b6 Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant. Segment Examples \u00b6 5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 Device Data Source Configuration \u00b6 You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Sensor and Features to Process \u00b6 Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Configuration"},{"location":"setup/configuration/#configuration","text":"You need to follow these steps to configure your RAPIDS deployment before you can extract behavioral features Add your database credentials Choose the timezone of your study Create your participants files Select what time segments you want to extract features on Modify your device data source configuration Select what sensors and features you want to process When you are done with this configuration, go to executing RAPIDS . Hint Every time you see config[\"KEY\"] or [KEY] in these docs we are referring to the corresponding key in the config.yaml file.","title":"Configuration"},{"location":"setup/configuration/#database-credentials","text":"Create an empty file called .env in your RAPIDS root directory Add the following lines and replace your database-specific credentials (user, password, host, and database): [ MY_GROUP ] user=MY_USER password=MY_PASSWORD host=MY_HOST port=3306 database=MY_DATABASE Warning The label MY_GROUP is arbitrary but it has to match the following config.yaml key: DATABASE_GROUP : &database_group MY_GROUP Note You can ignore this step if you are only processing Fitbit data in CSV files.","title":"Database credentials"},{"location":"setup/configuration/#timezone-of-your-study","text":"","title":"Timezone of your study"},{"location":"setup/configuration/#single-timezone","text":"If your study only happened in a single time zone, select the appropriate code form this list and change the following config key. Double check your timezone code pick, for example US Eastern Time is America/New_York not EST TIMEZONE : &timezone America/New_York","title":"Single timezone"},{"location":"setup/configuration/#multiple-timezones","text":"Support coming soon.","title":"Multiple timezones"},{"location":"setup/configuration/#participant-files","text":"Participant files link together multiple devices (smartphones and wearables) to specific participants and identify them throughout RAPIDS. You can create these files manually or automatically . Participant files are stored in data/external/participant_files/pxx.yaml and follow a unified structure . Note The list PIDS in config.yaml needs to have the participant file names of the people you want to process. For example, if you created p01.yaml , p02.yaml and p03.yaml files in /data/external/participant_files/ , then PIDS should be: PIDS : [ p01 , p02 , p03 ] Tip Attribute values of the [PHONE] and [FITBIT] sections in every participant file are optional which allows you to analyze data from participants that only carried smartphones, only Fitbit devices, or both. Optional: Migrating participants files with the old format If you were using the pre-release version of RAPIDS with participant files in plain text (as opposed to yaml), you can run the following command and your old files will be converted into yaml files stored in data/external/participant_files/ python tools/update_format_participant_files.py","title":"Participant files"},{"location":"setup/configuration/#structure-of-participants-files","text":"Example of the structure of a participant file In this example, the participant used an android phone, an ios phone, and a fitbit device throughout the study between Apr 23 rd 2020 and Oct 28 th 2020 PHONE : DEVICE_IDS : [ a748ee1a-1d0b-4ae9-9074-279a2b6ba524 , dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43 ] PLATFORMS : [ android , ios ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 FITBIT : DEVICE_IDS : [ fitbit1 ] LABEL : test01 START_DATE : 2020-04-23 END_DATE : 2020-10-28 For [PHONE] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each smartphone, you can have more than one for when participants changed phones in the middle of the study, in this case, data from all their devices will be joined and relabeled with the last 1 on this list. [PLATFORMS] An array that specifies the OS of each smartphone in [DEVICE_IDS] , use a combination of android or ios (we support participants that changed platforms in the middle of your study!). If you have an aware_device table in your database you can set [PLATFORMS]: [multiple] and RAPIDS will infer them automatically. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis For [FITBIT] Key Description [DEVICE_IDS] An array of the strings that uniquely identify each Fitbit, you can have more than one in case the participant changed devices in the middle of the study, in this case, data from all devices will be joined and relabeled with the last device_id on this list. [LABEL] A string that is used in reports and visualizations. [START_DATE] A string with format YYY-MM-DD . Only data collected after this date will be included in the analysis [END_DATE] A string with format YYY-MM-DD . Only data collected before this date will be included in the analysis","title":"Structure of participants files"},{"location":"setup/configuration/#automatic-creation-of-participant-files","text":"You have two options a) use the aware_device table in your database or b) use a CSV file. In either case, in your config.yaml , set [PHONE_SECTION][ADD] or [FITBIT_SECTION][ADD] to TRUE depending on what devices you used in your study. Set [DEVICE_ID_COLUMN] to the name of the column that uniquely identifies each device and include any device ids you want to ignore in [IGNORED_DEVICE_IDS] . aware_device table Set the following keys in your config.yaml CREATE_PARTICIPANT_FILES : SOURCE : TYPE : AWARE_DEVICE_TABLE DATABASE_GROUP : *database_group CSV_FILE_PATH : \"\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Then run snakemake -j1 create_participants_files CSV file Set the following keys in your config.yaml . CREATE_PARTICIPANT_FILES : SOURCE : TYPE : CSV_FILE DATABASE_GROUP : \"\" CSV_FILE_PATH : \"your_path/to_your.csv\" TIMEZONE : *timezone PHONE_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : device_id # column name IGNORED_DEVICE_IDS : [] FITBIT_SECTION : ADD : TRUE # or FALSE DEVICE_ID_COLUMN : fitbit_id # column name IGNORED_DEVICE_IDS : [] Your CSV file ( [SOURCE][CSV_FILE_PATH] ) should have the following columns but you can omit any values you don\u2019t have on each column: Column Description phone device id The name of this column has to match [PHONE_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; fitbit device id The name of this column has to match [FITBIT_SECTION][DEVICE_ID_COLUMN] . Separate multiple ids with ; pid Unique identifiers with the format pXXX (your participant files will be named with this string platform Use android , ios or multiple as explained above, separate values with ; label A human readable string that is used in reports and visualizations. start_date A string with format YYY-MM-DD . end_date A string with format YYY-MM-DD . Example device_id,pid,label,platform,start_date,end_date,fitbit_id a748ee1a-1d0b-4ae9-9074-279a2b6ba524;dsadas-2324-fgsf-sdwr-gdfgs4rfsdf43,p01,julio,android;ios,2020-01-01,2021-01-01,fitbit1 4c4cf7a1-0340-44bc-be0f-d5053bf7390c,p02,meng,ios,2021-01-01,2022-01-01,fitbit2 Then run snakemake -j1 create_participants_files","title":"Automatic creation of participant files"},{"location":"setup/configuration/#time-segments","text":"Time segments (or epochs) are the time windows on which you want to extract behavioral features. For example, you might want to process data on every day, every morning, or only during weekends. RAPIDS offers three categories of time segments that are flexible enough to cover most use cases: frequency (short time windows every day), periodic (arbitrary time windows on any day), and event (arbitrary time windows around events of interest). See also our examples . Frequency Segments These segments are computed on every day and all have the same duration (for example 30 minutes). Set the following keys in your config.yaml TIME_SEGMENTS : &time_segments TYPE : FREQUENCY FILE : \"data/external/your_frequency_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can only have 1 row. Column Description label A string that is used as a prefix in the name of your time segments length An integer representing the duration of your time segments in minutes Example label,length thirtyminutes,30 This configuration will compute 48 time segments for every day when any data from any participant was sensed. For example: start_time,length,label 00:00,30,thirtyminutes0000 00:30,30,thirtyminutes0001 01:00,30,thirtyminutes0002 01:30,30,thirtyminutes0003 ... Periodic Segments These segments can be computed every day, or on specific days of the week, month, quarter, and year. Their minimum duration is 1 minute but they can be as long as you want. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : PERIODIC FILE : \"data/external/your_periodic_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE If [INCLUDE_PAST_PERIODIC_SEGMENTS] is set to TRUE , RAPIDS will consider instances of your segments back enough in the past as to include the first row of data of each participant. For example, if the first row of data from a participant happened on Saturday March 7 th 2020 and the requested segment duration is 7 days starting on every Sunday, the first segment to be considered would start on Sunday March 1 st if [INCLUDE_PAST_PERIODIC_SEGMENTS] is TRUE or on Sunday March 8 th if FALSE . The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. It has to be unique between rows start_time A string with format HH:MM:SS representing the starting time of this segment on any day length A string representing the length of this segment.It can have one or more of the following strings XXD XXH XXM XXS to represent days, hours, minutes and seconds. For example 7D 23H 59M 59S repeats_on One of the follow options every_day , wday , qday , mday , and yday . The last four represent a week, quarter, month and year day repeats_value An integer complementing repeats_on . If you set repeats_on to every_day set this to 0 , otherwise 1-7 represent a wday starting from Mondays, 1-31 represent a mday , 1-91 represent a qday , and 1-366 represent a yday Example label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 morning,06:00:00,5H 59M 59S,every_day,0 afternoon,12:00:00,5H 59M 59S,every_day,0 evening,18:00:00,5H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 This configuration will create five segments instances ( daily , morning , afternoon , evening , night ) on any given day ( every_day set to 0). The daily segment will start at midnight and will last 23:59:59 , the other four segments will start at 6am, 12pm, 6pm, and 12am respectively and last for 05:59:59 . Event segments These segments can be computed before or after an event of interest (defined as any UNIX timestamp). Their minimum duration is 1 minute but they can be as long as you want. The start of each segment can be shifted backwards or forwards from the specified timestamp. Set the following keys in your config.yaml . TIME_SEGMENTS : &time_segments TYPE : EVENT FILE : \"data/external/your_event_segments.csv\" INCLUDE_PAST_PERIODIC_SEGMENTS : FALSE # or TRUE The file pointed by [TIME_SEGMENTS][FILE] should have the following format and can have multiple rows. Column Description label A string that is used as a prefix in the name of your time segments. If labels are unique, every segment is independent; if two or more segments have the same label, their data will be grouped when computing auxiliary data for features like the most frequent contact for calls (the most frequent contact will be computed across all these segments). There cannot be two overlaping event segments with the same label (RAPIDS will throw an error) event_timestamp A UNIX timestamp that represents the moment an event of interest happened (clinical relapse, survey, readmission, etc.). The corresponding time segment will be computed around this moment using length , shift , and shift_direction length A string representing the length of this segment. It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes, and seconds. For example 7D 23H 59M 59S shift A string representing the time shift from event_timestamp . It can have one or more of the following keys XXD XXH XXM XXS to represent a number of days, hours, minutes and seconds. For example 7D 23H 59M 59S . Use this value to change the start of a segment with respect to its event_timestamp . For example, set this variable to 1H to create a segment that starts 1 hour from an event of interest ( shift_direction determines if it\u2019s before or after). shift_direction An integer representing whether the shift is before ( -1 ) or after ( 1 ) an event_timestamp device_id The device id (smartphone or fitbit) to whom this segment belongs to. You have to create a line in this event segment file for each event of a participant that you want to analyse. If you have participants with multiple device ids you can choose any of them Example label,event_timestamp,length,shift,shift_direction,device_id stress1,1587661220000,1H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress2,1587747620000,4H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress3,1587906020000,3H,5M,1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress4,1584291600000,7H,4H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 stress5,1588172420000,9H,5M,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587661220000,1H,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587747620000,1D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 mood,1587906020000,7D,0,0,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 This example will create eight segments for a single participant ( a748ee1a... ), five independent stressX segments with various lengths (1,4,3,7, and 9 hours). Segments stress1 , stress3 , and stress5 are shifted forwards by 5 minutes and stress2 and stress4 are shifted backwards by 4 hours (that is, if the stress4 event happened on March 15 th at 1pm EST ( 1584291600000 ), the time segment will start on that day at 9am and end at 4pm). The three mood segments are 1 hour, 1 day and 7 days long and have no shift. In addition, these mood segments are grouped together, meaning that although RAPIDS will compute features on each one of them, some necessary information to compute a few of such features will be extracted from all three segments, for example the phone contact that called a participant the most or the location clusters visited by a participant.","title":"Time Segments"},{"location":"setup/configuration/#segment-examples","text":"5-minutes Use the following Frequency segment file to create 288 (12 * 60 * 24) 5-minute segments starting from midnight of every day in your study label,length fiveminutes,5 Daily Use the following Periodic segment file to create daily segments starting from midnight of every day in your study label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 Morning Use the following Periodic segment file to create morning segments starting at 06:00:00 and ending at 11:59:59 of every day in your study label,start_time,length,repeats_on,repeats_value morning,06:00:00,5H 59M 59S,every_day,0 Overnight Use the following Periodic segment file to create overnight segments starting at 20:00:00 and ending at 07:59:59 (next day) of every day in your study label,start_time,length,repeats_on,repeats_value morning,20:00:00,11H 59M 59S,every_day,0 Weekly Use the following Periodic segment file to create non-overlapping weekly segments starting at midnight of every Monday in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,wday,1 Use the following Periodic segment file to create overlapping weekly segments starting at midnight of every day in your study label,start_time,length,repeats_on,repeats_value weekly,00:00:00,6D 23H 59M 59S,every_day,0 Week-ends Use the following Periodic segment file to create week-end segments starting at midnight of every Saturday in your study label,start_time,length,repeats_on,repeats_value weekend,00:00:00,1D 23H 59M 59S,wday,6 Around surveys Use the following Event segment file to create two 2-hour segments that start 1 hour before surveys answered by 3 participants label,event_timestamp,length,shift,shift_direction,device_id survey1,1587661220000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey2,1587747620000,2H,1H,-1,a748ee1a-1d0b-4ae9-9074-279a2b6ba524 survey1,1587906020000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey2,1584291600000,2H,1H,-1,rqtertsd-43ff-34fr-3eeg-efe4fergregr survey1,1588172420000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3 survey2,1584291600000,2H,1H,-1,klj34oi2-8frk-2343-21kk-324ljklewlr3","title":"Segment Examples"},{"location":"setup/configuration/#device-data-source-configuration","text":"You might need to modify the following config keys in your config.yaml depending on what devices your participants used and where you are storing your data. You can ignore [PHONE_DATA_CONFIGURATION] or [FITBIT_DATA_CONFIGURATION] if you are not working with either devices. Phone The relevant config.yaml section looks like this by default: PHONE_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # SINGLE (MULTIPLE support coming soon) VALUE : *timezone Parameters for [PHONE_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] Only DATABASE is supported (phone data will be pulled from a database) [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify smartphones. For data collected with AWARE this is usually device_id [TIMEZONE] [TYPE] Only SINGLE is supported for now [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study Fitbit The relevant config.yaml section looks like this by default: FITBIT_DATA_CONFIGURATION : SOURCE : TYPE : DATABASE # DATABASE or FILES (set each [FITBIT_SENSOR][TABLE] attribute with a table name or a file path accordingly) COLUMN_FORMAT : JSON # JSON or PLAIN_TEXT DATABASE_GROUP : *database_group DEVICE_ID_COLUMN : device_id # column name TIMEZONE : TYPE : SINGLE # Fitbit devices don't support time zones so we read this data in the timezone indicated by VALUE VALUE : *timezone Parameters for For [FITBIT_DATA_CONFIGURATION] Key Description [SOURCE] [TYPE] DATABASE or FILES (set each [FITBIT_SENSOR] [TABLE] attribute accordingly with a table name or a file path) [SOURCE] [COLUMN_FORMAT] JSON or PLAIN_TEXT . Column format of the source data. If you pulled your data directly from the Fitbit API the column containing the sensor data will be in JSON format [SOURCE] [DATABASE_GROUP] *database_group points to the value defined before in Database credentials . Only used if [TYPE] is DATABASE . [SOURCE] [DEVICE_ID_COLUMN] A column that contains strings that uniquely identify Fitbit devices. [TIMEZONE] [TYPE] Only SINGLE is supported (Fitbit devices always store data in local time). [TIMEZONE] [VALUE] *timezone points to the value defined before in Timezone of your study","title":"Device Data Source Configuration"},{"location":"setup/configuration/#sensor-and-features-to-process","text":"Finally, you need to modify the config.yaml section of the sensors you want to extract behavioral features from. All sensors follow the same naming nomenclature ( DEVICE_SENSOR ) and parameter structure which we explain in the Behavioral Features Introduction . Done Head over to Execution to learn how to execute RAPIDS.","title":"Sensor and Features to Process"},{"location":"setup/execution/","text":"Execution \u00b6 After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/execution/#execution","text":"After you have installed and configured RAPIDS, use the following command to execute it. ./rapids -j1 Ready to extract behavioral features If you are ready to extract features head over to the Behavioral Features Introduction Info The script ./rapids is a wrapper around Snakemake so you can pass any parameters that Snakemake accepts (e.g. -j1 ). Updating RAPIDS output after modifying config.yaml Any changes to the config.yaml file will be applied automatically and only the relevant files will be updated. This means that after modifying the features list for PHONE_MESSAGE for example, RAPIDS will update the output file with the correct features. Multi-core You can run RAPIDS over multiple cores by modifying the -j argument (e.g. use -j8 to use 8 cores). However , take into account that this means multiple sensor datasets for different participants will be load in memory at the same time. If RAPIDS crashes because it ran out of memory reduce the number of cores and try again. As reference, we have run RAPIDS over 12 cores and 32 Gb of RAM without problems for a study with 200 participants with 14 days of low-frequency smartphone data (no accelerometer, gyroscope, or magnetometer). Forcing a complete rerun If you want to update your data from your database or rerun the whole pipeline from scratch run one or both of the following commands depending on the devices you are using: ./rapids -j1 -R download_phone_data ./rapids -j1 -R download_fitbit_data Deleting RAPIDS output If you want to delete all the output files RAPIDS produces you can execute the following command: ./rapids -j1 --delete-all-output","title":"Execution"},{"location":"setup/installation/","text":"Installation \u00b6 You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"setup/installation/#installation","text":"You can install RAPIDS using Docker (the fastest), or native instructions for MacOS and Ubuntu Docker Install Docker Pull our RAPIDS container docker pull agamk/rapids:latest ` Run RAPIDS' container (after this step is done you should see a prompt in the main RAPIDS folder with its python environment active) docker run -it agamk/rapids:latest Pull the latest version of RAPIDS git pull Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Optional . You can edit RAPIDS files with vim but we recommend using Visual Studio Code and its Remote Containers extension How to configure Remote Containers extension Make sure RAPIDS container is running Install the Remote - Containers extension Go to the Remote Explorer panel on the left hand sidebar On the top right dropdown menu choose Containers Double click on the agamk/rapids container in the CONTAINERS tree A new VS Code session should open on RAPIDS main folder insidethe container. MacOS We tested these instructions in Catalina Install brew Install MySQL brew install mysql brew services start mysql Install R 4.0, pandoc and rmarkdown. If you have other instances of R, we recommend uninstalling them brew install r brew install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install miniconda (restart your terminal afterwards) brew cask install miniconda conda init zsh # (or conda init bash) Clone our repo git clone https://github.com/carissalow/rapids Create a python virtual environment cd rapids conda env create -f environment.yml -n rapids conda activate rapids Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1 Ubuntu We tested on Ubuntu 18.04 & 20.04 Install dependencies sudo apt install libcurl4-openssl-dev sudo apt install libssl-dev sudo apt install libxml2-dev Install MySQL sudo apt install libmysqlclient-dev sudo apt install mysql-server Add key for R\u2019s repository. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 Add R\u2019s repository For 18.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' For 20.04 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' Install R 4.0. If you have other instances of R, we recommend uninstalling them sudo apt update sudo apt install r-base Install Pandoc and rmarkdown sudo apt install pandoc Rscript --vanilla -e 'install.packages(\"rmarkdown\", repos=\"http://cran.us.r-project.org\")' Install git sudo apt install git Install miniconda Restart your current shell Clone our repo: git clone https://github.com/carissalow/rapids Create a python virtual environment: cd rapids conda env create -f environment.yml -n MY_ENV_NAME conda activate MY_ENV_NAME Install R packages and virtual environment: snakemake -j1 renv_install snakemake -j1 renv_restore Note This step could take several minutes to complete, especially if you have less than 3Gb of RAM or packages need to be compiled from source. Please be patient and let it run until completion. Make RAPIDS script executable chmod +x rapids Check that RAPIDS is working ./rapids -j1","title":"Installation"},{"location":"visualizations/data-quality-visualizations/","text":"Data Quality Visualizations \u00b6 We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.) 1. Histograms of phone data yield \u00b6 RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night) 2. Heatmaps of overall data yield \u00b6 These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants 3. Heatmap of recorded phone sensors \u00b6 In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 8 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant 4. Heatmap of sensor row count \u00b6 These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 16 phone sensors (including data yield) of t01\u2019s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"Data Quality"},{"location":"visualizations/data-quality-visualizations/#data-quality-visualizations","text":"We showcase these visualizations with a test study that collected 14 days of smartphone and Fitbit data from two participants (t01 and t02) and extracted behavioral features within five time segments (daily, morning, afternoon, evening, and night). Note Time segments (e.g. daily , morning , etc.) can have multiple instances (day 1, day 2, or morning 1, morning 2, etc.)","title":"Data Quality Visualizations"},{"location":"visualizations/data-quality-visualizations/#1-histograms-of-phone-data-yield","text":"RAPIDS provides two histograms that show the number of time segment instances that had a certain ratio of valid yielded minutes and hours , respectively. A valid yielded minute has at least 1 row of data from any smartphone sensor and a valid yielded hour contains at least M valid minutes. These plots can be used as a rough indication of the smartphone monitoring coverage during a study aggregated across all participants. For example, the figure below shows a valid yielded minutes histogram for daily segments and we can infer that the monitoring coverage was very good since almost all segments contain at least 90 to 100% of the expected sensed minutes. Example Click here to see an example of these interactive visualizations in HTML format Histogram of the data yielded minute ratio for a single participant during five time segments (daily, afternoon, evening, and night)","title":"1. Histograms of phone data yield"},{"location":"visualizations/data-quality-visualizations/#2-heatmaps-of-overall-data-yield","text":"These heatmaps are a break down per time segment and per participant of Visualization 1 . Heatmap\u2019s rows represent participants, columns represent time segment instances and the cells\u2019 color represent the valid yielded minute or hour ratio for a participant during a time segment instance. As different participants might join a study on different dates and time segments can be of any length and start on any day, the x-axis is labelled with the time delta between the start of each time segment instance minus the start of the first instance. These plots provide a quick study overview of the monitoring coverage per person and per time segment. The figure below shows the heatmap of the valid yielded minute ratio for participants t01 and t02 on daily segments and, as we inferred from the previous histogram, the lighter (yellow) color on most time segment instances (cells) indicate both phones sensed data without interruptions for most days (except for the first and last ones). Example Click here to see an example of these interactive visualizations in HTML format Overall compliance heatmap for all participants","title":"2. Heatmaps of overall data yield"},{"location":"visualizations/data-quality-visualizations/#3-heatmap-of-recorded-phone-sensors","text":"In these heatmaps rows represent time segment instances, columns represent minutes since the start of a time segment instance, and cells\u2019 color shows the number of phone sensors that logged at least one row of data during those 1-minute windows. RAPIDS creates a plot per participant and per time segment and can be used as a rough indication of whether time-based sensors were following their sensing schedule (e.g. if location was being sensed every 2 minutes). The figure below shows this heatmap for phone sensors collected by participant t01 in daily time segments from Apr 23 rd 2020 to May 4 th 2020. We can infer that for most of the monitoring time, the participant\u2019s phone logged data from at least 8 sensors each minute. Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the recorded phone sensors per minute and per time segment of a single participant","title":"3. Heatmap of recorded phone sensors"},{"location":"visualizations/data-quality-visualizations/#4-heatmap-of-sensor-row-count","text":"These heatmaps are a per-sensor breakdown of Visualization 1 and Visualization 2 . Note that the second row (ratio of valid yielded minutes) of this heatmap matches the respective participant (bottom) row the screenshot in Visualization 2. In these heatmaps rows represent phone or Fitbit sensors, columns represent time segment instances and cell\u2019s color shows the normalized (0 to 1) row count of each sensor within a time segment instance. RAPIDS creates one heatmap per participant and they can be used to judge missing data on a per participant and per sensor basis. The figure below shows data for 16 phone sensors (including data yield) of t01\u2019s daily segments (only half of the sensor names and dates are visible in the screenshot but all can be accessed in the interactive plot). From the top two rows, we can see that the phone was sensing data for most of the monitoring period (as suggested by Figure 3 and Figure 4). We can also infer how phone usage influenced the different sensor streams; there are peaks of screen events during the first day (Apr 23 rd ), peaks of location coordinates on Apr 26 th and Apr 30 th , and no sent or received SMS except for Apr 23 rd , Apr 29 th and Apr 30 th (unlabeled row between screen and locations). Example Click here to see an example of these interactive visualizations in HTML format Heatmap of the sensor row count per time segment of a single participant","title":"4. Heatmap of sensor row count"},{"location":"visualizations/feature-visualizations/","text":"Feature Visualizations \u00b6 1. Heatmap Correlation Matrix \u00b6 Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"Features"},{"location":"visualizations/feature-visualizations/#feature-visualizations","text":"","title":"Feature Visualizations"},{"location":"visualizations/feature-visualizations/#1-heatmap-correlation-matrix","text":"Columns and rows are the behavioral features computed in RAPIDS, cells\u2019 color represents the correlation coefficient between all days of data for every pair of features of all participants. The user can specify a minimum number of observations ( time segment instances) required to compute the correlation between two features using the MIN_ROWS_RATIO parameter (0.5 by default) and the correlation method (Pearson, Spearman or Kendall) with the CORR_METHOD parameter. In addition, this plot can be configured to only display correlation coefficients above a threshold using the CORR_THRESHOLD parameter (0.1 by default). Example Click here to see an example of these interactive visualizations in HTML format Correlation matrix heatmap for all the features of all participants","title":"1. Heatmap Correlation Matrix"},{"location":"workflow-examples/analysis/","text":"Analysis Workflow Example \u00b6 TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers Why should I integrate my analysis in RAPIDS? \u00b6 Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS. Analysis workflow structure \u00b6 To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules . Description of the study modeled in our analysis workflow example \u00b6 Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation Configure and run the analysis workflow example \u00b6 Install RAPIDS Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The config file where you need to modify the DATABASE_GROUP is at example_profile/example_config.yaml . Unzip the test database to data/external/rapids_example.sql and run: ./rapids -j1 restore_sql_file --profile example_profile Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile Modules of our analysis workflow example \u00b6 1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Analysis"},{"location":"workflow-examples/analysis/#analysis-workflow-example","text":"TL;DR In addition to using RAPIDS to extract behavioral features and create plots, you can structure your data analysis within RAPIDS (i.e. cleaning your features and creating ML/statistical models) We include an analysis example in RAPIDS that covers raw data processing, cleaning, feature extraction, machine learning modeling, and evaluation Use this example as a guide to structure your own analysis within RAPIDS RAPIDS analysis workflows are compatible with your favorite data science tools and libraries RAPIDS analysis workflows are reproducible and we encourage you to publish them along with your research papers","title":"Analysis Workflow Example"},{"location":"workflow-examples/analysis/#why-should-i-integrate-my-analysis-in-rapids","text":"Even though the bulk of RAPIDS current functionality is related to the computation of behavioral features, we recommend RAPIDS as a complementary tool to create a mobile data analysis workflow. This is because the cookiecutter data science file organization guidelines, the use of Snakemake, the provided behavioral features, and the reproducible R and Python development environments allow researchers to divide an analysis workflow into small parts that can be audited, shared in an online repository, reproduced in other computers, and understood by other people as they follow a familiar and consistent structure. We believe these advantages outweigh the time needed to learn how to create these workflows in RAPIDS. We clarify that to create analysis workflows in RAPIDS, researchers can still use any data manipulation tools, editors, libraries or languages they are already familiar with. RAPIDS is meant to be the final destination of analysis code that was developed in interactive notebooks or stand-alone scripts. For example, a user can compute call and location features using RAPIDS, then, they can use Jupyter notebooks to explore feature cleaning approaches and once the cleaning code is final, it can be moved to RAPIDS as a new step in the pipeline. In turn, the output of this cleaning step can be used to explore machine learning models and once a model is finished, it can also be transferred to RAPIDS as a step of its own. The idea is that when it is time to publish a piece of research, a RAPIDS workflow can be shared in a public repository as is. In the following sections we share an example of how we structured an analysis workflow in RAPIDS.","title":"Why should I integrate my analysis in RAPIDS?"},{"location":"workflow-examples/analysis/#analysis-workflow-structure","text":"To accurately reflect the complexity of a real-world modeling scenario, we decided not to oversimplify this example. Importantly, every step in this example follows a basic structure: an input file and parameters are manipulated by an R or Python script that saves the results to an output file. Input files, parameters, output files and scripts are grouped into Snakemake rules that are described on smk files in the rules folder (we point the reader to the relevant rule(s) of each step). Researchers can use these rules and scripts as a guide to create their own as it is expected every modeling project will have different requirements, data and goals but ultimately most follow a similar chainned pattern. Hint The example\u2019s config file is example_profile/example_config.yaml and its Snakefile is in example_profile/Snakefile . The config file is already configured to process the sensor data as explained in Analysis workflow modules .","title":"Analysis workflow structure"},{"location":"workflow-examples/analysis/#description-of-the-study-modeled-in-our-analysis-workflow-example","text":"Our example is based on a hypothetical study that recruited 2 participants that underwent surgery and collected mobile data for at least one week before and one week after the procedure. Participants wore a Fitbit device and installed the AWARE client in their personal Android and iOS smartphones to collect mobile data 24/7. In addition, participants completed daily severity ratings of 12 common symptoms on a scale from 0 to 10 that we summed up into a daily symptom burden score. The goal of this workflow is to find out if we can predict the daily symptom burden score of a participant. Thus, we framed this question as a binary classification problem with two classes, high and low symptom burden based on the scores above and below average of each participant. We also want to compare the performance of individual (personalized) models vs a population model. In total, our example workflow has nine steps that are in charge of sensor data preprocessing, feature extraction, feature cleaning, machine learning model training and model evaluation (see figure below). We ship this workflow with RAPIDS and share a database with test data in an Open Science Framework repository. Modules of RAPIDS example workflow, from raw data to model evaluation","title":"Description of the study modeled in our analysis workflow example"},{"location":"workflow-examples/analysis/#configure-and-run-the-analysis-workflow-example","text":"Install RAPIDS Configure the user credentials of a local or remote MySQL server with writing permissions in your .env file. The config file where you need to modify the DATABASE_GROUP is at example_profile/example_config.yaml . Unzip the test database to data/external/rapids_example.sql and run: ./rapids -j1 restore_sql_file --profile example_profile Create the participant files for this example by running: ./rapids -j1 create_example_participant_files Run the example pipeline with: ./rapids -j1 --profile example_profile","title":"Configure and run the analysis workflow example"},{"location":"workflow-examples/analysis/#modules-of-our-analysis-workflow-example","text":"1. Feature extraction We extract daily behavioral features for data yield, received and sent messages, missed, incoming and outgoing calls, resample fused location data using Doryab provider, activity recognition, battery, Bluetooth, screen, light, applications foreground, conversations, Wi-Fi connected, Wi-Fi visible, Fitbit heart rate summary and intraday data, Fitbit sleep summary data, and Fitbit step summary and intraday data without excluding sleep periods with an active bout threshold of 10 steps. In total, we obtained 237 daily sensor features over 12 days per participant. 2. Extract demographic data. It is common to have demographic data in addition to mobile and target (ground truth) data. In this example we include participants\u2019 age, gender and the number of days they spent in hospital after their surgery as features in our model. We extract these three columns from the participant_info table of our test database . As these three features remain the same within participants, they are used only on the population model. Refer to the demographic_features rule in rules/models.smk . 3. Create target labels. The two classes for our machine learning binary classification problem are high and low symptom burden. Target values are already stored in the participant_target table of our test database and transferred to a CSV file. A new rule/script can be created if further manipulation is necessary. Refer to the parse_targets rule in rules/models.smk . 4. Feature merging. These daily features are stored on a CSV file per sensor, a CSV file per participant, and a CSV file including all features from all participants (in every case each column represents a feature and each row represents a day). Refer to the merge_sensor_features_for_individual_participants and merge_features_for_population_model rules in rules/features.smk . 5. Data visualization. At this point the user can use the five plots RAPIDS provides (or implement new ones) to explore and understand the quality of the raw data and extracted features and decide what sensors, days, or participants to include and exclude. Refer to rules/reports.smk to find the rules that generate these plots. 6. Feature cleaning. In this stage we perform four steps to clean our sensor feature file. First, we discard days with a data yield hour ratio less than or equal to 0.75, i.e. we include days with at least 18 hours of data. Second, we drop columns (features) with more than 30% of missing rows. Third, we drop columns with zero variance. Fourth, we drop rows (days) with more than 30% of missing columns (features). In this cleaning stage several parameters are created and exposed in example_profile/example_config.yaml . After this step, we kept 162 features over 11 days for the individual model of p01, 107 features over 12 days for the individual model of p02 and 101 features over 20 days for the population model. Note that the difference in the number of features between p01 and p02 is mostly due to iOS restrictions that stops researchers from collecting the same number of sensors than in Android phones. Feature cleaning for the individual models is done in the clean_sensor_features_for_individual_participants rule and for the population model in the clean_sensor_features_for_all_participants rule in rules/models.smk . 7. Merge features and targets. In this step we merge the cleaned features and target labels for our individual models in the merge_features_and_targets_for_individual_model rule in rules/models.smk . Additionally, we merge the cleaned features, target labels, and demographic features of our two participants for the population model in the merge_features_and_targets_for_population_model rule in rules/models.smk . These two merged files are the input for our individual and population models. 8. Modelling. This stage has three phases: model building, training and evaluation. In the building phase we impute, normalize and oversample our dataset. Missing numeric values in each column are imputed with their mean and we impute missing categorical values with their mode. We normalize each numeric column with one of three strategies (min-max, z-score, and scikit-learn package\u2019s robust scaler) and we one-hot encode each categorial feature as a numerical array. We oversample our imbalanced dataset using SMOTE (Synthetic Minority Over-sampling Technique) or a Random Over sampler from scikit-learn. All these parameters are exposed in example_profile/example_config.yaml . In the training phase, we create eight models: logistic regression, k-nearest neighbors, support vector machine, decision tree, random forest, gradient boosting classifier, extreme gradient boosting classifier and a light gradient boosting machine. We cross-validate each model with an inner cycle to tune hyper-parameters based on the Macro F1 score and an outer cycle to predict the test set on a model with the best hyper-parameters. Both cross-validation cycles use a leave-one-out strategy. Parameters for each model like weights and learning rates are exposed in example_profile/example_config.yaml . Finally, in the evaluation phase we compute the accuracy, Macro F1, kappa, area under the curve and per class precision, recall and F1 score of all folds of the outer cross-validation cycle. Refer to the modelling_for_individual_participants rule for the individual modeling and to the modelling_for_all_participants rule for the population modeling, both in rules/models.smk . 9. Compute model baselines. We create three baselines to evaluate our classification models. First, a majority classifier that labels each test sample with the majority class of our training data. Second, a random weighted classifier that predicts each test observation sampling at random from a binomial distribution based on the ratio of our target labels. Third, a decision tree classifier based solely on the demographic features of each participant. As we do not have demographic features for individual model, this baseline is only available for population model. Our baseline metrics (e.g. accuracy, precision, etc.) are saved into a CSV file, ready to be compared to our modeling results. Refer to the baselines_for_individual_model rule for the individual model baselines and to the baselines_for_population_model rule for population model baselines, both in rules/models.smk .","title":"Modules of our analysis workflow example"},{"location":"workflow-examples/minimal/","text":"Minimal Working Example \u00b6 This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal"},{"location":"workflow-examples/minimal/#minimal-working-example","text":"This is a quick guide for creating and running a simple pipeline to extract missing, outgoing, and incoming call features for daily and night epochs of one participant monitored on the US East coast. Install RAPIDS and make sure your conda environment is active (see Installation ) Make the changes listed below for the corresponding Configuration step (we provide an example of what the relevant sections in your config.yml will look like after you are done) Things to change on each configuration step 1. Setup your database connection credentials in .env . We assume your credentials group is called MY_GROUP . 2. America/New_York should be the default timezone 3. Create a participant file p01.yaml based on one of your participants and add p01 to [PIDS] in config.yaml . The following would be the content of your p01.yaml participant file: PHONE : DEVICE_IDS : [ aaaaaaaa-1111-bbbb-2222-cccccccccccc ] # your participant's AWARE device id PLATFORMS : [ android ] # or ios LABEL : MyTestP01 # any string START_DATE : 2020-01-01 # this can also be empty END_DATE : 2021-01-01 # this can also be empty 4. [TIME_SEGMENTS][TYPE] should be the default PERIODIC . Change [TIME_SEGMENTS][FILE] with the path of a file containing the following lines: label,start_time,length,repeats_on,repeats_value daily,00:00:00,23H 59M 59S,every_day,0 night,00:00:00,5H 59M 59S,every_day,0 5. If you collected data with AWARE you won\u2019t need to modify the attributes of [DEVICE_DATA][PHONE] 6. Set [PHONE_CALLS][PROVIDERS][RAPIDS][COMPUTE] to True Example of the config.yaml sections after the changes outlined above PIDS: [p01] TIMEZONE: &timezone America/New_York DATABASE_GROUP: &database_group MY_GROUP # ... other irrelevant sections TIME_SEGMENTS: &time_segments TYPE: PERIODIC FILE: \"data/external/timesegments_periodic.csv\" # make sure the three lines specified above are in the file INCLUDE_PAST_PERIODIC_SEGMENTS: FALSE # No need to change this if you collected AWARE data on a database and your credentials are grouped under `MY_GROUP` in `.env` DEVICE_DATA: PHONE: SOURCE: TYPE: DATABASE DATABASE_GROUP: *database_group DEVICE_ID_COLUMN: device_id # column name TIMEZONE: TYPE: SINGLE # SINGLE or MULTIPLE VALUE: *timezone ############## PHONE ########################################################### ################################################################################ # ... other irrelevant sections # Communication call features config, TYPES and FEATURES keys need to match PHONE_CALLS: TABLE: calls # change if your calls table has a different name PROVIDERS: RAPIDS: COMPUTE: True # set this to True! CALL_TYPES: ... Run RAPIDS ./rapids -j1 The call features for daily and morning time segments will be in /data/processed/features/p01/phone_calls.csv","title":"Minimal Working Example"}]} \ No newline at end of file diff --git a/latest/setup/configuration/index.html b/latest/setup/configuration/index.html index 503aa1e9..b618ab59 100644 --- a/latest/setup/configuration/index.html +++ b/latest/setup/configuration/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/setup/execution/index.html b/latest/setup/execution/index.html index 48c9a173..c1bc0321 100644 --- a/latest/setup/execution/index.html +++ b/latest/setup/execution/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/setup/installation/index.html b/latest/setup/installation/index.html index c1de499c..003e5f5f 100644 --- a/latest/setup/installation/index.html +++ b/latest/setup/installation/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/sitemap.xml b/latest/sitemap.xml index 0e84b3ba..4968cdd6 100644 --- a/latest/sitemap.xml +++ b/latest/sitemap.xml @@ -1,171 +1,171 @@ None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily None - 2020-12-18 + 2020-12-20 daily \ No newline at end of file diff --git a/latest/sitemap.xml.gz b/latest/sitemap.xml.gz index c19b574dd988fde509aff3ba780af6142e13728f..5e2d4921956f1131a600e2a6bb02c2b0839610ff 100644 GIT binary patch literal 216 zcmV;}04M(+iwFo{;NM>Y|8r?{Wo=<_E_iKh0PW4O4uUWg1<;+ZXu3m7CpD#Pj!yak zq*Ne*7I{_l?*)U2qaSd)w7u`X99=$#o;}<|UGN3ZGs&6rHq@PO3Vt~s(;Y8OqVH2r zF0!TUso-sl<3Wgdo-^vA8>*4AFg1c~yL?D&p^(|0n|0SDY(2UU)|`TOTCA^cSWz58 zZIo0p%~h)8GTySSV%y3$?mD@fsjIGkY4MYMI$Ep@ELgB$!GZ+~7A#n>V8Ma~3l^;Z St>kl&i{=dtql9ZE5&!`D$YqTH literal 216 zcmV;}04M(+iwFoH+1y_O|8r?{Wo=<_E_iKh0PW4O4uUWg1<;+ZAl+$!2~8=RqmzCB zDHTYdMP3#Cdnv)h(GR#?+TM3xj;vne5I@aKy|X3Dc*rY z#>Z>fQpq~+r=t+dvT*9X8S9C-n_EG;TR$ZBP^A38RM=Hf9F82ER%d686yfy^Yx1LO zRG#K(lI2NOtm8e~E4r&~Yi_f-tETRUw-i6g){!DGuwcQ01q&7|Sg>Hhf&~i}ELgDq Sx1#ML
    - - + + diff --git a/latest/visualizations/data-quality-visualizations/index.html b/latest/visualizations/data-quality-visualizations/index.html index 0e7b800f..6270bc47 100644 --- a/latest/visualizations/data-quality-visualizations/index.html +++ b/latest/visualizations/data-quality-visualizations/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/visualizations/feature-visualizations/index.html b/latest/visualizations/feature-visualizations/index.html index 7d1b93ec..7961a0fb 100644 --- a/latest/visualizations/feature-visualizations/index.html +++ b/latest/visualizations/feature-visualizations/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/workflow-examples/analysis/index.html b/latest/workflow-examples/analysis/index.html index b9579f5c..4c706cb8 100644 --- a/latest/workflow-examples/analysis/index.html +++ b/latest/workflow-examples/analysis/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/latest/workflow-examples/minimal/index.html b/latest/workflow-examples/minimal/index.html index 90a06d80..d5902fd0 100644 --- a/latest/workflow-examples/minimal/index.html +++ b/latest/workflow-examples/minimal/index.html @@ -9,8 +9,14 @@ + + + + + + - + @@ -18,10 +24,10 @@ - + - + @@ -29,7 +35,7 @@ - + @@ -55,6 +61,7 @@ + @@ -74,6 +81,8 @@ + +
    - - + + diff --git a/versions.json b/versions.json index 1b249c57..27bcc26f 100644 --- a/versions.json +++ b/versions.json @@ -1 +1 @@ -[{"version": "0.2", "title": "0.2", "aliases": ["latest"]}, {"version": "0.1", "title": "0.1", "aliases": []}, {"version": "dev", "title": "dev", "aliases": []}] \ No newline at end of file +[{"version": "0.3", "title": "0.3", "aliases": ["latest"]}, {"version": "0.2", "title": "0.2", "aliases": []}, {"version": "0.1", "title": "0.1", "aliases": []}, {"version": "dev", "title": "dev", "aliases": []}] \ No newline at end of file