From c1693d70856de8544dcdb62edd9c7835984e2b54 Mon Sep 17 00:00:00 2001 From: "M.Schmidt" Date: Mon, 17 Jun 2024 13:41:20 +0200 Subject: [PATCH] fix version naming --- _preview/404.html | 961 --- _preview/advanced-topics/index.html | 1087 --- _preview/analysisinputlocations/index.html | 1176 --- _preview/announce/index.html | 1076 --- _preview/bodyinterceptors/index.html | 1335 ---- _preview/call-graph-construction/index.html | 1360 ---- _preview/docguide/index.html | 1181 --- _preview/faq/index.html | 1263 ---- _preview/getting-started/index.html | 1338 ---- _preview/index.html | 1112 --- _preview/installation/index.html | 1226 --- _preview/jimple/index.html | 5984 --------------- _preview/qilin/index.html | 1102 --- _preview/search/search_index.json | 1 - _preview/sitemap.xml | 93 - _preview/sitemap.xml.gz | Bin 378 -> 0 bytes _preview/tool_ux/index.html | 1094 --- _preview/tools/index.html | 994 --- _preview/whatsnew/index.html | 1240 --- _preview/write_analyses/index.html | 1128 --- doc_how2startATool_preview/404.html | 259 +- .../advanced-topics/index.html | 213 +- .../analysisinputlocations/index.html | 215 +- .../announce/index.html | 213 +- .../bodyinterceptors/index.html | 213 +- .../call-graph-construction/index.html | 213 +- .../css/customizetheme.css | 0 .../docguide/index.html | 213 +- .../examples/index.html | 0 doc_how2startATool_preview/faq/index.html | 215 +- .../getting-started/index.html | 497 +- doc_how2startATool_preview/index.html | 216 +- .../installation/index.html | 251 +- doc_how2startATool_preview/jimple/index.html | 213 +- .../migrating/index.html | 0 .../migration/index.html | 882 --- .../overrides/partials/footer.html | 0 .../overrides/partials/header.html | 0 doc_how2startATool_preview/qilin/index.html | 233 +- .../search/search_index.json | 2 +- doc_how2startATool_preview/sitemap.xml | 73 +- doc_how2startATool_preview/sitemap.xml.gz | Bin 382 -> 378 bytes doc_how2startATool_preview/tool_ux/index.html | 288 +- doc_how2startATool_preview/tools/index.html | 213 +- .../whatsnew/index.html | 215 +- .../write_analyses/index.html | 340 +- latest | 2 +- {v1_2_0 => v1.2.0}/404.html | 0 {_preview/img => v1.2.0}/SootUpLogo.svg | 0 {v1_2_0 => v1.2.0}/advanced-topics/index.html | 0 {v1_2_0 => v1.2.0}/announce/index.html | 0 .../assets/images/favicon.png | Bin .../assets/javascripts/bundle.8fd75fb4.min.js | 0 .../javascripts/bundle.8fd75fb4.min.js.map | 0 .../javascripts/lunr/min/lunr.ar.min.js | 0 .../javascripts/lunr/min/lunr.da.min.js | 0 .../javascripts/lunr/min/lunr.de.min.js | 0 .../javascripts/lunr/min/lunr.du.min.js | 0 .../javascripts/lunr/min/lunr.el.min.js | 0 .../javascripts/lunr/min/lunr.es.min.js | 0 .../javascripts/lunr/min/lunr.fi.min.js | 0 .../javascripts/lunr/min/lunr.fr.min.js | 0 .../javascripts/lunr/min/lunr.he.min.js | 0 .../javascripts/lunr/min/lunr.hi.min.js | 0 .../javascripts/lunr/min/lunr.hu.min.js | 0 .../javascripts/lunr/min/lunr.hy.min.js | 0 .../javascripts/lunr/min/lunr.it.min.js | 0 .../javascripts/lunr/min/lunr.ja.min.js | 0 .../javascripts/lunr/min/lunr.jp.min.js | 0 .../javascripts/lunr/min/lunr.kn.min.js | 0 .../javascripts/lunr/min/lunr.ko.min.js | 0 .../javascripts/lunr/min/lunr.multi.min.js | 0 .../javascripts/lunr/min/lunr.nl.min.js | 0 .../javascripts/lunr/min/lunr.no.min.js | 0 .../javascripts/lunr/min/lunr.pt.min.js | 0 .../javascripts/lunr/min/lunr.ro.min.js | 0 .../javascripts/lunr/min/lunr.ru.min.js | 0 .../javascripts/lunr/min/lunr.sa.min.js | 0 .../lunr/min/lunr.stemmer.support.min.js | 0 .../javascripts/lunr/min/lunr.sv.min.js | 0 .../javascripts/lunr/min/lunr.ta.min.js | 0 .../javascripts/lunr/min/lunr.te.min.js | 0 .../javascripts/lunr/min/lunr.th.min.js | 0 .../javascripts/lunr/min/lunr.tr.min.js | 0 .../javascripts/lunr/min/lunr.vi.min.js | 0 .../javascripts/lunr/min/lunr.zh.min.js | 0 .../assets/javascripts/lunr/tinyseg.js | 0 .../assets/javascripts/lunr/wordcut.js | 0 .../workers/search.b8dbb3d2.min.js | 0 .../workers/search.b8dbb3d2.min.js.map | 0 .../assets/stylesheets/main.f2e4d321.min.css | 0 .../stylesheets/main.f2e4d321.min.css.map | 0 .../stylesheets/palette.06af60db.min.css | 0 .../stylesheets/palette.06af60db.min.css.map | 0 .../bodyinterceptors/index.html | 0 .../call-graph-construction/index.html | 0 {_preview => v1.2.0}/css/hint.min.css | 0 {v1_2_0 => v1.2.0}/docguide/index.html | 0 {v1_2_0 => v1.2.0}/faq/index.html | 0 .../figures/CopyPropagator Example_1.png | Bin .../figures/CopyPropagator Example_2.png | Bin .../figures/DominanceFinder Example.png | Bin .../figures/EmptySwitchEliminator Example.png | Bin .../figures/LocalLiveness Example.png | Bin .../figures/LocalPacker Example.png | Bin .../figures/LocalSplitter Example_1.png | Bin .../figures/LocalSplitter Example_2.png | Bin .../figures/SSA Example_1.png | Bin .../figures/SSA Example_2.png | Bin .../figures/TrapTightener Example.png | Bin .../UnreachableCodeEliminator Example.png | Bin {v1_2_0 => v1.2.0}/getting-started/index.html | 0 {_preview/img => v1.2.0}/icon.svg | 0 {_preview => v1.2.0}/img/favicon.ico | Bin {v1_2_0 => v1.2.0}/index.html | 0 {v1_2_0 => v1.2.0}/installation/index.html | 0 {v1_2_0 => v1.2.0}/jimple/index.html | 0 {v1_2_0 => v1.2.0}/search/search_index.json | 0 {v1_2_0 => v1.2.0}/sitemap.xml | 0 {v1_2_0 => v1.2.0}/sitemap.xml.gz | Bin {v1_2_0 => v1.2.0}/tools/index.html | 0 {v1_2_0 => v1.2.0}/whatsnew/index.html | 0 {v1_2_0 => v1.2.0}/write_analyses/index.html | 0 {v1_3_0 => v1.3.0}/404.html | 0 {_preview/assets => v1.3.0}/SootUp-paper.pdf | Bin {v1_2_0 => v1.3.0}/SootUpLogo.svg | 0 {v1_3_0 => v1.3.0}/advanced-topics/index.html | 0 {v1_3_0 => v1.3.0}/announce/index.html | 0 {v1_2_0 => v1.3.0}/assets/images/favicon.png | Bin .../assets/javascripts/bundle.ad660dcc.min.js | 0 .../javascripts/bundle.ad660dcc.min.js.map | 0 .../javascripts/lunr/min/lunr.ar.min.js | 0 .../javascripts/lunr/min/lunr.da.min.js | 0 .../javascripts/lunr/min/lunr.de.min.js | 0 .../javascripts/lunr/min/lunr.du.min.js | 0 .../javascripts/lunr/min/lunr.el.min.js | 0 .../javascripts/lunr/min/lunr.es.min.js | 0 .../javascripts/lunr/min/lunr.fi.min.js | 0 .../javascripts/lunr/min/lunr.fr.min.js | 0 .../javascripts/lunr/min/lunr.he.min.js | 0 .../javascripts/lunr/min/lunr.hi.min.js | 0 .../javascripts/lunr/min/lunr.hu.min.js | 0 .../javascripts/lunr/min/lunr.hy.min.js | 0 .../javascripts/lunr/min/lunr.it.min.js | 0 .../javascripts/lunr/min/lunr.ja.min.js | 0 .../javascripts/lunr/min/lunr.jp.min.js | 0 .../javascripts/lunr/min/lunr.kn.min.js | 0 .../javascripts/lunr/min/lunr.ko.min.js | 0 .../javascripts/lunr/min/lunr.multi.min.js | 0 .../javascripts/lunr/min/lunr.nl.min.js | 0 .../javascripts/lunr/min/lunr.no.min.js | 0 .../javascripts/lunr/min/lunr.pt.min.js | 0 .../javascripts/lunr/min/lunr.ro.min.js | 0 .../javascripts/lunr/min/lunr.ru.min.js | 0 .../javascripts/lunr/min/lunr.sa.min.js | 0 .../lunr/min/lunr.stemmer.support.min.js | 0 .../javascripts/lunr/min/lunr.sv.min.js | 0 .../javascripts/lunr/min/lunr.ta.min.js | 0 .../javascripts/lunr/min/lunr.te.min.js | 0 .../javascripts/lunr/min/lunr.th.min.js | 0 .../javascripts/lunr/min/lunr.tr.min.js | 0 .../javascripts/lunr/min/lunr.vi.min.js | 0 .../javascripts/lunr/min/lunr.zh.min.js | 0 .../assets/javascripts/lunr/tinyseg.js | 0 .../assets/javascripts/lunr/wordcut.js | 0 .../workers/search.b8dbb3d2.min.js | 0 .../workers/search.b8dbb3d2.min.js.map | 0 .../assets/stylesheets/main.6543a935.min.css | 0 .../stylesheets/main.6543a935.min.css.map | 0 .../stylesheets/palette.06af60db.min.css | 0 .../stylesheets/palette.06af60db.min.css.map | 0 .../bodyinterceptors/index.html | 0 .../call-graph-construction/index.html | 0 {v1_2_0 => v1.3.0}/css/hint.min.css | 0 {v1_3_0 => v1.3.0}/docguide/index.html | 0 {v1_3_0 => v1.3.0}/faq/index.html | 0 .../figures/CopyPropagator Example_1.png | Bin .../figures/CopyPropagator Example_2.png | Bin .../figures/DominanceFinder Example.png | Bin .../figures/EmptySwitchEliminator Example.png | Bin .../figures/LocalLiveness Example.png | Bin .../figures/LocalPacker Example.png | Bin .../figures/LocalSplitter Example_1.png | Bin .../figures/LocalSplitter Example_2.png | Bin {v1_2_0 => v1.3.0}/figures/SSA Example_1.png | Bin {v1_2_0 => v1.3.0}/figures/SSA Example_2.png | Bin .../figures/TrapTightener Example.png | Bin .../UnreachableCodeEliminator Example.png | Bin {v1_3_0 => v1.3.0}/getting-started/index.html | 0 {v1_2_0 => v1.3.0}/icon.svg | 0 {v1_2_0 => v1.3.0}/img/favicon.ico | Bin {v1_3_0 => v1.3.0}/index.html | 0 {v1_3_0 => v1.3.0}/installation/index.html | 0 {v1_3_0 => v1.3.0}/jimple/index.html | 0 {v1_3_0 => v1.3.0}/search/search_index.json | 0 {v1_3_0 => v1.3.0}/sitemap.xml | 0 {v1_3_0 => v1.3.0}/sitemap.xml.gz | Bin {v1_3_0 => v1.3.0}/tools/index.html | 0 {v1_3_0 => v1.3.0}/whatsnew/index.html | 0 {v1_3_0 => v1.3.0}/write_analyses/index.html | 0 v1_3_0/SootUp-paper.pdf | Bin 342993 -> 0 bytes v1_3_0/SootUpLogo.svg | 25 - v1_3_0/assets/images/favicon.png | Bin 1870 -> 0 bytes .../assets/javascripts/bundle.ad660dcc.min.js | 29 - .../javascripts/bundle.ad660dcc.min.js.map | 7 - .../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.el.min.js | 1 - .../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.he.min.js | 1 - .../javascripts/lunr/min/lunr.hi.min.js | 1 - .../javascripts/lunr/min/lunr.hu.min.js | 18 - .../javascripts/lunr/min/lunr.hy.min.js | 1 - .../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.kn.min.js | 1 - .../javascripts/lunr/min/lunr.ko.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 - .../javascripts/lunr/min/lunr.sa.min.js | 1 - .../lunr/min/lunr.stemmer.support.min.js | 1 - .../javascripts/lunr/min/lunr.sv.min.js | 18 - .../javascripts/lunr/min/lunr.ta.min.js | 1 - .../javascripts/lunr/min/lunr.te.min.js | 1 - .../javascripts/lunr/min/lunr.th.min.js | 1 - .../javascripts/lunr/min/lunr.tr.min.js | 18 - .../javascripts/lunr/min/lunr.vi.min.js | 1 - .../javascripts/lunr/min/lunr.zh.min.js | 1 - v1_3_0/assets/javascripts/lunr/tinyseg.js | 206 - v1_3_0/assets/javascripts/lunr/wordcut.js | 6708 ----------------- .../workers/search.b8dbb3d2.min.js | 42 - .../workers/search.b8dbb3d2.min.js.map | 7 - .../assets/stylesheets/main.6543a935.min.css | 1 - .../stylesheets/main.6543a935.min.css.map | 1 - .../stylesheets/palette.06af60db.min.css | 1 - .../stylesheets/palette.06af60db.min.css.map | 1 - v1_3_0/css/hint.min.css | 4 - v1_3_0/figures/CopyPropagator Example_1.png | Bin 367401 -> 0 bytes v1_3_0/figures/CopyPropagator Example_2.png | Bin 369405 -> 0 bytes v1_3_0/figures/DominanceFinder Example.png | Bin 946849 -> 0 bytes .../figures/EmptySwitchEliminator Example.png | Bin 580413 -> 0 bytes v1_3_0/figures/LocalLiveness Example.png | Bin 760419 -> 0 bytes v1_3_0/figures/LocalPacker Example.png | Bin 738711 -> 0 bytes v1_3_0/figures/LocalSplitter Example_1.png | Bin 474667 -> 0 bytes v1_3_0/figures/LocalSplitter Example_2.png | Bin 688288 -> 0 bytes v1_3_0/figures/SSA Example_1.png | Bin 1095791 -> 0 bytes v1_3_0/figures/SSA Example_2.png | Bin 1352932 -> 0 bytes v1_3_0/figures/TrapTightener Example.png | Bin 1113987 -> 0 bytes .../UnreachableCodeEliminator Example.png | Bin 327783 -> 0 bytes v1_3_0/icon.svg | 24 - v1_3_0/img/favicon.ico | Bin 228414 -> 0 bytes versions.json | 64 +- 261 files changed, 3032 insertions(+), 34305 deletions(-) delete mode 100644 _preview/404.html delete mode 100644 _preview/advanced-topics/index.html delete mode 100644 _preview/analysisinputlocations/index.html delete mode 100644 _preview/announce/index.html delete mode 100644 _preview/bodyinterceptors/index.html delete mode 100644 _preview/call-graph-construction/index.html delete mode 100644 _preview/docguide/index.html delete mode 100644 _preview/faq/index.html delete mode 100644 _preview/getting-started/index.html delete mode 100644 _preview/index.html delete mode 100644 _preview/installation/index.html delete mode 100644 _preview/jimple/index.html delete mode 100644 _preview/qilin/index.html delete mode 100644 _preview/search/search_index.json delete mode 100644 _preview/sitemap.xml delete mode 100644 _preview/sitemap.xml.gz delete mode 100644 _preview/tool_ux/index.html delete mode 100644 _preview/tools/index.html delete mode 100644 _preview/whatsnew/index.html delete mode 100644 _preview/write_analyses/index.html rename {_preview => doc_how2startATool_preview}/css/customizetheme.css (100%) rename {_preview => doc_how2startATool_preview}/examples/index.html (100%) rename {_preview => doc_how2startATool_preview}/migrating/index.html (100%) delete mode 100644 doc_how2startATool_preview/migration/index.html rename {_preview => doc_how2startATool_preview}/overrides/partials/footer.html (100%) rename {_preview => doc_how2startATool_preview}/overrides/partials/header.html (100%) rename {v1_2_0 => v1.2.0}/404.html (100%) rename {_preview/img => v1.2.0}/SootUpLogo.svg (100%) rename {v1_2_0 => v1.2.0}/advanced-topics/index.html (100%) rename {v1_2_0 => v1.2.0}/announce/index.html (100%) rename {_preview => v1.2.0}/assets/images/favicon.png (100%) rename {v1_2_0 => v1.2.0}/assets/javascripts/bundle.8fd75fb4.min.js (100%) rename {v1_2_0 => v1.2.0}/assets/javascripts/bundle.8fd75fb4.min.js.map (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.ar.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.da.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.de.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.du.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.el.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.es.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.fi.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.fr.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.he.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.hi.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.hu.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.hy.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.it.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.ja.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.jp.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.kn.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.ko.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.multi.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.nl.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.no.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.pt.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.ro.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.ru.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.sa.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.stemmer.support.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.sv.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.ta.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.te.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.th.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.tr.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.vi.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/min/lunr.zh.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/tinyseg.js (100%) rename {_preview => v1.2.0}/assets/javascripts/lunr/wordcut.js (100%) rename {_preview => v1.2.0}/assets/javascripts/workers/search.b8dbb3d2.min.js (100%) rename {_preview => v1.2.0}/assets/javascripts/workers/search.b8dbb3d2.min.js.map (100%) rename {v1_2_0 => v1.2.0}/assets/stylesheets/main.f2e4d321.min.css (100%) rename {v1_2_0 => v1.2.0}/assets/stylesheets/main.f2e4d321.min.css.map (100%) rename {_preview => v1.2.0}/assets/stylesheets/palette.06af60db.min.css (100%) rename {_preview => v1.2.0}/assets/stylesheets/palette.06af60db.min.css.map (100%) rename {v1_2_0 => v1.2.0}/bodyinterceptors/index.html (100%) rename {v1_2_0 => v1.2.0}/call-graph-construction/index.html (100%) rename {_preview => v1.2.0}/css/hint.min.css (100%) rename {v1_2_0 => v1.2.0}/docguide/index.html (100%) rename {v1_2_0 => v1.2.0}/faq/index.html (100%) rename {_preview/assets => v1.2.0}/figures/CopyPropagator Example_1.png (100%) rename {_preview/assets => v1.2.0}/figures/CopyPropagator Example_2.png (100%) rename {_preview/assets => v1.2.0}/figures/DominanceFinder Example.png (100%) rename {_preview/assets => v1.2.0}/figures/EmptySwitchEliminator Example.png (100%) rename {_preview/assets => v1.2.0}/figures/LocalLiveness Example.png (100%) rename {_preview/assets => v1.2.0}/figures/LocalPacker Example.png (100%) rename {_preview/assets => v1.2.0}/figures/LocalSplitter Example_1.png (100%) rename {_preview/assets => v1.2.0}/figures/LocalSplitter Example_2.png (100%) rename {_preview/assets => v1.2.0}/figures/SSA Example_1.png (100%) rename {_preview/assets => v1.2.0}/figures/SSA Example_2.png (100%) rename {_preview/assets => v1.2.0}/figures/TrapTightener Example.png (100%) rename {_preview/assets => v1.2.0}/figures/UnreachableCodeEliminator Example.png (100%) rename {v1_2_0 => v1.2.0}/getting-started/index.html (100%) rename {_preview/img => v1.2.0}/icon.svg (100%) rename {_preview => v1.2.0}/img/favicon.ico (100%) rename {v1_2_0 => v1.2.0}/index.html (100%) rename {v1_2_0 => v1.2.0}/installation/index.html (100%) rename {v1_2_0 => v1.2.0}/jimple/index.html (100%) rename {v1_2_0 => v1.2.0}/search/search_index.json (100%) rename {v1_2_0 => v1.2.0}/sitemap.xml (100%) rename {v1_2_0 => v1.2.0}/sitemap.xml.gz (100%) rename {v1_2_0 => v1.2.0}/tools/index.html (100%) rename {v1_2_0 => v1.2.0}/whatsnew/index.html (100%) rename {v1_2_0 => v1.2.0}/write_analyses/index.html (100%) rename {v1_3_0 => v1.3.0}/404.html (100%) rename {_preview/assets => v1.3.0}/SootUp-paper.pdf (100%) rename {v1_2_0 => v1.3.0}/SootUpLogo.svg (100%) rename {v1_3_0 => v1.3.0}/advanced-topics/index.html (100%) rename {v1_3_0 => v1.3.0}/announce/index.html (100%) rename {v1_2_0 => v1.3.0}/assets/images/favicon.png (100%) rename {_preview => v1.3.0}/assets/javascripts/bundle.ad660dcc.min.js (100%) rename {_preview => v1.3.0}/assets/javascripts/bundle.ad660dcc.min.js.map (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.ar.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.da.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.de.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.du.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.el.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.es.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.fi.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.fr.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.he.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.hi.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.hu.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.hy.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.it.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.ja.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.jp.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.kn.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.ko.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.multi.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.nl.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.no.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.pt.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.ro.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.ru.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.sa.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.stemmer.support.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.sv.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.ta.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.te.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.th.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.tr.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.vi.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/min/lunr.zh.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/tinyseg.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/lunr/wordcut.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/workers/search.b8dbb3d2.min.js (100%) rename {v1_2_0 => v1.3.0}/assets/javascripts/workers/search.b8dbb3d2.min.js.map (100%) rename {_preview => v1.3.0}/assets/stylesheets/main.6543a935.min.css (100%) rename {_preview => v1.3.0}/assets/stylesheets/main.6543a935.min.css.map (100%) rename {v1_2_0 => v1.3.0}/assets/stylesheets/palette.06af60db.min.css (100%) rename {v1_2_0 => v1.3.0}/assets/stylesheets/palette.06af60db.min.css.map (100%) rename {v1_3_0 => v1.3.0}/bodyinterceptors/index.html (100%) rename {v1_3_0 => v1.3.0}/call-graph-construction/index.html (100%) rename {v1_2_0 => v1.3.0}/css/hint.min.css (100%) rename {v1_3_0 => v1.3.0}/docguide/index.html (100%) rename {v1_3_0 => v1.3.0}/faq/index.html (100%) rename {v1_2_0 => v1.3.0}/figures/CopyPropagator Example_1.png (100%) rename {v1_2_0 => v1.3.0}/figures/CopyPropagator Example_2.png (100%) rename {v1_2_0 => v1.3.0}/figures/DominanceFinder Example.png (100%) rename {v1_2_0 => v1.3.0}/figures/EmptySwitchEliminator Example.png (100%) rename {v1_2_0 => v1.3.0}/figures/LocalLiveness Example.png (100%) rename {v1_2_0 => v1.3.0}/figures/LocalPacker Example.png (100%) rename {v1_2_0 => v1.3.0}/figures/LocalSplitter Example_1.png (100%) rename {v1_2_0 => v1.3.0}/figures/LocalSplitter Example_2.png (100%) rename {v1_2_0 => v1.3.0}/figures/SSA Example_1.png (100%) rename {v1_2_0 => v1.3.0}/figures/SSA Example_2.png (100%) rename {v1_2_0 => v1.3.0}/figures/TrapTightener Example.png (100%) rename {v1_2_0 => v1.3.0}/figures/UnreachableCodeEliminator Example.png (100%) rename {v1_3_0 => v1.3.0}/getting-started/index.html (100%) rename {v1_2_0 => v1.3.0}/icon.svg (100%) rename {v1_2_0 => v1.3.0}/img/favicon.ico (100%) rename {v1_3_0 => v1.3.0}/index.html (100%) rename {v1_3_0 => v1.3.0}/installation/index.html (100%) rename {v1_3_0 => v1.3.0}/jimple/index.html (100%) rename {v1_3_0 => v1.3.0}/search/search_index.json (100%) rename {v1_3_0 => v1.3.0}/sitemap.xml (100%) rename {v1_3_0 => v1.3.0}/sitemap.xml.gz (100%) rename {v1_3_0 => v1.3.0}/tools/index.html (100%) rename {v1_3_0 => v1.3.0}/whatsnew/index.html (100%) rename {v1_3_0 => v1.3.0}/write_analyses/index.html (100%) delete mode 100644 v1_3_0/SootUp-paper.pdf delete mode 100644 v1_3_0/SootUpLogo.svg delete mode 100644 v1_3_0/assets/images/favicon.png delete mode 100644 v1_3_0/assets/javascripts/bundle.ad660dcc.min.js delete mode 100644 v1_3_0/assets/javascripts/bundle.ad660dcc.min.js.map delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.ar.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.da.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.de.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.du.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.el.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.es.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.fi.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.fr.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.he.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.hi.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.hu.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.hy.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.it.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.ja.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.jp.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.kn.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.ko.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.multi.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.nl.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.no.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.pt.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.ro.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.ru.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.sa.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.sv.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.ta.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.te.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.th.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.tr.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.vi.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/min/lunr.zh.min.js delete mode 100644 v1_3_0/assets/javascripts/lunr/tinyseg.js delete mode 100644 v1_3_0/assets/javascripts/lunr/wordcut.js delete mode 100644 v1_3_0/assets/javascripts/workers/search.b8dbb3d2.min.js delete mode 100644 v1_3_0/assets/javascripts/workers/search.b8dbb3d2.min.js.map delete mode 100644 v1_3_0/assets/stylesheets/main.6543a935.min.css delete mode 100644 v1_3_0/assets/stylesheets/main.6543a935.min.css.map delete mode 100644 v1_3_0/assets/stylesheets/palette.06af60db.min.css delete mode 100644 v1_3_0/assets/stylesheets/palette.06af60db.min.css.map delete mode 100644 v1_3_0/css/hint.min.css delete mode 100644 v1_3_0/figures/CopyPropagator Example_1.png delete mode 100644 v1_3_0/figures/CopyPropagator Example_2.png delete mode 100644 v1_3_0/figures/DominanceFinder Example.png delete mode 100644 v1_3_0/figures/EmptySwitchEliminator Example.png delete mode 100644 v1_3_0/figures/LocalLiveness Example.png delete mode 100644 v1_3_0/figures/LocalPacker Example.png delete mode 100644 v1_3_0/figures/LocalSplitter Example_1.png delete mode 100644 v1_3_0/figures/LocalSplitter Example_2.png delete mode 100644 v1_3_0/figures/SSA Example_1.png delete mode 100644 v1_3_0/figures/SSA Example_2.png delete mode 100644 v1_3_0/figures/TrapTightener Example.png delete mode 100644 v1_3_0/figures/UnreachableCodeEliminator Example.png delete mode 100644 v1_3_0/icon.svg delete mode 100644 v1_3_0/img/favicon.ico diff --git a/_preview/404.html b/_preview/404.html deleted file mode 100644 index 7dff33e4839..00000000000 --- a/_preview/404.html +++ /dev/null @@ -1,961 +0,0 @@ - - - - - - - - - - - - - - - - - - - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- -

404 - Not found

- -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/advanced-topics/index.html b/_preview/advanced-topics/index.html deleted file mode 100644 index af520919413..00000000000 --- a/_preview/advanced-topics/index.html +++ /dev/null @@ -1,1087 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Shipped Analyses - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - -

Functionalities and Utilities

-

LocalLivenessAnalyser

-

LocalLivenessAnalyser is used for querying for the list of live local variables before and after a given Stmt.

-

Example:

-

LocalLiveness Example

-

The live local variables before and after each Stmt will be calculated after generating an instance of LocalLivenessAnalyser as shown the example above. They can be queried by using the methods getLiveLocalsBeforeStmt and getLiveLocalsAfterStmt.

-

DominanceFinder

-

DomianceFinder is used for querying for the immediate dominator and dominance frontiers for a given basic block.

-

Example: DominanceFinder Example

-

After generating an instance of DominanceFinder for a BlockGraph, we will get the immediate dominator and dominance frontiers for each basic block. The both properties can be queried by using the methodsgetImmediateDominatorandgetDominanceFrontiers.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/analysisinputlocations/index.html b/_preview/analysisinputlocations/index.html deleted file mode 100644 index ec532db7488..00000000000 --- a/_preview/analysisinputlocations/index.html +++ /dev/null @@ -1,1176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Configure your Inputs - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

AnalysisInputLocations

-

An AnalysisInputLocation tells SootUp what code input it should analyze.

-

Java Runtime

-
    -
  • Java <9: DefaultRTJaAnalysisInputLocation current rt.jar (or point to any rt.jar as its just a usual .jar file)
  • -
  • Java >8: JRTFilesystemAnalysisInputLocation
  • -
-

If you have errors like Java.lang.String, Java.lang.Object, ... you are most likely missing this AnalysisInput.

-

Java Bytecode .class, .jar, .war

-
    -
  • JavaClassPathAnalysisInputLocation - its the equivalent of the classpath you would pass to the java executable i.e. point to root(s) of package(s).
  • -
-

Java Sourcecode .java

-
    -
  • OTFCompileAnalysisInputLocation - you can point directly to .java files or pass a String with Java sourcecode
  • -
  • JavaSourcePathInputLocation - points to a directory that is the root source directory (containing the package directory structure)
  • -
-

Jimple .jimple

-
    -
  • JimpleAnalysisInputLocation - needs a Path to a .jimple file or a directory.
  • -
-

Android Bytecode .dex

-
    -
  • ApkAnalysisInputLocation - currenlty uses dex2jar internally - SootUp solution is WIP!
  • -
-

Java cli arguments to configure SootUp

-

We created a Utility that parses a String of java command line arguments and configures SootUp respectively.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/announce/index.html b/_preview/announce/index.html deleted file mode 100644 index ae9d40a3034..00000000000 --- a/_preview/announce/index.html +++ /dev/null @@ -1,1076 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Announcements - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - -

Announcements

- -

Release Announcement

-

We would like to announce Soot’s successor, SootUp.

-

Over more than 20 years, Soot has become one of the world’s most popular academic tool for Java and Android analysis and instrumentation. We thank all of you who have used and contributed to it over the years! It was your feedback and your contributions that helped it grow into such a versatile tool!

-

However, over the years, the requirements for Soot have changed a lot, and given its original architecture, it was no longer quite up to the task. Soot was originally developed for ahead-of-time code transformation, particularly optimization, which has become very uncommon in Java. Current use cases center much more around powerful program analyses and program-understanding tasks.

-

Today we are officially releasing SootUp, a new version of Soot with a completely overhauled architecture. With SootUp, we aim to keep the best things about Soot, yet overcome a lot of its drawbacks. We very much restructured Soot, particularly abolishing the heavy use of singletons. Soot now has a concept of views; each view corresponds to some version or variant of an analyzed program, and multiple views can be kept in memory at the same time. This sets the foundation, for instance, for differential or incremental program analyses.

-

SootUp is a library that can easily be included in other projects, leaving those projects in control. For those who intend to use it as a framework, with inversion of control, SootUp provides additional templates that help you and novices to get started more easily. The Jimple IR has been slightly simplified, and has been made immutable by default such that internally SootUp can make use of caching where desired. Where required, Jimple transformations are still allowed, but in a systematic manner, for instance assuring that analyses depending on the transformed code are notified about its changes.

-

Below is an overview of what’s new.

-
    -
  • Library by default, framework as an option
  • -
  • Modular Architecture, no more singletons
  • -
  • New source code frontend
  • -
  • Immutable Jimple IR
  • -
  • Greatly increased testability and test coverage
  • -
-

SootUp is not a drop-in replacement for Soot! Due to its completely new architecture and API it is essentially an almost complete rewrite. For a while, Soot and SootUp will coexist, as many existing tools depend on Soot, yet our maintenance efforts will henceforth be focused on SootUp, not Soot, and on extending SootUp with those capabilities that people still find missing. For now, we recommend using SootUp for greenfield projects.

-

For more details, check out -* The SootUp home page: https://soot-oss.github.io/SootUp/, and -* The SootUp repository: https://github.com/soot-oss/SootUp/

-

We are very much looking forward to your feedback and feature requests. To this end, best create appropriate issues in the repository.

-

This major upgrade of Soot was made possible by generous competitive funding by the DFG, within the project “Future-proofing the Soot Framework for Program Analysis -and Transformation (FutureSoot)”. It was funded in the DFG’s program on Research Software Sustainability.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/bodyinterceptors/index.html b/_preview/bodyinterceptors/index.html deleted file mode 100644 index 992531698f8..00000000000 --- a/_preview/bodyinterceptors/index.html +++ /dev/null @@ -1,1335 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - BodyInterceptors - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Body Interceptors

-

BodyInterceptors are applied to each Body now by default, if not overridden in the used AnalysisInputLocations. -The BodyInterceptors exist to to improve and normalize the raw Jimple that was generated in an earlier step. -The "raw" generated Jimple from the Bytecodefrontend needs a lot improvements - deficits of raw Jimple are:

-
    -
  • Java Variables with that are compiled to the same Local index, but from different scopes inside the method are mapped to the same Local. The Localsplitter takes care of splitting these Locals that are semantically different, into two seperate Local instances.
  • -
  • The Conversion from a stack-machine to a register-machine creates leftover assignments - handled/inlined/removed by the Aggregator, CopyPropagator. They inline unnecessary Assignments.
  • -
  • As the previous BodyTransformers could optimize code that leads to unused assignments etc - The DeadAssignmentEliminator keeps the StmtGraph clean from unused/dead Assignments.
  • -
  • The Locals we get from the Java bytecode are typically untyped. Therefore we have to augment the Local types which is done by the TypeAssigner.
  • -
  • t.b.c.
  • -
-

Method scoped optimisations: -- ConditionalBranchFolder: removes tautologic ifs that are always true/false - if we can determine it in the scope of the method. -- EmptySwitchEliminator: removes switches that are not really switching -- ConstantPropagatorAndFolder: calculates constant values before runtime -- CastAndReturnInliner: Removes merging flows to a single return -- UnreachableCodeEliminator: speaks for itself. -- TrapTightener

-

Make Local names standardized: -- LocalNameStandardizer: numbers Locals with the scheme: type-initial + number of type occurence

-
-

Soot Equivalent

-

BodyTransformer

-
-

Below, we show how these BodyInterceptors work for the users who are interested in their internal workings.

-

LocalSplitter

-

LocalSplitter is aBodyInterceptorthat attempts to identify and separate uses of a local variable (as definition) that are independent of each other by renaming local variables.

-

Example 1:

-

LocalSplitter Example_1

-

As shown in the example above, the local variablel1is defined twice. It can be split up into two new local variables: l1#1 and l1#2 because the both definitions are independent of each other.

-

Look for foldable navigation and tabs for showing old vs new

-

Example 2:

-

LocalSplitter Example_2

-

In the second example, the local variablel2is defined thrice. But it cannot be split up into three new local variables as in the first example, because its definitions in the if-branches are not independent of each other. Therefore, it can only be split up into two local variables as shown in the figure.

-

LocalPacker

-

LocalPacker is aBodyInterceptorthat attempts to minimize the number of local variables which are used in body by reusing them, when it is possible. It corresponds to the inverse body transformation of LocalSplitter. Note: Every local variable's type should be assigned before running LocalPacker.

-

Example:

-

LocalPacker Example

-

In the given example above, the local variablesl1,l3are summarized to be one local variablel1, because they have the same type without interference with each other. Likewise, the local variablesl2,l4andl5are summarized to be another local variablel2. Although the local variablel0doesn't interfere any other local variables, it cannot be summed up with other local variables because of its distinctive type.

-

TrapTightener

-

WIP - currently not available!

-

TrapTightener is aBodyInterceptorthat shrinks the protected area covered by each Trap in a Body.

-

Example:

-

TrapTightener Example

-

We assume in the example above that only theStmt:l2 := 2might throw an exception caught by theTrapwhich is labeled withlabel3. In the jimple body before running the TrapTightener, the protected area covered by the Trap contains threeStmts:l1 := 1; l2 := 2; l2 := 3. But an exception could only arise at theStmt:l2 := 2. After the implementation of TrapTightener, we will get a contractible protected area which contains only theStmtthat might throw an exception, namely theStmt:l2 := 2.

-

EmptySwitchEliminator

-

EmptySwitchEliminator is aBodyInterceptorthat removes empty switch statements which contain only the default case.

-

Example:

-

EmptySwitchEliminator Example

-

As shown in the example above, the switch statement in the jimple body always takes the default action. After running EmptySwitchEliminator, the switch statement is replaced with aGotoStmtto the default case.

-

UnreachableCodeEliminator

-

UnreachableCodeEliminator is aBodyInterceptorthat removes all unreachable statements.

-

Example:

-

UnreachableCodeEliminator Example

-

Obviously, the code segmentl2 = 2; l3 = 3;is unreachable. It will be removed after running the UreachableCodeEliminator.

-

CopyPropagator

-

CopyPropagator is aBodyInterceptorthat supports the global copy propagation and constant propagation.

-

Example for global copy propagation:

-

UnreachableCodeEliminator Example

-

Consider a code segment in the following form:

-
1
-2
-3
a = b;
-...
-c = use(a); // a, b, c are local variables
-
-

According to the copy propagation's definition, the statementc = use(a)can be replaced withc = use(b)iff both conditions are met:

-
    -
  • ais defined only one time on all the paths froma = btoc = use(a).
  • -
  • There are no definitions ofbon any path froma = btoc = use(a).
  • -
-

In the example for global copy propagation, the first usedl1is replaced withl0, but the second usedl1cannot be replaced withl3, because the second condition is not satisfied.

-

Example for constant propagation:

-

CopyPropagator Example_1

-

Constant propagation is similar to copy propagation. Consider a code segment in the following form:

-
1
-2
-3
a = const;
-...
-b = use(a); // a, b are local variables, const is a constant
-
-

After perfoming the constant propagation, the statementb = use(a)can be replaced withb = use(const)iffais not redefined on any of the paths froma = consttob = use(a).

-

Therefore, the first usedl1in the second example can be replaced with the constant1, but the second usedl1cannot be replaced with the constant2, becausel1is redefined on the path froml1 = 2tol4 = use(l1). However, it can be replaced with local variablel2, because the both conditions of copy propagation are met.

-

LocalNameStandardizer

-

LocalNameStandardizer is aBodyInterceptorthat assigns a generic name to each local variable. Firstly, it will sort the local variables' order alphabetically by the string representation of their type. If there are two local variables with the same type, then the LocalNameStandardizer will use the sequence of their occurrence in jimple body to determine their order. Each assigned name consists of two parts:

-
    -
  • A letter to imply the local variable's type
  • -
  • A digit to imply the local variable's order
  • -
-

The following table shows the letter corresponding to each type:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Type of Local VariableLetter
booleanz
byteb
shorts
inti
longl
floatf
doubled
charc
nulln
unknowne
referencer
-

StaticSingleAssignmentFormer

-

StaticSingleAssignmentFormer is aBodyInterceptorthat transforms jimple body into SSA form, so that each local variable is assigned exactly once and defined before its first use.

-

Example:

-

SSA Example_1

-

SSA Example_2

-

In the given example, the StaticSingleAssignmentFormer assigns eachIdentityStmtandAssignStmtto a new local variable . And each use uses the local variable which is most recently defined. Sometimes, it is impossible to determine the most recently defined local variable for a use in a join block. In this case, the StaticSingleAssignmentFormer will insert aPhiStmtin the front of the join block to merge all most recently defined local variables and assign them a new local variable.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/call-graph-construction/index.html b/_preview/call-graph-construction/index.html deleted file mode 100644 index d01990d4597..00000000000 --- a/_preview/call-graph-construction/index.html +++ /dev/null @@ -1,1360 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Callgraph Construction - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Call Graph Construction

-

A call graph shows the method calling relationship of a program. It is a directed graph, whose nodes represent different methods, and edges represent caller -> callee relationship.

-

SootUp contains several call graph construction algorithms. Below, we show how you can use each of these.

-

Creating the Type Hierarchy

-

All the call graph construction algorithms require the view to access the type hierarchy for resolving method calls based of sub typing relationship. -Below, we show how to create a type hierarchy:

-
-
-
-
1
-2
-3
-4
-5
List<AnalysisInputLocation> inputLocations = new ArrayList();
-inputLocations.add(new JavaClassPathAnalysisInputLocation("src/test/resources/Callgraph/binary"));
-inputLocations.add(new DefaultRTJarAnalysisInputLocation());
-
-JavaView view = new JavaView(inputLocations);
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
String targetTestClassName = target.exercise1.Hierarchy.class.getName();
-G.reset();
-String userdir = System.getProperty("user.dir");
-String sootCp = userdir + File.separator + "target" + File.separator + "test-classes"+ File.pathSeparator + "lib"+File.separator+"rt.jar";
-Options.v().set_whole_program(true);
-Options.v().set_soot_classpath(sootCp);
-Options.v().set_no_bodies_for_excluded(true);
-Options.v().process_dir();
-Options.v().set_allow_phantom_refs(true);
-Options.v().setPhaseOption("jb", "use-original-names:true");
-Options.v().set_prepend_classpath(false);
-SootClass c = Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);
-if (c != null)
-    c.setApplicationClass();
-Scene.v().loadNecessaryClasses();
-
-Hierarchy hierarchy = new Hierarchy();
-
-
-
-
-

Defining an Entry Method

-

All the call graph construction algorithms require an entry method to start with. In java application, you usually define the main method. However, it is possible to define arbitrary entry methods depending on your needs. Below, we show how to define such an entry method:

-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
-9
JavaClassType classTypeA = view.getIdentifierFactory().getClassType("A");
-
-MethodSignature entryMethodSignature =
-    view.getIdentifierFactory()
-        .getMethodSignature(
-            classTypeA,
-            JavaIdentifierFactory.getInstance()
-                .getMethodSubSignature(
-                    "calc", VoidType.getInstance(), Collections.singletonList(classTypeA)));    
-
-
-
-
1
SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName("doStuff");     
-
-
-
-
-

Class Hierarchy Analysis

-

Class Hierarchy Analysis (CHA) algorithm is the most sound call graph construction algorithm available in SootUp. It soundly includes all implementers of an interface, when resolving a method call on an interface. -You can construct a call graph with CHA as follows:

-
-
-
-
1
-2
-3
-4
-5
-6
-7
CallGraphAlgorithm cha = 
-        new ClassHierarchyAnalysisAlgorithm(view);
-
-CallGraph cg = 
-        cha.initialize(Collections.singletonList(entryMethodSignature));
-
-System.out.println(cg);
-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
CHATransformer.v().transform();
-SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName("doStuff");
-CallGraph cg = Scene.v().getCallGraph();
-Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));
-while (targets.hasNext()) {
-    SootMethod tgt = (SootMethod)targets.next();
-    System.out.println(src + " may call " + tgt);
-    }
-
-
-
-
-

Rapid Type Analysis

-

Rapid Type Analysis (RTA) algorithm constructs a rather precise version of the call graph that the CHA constructs. It refines CHA by considering only the instantiated implementers of an interface, when resolving a method call on an interface. -You can construct a call graph with RTA as follows:

-
-
-
-
1
-2
-3
-4
-5
-6
-7
CallGraphAlgorithm rta = 
-        new RapidTypeAnalysisAlgorithm(view);
-
-CallGraph cg = 
-        rta.initialize(Collections.singletonList(entryMethodSignature));
-
-System.out.println(cg);
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
Transform sparkConfig = new Transform("cg.spark", null);
-PhaseOptions.v().setPhaseOption(sparkConfig, "enabled:true");
-PhaseOptions.v().setPhaseOption(sparkConfig, "rta:true");
-PhaseOptions.v().setPhaseOption(sparkConfig, "on-fly-cg:false");
-Map phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);
-SparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);
-SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName("doStuff");
-CallGraph cg = Scene.v().getCallGraph();
-Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));
-while (targets.hasNext()) {
-    SootMethod tgt = (SootMethod)targets.next();
-    System.out.println(src + " may call " + tgt);
-}  
-
-
-
-
-

Variable Type Analysis

-

Variable Type Analysis (VTA) algorithm further refines the call graph that the RTA constructs. It refines RTA by considering only the assigned instantiations of the implementers of an interface, when resolving a method call on an interface. -When considering assignments, we usually need to consider pointer (points-to) relationship.

-
-

Info

-

VTA algorithm was implemented using the Spark pointer analysis framework. -A reimplementation of Spark in SootUp is currently under development.

-
-

Spark requires an initial call graph to begin with. You can use one of the call graphs that we have constructed above. You can construct a call graph with VTA as follows:

-
-
-
-
1
-2
-3
Spark spark = new Spark.Builder(view, callGraph).vta(true).build();
-spark.analyze();
-CallGraph vtaCAllGraph = spark.getCallGraph();
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
Transform sparkConfig = new Transform("cg.spark", null);
-PhaseOptions.v().setPhaseOption(sparkConfig, "enabled:true");
-PhaseOptions.v().setPhaseOption(sparkConfig, "vta:true");
-PhaseOptions.v().setPhaseOption(sparkConfig, "on-fly-cg:false");
-Map phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);
-SparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);
-SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName("doStuff");
-CallGraph cg = Scene.v().getCallGraph();
-Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));
-while (targets.hasNext()) {
-    SootMethod tgt = (SootMethod)targets.next();
-    System.out.println(src + " may call " + tgt);
-}    
-
-
-
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/docguide/index.html b/_preview/docguide/index.html deleted file mode 100644 index b024e8473d6..00000000000 --- a/_preview/docguide/index.html +++ /dev/null @@ -1,1181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Docguide - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - -

Docguide

- -

General

-

MkDocsExtensions

-

Tooltip

-

Hover me

-

Example File inclusion

-

this enables that tutorial code can be tested and will fail if its not up to date anymore :)

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
package sootup.examples.basicSetup;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Collections;
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-import sootup.core.inputlocation.AnalysisInputLocation;
-import sootup.core.jimple.common.expr.JVirtualInvokeExpr;
-import sootup.core.jimple.common.stmt.JInvokeStmt;
-import sootup.core.model.SootClass;
-import sootup.core.model.SootMethod;
-import sootup.core.signatures.MethodSignature;
-import sootup.core.types.ClassType;
-import sootup.core.views.View;
-import sootup.java.bytecode.inputlocation.PathBasedAnalysisInputLocation;
-import sootup.java.core.language.JavaJimple;
-import sootup.java.core.views.JavaView;
-
-/** This example illustrates how to create and use a new Soot Project. */
-@Tag("Java8")
-public class BasicSetup {
-
-  @Test
-  public void createByteCodeProject() {
-    // Create a AnalysisInputLocation, which points to a directory. All class files will be loaded
-    // from the directory
-    Path pathToBinary = Paths.get("src/test/resources/BasicSetup/binary");
-    AnalysisInputLocation inputLocation = PathBasedAnalysisInputLocation.create(pathToBinary, null);
-
-    // Create a view for project, which allows us to retrieve classes
-    View view = new JavaView(inputLocation);
-
-    // Create a signature for the class we want to analyze
-    ClassType classType = view.getIdentifierFactory().getClassType("HelloWorld");
-
-    // Create a signature for the method we want to analyze
-    MethodSignature methodSignature =
-        view.getIdentifierFactory()
-            .getMethodSignature(
-                classType, "main", "void", Collections.singletonList("java.lang.String[]"));
-
-    // Assert that class is present
-    assertTrue(view.getClass(classType).isPresent());
-
-    // Retrieve class
-    SootClass sootClass = view.getClass(classType).get();
-
-    // Retrieve method
-    view.getMethod(methodSignature);
-
-    // Alternatively:
-    assertTrue(sootClass.getMethod(methodSignature.getSubSignature()).isPresent());
-    SootMethod sootMethod = sootClass.getMethod(methodSignature.getSubSignature()).get();
-
-    // Read jimple code of method
-    System.out.println(sootMethod.getBody());
-
-    // Assert that Hello world print is present
-    assertTrue(
-        sootMethod.getBody().getStmts().stream()
-            .anyMatch(
-                stmt ->
-                    stmt instanceof JInvokeStmt
-                        && stmt.getInvokeExpr() instanceof JVirtualInvokeExpr
-                        && stmt.getInvokeExpr()
-                            .getArg(0)
-                            .equivTo(JavaJimple.getInstance().newStringConstant("Hello World!"))));
-  }
-}
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/faq/index.html b/_preview/faq/index.html deleted file mode 100644 index 3b926ecf7ef..00000000000 --- a/_preview/faq/index.html +++ /dev/null @@ -1,1263 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Troubleshooting & FAQ - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Frequently Asked Questions

-

How to setup the soot dependency (in Maven, Gradle)?

-

See Installation.

-

How to retreive a SootClass or SootMethod?

-

See Getting Started.

-

Is there a github template to quickstart into development with SootUp?

-

Not yet.

-

Error while using the Sourcecodefrontend

-

Please make sure to use Java8 to execute.

-

Exception: Provider "jrt" not found

-

1
-2
-3
-4
java.lang.ExceptionInInitializerError
-    at sootup.java.bytecode.inputlocation.JrtFileSystemAnalysisInputLocationTest.getClassSource(JrtFileSystemAnalysisInputLocationTest.java:28)
-    ...
-Caused by: java.nio.file.ProviderNotFoundException: Provider "jrt" not found
-
-To execute SootUp with JavaModules support please make sure you run the code at least the Java9 Runtime.

-

How to solve a ConcurrentModificationException?

-

Copy the Iterator into an intermediate Collection. -

1
-2
-3
-4
-5
final StmtGraph<?> stmtGraph = builder.getStmtGraph();
-    for (Stmt stmt : Lists.newArrayList(stmtGraph)){
-        ...
-    }
-}
-

-

How can I visualize a StmtGraph?

-

There exists a tool, that converts a StmtGraph to the Graphviz Dot Language. -

1
DotExporter.buildGraph( stmtgraph );
-
-or create a convenient link with the exported stmtgraph as HTTP GET Parameter -
1
DotExporter.createUrlToWebeditor( stmtgraph );
-

-

Is there a way to use code exploration and syntax highlighting features in my IDE for .jimple files?

-

Try JimpeLsp.

-

Is there a way to use syntax highlighting of .jimple in my paper, thesis, ...?

-

Have a look at LspLexer4Pygments.

-

How to ... add an entry in this list? i.e. Your question is not answered here?

-

Feel free to start a Discussion.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/getting-started/index.html b/_preview/getting-started/index.html deleted file mode 100644 index 3c28e1819c3..00000000000 --- a/_preview/getting-started/index.html +++ /dev/null @@ -1,1338 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - First Steps - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

General Usage of SootUp

-

This page walks you through the core data structures, as well as shows how to get started with SootUp.

-

The core datastructures

-

Before you get started with the SootUp library, it helps to learn about the following core data structures:

-
    -
  • AnalysisInputLocation: points to the target code to be analyzed.
  • -
-
-

Soot Equivalent

-

It corresponds to the cp option, which specifies the classpath for Soot to find classes to be analyzed.

-
-
    -
  • View: presents the code/classes under analysis.
  • -
-
-

Soot Equivalent

-

It corresponds to the Scene class, but it is not a singleton. So it is possible to instantiate multiple views simultaneously.

-
-
    -
  • -

    SootClass: represents a class loaded into the View.

    -
  • -
  • -

    SootMethod: represents a method of a class.

    -
  • -
  • -

    SootField: represents a field of a class.

    -
  • -
  • -

    Body: represents a method body in Jimple.

    -
  • -
  • -

    StmtGraph: represents the control flow graph of a method body in Jimple statements.

    -
  • -
-

Creating a View

-

You can use bytecode analysis typically when you do not have access to the source code of the target program. Following example shows how to create a view for analyzing Java bytecode.

-
-

Create a view to analyze Java bytecode

-
1
-2
-3
-4
AnalysisInputLocation inputLocation = 
-        new JavaClassPathAnalysisInputLocation("path2Binary");
-
-JavaView view = new JavaView(inputLocation);
-
-
-

If you have access to the source code, it is also possible to create a view for analyzing source code. Following example shows how to create view for analyzing Java source code.

-
-

Experimental

-

The source code frontend is experimental and should only be used for testing purposes. You should compile the code for analysis first and use the bytecode frontend instead.

-
-
-

Create a view to analyze Java source code

-
1
-2
-3
-4
AnalysisInputLocation inputLocation = 
-        new JavaSourcePathAnalysisInputLocation("path2Source");
-
-JavaView view = new JavaView(inputLocation);
-
-
-

If you have a Jimple file, you can create a view for analyzing jimple code directly. Following example shows how to create a view for analyzing jimple code.

-
-

Create a project to analyze jimple code

-
1
-2
-3
-4
-5
-6
Path pathToJimple = Paths.get("path2Jimple");
-
-AnalysisInputLocation inputLocation = 
-        new JimpleAnalysisInputLocation(pathToJimple);
-
-JimpleView view = new JimpleView(inputLocation);
-
-
- - -

By default, whenever a class is retrieved, it will be permanently stored in a cache. -If you do not want retrieved classes to be stored indefinetly, you can instead provide a different CacheProvider to the created view. -To for example use an LRUCache instead, which stores at most 50 classes, and always replaces the least recently used class by a newly retrieved one, use the following call:

-
1
JavaView view = new JavaView(Collections.singletonList(inputLocation), new LRUCacheProvider(50));
-
-

Retrieving a Class

-

Each class is identified with a unique signature adhering to Java identifier rules, therefore you first need to specify the class signature (ClassType) as shown below.

-

Let's say the following is the target program that we want to analyze:

-
-

Target Program

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
package example;
-
-public class HelloWorld {
-
-  public HelloWorld() {
-
-  }
-
-  public static void main(String[] args) {
-    HelloWorld hw = new HelloWorld();
-    hw.hello();
-  }
-
-  public void hello() {
-
-  }
-
-}
-
-
-

Then, we could define the ClassType of the HelloWorld class as follows:

-
-

Defining a ClassType

-
1
-2
JavaClassType classType = 
-        view.getIdentifierFactory().getClassType("example.HelloWorld");
-
-
-

Once we have a ClassType that identifies the HelloWorld class, we can use it to retrieve the corresponding SootClass object from the view as shown below:

-
-

Retrieving a SootClass

-
1
JavaSootClass sootClass = view.getClass(classType).get();
-
-
-

Retrieving a Method

-

Like the classes, methods also have an identifier which we call MethodSignature. For instance, we can define the method signature for identifying the main method of the HelloWorld class as follows:

-
-

Defining a MethodSignature

-
1
-2
-3
-4
-5
-6
-7
-8
MethodSignature methodSignature =
-    view
-        .getIdentifierFactory()
-        .getMethodSignature(
-            "main", // method name
-            classType,
-            "void", // return type
-            Collections.singletonList("java.lang.String[]")); // args
-
-
-

Once we have a MethodSignature that identifies the main method of the HelloWorld class, we can use it to retrieve the corresponding SootMethod object from the view as shown below:

-
-

Retrieving a SootMethod from the View

-
1
-2
-3
-4
-5
Optional<SootMethod> opt = view.getMethod(methodSignature);
-
-if(opt.isPresent()){
-  SootMethod method = opt.get();
-}
-
-
-

Alternatively, we can also retrieve a SootMethod from SootClass that contains it.

-
-

Retrieving a SootMethod from a SootClass

-
1
-2
-3
-4
-5
Optional<JavaSootMethod> opt = sootClass.getMethod(methodSignature.getSubSignature());
-
-if(opt.isPresent()){
-  JavaSootMethod method = opt.get();
-}
-
-
-

Retrieving the Control-Flow Graph of a Method

-

Each SootMethod contains a Control-Flow Graph (CFG) which is represented via the StmtGraph. This structure is usually used for program analysis. You can retrieve the CFG of a SootMethod as follows:

-
-

Retrieving the CFG of a SootMethod

-
1
sootMethod.getBody().getStmts();
-
-
-
-

Access or Download all of the code used above

-

BasicSetup.java

-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/index.html b/_preview/index.html deleted file mode 100644 index 2e2d2f5c53d..00000000000 --- a/_preview/index.html +++ /dev/null @@ -1,1112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - -

What's SootUp?

-

SootUp is a complete overhaul of the good, old static analysis framework Soot.

-
    -
  • Transforms JVM bytecode to the intermediate representation Jimple.
  • -
  • Provides ClassHierarchy generation
  • -
  • CallGraph generation with different algorithms/precisions
  • -
  • Inter-procedural data-flow analysis with the IDE/IFDS framework enabled by Heros
  • -
  • Applies simple transformations on retrieving a methods Body (see BodyInterceptor)
  • -
  • Provides serialization of the Jimple IR.
  • -
-
-

Important

-

SootUp is not a version update to Soot, it is a completely new implementation written from scratch that aims to be a leaner, modernized and developer friendly successor of Soot. -It is not a Drop-In Replacement! The new architecture and API, renders it not trivial to update existing projects that were built on soot. -Therefore we recommend using SootUp for greenfield projects. We hope improved type safety and streamlined mechanisms will aide you implementing and debugging your analysis tool. -Unfortunately not every feature has been ported - If you miss something feel free to contribute a feature you miss from good old Soot.

-
-

Why SootUp?

-

Over the 20+ years, SootUps predecessor Soot has evolved into a powerful framework, which is one of the most widely used tools in the static analysis community. -This evolution was guided by the needs of the community and carried out with ad-hoc improvements. -As a result, Soot has become a tool that can do a multitude of things, but it is heavy and hard to maintain and comprehend. -So there was the need to clean up the codebase e.g. improve the software architecture, -remove legacy datastructures that weren't in the Java Runtime at the time of Soots creation, -enforce validation to have a sane state, -removing the necessity of arcane knowledge, document it more and more - to make Soot future prove. -So we introduced Design changes in SootUp, which aim to address Soot's shortcomings. -The goal is a lighter library that can easily be understood and maintained to be included in other projects.

-

Supporters

-

The development of SootUp is financed by generous support from the German Research Foundation (DFG) and -the Heinz Nixdorf Institute (HNI).

- - - - - - -
- -

Become a sponsor!

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/installation/index.html b/_preview/installation/index.html deleted file mode 100644 index f7d49114b2d..00000000000 --- a/_preview/installation/index.html +++ /dev/null @@ -1,1226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Installation - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - -

Installation

-

Use the latest develop branch

-

For configuration options of your build tool please visit SootUp on Jitpack.io

-

Use Releases on Maven Central

-

The code below shows you how to import all submodules of the SootUp repository. -You can import fewer modules if your use case allows it.

-

Add the following dependencies to your pom.xml / build.gradle.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
<dependencies>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.core</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.java.core</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.java.sourcecode</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.java.bytecode</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.jimple.parser</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.callgraph</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.analysis</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.qilin</artifactId>
-        <version>1.3.0</version>
-    </dependency>
-</dependencies>
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
repositories {
-    mavenCentral()
-    google()
-}
-
-compile "org.soot-oss:sootup.core:1.3.0"
-compile "org.soot-oss:sootup.java.core:1.3.0"
-compile "org.soot-oss:sootup.java.sourcecode:1.3.0"
-compile "org.soot-oss:sootup.java.bytecode:1.3.0"
-compile "org.soot-oss:sootup.jimple.parser:1.3.0"
-compile "org.soot-oss:sootup.callgraph:1.3.0"
-compile "org.soot-oss:sootup.analysis:1.3.0"
-compile "org.soot-oss:sootup.qilin:1.3.0"
-
-
-
-
-

Build from Source

-

If you'd like to get the most recent changes, you can build SootUp from source yourself and install it into your local maven repository. -

1
-2
git clone https://github.com/secure-software-engineering/SootUp.git
-mvn install
-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/jimple/index.html b/_preview/jimple/index.html deleted file mode 100644 index c9df824688a..00000000000 --- a/_preview/jimple/index.html +++ /dev/null @@ -1,5984 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Jimple IR - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - - - - - -
-
- - - - - - - -

Jimple

-

What is Jimple? Jimple is the intermediate representation IR of Soot, and thus SootUp. -Soot's intention is to provide a simplified way to analyze JVM bytecode. JVM bytecode is stack-based, which makes it difficult for program analysis. -Java source code, on the other hand, is also not quite suitable for program analysis, due to its nested structures. -Therefore, Jimple aims to bring the best of both worlds, a non-stack-based and flat (non-nested) representation. -For this purpose Jimple was designed as a representation of JVM bytecode which is human readable.

-
-

Info

-

To learn more about jimple, refer to the thesis by Raja Vallee-Rai.

-
-

It might help to visualize how the Jimple version of a Java code looks like. Have a look at the following example on the HelloWorld class.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
public class HelloWorld extends java.lang.Object
-{
-  public void <init>()
-  {
-    HelloWorld r0;
-    r0 := @this: HelloWorld;
-    specialinvoke r0.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public static void main(java.lang.String[])
-  {
-    java.lang.String[] r0;
-    java.io.PrintStream r1;
-
-    r0 := @parameter0: java.lang.String[];
-    r1 = <java.lang.System: java.io.PrintStream out>;
-    virtualinvoke r1.<java.io.PrintStream: 
-    void println(java.lang.String)>("Hello world!");
-    return;
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
public class HelloWorld {
-
-  public HelloWorld() {
-
-  }
-
-  public static void main(String[] var0) {
-    System.out.println("Hello World!");
-  }
-
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
// class version 52.0 (52)
-// access flags 0x21
-public class analysis/HelloWorld {
-
-// compiled from: HelloWorld.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 4 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-  L1
-    LINENUMBER 6 L1
-    RETURN
-  L2
-    LOCALVARIABLE this Lanalysis/HelloWorld; L0 L2 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x9
-public static main([Ljava/lang/String;)V
-  L0
-    LINENUMBER 9 L0
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Hello World!"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L1
-    LINENUMBER 10 L1
-    RETURN
-  L2
-    LOCALVARIABLE var0 [Ljava/lang/String; L0 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-}
-
-
-
-
-

Jimple Grammar Structure

-

Jimple mimics the JVMs class file structure. -Therefore it is object oriented. -A Single Class (or Interface) per file. -Three-Address-Code which means there are no nested expressions. -(nested expressions can be modeled via Locals that store intermediate calculation results.)

-

Class (or Interface)

-

A class consists of Fields and Methods. -It is referenced by its ClassType.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-}
-
-
-
-
1
-2
-3
package target.exercise1;
-
-public class DemoClass {}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-}
-
-
-
-
-

Field

-

A Field is a piece of memory which can store a value that is accessible according to its visibility modifier. -It is referenced by its FieldSignature.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    this.<target.exercise1.DemoClass: double pi> = 3.14;
-    return;
-  }
-}
-/*
-  "this.<target.exercise1.DemoClass: double pi>" is JInstanceFieldRef
-*/
-
-
-
-
1
-2
-3
-4
-5
package target.exercise1;
-
-public class DemoClass {
-  private final double pi = 3.14;
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x12
-private final D pi = 3.14
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-  L1
-    LINENUMBER 4 L1
-    ALOAD 0
-    LDC 3.14
-    PUTFIELD target/exercise1/DemoClass.pi : D
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 3
-    MAXLOCALS = 1
-}
-
-
-
-
-

Method and the Body

-

The interesting part is a method. A method is a "piece of code" that can be executed. -It is referenced by its MethodSignature and contains a StmtGraph that models the sequence of single instructions/statements (Stmts).

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    virtualinvoke this.<target.exercise1.DemoClass: 
-    void demoMethod()>();
-    return;
-  }
-
-  public void demoMethod()
-  {
-    java.io.PrintStream $stack1;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    $stack1 = <java.lang.System: java.io.PrintStream out>;
-
-    virtualinvoke $stack1.<java.io.PrintStream: 
-    void println(java.lang.String)>("Inside method.");
-    return;
-  }
-}
-/*
-  "<target.exercise1.DemoClass: void demoMethod()>" 
-        and "<target.exercise1.DemoClass: void <init>()>" 
-        are instances of SootMethod 
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
package target.exercise1;
-
-public class DemoClass {
-  DemoClass(){
-    demoMethod();
-  }
-  public void demoMethod(){
-    System.out.println("Inside method.");
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x0
-<init>()V
-  L0
-    LINENUMBER 5 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-  L1
-    LINENUMBER 6 L1
-    ALOAD 0
-    INVOKEVIRTUAL target/exercise1/DemoClass.demoMethod ()V
-  L2
-    LINENUMBER 7 L2
-    RETURN
-  L3
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L3 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public demoMethod()V
-  L0
-    LINENUMBER 10 L0
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Inside method."
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L1
-    LINENUMBER 11 L1
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-}
-
-
-
-
-

Signatures

-

Signatures are required for identifying or referencing things across a method, such as Classes, Interfaces, Methods or Fields. -Locals, on the other hand, do not need signatures, since they are referenced within method boundaries.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    this.<target.exercise1.DemoClass: double pi> = 3.14;
-    return;
-  }
-
-  public void demoMethod()
-  {
-    java.io.PrintStream $stack3, $stack5;
-    java.lang.StringBuilder $stack4, $stack6, $stack7;
-    java.lang.String $stack8;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    $stack3 = <java.lang.System: java.io.PrintStream out>;
-
-    virtualinvoke $stack3.<java.io.PrintStream: 
-      void println(java.lang.String)>("pi : 3.14");
-    $stack5 = <java.lang.System: java.io.PrintStream out>;
-    $stack4 = new java.lang.StringBuilder;
-
-    specialinvoke $stack4.<java.lang.StringBuilder: void <init>()>();
-    $stack6 = virtualinvoke $stack4.<java.lang.StringBuilder: 
-      java.lang.StringBuilder append(java.lang.String)>
-        ("pi : ");
-    $stack7 = virtualinvoke $stack6.<java.lang.StringBuilder: 
-      java.lang.StringBuilder append(double)>(3.1415);
-    $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: 
-      java.lang.String toString()>();
-
-    virtualinvoke $stack5.<java.io.PrintStream:     
-      void println(java.lang.String)>($stack8);
-    return;
-  }
-}
-/*
-  For JInstanceFieldRef "this.<target.exercise1.DemoClass: double pi>" 
-    signature is <target.exercise1.DemoClass: double pi>
-  Similarly, we have other signatures like 
-    <java.lang.Object: void <init>()>, 
-    <java.io.PrintStream: void println(java.lang.String)> 
-    and so on. 
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
package target.exercise1;
-
-public class DemoClass {
-  private final double pi = 3.14;
-
-  public void demoMethod(){
-    double localPi = 3.1415;
-    System.out.println("pi : " + pi);
-    System.out.println("pi : " + localPi);
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x12
-private final D pi = 3.14
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-  L1
-    LINENUMBER 4 L1
-    ALOAD 0
-    LDC 3.14
-    PUTFIELD target/exercise1/DemoClass.pi : D
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 3
-    MAXLOCALS = 1
-
-// access flags 0x1
-public demoMethod()V
-  L0
-    LINENUMBER 6 L0
-    LDC 3.1415
-    DSTORE 1
-  L1
-    LINENUMBER 7 L1
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "pi : 3.14"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L2
-    LINENUMBER 8 L2
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    NEW java/lang/StringBuilder
-    DUP
-    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
-    LDC "pi : "
-      INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)
-        Ljava/lang/StringBuilder;
-    DLOAD 1
-    INVOKEVIRTUAL java/lang/StringBuilder.append (D)Ljava/lang/StringBuilder;
-    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L3
-    LINENUMBER 9 L3
-    RETURN
-  L4
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0
-    LOCALVARIABLE localPi D L1 L4 1
-    MAXSTACK = 4
-    MAXLOCALS = 3
-}
-
-
-
-
-

Trap

-

A Trap is a mechanism to model exceptional flow.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public void divideExample(int, int)
-  {
-    int x, y, $stack4;
-    java.io.PrintStream $stack5, $stack7;
-    java.lang.Exception $stack6;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    x := @parameter0: int;
-    y := @parameter1: int;
-
-   label1:
-      $stack5 = <java.lang.System: java.io.PrintStream out>;
-      $stack4 = x / y;
-      virtualinvoke $stack5.<java.io.PrintStream: void println(int)>($stack4);
-
-   label2:
-      goto label4;
-
-   label3:
-      $stack6 := @caughtexception;
-      $stack7 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack7.<java.io.PrintStream: 
-        void println(java.lang.String)>("Exception caught");
-
-   label4:
-      return;
-
-      catch java.lang.Exception from label1 to label2 with label3;
-  }
-}
-/*
-  By calling getTraps() method, we can get the Traip chain.
-  For the above jimple code, we have the below trap:
-  Trap :
-  begin  : $stack5 = <java.lang.System: java.io.PrintStream out>
-  end    : goto [?= return]
-  handler: $stack6 := @caughtexception
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
package target.exercise1;
-
-public class DemoClass {
-  public void divideExample(int x, int y){
-    try {
-      System.out.println(x / y);
-    }catch (Exception e){
-      System.out.println("Exception caught");
-    }
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-    L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public divideExample(II)V
-  TRYCATCHBLOCK L0 L1 L2 java/lang/Exception
-  L0
-    LINENUMBER 6 L0
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 1
-    ILOAD 2
-    IDIV
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L1
-    LINENUMBER 9 L1
-    GOTO L3
-  L2
-    LINENUMBER 7 L2
-    FRAME SAME1 java/lang/Exception
-    ASTORE 3
-  L4
-    LINENUMBER 8 L4
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Exception caught"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L3
-    LINENUMBER 10 L3
-    FRAME SAME
-    RETURN
-  L5
-    LOCALVARIABLE e Ljava/lang/Exception; L4 L3 3
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0
-    LOCALVARIABLE x I L0 L5 1
-    LOCALVARIABLE y I L0 L5 2
-    MAXSTACK = 3
-    MAXLOCALS = 4
-}
-
-
-
-
-

Stmt

-

The main piece of Jimple is a Statement (Stmt). Stmts represent that can be executed by the JVM.

-

Branching Statements

-

A BranchingStmt's job is to model the flow between Stmts.

-
JGotoStmt
-

for unconditional flow.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-  public static void sampleMethod()
-  {
-    int i;
-    i = 0;
-
-    label1:
-      if i >= 5 goto label3;
-      if i != 3 goto label2;
-      goto label3;
-
-    label2:
-      i = i + 1;
-      goto label1;
-
-    label3:
-      return;
-  }
-}
-/*
-  Here for statements "goto label3;" and "goto label1;", 
-  we have two instances of JGotoStmt : 
-    "goto[?=return]" and "goto[?=(branch)]".
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
package target.exercise1;
-
-public class DemoClass {
-  public static void sampleMethod(){
-    label1:
-    for (int i = 0; i < 5; i++){
-      if(i == 3){
-        break label1;
-      }
-    }
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x9
-public static sampleMethod()V
-  L0
-    LINENUMBER 6 L0
-    ICONST_0
-    ISTORE 0
-  L1
-    FRAME APPEND [I]
-    ILOAD 0
-    ICONST_5
-    IF_ICMPGE L2
-  L3
-    LINENUMBER 7 L3
-    ILOAD 0
-    ICONST_3
-    IF_ICMPNE L4
-  L5
-    LINENUMBER 8 L5
-    GOTO L2
-  L4
-    LINENUMBER 6 L4
-    FRAME SAME
-    IINC 0 1
-    GOTO L1
-  L2
-    LINENUMBER 11 L2
-    FRAME CHOP 1
-    RETURN
-    LOCALVARIABLE i I L1 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-}
-
-
-
-
-
JIfStmt
-

for conditional flow depending on boolean Expression (AbstractConditionExpr) so they have two successor Stmt's.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
public class target.exercise1.DemoClass extends java.lang.Object
-{
-   public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public static void sampleMethod(int)
-  {
-    int x, $stack1;
-    java.io.PrintStream $stack2, $stack3;
-
-    x := @parameter0: int;
-
-    $stack1 = x % 2;
-    if $stack1 != 0 goto label1;
-
-    $stack3 = <java.lang.System: java.io.PrintStream out>;
-    virtualinvoke $stack3.<java.io.PrintStream: 
-      void println(java.lang.String)>("Even");
-    goto label2;
-
-    label1:
-      $stack2 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack2.<java.io.PrintStream: 
-        void println(java.lang.String)>("Odd");
-
-    label2:
-      return;
-  }
-}
-/*
-  For statement "if $stack1 != 0 goto label1;", 
-  we have an instance of JIfStmt :
-    "if $stack1 != 0 goto $stack2 
-        = <java.lang.System:java.io.PrintStream out>".
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
package target.exercise1;
-
-public class DemoClass {
-  public static void sampleMethod(int x){
-    if(x % 2 == 0){
-      System.out.println("Even");
-    }else{
-      System.out.println("Odd");
-    }
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x9
-public static sampleMethod(I)V
-  L0
-    LINENUMBER 5 L0
-    ILOAD 0
-    ICONST_2
-    IREM
-    IFNE L1
-  L2
-    LINENUMBER 6 L2
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Even"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-    GOTO L3
-  L1
-    LINENUMBER 8 L1
-    FRAME SAME
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Odd"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L3
-    LINENUMBER 10 L3
-    FRAME SAME
-    RETURN
-  L4
-    LOCALVARIABLE x I L0 L4 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-}
-
-
-
-
-
JSwitchStmt
-

for conditional flow that behaves like a switch-case. It has #numberOfCaseLabels+1 (for default) successor Stmt's.

-

All other Stmts are not manipulating the flow, which means they have a single successor Stmt as long as they are not exiting the flow inside a method.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public void switchExample(int)
-  {
-    int x;
-    java.io.PrintStream $stack2, $stack3, $stack4;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    x := @parameter0: int;
-
-    lookupswitch(x)
-    {
-      case 1: goto label1;
-      case 2: goto label2;
-      default: goto label3;
-    };
-
-    label1:
-      $stack3 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack3.<java.io.PrintStream: 
-        void println(java.lang.String)>("Input 1");
-      goto label4;
-
-    label2:
-      $stack2 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack2.<java.io.PrintStream: 
-        void println(java.lang.String)>("Input 2");
-      goto label4;
-
-    label3:
-      $stack4 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack4.<java.io.PrintStream: 
-        void println(java.lang.String)>("Input more than 2");
-
-    label4:
-      return;
-  }
-}
-/*
-  Here for below statement:
-    lookupswitch(x)
-      {
-        case 1: goto label1;
-        case 2: goto label2;
-        default: goto label3;
-      };
-
-  we have an instance of JLookupSwitchStmt :
-    lookupswitch(x) 
-      {     
-        case 1: goto $stack3 
-                        = <java.lang.System: java.io.PrintStream out>;     
-        case 2: goto $stack2 
-                        = <java.lang.System: java.io.PrintStream out>;     
-        default: goto $stack4 
-                        = <java.lang.System: java.io.PrintStream out>; 
-      }
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
package target.exercise1;
-
-public class DemoClass {
-  public void switchExample(int x){
-    switch (x){
-      case 1:
-        System.out.println("Input 1");
-        break;
-
-      case 2:
-        System.out.println("Input 2");
-        break;
-
-      default:
-        System.out.println("Input more than 2");
-        break;
-
-    }
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public switchExample(I)V
-  L0
-    LINENUMBER 5 L0
-    ILOAD 1
-    LOOKUPSWITCH
-    1: L1
-    2: L2
-    default: L3
-  L1
-    LINENUMBER 7 L1
-    FRAME SAME
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Input 1"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L4
-    LINENUMBER 8 L4
-    GOTO L5
-  L2
-    LINENUMBER 11 L2
-    FRAME SAME
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Input 2"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L6
-    LINENUMBER 12 L6
-    GOTO L5
-  L3
-    LINENUMBER 15 L3
-    FRAME SAME
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Input more than 2"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L5
-    LINENUMBER 19 L5
-    FRAME SAME
-    RETURN
-  L7
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L7 0
-    LOCALVARIABLE x I L0 L7 1
-    MAXSTACK = 2
-    MAXLOCALS = 2
-}
-
-
-
-
-
JReturnStmt & JReturnVoidStmt
-

They end the execution/flow inside the current method and return (a value) to its caller.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public int increment(int)
-  {
-    int x, $stack2;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    x := @parameter0: int;
-
-    $stack2 = x + 1;
-    return $stack2;
-  }
-
-  public void print()
-  {
-    java.io.PrintStream $stack1;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    $stack1 = <java.lang.System: java.io.PrintStream out>;
-    virtualinvoke $stack1.<java.io.PrintStream: 
-      void println(java.lang.String)>("Inside method print");
-    return;
-  }
-}
-/*
-  "return $stack2" is JReturnStmt.
-  "return" is JReturnVoidStmt.
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
package target.exercise1;
-
-public class DemoClass {
-  public int increment(int x){
-    return x + 1;
-  }
-  public void print(){
-    System.out.println("Inside method print");
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public increment(I)I
-  L0
-    LINENUMBER 5 L0
-    ILOAD 1
-    ICONST_1
-    IADD
-    IRETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    LOCALVARIABLE x I L0 L1 1
-    MAXSTACK = 2
-    MAXLOCALS = 2
-
-// access flags 0x1
-public print()V
-  L0
-    LINENUMBER 8 L0
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "Inside method print"
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L1
-    LINENUMBER 9 L1
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-}
-
-
-
-
-
JThrowStmt
-

Ends the execution inside the current Method if the thrown exception is not caught by a Trap, which redirects the execution to an exceptionhandler.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public void divideExample(int, int)
-  {
-    int y, x, $stack6;
-    java.lang.StringBuilder $stack3, $stack5, $stack7;
-    java.io.PrintStream $stack4;
-    java.lang.String $stack8;
-    java.lang.RuntimeException $stack9;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    x := @parameter0: int;
-    y := @parameter1: int;
-
-    if y != 0 goto label1;
-
-    $stack9 = new java.lang.RuntimeException;
-    specialinvoke $stack9.<java.lang.RuntimeException: 
-      void <init>(java.lang.String)>("Divide by zero error");
-    throw $stack9;
-
-    label1:
-      $stack4 = <java.lang.System: java.io.PrintStream out>;
-      $stack3 = new java.lang.StringBuilder;
-      specialinvoke $stack3.<java.lang.StringBuilder: void <init>()>();
-
-      $stack5 = virtualinvoke $stack3.<java.lang.StringBuilder: 
-        java.lang.StringBuilder append(java.lang.String)>("Divide result : ");
-      $stack6 = x / y;
-      $stack7 = virtualinvoke $stack5.<java.lang.StringBuilder: 
-        java.lang.StringBuilder append(int)>($stack6);
-      $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: 
-        java.lang.String toString()>();
-
-      virtualinvoke $stack4.<java.io.PrintStream: 
-        void println(java.lang.String)>($stack8);
-      return;
-  }
-}
-/*
-  "throw $stack9" is JThrowStmt.
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
package target.exercise1;
-
-public class DemoClass {
-  public void divideExample(int x, int y){
-    if(y == 0){
-      throw new RuntimeException("Divide by zero error");
-    }
-    System.out.println("Divide result : " + x / y);
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public divideExample(II)V
-  L0
-    LINENUMBER 5 L0
-    ILOAD 2
-    IFNE L1
-  L2
-    LINENUMBER 6 L2
-    NEW java/lang/RuntimeException
-    DUP
-    LDC "Divide by zero error"
-    INVOKESPECIAL java/lang/RuntimeException.<init> 
-      (Ljava/lang/String;)V
-    ATHROW
-  L1
-    LINENUMBER 8 L1
-    FRAME SAME
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    NEW java/lang/StringBuilder
-    DUP
-    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
-    LDC "Divide result : "
-    INVOKEVIRTUAL java/lang/StringBuilder.append 
-      (Ljava/lang/String;)Ljava/lang/StringBuilder;
-    ILOAD 1
-    ILOAD 2
-    IDIV
-    INVOKEVIRTUAL java/lang/StringBuilder.append 
-      (I)Ljava/lang/StringBuilder;
-    INVOKEVIRTUAL java/lang/StringBuilder.toString 
-      ()Ljava/lang/String;
-    INVOKEVIRTUAL java/io/PrintStream.println 
-      (Ljava/lang/String;)V
-  L3
-    LINENUMBER 9 L3
-    RETURN
-  L4
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0
-    LOCALVARIABLE x I L0 L4 1
-    LOCALVARIABLE y I L0 L4 2
-    MAXSTACK = 4
-    MAXLOCALS = 3
-}
-
-
-
-
-
JInvokeStmt
-

transfers the control flow to another method until the called method returns.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public void print(int)
-  {
-    target.exercise1.DemoClass this;
-    int x, a;
-    java.io.PrintStream $stack4, $stack6;
-
-    this := @this: target.exercise1.DemoClass;
-    x := @parameter0: int;
-
-    a = virtualinvoke this.<target.exercise1.DemoClass: 
-      int increment(int)>(x);
-    $stack4 = <java.lang.System: java.io.PrintStream out>;
-    virtualinvoke $stack4.<java.io.PrintStream: 
-      void println(int)>(a);
-
-    a = virtualinvoke this.<target.exercise1.DemoClass: 
-      int increment(int)>(a);
-    $stack6 = <java.lang.System: java.io.PrintStream out>;
-    virtualinvoke $stack6.<java.io.PrintStream: 
-      void println(int)>(a);
-
-    return;
-  }
-
-  public int increment(int)
-  {
-    int x, $stack2;
-    target.exercise1.DemoClass this;
-
-    this := @this: target.exercise1.DemoClass;
-    x := @parameter0: int;
-
-    $stack2 = x + 1;
-    return $stack2;
-  }
-}
-/*
-  "specialinvoke this.<java.lang.Object: void <init>()>()", 
-  "virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(x)", 
-  "virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(a)" 
-    are JInvokeStmts.
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
package target.exercise1;
-
-public class DemoClass {
-  public void print(int x){
-    int a = increment(x);
-    System.out.println(a);
-    a = increment(a);
-    System.out.println(a);
-  }
-  public int increment(int x){
-    return x + 1;
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public print(I)V
-  L0
-    LINENUMBER 5 L0
-    ALOAD 0
-    ILOAD 1
-    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I
-    ISTORE 2
-  L1
-    LINENUMBER 6 L1
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 2
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L2
-    LINENUMBER 7 L2
-    ALOAD 0
-    ILOAD 2
-    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I
-    ISTORE 2
-  L3
-    LINENUMBER 8 L3
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 2
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L4
-    LINENUMBER 9 L4
-    RETURN
-  L5
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0
-    LOCALVARIABLE x I L0 L5 1
-    LOCALVARIABLE a I L1 L5 2
-    MAXSTACK = 2
-    MAXLOCALS = 3
-
-// access flags 0x1
-public increment(I)I
-  L0
-    LINENUMBER 11 L0
-    ILOAD 1
-    ICONST_1
-    IADD
-    IRETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    LOCALVARIABLE x I L0 L1 1
-    MAXSTACK = 2
-    MAXLOCALS = 2
-}
-
-
-
-
-
JAssignStmt
-

assigns a Value from the right hand-side to the left hand-side. -Left hand-side of an assignment can be a Local referencing a variable (i.e. a Local) or a FieldRef referencing a Field. -Right hand-side of an assignment can be an expression (Expr), a Local, a FieldRef or a Constant.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    this.<target.exercise1.DemoClass: int counter> = 0;
-    return;
-  }
-
-  public int updateCounter()
-  {
-    target.exercise1.DemoClass this;
-    int $stack1, $stack2, $stack3;
-
-    this := @this: target.exercise1.DemoClass;
-
-    $stack1 = this.<target.exercise1.DemoClass: int counter>;
-    $stack2 = $stack1 + 1;
-    this.<target.exercise1.DemoClass: int counter> = $stack2;
-    $stack3 = this.<target.exercise1.DemoClass: int counter>;
-
-    return $stack3;
-  }
-}
-/*
-  "this.<target.exercise1.DemoClass: int counter> = 0", 
-  "$stack1 = this.<target.exercise1.DemoClass: int counter>",
-  "$stack2 = $stack1 + 1"
-  "this.<target.exercise1.DemoClass: int counter> = $stack2"
-  "$stack3 = this.<target.exercise1.DemoClass: int counter>"
-    are JAssignStmts.
-*/
-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
-9
package target.exercise1;
-
-public class DemoClass {
-  private int counter = 0;
-  public int updateCounter(){
-    counter = counter + 1;
-    return counter;
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x2
-private I counter
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-  L1
-    LINENUMBER 4 L1
-    ALOAD 0
-    ICONST_0
-    PUTFIELD target/exercise1/DemoClass.counter : I
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-
-// access flags 0x1
-public updateCounter()I
-  L0
-    LINENUMBER 6 L0
-    ALOAD 0
-    ALOAD 0
-    GETFIELD target/exercise1/DemoClass.counter : I
-    ICONST_1
-    IADD
-    PUTFIELD target/exercise1/DemoClass.counter : I
-  L1
-    LINENUMBER 7 L1
-    ALOAD 0
-    GETFIELD target/exercise1/DemoClass.counter : I
-    IRETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 3
-    MAXLOCALS = 1
-}
-
-
-
-
-
JIdentityStmt
-

is semantically like the JAssignStmt and handles assignments of IdentityRef's to make implicit assignments explicit into the StmtGraph.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    return;
-  }
-
-  public void DemoClass(int)
-  {
-    target.exercise1.DemoClass this;
-    int counter;
-
-    this := @this: target.exercise1.DemoClass;
-    counter := @parameter0: int;
-    this.<target.exercise1.DemoClass: int counter> = counter;
-    return;
-  }
-}
-/*
-  "this := @this: target.exercise1.DemoClass" and 
-    "counter := @parameter0: int" are JIdentityStmts
-*/
-
-
-
-
1
-2
-3
-4
-5
-6
-7
-8
package target.exercise1;
-
-public class DemoClass {
-  private int counter;
-  public void DemoClass(int counter){
-    this.counter = counter;
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x2
-private I counter
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public DemoClass(I)V
-  L0
-    LINENUMBER 6 L0
-    ALOAD 0
-    ILOAD 1
-    PUTFIELD target/exercise1/DemoClass.counter : I
-  L1
-    LINENUMBER 7 L1
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    LOCALVARIABLE counter I L0 L2 1
-    MAXSTACK = 2
-    MAXLOCALS = 2
-}
-
-
-
-
-
JEnterMonitorStmt & JExitMonitorStmt
-

marks synchronized blocks of code from JEnterMonitorStmt to JExitMonitorStmt.

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-    target.exercise1.DemoClass this;
-    this := @this: target.exercise1.DemoClass;
-    specialinvoke this.<java.lang.Object: void <init>()>();
-    this.<target.exercise1.DemoClass: int counter> = 0;
-    return;
-  }
-
-  public int updateCounter()
-  {
-    target.exercise1.DemoClass this;
-    int $stack4, $stack5, $stack7;
-    java.lang.Throwable $stack8;
-
-    this := @this: target.exercise1.DemoClass;
-
-    entermonitor this;
-
-    label1:
-      $stack4 = this.<target.exercise1.DemoClass: int counter>;
-      $stack5 = $stack4 + 1;
-      this.<target.exercise1.DemoClass: int counter> = $stack5;
-
-      exitmonitor this;
-
-    label2:
-      goto label5;
-
-    label3:
-      $stack8 := @caughtexception;
-
-      exitmonitor this;
-
-    label4:
-      throw $stack8;
-
-    label5:
-      $stack7 = this.<target.exercise1.DemoClass: int counter>;
-      return $stack7;
-
-      catch java.lang.Throwable from label1 to label2 with label3;
-      catch java.lang.Throwable from label3 to label4 with label3;
-  }
-}
-/*
-  "entermonitor this" is JEnterMonitorStmt.
-  "exitmonitor this" is JExitMonitorStmt.
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
package target.exercise1;
-
-public class DemoClass {
-  private int counter = 0;
-  public int updateCounter(){
-    synchronized (this) {
-      counter = counter + 1;
-    }
-    return counter;
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x2
-private I counter
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-  L1
-    LINENUMBER 4 L1
-    ALOAD 0
-    ICONST_0
-    PUTFIELD target/exercise1/DemoClass.counter : I
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-
-// access flags 0x1
-public updateCounter()I
-    TRYCATCHBLOCK L0 L1 L2 null
-    TRYCATCHBLOCK L2 L3 L2 null
-  L4
-    LINENUMBER 6 L4
-    ALOAD 0
-    DUP
-    ASTORE 1
-    MONITORENTER
-  L0
-    LINENUMBER 7 L0
-    ALOAD 0
-    ALOAD 0
-    GETFIELD target/exercise1/DemoClass.counter : I
-    ICONST_1
-    IADD
-    PUTFIELD target/exercise1/DemoClass.counter : I
-  L5
-    LINENUMBER 8 L5
-    ALOAD 1
-    MONITOREXIT
-  L1
-    GOTO L6
-  L2
-    FRAME FULL [target/exercise1/DemoClass java/lang/Object] 
-      [java/lang/Throwable]
-    ASTORE 2
-    ALOAD 1
-    MONITOREXIT
-  L3
-    ALOAD 2
-    ATHROW
-  L6
-    LINENUMBER 9 L6
-    FRAME CHOP 1
-    ALOAD 0
-    GETFIELD target/exercise1/DemoClass.counter : I
-    IRETURN
-  L7
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L4 L7 0
-    MAXSTACK = 3
-    MAXLOCALS = 3
-}
-
-
-
-
-
JRetStmt
-
JBreakpointStmt
-

models a Breakpoint set by a Debugger (usually not relevant for static analyses)

-

Immediate

-

An Immediate has a given Type and consists of a Local ("a Variable", "Something that contains a Value") or a Constant ("Something that is a Value").

-

Type

-

VoidType

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-  target.exercise1.DemoClass this;
-  this := @this: target.exercise1.DemoClass;
-  specialinvoke this.<java.lang.Object: void <init>()>();
-  return;
-  }
-
-  public void voidMethod()
-  {
-  java.io.PrintStream $stack1;
-  target.exercise1.DemoClass this;
-  this := @this: target.exercise1.DemoClass;
-  $stack1 = <java.lang.System: java.io.PrintStream out>;
-  virtualinvoke $stack1.<java.io.PrintStream: 
-      void println(java.lang.String)>("In voidMethod().");
-  return;
-  }
-}
-/*
-  For the SootMethod - <target.exercise1.DemoClass: void voidMethod()>, 
-    returnType is instance of VoidType.
-*/
-
-
-
-
1
-2
-3
-4
-5
-6
-7
package target.exercise1;
-
-public class DemoClass {
-  public void voidMethod(){
-  System.out.println("In voidMethod().");
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public voidMethod()V
-  L0
-    LINENUMBER 5 L0
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LDC "In voidMethod()."
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
-  L1
-    LINENUMBER 6 L1
-    RETURN
-  L2
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0
-    MAXSTACK = 2
-    MAXLOCALS = 1
-}
-
-
-
-
-

PrimaryType

-

BooleanType, ByteType, CharType, ShortType, IntType, LongType, DoubleType, FloatType

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
public class target.exercise1.DemoClass extends java.lang.Object
-{
-  public void <init>()
-  {
-      target.exercise1.DemoClass this;
-      this := @this: target.exercise1.DemoClass;
-      specialinvoke this.<java.lang.Object: void <init>()>();
-      return;
-  }
-
-
-  public void display()
-  {
-      java.io.PrintStream $stack11, $stack13, $stack15, 
-        $stack17, $stack19, $stack21, $stack23, $stack25;
-      int $stack12, $stack14, $stack16, $stack18;
-      long $stack20;
-      double $stack22;
-      float $stack24;
-      target.exercise1.DemoClass this;
-      boolean $stack26;
-
-      this := @this: target.exercise1.DemoClass;
-
-      $stack11 = <java.lang.System: java.io.PrintStream out>;
-
-      goto label1;
-
-   label1:
-      $stack26 = 0;
-      virtualinvoke $stack11.<java.io.PrintStream: 
-        void println(boolean)>($stack26);
-
-      $stack13 = <java.lang.System: java.io.PrintStream out>;
-      $stack12 = 127 - 1;
-      virtualinvoke $stack13.<java.io.PrintStream: 
-        void println(int)>($stack12);
-
-      $stack15 = <java.lang.System: java.io.PrintStream out>;
-      $stack14 = 97 + 1;
-      virtualinvoke $stack15.<java.io.PrintStream: 
-        void println(int)>($stack14);
-
-      $stack17 = <java.lang.System: java.io.PrintStream out>;
-      $stack16 = 1123 + 1;
-      virtualinvoke $stack17.<java.io.PrintStream: 
-        void println(int)>($stack16);
-
-      $stack19 = <java.lang.System: java.io.PrintStream out>;
-      $stack18 = 123456 + 1;
-      virtualinvoke $stack19.<java.io.PrintStream: 
-        void println(int)>($stack18);
-
-      $stack21 = <java.lang.System: java.io.PrintStream out>;
-      $stack20 = 10L + 1L;
-      virtualinvoke $stack21.<java.io.PrintStream: 
-        void println(long)>($stack20);
-
-      $stack23 = <java.lang.System: java.io.PrintStream out>;
-      $stack22 = 10.1 + 1.0;
-      virtualinvoke $stack23.<java.io.PrintStream: 
-        void println(double)>($stack22);
-
-      $stack25 = <java.lang.System: java.io.PrintStream out>;
-      $stack24 = 10.1F + 1.0F;
-      virtualinvoke $stack25.<java.io.PrintStream: 
-        void println(float)>($stack24);
-
-      return;
-  }
-}
-/*
-  The JimpleLocal $stack12, $stack14, $stack16, $stack18 are of IntType. 
-  Similarly, $stack20 is of LongType, $stack22 is of DoubleType and so on.
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
package target.exercise1;
-
-public class DemoClass {
-  public void display(){
-    boolean varBoolean = true;
-    byte varByte = 127;
-    char varChar = 'a';
-    short varShort = 1123;
-    int varInt = 123456;
-    long varLong = 10L;
-    double varDouble = 10.10;
-    float varFloat = 10.10f;
-
-    System.out.println(!varBoolean);
-    System.out.println(varByte-1);
-    System.out.println(varChar+1);
-    System.out.println(varShort+1);
-    System.out.println(varInt+1);
-    System.out.println(varLong+1);
-    System.out.println(varDouble+1);
-    System.out.println(varFloat+1);
-
-  }
-}
-
-
-
-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public display()V
-  L0
-    LINENUMBER 5 L0
-    ICONST_1
-    ISTORE 1
-  L1
-    LINENUMBER 6 L1
-    BIPUSH 127
-    ISTORE 2
-  L2
-    LINENUMBER 7 L2
-    BIPUSH 97
-    ISTORE 3
-  L3
-    LINENUMBER 8 L3
-    SIPUSH 1123
-    ISTORE 4
-  L4
-    LINENUMBER 9 L4
-    LDC 123456
-    ISTORE 5
-  L5
-    LINENUMBER 10 L5
-    LDC 10
-    LSTORE 6
-  L6
-    LINENUMBER 11 L6
-    LDC 10.1
-    DSTORE 8
-  L7
-    LINENUMBER 12 L7
-    LDC 10.1
-    FSTORE 10
-  L8
-    LINENUMBER 14 L8
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 1
-    IFNE L9
-    ICONST_1
-    GOTO L10
-  L9
-    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] 
-      [java/io/PrintStream]
-    ICONST_0
-  L10
-    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] 
-      [java/io/PrintStream I]
-    INVOKEVIRTUAL java/io/PrintStream.println (Z)V
-  L11
-    LINENUMBER 15 L11
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 2
-    ICONST_1
-    ISUB
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L12
-    LINENUMBER 16 L12
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 3
-    ICONST_1
-    IADD
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L13
-    LINENUMBER 17 L13
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 4
-    ICONST_1
-    IADD
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L14
-    LINENUMBER 18 L14
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 5
-    ICONST_1
-    IADD
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L15
-    LINENUMBER 19 L15
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    LLOAD 6
-    LCONST_1
-    LADD
-    INVOKEVIRTUAL java/io/PrintStream.println (J)V
-  L16
-    LINENUMBER 20 L16
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    DLOAD 8
-    DCONST_1
-    DADD
-    INVOKEVIRTUAL java/io/PrintStream.println (D)V
-  L17
-    LINENUMBER 21 L17
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    FLOAD 10
-    FCONST_1
-    FADD
-    INVOKEVIRTUAL java/io/PrintStream.println (F)V
-  L18
-    LINENUMBER 23 L18
-    RETURN
-  L19
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L19 0
-    LOCALVARIABLE varBoolean Z L1 L19 1
-    LOCALVARIABLE varByte B L2 L19 2
-    LOCALVARIABLE varChar C L3 L19 3
-    LOCALVARIABLE varShort S L4 L19 4
-    LOCALVARIABLE varInt I L5 L19 5
-    LOCALVARIABLE varLong J L6 L19 6
-    LOCALVARIABLE varDouble D L7 L19 8
-    LOCALVARIABLE varFloat F L8 L19 10
-    MAXSTACK = 5
-    MAXLOCALS = 11
-}
-
-
-
-
-

ReferenceType

-

ClassType, -ArrayType -NullType

-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
public class target.exercise1.DemoClass extends java.lang.Object
-{
-public void <init>()
-  {
-  target.exercise1.DemoClass this;
-  this := @this: target.exercise1.DemoClass;
-  specialinvoke this.<java.lang.Object: void <init>()>();
-  return;
-  }
-
-  public target.exercise1.DemoClass getObject(target.exercise1.DemoClass)
-  {
-  target.exercise1.DemoClass obj, this;
-  this := @this: target.exercise1.DemoClass;
-  obj := @parameter0: target.exercise1.DemoClass;
-  return obj;
-  }
-
-  public void compute(boolean)
-  {
-  int[] b;
-  java.io.PrintStream $stack5, $stack6;
-  boolean check;
-  target.exercise1.DemoClass this;
-  int i;
-  null_type r0;
-  java.lang.NullPointerException soot0;
-  this := @this: target.exercise1.DemoClass;
-  check := @parameter0: boolean;
-  b = newarray (int)[5];
-  i = 0;
-
-  label1:
-    if i >= 5 goto label3;
-      if check == 0 goto label2;
-      r0 = (null_type) i;
-      soot0 = new java.lang.NullPointerException;
-      specialinvoke soot0.<java.lang.NullPointerException: 
-        void <init>(java.lang.String)>
-          ("This statement would have triggered an Exception: a[i#1] = r0");
-      throw soot0;
-
-  label2:
-  b[i] = i;
-      i = i + 1;
-      goto label1;
-
-  label3:
-      $stack5 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack5.<java.io.PrintStream: 
-        void println(java.lang.Object)>(b);
-      $stack6 = <java.lang.System: java.io.PrintStream out>;
-      virtualinvoke $stack6.<java.io.PrintStream: 
-        void println(java.lang.Object)>(null);
-      return;
-  }
-}
-/*
-  The JimpleLocal b is of ArrayType,
-    and JimpleLocal r0 is of NullType.
-*/
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
package target.exercise1;
-
-public class DemoClass {
-
-  public DemoClass getObject(DemoClass obj){
-    return obj;
-  }
-
-  public void compute(boolean check){
-    int a[] = null;
-    int b[] = new int[5];
-    for (int i = 0; i < 5; i++) {
-      if(check){
-        a[i] = i;
-      }
-        b[i] = i;
-    }
-    System.out.println(b);
-    System.out.println(a);
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public getObject(Ltarget/exercise1/DemoClass;)Ltarget/exercise1/DemoClass;
-  L0
-    LINENUMBER 6 L0
-    ALOAD 1
-    ARETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    LOCALVARIABLE obj Ltarget/exercise1/DemoClass; L0 L1 1
-    MAXSTACK = 1
-    MAXLOCALS = 2
-
-// access flags 0x1
-public compute(Z)V
-  L0
-    LINENUMBER 10 L0
-    ACONST_NULL
-    ASTORE 2
-  L1
-    LINENUMBER 11 L1
-    ICONST_5
-    NEWARRAY T_INT
-    ASTORE 3
-  L2
-    LINENUMBER 12 L2
-    ICONST_0
-    ISTORE 4
-  L3
-    FRAME APPEND [[I [I I]
-    ILOAD 4
-    ICONST_5
-    IF_ICMPGE L4
-  L5
-    LINENUMBER 13 L5
-    ILOAD 1
-    IFEQ L6
-  L7
-    LINENUMBER 14 L7
-    ALOAD 2
-    ILOAD 4
-    ILOAD 4
-    IASTORE
-  L6
-    LINENUMBER 16 L6
-    FRAME SAME
-    ALOAD 3
-    ILOAD 4
-    ILOAD 4
-    IASTORE
-  L8
-    LINENUMBER 12 L8
-    IINC 4 1
-    GOTO L3
-  L4
-    LINENUMBER 18 L4
-    FRAME CHOP 1
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ALOAD 3
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
-  L9
-    LINENUMBER 19 L9
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ALOAD 2
-    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
-  L10
-    LINENUMBER 20 L10
-    RETURN
-  L11
-    LOCALVARIABLE i I L3 L4 4
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L11 0
-    LOCALVARIABLE check Z L0 L11 1
-    LOCALVARIABLE a [I L1 L11 2
-    LOCALVARIABLE b [I L2 L11 3
-    MAXSTACK = 3
-    MAXLOCALS = 5
-}
-
-
-
-
-

Local

-

jimple -i0 -A Local is a variable and its scope is inside its method i.e. no referencing from outside a method. -Values can be assigned to Locals via JIdentityStmt or JAssignStmt.

-
-
-
-

```jimple -public class target.exercise1.DemoClass extends java.lang.Object -{ - public void () - { - target.exercise1.DemoClass this; - this := @this: target.exercise1.DemoClass; - specialinvoke this.()>(); - return; - }

-

public void compute() - { - java.io.PrintStream $stack2, $stack3; - target.exercise1.DemoClass this; - int local#2;

-
1
-2
-3
-4
-5
-6
-7
-8
this := @this: target.exercise1.DemoClass;
-$stack2 = <java.lang.System: java.io.PrintStream out>;
-virtualinvoke $stack2.<java.io.PrintStream: void println(int)>(1);
-
-local#2 = this.<target.exercise1.DemoClass: int global>;
-$stack3 = <java.lang.System: java.io.PrintStream out>;
-virtualinvoke $stack3.<java.io.PrintStream: void println(int)>(local#2);
-return;
-
-

} -} -/* - $stack2, this, $stack3, local#2 are all JimpleLocal.

-

"this := @this: target.exercise1.DemoClass" is JIdentityStmt

-

"$stack2 = ", - "local#2 = this.", - "$stack3 = " - are JAssignStmt

-

*/
-```

-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
package target.exercise1;
-
-public class DemoClass {
-
-  private int global;
-
-  public void compute(){
-    int local;
-    local = 1;
-    System.out.println(local);
-    local = this.global;
-    System.out.println(local);
-  }
-}
-
-
-
-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
// class version 52.0 (52)
-// access flags 0x21
-public class target/exercise1/DemoClass {
-
-// compiled from: DemoClass.java
-
-// access flags 0x2
-private I global
-
-// access flags 0x1
-public <init>()V
-  L0
-    LINENUMBER 3 L0
-    ALOAD 0
-    INVOKESPECIAL java/lang/Object.<init> ()V
-    RETURN
-  L1
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0
-    MAXSTACK = 1
-    MAXLOCALS = 1
-
-// access flags 0x1
-public compute()V
-  L0
-    LINENUMBER 9 L0
-    ICONST_1
-    ISTORE 1
-  L1
-    LINENUMBER 10 L1
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 1
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L2
-    LINENUMBER 11 L2
-    ALOAD 0
-    GETFIELD target/exercise1/DemoClass.global : I
-    ISTORE 1
-  L3
-    LINENUMBER 12 L3
-    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
-    ILOAD 1
-    INVOKEVIRTUAL java/io/PrintStream.println (I)V
-  L4
-    LINENUMBER 14 L4
-    RETURN
-  L5
-    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0
-    LOCALVARIABLE local I L1 L5 1
-    MAXSTACK = 2
-    MAXLOCALS = 2
-}
-
-
-
-
-

Constant

-

represents a value itself. don't confuse it with a variable/Local which has a immutable (i.e. final) attribute.

-

There exists a constant entity for every Type - that way all value types can have a representation.

-

Expr

-

An expression is a language construct that returns a value. E.g. a binary operation such as addition.

-

Ref

-

JArrayRef

-

jimple -$arr[1] -referencing a position inside an array.

-

JFieldRef (JStaticFieldRef & JInstanceFieldRef)

-

jimple -<SomePackage.ExampleClass: fieldname> -// or -r1.<SomePackage.ExampleClass: fieldname> -referencing a Field via its FieldSignature and if necessary (i.e. with JInstanceFieldRef) the corresponding Local instance that points to the object instance.

-

IdentityRef

-

The IdentityRef makes those implicit special value assignments explicit.

-
JThisRef
-

jimple -@this: package.fruit.Banana -represents the this pointer of the current class.

-
JCaughtExceptionRef
-

jimple -@caughtexception -represents the value of the thrown exception (caught by this exceptionhandler).

-
JParameterRef
-

jimple -i0 := @parameter0 -i1 := @parameter1 -represents a parameter of a method, identified by its index.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/qilin/index.html b/_preview/qilin/index.html deleted file mode 100644 index 5013984a331..00000000000 --- a/_preview/qilin/index.html +++ /dev/null @@ -1,1102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Incorporate Pointer Analysis - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - - - - - - - - -
- - - - -
- -
- - - - - - -
-
- - - -
-
-
- - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - -

Incorporate Qilin Pointer Analysis

-

see QilinPTA.

-

Dependencies

-
-
-
-
1
-2
-3
-4
-5
    <dependency>
-        <groupId>org.soot-oss</groupId>
-        <artifactId>sootup.java.sourcecode</artifactId>
-        <version></version>
-    </dependency>
-
-
-
-
1
    compile "org.soot-oss:sootup.qilin:1.3.0"
-
-
-
-
-

How to

-

// TODO

- - - - - - - - - - - - - -
-
- - - -
- -
- - - - - - -
-
-
-
- - - - - - - - - - \ No newline at end of file diff --git a/_preview/search/search_index.json b/_preview/search/search_index.json deleted file mode 100644 index f727c8b5309..00000000000 --- a/_preview/search/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"What's SootUp?","text":"

SootUp is a complete overhaul of the good, old static analysis framework Soot.

Important

SootUp is not a version update to Soot, it is a completely new implementation written from scratch that aims to be a leaner, modernized and developer friendly successor of Soot. It is not a Drop-In Replacement! The new architecture and API, renders it not trivial to update existing projects that were built on soot. Therefore we recommend using SootUp for greenfield projects. We hope improved type safety and streamlined mechanisms will aide you implementing and debugging your analysis tool. Unfortunately not every feature has been ported - If you miss something feel free to contribute a feature you miss from good old Soot.

"},{"location":"#why-sootup","title":"Why SootUp?","text":"

Over the 20+ years, SootUps predecessor Soot has evolved into a powerful framework, which is one of the most widely used tools in the static analysis community. This evolution was guided by the needs of the community and carried out with ad-hoc improvements. As a result, Soot has become a tool that can do a multitude of things, but it is heavy and hard to maintain and comprehend. So there was the need to clean up the codebase e.g. improve the software architecture, remove legacy datastructures that weren't in the Java Runtime at the time of Soots creation, enforce validation to have a sane state, removing the necessity of arcane knowledge, document it more and more - to make Soot future prove. So we introduced Design changes in SootUp, which aim to address Soot's shortcomings. The goal is a lighter library that can easily be understood and maintained to be included in other projects.

"},{"location":"#supporters","title":"Supporters","text":"

The development of SootUp is financed by generous support from the German Research Foundation (DFG) and the Heinz Nixdorf Institute (HNI).

Become a sponsor!

"},{"location":"advanced-topics/","title":"Functionalities and Utilities","text":""},{"location":"advanced-topics/#locallivenessanalyser","title":"LocalLivenessAnalyser","text":"

LocalLivenessAnalyser is used for querying for the list of live local variables before and after a given Stmt.

Example:

The live local variables before and after each Stmt will be calculated after generating an instance of LocalLivenessAnalyser as shown the example above. They can be queried by using the methods getLiveLocalsBeforeStmt and getLiveLocalsAfterStmt.

"},{"location":"advanced-topics/#dominancefinder","title":"DominanceFinder","text":"

DomianceFinder is used for querying for the immediate dominator and dominance frontiers for a given basic block.

Example:

After generating an instance of DominanceFinder for a BlockGraph, we will get the immediate dominator and dominance frontiers for each basic block. The both properties can be queried by using the methodsgetImmediateDominatorandgetDominanceFrontiers.

"},{"location":"analysisinputlocations/","title":"AnalysisInputLocations","text":"

An AnalysisInputLocation tells SootUp what code input it should analyze.

"},{"location":"analysisinputlocations/#java-runtime","title":"Java Runtime","text":"

If you have errors like Java.lang.String, Java.lang.Object, ... you are most likely missing this AnalysisInput.

"},{"location":"analysisinputlocations/#java-bytecode-class-jar-war","title":"Java Bytecode .class, .jar, .war","text":""},{"location":"analysisinputlocations/#java-sourcecode-java","title":"Java Sourcecode .java","text":""},{"location":"analysisinputlocations/#jimple-jimple","title":"Jimple .jimple","text":""},{"location":"analysisinputlocations/#android-bytecode-dex","title":"Android Bytecode .dex","text":""},{"location":"analysisinputlocations/#java-cli-arguments-to-configure-sootup","title":"Java cli arguments to configure SootUp","text":"

We created a Utility that parses a String of java command line arguments and configures SootUp respectively.

"},{"location":"announce/","title":"Announcements","text":""},{"location":"announce/#release-announcement","title":"Release Announcement","text":"

We would like to announce Soot\u2019s successor, SootUp.

Over more than 20 years, Soot has become one of the world\u2019s most popular academic tool for Java and Android analysis and instrumentation. We thank all of you who have used and contributed to it over the years! It was your feedback and your contributions that helped it grow into such a versatile tool!

However, over the years, the requirements for Soot have changed a lot, and given its original architecture, it was no longer quite up to the task. Soot was originally developed for ahead-of-time code transformation, particularly optimization, which has become very uncommon in Java. Current use cases center much more around powerful program analyses and program-understanding tasks.

Today we are officially releasing SootUp, a new version of Soot with a completely overhauled architecture. With SootUp, we aim to keep the best things about Soot, yet overcome a lot of its drawbacks. We very much restructured Soot, particularly abolishing the heavy use of singletons. Soot now has a concept of views; each view corresponds to some version or variant of an analyzed program, and multiple views can be kept in memory at the same time. This sets the foundation, for instance, for differential or incremental program analyses.

SootUp is a library that can easily be included in other projects, leaving those projects in control. For those who intend to use it as a framework, with inversion of control, SootUp provides additional templates that help you and novices to get started more easily. The Jimple IR has been slightly simplified, and has been made immutable by default such that internally SootUp can make use of caching where desired. Where required, Jimple transformations are still allowed, but in a systematic manner, for instance assuring that analyses depending on the transformed code are notified about its changes.

Below is an overview of what\u2019s new.

SootUp is not a drop-in replacement for Soot! Due to its completely new architecture and API it is essentially an almost complete rewrite. For a while, Soot and SootUp will coexist, as many existing tools depend on Soot, yet our maintenance efforts will henceforth be focused on SootUp, not Soot, and on extending SootUp with those capabilities that people still find missing. For now, we recommend using SootUp for greenfield projects.

For more details, check out * The SootUp home page: https://soot-oss.github.io/SootUp/, and * The SootUp repository: https://github.com/soot-oss/SootUp/

We are very much looking forward to your feedback and feature requests. To this end, best create appropriate issues in the repository.

This major upgrade of Soot was made possible by generous competitive funding by the DFG, within the project \u201cFuture-proofing the Soot Framework for Program Analysis and Transformation (FutureSoot)\u201d. It was funded in the DFG\u2019s program on Research Software Sustainability.

"},{"location":"bodyinterceptors/","title":"Body Interceptors","text":"

BodyInterceptors are applied to each Body now by default, if not overridden in the used AnalysisInputLocations. The BodyInterceptors exist to to improve and normalize the raw Jimple that was generated in an earlier step. The \"raw\" generated Jimple from the Bytecodefrontend needs a lot improvements - deficits of raw Jimple are:

Method scoped optimisations: - ConditionalBranchFolder: removes tautologic ifs that are always true/false - if we can determine it in the scope of the method. - EmptySwitchEliminator: removes switches that are not really switching - ConstantPropagatorAndFolder: calculates constant values before runtime - CastAndReturnInliner: Removes merging flows to a single return - UnreachableCodeEliminator: speaks for itself. - TrapTightener

Make Local names standardized: - LocalNameStandardizer: numbers Locals with the scheme: type-initial + number of type occurence

Soot Equivalent

BodyTransformer

Below, we show how these BodyInterceptors work for the users who are interested in their internal workings.

"},{"location":"bodyinterceptors/#localsplitter","title":"LocalSplitter","text":"

LocalSplitter is aBodyInterceptorthat attempts to identify and separate uses of a local variable (as definition) that are independent of each other by renaming local variables.

Example 1:

As shown in the example above, the local variablel1is defined twice. It can be split up into two new local variables: l1#1 and l1#2 because the both definitions are independent of each other.

Look for foldable navigation and tabs for showing old vs new

Example 2:

In the second example, the local variablel2is defined thrice. But it cannot be split up into three new local variables as in the first example, because its definitions in the if-branches are not independent of each other. Therefore, it can only be split up into two local variables as shown in the figure.

"},{"location":"bodyinterceptors/#localpacker","title":"LocalPacker","text":"

LocalPacker is aBodyInterceptorthat attempts to minimize the number of local variables which are used in body by reusing them, when it is possible. It corresponds to the inverse body transformation of LocalSplitter. Note: Every local variable's type should be assigned before running LocalPacker.

Example:

In the given example above, the local variablesl1,l3are summarized to be one local variablel1, because they have the same type without interference with each other. Likewise, the local variablesl2,l4andl5are summarized to be another local variablel2. Although the local variablel0doesn't interfere any other local variables, it cannot be summed up with other local variables because of its distinctive type.

"},{"location":"bodyinterceptors/#traptightener","title":"TrapTightener","text":"

WIP - currently not available!

TrapTightener is aBodyInterceptorthat shrinks the protected area covered by each Trap in a Body.

Example:

We assume in the example above that only theStmt:l2 := 2might throw an exception caught by theTrapwhich is labeled withlabel3. In the jimple body before running the TrapTightener, the protected area covered by the Trap contains threeStmts:l1 := 1; l2 := 2; l2 := 3. But an exception could only arise at theStmt:l2 := 2. After the implementation of TrapTightener, we will get a contractible protected area which contains only theStmtthat might throw an exception, namely theStmt:l2 := 2.

"},{"location":"bodyinterceptors/#emptyswitcheliminator","title":"EmptySwitchEliminator","text":"

EmptySwitchEliminator is aBodyInterceptorthat removes empty switch statements which contain only the default case.

Example:

As shown in the example above, the switch statement in the jimple body always takes the default action. After running EmptySwitchEliminator, the switch statement is replaced with aGotoStmtto the default case.

"},{"location":"bodyinterceptors/#unreachablecodeeliminator","title":"UnreachableCodeEliminator","text":"

UnreachableCodeEliminator is aBodyInterceptorthat removes all unreachable statements.

Example:

Obviously, the code segmentl2 = 2; l3 = 3;is unreachable. It will be removed after running the UreachableCodeEliminator.

"},{"location":"bodyinterceptors/#copypropagator","title":"CopyPropagator","text":"

CopyPropagator is aBodyInterceptorthat supports the global copy propagation and constant propagation.

Example for global copy propagation:

Consider a code segment in the following form:

a = b;\n...\nc = use(a); // a, b, c are local variables\n

According to the copy propagation's definition, the statementc = use(a)can be replaced withc = use(b)iff both conditions are met:

In the example for global copy propagation, the first usedl1is replaced withl0, but the second usedl1cannot be replaced withl3, because the second condition is not satisfied.

Example for constant propagation:

Constant propagation is similar to copy propagation. Consider a code segment in the following form:

a = const;\n...\nb = use(a); // a, b are local variables, const is a constant\n

After perfoming the constant propagation, the statementb = use(a)can be replaced withb = use(const)iffais not redefined on any of the paths froma = consttob = use(a).

Therefore, the first usedl1in the second example can be replaced with the constant1, but the second usedl1cannot be replaced with the constant2, becausel1is redefined on the path froml1 = 2tol4 = use(l1). However, it can be replaced with local variablel2, because the both conditions of copy propagation are met.

"},{"location":"bodyinterceptors/#localnamestandardizer","title":"LocalNameStandardizer","text":"

LocalNameStandardizer is aBodyInterceptorthat assigns a generic name to each local variable. Firstly, it will sort the local variables' order alphabetically by the string representation of their type. If there are two local variables with the same type, then the LocalNameStandardizer will use the sequence of their occurrence in jimple body to determine their order. Each assigned name consists of two parts:

The following table shows the letter corresponding to each type:

Type of Local Variable Letter boolean z byte b short s int i long l float f double d char c null n unknown e reference r"},{"location":"bodyinterceptors/#staticsingleassignmentformer","title":"StaticSingleAssignmentFormer","text":"

StaticSingleAssignmentFormer is aBodyInterceptorthat transforms jimple body into SSA form, so that each local variable is assigned exactly once and defined before its first use.

Example:

In the given example, the StaticSingleAssignmentFormer assigns eachIdentityStmtandAssignStmtto a new local variable . And each use uses the local variable which is most recently defined. Sometimes, it is impossible to determine the most recently defined local variable for a use in a join block. In this case, the StaticSingleAssignmentFormer will insert aPhiStmtin the front of the join block to merge all most recently defined local variables and assign them a new local variable.

"},{"location":"call-graph-construction/","title":"Call Graph Construction","text":"

A call graph shows the method calling relationship of a program. It is a directed graph, whose nodes represent different methods, and edges represent caller -> callee relationship.

SootUp contains several call graph construction algorithms. Below, we show how you can use each of these.

"},{"location":"call-graph-construction/#creating-the-type-hierarchy","title":"Creating the Type Hierarchy","text":"

All the call graph construction algorithms require the view to access the type hierarchy for resolving method calls based of sub typing relationship. Below, we show how to create a type hierarchy:

SootUpSoot
List<AnalysisInputLocation> inputLocations = new ArrayList();\ninputLocations.add(new JavaClassPathAnalysisInputLocation(\"src/test/resources/Callgraph/binary\"));\ninputLocations.add(new DefaultRTJarAnalysisInputLocation());\n\nJavaView view = new JavaView(inputLocations);\n
String targetTestClassName = target.exercise1.Hierarchy.class.getName();\nG.reset();\nString userdir = System.getProperty(\"user.dir\");\nString sootCp = userdir + File.separator + \"target\" + File.separator + \"test-classes\"+ File.pathSeparator + \"lib\"+File.separator+\"rt.jar\";\nOptions.v().set_whole_program(true);\nOptions.v().set_soot_classpath(sootCp);\nOptions.v().set_no_bodies_for_excluded(true);\nOptions.v().process_dir();\nOptions.v().set_allow_phantom_refs(true);\nOptions.v().setPhaseOption(\"jb\", \"use-original-names:true\");\nOptions.v().set_prepend_classpath(false);\nSootClass c = Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);\nif (c != null)\n    c.setApplicationClass();\nScene.v().loadNecessaryClasses();\n\nHierarchy hierarchy = new Hierarchy();\n
"},{"location":"call-graph-construction/#defining-an-entry-method","title":"Defining an Entry Method","text":"

All the call graph construction algorithms require an entry method to start with. In java application, you usually define the main method. However, it is possible to define arbitrary entry methods depending on your needs. Below, we show how to define such an entry method:

SootUpSoot
JavaClassType classTypeA = view.getIdentifierFactory().getClassType(\"A\");\n\nMethodSignature entryMethodSignature =\n    view.getIdentifierFactory()\n        .getMethodSignature(\n            classTypeA,\n            JavaIdentifierFactory.getInstance()\n                .getMethodSubSignature(\n                    \"calc\", VoidType.getInstance(), Collections.singletonList(classTypeA)));    \n
SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");     \n
"},{"location":"call-graph-construction/#class-hierarchy-analysis","title":"Class Hierarchy Analysis","text":"

Class Hierarchy Analysis (CHA) algorithm is the most sound call graph construction algorithm available in SootUp. It soundly includes all implementers of an interface, when resolving a method call on an interface. You can construct a call graph with CHA as follows:

SootUpSoot
CallGraphAlgorithm cha = \n        new ClassHierarchyAnalysisAlgorithm(view);\n\nCallGraph cg = \n        cha.initialize(Collections.singletonList(entryMethodSignature));\n\nSystem.out.println(cg);\n
CHATransformer.v().transform();\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n    }\n
"},{"location":"call-graph-construction/#rapid-type-analysis","title":"Rapid Type Analysis","text":"

Rapid Type Analysis (RTA) algorithm constructs a rather precise version of the call graph that the CHA constructs. It refines CHA by considering only the instantiated implementers of an interface, when resolving a method call on an interface. You can construct a call graph with RTA as follows:

SootUpSoot
CallGraphAlgorithm rta = \n        new RapidTypeAnalysisAlgorithm(view);\n\nCallGraph cg = \n        rta.initialize(Collections.singletonList(entryMethodSignature));\n\nSystem.out.println(cg);\n
Transform sparkConfig = new Transform(\"cg.spark\", null);\nPhaseOptions.v().setPhaseOption(sparkConfig, \"enabled:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"rta:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"on-fly-cg:false\");\nMap phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);\nSparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n}  \n
"},{"location":"call-graph-construction/#variable-type-analysis","title":"Variable Type Analysis","text":"

Variable Type Analysis (VTA) algorithm further refines the call graph that the RTA constructs. It refines RTA by considering only the assigned instantiations of the implementers of an interface, when resolving a method call on an interface. When considering assignments, we usually need to consider pointer (points-to) relationship.

Info

VTA algorithm was implemented using the Spark pointer analysis framework. A reimplementation of Spark in SootUp is currently under development.

Spark requires an initial call graph to begin with. You can use one of the call graphs that we have constructed above. You can construct a call graph with VTA as follows:

SootUpSoot
Spark spark = new Spark.Builder(view, callGraph).vta(true).build();\nspark.analyze();\nCallGraph vtaCAllGraph = spark.getCallGraph();\n
Transform sparkConfig = new Transform(\"cg.spark\", null);\nPhaseOptions.v().setPhaseOption(sparkConfig, \"enabled:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"vta:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"on-fly-cg:false\");\nMap phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);\nSparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n}    \n
"},{"location":"docguide/","title":"Docguide","text":""},{"location":"docguide/#general","title":"General","text":""},{"location":"docguide/#mkdocsextensions","title":"MkDocsExtensions","text":""},{"location":"docguide/#tooltip","title":"Tooltip","text":"

Hover me

"},{"location":"docguide/#example-file-inclusion","title":"Example File inclusion","text":"

this enables that tutorial code can be tested and will fail if its not up to date anymore :)

package sootup.examples.basicSetup;\n\nimport static org.junit.jupiter.api.Assertions.assertTrue;\n\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Collections;\nimport org.junit.jupiter.api.Tag;\nimport org.junit.jupiter.api.Test;\nimport sootup.core.inputlocation.AnalysisInputLocation;\nimport sootup.core.jimple.common.expr.JVirtualInvokeExpr;\nimport sootup.core.jimple.common.stmt.JInvokeStmt;\nimport sootup.core.model.SootClass;\nimport sootup.core.model.SootMethod;\nimport sootup.core.signatures.MethodSignature;\nimport sootup.core.types.ClassType;\nimport sootup.core.views.View;\nimport sootup.java.bytecode.inputlocation.PathBasedAnalysisInputLocation;\nimport sootup.java.core.language.JavaJimple;\nimport sootup.java.core.views.JavaView;\n\n/** This example illustrates how to create and use a new Soot Project. */\n@Tag(\"Java8\")\npublic class BasicSetup {\n\n  @Test\n  public void createByteCodeProject() {\n    // Create a AnalysisInputLocation, which points to a directory. All class files will be loaded\n    // from the directory\n    Path pathToBinary = Paths.get(\"src/test/resources/BasicSetup/binary\");\n    AnalysisInputLocation inputLocation = PathBasedAnalysisInputLocation.create(pathToBinary, null);\n\n    // Create a view for project, which allows us to retrieve classes\n    View view = new JavaView(inputLocation);\n\n    // Create a signature for the class we want to analyze\n    ClassType classType = view.getIdentifierFactory().getClassType(\"HelloWorld\");\n\n    // Create a signature for the method we want to analyze\n    MethodSignature methodSignature =\n        view.getIdentifierFactory()\n            .getMethodSignature(\n                classType, \"main\", \"void\", Collections.singletonList(\"java.lang.String[]\"));\n\n    // Assert that class is present\n    assertTrue(view.getClass(classType).isPresent());\n\n    // Retrieve class\n    SootClass sootClass = view.getClass(classType).get();\n\n    // Retrieve method\n    view.getMethod(methodSignature);\n\n    // Alternatively:\n    assertTrue(sootClass.getMethod(methodSignature.getSubSignature()).isPresent());\n    SootMethod sootMethod = sootClass.getMethod(methodSignature.getSubSignature()).get();\n\n    // Read jimple code of method\n    System.out.println(sootMethod.getBody());\n\n    // Assert that Hello world print is present\n    assertTrue(\n        sootMethod.getBody().getStmts().stream()\n            .anyMatch(\n                stmt ->\n                    stmt instanceof JInvokeStmt\n                        && stmt.getInvokeExpr() instanceof JVirtualInvokeExpr\n                        && stmt.getInvokeExpr()\n                            .getArg(0)\n                            .equivTo(JavaJimple.getInstance().newStringConstant(\"Hello World!\"))));\n  }\n}\n
"},{"location":"examples/","title":"SootUp Example projects","text":"

Example code to help getting start with SootUp Here we will provide some examples that uses SootUp to provide insights about a Java program. The Examples can be cloned or downloaded from our Example Repository.

We have included all the five projects in 5 different branches under SootUp-Examples with detailed explanation about the project.

"},{"location":"examples/#basicsetupexample","title":"BasicSetupExample","text":"
  1. package sootup.examples; - defines the package name for the Java class.
  2. import statement - defines various classes and interfaces from different packages that the program uses.
  3. public class BasicSetup - declares a public class named 'BasicSetup' which is the main class for this program.
  4. Then we have created a main method which is the entry point of the progrram
  5. Path pathToBinary object pointing to a directory that contains the binary files ie class files to be analyzed and Paths.get is a static method that converts string path to a 'Path' object.
  6. AnalysisInputLocation object specifying where SootUp should look for classes to analyze.
  7. View object is created for the project allowing the retrieal of classes from the specified input location. JavaView is specific implementation of View tailed for Java projects.
  8. The ClassType object is created for the class name 'HelloWorld'. This object represents the type of class to be analyzed.
  9. A MethodSignature object is created for the main method of the HelloWorld class. This signature specifies the method's return type (void) and its parameter types (a single parameter of type String[]).
  10. The if statment checks for the presences of the class 'HelloWorld'. If not it prints \"Class not ffound!\" and exits the program.
  11. Then it retrieves the SootClass object representing the HelloWorld class, assuming it is present.
  12. view.getMethod(methodSignature); - Attempts to retrieve the specified method from the project.
  13. The if statment after this, checks if the main method is present in the HelloWorld class. If not, it prints \"Method not found!\" and exits.
  14. Then the next statment retrieves the SootMethod object for the main method and prints its body, which is in Jimple, a simplified version of Java bytecode used by Soot for analysis and transformation.
  15. Then the next if condition checks if the method containts a specific statement called 'Hello World!'.
"},{"location":"examples/#bodyinterceptor","title":"BodyInterceptor","text":"
  1. package sootup.examples; - defines the package name for the Java class.
  2. import statement - defines various classes and interfaces from different packages that the program uses.
  3. public class BodyInterceptor - declares a public class named \"BodyInterceptor\".
  4. Then we have created a main method in which is the entry point for the code.
  5. Then we have created an AnalysisInputLocation pointing to a directory with class files to be loaded. It specifies that the DeadAssignmentEliminator interceptor should be applied to these classes.
  6. Then created a View that initializes a JavaView with the specified inputLocation, allowing interaction with the classes for analysis.
  7. Then have created a ClassType and MethodSignature which is used for analysis. The signature contains method name, return type and parameters.
  8. Then we check for the existence of the class and method in the given view.
  9. If they exist, a SootClass and SootMethod objects are used to retrieve the same.
  10. Then prints the body of the SootMethod object.
  11. Then we check if the interceptor worked. ie here we check if the DeadAssignmentEliminator interceptor has successfully removed a specific assignment (l1 = 3. from the method's body. It does this by looking through all statements (JAssignStmt) in the method body and checking if the assignment is not present.
  12. Then it prints the result of the interceptor check.
"},{"location":"examples/#callgraphexample","title":"CallGraphExample","text":"
  1. package sootup.examples; - defines the package name for the Java class.
  2. import statement - defines various classes and interfaces from different packages that the program uses.
  3. public class CallgraphExample - declares a public class named \"CallGraphExample\".
  4. Then we have created a main method in which is the entry point for the code.
  5. List inputLocations creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis.
  6. Then we have provided towo inputLocations.add() - one for the project's class file directory and another for Java's runtime library (rt.jar).
  7. Then we have created a JavaView which is used for analysing the Java program.
  8. Then we have created two ClassType for two classes ie 'A' and 'B'. They are used to create a MethodSignature for a method that will be analysed.
  9. ViewTypeHierarchy - then we have set up a type hierarchy from the provided view and prints the subclasses of class 'A'.
  10. Initializes a CallGraphAlgorithm using the ClassHierarchyAnalysisAlgorithm, which is a method for constructing call graphs.
  11. Then we creates a call graph by initialising the Class Hierarchy Analysis (cha) with the entry method signature.
  12. Prints information about calls from the entry method in the call graph.
  13. "},{"location":"examples/#classhierarchyexample","title":"ClassHierarchyExample","text":"
    1. package sootup.examples; - defines the package name for the Java class.
    2. import statement - defines various classes and interfaces from different packages that the program uses.
    3. public class ClassHierarchy - declares a public class named \"ClassHierarchy\".
    4. Then we have created a main method in which is the entry point for the code.
    5. Then creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis. Two locations are added: one for the project's binary directory and another for the default Java runtime library (rt.jar).
    6. Initializes a JavaView object with the previously created input locations.
    7. Initializes a ViewTypeHierarchy object using the view. This object will be used to analyze the class hierarchy.
    8. Then we have created two ClassTypes. These lines get JavaClassType objects for classes \"A\" and \"C\". These types are used for further hierarchy analysis.
    9. Checks the direct subclasses of class \"C\". It verifies if all direct subclasses are \"D\" using two different methods: comparing class names and fully qualified names.
    10. Then prints a message based on whether all direct subtypes of \"C\" are correctly identified as \"D\".
    11. Retrieves and checks the superclasses of class \"C\". It then verifies if these superclasses include class \"A\" and java.lang.Object, printing a message based on the result.
    "},{"location":"examples/#mutatingsootclassexample","title":"MutatingSootClassExample","text":"
    1. package sootup.examples; - defines the package name for the Java class.
    2. import statement - defines various classes and interfaces from different packages that the program uses.
    3. public class MutatingSootClass - declares a public class named \"MutatingSootClass\".
    4. Then we have created a main method in which is the entry point for the code.
    5. First we have created an 'AnalysisInputLocation' which points to a directory which contains the class files to be analysed.
    6. Then we have created a JavaView which allos us to retrievet the classes.
    7. And also created a ClassType to get the class 'HelloWorld' and a method within that class ie main for analysis using MethodSignature.
    8. THen we are checking and retrieving the class and method.
    9. Then we retrives the existing body of the method and prints it. Then we create a new local variable to add it copy to the method body.
    10. Then we are overriding the method body and class. ie this lines creates new sources that overrides teh original method body and class. It replaces the old method in the class with the new method having the modified body.
    11. Prints the modified method body and checks if the new local variable (newLocal) exists in the modified method. Depending on the result, it prints a corresponding message.
    "},{"location":"faq/","title":"Frequently Asked Questions","text":""},{"location":"faq/#how-to-setup-the-soot-dependency-in-maven-gradle","title":"How to setup the soot dependency (in Maven, Gradle)?","text":"

    See Installation.

    "},{"location":"faq/#how-to-retreive-a-sootclass-or-sootmethod","title":"How to retreive a SootClass or SootMethod?","text":"

    See Getting Started.

    "},{"location":"faq/#is-there-a-github-template-to-quickstart-into-development-with-sootup","title":"Is there a github template to quickstart into development with SootUp?","text":"

    Not yet.

    "},{"location":"faq/#error-while-using-the-sourcecodefrontend","title":"Error while using the Sourcecodefrontend","text":"

    Please make sure to use Java8 to execute.

    "},{"location":"faq/#exception-provider-jrt-not-found","title":"Exception: Provider \"jrt\" not found","text":"

    java.lang.ExceptionInInitializerError\n    at sootup.java.bytecode.inputlocation.JrtFileSystemAnalysisInputLocationTest.getClassSource(JrtFileSystemAnalysisInputLocationTest.java:28)\n    ...\nCaused by: java.nio.file.ProviderNotFoundException: Provider \"jrt\" not found\n
    To execute SootUp with JavaModules support please make sure you run the code at least the Java9 Runtime.

    "},{"location":"faq/#how-to-solve-a-concurrentmodificationexception","title":"How to solve a ConcurrentModificationException?","text":"

    Copy the Iterator into an intermediate Collection.

    final StmtGraph<?> stmtGraph = builder.getStmtGraph();\n    for (Stmt stmt : Lists.newArrayList(stmtGraph)){\n        ...\n    }\n}\n

    "},{"location":"faq/#how-can-i-visualize-a-stmtgraph","title":"How can I visualize a StmtGraph?","text":"

    There exists a tool, that converts a StmtGraph to the Graphviz Dot Language.

    DotExporter.buildGraph( stmtgraph );\n
    or create a convenient link with the exported stmtgraph as HTTP GET Parameter
    DotExporter.createUrlToWebeditor( stmtgraph );\n

    "},{"location":"faq/#is-there-a-way-to-use-code-exploration-and-syntax-highlighting-features-in-my-ide-for-jimple-files","title":"Is there a way to use code exploration and syntax highlighting features in my IDE for .jimple files?","text":"

    Try JimpeLsp.

    "},{"location":"faq/#is-there-a-way-to-use-syntax-highlighting-of-jimple-in-my-paper-thesis","title":"Is there a way to use syntax highlighting of .jimple in my paper, thesis, ...?","text":"

    Have a look at LspLexer4Pygments.

    "},{"location":"faq/#how-to-add-an-entry-in-this-list-ie-your-question-is-not-answered-here","title":"How to ... add an entry in this list? i.e. Your question is not answered here?","text":"

    Feel free to start a Discussion.

    "},{"location":"getting-started/","title":"General Usage of SootUp","text":"

    This page walks you through the core data structures, as well as shows how to get started with SootUp.

    "},{"location":"getting-started/#the-core-datastructures","title":"The core datastructures","text":"

    Before you get started with the SootUp library, it helps to learn about the following core data structures:

    Soot Equivalent

    It corresponds to the cp option, which specifies the classpath for Soot to find classes to be analyzed.

    Soot Equivalent

    It corresponds to the Scene class, but it is not a singleton. So it is possible to instantiate multiple views simultaneously.

    "},{"location":"getting-started/#creating-a-view","title":"Creating a View","text":"

    You can use bytecode analysis typically when you do not have access to the source code of the target program. Following example shows how to create a view for analyzing Java bytecode.

    Create a view to analyze Java bytecode

    AnalysisInputLocation inputLocation = \n        new JavaClassPathAnalysisInputLocation(\"path2Binary\");\n\nJavaView view = new JavaView(inputLocation);\n

    If you have access to the source code, it is also possible to create a view for analyzing source code. Following example shows how to create view for analyzing Java source code.

    Experimental

    The source code frontend is experimental and should only be used for testing purposes. You should compile the code for analysis first and use the bytecode frontend instead.

    Create a view to analyze Java source code

    AnalysisInputLocation inputLocation = \n        new JavaSourcePathAnalysisInputLocation(\"path2Source\");\n\nJavaView view = new JavaView(inputLocation);\n

    If you have a Jimple file, you can create a view for analyzing jimple code directly. Following example shows how to create a view for analyzing jimple code.

    Create a project to analyze jimple code

    Path pathToJimple = Paths.get(\"path2Jimple\");\n\nAnalysisInputLocation inputLocation = \n        new JimpleAnalysisInputLocation(pathToJimple);\n\nJimpleView view = new JimpleView(inputLocation);\n

    By default, whenever a class is retrieved, it will be permanently stored in a cache. If you do not want retrieved classes to be stored indefinetly, you can instead provide a different CacheProvider to the created view. To for example use an LRUCache instead, which stores at most 50 classes, and always replaces the least recently used class by a newly retrieved one, use the following call:

    JavaView view = new JavaView(Collections.singletonList(inputLocation), new LRUCacheProvider(50));\n
    "},{"location":"getting-started/#retrieving-a-class","title":"Retrieving a Class","text":"

    Each class is identified with a unique signature adhering to Java identifier rules, therefore you first need to specify the class signature (ClassType) as shown below.

    Let's say the following is the target program that we want to analyze:

    Target Program

    package example;\n\npublic class HelloWorld {\n\n  public HelloWorld() {\n\n  }\n\n  public static void main(String[] args) {\n    HelloWorld hw = new HelloWorld();\n    hw.hello();\n  }\n\n  public void hello() {\n\n  }\n\n}\n

    Then, we could define the ClassType of the HelloWorld class as follows:

    Defining a ClassType

    JavaClassType classType = \n        view.getIdentifierFactory().getClassType(\"example.HelloWorld\");\n

    Once we have a ClassType that identifies the HelloWorld class, we can use it to retrieve the corresponding SootClass object from the view as shown below:

    Retrieving a SootClass

    JavaSootClass sootClass = view.getClass(classType).get();\n
    "},{"location":"getting-started/#retrieving-a-method","title":"Retrieving a Method","text":"

    Like the classes, methods also have an identifier which we call MethodSignature. For instance, we can define the method signature for identifying the main method of the HelloWorld class as follows:

    Defining a MethodSignature

    MethodSignature methodSignature =\n    view\n        .getIdentifierFactory()\n        .getMethodSignature(\n            \"main\", // method name\n            classType,\n            \"void\", // return type\n            Collections.singletonList(\"java.lang.String[]\")); // args\n

    Once we have a MethodSignature that identifies the main method of the HelloWorld class, we can use it to retrieve the corresponding SootMethod object from the view as shown below:

    Retrieving a SootMethod from the View

    Optional<SootMethod> opt = view.getMethod(methodSignature);\n\nif(opt.isPresent()){\n  SootMethod method = opt.get();\n}\n

    Alternatively, we can also retrieve a SootMethod from SootClass that contains it.

    Retrieving a SootMethod from a SootClass

    Optional<JavaSootMethod> opt = sootClass.getMethod(methodSignature.getSubSignature());\n\nif(opt.isPresent()){\n  JavaSootMethod method = opt.get();\n}\n
    "},{"location":"getting-started/#retrieving-the-control-flow-graph-of-a-method","title":"Retrieving the Control-Flow Graph of a Method","text":"

    Each SootMethod contains a Control-Flow Graph (CFG) which is represented via the StmtGraph. This structure is usually used for program analysis. You can retrieve the CFG of a SootMethod as follows:

    Retrieving the CFG of a SootMethod

    sootMethod.getBody().getStmts();\n

    Access or Download all of the code used above

    BasicSetup.java

    "},{"location":"installation/","title":"Installation","text":""},{"location":"installation/#use-the-latest-develop-branch","title":"Use the latest develop branch","text":"

    For configuration options of your build tool please visit SootUp on Jitpack.io

    "},{"location":"installation/#use-releases-on-maven-central","title":"Use Releases on Maven Central","text":"

    The code below shows you how to import all submodules of the SootUp repository. You can import fewer modules if your use case allows it.

    Add the following dependencies to your pom.xml / build.gradle.

    MavenGradle
    <dependencies>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.core</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.core</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.sourcecode</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.bytecode</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.jimple.parser</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.callgraph</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.analysis</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.qilin</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n</dependencies>\n
    repositories {\n    mavenCentral()\n    google()\n}\n\ncompile \"org.soot-oss:sootup.core:1.3.0\"\ncompile \"org.soot-oss:sootup.java.core:1.3.0\"\ncompile \"org.soot-oss:sootup.java.sourcecode:1.3.0\"\ncompile \"org.soot-oss:sootup.java.bytecode:1.3.0\"\ncompile \"org.soot-oss:sootup.jimple.parser:1.3.0\"\ncompile \"org.soot-oss:sootup.callgraph:1.3.0\"\ncompile \"org.soot-oss:sootup.analysis:1.3.0\"\ncompile \"org.soot-oss:sootup.qilin:1.3.0\"\n
    "},{"location":"installation/#build-from-source","title":"Build from Source","text":"

    If you'd like to get the most recent changes, you can build SootUp from source yourself and install it into your local maven repository.

    git clone https://github.com/secure-software-engineering/SootUp.git\nmvn install\n

    "},{"location":"jimple/","title":"Jimple","text":"

    What is Jimple? Jimple is the intermediate representation IR of Soot, and thus SootUp. Soot's intention is to provide a simplified way to analyze JVM bytecode. JVM bytecode is stack-based, which makes it difficult for program analysis. Java source code, on the other hand, is also not quite suitable for program analysis, due to its nested structures. Therefore, Jimple aims to bring the best of both worlds, a non-stack-based and flat (non-nested) representation. For this purpose Jimple was designed as a representation of JVM bytecode which is human readable.

    Info

    To learn more about jimple, refer to the thesis by Raja Vallee-Rai.

    It might help to visualize how the Jimple version of a Java code looks like. Have a look at the following example on the HelloWorld class.

    JimpleJavaByte Code
    public class HelloWorld extends java.lang.Object\n{\n  public void <init>()\n  {\n    HelloWorld r0;\n    r0 := @this: HelloWorld;\n    specialinvoke r0.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public static void main(java.lang.String[])\n  {\n    java.lang.String[] r0;\n    java.io.PrintStream r1;\n\n    r0 := @parameter0: java.lang.String[];\n    r1 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke r1.<java.io.PrintStream: \n    void println(java.lang.String)>(\"Hello world!\");\n    return;\n  }\n}\n
    public class HelloWorld {\n\n  public HelloWorld() {\n\n  }\n\n  public static void main(String[] var0) {\n    System.out.println(\"Hello World!\");\n  }\n\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class analysis/HelloWorld {\n\n// compiled from: HelloWorld.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 4 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 6 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Lanalysis/HelloWorld; L0 L2 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static main([Ljava/lang/String;)V\n  L0\n    LINENUMBER 9 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Hello World!\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 10 L1\n    RETURN\n  L2\n    LOCALVARIABLE var0 [Ljava/lang/String; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jimple-grammar-structure","title":"Jimple Grammar Structure","text":"

    Jimple mimics the JVMs class file structure. Therefore it is object oriented. A Single Class (or Interface) per file. Three-Address-Code which means there are no nested expressions. (nested expressions can be modeled via Locals that store intermediate calculation results.)

    "},{"location":"jimple/#class-or-interface","title":"Class (or Interface)","text":"

    A class consists of Fields and Methods. It is referenced by its ClassType.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n}\n
    package target.exercise1;\n\npublic class DemoClass {}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#field","title":"Field","text":"

    A Field is a piece of memory which can store a value that is accessible according to its visibility modifier. It is referenced by its FieldSignature.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: double pi> = 3.14;\n    return;\n  }\n}\n/*\n  \"this.<target.exercise1.DemoClass: double pi>\" is JInstanceFieldRef\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private final double pi = 3.14;\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x12\nprivate final D pi = 3.14\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    LDC 3.14\n    PUTFIELD target/exercise1/DemoClass.pi : D\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#method-and-the-body","title":"Method and the Body","text":"

    The interesting part is a method. A method is a \"piece of code\" that can be executed. It is referenced by its MethodSignature and contains a StmtGraph that models the sequence of single instructions/statements (Stmts).

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    virtualinvoke this.<target.exercise1.DemoClass: \n    void demoMethod()>();\n    return;\n  }\n\n  public void demoMethod()\n  {\n    java.io.PrintStream $stack1;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack1 = <java.lang.System: java.io.PrintStream out>;\n\n    virtualinvoke $stack1.<java.io.PrintStream: \n    void println(java.lang.String)>(\"Inside method.\");\n    return;\n  }\n}\n/*\n  \"<target.exercise1.DemoClass: void demoMethod()>\" \n        and \"<target.exercise1.DemoClass: void <init>()>\" \n        are instances of SootMethod \n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  DemoClass(){\n    demoMethod();\n  }\n  public void demoMethod(){\n    System.out.println(\"Inside method.\");\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x0\n<init>()V\n  L0\n    LINENUMBER 5 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 6 L1\n    ALOAD 0\n    INVOKEVIRTUAL target/exercise1/DemoClass.demoMethod ()V\n  L2\n    LINENUMBER 7 L2\n    RETURN\n  L3\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L3 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic demoMethod()V\n  L0\n    LINENUMBER 10 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Inside method.\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 11 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#signatures","title":"Signatures","text":"

    Signatures are required for identifying or referencing things across a method, such as Classes, Interfaces, Methods or Fields. Locals, on the other hand, do not need signatures, since they are referenced within method boundaries.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: double pi> = 3.14;\n    return;\n  }\n\n  public void demoMethod()\n  {\n    java.io.PrintStream $stack3, $stack5;\n    java.lang.StringBuilder $stack4, $stack6, $stack7;\n    java.lang.String $stack8;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack3 = <java.lang.System: java.io.PrintStream out>;\n\n    virtualinvoke $stack3.<java.io.PrintStream: \n      void println(java.lang.String)>(\"pi : 3.14\");\n    $stack5 = <java.lang.System: java.io.PrintStream out>;\n    $stack4 = new java.lang.StringBuilder;\n\n    specialinvoke $stack4.<java.lang.StringBuilder: void <init>()>();\n    $stack6 = virtualinvoke $stack4.<java.lang.StringBuilder: \n      java.lang.StringBuilder append(java.lang.String)>\n        (\"pi : \");\n    $stack7 = virtualinvoke $stack6.<java.lang.StringBuilder: \n      java.lang.StringBuilder append(double)>(3.1415);\n    $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: \n      java.lang.String toString()>();\n\n    virtualinvoke $stack5.<java.io.PrintStream:     \n      void println(java.lang.String)>($stack8);\n    return;\n  }\n}\n/*\n  For JInstanceFieldRef \"this.<target.exercise1.DemoClass: double pi>\" \n    signature is <target.exercise1.DemoClass: double pi>\n  Similarly, we have other signatures like \n    <java.lang.Object: void <init>()>, \n    <java.io.PrintStream: void println(java.lang.String)> \n    and so on. \n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private final double pi = 3.14;\n\n  public void demoMethod(){\n    double localPi = 3.1415;\n    System.out.println(\"pi : \" + pi);\n    System.out.println(\"pi : \" + localPi);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x12\nprivate final D pi = 3.14\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    LDC 3.14\n    PUTFIELD target/exercise1/DemoClass.pi : D\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic demoMethod()V\n  L0\n    LINENUMBER 6 L0\n    LDC 3.1415\n    DSTORE 1\n  L1\n    LINENUMBER 7 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"pi : 3.14\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L2\n    LINENUMBER 8 L2\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    NEW java/lang/StringBuilder\n    DUP\n    INVOKESPECIAL java/lang/StringBuilder.<init> ()V\n    LDC \"pi : \"\n      INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)\n        Ljava/lang/StringBuilder;\n    DLOAD 1\n    INVOKEVIRTUAL java/lang/StringBuilder.append (D)Ljava/lang/StringBuilder;\n    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 9 L3\n    RETURN\n  L4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0\n    LOCALVARIABLE localPi D L1 L4 1\n    MAXSTACK = 4\n    MAXLOCALS = 3\n}\n
    "},{"location":"jimple/#trap","title":"Trap","text":"

    A Trap is a mechanism to model exceptional flow.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void divideExample(int, int)\n  {\n    int x, y, $stack4;\n    java.io.PrintStream $stack5, $stack7;\n    java.lang.Exception $stack6;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n    y := @parameter1: int;\n\n   label1:\n      $stack5 = <java.lang.System: java.io.PrintStream out>;\n      $stack4 = x / y;\n      virtualinvoke $stack5.<java.io.PrintStream: void println(int)>($stack4);\n\n   label2:\n      goto label4;\n\n   label3:\n      $stack6 := @caughtexception;\n      $stack7 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack7.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Exception caught\");\n\n   label4:\n      return;\n\n      catch java.lang.Exception from label1 to label2 with label3;\n  }\n}\n/*\n  By calling getTraps() method, we can get the Traip chain.\n  For the above jimple code, we have the below trap:\n  Trap :\n  begin  : $stack5 = <java.lang.System: java.io.PrintStream out>\n  end    : goto [?= return]\n  handler: $stack6 := @caughtexception\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void divideExample(int x, int y){\n    try {\n      System.out.println(x / y);\n    }catch (Exception e){\n      System.out.println(\"Exception caught\");\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n    L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic divideExample(II)V\n  TRYCATCHBLOCK L0 L1 L2 java/lang/Exception\n  L0\n    LINENUMBER 6 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    ILOAD 2\n    IDIV\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L1\n    LINENUMBER 9 L1\n    GOTO L3\n  L2\n    LINENUMBER 7 L2\n    FRAME SAME1 java/lang/Exception\n    ASTORE 3\n  L4\n    LINENUMBER 8 L4\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Exception caught\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 10 L3\n    FRAME SAME\n    RETURN\n  L5\n    LOCALVARIABLE e Ljava/lang/Exception; L4 L3 3\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE x I L0 L5 1\n    LOCALVARIABLE y I L0 L5 2\n    MAXSTACK = 3\n    MAXLOCALS = 4\n}\n
    "},{"location":"jimple/#stmt","title":"Stmt","text":"

    The main piece of Jimple is a Statement (Stmt). Stmts represent that can be executed by the JVM.

    "},{"location":"jimple/#branching-statements","title":"Branching Statements","text":"

    A BranchingStmt's job is to model the flow between Stmts.

    "},{"location":"jimple/#jgotostmt","title":"JGotoStmt","text":"

    for unconditional flow.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n  public static void sampleMethod()\n  {\n    int i;\n    i = 0;\n\n    label1:\n      if i >= 5 goto label3;\n      if i != 3 goto label2;\n      goto label3;\n\n    label2:\n      i = i + 1;\n      goto label1;\n\n    label3:\n      return;\n  }\n}\n/*\n  Here for statements \"goto label3;\" and \"goto label1;\", \n  we have two instances of JGotoStmt : \n    \"goto[?=return]\" and \"goto[?=(branch)]\".\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public static void sampleMethod(){\n    label1:\n    for (int i = 0; i < 5; i++){\n      if(i == 3){\n        break label1;\n      }\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static sampleMethod()V\n  L0\n    LINENUMBER 6 L0\n    ICONST_0\n    ISTORE 0\n  L1\n    FRAME APPEND [I]\n    ILOAD 0\n    ICONST_5\n    IF_ICMPGE L2\n  L3\n    LINENUMBER 7 L3\n    ILOAD 0\n    ICONST_3\n    IF_ICMPNE L4\n  L5\n    LINENUMBER 8 L5\n    GOTO L2\n  L4\n    LINENUMBER 6 L4\n    FRAME SAME\n    IINC 0 1\n    GOTO L1\n  L2\n    LINENUMBER 11 L2\n    FRAME CHOP 1\n    RETURN\n    LOCALVARIABLE i I L1 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jifstmt","title":"JIfStmt","text":"

    for conditional flow depending on boolean Expression (AbstractConditionExpr) so they have two successor Stmt's.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n   public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public static void sampleMethod(int)\n  {\n    int x, $stack1;\n    java.io.PrintStream $stack2, $stack3;\n\n    x := @parameter0: int;\n\n    $stack1 = x % 2;\n    if $stack1 != 0 goto label1;\n\n    $stack3 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack3.<java.io.PrintStream: \n      void println(java.lang.String)>(\"Even\");\n    goto label2;\n\n    label1:\n      $stack2 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack2.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Odd\");\n\n    label2:\n      return;\n  }\n}\n/*\n  For statement \"if $stack1 != 0 goto label1;\", \n  we have an instance of JIfStmt :\n    \"if $stack1 != 0 goto $stack2 \n        = <java.lang.System:java.io.PrintStream out>\".\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public static void sampleMethod(int x){\n    if(x % 2 == 0){\n      System.out.println(\"Even\");\n    }else{\n      System.out.println(\"Odd\");\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static sampleMethod(I)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 0\n    ICONST_2\n    IREM\n    IFNE L1\n  L2\n    LINENUMBER 6 L2\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Even\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n    GOTO L3\n  L1\n    LINENUMBER 8 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Odd\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 10 L3\n    FRAME SAME\n    RETURN\n  L4\n    LOCALVARIABLE x I L0 L4 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jswitchstmt","title":"JSwitchStmt","text":"

    for conditional flow that behaves like a switch-case. It has #numberOfCaseLabels+1 (for default) successor Stmt's.

    All other Stmts are not manipulating the flow, which means they have a single successor Stmt as long as they are not exiting the flow inside a method.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void switchExample(int)\n  {\n    int x;\n    java.io.PrintStream $stack2, $stack3, $stack4;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    lookupswitch(x)\n    {\n      case 1: goto label1;\n      case 2: goto label2;\n      default: goto label3;\n    };\n\n    label1:\n      $stack3 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack3.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input 1\");\n      goto label4;\n\n    label2:\n      $stack2 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack2.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input 2\");\n      goto label4;\n\n    label3:\n      $stack4 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack4.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input more than 2\");\n\n    label4:\n      return;\n  }\n}\n/*\n  Here for below statement:\n    lookupswitch(x)\n      {\n        case 1: goto label1;\n        case 2: goto label2;\n        default: goto label3;\n      };\n\n  we have an instance of JLookupSwitchStmt :\n    lookupswitch(x) \n      {     \n        case 1: goto $stack3 \n                        = <java.lang.System: java.io.PrintStream out>;     \n        case 2: goto $stack2 \n                        = <java.lang.System: java.io.PrintStream out>;     \n        default: goto $stack4 \n                        = <java.lang.System: java.io.PrintStream out>; \n      }\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void switchExample(int x){\n    switch (x){\n      case 1:\n        System.out.println(\"Input 1\");\n        break;\n\n      case 2:\n        System.out.println(\"Input 2\");\n        break;\n\n      default:\n        System.out.println(\"Input more than 2\");\n        break;\n\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic switchExample(I)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 1\n    LOOKUPSWITCH\n    1: L1\n    2: L2\n    default: L3\n  L1\n    LINENUMBER 7 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input 1\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L4\n    LINENUMBER 8 L4\n    GOTO L5\n  L2\n    LINENUMBER 11 L2\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input 2\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L6\n    LINENUMBER 12 L6\n    GOTO L5\n  L3\n    LINENUMBER 15 L3\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input more than 2\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L5\n    LINENUMBER 19 L5\n    FRAME SAME\n    RETURN\n  L7\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L7 0\n    LOCALVARIABLE x I L0 L7 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#jreturnstmt-jreturnvoidstmt","title":"JReturnStmt & JReturnVoidStmt","text":"

    They end the execution/flow inside the current method and return (a value) to its caller.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public int increment(int)\n  {\n    int x, $stack2;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    $stack2 = x + 1;\n    return $stack2;\n  }\n\n  public void print()\n  {\n    java.io.PrintStream $stack1;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack1 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack1.<java.io.PrintStream: \n      void println(java.lang.String)>(\"Inside method print\");\n    return;\n  }\n}\n/*\n  \"return $stack2\" is JReturnStmt.\n  \"return\" is JReturnVoidStmt.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public int increment(int x){\n    return x + 1;\n  }\n  public void print(){\n    System.out.println(\"Inside method print\");\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic increment(I)I\n  L0\n    LINENUMBER 5 L0\n    ILOAD 1\n    ICONST_1\n    IADD\n    IRETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE x I L0 L1 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n\n// access flags 0x1\npublic print()V\n  L0\n    LINENUMBER 8 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Inside method print\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 9 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jthrowstmt","title":"JThrowStmt","text":"

    Ends the execution inside the current Method if the thrown exception is not caught by a Trap, which redirects the execution to an exceptionhandler.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void divideExample(int, int)\n  {\n    int y, x, $stack6;\n    java.lang.StringBuilder $stack3, $stack5, $stack7;\n    java.io.PrintStream $stack4;\n    java.lang.String $stack8;\n    java.lang.RuntimeException $stack9;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n    y := @parameter1: int;\n\n    if y != 0 goto label1;\n\n    $stack9 = new java.lang.RuntimeException;\n    specialinvoke $stack9.<java.lang.RuntimeException: \n      void <init>(java.lang.String)>(\"Divide by zero error\");\n    throw $stack9;\n\n    label1:\n      $stack4 = <java.lang.System: java.io.PrintStream out>;\n      $stack3 = new java.lang.StringBuilder;\n      specialinvoke $stack3.<java.lang.StringBuilder: void <init>()>();\n\n      $stack5 = virtualinvoke $stack3.<java.lang.StringBuilder: \n        java.lang.StringBuilder append(java.lang.String)>(\"Divide result : \");\n      $stack6 = x / y;\n      $stack7 = virtualinvoke $stack5.<java.lang.StringBuilder: \n        java.lang.StringBuilder append(int)>($stack6);\n      $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: \n        java.lang.String toString()>();\n\n      virtualinvoke $stack4.<java.io.PrintStream: \n        void println(java.lang.String)>($stack8);\n      return;\n  }\n}\n/*\n  \"throw $stack9\" is JThrowStmt.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void divideExample(int x, int y){\n    if(y == 0){\n      throw new RuntimeException(\"Divide by zero error\");\n    }\n    System.out.println(\"Divide result : \" + x / y);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic divideExample(II)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 2\n    IFNE L1\n  L2\n    LINENUMBER 6 L2\n    NEW java/lang/RuntimeException\n    DUP\n    LDC \"Divide by zero error\"\n    INVOKESPECIAL java/lang/RuntimeException.<init> \n      (Ljava/lang/String;)V\n    ATHROW\n  L1\n    LINENUMBER 8 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    NEW java/lang/StringBuilder\n    DUP\n    INVOKESPECIAL java/lang/StringBuilder.<init> ()V\n    LDC \"Divide result : \"\n    INVOKEVIRTUAL java/lang/StringBuilder.append \n      (Ljava/lang/String;)Ljava/lang/StringBuilder;\n    ILOAD 1\n    ILOAD 2\n    IDIV\n    INVOKEVIRTUAL java/lang/StringBuilder.append \n      (I)Ljava/lang/StringBuilder;\n    INVOKEVIRTUAL java/lang/StringBuilder.toString \n      ()Ljava/lang/String;\n    INVOKEVIRTUAL java/io/PrintStream.println \n      (Ljava/lang/String;)V\n  L3\n    LINENUMBER 9 L3\n    RETURN\n  L4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0\n    LOCALVARIABLE x I L0 L4 1\n    LOCALVARIABLE y I L0 L4 2\n    MAXSTACK = 4\n    MAXLOCALS = 3\n}\n
    "},{"location":"jimple/#jinvokestmt","title":"JInvokeStmt","text":"

    transfers the control flow to another method until the called method returns.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void print(int)\n  {\n    target.exercise1.DemoClass this;\n    int x, a;\n    java.io.PrintStream $stack4, $stack6;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    a = virtualinvoke this.<target.exercise1.DemoClass: \n      int increment(int)>(x);\n    $stack4 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack4.<java.io.PrintStream: \n      void println(int)>(a);\n\n    a = virtualinvoke this.<target.exercise1.DemoClass: \n      int increment(int)>(a);\n    $stack6 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack6.<java.io.PrintStream: \n      void println(int)>(a);\n\n    return;\n  }\n\n  public int increment(int)\n  {\n    int x, $stack2;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    $stack2 = x + 1;\n    return $stack2;\n  }\n}\n/*\n  \"specialinvoke this.<java.lang.Object: void <init>()>()\", \n  \"virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(x)\", \n  \"virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(a)\" \n    are JInvokeStmts.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void print(int x){\n    int a = increment(x);\n    System.out.println(a);\n    a = increment(a);\n    System.out.println(a);\n  }\n  public int increment(int x){\n    return x + 1;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic print(I)V\n  L0\n    LINENUMBER 5 L0\n    ALOAD 0\n    ILOAD 1\n    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I\n    ISTORE 2\n  L1\n    LINENUMBER 6 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L2\n    LINENUMBER 7 L2\n    ALOAD 0\n    ILOAD 2\n    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I\n    ISTORE 2\n  L3\n    LINENUMBER 8 L3\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L4\n    LINENUMBER 9 L4\n    RETURN\n  L5\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE x I L0 L5 1\n    LOCALVARIABLE a I L1 L5 2\n    MAXSTACK = 2\n    MAXLOCALS = 3\n\n// access flags 0x1\npublic increment(I)I\n  L0\n    LINENUMBER 11 L0\n    ILOAD 1\n    ICONST_1\n    IADD\n    IRETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE x I L0 L1 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#jassignstmt","title":"JAssignStmt","text":"

    assigns a Value from the right hand-side to the left hand-side. Left hand-side of an assignment can be a Local referencing a variable (i.e. a Local) or a FieldRef referencing a Field. Right hand-side of an assignment can be an expression (Expr), a Local, a FieldRef or a Constant.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: int counter> = 0;\n    return;\n  }\n\n  public int updateCounter()\n  {\n    target.exercise1.DemoClass this;\n    int $stack1, $stack2, $stack3;\n\n    this := @this: target.exercise1.DemoClass;\n\n    $stack1 = this.<target.exercise1.DemoClass: int counter>;\n    $stack2 = $stack1 + 1;\n    this.<target.exercise1.DemoClass: int counter> = $stack2;\n    $stack3 = this.<target.exercise1.DemoClass: int counter>;\n\n    return $stack3;\n  }\n}\n/*\n  \"this.<target.exercise1.DemoClass: int counter> = 0\", \n  \"$stack1 = this.<target.exercise1.DemoClass: int counter>\",\n  \"$stack2 = $stack1 + 1\"\n  \"this.<target.exercise1.DemoClass: int counter> = $stack2\"\n  \"$stack3 = this.<target.exercise1.DemoClass: int counter>\"\n    are JAssignStmts.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private int counter = 0;\n  public int updateCounter(){\n    counter = counter + 1;\n    return counter;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    ICONST_0\n    PUTFIELD target/exercise1/DemoClass.counter : I\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic updateCounter()I\n  L0\n    LINENUMBER 6 L0\n    ALOAD 0\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    ICONST_1\n    IADD\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L1\n    LINENUMBER 7 L1\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    IRETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jidentitystmt","title":"JIdentityStmt","text":"

    is semantically like the JAssignStmt and handles assignments of IdentityRef's to make implicit assignments explicit into the StmtGraph.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void DemoClass(int)\n  {\n    target.exercise1.DemoClass this;\n    int counter;\n\n    this := @this: target.exercise1.DemoClass;\n    counter := @parameter0: int;\n    this.<target.exercise1.DemoClass: int counter> = counter;\n    return;\n  }\n}\n/*\n  \"this := @this: target.exercise1.DemoClass\" and \n    \"counter := @parameter0: int\" are JIdentityStmts\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private int counter;\n  public void DemoClass(int counter){\n    this.counter = counter;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic DemoClass(I)V\n  L0\n    LINENUMBER 6 L0\n    ALOAD 0\n    ILOAD 1\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L1\n    LINENUMBER 7 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    LOCALVARIABLE counter I L0 L2 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#jentermonitorstmt-jexitmonitorstmt","title":"JEnterMonitorStmt & JExitMonitorStmt","text":"

    marks synchronized blocks of code from JEnterMonitorStmt to JExitMonitorStmt.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: int counter> = 0;\n    return;\n  }\n\n  public int updateCounter()\n  {\n    target.exercise1.DemoClass this;\n    int $stack4, $stack5, $stack7;\n    java.lang.Throwable $stack8;\n\n    this := @this: target.exercise1.DemoClass;\n\n    entermonitor this;\n\n    label1:\n      $stack4 = this.<target.exercise1.DemoClass: int counter>;\n      $stack5 = $stack4 + 1;\n      this.<target.exercise1.DemoClass: int counter> = $stack5;\n\n      exitmonitor this;\n\n    label2:\n      goto label5;\n\n    label3:\n      $stack8 := @caughtexception;\n\n      exitmonitor this;\n\n    label4:\n      throw $stack8;\n\n    label5:\n      $stack7 = this.<target.exercise1.DemoClass: int counter>;\n      return $stack7;\n\n      catch java.lang.Throwable from label1 to label2 with label3;\n      catch java.lang.Throwable from label3 to label4 with label3;\n  }\n}\n/*\n  \"entermonitor this\" is JEnterMonitorStmt.\n  \"exitmonitor this\" is JExitMonitorStmt.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private int counter = 0;\n  public int updateCounter(){\n    synchronized (this) {\n      counter = counter + 1;\n    }\n    return counter;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    ICONST_0\n    PUTFIELD target/exercise1/DemoClass.counter : I\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic updateCounter()I\n    TRYCATCHBLOCK L0 L1 L2 null\n    TRYCATCHBLOCK L2 L3 L2 null\n  L4\n    LINENUMBER 6 L4\n    ALOAD 0\n    DUP\n    ASTORE 1\n    MONITORENTER\n  L0\n    LINENUMBER 7 L0\n    ALOAD 0\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    ICONST_1\n    IADD\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L5\n    LINENUMBER 8 L5\n    ALOAD 1\n    MONITOREXIT\n  L1\n    GOTO L6\n  L2\n    FRAME FULL [target/exercise1/DemoClass java/lang/Object] \n      [java/lang/Throwable]\n    ASTORE 2\n    ALOAD 1\n    MONITOREXIT\n  L3\n    ALOAD 2\n    ATHROW\n  L6\n    LINENUMBER 9 L6\n    FRAME CHOP 1\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    IRETURN\n  L7\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L4 L7 0\n    MAXSTACK = 3\n    MAXLOCALS = 3\n}\n
    "},{"location":"jimple/#jretstmt","title":"JRetStmt","text":""},{"location":"jimple/#jbreakpointstmt","title":"JBreakpointStmt","text":"

    models a Breakpoint set by a Debugger (usually not relevant for static analyses)

    "},{"location":"jimple/#immediate","title":"Immediate","text":"

    An Immediate has a given Type and consists of a Local (\"a Variable\", \"Something that contains a Value\") or a Constant (\"Something that is a Value\").

    "},{"location":"jimple/#type","title":"Type","text":"

    VoidType

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  specialinvoke this.<java.lang.Object: void <init>()>();\n  return;\n  }\n\n  public void voidMethod()\n  {\n  java.io.PrintStream $stack1;\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  $stack1 = <java.lang.System: java.io.PrintStream out>;\n  virtualinvoke $stack1.<java.io.PrintStream: \n      void println(java.lang.String)>(\"In voidMethod().\");\n  return;\n  }\n}\n/*\n  For the SootMethod - <target.exercise1.DemoClass: void voidMethod()>, \n    returnType is instance of VoidType.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void voidMethod(){\n  System.out.println(\"In voidMethod().\");\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic voidMethod()V\n  L0\n    LINENUMBER 5 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"In voidMethod().\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 6 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#primarytype","title":"PrimaryType","text":"

    BooleanType, ByteType, CharType, ShortType, IntType, LongType, DoubleType, FloatType

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n      target.exercise1.DemoClass this;\n      this := @this: target.exercise1.DemoClass;\n      specialinvoke this.<java.lang.Object: void <init>()>();\n      return;\n  }\n\n\n  public void display()\n  {\n      java.io.PrintStream $stack11, $stack13, $stack15, \n        $stack17, $stack19, $stack21, $stack23, $stack25;\n      int $stack12, $stack14, $stack16, $stack18;\n      long $stack20;\n      double $stack22;\n      float $stack24;\n      target.exercise1.DemoClass this;\n      boolean $stack26;\n\n      this := @this: target.exercise1.DemoClass;\n\n      $stack11 = <java.lang.System: java.io.PrintStream out>;\n\n      goto label1;\n\n   label1:\n      $stack26 = 0;\n      virtualinvoke $stack11.<java.io.PrintStream: \n        void println(boolean)>($stack26);\n\n      $stack13 = <java.lang.System: java.io.PrintStream out>;\n      $stack12 = 127 - 1;\n      virtualinvoke $stack13.<java.io.PrintStream: \n        void println(int)>($stack12);\n\n      $stack15 = <java.lang.System: java.io.PrintStream out>;\n      $stack14 = 97 + 1;\n      virtualinvoke $stack15.<java.io.PrintStream: \n        void println(int)>($stack14);\n\n      $stack17 = <java.lang.System: java.io.PrintStream out>;\n      $stack16 = 1123 + 1;\n      virtualinvoke $stack17.<java.io.PrintStream: \n        void println(int)>($stack16);\n\n      $stack19 = <java.lang.System: java.io.PrintStream out>;\n      $stack18 = 123456 + 1;\n      virtualinvoke $stack19.<java.io.PrintStream: \n        void println(int)>($stack18);\n\n      $stack21 = <java.lang.System: java.io.PrintStream out>;\n      $stack20 = 10L + 1L;\n      virtualinvoke $stack21.<java.io.PrintStream: \n        void println(long)>($stack20);\n\n      $stack23 = <java.lang.System: java.io.PrintStream out>;\n      $stack22 = 10.1 + 1.0;\n      virtualinvoke $stack23.<java.io.PrintStream: \n        void println(double)>($stack22);\n\n      $stack25 = <java.lang.System: java.io.PrintStream out>;\n      $stack24 = 10.1F + 1.0F;\n      virtualinvoke $stack25.<java.io.PrintStream: \n        void println(float)>($stack24);\n\n      return;\n  }\n}\n/*\n  The JimpleLocal $stack12, $stack14, $stack16, $stack18 are of IntType. \n  Similarly, $stack20 is of LongType, $stack22 is of DoubleType and so on.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void display(){\n    boolean varBoolean = true;\n    byte varByte = 127;\n    char varChar = 'a';\n    short varShort = 1123;\n    int varInt = 123456;\n    long varLong = 10L;\n    double varDouble = 10.10;\n    float varFloat = 10.10f;\n\n    System.out.println(!varBoolean);\n    System.out.println(varByte-1);\n    System.out.println(varChar+1);\n    System.out.println(varShort+1);\n    System.out.println(varInt+1);\n    System.out.println(varLong+1);\n    System.out.println(varDouble+1);\n    System.out.println(varFloat+1);\n\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic display()V\n  L0\n    LINENUMBER 5 L0\n    ICONST_1\n    ISTORE 1\n  L1\n    LINENUMBER 6 L1\n    BIPUSH 127\n    ISTORE 2\n  L2\n    LINENUMBER 7 L2\n    BIPUSH 97\n    ISTORE 3\n  L3\n    LINENUMBER 8 L3\n    SIPUSH 1123\n    ISTORE 4\n  L4\n    LINENUMBER 9 L4\n    LDC 123456\n    ISTORE 5\n  L5\n    LINENUMBER 10 L5\n    LDC 10\n    LSTORE 6\n  L6\n    LINENUMBER 11 L6\n    LDC 10.1\n    DSTORE 8\n  L7\n    LINENUMBER 12 L7\n    LDC 10.1\n    FSTORE 10\n  L8\n    LINENUMBER 14 L8\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    IFNE L9\n    ICONST_1\n    GOTO L10\n  L9\n    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] \n      [java/io/PrintStream]\n    ICONST_0\n  L10\n    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] \n      [java/io/PrintStream I]\n    INVOKEVIRTUAL java/io/PrintStream.println (Z)V\n  L11\n    LINENUMBER 15 L11\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    ICONST_1\n    ISUB\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L12\n    LINENUMBER 16 L12\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 3\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L13\n    LINENUMBER 17 L13\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 4\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L14\n    LINENUMBER 18 L14\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 5\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L15\n    LINENUMBER 19 L15\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LLOAD 6\n    LCONST_1\n    LADD\n    INVOKEVIRTUAL java/io/PrintStream.println (J)V\n  L16\n    LINENUMBER 20 L16\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    DLOAD 8\n    DCONST_1\n    DADD\n    INVOKEVIRTUAL java/io/PrintStream.println (D)V\n  L17\n    LINENUMBER 21 L17\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    FLOAD 10\n    FCONST_1\n    FADD\n    INVOKEVIRTUAL java/io/PrintStream.println (F)V\n  L18\n    LINENUMBER 23 L18\n    RETURN\n  L19\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L19 0\n    LOCALVARIABLE varBoolean Z L1 L19 1\n    LOCALVARIABLE varByte B L2 L19 2\n    LOCALVARIABLE varChar C L3 L19 3\n    LOCALVARIABLE varShort S L4 L19 4\n    LOCALVARIABLE varInt I L5 L19 5\n    LOCALVARIABLE varLong J L6 L19 6\n    LOCALVARIABLE varDouble D L7 L19 8\n    LOCALVARIABLE varFloat F L8 L19 10\n    MAXSTACK = 5\n    MAXLOCALS = 11\n}\n
    "},{"location":"jimple/#referencetype","title":"ReferenceType","text":"

    ClassType, ArrayType NullType

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\npublic void <init>()\n  {\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  specialinvoke this.<java.lang.Object: void <init>()>();\n  return;\n  }\n\n  public target.exercise1.DemoClass getObject(target.exercise1.DemoClass)\n  {\n  target.exercise1.DemoClass obj, this;\n  this := @this: target.exercise1.DemoClass;\n  obj := @parameter0: target.exercise1.DemoClass;\n  return obj;\n  }\n\n  public void compute(boolean)\n  {\n  int[] b;\n  java.io.PrintStream $stack5, $stack6;\n  boolean check;\n  target.exercise1.DemoClass this;\n  int i;\n  null_type r0;\n  java.lang.NullPointerException soot0;\n  this := @this: target.exercise1.DemoClass;\n  check := @parameter0: boolean;\n  b = newarray (int)[5];\n  i = 0;\n\n  label1:\n    if i >= 5 goto label3;\n      if check == 0 goto label2;\n      r0 = (null_type) i;\n      soot0 = new java.lang.NullPointerException;\n      specialinvoke soot0.<java.lang.NullPointerException: \n        void <init>(java.lang.String)>\n          (\"This statement would have triggered an Exception: a[i#1] = r0\");\n      throw soot0;\n\n  label2:\n  b[i] = i;\n      i = i + 1;\n      goto label1;\n\n  label3:\n      $stack5 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack5.<java.io.PrintStream: \n        void println(java.lang.Object)>(b);\n      $stack6 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack6.<java.io.PrintStream: \n        void println(java.lang.Object)>(null);\n      return;\n  }\n}\n/*\n  The JimpleLocal b is of ArrayType,\n    and JimpleLocal r0 is of NullType.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n\n  public DemoClass getObject(DemoClass obj){\n    return obj;\n  }\n\n  public void compute(boolean check){\n    int a[] = null;\n    int b[] = new int[5];\n    for (int i = 0; i < 5; i++) {\n      if(check){\n        a[i] = i;\n      }\n        b[i] = i;\n    }\n    System.out.println(b);\n    System.out.println(a);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic getObject(Ltarget/exercise1/DemoClass;)Ltarget/exercise1/DemoClass;\n  L0\n    LINENUMBER 6 L0\n    ALOAD 1\n    ARETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE obj Ltarget/exercise1/DemoClass; L0 L1 1\n    MAXSTACK = 1\n    MAXLOCALS = 2\n\n// access flags 0x1\npublic compute(Z)V\n  L0\n    LINENUMBER 10 L0\n    ACONST_NULL\n    ASTORE 2\n  L1\n    LINENUMBER 11 L1\n    ICONST_5\n    NEWARRAY T_INT\n    ASTORE 3\n  L2\n    LINENUMBER 12 L2\n    ICONST_0\n    ISTORE 4\n  L3\n    FRAME APPEND [[I [I I]\n    ILOAD 4\n    ICONST_5\n    IF_ICMPGE L4\n  L5\n    LINENUMBER 13 L5\n    ILOAD 1\n    IFEQ L6\n  L7\n    LINENUMBER 14 L7\n    ALOAD 2\n    ILOAD 4\n    ILOAD 4\n    IASTORE\n  L6\n    LINENUMBER 16 L6\n    FRAME SAME\n    ALOAD 3\n    ILOAD 4\n    ILOAD 4\n    IASTORE\n  L8\n    LINENUMBER 12 L8\n    IINC 4 1\n    GOTO L3\n  L4\n    LINENUMBER 18 L4\n    FRAME CHOP 1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ALOAD 3\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V\n  L9\n    LINENUMBER 19 L9\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ALOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V\n  L10\n    LINENUMBER 20 L10\n    RETURN\n  L11\n    LOCALVARIABLE i I L3 L4 4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L11 0\n    LOCALVARIABLE check Z L0 L11 1\n    LOCALVARIABLE a [I L1 L11 2\n    LOCALVARIABLE b [I L2 L11 3\n    MAXSTACK = 3\n    MAXLOCALS = 5\n}\n
    "},{"location":"jimple/#local","title":"Local","text":"

    jimple i0 A Local is a variable and its scope is inside its method i.e. no referencing from outside a method. Values can be assigned to Locals via JIdentityStmt or JAssignStmt.

    JimpleJavaByte Code

    ```jimple public class target.exercise1.DemoClass extends java.lang.Object { public void () { target.exercise1.DemoClass this; this := @this: target.exercise1.DemoClass; specialinvoke this.()>(); return; }

    public void compute() { java.io.PrintStream $stack2, $stack3; target.exercise1.DemoClass this; int local#2;

    this := @this: target.exercise1.DemoClass;\n$stack2 = <java.lang.System: java.io.PrintStream out>;\nvirtualinvoke $stack2.<java.io.PrintStream: void println(int)>(1);\n\nlocal#2 = this.<target.exercise1.DemoClass: int global>;\n$stack3 = <java.lang.System: java.io.PrintStream out>;\nvirtualinvoke $stack3.<java.io.PrintStream: void println(int)>(local#2);\nreturn;\n

    } } /* $stack2, this, $stack3, local#2 are all JimpleLocal.

    \"this := @this: target.exercise1.DemoClass\" is JIdentityStmt

    \"$stack2 = \", \"local#2 = this.\", \"$stack3 = \" are JAssignStmt

    */ ```

    package target.exercise1;\n\npublic class DemoClass {\n\n  private int global;\n\n  public void compute(){\n    int local;\n    local = 1;\n    System.out.println(local);\n    local = this.global;\n    System.out.println(local);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I global\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic compute()V\n  L0\n    LINENUMBER 9 L0\n    ICONST_1\n    ISTORE 1\n  L1\n    LINENUMBER 10 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L2\n    LINENUMBER 11 L2\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.global : I\n    ISTORE 1\n  L3\n    LINENUMBER 12 L3\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L4\n    LINENUMBER 14 L4\n    RETURN\n  L5\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE local I L1 L5 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#constant","title":"Constant","text":"

    represents a value itself. don't confuse it with a variable/Local which has a immutable (i.e. final) attribute.

    There exists a constant entity for every Type - that way all value types can have a representation.

    "},{"location":"jimple/#expr","title":"Expr","text":"

    An expression is a language construct that returns a value. E.g. a binary operation such as addition.

    "},{"location":"jimple/#ref","title":"Ref","text":""},{"location":"jimple/#jarrayref","title":"JArrayRef","text":"

    jimple $arr[1] referencing a position inside an array.

    "},{"location":"jimple/#jfieldref-jstaticfieldref-jinstancefieldref","title":"JFieldRef (JStaticFieldRef & JInstanceFieldRef)","text":"

    jimple <SomePackage.ExampleClass: fieldname> // or r1.<SomePackage.ExampleClass: fieldname> referencing a Field via its FieldSignature and if necessary (i.e. with JInstanceFieldRef) the corresponding Local instance that points to the object instance.

    "},{"location":"jimple/#identityref","title":"IdentityRef","text":"

    The IdentityRef makes those implicit special value assignments explicit.

    "},{"location":"jimple/#jthisref","title":"JThisRef","text":"

    jimple @this: package.fruit.Banana represents the this pointer of the current class.

    "},{"location":"jimple/#jcaughtexceptionref","title":"JCaughtExceptionRef","text":"

    jimple @caughtexception represents the value of the thrown exception (caught by this exceptionhandler).

    "},{"location":"jimple/#jparameterref","title":"JParameterRef","text":"

    jimple i0 := @parameter0 i1 := @parameter1 represents a parameter of a method, identified by its index.

    "},{"location":"migrating/","title":"Migration Help","text":""},{"location":"migrating/#version-130","title":"Version 1.3.0","text":""},{"location":"migrating/#version-120","title":"Version 1.2.0","text":""},{"location":"migrating/#from-soot","title":"From Soot","text":"

    Below we show a comparison of the code so far with the same functionality in sootup.

    SootUpSoot
    AnalysisInputLocation<JavaSootClass> inputLocation =\nnew JavaClassPathAnalysisInputLocation(\"path2Binary\");\n\nJavaView view = new JavaView(inputLocation);\n\nJavaClassType classType = \n        view.getIdentifierFactory().getClassType(\"HelloWorld\");\n\nMethodSignature methodSignature =\n    view\n        .getIdentifierFactory()\n        .getMethodSignature(\n            \"main\", classType, \"void\",\n            Collections.singletonList(\"java.lang.String[]\"));\n\nJavaSootClass sootClass = view.getClass(classType).get();\n\nJavaSootMethod sootMethod =  sootClass.getMethod(methodSignature.getSubSignature()).get();\n\nsootMethod.getBody().getStmts();\n
    G.reset();\nString userdir = System.getProperty(\"user.dir\");\nString sootCp = \n        userdir \n        + File.separator \n        + \"target\" \n        + File.separator \n        + \"test-classes\"\n        + File.pathSeparator + \"lib\"+File.separator+\"rt.jar\";\n\nOptions.v().set_soot_classpath(sootCp);\nOptions.v().set_whole_program(true);\nOptions.v().setPhaseOption(\"cg.cha\", \"on\");\nOptions.v().setPhaseOption(\"cg\", \"all-reachable:true\");\nOptions.v().set_no_bodies_for_excluded(true);\nOptions.v().set_allow_phantom_refs(true);\nOptions.v().setPhaseOption(\"jb\", \"use-original-names:true\");\nOptions.v().set_prepend_classpath(false);\n\nScene.v().addBasicClass(\"java.lang.StringBuilder\");\nSootClass c = \n    Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);\nif (c != null) {\n    c.setApplicationClass();\n}\nScene.v().loadNecessaryClasses();\n\nSootMethod method;\nfor (SootClass c : Scene.v().getApplicationClasses()) {\n    if(c.getName().equals(\"example.HelloWorld\")){\n        for (SootMethod m : c.getMethods()) {\n            if (!m.hasActiveBody()) {\n                continue;\n            }\n            if (m.getName().equals(\"entryPoint\")) {\n                method = m;\n                break;\n            }\n        }\n    }\n}\n\nmethod.getActiveBody().getUnits();\n
    "},{"location":"qilin/","title":"Incorporate Qilin Pointer Analysis","text":"

    see QilinPTA.

    "},{"location":"qilin/#dependencies","title":"Dependencies","text":"MavenGradle
        <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.sourcecode</artifactId>\n        <version></version>\n    </dependency>\n
        compile \"org.soot-oss:sootup.qilin:1.3.0\"\n
    "},{"location":"qilin/#how-to","title":"How to","text":"

    // TODO

    "},{"location":"tool_ux/","title":"From Prototype to user friendly tool","text":"

    How was the parameter order again? For a lot of cli tools we see an arbitrary order of cli parameters, different options for giving a working directory etc.. So in the wild you can see a lot from run.sh/run.bat to make files just to reorder arguments and calling a tool.

    In SootUp we thought we could help on improving this madness while saving your time.

    The command line parser mimics the options the java executable accepts - at least for what is supported by SootUp.

    Dependencies:

    MavenGradle
    <dependency>\n    <groupId>commons-cli</groupId>\n    <artifactId>commons-cli</artifactId>\n    <version>1.8.0</version>\n</dependency>\n
        implementation(\"commons-cli:commons-cli:1.8.0\")\n
    "},{"location":"tool_ux/#java-code","title":"Java Code","text":"
    class SootUpConfiguration{\n    // TODO incorporate\n}\n

    We are happy if you steal the following code to create a tool where the setup is just simple.

    "},{"location":"tools/","title":"Who uses SootUp","text":""},{"location":"whatsnew/","title":"What's new in SootUp?","text":""},{"location":"whatsnew/#library-by-default","title":"Library by default","text":"

    While Soot is a library and a stand-alone command-line application. SootUp, on the other hand, is designed to be a core library. It assumes that it is embedded in a client application that owns the thread of control. It can be extended with a command-line interface, included in other software projects as a library, or integrated into IDEs with JimpleLSP.

    "},{"location":"whatsnew/#modular-architecture","title":"Modular Architecture","text":"

    SootUp has a modular architecture, which enables its clients to include only the necessary functionality to their applications.

    "},{"location":"whatsnew/#no-more-singletons","title":"No More Singletons","text":"

    Singletons offer a single view of a single program version, which makes it impossible to analyze multiple programs or multiple versions of the same program. SootUp does not make use of singletons such the Scene class in the old Soot any more. It enables analyzing multiple programs simultaneously.

    "},{"location":"whatsnew/#new-source-code-frontend","title":"New Source Code Frontend","text":"

    Soot's JastAdd-based java frontend is not maintained anymore. In SootUp, we use WALA's well-maintained source code frontend, which will not only allow Soot to analyze Java source code, but also JavaScript and Python.

    "},{"location":"whatsnew/#immutable-by-design","title":"Immutable by Design","text":"

    SootUp has been designed with the goal of immutability in mind. This makes sharing objects between several entities easier, because there is no need to worry about unintended changes to other entities.

    "},{"location":"whatsnew/#withers-instead-of-setters","title":"Withers instead of Setters","text":"

    Due to the goal of immutability, many classes do not have setters anymore. For example, a Body does not have a method setStmts(List<Stmt> stmts). Instead, a method called withStmts(List<Stmt> stmts) has been added. This does not modify the original instance, but returns a copy of the Body but with the provided stmts in its instance. This concept of so-called with-ers can be found all throughout SootUp.

    A simplified example

    class Body {\n  final List<Stmt> stmts;\n  final List<Local> locals;\n\n  Body(List<Stmt> stmts, List<Local> locals) {\n    this.stmts = stmts;\n    this.locals = locals;\n  }  \n\n  Body withStmts(List<Stmt> stmts) { return new Body(stmts, this.locals); }\n  Body withLocals(List<Local> locals) { return new Body(this.stmts, locals); }\n}\n
    "},{"location":"whatsnew/#intermediate-representation","title":"Intermediate Representation","text":"

    Jimple is the only intermediate representation (IR) in SootUp. We modified it slightly to be able to accommodate different programming languages in the future.

    "},{"location":"write_analyses/","title":"Write your own Interprocedural Dataflow Analysis","text":""},{"location":"write_analyses/#dependencies","title":"Dependencies","text":"MavenGradle
    <dependency>\n    <groupId>org.soot-oss</groupId>\n    <artifactId>sootup.analysis</artifactId>\n    <version></version>\n</dependency>\n
        compile \"org.soot-oss:sootup.analysis:1.3.0\"\n
    "},{"location":"write_analyses/#useful-knowledge","title":"Useful Knowledge","text":"

    Background Knowledge as online lectures are available on YouTube.

    "},{"location":"write_analyses/#examples","title":"Examples","text":"

    Taint Analysis, TypeState Analysis, Linear Constant Propagation, ...

    // TODO incorporate & guide through examples\n

    If you wish to implement an interprocedural data-flow analysis via the IFDS or IDE Framework please have a look at the test cases in the sootup.analysis submodule.

    "}]} \ No newline at end of file diff --git a/_preview/sitemap.xml b/_preview/sitemap.xml deleted file mode 100644 index f586a560098..00000000000 --- a/_preview/sitemap.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - https://soot-oss.github.io/SootUp/_preview/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/advanced-topics/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/analysisinputlocations/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/announce/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/bodyinterceptors/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/call-graph-construction/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/docguide/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/examples/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/faq/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/getting-started/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/installation/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/jimple/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/migrating/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/qilin/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/tool_ux/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/tools/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/whatsnew/ - 2024-06-17 - daily - - - https://soot-oss.github.io/SootUp/_preview/write_analyses/ - 2024-06-17 - daily - - \ No newline at end of file diff --git a/_preview/sitemap.xml.gz b/_preview/sitemap.xml.gz deleted file mode 100644 index 5415bd9cc0315bb37005e342bc63773d242f5842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmV-=0fqh_iwFpSd~ap~|8r?{Wo=<_E_iKh0M(bxZo?o9$M1cLD0f0yP5V-s-u41p z&lLrlcp{i$r)l4Qq^+jjCryG2VA$iF6A^$6#?5p1*$N1l60RoB=1I9S8rvzDAJe{+*a4oIMnT& zg;E+qWPwCg2i%YQ3Q&F~(>BOmi1q|_l8u}L9^)19fTms5t0z%Ei{(plx!WGxbgz78 z578c5qrhDn`Cz$$$zQTRGAeUYURxs=18B;F*(-M;An;-26stJNAQyCxV><6FVE1S) z;MqoP17pnNgtc-`bWw#~=%fmcqn_oF1-n7rjbQRnhdrwyIGcwm4(gZ%XJ?tyBPNJd zWNWfuhE!##=u|dk_6@Uevp^jnU1hT(vY0Aez?wg3PC diff --git a/_preview/tool_ux/index.html b/_preview/tool_ux/index.html deleted file mode 100644 index 366a3cf7849..00000000000 --- a/_preview/tool_ux/index.html +++ /dev/null @@ -1,1094 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - From Prototype to Tool - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - Skip to content - - -
    -
    - -
    - - - - - - - - - - - - - -
    - - - - -
    - -
    - - - - - - -
    -
    - - - -
    -
    -
    - - - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    - - - - - - - -

    From Prototype to user friendly tool

    -

    How was the parameter order again? -For a lot of cli tools we see an arbitrary order of cli parameters, different options for giving a working directory etc.. -So in the wild you can see a lot from run.sh/run.bat to make files just to reorder arguments and calling a tool.

    -

    In SootUp we thought we could help on improving this madness while saving your time.

    -

    The command line parser mimics the options the java executable accepts - at least for what is supported by SootUp.

    -

    Dependencies:

    -
    -
    -
    -
    1
    -2
    -3
    -4
    -5
    <dependency>
    -    <groupId>commons-cli</groupId>
    -    <artifactId>commons-cli</artifactId>
    -    <version>1.8.0</version>
    -</dependency>
    -
    -
    -
    -
    1
        implementation("commons-cli:commons-cli:1.8.0")
    -
    -
    -
    -
    -

    Java Code

    -
    1
    -2
    -3
    class SootUpConfiguration{
    -    // TODO incorporate
    -}
    -
    -

    We are happy if you steal the following code to create a tool where the setup is just simple.

    - - - - - - - - - - - - - -
    -
    - - - -
    - -
    - - - - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/_preview/tools/index.html b/_preview/tools/index.html deleted file mode 100644 index 537f34009ec..00000000000 --- a/_preview/tools/index.html +++ /dev/null @@ -1,994 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Who uses SootUp - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - Skip to content - - -
    -
    - -
    - - - - - - - - - - - - - -
    - - - - -
    - -
    - - - - - - -
    -
    - - - -
    -
    -
    - - - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    - - - - - - - -

    Who uses SootUp

    - - - - - - - - - - - - - - -
    -
    - - - -
    - -
    - - - - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/_preview/whatsnew/index.html b/_preview/whatsnew/index.html deleted file mode 100644 index 4ac67754a71..00000000000 --- a/_preview/whatsnew/index.html +++ /dev/null @@ -1,1240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Design Decisions - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - Skip to content - - -
    -
    - -
    - - - - - - - - - - - - - -
    - - - - -
    - -
    - - - - - - -
    -
    - - - -
    -
    -
    - - - - - -
    -
    -
    - - - - - - - -
    -
    - - - - - - - -

    What's new in SootUp?

    -

    Library by default

    -

    While Soot is a library and a stand-alone command-line application. SootUp, on the other hand, is designed to be a core library. -It assumes that it is embedded in a client application that owns the thread of control. -It can be extended with a command-line interface, included in other software projects as a library, or integrated into IDEs with JimpleLSP.

    -

    Modular Architecture

    -

    SootUp has a modular architecture, which enables its clients to include only the necessary functionality to their applications.

    -
      -
    • core module contains the core building blocks such as the jimple IR, control flow graphs, and frontend interfaces. The rest of the modules build on the core module.
    • -
    • java.core module contains parts that are essential for analyzing Java code.
    • -
    • java.bytecode module contains the functionality that is necessary for taking as input java bytecode.
    • -
    • java.sourcecode module contains the functionality that is necessary for taking as input java source code. -Beware: The sourcecodefrontend is currently unable to handle inputs with exceptions (try/catch/finally)!
    • -
    • callgraph module contains implementations of common call graph construction algorithms such as CHA, RTA. A reimplementation of Spark pointer analysis framework is in progress.
    • -
    • jimple.parser module contains the functionalty that is necessary for taking as input .jimple files.
    • -
    • analysis module enables performing interprocedural dataflow analyses.
    • -
    -

    No More Singletons

    -

    Singletons offer a single view of a single program version, which makes it impossible to analyze multiple programs or multiple versions of the same program. -SootUp does not make use of singletons such the Scene class in the old Soot any more. It enables analyzing multiple programs simultaneously.

    -

    New Source Code Frontend

    -

    Soot's JastAdd-based java frontend is not maintained anymore. -In SootUp, we use WALA's well-maintained source code frontend, which will not only allow Soot to analyze Java source code, but also JavaScript and Python.

    -

    Immutable by Design

    -

    SootUp has been designed with the goal of immutability in mind. -This makes sharing objects between several entities easier, because there is no need to worry about unintended changes to other entities.

    -

    Withers instead of Setters

    -

    Due to the goal of immutability, many classes do not have setters anymore. -For example, a Body does not have a method setStmts(List<Stmt> stmts). -Instead, a method called withStmts(List<Stmt> stmts) has been added. -This does not modify the original instance, but returns a copy of the Body but with the provided stmts in its instance. -This concept of so-called with-ers can be found all throughout SootUp.

    -
    -

    A simplified example

    -
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    class Body {
    -  final List<Stmt> stmts;
    -  final List<Local> locals;
    -
    -  Body(List<Stmt> stmts, List<Local> locals) {
    -    this.stmts = stmts;
    -    this.locals = locals;
    -  }  
    -
    -  Body withStmts(List<Stmt> stmts) { return new Body(stmts, this.locals); }
    -  Body withLocals(List<Local> locals) { return new Body(this.stmts, locals); }
    -}
    -
    -
    -

    Intermediate Representation

    -

    Jimple is the only intermediate representation (IR) in SootUp. We modified it slightly to be able to accommodate different programming languages in the future.

    - - - - - - - - - - - - - -
    -
    - - - -
    - -
    - - - - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/_preview/write_analyses/index.html b/_preview/write_analyses/index.html deleted file mode 100644 index 1a9d8ed8244..00000000000 --- a/_preview/write_analyses/index.html +++ /dev/null @@ -1,1128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Write a Dataflow analysis - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - Skip to content - - -
    -
    - -
    - - - - - - - - - - - - - -
    - - - - -
    - -
    - - - - - - -
    -
    - - - -
    -
    -
    - - - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    - - - - - - - -

    Write your own Interprocedural Dataflow Analysis

    -

    Dependencies

    -
    -
    -
    -
    1
    -2
    -3
    -4
    -5
    <dependency>
    -    <groupId>org.soot-oss</groupId>
    -    <artifactId>sootup.analysis</artifactId>
    -    <version></version>
    -</dependency>
    -
    -
    -
    -
    1
        compile "org.soot-oss:sootup.analysis:1.3.0"
    -
    -
    -
    -
    -

    Useful Knowledge

    -

    Background Knowledge as online lectures are available on YouTube.

    - -

    Examples

    -

    Taint Analysis, TypeState Analysis, Linear Constant Propagation, ...

    -
    1
    // TODO incorporate & guide through examples
    -
    -

    If you wish to implement an interprocedural data-flow analysis via the IFDS or IDE Framework please have a look at the test cases in the sootup.analysis submodule.

    - - - - - - - - - - - - - -
    -
    - - - -
    - -
    - - - - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/doc_how2startATool_preview/404.html b/doc_how2startATool_preview/404.html index bd6ab52c4b8..7dff33e4839 100644 --- a/doc_how2startATool_preview/404.html +++ b/doc_how2startATool_preview/404.html @@ -11,8 +11,8 @@ - - + + @@ -20,10 +20,10 @@ - + - + @@ -42,9 +42,11 @@ - + - + + + @@ -59,7 +61,7 @@ - + @@ -77,48 +79,89 @@ - + + + + + + + + + +
    + + + - -
    @@ -844,10 +951,10 @@

    404 - Not found

    - + - + diff --git a/doc_how2startATool_preview/advanced-topics/index.html b/doc_how2startATool_preview/advanced-topics/index.html index 86c16e7b211..af520919413 100644 --- a/doc_how2startATool_preview/advanced-topics/index.html +++ b/doc_how2startATool_preview/advanced-topics/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    diff --git a/doc_how2startATool_preview/analysisinputlocations/index.html b/doc_how2startATool_preview/analysisinputlocations/index.html index 01cf85ddf08..ec532db7488 100644 --- a/doc_how2startATool_preview/analysisinputlocations/index.html +++ b/doc_how2startATool_preview/analysisinputlocations/index.html @@ -8,17 +8,17 @@ - + - + - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    diff --git a/doc_how2startATool_preview/announce/index.html b/doc_how2startATool_preview/announce/index.html index 17bc0c975db..ae9d40a3034 100644 --- a/doc_how2startATool_preview/announce/index.html +++ b/doc_how2startATool_preview/announce/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    diff --git a/doc_how2startATool_preview/bodyinterceptors/index.html b/doc_how2startATool_preview/bodyinterceptors/index.html index 2cd18530551..992531698f8 100644 --- a/doc_how2startATool_preview/bodyinterceptors/index.html +++ b/doc_how2startATool_preview/bodyinterceptors/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    diff --git a/doc_how2startATool_preview/call-graph-construction/index.html b/doc_how2startATool_preview/call-graph-construction/index.html index b8a6e77da10..d01990d4597 100644 --- a/doc_how2startATool_preview/call-graph-construction/index.html +++ b/doc_how2startATool_preview/call-graph-construction/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    diff --git a/_preview/css/customizetheme.css b/doc_how2startATool_preview/css/customizetheme.css similarity index 100% rename from _preview/css/customizetheme.css rename to doc_how2startATool_preview/css/customizetheme.css diff --git a/doc_how2startATool_preview/docguide/index.html b/doc_how2startATool_preview/docguide/index.html index 7e7f9569bbb..b024e8473d6 100644 --- a/doc_how2startATool_preview/docguide/index.html +++ b/doc_how2startATool_preview/docguide/index.html @@ -8,13 +8,13 @@ - + - + @@ -44,6 +44,8 @@ + + @@ -61,7 +63,7 @@ - + @@ -84,48 +86,89 @@ - + + + + + + + +
    - -
    diff --git a/_preview/examples/index.html b/doc_how2startATool_preview/examples/index.html similarity index 100% rename from _preview/examples/index.html rename to doc_how2startATool_preview/examples/index.html diff --git a/doc_how2startATool_preview/faq/index.html b/doc_how2startATool_preview/faq/index.html index 3c8b7dbdd81..3b926ecf7ef 100644 --- a/doc_how2startATool_preview/faq/index.html +++ b/doc_how2startATool_preview/faq/index.html @@ -8,15 +8,15 @@ - + - + - + @@ -46,6 +46,8 @@ + + @@ -63,7 +65,7 @@ - + @@ -86,48 +88,89 @@ - + + + + + + + +
    - -
    diff --git a/doc_how2startATool_preview/getting-started/index.html b/doc_how2startATool_preview/getting-started/index.html index 21a06830870..3c28e1819c3 100644 --- a/doc_how2startATool_preview/getting-started/index.html +++ b/doc_how2startATool_preview/getting-started/index.html @@ -8,17 +8,17 @@ - + - + - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + - + + + +
    - -
    @@ -400,15 +447,6 @@ - - -
  14. - - - SootUp vs Soot - - -
  15. @@ -426,6 +464,27 @@ +
  16. + + + + + Examples + + + + +
  17. + + + + + + + + + +
  18. @@ -778,11 +837,11 @@
  19. - + - Migrating from Soot + Migration Help @@ -957,15 +1016,6 @@ -
  20. - -
  21. - - - SootUp vs Soot - - -
  22. @@ -1193,270 +1243,6 @@

    Retrieving the Control-Fl

    Access or Download all of the code used above

    BasicSetup.java

    -

    SootUp vs Soot

    -

    Below we show a comparison of the code so far with the same functionality in sootup.

    -
    -
    -
    -
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    AnalysisInputLocation<JavaSootClass> inputLocation =
    -new JavaClassPathAnalysisInputLocation("path2Binary");
    -
    -JavaView view = new JavaView(inputLocation);
    -
    -JavaClassType classType = 
    -        view.getIdentifierFactory().getClassType("HelloWorld");
    -
    -MethodSignature methodSignature =
    -    view
    -        .getIdentifierFactory()
    -        .getMethodSignature(
    -            "main", classType, "void",
    -            Collections.singletonList("java.lang.String[]"));
    -
    -JavaSootClass sootClass = view.getClass(classType).get();
    -
    -JavaSootMethod sootMethod =  sootClass.getMethod(methodSignature.getSubSignature()).get();
    -
    -sootMethod.getBody().getStmts();
    -
    -
    -
    -
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
    -17
    -18
    -19
    -20
    -21
    -22
    -23
    -24
    -25
    -26
    -27
    -28
    -29
    -30
    -31
    -32
    -33
    -34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    G.reset();
    -String userdir = System.getProperty("user.dir");
    -String sootCp = 
    -        userdir 
    -        + File.separator 
    -        + "target" 
    -        + File.separator 
    -        + "test-classes"
    -        + File.pathSeparator + "lib"+File.separator+"rt.jar";
    -
    -Options.v().set_soot_classpath(sootCp);
    -Options.v().set_whole_program(true);
    -Options.v().setPhaseOption("cg.cha", "on");
    -Options.v().setPhaseOption("cg", "all-reachable:true");
    -Options.v().set_no_bodies_for_excluded(true);
    -Options.v().set_allow_phantom_refs(true);
    -Options.v().setPhaseOption("jb", "use-original-names:true");
    -Options.v().set_prepend_classpath(false);
    -
    -Scene.v().addBasicClass("java.lang.StringBuilder");
    -SootClass c = 
    -    Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);
    -if (c != null) {
    -    c.setApplicationClass();
    -}
    -Scene.v().loadNecessaryClasses();
    -
    -SootMethod method;
    -for (SootClass c : Scene.v().getApplicationClasses()) {
    -    if(c.getName().equals("example.HelloWorld")){
    -        for (SootMethod m : c.getMethods()) {
    -            if (!m.hasActiveBody()) {
    -                continue;
    -            }
    -            if (m.getName().equals("entryPoint")) {
    -                method = m;
    -                break;
    -            }
    -        }
    -    }
    -}
    -
    -method.getActiveBody().getUnits();
    -
    -
    -
    -
    - - - - - - -

    SootUp-Examples

    -

    Example code to help getting start with SootUp

    -

    1) Here we will provide some examples that uses SootUp to provide insights about a Java program. The repository that contains the examples can be found in [https://github.com/soot-oss/SootUp-Examples.git]. -2) There are mainly 5 projects to be considered under SootUp. - a) BasicSetupExample - b) BodyInterceptorExample - c) CallGraphExample - d) ClassHierarchyExample - e) MutatingSootClassExample

    -

    3) We have included all the five projects in 5 different branches under SootUp-Examples with detailed explanation about the project.

    -
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    -14
    -15
    -16
     a) BasicSetupExample 
    -       1) package sootup.examples; - defines the package name for the Java class.
    -       2) import statement - defines various classes and interfaces from different packages that the program uses.
    -       3) public class BasicSetup - declares a public class named 'BasicSetup' which is the main class for this program.
    -       4) Then we have created a main method which is the entry point of the progrram
    -       5) Path pathToBinary object pointing to a directory that contains the binary files ie class files to be analyzed and Paths.get is a static method that converts string path to a 'Path' object.
    -       6) AnalysisInputLocation object specifying where SootUp should look for classes to analyze.
    -       7) View object is created for the project allowing the retrieal of classes from the specified input location. JavaView is specific implementation of View tailed for Java projects.
    -       8) The ClassType object is created for the class name 'HelloWorld'. This object represents the type of class to be analyzed.
    -       9) A MethodSignature object is created for the main method of the HelloWorld class. This signature specifies the method's return type (void) and its parameter types (a single parameter of type String[]).
    -       10) The if statment checks for the presences of the class 'HelloWorld'. If not it prints "Class not ffound!" and exits the program.
    -       11) Then it retrieves the SootClass object representing the HelloWorld class, assuming it is present.
    -       12) view.getMethod(methodSignature); - Attempts to retrieve the specified method from the project.
    -       13) The if statment after this, checks if the main method is present in the HelloWorld class. If not, it prints "Method not found!" and exits.
    -       14) Then the next statment retrieves the SootMethod object for the main method and prints its body, which is in Jimple, a simplified version of Java bytecode used by Soot for analysis and transformation.
    -       15) Then the next if condition checks if the method containts a specific statement called 'Hello World!'.
    -
    -

    b) BodyInterceptor - 1) package sootup.examples; - defines the package name for the Java class. - 2) import statement - defines various classes and interfaces from different packages that the program uses. - 3) public class BodyInterceptor - declares a public class named "BodyInterceptor". - 4) Then we have created a main method in which is the entry point for the code. - 5) Then we have created an AnalysisInputLocation pointing to a directory with class files to be loaded. It specifies that the DeadAssignmentEliminator interceptor should be applied to these classes. - 6) Then created a View that initializes a JavaView with the specified inputLocation, allowing interaction with the classes for analysis. - 7) Then have created a ClassType and MethodSignature which is used for analysis. The signature contains method name, return type and parameters. - 8) Then we check for the existence of the class and method in the given view. - 9) If they exist, a SootClass and SootMethod objects are used to retrieve the same. - 10) Then prints the body of the SootMethod object. - 11) Then we check if the interceptor worked. ie here we check if the DeadAssignmentEliminator interceptor has successfully removed a specific assignment (l1 = 3) from the method's body. It does this by looking through all statements (JAssignStmt) in the method body and checking if the assignment is not present. - 12) Then it prints the result of the interceptor check.

    -

    c) CallGraphExample - 1) package sootup.examples; - defines the package name for the Java class. - 2) import statement - defines various classes and interfaces from different packages that the program uses. - 3) public class CallgraphExample - declares a public class named "CallGraphExample". - 4) Then we have created a main method in which is the entry point for the code. - 5) List inputLocations creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis. - 6) Then we have provided towo inputLocations.add() - one for the project's class file directory and another for Java's runtime library (rt.jar). - 7) Then we have created a JavaView which is used for analysing the Java program. - 8) Then we have created two ClassType for two classes ie 'A' and 'B'. They are used to create a MethodSignature for a method that will be analysed. - 9) ViewTypeHierarchy - then we have set up a type hierarchy from the provided view and prints the subclasses of class 'A'. - 10) Initializes a CallGraphAlgorithm using the ClassHierarchyAnalysisAlgorithm, which is a method for constructing call graphs. - 11) Then we creates a call graph by initialising the Class Hierarchy Analysis (cha) with the entry method signature. - 12) Prints information about calls from the entry method in the call graph.

    -

    d) ClassHierarchyExample - 1) package sootup.examples; - defines the package name for the Java class. - 2) import statement - defines various classes and interfaces from different packages that the program uses. - 3) public class ClassHierarchy - declares a public class named "ClassHierarchy". - 4) Then we have created a main method in which is the entry point for the code. - 5) Then creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis. Two locations are added: one for the project's binary directory and another for the default Java runtime library (rt.jar). - 6) Initializes a JavaView object with the previously created input locations. - 7) Initializes a ViewTypeHierarchy object using the view. This object will be used to analyze the class hierarchy. - 8) Then we have created two ClassTypes. These lines get JavaClassType objects for classes "A" and "C". These types are used for further hierarchy analysis. - 9) Checks the direct subclasses of class "C". It verifies if all direct subclasses are "D" using two different methods: comparing class names and fully qualified names. - 10) Then prints a message based on whether all direct subtypes of "C" are correctly identified as "D". - 11) Retrieves and checks the superclasses of class "C". It then verifies if these superclasses include class "A" and java.lang.Object, printing a message based on the result.

    -
     1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 9
    -10
    -11
    -12
    -13
    e) MutatingSootClassExample
    -
    -       1) package sootup.examples; - defines the package name for the Java class.
    -       2) import statement - defines various classes and interfaces from different packages that the program uses.
    -       3) public class MutatingSootClass - declares a public class named "MutatingSootClass".
    -       4) Then we have created a main method in which is the entry point for the code.
    -       5) First we have created an 'AnalysisInputLocation' which points to a directory which contains the class files to be analysed.
    -       6) Then we have created a JavaView which allos us to retrievet the classes.
    -       7) And also created a ClassType to get the class 'HelloWorld' and a method within that class ie main for analysis using MethodSignature.
    -       8) THen we are checking and retrieving the class and method.
    -       9) Then we retrives the existing body of the method and prints it. Then we create a new local variable to add it copy to the method body.
    -       10) Then we are overriding the method body and class. ie this lines creates new sources that overrides teh original method body and class. It replaces the old method in the class with the new method having the modified body.
    -       11) Prints the modified method body and checks if the new local variable (newLocal) exists in the modified method. Depending on the result, it prints a corresponding message.
    -
    @@ -1479,11 +1265,47 @@

    SootUp-Examples

    -
    - -
    diff --git a/doc_how2startATool_preview/index.html b/doc_how2startATool_preview/index.html index c275e8d1ae6..2e2d2f5c53d 100644 --- a/doc_how2startATool_preview/index.html +++ b/doc_how2startATool_preview/index.html @@ -8,7 +8,7 @@ - + @@ -16,7 +16,7 @@ - + @@ -46,6 +46,8 @@ + + @@ -63,7 +65,7 @@ - + @@ -86,48 +88,89 @@ - + + + + + + + +
    - -
    diff --git a/doc_how2startATool_preview/installation/index.html b/doc_how2startATool_preview/installation/index.html index 4fb907dc482..f7d49114b2d 100644 --- a/doc_how2startATool_preview/installation/index.html +++ b/doc_how2startATool_preview/installation/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    <dependencies>
    +37
    +38
    +39
    +40
    +41
    +42
    <dependencies>
         <dependency>
             <groupId>org.soot-oss</groupId>
             <artifactId>sootup.core</artifactId>
    @@ -1014,6 +1087,11 @@ 

    Use Releases on Maven Central

    <artifactId>sootup.analysis</artifactId> <version>1.3.0</version> </dependency> + <dependency> + <groupId>org.soot-oss</groupId> + <artifactId>sootup.qilin</artifactId> + <version>1.3.0</version> + </dependency> </dependencies>
    @@ -1029,18 +1107,20 @@

    Use Releases on Maven Central

    9 10 11 -12
    repositories {
    -    mavenCentral()
    -    google()
    -}
    -
    -compile "org.soot-oss:sootup.core:1.3.0"
    -compile "org.soot-oss:sootup.java.core:1.3.0"
    -compile "org.soot-oss:sootup.java.sourcecode:1.3.0"
    -compile "org.soot-oss:sootup.java.bytecode:1.3.0"
    -compile "org.soot-oss:sootup.jimple.parser:1.3.0"
    -compile "org.soot-oss:sootup.callgraph:1.3.0"
    -compile "org.soot-oss:sootup.analysis:1.3.0"
    +12
    +13
    repositories {
    +    mavenCentral()
    +    google()
    +}
    +
    +compile "org.soot-oss:sootup.core:1.3.0"
    +compile "org.soot-oss:sootup.java.core:1.3.0"
    +compile "org.soot-oss:sootup.java.sourcecode:1.3.0"
    +compile "org.soot-oss:sootup.java.bytecode:1.3.0"
    +compile "org.soot-oss:sootup.jimple.parser:1.3.0"
    +compile "org.soot-oss:sootup.callgraph:1.3.0"
    +compile "org.soot-oss:sootup.analysis:1.3.0"
    +compile "org.soot-oss:sootup.qilin:1.3.0"
     
    @@ -1073,11 +1153,47 @@

    Build from Source

    -
    diff --git a/doc_how2startATool_preview/jimple/index.html b/doc_how2startATool_preview/jimple/index.html index 98ae8370fe2..c9df824688a 100644 --- a/doc_how2startATool_preview/jimple/index.html +++ b/doc_how2startATool_preview/jimple/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    diff --git a/_preview/migrating/index.html b/doc_how2startATool_preview/migrating/index.html similarity index 100% rename from _preview/migrating/index.html rename to doc_how2startATool_preview/migrating/index.html diff --git a/doc_how2startATool_preview/migration/index.html b/doc_how2startATool_preview/migration/index.html deleted file mode 100644 index 4f7ffc4bdfe..00000000000 --- a/doc_how2startATool_preview/migration/index.html +++ /dev/null @@ -1,882 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - From Soot - SootUp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - - - -
    - - -
    - -
    - - - - - - -
    -
    - - - -
    -
    -
    - - - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    - - - - - - - -

    From Soot

    -

    // TODO

    - - - - - - - - - - - - - -
    -
    - - - -
    - -
    - - - -
    -
    -
    -
    - - - - - - - - - - \ No newline at end of file diff --git a/_preview/overrides/partials/footer.html b/doc_how2startATool_preview/overrides/partials/footer.html similarity index 100% rename from _preview/overrides/partials/footer.html rename to doc_how2startATool_preview/overrides/partials/footer.html diff --git a/_preview/overrides/partials/header.html b/doc_how2startATool_preview/overrides/partials/header.html similarity index 100% rename from _preview/overrides/partials/header.html rename to doc_how2startATool_preview/overrides/partials/header.html diff --git a/doc_how2startATool_preview/qilin/index.html b/doc_how2startATool_preview/qilin/index.html index 51719132ec4..5013984a331 100644 --- a/doc_how2startATool_preview/qilin/index.html +++ b/doc_how2startATool_preview/qilin/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
    - -
    @@ -330,6 +377,27 @@ +
  23. + + + + + Examples + + + + +
  24. + + + + + + + + + +
  25. @@ -742,11 +810,11 @@
  26. - + - Migrating from Soot + Migration Help @@ -917,8 +985,26 @@

    Incorporate Qilin Pointer Analysis

    see QilinPTA.

    Dependencies

    -
    1
        // TODO: add submodule
    +
    +
    +
    +
    1
    +2
    +3
    +4
    +5
        <dependency>
    +        <groupId>org.soot-oss</groupId>
    +        <artifactId>sootup.java.sourcecode</artifactId>
    +        <version></version>
    +    </dependency>
    +
    +
    +
    +
    1
        compile "org.soot-oss:sootup.qilin:1.3.0"
     
    +
    +
    +

    How to

    // TODO

    @@ -943,11 +1029,47 @@

    How to

    -
    - -
    diff --git a/doc_how2startATool_preview/search/search_index.json b/doc_how2startATool_preview/search/search_index.json index 2e02e10d86e..f727c8b5309 100644 --- a/doc_how2startATool_preview/search/search_index.json +++ b/doc_how2startATool_preview/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"What's SootUp?","text":"

    SootUp is a complete overhaul of the good, old static analysis framework Soot.

    • Transforms JVM bytecode to the intermediate representation Jimple.
    • Provides ClassHierarchy generation
    • CallGraph generation with different algorithms/precisions
    • Inter-procedural data-flow analysis with the IDE/IFDS framework enabled by Heros
    • Applies simple transformations on retrieving a methods Body (see BodyInterceptor)
    • Provides serialization of the Jimple IR.

    Important

    SootUp is not a version update to Soot, it is a completely new implementation written from scratch that aims to be a leaner, modernized and developer friendly successor of Soot. It is not a Drop-In Replacement! The new architecture and API, renders it not trivial to update existing projects that were built on soot. Therefore we recommend using SootUp for greenfield projects. We hope improved type safety and streamlined mechanisms will aide you implementing and debugging your analysis tool. Unfortunately not every feature has been ported - If you miss something feel free to contribute a feature you miss from good old Soot.

    "},{"location":"#why-sootup","title":"Why SootUp?","text":"

    Over the 20+ years, SootUps predecessor Soot has evolved into a powerful framework, which is one of the most widely used tools in the static analysis community. This evolution was guided by the needs of the community and carried out with ad-hoc improvements. As a result, Soot has become a tool that can do a multitude of things, but it is heavy and hard to maintain and comprehend. So there was the need to clean up the codebase e.g. improve the software architecture, remove legacy datastructures that weren't in the Java Runtime at the time of Soots creation, enforce validation to have a sane state, removing the necessity of arcane knowledge, document it more and more - to make Soot future prove. So we introduced Design changes in SootUp, which aim to address Soot's shortcomings. The goal is a lighter library that can easily be understood and maintained to be included in other projects.

    "},{"location":"#supporters","title":"Supporters","text":"

    The development of SootUp is financed by generous support from the German Research Foundation (DFG) and the Heinz Nixdorf Institute (HNI).

    Become a sponsor!

    "},{"location":"advanced-topics/","title":"Functionalities and Utilities","text":""},{"location":"advanced-topics/#locallivenessanalyser","title":"LocalLivenessAnalyser","text":"

    LocalLivenessAnalyser is used for querying for the list of live local variables before and after a given Stmt.

    Example:

    The live local variables before and after each Stmt will be calculated after generating an instance of LocalLivenessAnalyser as shown the example above. They can be queried by using the methods getLiveLocalsBeforeStmt and getLiveLocalsAfterStmt.

    "},{"location":"advanced-topics/#dominancefinder","title":"DominanceFinder","text":"

    DomianceFinder is used for querying for the immediate dominator and dominance frontiers for a given basic block.

    Example:

    After generating an instance of DominanceFinder for a BlockGraph, we will get the immediate dominator and dominance frontiers for each basic block. The both properties can be queried by using the methodsgetImmediateDominatorandgetDominanceFrontiers.

    "},{"location":"analysisinputlocations/","title":"AnalysisInputLocations","text":"

    An AnalysisInputLocation tells SootUp what code input it should analyze.

    "},{"location":"analysisinputlocations/#java-runtime","title":"Java Runtime","text":"
    • Java <9: DefaultRTJaAnalysisInputLocation current rt.jar (or point to any rt.jar as its just a usual .jar file)
    • Java >8: JRTFilesystemAnalysisInputLocation

    If you have errors like Java.lang.String, Java.lang.Object, ... you are most likely missing this AnalysisInput.

    "},{"location":"analysisinputlocations/#java-bytecode-class-jar-war","title":"Java Bytecode .class, .jar, .war","text":"
    • JavaClassPathAnalysisInputLocation - its the equivalent of the classpath you would pass to the java executable i.e. point to root(s) of package(s).
    "},{"location":"analysisinputlocations/#java-sourcecode-java","title":"Java Sourcecode .java","text":"
    • OTFCompileAnalysisInputLocation - you can point directly to .java files or pass a String with Java sourcecode
    • JavaSourcePathInputLocation - points to a directory that is the root source directory (containing the package directory structure)
    "},{"location":"analysisinputlocations/#jimple-jimple","title":"Jimple .jimple","text":"
    • JimpleAnalysisInputLocation - needs a Path to a .jimple file or a directory.
    "},{"location":"analysisinputlocations/#android-bytecode-dex","title":"Android Bytecode .dex","text":"
    • ApkAnalysisInputLocation - currenlty uses dex2jar internally - SootUp solution is WIP!
    "},{"location":"analysisinputlocations/#java-cli-arguments-to-configure-sootup","title":"Java cli arguments to configure SootUp","text":"

    We created a Utility that parses a String of java command line arguments and configures SootUp respectively.

    "},{"location":"announce/","title":"Announcements","text":""},{"location":"announce/#release-announcement","title":"Release Announcement","text":"

    We would like to announce Soot\u2019s successor, SootUp.

    Over more than 20 years, Soot has become one of the world\u2019s most popular academic tool for Java and Android analysis and instrumentation. We thank all of you who have used and contributed to it over the years! It was your feedback and your contributions that helped it grow into such a versatile tool!

    However, over the years, the requirements for Soot have changed a lot, and given its original architecture, it was no longer quite up to the task. Soot was originally developed for ahead-of-time code transformation, particularly optimization, which has become very uncommon in Java. Current use cases center much more around powerful program analyses and program-understanding tasks.

    Today we are officially releasing SootUp, a new version of Soot with a completely overhauled architecture. With SootUp, we aim to keep the best things about Soot, yet overcome a lot of its drawbacks. We very much restructured Soot, particularly abolishing the heavy use of singletons. Soot now has a concept of views; each view corresponds to some version or variant of an analyzed program, and multiple views can be kept in memory at the same time. This sets the foundation, for instance, for differential or incremental program analyses.

    SootUp is a library that can easily be included in other projects, leaving those projects in control. For those who intend to use it as a framework, with inversion of control, SootUp provides additional templates that help you and novices to get started more easily. The Jimple IR has been slightly simplified, and has been made immutable by default such that internally SootUp can make use of caching where desired. Where required, Jimple transformations are still allowed, but in a systematic manner, for instance assuring that analyses depending on the transformed code are notified about its changes.

    Below is an overview of what\u2019s new.

    • Library by default, framework as an option
    • Modular Architecture, no more singletons
    • New source code frontend
    • Immutable Jimple IR
    • Greatly increased testability and test coverage

    SootUp is not a drop-in replacement for Soot! Due to its completely new architecture and API it is essentially an almost complete rewrite. For a while, Soot and SootUp will coexist, as many existing tools depend on Soot, yet our maintenance efforts will henceforth be focused on SootUp, not Soot, and on extending SootUp with those capabilities that people still find missing. For now, we recommend using SootUp for greenfield projects.

    For more details, check out * The SootUp home page: https://soot-oss.github.io/SootUp/, and * The SootUp repository: https://github.com/soot-oss/SootUp/

    We are very much looking forward to your feedback and feature requests. To this end, best create appropriate issues in the repository.

    This major upgrade of Soot was made possible by generous competitive funding by the DFG, within the project \u201cFuture-proofing the Soot Framework for Program Analysis and Transformation (FutureSoot)\u201d. It was funded in the DFG\u2019s program on Research Software Sustainability.

    "},{"location":"bodyinterceptors/","title":"Body Interceptors","text":"

    BodyInterceptors are applied to each Body now by default, if not overridden in the used AnalysisInputLocations. The BodyInterceptors exist to to improve and normalize the raw Jimple that was generated in an earlier step. The \"raw\" generated Jimple from the Bytecodefrontend needs a lot improvements - deficits of raw Jimple are:

    • Java Variables with that are compiled to the same Local index, but from different scopes inside the method are mapped to the same Local. The Localsplitter takes care of splitting these Locals that are semantically different, into two seperate Local instances.
    • The Conversion from a stack-machine to a register-machine creates leftover assignments - handled/inlined/removed by the Aggregator, CopyPropagator. They inline unnecessary Assignments.
    • As the previous BodyTransformers could optimize code that leads to unused assignments etc - The DeadAssignmentEliminator keeps the StmtGraph clean from unused/dead Assignments.
    • The Locals we get from the Java bytecode are typically untyped. Therefore we have to augment the Local types which is done by the TypeAssigner.
    • t.b.c.

    Method scoped optimisations: - ConditionalBranchFolder: removes tautologic ifs that are always true/false - if we can determine it in the scope of the method. - EmptySwitchEliminator: removes switches that are not really switching - ConstantPropagatorAndFolder: calculates constant values before runtime - CastAndReturnInliner: Removes merging flows to a single return - UnreachableCodeEliminator: speaks for itself. - TrapTightener

    Make Local names standardized: - LocalNameStandardizer: numbers Locals with the scheme: type-initial + number of type occurence

    Soot Equivalent

    BodyTransformer

    Below, we show how these BodyInterceptors work for the users who are interested in their internal workings.

    "},{"location":"bodyinterceptors/#localsplitter","title":"LocalSplitter","text":"

    LocalSplitter is aBodyInterceptorthat attempts to identify and separate uses of a local variable (as definition) that are independent of each other by renaming local variables.

    Example 1:

    As shown in the example above, the local variablel1is defined twice. It can be split up into two new local variables: l1#1 and l1#2 because the both definitions are independent of each other.

    Look for foldable navigation and tabs for showing old vs new

    Example 2:

    In the second example, the local variablel2is defined thrice. But it cannot be split up into three new local variables as in the first example, because its definitions in the if-branches are not independent of each other. Therefore, it can only be split up into two local variables as shown in the figure.

    "},{"location":"bodyinterceptors/#localpacker","title":"LocalPacker","text":"

    LocalPacker is aBodyInterceptorthat attempts to minimize the number of local variables which are used in body by reusing them, when it is possible. It corresponds to the inverse body transformation of LocalSplitter. Note: Every local variable's type should be assigned before running LocalPacker.

    Example:

    In the given example above, the local variablesl1,l3are summarized to be one local variablel1, because they have the same type without interference with each other. Likewise, the local variablesl2,l4andl5are summarized to be another local variablel2. Although the local variablel0doesn't interfere any other local variables, it cannot be summed up with other local variables because of its distinctive type.

    "},{"location":"bodyinterceptors/#traptightener","title":"TrapTightener","text":"

    WIP - currently not available!

    TrapTightener is aBodyInterceptorthat shrinks the protected area covered by each Trap in a Body.

    Example:

    We assume in the example above that only theStmt:l2 := 2might throw an exception caught by theTrapwhich is labeled withlabel3. In the jimple body before running the TrapTightener, the protected area covered by the Trap contains threeStmts:l1 := 1; l2 := 2; l2 := 3. But an exception could only arise at theStmt:l2 := 2. After the implementation of TrapTightener, we will get a contractible protected area which contains only theStmtthat might throw an exception, namely theStmt:l2 := 2.

    "},{"location":"bodyinterceptors/#emptyswitcheliminator","title":"EmptySwitchEliminator","text":"

    EmptySwitchEliminator is aBodyInterceptorthat removes empty switch statements which contain only the default case.

    Example:

    As shown in the example above, the switch statement in the jimple body always takes the default action. After running EmptySwitchEliminator, the switch statement is replaced with aGotoStmtto the default case.

    "},{"location":"bodyinterceptors/#unreachablecodeeliminator","title":"UnreachableCodeEliminator","text":"

    UnreachableCodeEliminator is aBodyInterceptorthat removes all unreachable statements.

    Example:

    Obviously, the code segmentl2 = 2; l3 = 3;is unreachable. It will be removed after running the UreachableCodeEliminator.

    "},{"location":"bodyinterceptors/#copypropagator","title":"CopyPropagator","text":"

    CopyPropagator is aBodyInterceptorthat supports the global copy propagation and constant propagation.

    Example for global copy propagation:

    Consider a code segment in the following form:

    a = b;\n...\nc = use(a); // a, b, c are local variables\n

    According to the copy propagation's definition, the statementc = use(a)can be replaced withc = use(b)iff both conditions are met:

    • ais defined only one time on all the paths froma = btoc = use(a).
    • There are no definitions ofbon any path froma = btoc = use(a).

    In the example for global copy propagation, the first usedl1is replaced withl0, but the second usedl1cannot be replaced withl3, because the second condition is not satisfied.

    Example for constant propagation:

    Constant propagation is similar to copy propagation. Consider a code segment in the following form:

    a = const;\n...\nb = use(a); // a, b are local variables, const is a constant\n

    After perfoming the constant propagation, the statementb = use(a)can be replaced withb = use(const)iffais not redefined on any of the paths froma = consttob = use(a).

    Therefore, the first usedl1in the second example can be replaced with the constant1, but the second usedl1cannot be replaced with the constant2, becausel1is redefined on the path froml1 = 2tol4 = use(l1). However, it can be replaced with local variablel2, because the both conditions of copy propagation are met.

    "},{"location":"bodyinterceptors/#localnamestandardizer","title":"LocalNameStandardizer","text":"

    LocalNameStandardizer is aBodyInterceptorthat assigns a generic name to each local variable. Firstly, it will sort the local variables' order alphabetically by the string representation of their type. If there are two local variables with the same type, then the LocalNameStandardizer will use the sequence of their occurrence in jimple body to determine their order. Each assigned name consists of two parts:

    • A letter to imply the local variable's type
    • A digit to imply the local variable's order

    The following table shows the letter corresponding to each type:

    Type of Local Variable Letter boolean z byte b short s int i long l float f double d char c null n unknown e reference r"},{"location":"bodyinterceptors/#staticsingleassignmentformer","title":"StaticSingleAssignmentFormer","text":"

    StaticSingleAssignmentFormer is aBodyInterceptorthat transforms jimple body into SSA form, so that each local variable is assigned exactly once and defined before its first use.

    Example:

    In the given example, the StaticSingleAssignmentFormer assigns eachIdentityStmtandAssignStmtto a new local variable . And each use uses the local variable which is most recently defined. Sometimes, it is impossible to determine the most recently defined local variable for a use in a join block. In this case, the StaticSingleAssignmentFormer will insert aPhiStmtin the front of the join block to merge all most recently defined local variables and assign them a new local variable.

    "},{"location":"call-graph-construction/","title":"Call Graph Construction","text":"

    A call graph shows the method calling relationship of a program. It is a directed graph, whose nodes represent different methods, and edges represent caller -> callee relationship.

    SootUp contains several call graph construction algorithms. Below, we show how you can use each of these.

    "},{"location":"call-graph-construction/#creating-the-type-hierarchy","title":"Creating the Type Hierarchy","text":"

    All the call graph construction algorithms require the view to access the type hierarchy for resolving method calls based of sub typing relationship. Below, we show how to create a type hierarchy:

    SootUpSoot
    List<AnalysisInputLocation> inputLocations = new ArrayList();\ninputLocations.add(new JavaClassPathAnalysisInputLocation(\"src/test/resources/Callgraph/binary\"));\ninputLocations.add(new DefaultRTJarAnalysisInputLocation());\n\nJavaView view = new JavaView(inputLocations);\n
    String targetTestClassName = target.exercise1.Hierarchy.class.getName();\nG.reset();\nString userdir = System.getProperty(\"user.dir\");\nString sootCp = userdir + File.separator + \"target\" + File.separator + \"test-classes\"+ File.pathSeparator + \"lib\"+File.separator+\"rt.jar\";\nOptions.v().set_whole_program(true);\nOptions.v().set_soot_classpath(sootCp);\nOptions.v().set_no_bodies_for_excluded(true);\nOptions.v().process_dir();\nOptions.v().set_allow_phantom_refs(true);\nOptions.v().setPhaseOption(\"jb\", \"use-original-names:true\");\nOptions.v().set_prepend_classpath(false);\nSootClass c = Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);\nif (c != null)\n    c.setApplicationClass();\nScene.v().loadNecessaryClasses();\n\nHierarchy hierarchy = new Hierarchy();\n
    "},{"location":"call-graph-construction/#defining-an-entry-method","title":"Defining an Entry Method","text":"

    All the call graph construction algorithms require an entry method to start with. In java application, you usually define the main method. However, it is possible to define arbitrary entry methods depending on your needs. Below, we show how to define such an entry method:

    SootUpSoot
    JavaClassType classTypeA = view.getIdentifierFactory().getClassType(\"A\");\n\nMethodSignature entryMethodSignature =\n    view.getIdentifierFactory()\n        .getMethodSignature(\n            classTypeA,\n            JavaIdentifierFactory.getInstance()\n                .getMethodSubSignature(\n                    \"calc\", VoidType.getInstance(), Collections.singletonList(classTypeA)));    \n
    SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");     \n
    "},{"location":"call-graph-construction/#class-hierarchy-analysis","title":"Class Hierarchy Analysis","text":"

    Class Hierarchy Analysis (CHA) algorithm is the most sound call graph construction algorithm available in SootUp. It soundly includes all implementers of an interface, when resolving a method call on an interface. You can construct a call graph with CHA as follows:

    SootUpSoot
    CallGraphAlgorithm cha = \n        new ClassHierarchyAnalysisAlgorithm(view);\n\nCallGraph cg = \n        cha.initialize(Collections.singletonList(entryMethodSignature));\n\nSystem.out.println(cg);\n
    CHATransformer.v().transform();\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n    }\n
    "},{"location":"call-graph-construction/#rapid-type-analysis","title":"Rapid Type Analysis","text":"

    Rapid Type Analysis (RTA) algorithm constructs a rather precise version of the call graph that the CHA constructs. It refines CHA by considering only the instantiated implementers of an interface, when resolving a method call on an interface. You can construct a call graph with RTA as follows:

    SootUpSoot
    CallGraphAlgorithm rta = \n        new RapidTypeAnalysisAlgorithm(view);\n\nCallGraph cg = \n        rta.initialize(Collections.singletonList(entryMethodSignature));\n\nSystem.out.println(cg);\n
    Transform sparkConfig = new Transform(\"cg.spark\", null);\nPhaseOptions.v().setPhaseOption(sparkConfig, \"enabled:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"rta:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"on-fly-cg:false\");\nMap phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);\nSparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n}  \n
    "},{"location":"call-graph-construction/#variable-type-analysis","title":"Variable Type Analysis","text":"

    Variable Type Analysis (VTA) algorithm further refines the call graph that the RTA constructs. It refines RTA by considering only the assigned instantiations of the implementers of an interface, when resolving a method call on an interface. When considering assignments, we usually need to consider pointer (points-to) relationship.

    Info

    VTA algorithm was implemented using the Spark pointer analysis framework. A reimplementation of Spark in SootUp is currently under development.

    Spark requires an initial call graph to begin with. You can use one of the call graphs that we have constructed above. You can construct a call graph with VTA as follows:

    SootUpSoot
    Spark spark = new Spark.Builder(view, callGraph).vta(true).build();\nspark.analyze();\nCallGraph vtaCAllGraph = spark.getCallGraph();\n
    Transform sparkConfig = new Transform(\"cg.spark\", null);\nPhaseOptions.v().setPhaseOption(sparkConfig, \"enabled:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"vta:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"on-fly-cg:false\");\nMap phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);\nSparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n}    \n
    "},{"location":"docguide/","title":"Docguide","text":""},{"location":"docguide/#general","title":"General","text":""},{"location":"docguide/#mkdocsextensions","title":"MkDocsExtensions","text":""},{"location":"docguide/#tooltip","title":"Tooltip","text":"

    Hover me

    "},{"location":"docguide/#example-file-inclusion","title":"Example File inclusion","text":"

    this enables that tutorial code can be tested and will fail if its not up to date anymore :)

    package sootup.examples.basicSetup;\n\nimport static org.junit.jupiter.api.Assertions.assertTrue;\n\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Collections;\nimport org.junit.jupiter.api.Tag;\nimport org.junit.jupiter.api.Test;\nimport sootup.core.inputlocation.AnalysisInputLocation;\nimport sootup.core.jimple.common.expr.JVirtualInvokeExpr;\nimport sootup.core.jimple.common.stmt.JInvokeStmt;\nimport sootup.core.model.SootClass;\nimport sootup.core.model.SootMethod;\nimport sootup.core.signatures.MethodSignature;\nimport sootup.core.types.ClassType;\nimport sootup.core.views.View;\nimport sootup.java.bytecode.inputlocation.PathBasedAnalysisInputLocation;\nimport sootup.java.core.language.JavaJimple;\nimport sootup.java.core.views.JavaView;\n\n/** This example illustrates how to create and use a new Soot Project. */\n@Tag(\"Java8\")\npublic class BasicSetup {\n\n  @Test\n  public void createByteCodeProject() {\n    // Create a AnalysisInputLocation, which points to a directory. All class files will be loaded\n    // from the directory\n    Path pathToBinary = Paths.get(\"src/test/resources/BasicSetup/binary\");\n    AnalysisInputLocation inputLocation = PathBasedAnalysisInputLocation.create(pathToBinary, null);\n\n    // Create a view for project, which allows us to retrieve classes\n    View view = new JavaView(inputLocation);\n\n    // Create a signature for the class we want to analyze\n    ClassType classType = view.getIdentifierFactory().getClassType(\"HelloWorld\");\n\n    // Create a signature for the method we want to analyze\n    MethodSignature methodSignature =\n        view.getIdentifierFactory()\n            .getMethodSignature(\n                classType, \"main\", \"void\", Collections.singletonList(\"java.lang.String[]\"));\n\n    // Assert that class is present\n    assertTrue(view.getClass(classType).isPresent());\n\n    // Retrieve class\n    SootClass sootClass = view.getClass(classType).get();\n\n    // Retrieve method\n    view.getMethod(methodSignature);\n\n    // Alternatively:\n    assertTrue(sootClass.getMethod(methodSignature.getSubSignature()).isPresent());\n    SootMethod sootMethod = sootClass.getMethod(methodSignature.getSubSignature()).get();\n\n    // Read jimple code of method\n    System.out.println(sootMethod.getBody());\n\n    // Assert that Hello world print is present\n    assertTrue(\n        sootMethod.getBody().getStmts().stream()\n            .anyMatch(\n                stmt ->\n                    stmt instanceof JInvokeStmt\n                        && stmt.getInvokeExpr() instanceof JVirtualInvokeExpr\n                        && stmt.getInvokeExpr()\n                            .getArg(0)\n                            .equivTo(JavaJimple.getInstance().newStringConstant(\"Hello World!\"))));\n  }\n}\n
    "},{"location":"faq/","title":"Frequently Asked Questions","text":""},{"location":"faq/#how-to-setup-the-soot-dependency-in-maven-gradle","title":"How to setup the soot dependency (in Maven, Gradle)?","text":"

    See Installation.

    "},{"location":"faq/#how-to-retreive-a-sootclass-or-sootmethod","title":"How to retreive a SootClass or SootMethod?","text":"

    See Getting Started.

    "},{"location":"faq/#is-there-a-github-template-to-quickstart-into-development-with-sootup","title":"Is there a github template to quickstart into development with SootUp?","text":"

    Not yet.

    "},{"location":"faq/#error-while-using-the-sourcecodefrontend","title":"Error while using the Sourcecodefrontend","text":"

    Please make sure to use Java8 to execute.

    "},{"location":"faq/#exception-provider-jrt-not-found","title":"Exception: Provider \"jrt\" not found","text":"

    java.lang.ExceptionInInitializerError\n    at sootup.java.bytecode.inputlocation.JrtFileSystemAnalysisInputLocationTest.getClassSource(JrtFileSystemAnalysisInputLocationTest.java:28)\n    ...\nCaused by: java.nio.file.ProviderNotFoundException: Provider \"jrt\" not found\n
    To execute SootUp with JavaModules support please make sure you run the code at least the Java9 Runtime.

    "},{"location":"faq/#how-to-solve-a-concurrentmodificationexception","title":"How to solve a ConcurrentModificationException?","text":"

    Copy the Iterator into an intermediate Collection.

    final StmtGraph<?> stmtGraph = builder.getStmtGraph();\n    for (Stmt stmt : Lists.newArrayList(stmtGraph)){\n        ...\n    }\n}\n

    "},{"location":"faq/#how-can-i-visualize-a-stmtgraph","title":"How can I visualize a StmtGraph?","text":"

    There exists a tool, that converts a StmtGraph to the Graphviz Dot Language.

    DotExporter.buildGraph( stmtgraph );\n
    or create a convenient link with the exported stmtgraph as HTTP GET Parameter
    DotExporter.createUrlToWebeditor( stmtgraph );\n

    "},{"location":"faq/#is-there-a-way-to-use-code-exploration-and-syntax-highlighting-features-in-my-ide-for-jimple-files","title":"Is there a way to use code exploration and syntax highlighting features in my IDE for .jimple files?","text":"

    Try JimpeLsp.

    "},{"location":"faq/#is-there-a-way-to-use-syntax-highlighting-of-jimple-in-my-paper-thesis","title":"Is there a way to use syntax highlighting of .jimple in my paper, thesis, ...?","text":"

    Have a look at LspLexer4Pygments.

    "},{"location":"faq/#how-to-add-an-entry-in-this-list-ie-your-question-is-not-answered-here","title":"How to ... add an entry in this list? i.e. Your question is not answered here?","text":"

    Feel free to start a Discussion.

    "},{"location":"getting-started/","title":"General Usage of SootUp","text":"

    This page walks you through the core data structures, as well as shows how to get started with SootUp.

    "},{"location":"getting-started/#the-core-datastructures","title":"The core datastructures","text":"

    Before you get started with the SootUp library, it helps to learn about the following core data structures:

    • AnalysisInputLocation: points to the target code to be analyzed.

    Soot Equivalent

    It corresponds to the cp option, which specifies the classpath for Soot to find classes to be analyzed.

    • View: presents the code/classes under analysis.

    Soot Equivalent

    It corresponds to the Scene class, but it is not a singleton. So it is possible to instantiate multiple views simultaneously.

    • SootClass: represents a class loaded into the View.

    • SootMethod: represents a method of a class.

    • SootField: represents a field of a class.

    • Body: represents a method body in Jimple.

    • StmtGraph: represents the control flow graph of a method body in Jimple statements.

    "},{"location":"getting-started/#creating-a-view","title":"Creating a View","text":"

    You can use bytecode analysis typically when you do not have access to the source code of the target program. Following example shows how to create a view for analyzing Java bytecode.

    Create a view to analyze Java bytecode

    AnalysisInputLocation inputLocation = \n        new JavaClassPathAnalysisInputLocation(\"path2Binary\");\n\nJavaView view = new JavaView(inputLocation);\n

    If you have access to the source code, it is also possible to create a view for analyzing source code. Following example shows how to create view for analyzing Java source code.

    Experimental

    The source code frontend is experimental and should only be used for testing purposes. You should compile the code for analysis first and use the bytecode frontend instead.

    Create a view to analyze Java source code

    AnalysisInputLocation inputLocation = \n        new JavaSourcePathAnalysisInputLocation(\"path2Source\");\n\nJavaView view = new JavaView(inputLocation);\n

    If you have a Jimple file, you can create a view for analyzing jimple code directly. Following example shows how to create a view for analyzing jimple code.

    Create a project to analyze jimple code

    Path pathToJimple = Paths.get(\"path2Jimple\");\n\nAnalysisInputLocation inputLocation = \n        new JimpleAnalysisInputLocation(pathToJimple);\n\nJimpleView view = new JimpleView(inputLocation);\n

    By default, whenever a class is retrieved, it will be permanently stored in a cache. If you do not want retrieved classes to be stored indefinetly, you can instead provide a different CacheProvider to the created view. To for example use an LRUCache instead, which stores at most 50 classes, and always replaces the least recently used class by a newly retrieved one, use the following call:

    JavaView view = new JavaView(Collections.singletonList(inputLocation), new LRUCacheProvider(50));\n
    "},{"location":"getting-started/#retrieving-a-class","title":"Retrieving a Class","text":"

    Each class is identified with a unique signature adhering to Java identifier rules, therefore you first need to specify the class signature (ClassType) as shown below.

    Let's say the following is the target program that we want to analyze:

    Target Program

    package example;\n\npublic class HelloWorld {\n\n  public HelloWorld() {\n\n  }\n\n  public static void main(String[] args) {\n    HelloWorld hw = new HelloWorld();\n    hw.hello();\n  }\n\n  public void hello() {\n\n  }\n\n}\n

    Then, we could define the ClassType of the HelloWorld class as follows:

    Defining a ClassType

    JavaClassType classType = \n        view.getIdentifierFactory().getClassType(\"example.HelloWorld\");\n

    Once we have a ClassType that identifies the HelloWorld class, we can use it to retrieve the corresponding SootClass object from the view as shown below:

    Retrieving a SootClass

    JavaSootClass sootClass = view.getClass(classType).get();\n
    "},{"location":"getting-started/#retrieving-a-method","title":"Retrieving a Method","text":"

    Like the classes, methods also have an identifier which we call MethodSignature. For instance, we can define the method signature for identifying the main method of the HelloWorld class as follows:

    Defining a MethodSignature

    MethodSignature methodSignature =\n    view\n        .getIdentifierFactory()\n        .getMethodSignature(\n            \"main\", // method name\n            classType,\n            \"void\", // return type\n            Collections.singletonList(\"java.lang.String[]\")); // args\n

    Once we have a MethodSignature that identifies the main method of the HelloWorld class, we can use it to retrieve the corresponding SootMethod object from the view as shown below:

    Retrieving a SootMethod from the View

    Optional<SootMethod> opt = view.getMethod(methodSignature);\n\nif(opt.isPresent()){\n  SootMethod method = opt.get();\n}\n

    Alternatively, we can also retrieve a SootMethod from SootClass that contains it.

    Retrieving a SootMethod from a SootClass

    Optional<JavaSootMethod> opt = sootClass.getMethod(methodSignature.getSubSignature());\n\nif(opt.isPresent()){\n  JavaSootMethod method = opt.get();\n}\n
    "},{"location":"getting-started/#retrieving-the-control-flow-graph-of-a-method","title":"Retrieving the Control-Flow Graph of a Method","text":"

    Each SootMethod contains a Control-Flow Graph (CFG) which is represented via the StmtGraph. This structure is usually used for program analysis. You can retrieve the CFG of a SootMethod as follows:

    Retrieving the CFG of a SootMethod

    sootMethod.getBody().getStmts();\n

    Access or Download all of the code used above

    BasicSetup.java

    "},{"location":"getting-started/#sootup-vs-soot","title":"SootUp vs Soot","text":"

    Below we show a comparison of the code so far with the same functionality in sootup.

    SootUpSoot
    AnalysisInputLocation<JavaSootClass> inputLocation =\nnew JavaClassPathAnalysisInputLocation(\"path2Binary\");\n\nJavaView view = new JavaView(inputLocation);\n\nJavaClassType classType = \n        view.getIdentifierFactory().getClassType(\"HelloWorld\");\n\nMethodSignature methodSignature =\n    view\n        .getIdentifierFactory()\n        .getMethodSignature(\n            \"main\", classType, \"void\",\n            Collections.singletonList(\"java.lang.String[]\"));\n\nJavaSootClass sootClass = view.getClass(classType).get();\n\nJavaSootMethod sootMethod =  sootClass.getMethod(methodSignature.getSubSignature()).get();\n\nsootMethod.getBody().getStmts();\n
    G.reset();\nString userdir = System.getProperty(\"user.dir\");\nString sootCp = \n        userdir \n        + File.separator \n        + \"target\" \n        + File.separator \n        + \"test-classes\"\n        + File.pathSeparator + \"lib\"+File.separator+\"rt.jar\";\n\nOptions.v().set_soot_classpath(sootCp);\nOptions.v().set_whole_program(true);\nOptions.v().setPhaseOption(\"cg.cha\", \"on\");\nOptions.v().setPhaseOption(\"cg\", \"all-reachable:true\");\nOptions.v().set_no_bodies_for_excluded(true);\nOptions.v().set_allow_phantom_refs(true);\nOptions.v().setPhaseOption(\"jb\", \"use-original-names:true\");\nOptions.v().set_prepend_classpath(false);\n\nScene.v().addBasicClass(\"java.lang.StringBuilder\");\nSootClass c = \n    Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);\nif (c != null) {\n    c.setApplicationClass();\n}\nScene.v().loadNecessaryClasses();\n\nSootMethod method;\nfor (SootClass c : Scene.v().getApplicationClasses()) {\n    if(c.getName().equals(\"example.HelloWorld\")){\n        for (SootMethod m : c.getMethods()) {\n            if (!m.hasActiveBody()) {\n                continue;\n            }\n            if (m.getName().equals(\"entryPoint\")) {\n                method = m;\n                break;\n            }\n        }\n    }\n}\n\nmethod.getActiveBody().getUnits();\n
    "},{"location":"getting-started/#sootup-examples","title":"SootUp-Examples","text":"

    Example code to help getting start with SootUp

    1) Here we will provide some examples that uses SootUp to provide insights about a Java program. The repository that contains the examples can be found in [https://github.com/soot-oss/SootUp-Examples.git]. 2) There are mainly 5 projects to be considered under SootUp. a) BasicSetupExample b) BodyInterceptorExample c) CallGraphExample d) ClassHierarchyExample e) MutatingSootClassExample

    3) We have included all the five projects in 5 different branches under SootUp-Examples with detailed explanation about the project.

     a) BasicSetupExample \n       1) package sootup.examples; - defines the package name for the Java class.\n       2) import statement - defines various classes and interfaces from different packages that the program uses.\n       3) public class BasicSetup - declares a public class named 'BasicSetup' which is the main class for this program.\n       4) Then we have created a main method which is the entry point of the progrram\n       5) Path pathToBinary object pointing to a directory that contains the binary files ie class files to be analyzed and Paths.get is a static method that converts string path to a 'Path' object.\n       6) AnalysisInputLocation object specifying where SootUp should look for classes to analyze.\n       7) View object is created for the project allowing the retrieal of classes from the specified input location. JavaView is specific implementation of View tailed for Java projects.\n       8) The ClassType object is created for the class name 'HelloWorld'. This object represents the type of class to be analyzed.\n       9) A MethodSignature object is created for the main method of the HelloWorld class. This signature specifies the method's return type (void) and its parameter types (a single parameter of type String[]).\n       10) The if statment checks for the presences of the class 'HelloWorld'. If not it prints \"Class not ffound!\" and exits the program.\n       11) Then it retrieves the SootClass object representing the HelloWorld class, assuming it is present.\n       12) view.getMethod(methodSignature); - Attempts to retrieve the specified method from the project.\n       13) The if statment after this, checks if the main method is present in the HelloWorld class. If not, it prints \"Method not found!\" and exits.\n       14) Then the next statment retrieves the SootMethod object for the main method and prints its body, which is in Jimple, a simplified version of Java bytecode used by Soot for analysis and transformation.\n       15) Then the next if condition checks if the method containts a specific statement called 'Hello World!'.\n

    b) BodyInterceptor 1) package sootup.examples; - defines the package name for the Java class. 2) import statement - defines various classes and interfaces from different packages that the program uses. 3) public class BodyInterceptor - declares a public class named \"BodyInterceptor\". 4) Then we have created a main method in which is the entry point for the code. 5) Then we have created an AnalysisInputLocation pointing to a directory with class files to be loaded. It specifies that the DeadAssignmentEliminator interceptor should be applied to these classes. 6) Then created a View that initializes a JavaView with the specified inputLocation, allowing interaction with the classes for analysis. 7) Then have created a ClassType and MethodSignature which is used for analysis. The signature contains method name, return type and parameters. 8) Then we check for the existence of the class and method in the given view. 9) If they exist, a SootClass and SootMethod objects are used to retrieve the same. 10) Then prints the body of the SootMethod object. 11) Then we check if the interceptor worked. ie here we check if the DeadAssignmentEliminator interceptor has successfully removed a specific assignment (l1 = 3) from the method's body. It does this by looking through all statements (JAssignStmt) in the method body and checking if the assignment is not present. 12) Then it prints the result of the interceptor check.

    c) CallGraphExample 1) package sootup.examples; - defines the package name for the Java class. 2) import statement - defines various classes and interfaces from different packages that the program uses. 3) public class CallgraphExample - declares a public class named \"CallGraphExample\". 4) Then we have created a main method in which is the entry point for the code. 5) List inputLocations creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis. 6) Then we have provided towo inputLocations.add() - one for the project's class file directory and another for Java's runtime library (rt.jar). 7) Then we have created a JavaView which is used for analysing the Java program. 8) Then we have created two ClassType for two classes ie 'A' and 'B'. They are used to create a MethodSignature for a method that will be analysed. 9) ViewTypeHierarchy - then we have set up a type hierarchy from the provided view and prints the subclasses of class 'A'. 10) Initializes a CallGraphAlgorithm using the ClassHierarchyAnalysisAlgorithm, which is a method for constructing call graphs. 11) Then we creates a call graph by initialising the Class Hierarchy Analysis (cha) with the entry method signature. 12) Prints information about calls from the entry method in the call graph.

    d) ClassHierarchyExample 1) package sootup.examples; - defines the package name for the Java class. 2) import statement - defines various classes and interfaces from different packages that the program uses. 3) public class ClassHierarchy - declares a public class named \"ClassHierarchy\". 4) Then we have created a main method in which is the entry point for the code. 5) Then creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis. Two locations are added: one for the project's binary directory and another for the default Java runtime library (rt.jar). 6) Initializes a JavaView object with the previously created input locations. 7) Initializes a ViewTypeHierarchy object using the view. This object will be used to analyze the class hierarchy. 8) Then we have created two ClassTypes. These lines get JavaClassType objects for classes \"A\" and \"C\". These types are used for further hierarchy analysis. 9) Checks the direct subclasses of class \"C\". It verifies if all direct subclasses are \"D\" using two different methods: comparing class names and fully qualified names. 10) Then prints a message based on whether all direct subtypes of \"C\" are correctly identified as \"D\". 11) Retrieves and checks the superclasses of class \"C\". It then verifies if these superclasses include class \"A\" and java.lang.Object, printing a message based on the result.

    e) MutatingSootClassExample\n\n       1) package sootup.examples; - defines the package name for the Java class.\n       2) import statement - defines various classes and interfaces from different packages that the program uses.\n       3) public class MutatingSootClass - declares a public class named \"MutatingSootClass\".\n       4) Then we have created a main method in which is the entry point for the code.\n       5) First we have created an 'AnalysisInputLocation' which points to a directory which contains the class files to be analysed.\n       6) Then we have created a JavaView which allos us to retrievet the classes.\n       7) And also created a ClassType to get the class 'HelloWorld' and a method within that class ie main for analysis using MethodSignature.\n       8) THen we are checking and retrieving the class and method.\n       9) Then we retrives the existing body of the method and prints it. Then we create a new local variable to add it copy to the method body.\n       10) Then we are overriding the method body and class. ie this lines creates new sources that overrides teh original method body and class. It replaces the old method in the class with the new method having the modified body.\n       11) Prints the modified method body and checks if the new local variable (newLocal) exists in the modified method. Depending on the result, it prints a corresponding message.\n
    "},{"location":"installation/","title":"Installation","text":""},{"location":"installation/#use-the-latest-develop-branch","title":"Use the latest develop branch","text":"

    For configuration options of your build tool please visit SootUp on Jitpack.io

    "},{"location":"installation/#use-releases-on-maven-central","title":"Use Releases on Maven Central","text":"

    The code below shows you how to import all submodules of the SootUp repository. You can import fewer modules if your use case allows it.

    Add the following dependencies to your pom.xml / build.gradle.

    MavenGradle
    <dependencies>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.core</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.core</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.sourcecode</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.bytecode</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.jimple.parser</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.callgraph</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.analysis</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n</dependencies>\n
    repositories {\n    mavenCentral()\n    google()\n}\n\ncompile \"org.soot-oss:sootup.core:1.3.0\"\ncompile \"org.soot-oss:sootup.java.core:1.3.0\"\ncompile \"org.soot-oss:sootup.java.sourcecode:1.3.0\"\ncompile \"org.soot-oss:sootup.java.bytecode:1.3.0\"\ncompile \"org.soot-oss:sootup.jimple.parser:1.3.0\"\ncompile \"org.soot-oss:sootup.callgraph:1.3.0\"\ncompile \"org.soot-oss:sootup.analysis:1.3.0\"\n
    "},{"location":"installation/#build-from-source","title":"Build from Source","text":"

    If you'd like to get the most recent changes, you can build SootUp from source yourself and install it into your local maven repository.

    git clone https://github.com/secure-software-engineering/SootUp.git\nmvn install\n

    "},{"location":"jimple/","title":"Jimple","text":"

    What is Jimple? Jimple is the intermediate representation IR of Soot, and thus SootUp. Soot's intention is to provide a simplified way to analyze JVM bytecode. JVM bytecode is stack-based, which makes it difficult for program analysis. Java source code, on the other hand, is also not quite suitable for program analysis, due to its nested structures. Therefore, Jimple aims to bring the best of both worlds, a non-stack-based and flat (non-nested) representation. For this purpose Jimple was designed as a representation of JVM bytecode which is human readable.

    Info

    To learn more about jimple, refer to the thesis by Raja Vallee-Rai.

    It might help to visualize how the Jimple version of a Java code looks like. Have a look at the following example on the HelloWorld class.

    JimpleJavaByte Code
    public class HelloWorld extends java.lang.Object\n{\n  public void <init>()\n  {\n    HelloWorld r0;\n    r0 := @this: HelloWorld;\n    specialinvoke r0.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public static void main(java.lang.String[])\n  {\n    java.lang.String[] r0;\n    java.io.PrintStream r1;\n\n    r0 := @parameter0: java.lang.String[];\n    r1 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke r1.<java.io.PrintStream: \n    void println(java.lang.String)>(\"Hello world!\");\n    return;\n  }\n}\n
    public class HelloWorld {\n\n  public HelloWorld() {\n\n  }\n\n  public static void main(String[] var0) {\n    System.out.println(\"Hello World!\");\n  }\n\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class analysis/HelloWorld {\n\n// compiled from: HelloWorld.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 4 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 6 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Lanalysis/HelloWorld; L0 L2 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static main([Ljava/lang/String;)V\n  L0\n    LINENUMBER 9 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Hello World!\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 10 L1\n    RETURN\n  L2\n    LOCALVARIABLE var0 [Ljava/lang/String; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jimple-grammar-structure","title":"Jimple Grammar Structure","text":"

    Jimple mimics the JVMs class file structure. Therefore it is object oriented. A Single Class (or Interface) per file. Three-Address-Code which means there are no nested expressions. (nested expressions can be modeled via Locals that store intermediate calculation results.)

    "},{"location":"jimple/#class-or-interface","title":"Class (or Interface)","text":"

    A class consists of Fields and Methods. It is referenced by its ClassType.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n}\n
    package target.exercise1;\n\npublic class DemoClass {}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#field","title":"Field","text":"

    A Field is a piece of memory which can store a value that is accessible according to its visibility modifier. It is referenced by its FieldSignature.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: double pi> = 3.14;\n    return;\n  }\n}\n/*\n  \"this.<target.exercise1.DemoClass: double pi>\" is JInstanceFieldRef\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private final double pi = 3.14;\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x12\nprivate final D pi = 3.14\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    LDC 3.14\n    PUTFIELD target/exercise1/DemoClass.pi : D\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#method-and-the-body","title":"Method and the Body","text":"

    The interesting part is a method. A method is a \"piece of code\" that can be executed. It is referenced by its MethodSignature and contains a StmtGraph that models the sequence of single instructions/statements (Stmts).

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    virtualinvoke this.<target.exercise1.DemoClass: \n    void demoMethod()>();\n    return;\n  }\n\n  public void demoMethod()\n  {\n    java.io.PrintStream $stack1;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack1 = <java.lang.System: java.io.PrintStream out>;\n\n    virtualinvoke $stack1.<java.io.PrintStream: \n    void println(java.lang.String)>(\"Inside method.\");\n    return;\n  }\n}\n/*\n  \"<target.exercise1.DemoClass: void demoMethod()>\" \n        and \"<target.exercise1.DemoClass: void <init>()>\" \n        are instances of SootMethod \n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  DemoClass(){\n    demoMethod();\n  }\n  public void demoMethod(){\n    System.out.println(\"Inside method.\");\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x0\n<init>()V\n  L0\n    LINENUMBER 5 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 6 L1\n    ALOAD 0\n    INVOKEVIRTUAL target/exercise1/DemoClass.demoMethod ()V\n  L2\n    LINENUMBER 7 L2\n    RETURN\n  L3\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L3 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic demoMethod()V\n  L0\n    LINENUMBER 10 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Inside method.\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 11 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#signatures","title":"Signatures","text":"

    Signatures are required for identifying or referencing things across a method, such as Classes, Interfaces, Methods or Fields. Locals, on the other hand, do not need signatures, since they are referenced within method boundaries.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: double pi> = 3.14;\n    return;\n  }\n\n  public void demoMethod()\n  {\n    java.io.PrintStream $stack3, $stack5;\n    java.lang.StringBuilder $stack4, $stack6, $stack7;\n    java.lang.String $stack8;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack3 = <java.lang.System: java.io.PrintStream out>;\n\n    virtualinvoke $stack3.<java.io.PrintStream: \n      void println(java.lang.String)>(\"pi : 3.14\");\n    $stack5 = <java.lang.System: java.io.PrintStream out>;\n    $stack4 = new java.lang.StringBuilder;\n\n    specialinvoke $stack4.<java.lang.StringBuilder: void <init>()>();\n    $stack6 = virtualinvoke $stack4.<java.lang.StringBuilder: \n      java.lang.StringBuilder append(java.lang.String)>\n        (\"pi : \");\n    $stack7 = virtualinvoke $stack6.<java.lang.StringBuilder: \n      java.lang.StringBuilder append(double)>(3.1415);\n    $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: \n      java.lang.String toString()>();\n\n    virtualinvoke $stack5.<java.io.PrintStream:     \n      void println(java.lang.String)>($stack8);\n    return;\n  }\n}\n/*\n  For JInstanceFieldRef \"this.<target.exercise1.DemoClass: double pi>\" \n    signature is <target.exercise1.DemoClass: double pi>\n  Similarly, we have other signatures like \n    <java.lang.Object: void <init>()>, \n    <java.io.PrintStream: void println(java.lang.String)> \n    and so on. \n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private final double pi = 3.14;\n\n  public void demoMethod(){\n    double localPi = 3.1415;\n    System.out.println(\"pi : \" + pi);\n    System.out.println(\"pi : \" + localPi);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x12\nprivate final D pi = 3.14\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    LDC 3.14\n    PUTFIELD target/exercise1/DemoClass.pi : D\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic demoMethod()V\n  L0\n    LINENUMBER 6 L0\n    LDC 3.1415\n    DSTORE 1\n  L1\n    LINENUMBER 7 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"pi : 3.14\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L2\n    LINENUMBER 8 L2\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    NEW java/lang/StringBuilder\n    DUP\n    INVOKESPECIAL java/lang/StringBuilder.<init> ()V\n    LDC \"pi : \"\n      INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)\n        Ljava/lang/StringBuilder;\n    DLOAD 1\n    INVOKEVIRTUAL java/lang/StringBuilder.append (D)Ljava/lang/StringBuilder;\n    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 9 L3\n    RETURN\n  L4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0\n    LOCALVARIABLE localPi D L1 L4 1\n    MAXSTACK = 4\n    MAXLOCALS = 3\n}\n
    "},{"location":"jimple/#trap","title":"Trap","text":"

    A Trap is a mechanism to model exceptional flow.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void divideExample(int, int)\n  {\n    int x, y, $stack4;\n    java.io.PrintStream $stack5, $stack7;\n    java.lang.Exception $stack6;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n    y := @parameter1: int;\n\n   label1:\n      $stack5 = <java.lang.System: java.io.PrintStream out>;\n      $stack4 = x / y;\n      virtualinvoke $stack5.<java.io.PrintStream: void println(int)>($stack4);\n\n   label2:\n      goto label4;\n\n   label3:\n      $stack6 := @caughtexception;\n      $stack7 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack7.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Exception caught\");\n\n   label4:\n      return;\n\n      catch java.lang.Exception from label1 to label2 with label3;\n  }\n}\n/*\n  By calling getTraps() method, we can get the Traip chain.\n  For the above jimple code, we have the below trap:\n  Trap :\n  begin  : $stack5 = <java.lang.System: java.io.PrintStream out>\n  end    : goto [?= return]\n  handler: $stack6 := @caughtexception\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void divideExample(int x, int y){\n    try {\n      System.out.println(x / y);\n    }catch (Exception e){\n      System.out.println(\"Exception caught\");\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n    L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic divideExample(II)V\n  TRYCATCHBLOCK L0 L1 L2 java/lang/Exception\n  L0\n    LINENUMBER 6 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    ILOAD 2\n    IDIV\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L1\n    LINENUMBER 9 L1\n    GOTO L3\n  L2\n    LINENUMBER 7 L2\n    FRAME SAME1 java/lang/Exception\n    ASTORE 3\n  L4\n    LINENUMBER 8 L4\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Exception caught\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 10 L3\n    FRAME SAME\n    RETURN\n  L5\n    LOCALVARIABLE e Ljava/lang/Exception; L4 L3 3\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE x I L0 L5 1\n    LOCALVARIABLE y I L0 L5 2\n    MAXSTACK = 3\n    MAXLOCALS = 4\n}\n
    "},{"location":"jimple/#stmt","title":"Stmt","text":"

    The main piece of Jimple is a Statement (Stmt). Stmts represent that can be executed by the JVM.

    "},{"location":"jimple/#branching-statements","title":"Branching Statements","text":"

    A BranchingStmt's job is to model the flow between Stmts.

    "},{"location":"jimple/#jgotostmt","title":"JGotoStmt","text":"

    for unconditional flow.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n  public static void sampleMethod()\n  {\n    int i;\n    i = 0;\n\n    label1:\n      if i >= 5 goto label3;\n      if i != 3 goto label2;\n      goto label3;\n\n    label2:\n      i = i + 1;\n      goto label1;\n\n    label3:\n      return;\n  }\n}\n/*\n  Here for statements \"goto label3;\" and \"goto label1;\", \n  we have two instances of JGotoStmt : \n    \"goto[?=return]\" and \"goto[?=(branch)]\".\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public static void sampleMethod(){\n    label1:\n    for (int i = 0; i < 5; i++){\n      if(i == 3){\n        break label1;\n      }\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static sampleMethod()V\n  L0\n    LINENUMBER 6 L0\n    ICONST_0\n    ISTORE 0\n  L1\n    FRAME APPEND [I]\n    ILOAD 0\n    ICONST_5\n    IF_ICMPGE L2\n  L3\n    LINENUMBER 7 L3\n    ILOAD 0\n    ICONST_3\n    IF_ICMPNE L4\n  L5\n    LINENUMBER 8 L5\n    GOTO L2\n  L4\n    LINENUMBER 6 L4\n    FRAME SAME\n    IINC 0 1\n    GOTO L1\n  L2\n    LINENUMBER 11 L2\n    FRAME CHOP 1\n    RETURN\n    LOCALVARIABLE i I L1 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jifstmt","title":"JIfStmt","text":"

    for conditional flow depending on boolean Expression (AbstractConditionExpr) so they have two successor Stmt's.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n   public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public static void sampleMethod(int)\n  {\n    int x, $stack1;\n    java.io.PrintStream $stack2, $stack3;\n\n    x := @parameter0: int;\n\n    $stack1 = x % 2;\n    if $stack1 != 0 goto label1;\n\n    $stack3 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack3.<java.io.PrintStream: \n      void println(java.lang.String)>(\"Even\");\n    goto label2;\n\n    label1:\n      $stack2 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack2.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Odd\");\n\n    label2:\n      return;\n  }\n}\n/*\n  For statement \"if $stack1 != 0 goto label1;\", \n  we have an instance of JIfStmt :\n    \"if $stack1 != 0 goto $stack2 \n        = <java.lang.System:java.io.PrintStream out>\".\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public static void sampleMethod(int x){\n    if(x % 2 == 0){\n      System.out.println(\"Even\");\n    }else{\n      System.out.println(\"Odd\");\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static sampleMethod(I)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 0\n    ICONST_2\n    IREM\n    IFNE L1\n  L2\n    LINENUMBER 6 L2\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Even\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n    GOTO L3\n  L1\n    LINENUMBER 8 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Odd\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 10 L3\n    FRAME SAME\n    RETURN\n  L4\n    LOCALVARIABLE x I L0 L4 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jswitchstmt","title":"JSwitchStmt","text":"

    for conditional flow that behaves like a switch-case. It has #numberOfCaseLabels+1 (for default) successor Stmt's.

    All other Stmts are not manipulating the flow, which means they have a single successor Stmt as long as they are not exiting the flow inside a method.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void switchExample(int)\n  {\n    int x;\n    java.io.PrintStream $stack2, $stack3, $stack4;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    lookupswitch(x)\n    {\n      case 1: goto label1;\n      case 2: goto label2;\n      default: goto label3;\n    };\n\n    label1:\n      $stack3 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack3.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input 1\");\n      goto label4;\n\n    label2:\n      $stack2 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack2.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input 2\");\n      goto label4;\n\n    label3:\n      $stack4 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack4.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input more than 2\");\n\n    label4:\n      return;\n  }\n}\n/*\n  Here for below statement:\n    lookupswitch(x)\n      {\n        case 1: goto label1;\n        case 2: goto label2;\n        default: goto label3;\n      };\n\n  we have an instance of JLookupSwitchStmt :\n    lookupswitch(x) \n      {     \n        case 1: goto $stack3 \n                        = <java.lang.System: java.io.PrintStream out>;     \n        case 2: goto $stack2 \n                        = <java.lang.System: java.io.PrintStream out>;     \n        default: goto $stack4 \n                        = <java.lang.System: java.io.PrintStream out>; \n      }\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void switchExample(int x){\n    switch (x){\n      case 1:\n        System.out.println(\"Input 1\");\n        break;\n\n      case 2:\n        System.out.println(\"Input 2\");\n        break;\n\n      default:\n        System.out.println(\"Input more than 2\");\n        break;\n\n    }\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic switchExample(I)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 1\n    LOOKUPSWITCH\n    1: L1\n    2: L2\n    default: L3\n  L1\n    LINENUMBER 7 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input 1\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L4\n    LINENUMBER 8 L4\n    GOTO L5\n  L2\n    LINENUMBER 11 L2\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input 2\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L6\n    LINENUMBER 12 L6\n    GOTO L5\n  L3\n    LINENUMBER 15 L3\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input more than 2\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L5\n    LINENUMBER 19 L5\n    FRAME SAME\n    RETURN\n  L7\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L7 0\n    LOCALVARIABLE x I L0 L7 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#jreturnstmt-jreturnvoidstmt","title":"JReturnStmt & JReturnVoidStmt","text":"

    They end the execution/flow inside the current method and return (a value) to its caller.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public int increment(int)\n  {\n    int x, $stack2;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    $stack2 = x + 1;\n    return $stack2;\n  }\n\n  public void print()\n  {\n    java.io.PrintStream $stack1;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack1 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack1.<java.io.PrintStream: \n      void println(java.lang.String)>(\"Inside method print\");\n    return;\n  }\n}\n/*\n  \"return $stack2\" is JReturnStmt.\n  \"return\" is JReturnVoidStmt.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public int increment(int x){\n    return x + 1;\n  }\n  public void print(){\n    System.out.println(\"Inside method print\");\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic increment(I)I\n  L0\n    LINENUMBER 5 L0\n    ILOAD 1\n    ICONST_1\n    IADD\n    IRETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE x I L0 L1 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n\n// access flags 0x1\npublic print()V\n  L0\n    LINENUMBER 8 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Inside method print\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 9 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jthrowstmt","title":"JThrowStmt","text":"

    Ends the execution inside the current Method if the thrown exception is not caught by a Trap, which redirects the execution to an exceptionhandler.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void divideExample(int, int)\n  {\n    int y, x, $stack6;\n    java.lang.StringBuilder $stack3, $stack5, $stack7;\n    java.io.PrintStream $stack4;\n    java.lang.String $stack8;\n    java.lang.RuntimeException $stack9;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n    y := @parameter1: int;\n\n    if y != 0 goto label1;\n\n    $stack9 = new java.lang.RuntimeException;\n    specialinvoke $stack9.<java.lang.RuntimeException: \n      void <init>(java.lang.String)>(\"Divide by zero error\");\n    throw $stack9;\n\n    label1:\n      $stack4 = <java.lang.System: java.io.PrintStream out>;\n      $stack3 = new java.lang.StringBuilder;\n      specialinvoke $stack3.<java.lang.StringBuilder: void <init>()>();\n\n      $stack5 = virtualinvoke $stack3.<java.lang.StringBuilder: \n        java.lang.StringBuilder append(java.lang.String)>(\"Divide result : \");\n      $stack6 = x / y;\n      $stack7 = virtualinvoke $stack5.<java.lang.StringBuilder: \n        java.lang.StringBuilder append(int)>($stack6);\n      $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: \n        java.lang.String toString()>();\n\n      virtualinvoke $stack4.<java.io.PrintStream: \n        void println(java.lang.String)>($stack8);\n      return;\n  }\n}\n/*\n  \"throw $stack9\" is JThrowStmt.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void divideExample(int x, int y){\n    if(y == 0){\n      throw new RuntimeException(\"Divide by zero error\");\n    }\n    System.out.println(\"Divide result : \" + x / y);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic divideExample(II)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 2\n    IFNE L1\n  L2\n    LINENUMBER 6 L2\n    NEW java/lang/RuntimeException\n    DUP\n    LDC \"Divide by zero error\"\n    INVOKESPECIAL java/lang/RuntimeException.<init> \n      (Ljava/lang/String;)V\n    ATHROW\n  L1\n    LINENUMBER 8 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    NEW java/lang/StringBuilder\n    DUP\n    INVOKESPECIAL java/lang/StringBuilder.<init> ()V\n    LDC \"Divide result : \"\n    INVOKEVIRTUAL java/lang/StringBuilder.append \n      (Ljava/lang/String;)Ljava/lang/StringBuilder;\n    ILOAD 1\n    ILOAD 2\n    IDIV\n    INVOKEVIRTUAL java/lang/StringBuilder.append \n      (I)Ljava/lang/StringBuilder;\n    INVOKEVIRTUAL java/lang/StringBuilder.toString \n      ()Ljava/lang/String;\n    INVOKEVIRTUAL java/io/PrintStream.println \n      (Ljava/lang/String;)V\n  L3\n    LINENUMBER 9 L3\n    RETURN\n  L4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0\n    LOCALVARIABLE x I L0 L4 1\n    LOCALVARIABLE y I L0 L4 2\n    MAXSTACK = 4\n    MAXLOCALS = 3\n}\n
    "},{"location":"jimple/#jinvokestmt","title":"JInvokeStmt","text":"

    transfers the control flow to another method until the called method returns.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void print(int)\n  {\n    target.exercise1.DemoClass this;\n    int x, a;\n    java.io.PrintStream $stack4, $stack6;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    a = virtualinvoke this.<target.exercise1.DemoClass: \n      int increment(int)>(x);\n    $stack4 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack4.<java.io.PrintStream: \n      void println(int)>(a);\n\n    a = virtualinvoke this.<target.exercise1.DemoClass: \n      int increment(int)>(a);\n    $stack6 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack6.<java.io.PrintStream: \n      void println(int)>(a);\n\n    return;\n  }\n\n  public int increment(int)\n  {\n    int x, $stack2;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    $stack2 = x + 1;\n    return $stack2;\n  }\n}\n/*\n  \"specialinvoke this.<java.lang.Object: void <init>()>()\", \n  \"virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(x)\", \n  \"virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(a)\" \n    are JInvokeStmts.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void print(int x){\n    int a = increment(x);\n    System.out.println(a);\n    a = increment(a);\n    System.out.println(a);\n  }\n  public int increment(int x){\n    return x + 1;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic print(I)V\n  L0\n    LINENUMBER 5 L0\n    ALOAD 0\n    ILOAD 1\n    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I\n    ISTORE 2\n  L1\n    LINENUMBER 6 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L2\n    LINENUMBER 7 L2\n    ALOAD 0\n    ILOAD 2\n    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I\n    ISTORE 2\n  L3\n    LINENUMBER 8 L3\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L4\n    LINENUMBER 9 L4\n    RETURN\n  L5\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE x I L0 L5 1\n    LOCALVARIABLE a I L1 L5 2\n    MAXSTACK = 2\n    MAXLOCALS = 3\n\n// access flags 0x1\npublic increment(I)I\n  L0\n    LINENUMBER 11 L0\n    ILOAD 1\n    ICONST_1\n    IADD\n    IRETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE x I L0 L1 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#jassignstmt","title":"JAssignStmt","text":"

    assigns a Value from the right hand-side to the left hand-side. Left hand-side of an assignment can be a Local referencing a variable (i.e. a Local) or a FieldRef referencing a Field. Right hand-side of an assignment can be an expression (Expr), a Local, a FieldRef or a Constant.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: int counter> = 0;\n    return;\n  }\n\n  public int updateCounter()\n  {\n    target.exercise1.DemoClass this;\n    int $stack1, $stack2, $stack3;\n\n    this := @this: target.exercise1.DemoClass;\n\n    $stack1 = this.<target.exercise1.DemoClass: int counter>;\n    $stack2 = $stack1 + 1;\n    this.<target.exercise1.DemoClass: int counter> = $stack2;\n    $stack3 = this.<target.exercise1.DemoClass: int counter>;\n\n    return $stack3;\n  }\n}\n/*\n  \"this.<target.exercise1.DemoClass: int counter> = 0\", \n  \"$stack1 = this.<target.exercise1.DemoClass: int counter>\",\n  \"$stack2 = $stack1 + 1\"\n  \"this.<target.exercise1.DemoClass: int counter> = $stack2\"\n  \"$stack3 = this.<target.exercise1.DemoClass: int counter>\"\n    are JAssignStmts.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private int counter = 0;\n  public int updateCounter(){\n    counter = counter + 1;\n    return counter;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    ICONST_0\n    PUTFIELD target/exercise1/DemoClass.counter : I\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic updateCounter()I\n  L0\n    LINENUMBER 6 L0\n    ALOAD 0\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    ICONST_1\n    IADD\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L1\n    LINENUMBER 7 L1\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    IRETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#jidentitystmt","title":"JIdentityStmt","text":"

    is semantically like the JAssignStmt and handles assignments of IdentityRef's to make implicit assignments explicit into the StmtGraph.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void DemoClass(int)\n  {\n    target.exercise1.DemoClass this;\n    int counter;\n\n    this := @this: target.exercise1.DemoClass;\n    counter := @parameter0: int;\n    this.<target.exercise1.DemoClass: int counter> = counter;\n    return;\n  }\n}\n/*\n  \"this := @this: target.exercise1.DemoClass\" and \n    \"counter := @parameter0: int\" are JIdentityStmts\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private int counter;\n  public void DemoClass(int counter){\n    this.counter = counter;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic DemoClass(I)V\n  L0\n    LINENUMBER 6 L0\n    ALOAD 0\n    ILOAD 1\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L1\n    LINENUMBER 7 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    LOCALVARIABLE counter I L0 L2 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#jentermonitorstmt-jexitmonitorstmt","title":"JEnterMonitorStmt & JExitMonitorStmt","text":"

    marks synchronized blocks of code from JEnterMonitorStmt to JExitMonitorStmt.

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: int counter> = 0;\n    return;\n  }\n\n  public int updateCounter()\n  {\n    target.exercise1.DemoClass this;\n    int $stack4, $stack5, $stack7;\n    java.lang.Throwable $stack8;\n\n    this := @this: target.exercise1.DemoClass;\n\n    entermonitor this;\n\n    label1:\n      $stack4 = this.<target.exercise1.DemoClass: int counter>;\n      $stack5 = $stack4 + 1;\n      this.<target.exercise1.DemoClass: int counter> = $stack5;\n\n      exitmonitor this;\n\n    label2:\n      goto label5;\n\n    label3:\n      $stack8 := @caughtexception;\n\n      exitmonitor this;\n\n    label4:\n      throw $stack8;\n\n    label5:\n      $stack7 = this.<target.exercise1.DemoClass: int counter>;\n      return $stack7;\n\n      catch java.lang.Throwable from label1 to label2 with label3;\n      catch java.lang.Throwable from label3 to label4 with label3;\n  }\n}\n/*\n  \"entermonitor this\" is JEnterMonitorStmt.\n  \"exitmonitor this\" is JExitMonitorStmt.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  private int counter = 0;\n  public int updateCounter(){\n    synchronized (this) {\n      counter = counter + 1;\n    }\n    return counter;\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    ICONST_0\n    PUTFIELD target/exercise1/DemoClass.counter : I\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic updateCounter()I\n    TRYCATCHBLOCK L0 L1 L2 null\n    TRYCATCHBLOCK L2 L3 L2 null\n  L4\n    LINENUMBER 6 L4\n    ALOAD 0\n    DUP\n    ASTORE 1\n    MONITORENTER\n  L0\n    LINENUMBER 7 L0\n    ALOAD 0\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    ICONST_1\n    IADD\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L5\n    LINENUMBER 8 L5\n    ALOAD 1\n    MONITOREXIT\n  L1\n    GOTO L6\n  L2\n    FRAME FULL [target/exercise1/DemoClass java/lang/Object] \n      [java/lang/Throwable]\n    ASTORE 2\n    ALOAD 1\n    MONITOREXIT\n  L3\n    ALOAD 2\n    ATHROW\n  L6\n    LINENUMBER 9 L6\n    FRAME CHOP 1\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    IRETURN\n  L7\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L4 L7 0\n    MAXSTACK = 3\n    MAXLOCALS = 3\n}\n
    "},{"location":"jimple/#jretstmt","title":"JRetStmt","text":""},{"location":"jimple/#jbreakpointstmt","title":"JBreakpointStmt","text":"

    models a Breakpoint set by a Debugger (usually not relevant for static analyses)

    "},{"location":"jimple/#immediate","title":"Immediate","text":"

    An Immediate has a given Type and consists of a Local (\"a Variable\", \"Something that contains a Value\") or a Constant (\"Something that is a Value\").

    "},{"location":"jimple/#type","title":"Type","text":"

    VoidType

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  specialinvoke this.<java.lang.Object: void <init>()>();\n  return;\n  }\n\n  public void voidMethod()\n  {\n  java.io.PrintStream $stack1;\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  $stack1 = <java.lang.System: java.io.PrintStream out>;\n  virtualinvoke $stack1.<java.io.PrintStream: \n      void println(java.lang.String)>(\"In voidMethod().\");\n  return;\n  }\n}\n/*\n  For the SootMethod - <target.exercise1.DemoClass: void voidMethod()>, \n    returnType is instance of VoidType.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void voidMethod(){\n  System.out.println(\"In voidMethod().\");\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic voidMethod()V\n  L0\n    LINENUMBER 5 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"In voidMethod().\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 6 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
    "},{"location":"jimple/#primarytype","title":"PrimaryType","text":"

    BooleanType, ByteType, CharType, ShortType, IntType, LongType, DoubleType, FloatType

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n      target.exercise1.DemoClass this;\n      this := @this: target.exercise1.DemoClass;\n      specialinvoke this.<java.lang.Object: void <init>()>();\n      return;\n  }\n\n\n  public void display()\n  {\n      java.io.PrintStream $stack11, $stack13, $stack15, \n        $stack17, $stack19, $stack21, $stack23, $stack25;\n      int $stack12, $stack14, $stack16, $stack18;\n      long $stack20;\n      double $stack22;\n      float $stack24;\n      target.exercise1.DemoClass this;\n      boolean $stack26;\n\n      this := @this: target.exercise1.DemoClass;\n\n      $stack11 = <java.lang.System: java.io.PrintStream out>;\n\n      goto label1;\n\n   label1:\n      $stack26 = 0;\n      virtualinvoke $stack11.<java.io.PrintStream: \n        void println(boolean)>($stack26);\n\n      $stack13 = <java.lang.System: java.io.PrintStream out>;\n      $stack12 = 127 - 1;\n      virtualinvoke $stack13.<java.io.PrintStream: \n        void println(int)>($stack12);\n\n      $stack15 = <java.lang.System: java.io.PrintStream out>;\n      $stack14 = 97 + 1;\n      virtualinvoke $stack15.<java.io.PrintStream: \n        void println(int)>($stack14);\n\n      $stack17 = <java.lang.System: java.io.PrintStream out>;\n      $stack16 = 1123 + 1;\n      virtualinvoke $stack17.<java.io.PrintStream: \n        void println(int)>($stack16);\n\n      $stack19 = <java.lang.System: java.io.PrintStream out>;\n      $stack18 = 123456 + 1;\n      virtualinvoke $stack19.<java.io.PrintStream: \n        void println(int)>($stack18);\n\n      $stack21 = <java.lang.System: java.io.PrintStream out>;\n      $stack20 = 10L + 1L;\n      virtualinvoke $stack21.<java.io.PrintStream: \n        void println(long)>($stack20);\n\n      $stack23 = <java.lang.System: java.io.PrintStream out>;\n      $stack22 = 10.1 + 1.0;\n      virtualinvoke $stack23.<java.io.PrintStream: \n        void println(double)>($stack22);\n\n      $stack25 = <java.lang.System: java.io.PrintStream out>;\n      $stack24 = 10.1F + 1.0F;\n      virtualinvoke $stack25.<java.io.PrintStream: \n        void println(float)>($stack24);\n\n      return;\n  }\n}\n/*\n  The JimpleLocal $stack12, $stack14, $stack16, $stack18 are of IntType. \n  Similarly, $stack20 is of LongType, $stack22 is of DoubleType and so on.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n  public void display(){\n    boolean varBoolean = true;\n    byte varByte = 127;\n    char varChar = 'a';\n    short varShort = 1123;\n    int varInt = 123456;\n    long varLong = 10L;\n    double varDouble = 10.10;\n    float varFloat = 10.10f;\n\n    System.out.println(!varBoolean);\n    System.out.println(varByte-1);\n    System.out.println(varChar+1);\n    System.out.println(varShort+1);\n    System.out.println(varInt+1);\n    System.out.println(varLong+1);\n    System.out.println(varDouble+1);\n    System.out.println(varFloat+1);\n\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic display()V\n  L0\n    LINENUMBER 5 L0\n    ICONST_1\n    ISTORE 1\n  L1\n    LINENUMBER 6 L1\n    BIPUSH 127\n    ISTORE 2\n  L2\n    LINENUMBER 7 L2\n    BIPUSH 97\n    ISTORE 3\n  L3\n    LINENUMBER 8 L3\n    SIPUSH 1123\n    ISTORE 4\n  L4\n    LINENUMBER 9 L4\n    LDC 123456\n    ISTORE 5\n  L5\n    LINENUMBER 10 L5\n    LDC 10\n    LSTORE 6\n  L6\n    LINENUMBER 11 L6\n    LDC 10.1\n    DSTORE 8\n  L7\n    LINENUMBER 12 L7\n    LDC 10.1\n    FSTORE 10\n  L8\n    LINENUMBER 14 L8\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    IFNE L9\n    ICONST_1\n    GOTO L10\n  L9\n    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] \n      [java/io/PrintStream]\n    ICONST_0\n  L10\n    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] \n      [java/io/PrintStream I]\n    INVOKEVIRTUAL java/io/PrintStream.println (Z)V\n  L11\n    LINENUMBER 15 L11\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    ICONST_1\n    ISUB\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L12\n    LINENUMBER 16 L12\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 3\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L13\n    LINENUMBER 17 L13\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 4\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L14\n    LINENUMBER 18 L14\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 5\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L15\n    LINENUMBER 19 L15\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LLOAD 6\n    LCONST_1\n    LADD\n    INVOKEVIRTUAL java/io/PrintStream.println (J)V\n  L16\n    LINENUMBER 20 L16\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    DLOAD 8\n    DCONST_1\n    DADD\n    INVOKEVIRTUAL java/io/PrintStream.println (D)V\n  L17\n    LINENUMBER 21 L17\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    FLOAD 10\n    FCONST_1\n    FADD\n    INVOKEVIRTUAL java/io/PrintStream.println (F)V\n  L18\n    LINENUMBER 23 L18\n    RETURN\n  L19\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L19 0\n    LOCALVARIABLE varBoolean Z L1 L19 1\n    LOCALVARIABLE varByte B L2 L19 2\n    LOCALVARIABLE varChar C L3 L19 3\n    LOCALVARIABLE varShort S L4 L19 4\n    LOCALVARIABLE varInt I L5 L19 5\n    LOCALVARIABLE varLong J L6 L19 6\n    LOCALVARIABLE varDouble D L7 L19 8\n    LOCALVARIABLE varFloat F L8 L19 10\n    MAXSTACK = 5\n    MAXLOCALS = 11\n}\n
    "},{"location":"jimple/#referencetype","title":"ReferenceType","text":"

    ClassType, ArrayType NullType

    JimpleJavaByte Code
    public class target.exercise1.DemoClass extends java.lang.Object\n{\npublic void <init>()\n  {\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  specialinvoke this.<java.lang.Object: void <init>()>();\n  return;\n  }\n\n  public target.exercise1.DemoClass getObject(target.exercise1.DemoClass)\n  {\n  target.exercise1.DemoClass obj, this;\n  this := @this: target.exercise1.DemoClass;\n  obj := @parameter0: target.exercise1.DemoClass;\n  return obj;\n  }\n\n  public void compute(boolean)\n  {\n  int[] b;\n  java.io.PrintStream $stack5, $stack6;\n  boolean check;\n  target.exercise1.DemoClass this;\n  int i;\n  null_type r0;\n  java.lang.NullPointerException soot0;\n  this := @this: target.exercise1.DemoClass;\n  check := @parameter0: boolean;\n  b = newarray (int)[5];\n  i = 0;\n\n  label1:\n    if i >= 5 goto label3;\n      if check == 0 goto label2;\n      r0 = (null_type) i;\n      soot0 = new java.lang.NullPointerException;\n      specialinvoke soot0.<java.lang.NullPointerException: \n        void <init>(java.lang.String)>\n          (\"This statement would have triggered an Exception: a[i#1] = r0\");\n      throw soot0;\n\n  label2:\n  b[i] = i;\n      i = i + 1;\n      goto label1;\n\n  label3:\n      $stack5 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack5.<java.io.PrintStream: \n        void println(java.lang.Object)>(b);\n      $stack6 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack6.<java.io.PrintStream: \n        void println(java.lang.Object)>(null);\n      return;\n  }\n}\n/*\n  The JimpleLocal b is of ArrayType,\n    and JimpleLocal r0 is of NullType.\n*/\n
    package target.exercise1;\n\npublic class DemoClass {\n\n  public DemoClass getObject(DemoClass obj){\n    return obj;\n  }\n\n  public void compute(boolean check){\n    int a[] = null;\n    int b[] = new int[5];\n    for (int i = 0; i < 5; i++) {\n      if(check){\n        a[i] = i;\n      }\n        b[i] = i;\n    }\n    System.out.println(b);\n    System.out.println(a);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic getObject(Ltarget/exercise1/DemoClass;)Ltarget/exercise1/DemoClass;\n  L0\n    LINENUMBER 6 L0\n    ALOAD 1\n    ARETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE obj Ltarget/exercise1/DemoClass; L0 L1 1\n    MAXSTACK = 1\n    MAXLOCALS = 2\n\n// access flags 0x1\npublic compute(Z)V\n  L0\n    LINENUMBER 10 L0\n    ACONST_NULL\n    ASTORE 2\n  L1\n    LINENUMBER 11 L1\n    ICONST_5\n    NEWARRAY T_INT\n    ASTORE 3\n  L2\n    LINENUMBER 12 L2\n    ICONST_0\n    ISTORE 4\n  L3\n    FRAME APPEND [[I [I I]\n    ILOAD 4\n    ICONST_5\n    IF_ICMPGE L4\n  L5\n    LINENUMBER 13 L5\n    ILOAD 1\n    IFEQ L6\n  L7\n    LINENUMBER 14 L7\n    ALOAD 2\n    ILOAD 4\n    ILOAD 4\n    IASTORE\n  L6\n    LINENUMBER 16 L6\n    FRAME SAME\n    ALOAD 3\n    ILOAD 4\n    ILOAD 4\n    IASTORE\n  L8\n    LINENUMBER 12 L8\n    IINC 4 1\n    GOTO L3\n  L4\n    LINENUMBER 18 L4\n    FRAME CHOP 1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ALOAD 3\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V\n  L9\n    LINENUMBER 19 L9\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ALOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V\n  L10\n    LINENUMBER 20 L10\n    RETURN\n  L11\n    LOCALVARIABLE i I L3 L4 4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L11 0\n    LOCALVARIABLE check Z L0 L11 1\n    LOCALVARIABLE a [I L1 L11 2\n    LOCALVARIABLE b [I L2 L11 3\n    MAXSTACK = 3\n    MAXLOCALS = 5\n}\n
    "},{"location":"jimple/#local","title":"Local","text":"

    jimple i0 A Local is a variable and its scope is inside its method i.e. no referencing from outside a method. Values can be assigned to Locals via JIdentityStmt or JAssignStmt.

    JimpleJavaByte Code

    ```jimple public class target.exercise1.DemoClass extends java.lang.Object { public void () { target.exercise1.DemoClass this; this := @this: target.exercise1.DemoClass; specialinvoke this.()>(); return; }

    public void compute() { java.io.PrintStream $stack2, $stack3; target.exercise1.DemoClass this; int local#2;

    this := @this: target.exercise1.DemoClass;\n$stack2 = <java.lang.System: java.io.PrintStream out>;\nvirtualinvoke $stack2.<java.io.PrintStream: void println(int)>(1);\n\nlocal#2 = this.<target.exercise1.DemoClass: int global>;\n$stack3 = <java.lang.System: java.io.PrintStream out>;\nvirtualinvoke $stack3.<java.io.PrintStream: void println(int)>(local#2);\nreturn;\n

    } } /* $stack2, this, $stack3, local#2 are all JimpleLocal.

    \"this := @this: target.exercise1.DemoClass\" is JIdentityStmt

    \"$stack2 = \", \"local#2 = this.\", \"$stack3 = \" are JAssignStmt

    */ ```

    package target.exercise1;\n\npublic class DemoClass {\n\n  private int global;\n\n  public void compute(){\n    int local;\n    local = 1;\n    System.out.println(local);\n    local = this.global;\n    System.out.println(local);\n  }\n}\n
    // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I global\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic compute()V\n  L0\n    LINENUMBER 9 L0\n    ICONST_1\n    ISTORE 1\n  L1\n    LINENUMBER 10 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L2\n    LINENUMBER 11 L2\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.global : I\n    ISTORE 1\n  L3\n    LINENUMBER 12 L3\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L4\n    LINENUMBER 14 L4\n    RETURN\n  L5\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE local I L1 L5 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
    "},{"location":"jimple/#constant","title":"Constant","text":"

    represents a value itself. don't confuse it with a variable/Local which has a immutable (i.e. final) attribute.

    There exists a constant entity for every Type - that way all value types can have a representation.

    "},{"location":"jimple/#expr","title":"Expr","text":"

    An expression is a language construct that returns a value. E.g. a binary operation such as addition.

    "},{"location":"jimple/#ref","title":"Ref","text":""},{"location":"jimple/#jarrayref","title":"JArrayRef","text":"

    jimple $arr[1] referencing a position inside an array.

    "},{"location":"jimple/#jfieldref-jstaticfieldref-jinstancefieldref","title":"JFieldRef (JStaticFieldRef & JInstanceFieldRef)","text":"

    jimple <SomePackage.ExampleClass: fieldname> // or r1.<SomePackage.ExampleClass: fieldname> referencing a Field via its FieldSignature and if necessary (i.e. with JInstanceFieldRef) the corresponding Local instance that points to the object instance.

    "},{"location":"jimple/#identityref","title":"IdentityRef","text":"

    The IdentityRef makes those implicit special value assignments explicit.

    "},{"location":"jimple/#jthisref","title":"JThisRef","text":"

    jimple @this: package.fruit.Banana represents the this pointer of the current class.

    "},{"location":"jimple/#jcaughtexceptionref","title":"JCaughtExceptionRef","text":"

    jimple @caughtexception represents the value of the thrown exception (caught by this exceptionhandler).

    "},{"location":"jimple/#jparameterref","title":"JParameterRef","text":"

    jimple i0 := @parameter0 i1 := @parameter1 represents a parameter of a method, identified by its index.

    "},{"location":"migration/","title":"From Soot","text":"

    // TODO

    "},{"location":"qilin/","title":"Incorporate Qilin Pointer Analysis","text":"

    see QilinPTA.

    "},{"location":"qilin/#dependencies","title":"Dependencies","text":"
        // TODO: add submodule\n
    "},{"location":"qilin/#how-to","title":"How to","text":"

    // TODO

    "},{"location":"tool_ux/","title":"Prototype to user friendly tool","text":"

    How was the parameter order again? For a lot of cli tools we see an arbitrary order of cli parameters, different options for giving a working directory etc.. So in the wild you can see a lot from run.sh/run.bat to make files just to reorder arguments and calling a tool.

    In SootUp we thought we could help on improving this madness while saving your time.

    The command line parser mimics the options the java executable accepts - at least for what is supported by SootUp.

    Dependencies:

    <dependency>\n    <groupId>commons-cli</groupId>\n    <artifactId>commons-cli</artifactId>\n    <version>1.8.0</version>\n</dependency>\n

        implementation(\"commons-cli:commons-cli:1.8.0\")\n
    class SootUpConfiguration{\n    // TODO incorporate\n}\n

    We are happy if you steal the following code to create a tool where the setup is just simple.

    "},{"location":"tools/","title":"Who uses SootUp","text":"
    • JimpleLsp
    • API_ASSIST
    • Maybe there is more to find via Github Network Dependents - have a look at the individual modules.
    • Your tool is not on this list? Create a PR :-)
    "},{"location":"whatsnew/","title":"What's new in SootUp?","text":""},{"location":"whatsnew/#library-by-default","title":"Library by default","text":"

    While Soot is a library and a stand-alone command-line application. SootUp, on the other hand, is designed to be a core library. It assumes that it is embedded in a client application that owns the thread of control. It can be extended with a command-line interface, included in other software projects as a library, or integrated into IDEs with JimpleLSP.

    "},{"location":"whatsnew/#modular-architecture","title":"Modular Architecture","text":"

    SootUp has a modular architecture, which enables its clients to include only the necessary functionality to their applications.

    • core module contains the core building blocks such as the jimple IR, control flow graphs, and frontend interfaces. The rest of the modules build on the core module.
    • java.core module contains parts that are essential for analyzing Java code.
    • java.bytecode module contains the functionality that is necessary for taking as input java bytecode.
    • java.sourcecode module contains the functionality that is necessary for taking as input java source code. Beware: The sourcecodefrontend is currently unable to handle inputs with exceptions (try/catch/finally)!
    • callgraph module contains implementations of common call graph construction algorithms such as CHA, RTA. A reimplementation of Spark pointer analysis framework is in progress.
    • jimple.parser module contains the functionalty that is necessary for taking as input .jimple files.
    • analysis module enables performing interprocedural dataflow analyses.
    "},{"location":"whatsnew/#no-more-singletons","title":"No More Singletons","text":"

    Singletons offer a single view of a single program version, which makes it impossible to analyze multiple programs or multiple versions of the same program. SootUp does not make use of singletons such the Scene class in the old Soot any more. It enables analyzing multiple programs simultaneously.

    "},{"location":"whatsnew/#new-source-code-frontend","title":"New Source Code Frontend","text":"

    Soot's JastAdd-based java frontend is not maintained anymore. In SootUp, we use WALA's well-maintained source code frontend, which will not only allow Soot to analyze Java source code, but also JavaScript and Python.

    "},{"location":"whatsnew/#immutable-by-design","title":"Immutable by Design","text":"

    SootUp has been designed with the goal of immutability in mind. This makes sharing objects between several entities easier, because there is no need to worry about unintended changes to other entities.

    "},{"location":"whatsnew/#withers-instead-of-setters","title":"Withers instead of Setters","text":"

    Due to the goal of immutability, many classes do not have setters anymore. For example, a Body does not have a method setStmts(List<Stmt> stmts). Instead, a method called withStmts(List<Stmt> stmts) has been added. This does not modify the original instance, but returns a copy of the Body but with the provided stmts in its instance. This concept of so-called with-ers can be found all throughout SootUp.

    A simplified example

    class Body {\n  final List<Stmt> stmts;\n  final List<Local> locals;\n\n  Body(List<Stmt> stmts, List<Local> locals) {\n    this.stmts = stmts;\n    this.locals = locals;\n  }  \n\n  Body withStmts(List<Stmt> stmts) { return new Body(stmts, this.locals); }\n  Body withLocals(List<Local> locals) { return new Body(this.stmts, locals); }\n}\n
    "},{"location":"whatsnew/#intermediate-representation","title":"Intermediate Representation","text":"

    Jimple is the only intermediate representation (IR) in SootUp. We modified it slightly to be able to accommodate different programming languages in the future.

    "},{"location":"write_analyses/","title":"Writing Analyses","text":"
    // TODO improve tutorial!\n

    If you wish to implement an interprocedural data-flow analysis via the IFDS or IDE Framework please have a look at the test cases in the sootup.analysis submodule.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"What's SootUp?","text":"

    SootUp is a complete overhaul of the good, old static analysis framework Soot.

    • Transforms JVM bytecode to the intermediate representation Jimple.
    • Provides ClassHierarchy generation
    • CallGraph generation with different algorithms/precisions
    • Inter-procedural data-flow analysis with the IDE/IFDS framework enabled by Heros
    • Applies simple transformations on retrieving a methods Body (see BodyInterceptor)
    • Provides serialization of the Jimple IR.

    Important

    SootUp is not a version update to Soot, it is a completely new implementation written from scratch that aims to be a leaner, modernized and developer friendly successor of Soot. It is not a Drop-In Replacement! The new architecture and API, renders it not trivial to update existing projects that were built on soot. Therefore we recommend using SootUp for greenfield projects. We hope improved type safety and streamlined mechanisms will aide you implementing and debugging your analysis tool. Unfortunately not every feature has been ported - If you miss something feel free to contribute a feature you miss from good old Soot.

    "},{"location":"#why-sootup","title":"Why SootUp?","text":"

    Over the 20+ years, SootUps predecessor Soot has evolved into a powerful framework, which is one of the most widely used tools in the static analysis community. This evolution was guided by the needs of the community and carried out with ad-hoc improvements. As a result, Soot has become a tool that can do a multitude of things, but it is heavy and hard to maintain and comprehend. So there was the need to clean up the codebase e.g. improve the software architecture, remove legacy datastructures that weren't in the Java Runtime at the time of Soots creation, enforce validation to have a sane state, removing the necessity of arcane knowledge, document it more and more - to make Soot future prove. So we introduced Design changes in SootUp, which aim to address Soot's shortcomings. The goal is a lighter library that can easily be understood and maintained to be included in other projects.

    "},{"location":"#supporters","title":"Supporters","text":"

    The development of SootUp is financed by generous support from the German Research Foundation (DFG) and the Heinz Nixdorf Institute (HNI).

    Become a sponsor!

    "},{"location":"advanced-topics/","title":"Functionalities and Utilities","text":""},{"location":"advanced-topics/#locallivenessanalyser","title":"LocalLivenessAnalyser","text":"

    LocalLivenessAnalyser is used for querying for the list of live local variables before and after a given Stmt.

    Example:

    The live local variables before and after each Stmt will be calculated after generating an instance of LocalLivenessAnalyser as shown the example above. They can be queried by using the methods getLiveLocalsBeforeStmt and getLiveLocalsAfterStmt.

    "},{"location":"advanced-topics/#dominancefinder","title":"DominanceFinder","text":"

    DomianceFinder is used for querying for the immediate dominator and dominance frontiers for a given basic block.

    Example:

    After generating an instance of DominanceFinder for a BlockGraph, we will get the immediate dominator and dominance frontiers for each basic block. The both properties can be queried by using the methodsgetImmediateDominatorandgetDominanceFrontiers.

    "},{"location":"analysisinputlocations/","title":"AnalysisInputLocations","text":"

    An AnalysisInputLocation tells SootUp what code input it should analyze.

    "},{"location":"analysisinputlocations/#java-runtime","title":"Java Runtime","text":"
    • Java <9: DefaultRTJaAnalysisInputLocation current rt.jar (or point to any rt.jar as its just a usual .jar file)
    • Java >8: JRTFilesystemAnalysisInputLocation

    If you have errors like Java.lang.String, Java.lang.Object, ... you are most likely missing this AnalysisInput.

    "},{"location":"analysisinputlocations/#java-bytecode-class-jar-war","title":"Java Bytecode .class, .jar, .war","text":"
    • JavaClassPathAnalysisInputLocation - its the equivalent of the classpath you would pass to the java executable i.e. point to root(s) of package(s).
    "},{"location":"analysisinputlocations/#java-sourcecode-java","title":"Java Sourcecode .java","text":"
    • OTFCompileAnalysisInputLocation - you can point directly to .java files or pass a String with Java sourcecode
    • JavaSourcePathInputLocation - points to a directory that is the root source directory (containing the package directory structure)
    "},{"location":"analysisinputlocations/#jimple-jimple","title":"Jimple .jimple","text":"
    • JimpleAnalysisInputLocation - needs a Path to a .jimple file or a directory.
    "},{"location":"analysisinputlocations/#android-bytecode-dex","title":"Android Bytecode .dex","text":"
    • ApkAnalysisInputLocation - currenlty uses dex2jar internally - SootUp solution is WIP!
    "},{"location":"analysisinputlocations/#java-cli-arguments-to-configure-sootup","title":"Java cli arguments to configure SootUp","text":"

    We created a Utility that parses a String of java command line arguments and configures SootUp respectively.

    "},{"location":"announce/","title":"Announcements","text":""},{"location":"announce/#release-announcement","title":"Release Announcement","text":"

    We would like to announce Soot\u2019s successor, SootUp.

    Over more than 20 years, Soot has become one of the world\u2019s most popular academic tool for Java and Android analysis and instrumentation. We thank all of you who have used and contributed to it over the years! It was your feedback and your contributions that helped it grow into such a versatile tool!

    However, over the years, the requirements for Soot have changed a lot, and given its original architecture, it was no longer quite up to the task. Soot was originally developed for ahead-of-time code transformation, particularly optimization, which has become very uncommon in Java. Current use cases center much more around powerful program analyses and program-understanding tasks.

    Today we are officially releasing SootUp, a new version of Soot with a completely overhauled architecture. With SootUp, we aim to keep the best things about Soot, yet overcome a lot of its drawbacks. We very much restructured Soot, particularly abolishing the heavy use of singletons. Soot now has a concept of views; each view corresponds to some version or variant of an analyzed program, and multiple views can be kept in memory at the same time. This sets the foundation, for instance, for differential or incremental program analyses.

    SootUp is a library that can easily be included in other projects, leaving those projects in control. For those who intend to use it as a framework, with inversion of control, SootUp provides additional templates that help you and novices to get started more easily. The Jimple IR has been slightly simplified, and has been made immutable by default such that internally SootUp can make use of caching where desired. Where required, Jimple transformations are still allowed, but in a systematic manner, for instance assuring that analyses depending on the transformed code are notified about its changes.

    Below is an overview of what\u2019s new.

    • Library by default, framework as an option
    • Modular Architecture, no more singletons
    • New source code frontend
    • Immutable Jimple IR
    • Greatly increased testability and test coverage

    SootUp is not a drop-in replacement for Soot! Due to its completely new architecture and API it is essentially an almost complete rewrite. For a while, Soot and SootUp will coexist, as many existing tools depend on Soot, yet our maintenance efforts will henceforth be focused on SootUp, not Soot, and on extending SootUp with those capabilities that people still find missing. For now, we recommend using SootUp for greenfield projects.

    For more details, check out * The SootUp home page: https://soot-oss.github.io/SootUp/, and * The SootUp repository: https://github.com/soot-oss/SootUp/

    We are very much looking forward to your feedback and feature requests. To this end, best create appropriate issues in the repository.

    This major upgrade of Soot was made possible by generous competitive funding by the DFG, within the project \u201cFuture-proofing the Soot Framework for Program Analysis and Transformation (FutureSoot)\u201d. It was funded in the DFG\u2019s program on Research Software Sustainability.

    "},{"location":"bodyinterceptors/","title":"Body Interceptors","text":"

    BodyInterceptors are applied to each Body now by default, if not overridden in the used AnalysisInputLocations. The BodyInterceptors exist to to improve and normalize the raw Jimple that was generated in an earlier step. The \"raw\" generated Jimple from the Bytecodefrontend needs a lot improvements - deficits of raw Jimple are:

    • Java Variables with that are compiled to the same Local index, but from different scopes inside the method are mapped to the same Local. The Localsplitter takes care of splitting these Locals that are semantically different, into two seperate Local instances.
    • The Conversion from a stack-machine to a register-machine creates leftover assignments - handled/inlined/removed by the Aggregator, CopyPropagator. They inline unnecessary Assignments.
    • As the previous BodyTransformers could optimize code that leads to unused assignments etc - The DeadAssignmentEliminator keeps the StmtGraph clean from unused/dead Assignments.
    • The Locals we get from the Java bytecode are typically untyped. Therefore we have to augment the Local types which is done by the TypeAssigner.
    • t.b.c.

    Method scoped optimisations: - ConditionalBranchFolder: removes tautologic ifs that are always true/false - if we can determine it in the scope of the method. - EmptySwitchEliminator: removes switches that are not really switching - ConstantPropagatorAndFolder: calculates constant values before runtime - CastAndReturnInliner: Removes merging flows to a single return - UnreachableCodeEliminator: speaks for itself. - TrapTightener

    Make Local names standardized: - LocalNameStandardizer: numbers Locals with the scheme: type-initial + number of type occurence

    Soot Equivalent

    BodyTransformer

    Below, we show how these BodyInterceptors work for the users who are interested in their internal workings.

    "},{"location":"bodyinterceptors/#localsplitter","title":"LocalSplitter","text":"

    LocalSplitter is aBodyInterceptorthat attempts to identify and separate uses of a local variable (as definition) that are independent of each other by renaming local variables.

    Example 1:

    As shown in the example above, the local variablel1is defined twice. It can be split up into two new local variables: l1#1 and l1#2 because the both definitions are independent of each other.

    Look for foldable navigation and tabs for showing old vs new

    Example 2:

    In the second example, the local variablel2is defined thrice. But it cannot be split up into three new local variables as in the first example, because its definitions in the if-branches are not independent of each other. Therefore, it can only be split up into two local variables as shown in the figure.

    "},{"location":"bodyinterceptors/#localpacker","title":"LocalPacker","text":"

    LocalPacker is aBodyInterceptorthat attempts to minimize the number of local variables which are used in body by reusing them, when it is possible. It corresponds to the inverse body transformation of LocalSplitter. Note: Every local variable's type should be assigned before running LocalPacker.

    Example:

    In the given example above, the local variablesl1,l3are summarized to be one local variablel1, because they have the same type without interference with each other. Likewise, the local variablesl2,l4andl5are summarized to be another local variablel2. Although the local variablel0doesn't interfere any other local variables, it cannot be summed up with other local variables because of its distinctive type.

    "},{"location":"bodyinterceptors/#traptightener","title":"TrapTightener","text":"

    WIP - currently not available!

    TrapTightener is aBodyInterceptorthat shrinks the protected area covered by each Trap in a Body.

    Example:

    We assume in the example above that only theStmt:l2 := 2might throw an exception caught by theTrapwhich is labeled withlabel3. In the jimple body before running the TrapTightener, the protected area covered by the Trap contains threeStmts:l1 := 1; l2 := 2; l2 := 3. But an exception could only arise at theStmt:l2 := 2. After the implementation of TrapTightener, we will get a contractible protected area which contains only theStmtthat might throw an exception, namely theStmt:l2 := 2.

    "},{"location":"bodyinterceptors/#emptyswitcheliminator","title":"EmptySwitchEliminator","text":"

    EmptySwitchEliminator is aBodyInterceptorthat removes empty switch statements which contain only the default case.

    Example:

    As shown in the example above, the switch statement in the jimple body always takes the default action. After running EmptySwitchEliminator, the switch statement is replaced with aGotoStmtto the default case.

    "},{"location":"bodyinterceptors/#unreachablecodeeliminator","title":"UnreachableCodeEliminator","text":"

    UnreachableCodeEliminator is aBodyInterceptorthat removes all unreachable statements.

    Example:

    Obviously, the code segmentl2 = 2; l3 = 3;is unreachable. It will be removed after running the UreachableCodeEliminator.

    "},{"location":"bodyinterceptors/#copypropagator","title":"CopyPropagator","text":"

    CopyPropagator is aBodyInterceptorthat supports the global copy propagation and constant propagation.

    Example for global copy propagation:

    Consider a code segment in the following form:

    a = b;\n...\nc = use(a); // a, b, c are local variables\n

    According to the copy propagation's definition, the statementc = use(a)can be replaced withc = use(b)iff both conditions are met:

    • ais defined only one time on all the paths froma = btoc = use(a).
    • There are no definitions ofbon any path froma = btoc = use(a).

    In the example for global copy propagation, the first usedl1is replaced withl0, but the second usedl1cannot be replaced withl3, because the second condition is not satisfied.

    Example for constant propagation:

    Constant propagation is similar to copy propagation. Consider a code segment in the following form:

    a = const;\n...\nb = use(a); // a, b are local variables, const is a constant\n

    After perfoming the constant propagation, the statementb = use(a)can be replaced withb = use(const)iffais not redefined on any of the paths froma = consttob = use(a).

    Therefore, the first usedl1in the second example can be replaced with the constant1, but the second usedl1cannot be replaced with the constant2, becausel1is redefined on the path froml1 = 2tol4 = use(l1). However, it can be replaced with local variablel2, because the both conditions of copy propagation are met.

    "},{"location":"bodyinterceptors/#localnamestandardizer","title":"LocalNameStandardizer","text":"

    LocalNameStandardizer is aBodyInterceptorthat assigns a generic name to each local variable. Firstly, it will sort the local variables' order alphabetically by the string representation of their type. If there are two local variables with the same type, then the LocalNameStandardizer will use the sequence of their occurrence in jimple body to determine their order. Each assigned name consists of two parts:

    • A letter to imply the local variable's type
    • A digit to imply the local variable's order

    The following table shows the letter corresponding to each type:

    Type of Local Variable Letter boolean z byte b short s int i long l float f double d char c null n unknown e reference r"},{"location":"bodyinterceptors/#staticsingleassignmentformer","title":"StaticSingleAssignmentFormer","text":"

    StaticSingleAssignmentFormer is aBodyInterceptorthat transforms jimple body into SSA form, so that each local variable is assigned exactly once and defined before its first use.

    Example:

    In the given example, the StaticSingleAssignmentFormer assigns eachIdentityStmtandAssignStmtto a new local variable . And each use uses the local variable which is most recently defined. Sometimes, it is impossible to determine the most recently defined local variable for a use in a join block. In this case, the StaticSingleAssignmentFormer will insert aPhiStmtin the front of the join block to merge all most recently defined local variables and assign them a new local variable.

    "},{"location":"call-graph-construction/","title":"Call Graph Construction","text":"

    A call graph shows the method calling relationship of a program. It is a directed graph, whose nodes represent different methods, and edges represent caller -> callee relationship.

    SootUp contains several call graph construction algorithms. Below, we show how you can use each of these.

    "},{"location":"call-graph-construction/#creating-the-type-hierarchy","title":"Creating the Type Hierarchy","text":"

    All the call graph construction algorithms require the view to access the type hierarchy for resolving method calls based of sub typing relationship. Below, we show how to create a type hierarchy:

    SootUpSoot
    List<AnalysisInputLocation> inputLocations = new ArrayList();\ninputLocations.add(new JavaClassPathAnalysisInputLocation(\"src/test/resources/Callgraph/binary\"));\ninputLocations.add(new DefaultRTJarAnalysisInputLocation());\n\nJavaView view = new JavaView(inputLocations);\n
    String targetTestClassName = target.exercise1.Hierarchy.class.getName();\nG.reset();\nString userdir = System.getProperty(\"user.dir\");\nString sootCp = userdir + File.separator + \"target\" + File.separator + \"test-classes\"+ File.pathSeparator + \"lib\"+File.separator+\"rt.jar\";\nOptions.v().set_whole_program(true);\nOptions.v().set_soot_classpath(sootCp);\nOptions.v().set_no_bodies_for_excluded(true);\nOptions.v().process_dir();\nOptions.v().set_allow_phantom_refs(true);\nOptions.v().setPhaseOption(\"jb\", \"use-original-names:true\");\nOptions.v().set_prepend_classpath(false);\nSootClass c = Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);\nif (c != null)\n    c.setApplicationClass();\nScene.v().loadNecessaryClasses();\n\nHierarchy hierarchy = new Hierarchy();\n
    "},{"location":"call-graph-construction/#defining-an-entry-method","title":"Defining an Entry Method","text":"

    All the call graph construction algorithms require an entry method to start with. In java application, you usually define the main method. However, it is possible to define arbitrary entry methods depending on your needs. Below, we show how to define such an entry method:

    SootUpSoot
    JavaClassType classTypeA = view.getIdentifierFactory().getClassType(\"A\");\n\nMethodSignature entryMethodSignature =\n    view.getIdentifierFactory()\n        .getMethodSignature(\n            classTypeA,\n            JavaIdentifierFactory.getInstance()\n                .getMethodSubSignature(\n                    \"calc\", VoidType.getInstance(), Collections.singletonList(classTypeA)));    \n
    SootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");     \n
    "},{"location":"call-graph-construction/#class-hierarchy-analysis","title":"Class Hierarchy Analysis","text":"

    Class Hierarchy Analysis (CHA) algorithm is the most sound call graph construction algorithm available in SootUp. It soundly includes all implementers of an interface, when resolving a method call on an interface. You can construct a call graph with CHA as follows:

    SootUpSoot
    CallGraphAlgorithm cha = \n        new ClassHierarchyAnalysisAlgorithm(view);\n\nCallGraph cg = \n        cha.initialize(Collections.singletonList(entryMethodSignature));\n\nSystem.out.println(cg);\n
    CHATransformer.v().transform();\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n    }\n
    "},{"location":"call-graph-construction/#rapid-type-analysis","title":"Rapid Type Analysis","text":"

    Rapid Type Analysis (RTA) algorithm constructs a rather precise version of the call graph that the CHA constructs. It refines CHA by considering only the instantiated implementers of an interface, when resolving a method call on an interface. You can construct a call graph with RTA as follows:

    SootUpSoot
    CallGraphAlgorithm rta = \n        new RapidTypeAnalysisAlgorithm(view);\n\nCallGraph cg = \n        rta.initialize(Collections.singletonList(entryMethodSignature));\n\nSystem.out.println(cg);\n
    Transform sparkConfig = new Transform(\"cg.spark\", null);\nPhaseOptions.v().setPhaseOption(sparkConfig, \"enabled:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"rta:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"on-fly-cg:false\");\nMap phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);\nSparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n}  \n
    "},{"location":"call-graph-construction/#variable-type-analysis","title":"Variable Type Analysis","text":"

    Variable Type Analysis (VTA) algorithm further refines the call graph that the RTA constructs. It refines RTA by considering only the assigned instantiations of the implementers of an interface, when resolving a method call on an interface. When considering assignments, we usually need to consider pointer (points-to) relationship.

    Info

    VTA algorithm was implemented using the Spark pointer analysis framework. A reimplementation of Spark in SootUp is currently under development.

    Spark requires an initial call graph to begin with. You can use one of the call graphs that we have constructed above. You can construct a call graph with VTA as follows:

    SootUpSoot
    Spark spark = new Spark.Builder(view, callGraph).vta(true).build();\nspark.analyze();\nCallGraph vtaCAllGraph = spark.getCallGraph();\n
    Transform sparkConfig = new Transform(\"cg.spark\", null);\nPhaseOptions.v().setPhaseOption(sparkConfig, \"enabled:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"vta:true\");\nPhaseOptions.v().setPhaseOption(sparkConfig, \"on-fly-cg:false\");\nMap phaseOptions = PhaseOptions.v().getPhaseOptions(sparkConfig);\nSparkTransformer.v().transform(sparkConfig.getPhaseName(), phaseOptions);\nSootMethod src = Scene.v().getSootClass(targetTestClassName).getMethodByName(\"doStuff\");\nCallGraph cg = Scene.v().getCallGraph();\nIterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(src));\nwhile (targets.hasNext()) {\n    SootMethod tgt = (SootMethod)targets.next();\n    System.out.println(src + \" may call \" + tgt);\n}    \n
    "},{"location":"docguide/","title":"Docguide","text":""},{"location":"docguide/#general","title":"General","text":""},{"location":"docguide/#mkdocsextensions","title":"MkDocsExtensions","text":""},{"location":"docguide/#tooltip","title":"Tooltip","text":"

    Hover me

    "},{"location":"docguide/#example-file-inclusion","title":"Example File inclusion","text":"

    this enables that tutorial code can be tested and will fail if its not up to date anymore :)

    package sootup.examples.basicSetup;\n\nimport static org.junit.jupiter.api.Assertions.assertTrue;\n\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Collections;\nimport org.junit.jupiter.api.Tag;\nimport org.junit.jupiter.api.Test;\nimport sootup.core.inputlocation.AnalysisInputLocation;\nimport sootup.core.jimple.common.expr.JVirtualInvokeExpr;\nimport sootup.core.jimple.common.stmt.JInvokeStmt;\nimport sootup.core.model.SootClass;\nimport sootup.core.model.SootMethod;\nimport sootup.core.signatures.MethodSignature;\nimport sootup.core.types.ClassType;\nimport sootup.core.views.View;\nimport sootup.java.bytecode.inputlocation.PathBasedAnalysisInputLocation;\nimport sootup.java.core.language.JavaJimple;\nimport sootup.java.core.views.JavaView;\n\n/** This example illustrates how to create and use a new Soot Project. */\n@Tag(\"Java8\")\npublic class BasicSetup {\n\n  @Test\n  public void createByteCodeProject() {\n    // Create a AnalysisInputLocation, which points to a directory. All class files will be loaded\n    // from the directory\n    Path pathToBinary = Paths.get(\"src/test/resources/BasicSetup/binary\");\n    AnalysisInputLocation inputLocation = PathBasedAnalysisInputLocation.create(pathToBinary, null);\n\n    // Create a view for project, which allows us to retrieve classes\n    View view = new JavaView(inputLocation);\n\n    // Create a signature for the class we want to analyze\n    ClassType classType = view.getIdentifierFactory().getClassType(\"HelloWorld\");\n\n    // Create a signature for the method we want to analyze\n    MethodSignature methodSignature =\n        view.getIdentifierFactory()\n            .getMethodSignature(\n                classType, \"main\", \"void\", Collections.singletonList(\"java.lang.String[]\"));\n\n    // Assert that class is present\n    assertTrue(view.getClass(classType).isPresent());\n\n    // Retrieve class\n    SootClass sootClass = view.getClass(classType).get();\n\n    // Retrieve method\n    view.getMethod(methodSignature);\n\n    // Alternatively:\n    assertTrue(sootClass.getMethod(methodSignature.getSubSignature()).isPresent());\n    SootMethod sootMethod = sootClass.getMethod(methodSignature.getSubSignature()).get();\n\n    // Read jimple code of method\n    System.out.println(sootMethod.getBody());\n\n    // Assert that Hello world print is present\n    assertTrue(\n        sootMethod.getBody().getStmts().stream()\n            .anyMatch(\n                stmt ->\n                    stmt instanceof JInvokeStmt\n                        && stmt.getInvokeExpr() instanceof JVirtualInvokeExpr\n                        && stmt.getInvokeExpr()\n                            .getArg(0)\n                            .equivTo(JavaJimple.getInstance().newStringConstant(\"Hello World!\"))));\n  }\n}\n
    "},{"location":"examples/","title":"SootUp Example projects","text":"

    Example code to help getting start with SootUp Here we will provide some examples that uses SootUp to provide insights about a Java program. The Examples can be cloned or downloaded from our Example Repository.

    • BasicSetupExample
    • BodyInterceptorExample
    • CallGraphExample
    • ClassHierarchyExample
    • MutatingSootClassExample

    We have included all the five projects in 5 different branches under SootUp-Examples with detailed explanation about the project.

    "},{"location":"examples/#basicsetupexample","title":"BasicSetupExample","text":"
    1. package sootup.examples; - defines the package name for the Java class.
    2. import statement - defines various classes and interfaces from different packages that the program uses.
    3. public class BasicSetup - declares a public class named 'BasicSetup' which is the main class for this program.
    4. Then we have created a main method which is the entry point of the progrram
    5. Path pathToBinary object pointing to a directory that contains the binary files ie class files to be analyzed and Paths.get is a static method that converts string path to a 'Path' object.
    6. AnalysisInputLocation object specifying where SootUp should look for classes to analyze.
    7. View object is created for the project allowing the retrieal of classes from the specified input location. JavaView is specific implementation of View tailed for Java projects.
    8. The ClassType object is created for the class name 'HelloWorld'. This object represents the type of class to be analyzed.
    9. A MethodSignature object is created for the main method of the HelloWorld class. This signature specifies the method's return type (void) and its parameter types (a single parameter of type String[]).
    10. The if statment checks for the presences of the class 'HelloWorld'. If not it prints \"Class not ffound!\" and exits the program.
    11. Then it retrieves the SootClass object representing the HelloWorld class, assuming it is present.
    12. view.getMethod(methodSignature); - Attempts to retrieve the specified method from the project.
    13. The if statment after this, checks if the main method is present in the HelloWorld class. If not, it prints \"Method not found!\" and exits.
    14. Then the next statment retrieves the SootMethod object for the main method and prints its body, which is in Jimple, a simplified version of Java bytecode used by Soot for analysis and transformation.
    15. Then the next if condition checks if the method containts a specific statement called 'Hello World!'.
    "},{"location":"examples/#bodyinterceptor","title":"BodyInterceptor","text":"
    1. package sootup.examples; - defines the package name for the Java class.
    2. import statement - defines various classes and interfaces from different packages that the program uses.
    3. public class BodyInterceptor - declares a public class named \"BodyInterceptor\".
    4. Then we have created a main method in which is the entry point for the code.
    5. Then we have created an AnalysisInputLocation pointing to a directory with class files to be loaded. It specifies that the DeadAssignmentEliminator interceptor should be applied to these classes.
    6. Then created a View that initializes a JavaView with the specified inputLocation, allowing interaction with the classes for analysis.
    7. Then have created a ClassType and MethodSignature which is used for analysis. The signature contains method name, return type and parameters.
    8. Then we check for the existence of the class and method in the given view.
    9. If they exist, a SootClass and SootMethod objects are used to retrieve the same.
    10. Then prints the body of the SootMethod object.
    11. Then we check if the interceptor worked. ie here we check if the DeadAssignmentEliminator interceptor has successfully removed a specific assignment (l1 = 3. from the method's body. It does this by looking through all statements (JAssignStmt) in the method body and checking if the assignment is not present.
    12. Then it prints the result of the interceptor check.
    "},{"location":"examples/#callgraphexample","title":"CallGraphExample","text":"
    1. package sootup.examples; - defines the package name for the Java class.
    2. import statement - defines various classes and interfaces from different packages that the program uses.
    3. public class CallgraphExample - declares a public class named \"CallGraphExample\".
    4. Then we have created a main method in which is the entry point for the code.
    5. List inputLocations creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis.
    6. Then we have provided towo inputLocations.add() - one for the project's class file directory and another for Java's runtime library (rt.jar).
    7. Then we have created a JavaView which is used for analysing the Java program.
    8. Then we have created two ClassType for two classes ie 'A' and 'B'. They are used to create a MethodSignature for a method that will be analysed.
    9. ViewTypeHierarchy - then we have set up a type hierarchy from the provided view and prints the subclasses of class 'A'.
    10. Initializes a CallGraphAlgorithm using the ClassHierarchyAnalysisAlgorithm, which is a method for constructing call graphs.
    11. Then we creates a call graph by initialising the Class Hierarchy Analysis (cha) with the entry method signature.
    12. Prints information about calls from the entry method in the call graph.
    13. "},{"location":"examples/#classhierarchyexample","title":"ClassHierarchyExample","text":"
      1. package sootup.examples; - defines the package name for the Java class.
      2. import statement - defines various classes and interfaces from different packages that the program uses.
      3. public class ClassHierarchy - declares a public class named \"ClassHierarchy\".
      4. Then we have created a main method in which is the entry point for the code.
      5. Then creates a list of AnalysisInputLocation objects. These specify where Soot should look for Java class files for analysis. Two locations are added: one for the project's binary directory and another for the default Java runtime library (rt.jar).
      6. Initializes a JavaView object with the previously created input locations.
      7. Initializes a ViewTypeHierarchy object using the view. This object will be used to analyze the class hierarchy.
      8. Then we have created two ClassTypes. These lines get JavaClassType objects for classes \"A\" and \"C\". These types are used for further hierarchy analysis.
      9. Checks the direct subclasses of class \"C\". It verifies if all direct subclasses are \"D\" using two different methods: comparing class names and fully qualified names.
      10. Then prints a message based on whether all direct subtypes of \"C\" are correctly identified as \"D\".
      11. Retrieves and checks the superclasses of class \"C\". It then verifies if these superclasses include class \"A\" and java.lang.Object, printing a message based on the result.
      "},{"location":"examples/#mutatingsootclassexample","title":"MutatingSootClassExample","text":"
      1. package sootup.examples; - defines the package name for the Java class.
      2. import statement - defines various classes and interfaces from different packages that the program uses.
      3. public class MutatingSootClass - declares a public class named \"MutatingSootClass\".
      4. Then we have created a main method in which is the entry point for the code.
      5. First we have created an 'AnalysisInputLocation' which points to a directory which contains the class files to be analysed.
      6. Then we have created a JavaView which allos us to retrievet the classes.
      7. And also created a ClassType to get the class 'HelloWorld' and a method within that class ie main for analysis using MethodSignature.
      8. THen we are checking and retrieving the class and method.
      9. Then we retrives the existing body of the method and prints it. Then we create a new local variable to add it copy to the method body.
      10. Then we are overriding the method body and class. ie this lines creates new sources that overrides teh original method body and class. It replaces the old method in the class with the new method having the modified body.
      11. Prints the modified method body and checks if the new local variable (newLocal) exists in the modified method. Depending on the result, it prints a corresponding message.
      "},{"location":"faq/","title":"Frequently Asked Questions","text":""},{"location":"faq/#how-to-setup-the-soot-dependency-in-maven-gradle","title":"How to setup the soot dependency (in Maven, Gradle)?","text":"

      See Installation.

      "},{"location":"faq/#how-to-retreive-a-sootclass-or-sootmethod","title":"How to retreive a SootClass or SootMethod?","text":"

      See Getting Started.

      "},{"location":"faq/#is-there-a-github-template-to-quickstart-into-development-with-sootup","title":"Is there a github template to quickstart into development with SootUp?","text":"

      Not yet.

      "},{"location":"faq/#error-while-using-the-sourcecodefrontend","title":"Error while using the Sourcecodefrontend","text":"

      Please make sure to use Java8 to execute.

      "},{"location":"faq/#exception-provider-jrt-not-found","title":"Exception: Provider \"jrt\" not found","text":"

      java.lang.ExceptionInInitializerError\n    at sootup.java.bytecode.inputlocation.JrtFileSystemAnalysisInputLocationTest.getClassSource(JrtFileSystemAnalysisInputLocationTest.java:28)\n    ...\nCaused by: java.nio.file.ProviderNotFoundException: Provider \"jrt\" not found\n
      To execute SootUp with JavaModules support please make sure you run the code at least the Java9 Runtime.

      "},{"location":"faq/#how-to-solve-a-concurrentmodificationexception","title":"How to solve a ConcurrentModificationException?","text":"

      Copy the Iterator into an intermediate Collection.

      final StmtGraph<?> stmtGraph = builder.getStmtGraph();\n    for (Stmt stmt : Lists.newArrayList(stmtGraph)){\n        ...\n    }\n}\n

      "},{"location":"faq/#how-can-i-visualize-a-stmtgraph","title":"How can I visualize a StmtGraph?","text":"

      There exists a tool, that converts a StmtGraph to the Graphviz Dot Language.

      DotExporter.buildGraph( stmtgraph );\n
      or create a convenient link with the exported stmtgraph as HTTP GET Parameter
      DotExporter.createUrlToWebeditor( stmtgraph );\n

      "},{"location":"faq/#is-there-a-way-to-use-code-exploration-and-syntax-highlighting-features-in-my-ide-for-jimple-files","title":"Is there a way to use code exploration and syntax highlighting features in my IDE for .jimple files?","text":"

      Try JimpeLsp.

      "},{"location":"faq/#is-there-a-way-to-use-syntax-highlighting-of-jimple-in-my-paper-thesis","title":"Is there a way to use syntax highlighting of .jimple in my paper, thesis, ...?","text":"

      Have a look at LspLexer4Pygments.

      "},{"location":"faq/#how-to-add-an-entry-in-this-list-ie-your-question-is-not-answered-here","title":"How to ... add an entry in this list? i.e. Your question is not answered here?","text":"

      Feel free to start a Discussion.

      "},{"location":"getting-started/","title":"General Usage of SootUp","text":"

      This page walks you through the core data structures, as well as shows how to get started with SootUp.

      "},{"location":"getting-started/#the-core-datastructures","title":"The core datastructures","text":"

      Before you get started with the SootUp library, it helps to learn about the following core data structures:

      • AnalysisInputLocation: points to the target code to be analyzed.

      Soot Equivalent

      It corresponds to the cp option, which specifies the classpath for Soot to find classes to be analyzed.

      • View: presents the code/classes under analysis.

      Soot Equivalent

      It corresponds to the Scene class, but it is not a singleton. So it is possible to instantiate multiple views simultaneously.

      • SootClass: represents a class loaded into the View.

      • SootMethod: represents a method of a class.

      • SootField: represents a field of a class.

      • Body: represents a method body in Jimple.

      • StmtGraph: represents the control flow graph of a method body in Jimple statements.

      "},{"location":"getting-started/#creating-a-view","title":"Creating a View","text":"

      You can use bytecode analysis typically when you do not have access to the source code of the target program. Following example shows how to create a view for analyzing Java bytecode.

      Create a view to analyze Java bytecode

      AnalysisInputLocation inputLocation = \n        new JavaClassPathAnalysisInputLocation(\"path2Binary\");\n\nJavaView view = new JavaView(inputLocation);\n

      If you have access to the source code, it is also possible to create a view for analyzing source code. Following example shows how to create view for analyzing Java source code.

      Experimental

      The source code frontend is experimental and should only be used for testing purposes. You should compile the code for analysis first and use the bytecode frontend instead.

      Create a view to analyze Java source code

      AnalysisInputLocation inputLocation = \n        new JavaSourcePathAnalysisInputLocation(\"path2Source\");\n\nJavaView view = new JavaView(inputLocation);\n

      If you have a Jimple file, you can create a view for analyzing jimple code directly. Following example shows how to create a view for analyzing jimple code.

      Create a project to analyze jimple code

      Path pathToJimple = Paths.get(\"path2Jimple\");\n\nAnalysisInputLocation inputLocation = \n        new JimpleAnalysisInputLocation(pathToJimple);\n\nJimpleView view = new JimpleView(inputLocation);\n

      By default, whenever a class is retrieved, it will be permanently stored in a cache. If you do not want retrieved classes to be stored indefinetly, you can instead provide a different CacheProvider to the created view. To for example use an LRUCache instead, which stores at most 50 classes, and always replaces the least recently used class by a newly retrieved one, use the following call:

      JavaView view = new JavaView(Collections.singletonList(inputLocation), new LRUCacheProvider(50));\n
      "},{"location":"getting-started/#retrieving-a-class","title":"Retrieving a Class","text":"

      Each class is identified with a unique signature adhering to Java identifier rules, therefore you first need to specify the class signature (ClassType) as shown below.

      Let's say the following is the target program that we want to analyze:

      Target Program

      package example;\n\npublic class HelloWorld {\n\n  public HelloWorld() {\n\n  }\n\n  public static void main(String[] args) {\n    HelloWorld hw = new HelloWorld();\n    hw.hello();\n  }\n\n  public void hello() {\n\n  }\n\n}\n

      Then, we could define the ClassType of the HelloWorld class as follows:

      Defining a ClassType

      JavaClassType classType = \n        view.getIdentifierFactory().getClassType(\"example.HelloWorld\");\n

      Once we have a ClassType that identifies the HelloWorld class, we can use it to retrieve the corresponding SootClass object from the view as shown below:

      Retrieving a SootClass

      JavaSootClass sootClass = view.getClass(classType).get();\n
      "},{"location":"getting-started/#retrieving-a-method","title":"Retrieving a Method","text":"

      Like the classes, methods also have an identifier which we call MethodSignature. For instance, we can define the method signature for identifying the main method of the HelloWorld class as follows:

      Defining a MethodSignature

      MethodSignature methodSignature =\n    view\n        .getIdentifierFactory()\n        .getMethodSignature(\n            \"main\", // method name\n            classType,\n            \"void\", // return type\n            Collections.singletonList(\"java.lang.String[]\")); // args\n

      Once we have a MethodSignature that identifies the main method of the HelloWorld class, we can use it to retrieve the corresponding SootMethod object from the view as shown below:

      Retrieving a SootMethod from the View

      Optional<SootMethod> opt = view.getMethod(methodSignature);\n\nif(opt.isPresent()){\n  SootMethod method = opt.get();\n}\n

      Alternatively, we can also retrieve a SootMethod from SootClass that contains it.

      Retrieving a SootMethod from a SootClass

      Optional<JavaSootMethod> opt = sootClass.getMethod(methodSignature.getSubSignature());\n\nif(opt.isPresent()){\n  JavaSootMethod method = opt.get();\n}\n
      "},{"location":"getting-started/#retrieving-the-control-flow-graph-of-a-method","title":"Retrieving the Control-Flow Graph of a Method","text":"

      Each SootMethod contains a Control-Flow Graph (CFG) which is represented via the StmtGraph. This structure is usually used for program analysis. You can retrieve the CFG of a SootMethod as follows:

      Retrieving the CFG of a SootMethod

      sootMethod.getBody().getStmts();\n

      Access or Download all of the code used above

      BasicSetup.java

      "},{"location":"installation/","title":"Installation","text":""},{"location":"installation/#use-the-latest-develop-branch","title":"Use the latest develop branch","text":"

      For configuration options of your build tool please visit SootUp on Jitpack.io

      "},{"location":"installation/#use-releases-on-maven-central","title":"Use Releases on Maven Central","text":"

      The code below shows you how to import all submodules of the SootUp repository. You can import fewer modules if your use case allows it.

      Add the following dependencies to your pom.xml / build.gradle.

      MavenGradle
      <dependencies>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.core</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.core</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.sourcecode</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.bytecode</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.jimple.parser</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.callgraph</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.analysis</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n    <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.qilin</artifactId>\n        <version>1.3.0</version>\n    </dependency>\n</dependencies>\n
      repositories {\n    mavenCentral()\n    google()\n}\n\ncompile \"org.soot-oss:sootup.core:1.3.0\"\ncompile \"org.soot-oss:sootup.java.core:1.3.0\"\ncompile \"org.soot-oss:sootup.java.sourcecode:1.3.0\"\ncompile \"org.soot-oss:sootup.java.bytecode:1.3.0\"\ncompile \"org.soot-oss:sootup.jimple.parser:1.3.0\"\ncompile \"org.soot-oss:sootup.callgraph:1.3.0\"\ncompile \"org.soot-oss:sootup.analysis:1.3.0\"\ncompile \"org.soot-oss:sootup.qilin:1.3.0\"\n
      "},{"location":"installation/#build-from-source","title":"Build from Source","text":"

      If you'd like to get the most recent changes, you can build SootUp from source yourself and install it into your local maven repository.

      git clone https://github.com/secure-software-engineering/SootUp.git\nmvn install\n

      "},{"location":"jimple/","title":"Jimple","text":"

      What is Jimple? Jimple is the intermediate representation IR of Soot, and thus SootUp. Soot's intention is to provide a simplified way to analyze JVM bytecode. JVM bytecode is stack-based, which makes it difficult for program analysis. Java source code, on the other hand, is also not quite suitable for program analysis, due to its nested structures. Therefore, Jimple aims to bring the best of both worlds, a non-stack-based and flat (non-nested) representation. For this purpose Jimple was designed as a representation of JVM bytecode which is human readable.

      Info

      To learn more about jimple, refer to the thesis by Raja Vallee-Rai.

      It might help to visualize how the Jimple version of a Java code looks like. Have a look at the following example on the HelloWorld class.

      JimpleJavaByte Code
      public class HelloWorld extends java.lang.Object\n{\n  public void <init>()\n  {\n    HelloWorld r0;\n    r0 := @this: HelloWorld;\n    specialinvoke r0.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public static void main(java.lang.String[])\n  {\n    java.lang.String[] r0;\n    java.io.PrintStream r1;\n\n    r0 := @parameter0: java.lang.String[];\n    r1 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke r1.<java.io.PrintStream: \n    void println(java.lang.String)>(\"Hello world!\");\n    return;\n  }\n}\n
      public class HelloWorld {\n\n  public HelloWorld() {\n\n  }\n\n  public static void main(String[] var0) {\n    System.out.println(\"Hello World!\");\n  }\n\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class analysis/HelloWorld {\n\n// compiled from: HelloWorld.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 4 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 6 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Lanalysis/HelloWorld; L0 L2 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static main([Ljava/lang/String;)V\n  L0\n    LINENUMBER 9 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Hello World!\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 10 L1\n    RETURN\n  L2\n    LOCALVARIABLE var0 [Ljava/lang/String; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#jimple-grammar-structure","title":"Jimple Grammar Structure","text":"

      Jimple mimics the JVMs class file structure. Therefore it is object oriented. A Single Class (or Interface) per file. Three-Address-Code which means there are no nested expressions. (nested expressions can be modeled via Locals that store intermediate calculation results.)

      "},{"location":"jimple/#class-or-interface","title":"Class (or Interface)","text":"

      A class consists of Fields and Methods. It is referenced by its ClassType.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n}\n
      package target.exercise1;\n\npublic class DemoClass {}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#field","title":"Field","text":"

      A Field is a piece of memory which can store a value that is accessible according to its visibility modifier. It is referenced by its FieldSignature.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: double pi> = 3.14;\n    return;\n  }\n}\n/*\n  \"this.<target.exercise1.DemoClass: double pi>\" is JInstanceFieldRef\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  private final double pi = 3.14;\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x12\nprivate final D pi = 3.14\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    LDC 3.14\n    PUTFIELD target/exercise1/DemoClass.pi : D\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#method-and-the-body","title":"Method and the Body","text":"

      The interesting part is a method. A method is a \"piece of code\" that can be executed. It is referenced by its MethodSignature and contains a StmtGraph that models the sequence of single instructions/statements (Stmts).

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    virtualinvoke this.<target.exercise1.DemoClass: \n    void demoMethod()>();\n    return;\n  }\n\n  public void demoMethod()\n  {\n    java.io.PrintStream $stack1;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack1 = <java.lang.System: java.io.PrintStream out>;\n\n    virtualinvoke $stack1.<java.io.PrintStream: \n    void println(java.lang.String)>(\"Inside method.\");\n    return;\n  }\n}\n/*\n  \"<target.exercise1.DemoClass: void demoMethod()>\" \n        and \"<target.exercise1.DemoClass: void <init>()>\" \n        are instances of SootMethod \n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  DemoClass(){\n    demoMethod();\n  }\n  public void demoMethod(){\n    System.out.println(\"Inside method.\");\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x0\n<init>()V\n  L0\n    LINENUMBER 5 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 6 L1\n    ALOAD 0\n    INVOKEVIRTUAL target/exercise1/DemoClass.demoMethod ()V\n  L2\n    LINENUMBER 7 L2\n    RETURN\n  L3\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L3 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic demoMethod()V\n  L0\n    LINENUMBER 10 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Inside method.\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 11 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#signatures","title":"Signatures","text":"

      Signatures are required for identifying or referencing things across a method, such as Classes, Interfaces, Methods or Fields. Locals, on the other hand, do not need signatures, since they are referenced within method boundaries.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: double pi> = 3.14;\n    return;\n  }\n\n  public void demoMethod()\n  {\n    java.io.PrintStream $stack3, $stack5;\n    java.lang.StringBuilder $stack4, $stack6, $stack7;\n    java.lang.String $stack8;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack3 = <java.lang.System: java.io.PrintStream out>;\n\n    virtualinvoke $stack3.<java.io.PrintStream: \n      void println(java.lang.String)>(\"pi : 3.14\");\n    $stack5 = <java.lang.System: java.io.PrintStream out>;\n    $stack4 = new java.lang.StringBuilder;\n\n    specialinvoke $stack4.<java.lang.StringBuilder: void <init>()>();\n    $stack6 = virtualinvoke $stack4.<java.lang.StringBuilder: \n      java.lang.StringBuilder append(java.lang.String)>\n        (\"pi : \");\n    $stack7 = virtualinvoke $stack6.<java.lang.StringBuilder: \n      java.lang.StringBuilder append(double)>(3.1415);\n    $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: \n      java.lang.String toString()>();\n\n    virtualinvoke $stack5.<java.io.PrintStream:     \n      void println(java.lang.String)>($stack8);\n    return;\n  }\n}\n/*\n  For JInstanceFieldRef \"this.<target.exercise1.DemoClass: double pi>\" \n    signature is <target.exercise1.DemoClass: double pi>\n  Similarly, we have other signatures like \n    <java.lang.Object: void <init>()>, \n    <java.io.PrintStream: void println(java.lang.String)> \n    and so on. \n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  private final double pi = 3.14;\n\n  public void demoMethod(){\n    double localPi = 3.1415;\n    System.out.println(\"pi : \" + pi);\n    System.out.println(\"pi : \" + localPi);\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x12\nprivate final D pi = 3.14\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    LDC 3.14\n    PUTFIELD target/exercise1/DemoClass.pi : D\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic demoMethod()V\n  L0\n    LINENUMBER 6 L0\n    LDC 3.1415\n    DSTORE 1\n  L1\n    LINENUMBER 7 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"pi : 3.14\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L2\n    LINENUMBER 8 L2\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    NEW java/lang/StringBuilder\n    DUP\n    INVOKESPECIAL java/lang/StringBuilder.<init> ()V\n    LDC \"pi : \"\n      INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)\n        Ljava/lang/StringBuilder;\n    DLOAD 1\n    INVOKEVIRTUAL java/lang/StringBuilder.append (D)Ljava/lang/StringBuilder;\n    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 9 L3\n    RETURN\n  L4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0\n    LOCALVARIABLE localPi D L1 L4 1\n    MAXSTACK = 4\n    MAXLOCALS = 3\n}\n
      "},{"location":"jimple/#trap","title":"Trap","text":"

      A Trap is a mechanism to model exceptional flow.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void divideExample(int, int)\n  {\n    int x, y, $stack4;\n    java.io.PrintStream $stack5, $stack7;\n    java.lang.Exception $stack6;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n    y := @parameter1: int;\n\n   label1:\n      $stack5 = <java.lang.System: java.io.PrintStream out>;\n      $stack4 = x / y;\n      virtualinvoke $stack5.<java.io.PrintStream: void println(int)>($stack4);\n\n   label2:\n      goto label4;\n\n   label3:\n      $stack6 := @caughtexception;\n      $stack7 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack7.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Exception caught\");\n\n   label4:\n      return;\n\n      catch java.lang.Exception from label1 to label2 with label3;\n  }\n}\n/*\n  By calling getTraps() method, we can get the Traip chain.\n  For the above jimple code, we have the below trap:\n  Trap :\n  begin  : $stack5 = <java.lang.System: java.io.PrintStream out>\n  end    : goto [?= return]\n  handler: $stack6 := @caughtexception\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public void divideExample(int x, int y){\n    try {\n      System.out.println(x / y);\n    }catch (Exception e){\n      System.out.println(\"Exception caught\");\n    }\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n    L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic divideExample(II)V\n  TRYCATCHBLOCK L0 L1 L2 java/lang/Exception\n  L0\n    LINENUMBER 6 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    ILOAD 2\n    IDIV\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L1\n    LINENUMBER 9 L1\n    GOTO L3\n  L2\n    LINENUMBER 7 L2\n    FRAME SAME1 java/lang/Exception\n    ASTORE 3\n  L4\n    LINENUMBER 8 L4\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Exception caught\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 10 L3\n    FRAME SAME\n    RETURN\n  L5\n    LOCALVARIABLE e Ljava/lang/Exception; L4 L3 3\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE x I L0 L5 1\n    LOCALVARIABLE y I L0 L5 2\n    MAXSTACK = 3\n    MAXLOCALS = 4\n}\n
      "},{"location":"jimple/#stmt","title":"Stmt","text":"

      The main piece of Jimple is a Statement (Stmt). Stmts represent that can be executed by the JVM.

      "},{"location":"jimple/#branching-statements","title":"Branching Statements","text":"

      A BranchingStmt's job is to model the flow between Stmts.

      "},{"location":"jimple/#jgotostmt","title":"JGotoStmt","text":"

      for unconditional flow.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n  public static void sampleMethod()\n  {\n    int i;\n    i = 0;\n\n    label1:\n      if i >= 5 goto label3;\n      if i != 3 goto label2;\n      goto label3;\n\n    label2:\n      i = i + 1;\n      goto label1;\n\n    label3:\n      return;\n  }\n}\n/*\n  Here for statements \"goto label3;\" and \"goto label1;\", \n  we have two instances of JGotoStmt : \n    \"goto[?=return]\" and \"goto[?=(branch)]\".\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public static void sampleMethod(){\n    label1:\n    for (int i = 0; i < 5; i++){\n      if(i == 3){\n        break label1;\n      }\n    }\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static sampleMethod()V\n  L0\n    LINENUMBER 6 L0\n    ICONST_0\n    ISTORE 0\n  L1\n    FRAME APPEND [I]\n    ILOAD 0\n    ICONST_5\n    IF_ICMPGE L2\n  L3\n    LINENUMBER 7 L3\n    ILOAD 0\n    ICONST_3\n    IF_ICMPNE L4\n  L5\n    LINENUMBER 8 L5\n    GOTO L2\n  L4\n    LINENUMBER 6 L4\n    FRAME SAME\n    IINC 0 1\n    GOTO L1\n  L2\n    LINENUMBER 11 L2\n    FRAME CHOP 1\n    RETURN\n    LOCALVARIABLE i I L1 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#jifstmt","title":"JIfStmt","text":"

      for conditional flow depending on boolean Expression (AbstractConditionExpr) so they have two successor Stmt's.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n   public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public static void sampleMethod(int)\n  {\n    int x, $stack1;\n    java.io.PrintStream $stack2, $stack3;\n\n    x := @parameter0: int;\n\n    $stack1 = x % 2;\n    if $stack1 != 0 goto label1;\n\n    $stack3 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack3.<java.io.PrintStream: \n      void println(java.lang.String)>(\"Even\");\n    goto label2;\n\n    label1:\n      $stack2 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack2.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Odd\");\n\n    label2:\n      return;\n  }\n}\n/*\n  For statement \"if $stack1 != 0 goto label1;\", \n  we have an instance of JIfStmt :\n    \"if $stack1 != 0 goto $stack2 \n        = <java.lang.System:java.io.PrintStream out>\".\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public static void sampleMethod(int x){\n    if(x % 2 == 0){\n      System.out.println(\"Even\");\n    }else{\n      System.out.println(\"Odd\");\n    }\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x9\npublic static sampleMethod(I)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 0\n    ICONST_2\n    IREM\n    IFNE L1\n  L2\n    LINENUMBER 6 L2\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Even\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n    GOTO L3\n  L1\n    LINENUMBER 8 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Odd\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L3\n    LINENUMBER 10 L3\n    FRAME SAME\n    RETURN\n  L4\n    LOCALVARIABLE x I L0 L4 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#jswitchstmt","title":"JSwitchStmt","text":"

      for conditional flow that behaves like a switch-case. It has #numberOfCaseLabels+1 (for default) successor Stmt's.

      All other Stmts are not manipulating the flow, which means they have a single successor Stmt as long as they are not exiting the flow inside a method.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void switchExample(int)\n  {\n    int x;\n    java.io.PrintStream $stack2, $stack3, $stack4;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    lookupswitch(x)\n    {\n      case 1: goto label1;\n      case 2: goto label2;\n      default: goto label3;\n    };\n\n    label1:\n      $stack3 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack3.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input 1\");\n      goto label4;\n\n    label2:\n      $stack2 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack2.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input 2\");\n      goto label4;\n\n    label3:\n      $stack4 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack4.<java.io.PrintStream: \n        void println(java.lang.String)>(\"Input more than 2\");\n\n    label4:\n      return;\n  }\n}\n/*\n  Here for below statement:\n    lookupswitch(x)\n      {\n        case 1: goto label1;\n        case 2: goto label2;\n        default: goto label3;\n      };\n\n  we have an instance of JLookupSwitchStmt :\n    lookupswitch(x) \n      {     \n        case 1: goto $stack3 \n                        = <java.lang.System: java.io.PrintStream out>;     \n        case 2: goto $stack2 \n                        = <java.lang.System: java.io.PrintStream out>;     \n        default: goto $stack4 \n                        = <java.lang.System: java.io.PrintStream out>; \n      }\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public void switchExample(int x){\n    switch (x){\n      case 1:\n        System.out.println(\"Input 1\");\n        break;\n\n      case 2:\n        System.out.println(\"Input 2\");\n        break;\n\n      default:\n        System.out.println(\"Input more than 2\");\n        break;\n\n    }\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic switchExample(I)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 1\n    LOOKUPSWITCH\n    1: L1\n    2: L2\n    default: L3\n  L1\n    LINENUMBER 7 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input 1\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L4\n    LINENUMBER 8 L4\n    GOTO L5\n  L2\n    LINENUMBER 11 L2\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input 2\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L6\n    LINENUMBER 12 L6\n    GOTO L5\n  L3\n    LINENUMBER 15 L3\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Input more than 2\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L5\n    LINENUMBER 19 L5\n    FRAME SAME\n    RETURN\n  L7\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L7 0\n    LOCALVARIABLE x I L0 L7 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
      "},{"location":"jimple/#jreturnstmt-jreturnvoidstmt","title":"JReturnStmt & JReturnVoidStmt","text":"

      They end the execution/flow inside the current method and return (a value) to its caller.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public int increment(int)\n  {\n    int x, $stack2;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    $stack2 = x + 1;\n    return $stack2;\n  }\n\n  public void print()\n  {\n    java.io.PrintStream $stack1;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    $stack1 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack1.<java.io.PrintStream: \n      void println(java.lang.String)>(\"Inside method print\");\n    return;\n  }\n}\n/*\n  \"return $stack2\" is JReturnStmt.\n  \"return\" is JReturnVoidStmt.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public int increment(int x){\n    return x + 1;\n  }\n  public void print(){\n    System.out.println(\"Inside method print\");\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic increment(I)I\n  L0\n    LINENUMBER 5 L0\n    ILOAD 1\n    ICONST_1\n    IADD\n    IRETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE x I L0 L1 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n\n// access flags 0x1\npublic print()V\n  L0\n    LINENUMBER 8 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"Inside method print\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 9 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#jthrowstmt","title":"JThrowStmt","text":"

      Ends the execution inside the current Method if the thrown exception is not caught by a Trap, which redirects the execution to an exceptionhandler.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void divideExample(int, int)\n  {\n    int y, x, $stack6;\n    java.lang.StringBuilder $stack3, $stack5, $stack7;\n    java.io.PrintStream $stack4;\n    java.lang.String $stack8;\n    java.lang.RuntimeException $stack9;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n    y := @parameter1: int;\n\n    if y != 0 goto label1;\n\n    $stack9 = new java.lang.RuntimeException;\n    specialinvoke $stack9.<java.lang.RuntimeException: \n      void <init>(java.lang.String)>(\"Divide by zero error\");\n    throw $stack9;\n\n    label1:\n      $stack4 = <java.lang.System: java.io.PrintStream out>;\n      $stack3 = new java.lang.StringBuilder;\n      specialinvoke $stack3.<java.lang.StringBuilder: void <init>()>();\n\n      $stack5 = virtualinvoke $stack3.<java.lang.StringBuilder: \n        java.lang.StringBuilder append(java.lang.String)>(\"Divide result : \");\n      $stack6 = x / y;\n      $stack7 = virtualinvoke $stack5.<java.lang.StringBuilder: \n        java.lang.StringBuilder append(int)>($stack6);\n      $stack8 = virtualinvoke $stack7.<java.lang.StringBuilder: \n        java.lang.String toString()>();\n\n      virtualinvoke $stack4.<java.io.PrintStream: \n        void println(java.lang.String)>($stack8);\n      return;\n  }\n}\n/*\n  \"throw $stack9\" is JThrowStmt.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public void divideExample(int x, int y){\n    if(y == 0){\n      throw new RuntimeException(\"Divide by zero error\");\n    }\n    System.out.println(\"Divide result : \" + x / y);\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic divideExample(II)V\n  L0\n    LINENUMBER 5 L0\n    ILOAD 2\n    IFNE L1\n  L2\n    LINENUMBER 6 L2\n    NEW java/lang/RuntimeException\n    DUP\n    LDC \"Divide by zero error\"\n    INVOKESPECIAL java/lang/RuntimeException.<init> \n      (Ljava/lang/String;)V\n    ATHROW\n  L1\n    LINENUMBER 8 L1\n    FRAME SAME\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    NEW java/lang/StringBuilder\n    DUP\n    INVOKESPECIAL java/lang/StringBuilder.<init> ()V\n    LDC \"Divide result : \"\n    INVOKEVIRTUAL java/lang/StringBuilder.append \n      (Ljava/lang/String;)Ljava/lang/StringBuilder;\n    ILOAD 1\n    ILOAD 2\n    IDIV\n    INVOKEVIRTUAL java/lang/StringBuilder.append \n      (I)Ljava/lang/StringBuilder;\n    INVOKEVIRTUAL java/lang/StringBuilder.toString \n      ()Ljava/lang/String;\n    INVOKEVIRTUAL java/io/PrintStream.println \n      (Ljava/lang/String;)V\n  L3\n    LINENUMBER 9 L3\n    RETURN\n  L4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L4 0\n    LOCALVARIABLE x I L0 L4 1\n    LOCALVARIABLE y I L0 L4 2\n    MAXSTACK = 4\n    MAXLOCALS = 3\n}\n
      "},{"location":"jimple/#jinvokestmt","title":"JInvokeStmt","text":"

      transfers the control flow to another method until the called method returns.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void print(int)\n  {\n    target.exercise1.DemoClass this;\n    int x, a;\n    java.io.PrintStream $stack4, $stack6;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    a = virtualinvoke this.<target.exercise1.DemoClass: \n      int increment(int)>(x);\n    $stack4 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack4.<java.io.PrintStream: \n      void println(int)>(a);\n\n    a = virtualinvoke this.<target.exercise1.DemoClass: \n      int increment(int)>(a);\n    $stack6 = <java.lang.System: java.io.PrintStream out>;\n    virtualinvoke $stack6.<java.io.PrintStream: \n      void println(int)>(a);\n\n    return;\n  }\n\n  public int increment(int)\n  {\n    int x, $stack2;\n    target.exercise1.DemoClass this;\n\n    this := @this: target.exercise1.DemoClass;\n    x := @parameter0: int;\n\n    $stack2 = x + 1;\n    return $stack2;\n  }\n}\n/*\n  \"specialinvoke this.<java.lang.Object: void <init>()>()\", \n  \"virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(x)\", \n  \"virtualinvoke this.<target.exercise1.DemoClass: int increment(int)>(a)\" \n    are JInvokeStmts.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public void print(int x){\n    int a = increment(x);\n    System.out.println(a);\n    a = increment(a);\n    System.out.println(a);\n  }\n  public int increment(int x){\n    return x + 1;\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic print(I)V\n  L0\n    LINENUMBER 5 L0\n    ALOAD 0\n    ILOAD 1\n    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I\n    ISTORE 2\n  L1\n    LINENUMBER 6 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L2\n    LINENUMBER 7 L2\n    ALOAD 0\n    ILOAD 2\n    INVOKEVIRTUAL target/exercise1/DemoClass.increment (I)I\n    ISTORE 2\n  L3\n    LINENUMBER 8 L3\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L4\n    LINENUMBER 9 L4\n    RETURN\n  L5\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE x I L0 L5 1\n    LOCALVARIABLE a I L1 L5 2\n    MAXSTACK = 2\n    MAXLOCALS = 3\n\n// access flags 0x1\npublic increment(I)I\n  L0\n    LINENUMBER 11 L0\n    ILOAD 1\n    ICONST_1\n    IADD\n    IRETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE x I L0 L1 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
      "},{"location":"jimple/#jassignstmt","title":"JAssignStmt","text":"

      assigns a Value from the right hand-side to the left hand-side. Left hand-side of an assignment can be a Local referencing a variable (i.e. a Local) or a FieldRef referencing a Field. Right hand-side of an assignment can be an expression (Expr), a Local, a FieldRef or a Constant.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: int counter> = 0;\n    return;\n  }\n\n  public int updateCounter()\n  {\n    target.exercise1.DemoClass this;\n    int $stack1, $stack2, $stack3;\n\n    this := @this: target.exercise1.DemoClass;\n\n    $stack1 = this.<target.exercise1.DemoClass: int counter>;\n    $stack2 = $stack1 + 1;\n    this.<target.exercise1.DemoClass: int counter> = $stack2;\n    $stack3 = this.<target.exercise1.DemoClass: int counter>;\n\n    return $stack3;\n  }\n}\n/*\n  \"this.<target.exercise1.DemoClass: int counter> = 0\", \n  \"$stack1 = this.<target.exercise1.DemoClass: int counter>\",\n  \"$stack2 = $stack1 + 1\"\n  \"this.<target.exercise1.DemoClass: int counter> = $stack2\"\n  \"$stack3 = this.<target.exercise1.DemoClass: int counter>\"\n    are JAssignStmts.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  private int counter = 0;\n  public int updateCounter(){\n    counter = counter + 1;\n    return counter;\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    ICONST_0\n    PUTFIELD target/exercise1/DemoClass.counter : I\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic updateCounter()I\n  L0\n    LINENUMBER 6 L0\n    ALOAD 0\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    ICONST_1\n    IADD\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L1\n    LINENUMBER 7 L1\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    IRETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 3\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#jidentitystmt","title":"JIdentityStmt","text":"

      is semantically like the JAssignStmt and handles assignments of IdentityRef's to make implicit assignments explicit into the StmtGraph.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    return;\n  }\n\n  public void DemoClass(int)\n  {\n    target.exercise1.DemoClass this;\n    int counter;\n\n    this := @this: target.exercise1.DemoClass;\n    counter := @parameter0: int;\n    this.<target.exercise1.DemoClass: int counter> = counter;\n    return;\n  }\n}\n/*\n  \"this := @this: target.exercise1.DemoClass\" and \n    \"counter := @parameter0: int\" are JIdentityStmts\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  private int counter;\n  public void DemoClass(int counter){\n    this.counter = counter;\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic DemoClass(I)V\n  L0\n    LINENUMBER 6 L0\n    ALOAD 0\n    ILOAD 1\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L1\n    LINENUMBER 7 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    LOCALVARIABLE counter I L0 L2 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
      "},{"location":"jimple/#jentermonitorstmt-jexitmonitorstmt","title":"JEnterMonitorStmt & JExitMonitorStmt","text":"

      marks synchronized blocks of code from JEnterMonitorStmt to JExitMonitorStmt.

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n    target.exercise1.DemoClass this;\n    this := @this: target.exercise1.DemoClass;\n    specialinvoke this.<java.lang.Object: void <init>()>();\n    this.<target.exercise1.DemoClass: int counter> = 0;\n    return;\n  }\n\n  public int updateCounter()\n  {\n    target.exercise1.DemoClass this;\n    int $stack4, $stack5, $stack7;\n    java.lang.Throwable $stack8;\n\n    this := @this: target.exercise1.DemoClass;\n\n    entermonitor this;\n\n    label1:\n      $stack4 = this.<target.exercise1.DemoClass: int counter>;\n      $stack5 = $stack4 + 1;\n      this.<target.exercise1.DemoClass: int counter> = $stack5;\n\n      exitmonitor this;\n\n    label2:\n      goto label5;\n\n    label3:\n      $stack8 := @caughtexception;\n\n      exitmonitor this;\n\n    label4:\n      throw $stack8;\n\n    label5:\n      $stack7 = this.<target.exercise1.DemoClass: int counter>;\n      return $stack7;\n\n      catch java.lang.Throwable from label1 to label2 with label3;\n      catch java.lang.Throwable from label3 to label4 with label3;\n  }\n}\n/*\n  \"entermonitor this\" is JEnterMonitorStmt.\n  \"exitmonitor this\" is JExitMonitorStmt.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  private int counter = 0;\n  public int updateCounter(){\n    synchronized (this) {\n      counter = counter + 1;\n    }\n    return counter;\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I counter\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n  L1\n    LINENUMBER 4 L1\n    ALOAD 0\n    ICONST_0\n    PUTFIELD target/exercise1/DemoClass.counter : I\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic updateCounter()I\n    TRYCATCHBLOCK L0 L1 L2 null\n    TRYCATCHBLOCK L2 L3 L2 null\n  L4\n    LINENUMBER 6 L4\n    ALOAD 0\n    DUP\n    ASTORE 1\n    MONITORENTER\n  L0\n    LINENUMBER 7 L0\n    ALOAD 0\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    ICONST_1\n    IADD\n    PUTFIELD target/exercise1/DemoClass.counter : I\n  L5\n    LINENUMBER 8 L5\n    ALOAD 1\n    MONITOREXIT\n  L1\n    GOTO L6\n  L2\n    FRAME FULL [target/exercise1/DemoClass java/lang/Object] \n      [java/lang/Throwable]\n    ASTORE 2\n    ALOAD 1\n    MONITOREXIT\n  L3\n    ALOAD 2\n    ATHROW\n  L6\n    LINENUMBER 9 L6\n    FRAME CHOP 1\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.counter : I\n    IRETURN\n  L7\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L4 L7 0\n    MAXSTACK = 3\n    MAXLOCALS = 3\n}\n
      "},{"location":"jimple/#jretstmt","title":"JRetStmt","text":""},{"location":"jimple/#jbreakpointstmt","title":"JBreakpointStmt","text":"

      models a Breakpoint set by a Debugger (usually not relevant for static analyses)

      "},{"location":"jimple/#immediate","title":"Immediate","text":"

      An Immediate has a given Type and consists of a Local (\"a Variable\", \"Something that contains a Value\") or a Constant (\"Something that is a Value\").

      "},{"location":"jimple/#type","title":"Type","text":"

      VoidType

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  specialinvoke this.<java.lang.Object: void <init>()>();\n  return;\n  }\n\n  public void voidMethod()\n  {\n  java.io.PrintStream $stack1;\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  $stack1 = <java.lang.System: java.io.PrintStream out>;\n  virtualinvoke $stack1.<java.io.PrintStream: \n      void println(java.lang.String)>(\"In voidMethod().\");\n  return;\n  }\n}\n/*\n  For the SootMethod - <target.exercise1.DemoClass: void voidMethod()>, \n    returnType is instance of VoidType.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public void voidMethod(){\n  System.out.println(\"In voidMethod().\");\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic voidMethod()V\n  L0\n    LINENUMBER 5 L0\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LDC \"In voidMethod().\"\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V\n  L1\n    LINENUMBER 6 L1\n    RETURN\n  L2\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L2 0\n    MAXSTACK = 2\n    MAXLOCALS = 1\n}\n
      "},{"location":"jimple/#primarytype","title":"PrimaryType","text":"

      BooleanType, ByteType, CharType, ShortType, IntType, LongType, DoubleType, FloatType

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\n  public void <init>()\n  {\n      target.exercise1.DemoClass this;\n      this := @this: target.exercise1.DemoClass;\n      specialinvoke this.<java.lang.Object: void <init>()>();\n      return;\n  }\n\n\n  public void display()\n  {\n      java.io.PrintStream $stack11, $stack13, $stack15, \n        $stack17, $stack19, $stack21, $stack23, $stack25;\n      int $stack12, $stack14, $stack16, $stack18;\n      long $stack20;\n      double $stack22;\n      float $stack24;\n      target.exercise1.DemoClass this;\n      boolean $stack26;\n\n      this := @this: target.exercise1.DemoClass;\n\n      $stack11 = <java.lang.System: java.io.PrintStream out>;\n\n      goto label1;\n\n   label1:\n      $stack26 = 0;\n      virtualinvoke $stack11.<java.io.PrintStream: \n        void println(boolean)>($stack26);\n\n      $stack13 = <java.lang.System: java.io.PrintStream out>;\n      $stack12 = 127 - 1;\n      virtualinvoke $stack13.<java.io.PrintStream: \n        void println(int)>($stack12);\n\n      $stack15 = <java.lang.System: java.io.PrintStream out>;\n      $stack14 = 97 + 1;\n      virtualinvoke $stack15.<java.io.PrintStream: \n        void println(int)>($stack14);\n\n      $stack17 = <java.lang.System: java.io.PrintStream out>;\n      $stack16 = 1123 + 1;\n      virtualinvoke $stack17.<java.io.PrintStream: \n        void println(int)>($stack16);\n\n      $stack19 = <java.lang.System: java.io.PrintStream out>;\n      $stack18 = 123456 + 1;\n      virtualinvoke $stack19.<java.io.PrintStream: \n        void println(int)>($stack18);\n\n      $stack21 = <java.lang.System: java.io.PrintStream out>;\n      $stack20 = 10L + 1L;\n      virtualinvoke $stack21.<java.io.PrintStream: \n        void println(long)>($stack20);\n\n      $stack23 = <java.lang.System: java.io.PrintStream out>;\n      $stack22 = 10.1 + 1.0;\n      virtualinvoke $stack23.<java.io.PrintStream: \n        void println(double)>($stack22);\n\n      $stack25 = <java.lang.System: java.io.PrintStream out>;\n      $stack24 = 10.1F + 1.0F;\n      virtualinvoke $stack25.<java.io.PrintStream: \n        void println(float)>($stack24);\n\n      return;\n  }\n}\n/*\n  The JimpleLocal $stack12, $stack14, $stack16, $stack18 are of IntType. \n  Similarly, $stack20 is of LongType, $stack22 is of DoubleType and so on.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n  public void display(){\n    boolean varBoolean = true;\n    byte varByte = 127;\n    char varChar = 'a';\n    short varShort = 1123;\n    int varInt = 123456;\n    long varLong = 10L;\n    double varDouble = 10.10;\n    float varFloat = 10.10f;\n\n    System.out.println(!varBoolean);\n    System.out.println(varByte-1);\n    System.out.println(varChar+1);\n    System.out.println(varShort+1);\n    System.out.println(varInt+1);\n    System.out.println(varLong+1);\n    System.out.println(varDouble+1);\n    System.out.println(varFloat+1);\n\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic display()V\n  L0\n    LINENUMBER 5 L0\n    ICONST_1\n    ISTORE 1\n  L1\n    LINENUMBER 6 L1\n    BIPUSH 127\n    ISTORE 2\n  L2\n    LINENUMBER 7 L2\n    BIPUSH 97\n    ISTORE 3\n  L3\n    LINENUMBER 8 L3\n    SIPUSH 1123\n    ISTORE 4\n  L4\n    LINENUMBER 9 L4\n    LDC 123456\n    ISTORE 5\n  L5\n    LINENUMBER 10 L5\n    LDC 10\n    LSTORE 6\n  L6\n    LINENUMBER 11 L6\n    LDC 10.1\n    DSTORE 8\n  L7\n    LINENUMBER 12 L7\n    LDC 10.1\n    FSTORE 10\n  L8\n    LINENUMBER 14 L8\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    IFNE L9\n    ICONST_1\n    GOTO L10\n  L9\n    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] \n      [java/io/PrintStream]\n    ICONST_0\n  L10\n    FRAME FULL [target/exercise1/DemoClass I I I I I J D F] \n      [java/io/PrintStream I]\n    INVOKEVIRTUAL java/io/PrintStream.println (Z)V\n  L11\n    LINENUMBER 15 L11\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 2\n    ICONST_1\n    ISUB\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L12\n    LINENUMBER 16 L12\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 3\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L13\n    LINENUMBER 17 L13\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 4\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L14\n    LINENUMBER 18 L14\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 5\n    ICONST_1\n    IADD\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L15\n    LINENUMBER 19 L15\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    LLOAD 6\n    LCONST_1\n    LADD\n    INVOKEVIRTUAL java/io/PrintStream.println (J)V\n  L16\n    LINENUMBER 20 L16\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    DLOAD 8\n    DCONST_1\n    DADD\n    INVOKEVIRTUAL java/io/PrintStream.println (D)V\n  L17\n    LINENUMBER 21 L17\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    FLOAD 10\n    FCONST_1\n    FADD\n    INVOKEVIRTUAL java/io/PrintStream.println (F)V\n  L18\n    LINENUMBER 23 L18\n    RETURN\n  L19\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L19 0\n    LOCALVARIABLE varBoolean Z L1 L19 1\n    LOCALVARIABLE varByte B L2 L19 2\n    LOCALVARIABLE varChar C L3 L19 3\n    LOCALVARIABLE varShort S L4 L19 4\n    LOCALVARIABLE varInt I L5 L19 5\n    LOCALVARIABLE varLong J L6 L19 6\n    LOCALVARIABLE varDouble D L7 L19 8\n    LOCALVARIABLE varFloat F L8 L19 10\n    MAXSTACK = 5\n    MAXLOCALS = 11\n}\n
      "},{"location":"jimple/#referencetype","title":"ReferenceType","text":"

      ClassType, ArrayType NullType

      JimpleJavaByte Code
      public class target.exercise1.DemoClass extends java.lang.Object\n{\npublic void <init>()\n  {\n  target.exercise1.DemoClass this;\n  this := @this: target.exercise1.DemoClass;\n  specialinvoke this.<java.lang.Object: void <init>()>();\n  return;\n  }\n\n  public target.exercise1.DemoClass getObject(target.exercise1.DemoClass)\n  {\n  target.exercise1.DemoClass obj, this;\n  this := @this: target.exercise1.DemoClass;\n  obj := @parameter0: target.exercise1.DemoClass;\n  return obj;\n  }\n\n  public void compute(boolean)\n  {\n  int[] b;\n  java.io.PrintStream $stack5, $stack6;\n  boolean check;\n  target.exercise1.DemoClass this;\n  int i;\n  null_type r0;\n  java.lang.NullPointerException soot0;\n  this := @this: target.exercise1.DemoClass;\n  check := @parameter0: boolean;\n  b = newarray (int)[5];\n  i = 0;\n\n  label1:\n    if i >= 5 goto label3;\n      if check == 0 goto label2;\n      r0 = (null_type) i;\n      soot0 = new java.lang.NullPointerException;\n      specialinvoke soot0.<java.lang.NullPointerException: \n        void <init>(java.lang.String)>\n          (\"This statement would have triggered an Exception: a[i#1] = r0\");\n      throw soot0;\n\n  label2:\n  b[i] = i;\n      i = i + 1;\n      goto label1;\n\n  label3:\n      $stack5 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack5.<java.io.PrintStream: \n        void println(java.lang.Object)>(b);\n      $stack6 = <java.lang.System: java.io.PrintStream out>;\n      virtualinvoke $stack6.<java.io.PrintStream: \n        void println(java.lang.Object)>(null);\n      return;\n  }\n}\n/*\n  The JimpleLocal b is of ArrayType,\n    and JimpleLocal r0 is of NullType.\n*/\n
      package target.exercise1;\n\npublic class DemoClass {\n\n  public DemoClass getObject(DemoClass obj){\n    return obj;\n  }\n\n  public void compute(boolean check){\n    int a[] = null;\n    int b[] = new int[5];\n    for (int i = 0; i < 5; i++) {\n      if(check){\n        a[i] = i;\n      }\n        b[i] = i;\n    }\n    System.out.println(b);\n    System.out.println(a);\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic getObject(Ltarget/exercise1/DemoClass;)Ltarget/exercise1/DemoClass;\n  L0\n    LINENUMBER 6 L0\n    ALOAD 1\n    ARETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    LOCALVARIABLE obj Ltarget/exercise1/DemoClass; L0 L1 1\n    MAXSTACK = 1\n    MAXLOCALS = 2\n\n// access flags 0x1\npublic compute(Z)V\n  L0\n    LINENUMBER 10 L0\n    ACONST_NULL\n    ASTORE 2\n  L1\n    LINENUMBER 11 L1\n    ICONST_5\n    NEWARRAY T_INT\n    ASTORE 3\n  L2\n    LINENUMBER 12 L2\n    ICONST_0\n    ISTORE 4\n  L3\n    FRAME APPEND [[I [I I]\n    ILOAD 4\n    ICONST_5\n    IF_ICMPGE L4\n  L5\n    LINENUMBER 13 L5\n    ILOAD 1\n    IFEQ L6\n  L7\n    LINENUMBER 14 L7\n    ALOAD 2\n    ILOAD 4\n    ILOAD 4\n    IASTORE\n  L6\n    LINENUMBER 16 L6\n    FRAME SAME\n    ALOAD 3\n    ILOAD 4\n    ILOAD 4\n    IASTORE\n  L8\n    LINENUMBER 12 L8\n    IINC 4 1\n    GOTO L3\n  L4\n    LINENUMBER 18 L4\n    FRAME CHOP 1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ALOAD 3\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V\n  L9\n    LINENUMBER 19 L9\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ALOAD 2\n    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V\n  L10\n    LINENUMBER 20 L10\n    RETURN\n  L11\n    LOCALVARIABLE i I L3 L4 4\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L11 0\n    LOCALVARIABLE check Z L0 L11 1\n    LOCALVARIABLE a [I L1 L11 2\n    LOCALVARIABLE b [I L2 L11 3\n    MAXSTACK = 3\n    MAXLOCALS = 5\n}\n
      "},{"location":"jimple/#local","title":"Local","text":"

      jimple i0 A Local is a variable and its scope is inside its method i.e. no referencing from outside a method. Values can be assigned to Locals via JIdentityStmt or JAssignStmt.

      JimpleJavaByte Code

      ```jimple public class target.exercise1.DemoClass extends java.lang.Object { public void () { target.exercise1.DemoClass this; this := @this: target.exercise1.DemoClass; specialinvoke this.()>(); return; }

      public void compute() { java.io.PrintStream $stack2, $stack3; target.exercise1.DemoClass this; int local#2;

      this := @this: target.exercise1.DemoClass;\n$stack2 = <java.lang.System: java.io.PrintStream out>;\nvirtualinvoke $stack2.<java.io.PrintStream: void println(int)>(1);\n\nlocal#2 = this.<target.exercise1.DemoClass: int global>;\n$stack3 = <java.lang.System: java.io.PrintStream out>;\nvirtualinvoke $stack3.<java.io.PrintStream: void println(int)>(local#2);\nreturn;\n

      } } /* $stack2, this, $stack3, local#2 are all JimpleLocal.

      \"this := @this: target.exercise1.DemoClass\" is JIdentityStmt

      \"$stack2 = \", \"local#2 = this.\", \"$stack3 = \" are JAssignStmt

      */ ```

      package target.exercise1;\n\npublic class DemoClass {\n\n  private int global;\n\n  public void compute(){\n    int local;\n    local = 1;\n    System.out.println(local);\n    local = this.global;\n    System.out.println(local);\n  }\n}\n
      // class version 52.0 (52)\n// access flags 0x21\npublic class target/exercise1/DemoClass {\n\n// compiled from: DemoClass.java\n\n// access flags 0x2\nprivate I global\n\n// access flags 0x1\npublic <init>()V\n  L0\n    LINENUMBER 3 L0\n    ALOAD 0\n    INVOKESPECIAL java/lang/Object.<init> ()V\n    RETURN\n  L1\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L1 0\n    MAXSTACK = 1\n    MAXLOCALS = 1\n\n// access flags 0x1\npublic compute()V\n  L0\n    LINENUMBER 9 L0\n    ICONST_1\n    ISTORE 1\n  L1\n    LINENUMBER 10 L1\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L2\n    LINENUMBER 11 L2\n    ALOAD 0\n    GETFIELD target/exercise1/DemoClass.global : I\n    ISTORE 1\n  L3\n    LINENUMBER 12 L3\n    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;\n    ILOAD 1\n    INVOKEVIRTUAL java/io/PrintStream.println (I)V\n  L4\n    LINENUMBER 14 L4\n    RETURN\n  L5\n    LOCALVARIABLE this Ltarget/exercise1/DemoClass; L0 L5 0\n    LOCALVARIABLE local I L1 L5 1\n    MAXSTACK = 2\n    MAXLOCALS = 2\n}\n
      "},{"location":"jimple/#constant","title":"Constant","text":"

      represents a value itself. don't confuse it with a variable/Local which has a immutable (i.e. final) attribute.

      There exists a constant entity for every Type - that way all value types can have a representation.

      "},{"location":"jimple/#expr","title":"Expr","text":"

      An expression is a language construct that returns a value. E.g. a binary operation such as addition.

      "},{"location":"jimple/#ref","title":"Ref","text":""},{"location":"jimple/#jarrayref","title":"JArrayRef","text":"

      jimple $arr[1] referencing a position inside an array.

      "},{"location":"jimple/#jfieldref-jstaticfieldref-jinstancefieldref","title":"JFieldRef (JStaticFieldRef & JInstanceFieldRef)","text":"

      jimple <SomePackage.ExampleClass: fieldname> // or r1.<SomePackage.ExampleClass: fieldname> referencing a Field via its FieldSignature and if necessary (i.e. with JInstanceFieldRef) the corresponding Local instance that points to the object instance.

      "},{"location":"jimple/#identityref","title":"IdentityRef","text":"

      The IdentityRef makes those implicit special value assignments explicit.

      "},{"location":"jimple/#jthisref","title":"JThisRef","text":"

      jimple @this: package.fruit.Banana represents the this pointer of the current class.

      "},{"location":"jimple/#jcaughtexceptionref","title":"JCaughtExceptionRef","text":"

      jimple @caughtexception represents the value of the thrown exception (caught by this exceptionhandler).

      "},{"location":"jimple/#jparameterref","title":"JParameterRef","text":"

      jimple i0 := @parameter0 i1 := @parameter1 represents a parameter of a method, identified by its index.

      "},{"location":"migrating/","title":"Migration Help","text":""},{"location":"migrating/#version-130","title":"Version 1.3.0","text":"
      • The Typehierarchy API is now returning Stream<ClassType> instead of Collection<ClassType>. The simplest fix to have the same behaviour as before would be to collect the Stream on your own ( e.g. via .collect(Collectors.toList()) ).
      • Default Bodyinterceptors are added to improve Jimple. To mitigate that adapt the List of BodyInterceptors to your needs.
      "},{"location":"migrating/#version-120","title":"Version 1.2.0","text":"
      • The (Java)Project structure was removed. You can configure the (Java)View directly.
      • Bodyinterceptors are now passed as arguments into AnalysisInputLocations.
      "},{"location":"migrating/#from-soot","title":"From Soot","text":"
      • The Scene singleton is dead. Long live the Scene. We have a central View object(!) now.
      • Library first! No command line tool as primary goal. So you can configure parts of SootUp (near) where it is actually used.
      • t.b.c.

      Below we show a comparison of the code so far with the same functionality in sootup.

      SootUpSoot
      AnalysisInputLocation<JavaSootClass> inputLocation =\nnew JavaClassPathAnalysisInputLocation(\"path2Binary\");\n\nJavaView view = new JavaView(inputLocation);\n\nJavaClassType classType = \n        view.getIdentifierFactory().getClassType(\"HelloWorld\");\n\nMethodSignature methodSignature =\n    view\n        .getIdentifierFactory()\n        .getMethodSignature(\n            \"main\", classType, \"void\",\n            Collections.singletonList(\"java.lang.String[]\"));\n\nJavaSootClass sootClass = view.getClass(classType).get();\n\nJavaSootMethod sootMethod =  sootClass.getMethod(methodSignature.getSubSignature()).get();\n\nsootMethod.getBody().getStmts();\n
      G.reset();\nString userdir = System.getProperty(\"user.dir\");\nString sootCp = \n        userdir \n        + File.separator \n        + \"target\" \n        + File.separator \n        + \"test-classes\"\n        + File.pathSeparator + \"lib\"+File.separator+\"rt.jar\";\n\nOptions.v().set_soot_classpath(sootCp);\nOptions.v().set_whole_program(true);\nOptions.v().setPhaseOption(\"cg.cha\", \"on\");\nOptions.v().setPhaseOption(\"cg\", \"all-reachable:true\");\nOptions.v().set_no_bodies_for_excluded(true);\nOptions.v().set_allow_phantom_refs(true);\nOptions.v().setPhaseOption(\"jb\", \"use-original-names:true\");\nOptions.v().set_prepend_classpath(false);\n\nScene.v().addBasicClass(\"java.lang.StringBuilder\");\nSootClass c = \n    Scene.v().forceResolve(targetTestClassName, SootClass.BODIES);\nif (c != null) {\n    c.setApplicationClass();\n}\nScene.v().loadNecessaryClasses();\n\nSootMethod method;\nfor (SootClass c : Scene.v().getApplicationClasses()) {\n    if(c.getName().equals(\"example.HelloWorld\")){\n        for (SootMethod m : c.getMethods()) {\n            if (!m.hasActiveBody()) {\n                continue;\n            }\n            if (m.getName().equals(\"entryPoint\")) {\n                method = m;\n                break;\n            }\n        }\n    }\n}\n\nmethod.getActiveBody().getUnits();\n
      "},{"location":"qilin/","title":"Incorporate Qilin Pointer Analysis","text":"

      see QilinPTA.

      "},{"location":"qilin/#dependencies","title":"Dependencies","text":"MavenGradle
          <dependency>\n        <groupId>org.soot-oss</groupId>\n        <artifactId>sootup.java.sourcecode</artifactId>\n        <version></version>\n    </dependency>\n
          compile \"org.soot-oss:sootup.qilin:1.3.0\"\n
      "},{"location":"qilin/#how-to","title":"How to","text":"

      // TODO

      "},{"location":"tool_ux/","title":"From Prototype to user friendly tool","text":"

      How was the parameter order again? For a lot of cli tools we see an arbitrary order of cli parameters, different options for giving a working directory etc.. So in the wild you can see a lot from run.sh/run.bat to make files just to reorder arguments and calling a tool.

      In SootUp we thought we could help on improving this madness while saving your time.

      The command line parser mimics the options the java executable accepts - at least for what is supported by SootUp.

      Dependencies:

      MavenGradle
      <dependency>\n    <groupId>commons-cli</groupId>\n    <artifactId>commons-cli</artifactId>\n    <version>1.8.0</version>\n</dependency>\n
          implementation(\"commons-cli:commons-cli:1.8.0\")\n
      "},{"location":"tool_ux/#java-code","title":"Java Code","text":"
      class SootUpConfiguration{\n    // TODO incorporate\n}\n

      We are happy if you steal the following code to create a tool where the setup is just simple.

      "},{"location":"tools/","title":"Who uses SootUp","text":"
      • JimpleLsp
      • API_ASSIST
      • Maybe there is more to find via Github Network Dependents - have a look at the individual modules.
      • Your tool is not on this list? Create a PR :-)
      "},{"location":"whatsnew/","title":"What's new in SootUp?","text":""},{"location":"whatsnew/#library-by-default","title":"Library by default","text":"

      While Soot is a library and a stand-alone command-line application. SootUp, on the other hand, is designed to be a core library. It assumes that it is embedded in a client application that owns the thread of control. It can be extended with a command-line interface, included in other software projects as a library, or integrated into IDEs with JimpleLSP.

      "},{"location":"whatsnew/#modular-architecture","title":"Modular Architecture","text":"

      SootUp has a modular architecture, which enables its clients to include only the necessary functionality to their applications.

      • core module contains the core building blocks such as the jimple IR, control flow graphs, and frontend interfaces. The rest of the modules build on the core module.
      • java.core module contains parts that are essential for analyzing Java code.
      • java.bytecode module contains the functionality that is necessary for taking as input java bytecode.
      • java.sourcecode module contains the functionality that is necessary for taking as input java source code. Beware: The sourcecodefrontend is currently unable to handle inputs with exceptions (try/catch/finally)!
      • callgraph module contains implementations of common call graph construction algorithms such as CHA, RTA. A reimplementation of Spark pointer analysis framework is in progress.
      • jimple.parser module contains the functionalty that is necessary for taking as input .jimple files.
      • analysis module enables performing interprocedural dataflow analyses.
      "},{"location":"whatsnew/#no-more-singletons","title":"No More Singletons","text":"

      Singletons offer a single view of a single program version, which makes it impossible to analyze multiple programs or multiple versions of the same program. SootUp does not make use of singletons such the Scene class in the old Soot any more. It enables analyzing multiple programs simultaneously.

      "},{"location":"whatsnew/#new-source-code-frontend","title":"New Source Code Frontend","text":"

      Soot's JastAdd-based java frontend is not maintained anymore. In SootUp, we use WALA's well-maintained source code frontend, which will not only allow Soot to analyze Java source code, but also JavaScript and Python.

      "},{"location":"whatsnew/#immutable-by-design","title":"Immutable by Design","text":"

      SootUp has been designed with the goal of immutability in mind. This makes sharing objects between several entities easier, because there is no need to worry about unintended changes to other entities.

      "},{"location":"whatsnew/#withers-instead-of-setters","title":"Withers instead of Setters","text":"

      Due to the goal of immutability, many classes do not have setters anymore. For example, a Body does not have a method setStmts(List<Stmt> stmts). Instead, a method called withStmts(List<Stmt> stmts) has been added. This does not modify the original instance, but returns a copy of the Body but with the provided stmts in its instance. This concept of so-called with-ers can be found all throughout SootUp.

      A simplified example

      class Body {\n  final List<Stmt> stmts;\n  final List<Local> locals;\n\n  Body(List<Stmt> stmts, List<Local> locals) {\n    this.stmts = stmts;\n    this.locals = locals;\n  }  \n\n  Body withStmts(List<Stmt> stmts) { return new Body(stmts, this.locals); }\n  Body withLocals(List<Local> locals) { return new Body(this.stmts, locals); }\n}\n
      "},{"location":"whatsnew/#intermediate-representation","title":"Intermediate Representation","text":"

      Jimple is the only intermediate representation (IR) in SootUp. We modified it slightly to be able to accommodate different programming languages in the future.

      "},{"location":"write_analyses/","title":"Write your own Interprocedural Dataflow Analysis","text":""},{"location":"write_analyses/#dependencies","title":"Dependencies","text":"MavenGradle
      <dependency>\n    <groupId>org.soot-oss</groupId>\n    <artifactId>sootup.analysis</artifactId>\n    <version></version>\n</dependency>\n
          compile \"org.soot-oss:sootup.analysis:1.3.0\"\n
      "},{"location":"write_analyses/#useful-knowledge","title":"Useful Knowledge","text":"

      Background Knowledge as online lectures are available on YouTube.

      • IFDS Framework
      • IDE Framework
      "},{"location":"write_analyses/#examples","title":"Examples","text":"

      Taint Analysis, TypeState Analysis, Linear Constant Propagation, ...

      // TODO incorporate & guide through examples\n

      If you wish to implement an interprocedural data-flow analysis via the IFDS or IDE Framework please have a look at the test cases in the sootup.analysis submodule.

      "}]} \ No newline at end of file diff --git a/doc_how2startATool_preview/sitemap.xml b/doc_how2startATool_preview/sitemap.xml index c85c845f475..f586a560098 100644 --- a/doc_how2startATool_preview/sitemap.xml +++ b/doc_how2startATool_preview/sitemap.xml @@ -1,88 +1,93 @@ - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/advanced-topics/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/advanced-topics/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/analysisinputlocations/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/analysisinputlocations/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/announce/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/announce/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/bodyinterceptors/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/bodyinterceptors/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/call-graph-construction/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/call-graph-construction/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/docguide/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/docguide/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/faq/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/examples/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/getting-started/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/faq/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/installation/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/getting-started/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/jimple/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/installation/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/migration/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/jimple/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/qilin/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/migrating/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/tool_ux/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/qilin/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/tools/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/tool_ux/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/whatsnew/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/tools/ + 2024-06-17 daily - https://soot-oss.github.io/SootUp/doc_how2startATool_preview/write_analyses/ - 2024-06-14 + https://soot-oss.github.io/SootUp/_preview/whatsnew/ + 2024-06-17 + daily + + + https://soot-oss.github.io/SootUp/_preview/write_analyses/ + 2024-06-17 daily \ No newline at end of file diff --git a/doc_how2startATool_preview/sitemap.xml.gz b/doc_how2startATool_preview/sitemap.xml.gz index 9e8388b2e3949c893059eae199c63a59d3f29bbc..5415bd9cc0315bb37005e342bc63773d242f5842 100644 GIT binary patch literal 378 zcmV-=0fqh_iwFpSd~ap~|8r?{Wo=<_E_iKh0M(bxZo?o9$M1cLD0f0yP5V-s-u41p z&lLrlcp{i$r)l4Qq^+jjCryG2VA$iF6A^$6#?5p1*$N1l60RoB=1I9S8rvzDAJe{+*a4oIMnT& zg;E+qWPwCg2i%YQ3Q&F~(>BOmi1q|_l8u}L9^)19fTms5t0z%Ei{(plx!WGxbgz78 z578c5qrhDn`Cz$$$zQTRGAeUYURxs=18B;F*(-M;An;-26stJNAQyCxV><6FVE1S) z;MqoP17pnNgtc-`bWw#~=%fmcqn_oF1-n7rjbQRnhdrwyIGcwm4(gZ%XJ?tyBPNJd zWNWfuhE!##=u|dk_6@Uevp^jnU1hT(vY0Aez?wg3PC literal 382 zcmV-^0fGJ>iwFn+h-+p7|8r?{Wo=<_E_iKh0M%E`Zo)7OzVj5Q_cjcnX`4!?UG@Tl zGYUy)J*9DoT?%hM7tq85Op}sJ636=VIsTlV`u*Jd`N<^$4C~^lS`>2^3|a{7y4Y?$ z%a`K4nbkw`?=U^C8lju7R|21aY?Kbe{2x_E+%&ZH>z4q5RZtOxJTP87t2+- zcrKq-;&Qh=xS39e)*X^NHdceb)at=a*ZNre<2_UabQ8y zEaJ&Gn1F-iBvbl(v=<2Ml5vqS<(dVfy)WCOV^`DY@+WG302M-^ctZ^U064O;t^fc4 diff --git a/doc_how2startATool_preview/tool_ux/index.html b/doc_how2startATool_preview/tool_ux/index.html index 853f7c0a209..366a3cf7849 100644 --- a/doc_how2startATool_preview/tool_ux/index.html +++ b/doc_how2startATool_preview/tool_ux/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -74,7 +76,7 @@
      - + Skip to content @@ -88,48 +90,89 @@
      - + + + + - + + +
      - -
      @@ -840,13 +964,16 @@ -

      Prototype to user friendly tool

      +

      From Prototype to user friendly tool

      How was the parameter order again? For a lot of cli tools we see an arbitrary order of cli parameters, different options for giving a working directory etc.. So in the wild you can see a lot from run.sh/run.bat to make files just to reorder arguments and calling a tool.

      In SootUp we thought we could help on improving this madness while saving your time.

      The command line parser mimics the options the java executable accepts - at least for what is supported by SootUp.

      -

      Dependencies: +

      Dependencies:

      +
      +
      +
      1
       2
       3
      @@ -856,9 +983,15 @@ 

      Prototype to user friendly tool

      <artifactId>commons-cli</artifactId> <version>1.8.0</version> </dependency> -

      -
      1
          implementation("commons-cli:commons-cli:1.8.0")
       
      +
      +
      +
      1
          implementation("commons-cli:commons-cli:1.8.0")
      +
      +
      +
      +
      +

      Java Code

      1
       2
       3
      class SootUpConfiguration{
      @@ -888,11 +1021,47 @@ 

      Prototype to user friendly tool

      -
      - -
      diff --git a/doc_how2startATool_preview/tools/index.html b/doc_how2startATool_preview/tools/index.html index 38e732d58dc..537f34009ec 100644 --- a/doc_how2startATool_preview/tools/index.html +++ b/doc_how2startATool_preview/tools/index.html @@ -8,13 +8,13 @@ - + - + @@ -44,6 +44,8 @@ + + @@ -61,7 +63,7 @@ - + @@ -84,48 +86,89 @@ - + + + + + + + +
      - -
      diff --git a/doc_how2startATool_preview/whatsnew/index.html b/doc_how2startATool_preview/whatsnew/index.html index 9908664fd4c..4ac67754a71 100644 --- a/doc_how2startATool_preview/whatsnew/index.html +++ b/doc_how2startATool_preview/whatsnew/index.html @@ -8,17 +8,17 @@ - + - + - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -88,48 +90,89 @@ - + + + + + + + +
      - -
      diff --git a/doc_how2startATool_preview/write_analyses/index.html b/doc_how2startATool_preview/write_analyses/index.html index a22ce9c5205..1a9d8ed8244 100644 --- a/doc_how2startATool_preview/write_analyses/index.html +++ b/doc_how2startATool_preview/write_analyses/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -48,6 +48,8 @@ + + @@ -65,7 +67,7 @@ - + @@ -74,7 +76,7 @@
      - + Skip to content @@ -88,48 +90,89 @@
      - + + + + + - + +
      - -
      @@ -840,8 +1000,37 @@ -

      Writing Analyses

      -
      1
      // TODO improve tutorial!
      +

      Write your own Interprocedural Dataflow Analysis

      +

      Dependencies

      +
      +
      +
      +
      1
      +2
      +3
      +4
      +5
      <dependency>
      +    <groupId>org.soot-oss</groupId>
      +    <artifactId>sootup.analysis</artifactId>
      +    <version></version>
      +</dependency>
      +
      +
      +
      +
      1
          compile "org.soot-oss:sootup.analysis:1.3.0"
      +
      +
      +
      +
      +

      Useful Knowledge

      +

      Background Knowledge as online lectures are available on YouTube.

      + +

      Examples

      +

      Taint Analysis, TypeState Analysis, Linear Constant Propagation, ...

      +
      1
      // TODO incorporate & guide through examples
       

      If you wish to implement an interprocedural data-flow analysis via the IFDS or IDE Framework please have a look at the test cases in the sootup.analysis submodule.

      @@ -866,11 +1055,47 @@

      Writing Analyses

      -
      - -
      diff --git a/latest b/latest index 72387bf667e..8b3a0227b4e 120000 --- a/latest +++ b/latest @@ -1 +1 @@ -v1_3_0 \ No newline at end of file +v1.3.0 \ No newline at end of file diff --git a/v1_2_0/404.html b/v1.2.0/404.html similarity index 100% rename from v1_2_0/404.html rename to v1.2.0/404.html diff --git a/_preview/img/SootUpLogo.svg b/v1.2.0/SootUpLogo.svg similarity index 100% rename from _preview/img/SootUpLogo.svg rename to v1.2.0/SootUpLogo.svg diff --git a/v1_2_0/advanced-topics/index.html b/v1.2.0/advanced-topics/index.html similarity index 100% rename from v1_2_0/advanced-topics/index.html rename to v1.2.0/advanced-topics/index.html diff --git a/v1_2_0/announce/index.html b/v1.2.0/announce/index.html similarity index 100% rename from v1_2_0/announce/index.html rename to v1.2.0/announce/index.html diff --git a/_preview/assets/images/favicon.png b/v1.2.0/assets/images/favicon.png similarity index 100% rename from _preview/assets/images/favicon.png rename to v1.2.0/assets/images/favicon.png diff --git a/v1_2_0/assets/javascripts/bundle.8fd75fb4.min.js b/v1.2.0/assets/javascripts/bundle.8fd75fb4.min.js similarity index 100% rename from v1_2_0/assets/javascripts/bundle.8fd75fb4.min.js rename to v1.2.0/assets/javascripts/bundle.8fd75fb4.min.js diff --git a/v1_2_0/assets/javascripts/bundle.8fd75fb4.min.js.map b/v1.2.0/assets/javascripts/bundle.8fd75fb4.min.js.map similarity index 100% rename from v1_2_0/assets/javascripts/bundle.8fd75fb4.min.js.map rename to v1.2.0/assets/javascripts/bundle.8fd75fb4.min.js.map diff --git a/_preview/assets/javascripts/lunr/min/lunr.ar.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.ar.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.ar.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.ar.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.da.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.da.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.da.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.da.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.de.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.de.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.de.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.de.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.du.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.du.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.du.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.du.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.el.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.el.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.el.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.el.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.es.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.es.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.es.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.es.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.fi.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.fi.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.fi.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.fi.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.fr.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.fr.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.fr.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.fr.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.he.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.he.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.he.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.he.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.hi.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.hi.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.hi.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.hi.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.hu.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.hu.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.hu.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.hu.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.hy.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.hy.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.hy.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.hy.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.it.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.it.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.it.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.it.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.ja.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.ja.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.ja.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.ja.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.jp.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.jp.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.jp.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.jp.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.kn.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.kn.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.kn.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.kn.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.ko.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.ko.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.ko.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.ko.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.multi.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.multi.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.multi.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.multi.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.nl.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.nl.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.nl.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.nl.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.no.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.no.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.no.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.no.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.pt.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.pt.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.pt.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.pt.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.ro.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.ro.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.ro.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.ro.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.ru.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.ru.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.ru.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.ru.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.sa.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.sa.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.sa.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.sa.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.stemmer.support.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.stemmer.support.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.sv.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.sv.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.sv.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.sv.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.ta.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.ta.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.ta.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.ta.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.te.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.te.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.te.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.te.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.th.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.th.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.th.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.th.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.tr.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.tr.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.tr.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.tr.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.vi.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.vi.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.vi.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.vi.min.js diff --git a/_preview/assets/javascripts/lunr/min/lunr.zh.min.js b/v1.2.0/assets/javascripts/lunr/min/lunr.zh.min.js similarity index 100% rename from _preview/assets/javascripts/lunr/min/lunr.zh.min.js rename to v1.2.0/assets/javascripts/lunr/min/lunr.zh.min.js diff --git a/_preview/assets/javascripts/lunr/tinyseg.js b/v1.2.0/assets/javascripts/lunr/tinyseg.js similarity index 100% rename from _preview/assets/javascripts/lunr/tinyseg.js rename to v1.2.0/assets/javascripts/lunr/tinyseg.js diff --git a/_preview/assets/javascripts/lunr/wordcut.js b/v1.2.0/assets/javascripts/lunr/wordcut.js similarity index 100% rename from _preview/assets/javascripts/lunr/wordcut.js rename to v1.2.0/assets/javascripts/lunr/wordcut.js diff --git a/_preview/assets/javascripts/workers/search.b8dbb3d2.min.js b/v1.2.0/assets/javascripts/workers/search.b8dbb3d2.min.js similarity index 100% rename from _preview/assets/javascripts/workers/search.b8dbb3d2.min.js rename to v1.2.0/assets/javascripts/workers/search.b8dbb3d2.min.js diff --git a/_preview/assets/javascripts/workers/search.b8dbb3d2.min.js.map b/v1.2.0/assets/javascripts/workers/search.b8dbb3d2.min.js.map similarity index 100% rename from _preview/assets/javascripts/workers/search.b8dbb3d2.min.js.map rename to v1.2.0/assets/javascripts/workers/search.b8dbb3d2.min.js.map diff --git a/v1_2_0/assets/stylesheets/main.f2e4d321.min.css b/v1.2.0/assets/stylesheets/main.f2e4d321.min.css similarity index 100% rename from v1_2_0/assets/stylesheets/main.f2e4d321.min.css rename to v1.2.0/assets/stylesheets/main.f2e4d321.min.css diff --git a/v1_2_0/assets/stylesheets/main.f2e4d321.min.css.map b/v1.2.0/assets/stylesheets/main.f2e4d321.min.css.map similarity index 100% rename from v1_2_0/assets/stylesheets/main.f2e4d321.min.css.map rename to v1.2.0/assets/stylesheets/main.f2e4d321.min.css.map diff --git a/_preview/assets/stylesheets/palette.06af60db.min.css b/v1.2.0/assets/stylesheets/palette.06af60db.min.css similarity index 100% rename from _preview/assets/stylesheets/palette.06af60db.min.css rename to v1.2.0/assets/stylesheets/palette.06af60db.min.css diff --git a/_preview/assets/stylesheets/palette.06af60db.min.css.map b/v1.2.0/assets/stylesheets/palette.06af60db.min.css.map similarity index 100% rename from _preview/assets/stylesheets/palette.06af60db.min.css.map rename to v1.2.0/assets/stylesheets/palette.06af60db.min.css.map diff --git a/v1_2_0/bodyinterceptors/index.html b/v1.2.0/bodyinterceptors/index.html similarity index 100% rename from v1_2_0/bodyinterceptors/index.html rename to v1.2.0/bodyinterceptors/index.html diff --git a/v1_2_0/call-graph-construction/index.html b/v1.2.0/call-graph-construction/index.html similarity index 100% rename from v1_2_0/call-graph-construction/index.html rename to v1.2.0/call-graph-construction/index.html diff --git a/_preview/css/hint.min.css b/v1.2.0/css/hint.min.css similarity index 100% rename from _preview/css/hint.min.css rename to v1.2.0/css/hint.min.css diff --git a/v1_2_0/docguide/index.html b/v1.2.0/docguide/index.html similarity index 100% rename from v1_2_0/docguide/index.html rename to v1.2.0/docguide/index.html diff --git a/v1_2_0/faq/index.html b/v1.2.0/faq/index.html similarity index 100% rename from v1_2_0/faq/index.html rename to v1.2.0/faq/index.html diff --git a/_preview/assets/figures/CopyPropagator Example_1.png b/v1.2.0/figures/CopyPropagator Example_1.png similarity index 100% rename from _preview/assets/figures/CopyPropagator Example_1.png rename to v1.2.0/figures/CopyPropagator Example_1.png diff --git a/_preview/assets/figures/CopyPropagator Example_2.png b/v1.2.0/figures/CopyPropagator Example_2.png similarity index 100% rename from _preview/assets/figures/CopyPropagator Example_2.png rename to v1.2.0/figures/CopyPropagator Example_2.png diff --git a/_preview/assets/figures/DominanceFinder Example.png b/v1.2.0/figures/DominanceFinder Example.png similarity index 100% rename from _preview/assets/figures/DominanceFinder Example.png rename to v1.2.0/figures/DominanceFinder Example.png diff --git a/_preview/assets/figures/EmptySwitchEliminator Example.png b/v1.2.0/figures/EmptySwitchEliminator Example.png similarity index 100% rename from _preview/assets/figures/EmptySwitchEliminator Example.png rename to v1.2.0/figures/EmptySwitchEliminator Example.png diff --git a/_preview/assets/figures/LocalLiveness Example.png b/v1.2.0/figures/LocalLiveness Example.png similarity index 100% rename from _preview/assets/figures/LocalLiveness Example.png rename to v1.2.0/figures/LocalLiveness Example.png diff --git a/_preview/assets/figures/LocalPacker Example.png b/v1.2.0/figures/LocalPacker Example.png similarity index 100% rename from _preview/assets/figures/LocalPacker Example.png rename to v1.2.0/figures/LocalPacker Example.png diff --git a/_preview/assets/figures/LocalSplitter Example_1.png b/v1.2.0/figures/LocalSplitter Example_1.png similarity index 100% rename from _preview/assets/figures/LocalSplitter Example_1.png rename to v1.2.0/figures/LocalSplitter Example_1.png diff --git a/_preview/assets/figures/LocalSplitter Example_2.png b/v1.2.0/figures/LocalSplitter Example_2.png similarity index 100% rename from _preview/assets/figures/LocalSplitter Example_2.png rename to v1.2.0/figures/LocalSplitter Example_2.png diff --git a/_preview/assets/figures/SSA Example_1.png b/v1.2.0/figures/SSA Example_1.png similarity index 100% rename from _preview/assets/figures/SSA Example_1.png rename to v1.2.0/figures/SSA Example_1.png diff --git a/_preview/assets/figures/SSA Example_2.png b/v1.2.0/figures/SSA Example_2.png similarity index 100% rename from _preview/assets/figures/SSA Example_2.png rename to v1.2.0/figures/SSA Example_2.png diff --git a/_preview/assets/figures/TrapTightener Example.png b/v1.2.0/figures/TrapTightener Example.png similarity index 100% rename from _preview/assets/figures/TrapTightener Example.png rename to v1.2.0/figures/TrapTightener Example.png diff --git a/_preview/assets/figures/UnreachableCodeEliminator Example.png b/v1.2.0/figures/UnreachableCodeEliminator Example.png similarity index 100% rename from _preview/assets/figures/UnreachableCodeEliminator Example.png rename to v1.2.0/figures/UnreachableCodeEliminator Example.png diff --git a/v1_2_0/getting-started/index.html b/v1.2.0/getting-started/index.html similarity index 100% rename from v1_2_0/getting-started/index.html rename to v1.2.0/getting-started/index.html diff --git a/_preview/img/icon.svg b/v1.2.0/icon.svg similarity index 100% rename from _preview/img/icon.svg rename to v1.2.0/icon.svg diff --git a/_preview/img/favicon.ico b/v1.2.0/img/favicon.ico similarity index 100% rename from _preview/img/favicon.ico rename to v1.2.0/img/favicon.ico diff --git a/v1_2_0/index.html b/v1.2.0/index.html similarity index 100% rename from v1_2_0/index.html rename to v1.2.0/index.html diff --git a/v1_2_0/installation/index.html b/v1.2.0/installation/index.html similarity index 100% rename from v1_2_0/installation/index.html rename to v1.2.0/installation/index.html diff --git a/v1_2_0/jimple/index.html b/v1.2.0/jimple/index.html similarity index 100% rename from v1_2_0/jimple/index.html rename to v1.2.0/jimple/index.html diff --git a/v1_2_0/search/search_index.json b/v1.2.0/search/search_index.json similarity index 100% rename from v1_2_0/search/search_index.json rename to v1.2.0/search/search_index.json diff --git a/v1_2_0/sitemap.xml b/v1.2.0/sitemap.xml similarity index 100% rename from v1_2_0/sitemap.xml rename to v1.2.0/sitemap.xml diff --git a/v1_2_0/sitemap.xml.gz b/v1.2.0/sitemap.xml.gz similarity index 100% rename from v1_2_0/sitemap.xml.gz rename to v1.2.0/sitemap.xml.gz diff --git a/v1_2_0/tools/index.html b/v1.2.0/tools/index.html similarity index 100% rename from v1_2_0/tools/index.html rename to v1.2.0/tools/index.html diff --git a/v1_2_0/whatsnew/index.html b/v1.2.0/whatsnew/index.html similarity index 100% rename from v1_2_0/whatsnew/index.html rename to v1.2.0/whatsnew/index.html diff --git a/v1_2_0/write_analyses/index.html b/v1.2.0/write_analyses/index.html similarity index 100% rename from v1_2_0/write_analyses/index.html rename to v1.2.0/write_analyses/index.html diff --git a/v1_3_0/404.html b/v1.3.0/404.html similarity index 100% rename from v1_3_0/404.html rename to v1.3.0/404.html diff --git a/_preview/assets/SootUp-paper.pdf b/v1.3.0/SootUp-paper.pdf similarity index 100% rename from _preview/assets/SootUp-paper.pdf rename to v1.3.0/SootUp-paper.pdf diff --git a/v1_2_0/SootUpLogo.svg b/v1.3.0/SootUpLogo.svg similarity index 100% rename from v1_2_0/SootUpLogo.svg rename to v1.3.0/SootUpLogo.svg diff --git a/v1_3_0/advanced-topics/index.html b/v1.3.0/advanced-topics/index.html similarity index 100% rename from v1_3_0/advanced-topics/index.html rename to v1.3.0/advanced-topics/index.html diff --git a/v1_3_0/announce/index.html b/v1.3.0/announce/index.html similarity index 100% rename from v1_3_0/announce/index.html rename to v1.3.0/announce/index.html diff --git a/v1_2_0/assets/images/favicon.png b/v1.3.0/assets/images/favicon.png similarity index 100% rename from v1_2_0/assets/images/favicon.png rename to v1.3.0/assets/images/favicon.png diff --git a/_preview/assets/javascripts/bundle.ad660dcc.min.js b/v1.3.0/assets/javascripts/bundle.ad660dcc.min.js similarity index 100% rename from _preview/assets/javascripts/bundle.ad660dcc.min.js rename to v1.3.0/assets/javascripts/bundle.ad660dcc.min.js diff --git a/_preview/assets/javascripts/bundle.ad660dcc.min.js.map b/v1.3.0/assets/javascripts/bundle.ad660dcc.min.js.map similarity index 100% rename from _preview/assets/javascripts/bundle.ad660dcc.min.js.map rename to v1.3.0/assets/javascripts/bundle.ad660dcc.min.js.map diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.ar.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.ar.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.ar.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.ar.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.da.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.da.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.da.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.da.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.de.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.de.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.de.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.de.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.du.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.du.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.du.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.du.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.el.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.el.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.el.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.el.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.es.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.es.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.es.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.es.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.fi.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.fi.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.fi.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.fi.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.fr.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.fr.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.fr.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.fr.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.he.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.he.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.he.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.he.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.hi.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.hi.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.hi.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.hi.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.hu.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.hu.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.hu.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.hu.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.hy.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.hy.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.hy.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.hy.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.it.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.it.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.it.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.it.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.ja.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.ja.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.ja.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.ja.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.jp.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.jp.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.jp.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.jp.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.kn.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.kn.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.kn.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.kn.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.ko.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.ko.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.ko.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.ko.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.multi.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.multi.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.multi.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.multi.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.nl.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.nl.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.nl.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.nl.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.no.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.no.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.no.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.no.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.pt.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.pt.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.pt.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.pt.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.ro.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.ro.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.ro.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.ro.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.ru.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.ru.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.ru.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.ru.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.sa.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.sa.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.sa.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.sa.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.stemmer.support.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.sv.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.sv.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.sv.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.sv.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.ta.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.ta.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.ta.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.ta.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.te.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.te.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.te.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.te.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.th.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.th.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.th.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.th.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.tr.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.tr.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.tr.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.tr.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.vi.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.vi.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.vi.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.vi.min.js diff --git a/v1_2_0/assets/javascripts/lunr/min/lunr.zh.min.js b/v1.3.0/assets/javascripts/lunr/min/lunr.zh.min.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/min/lunr.zh.min.js rename to v1.3.0/assets/javascripts/lunr/min/lunr.zh.min.js diff --git a/v1_2_0/assets/javascripts/lunr/tinyseg.js b/v1.3.0/assets/javascripts/lunr/tinyseg.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/tinyseg.js rename to v1.3.0/assets/javascripts/lunr/tinyseg.js diff --git a/v1_2_0/assets/javascripts/lunr/wordcut.js b/v1.3.0/assets/javascripts/lunr/wordcut.js similarity index 100% rename from v1_2_0/assets/javascripts/lunr/wordcut.js rename to v1.3.0/assets/javascripts/lunr/wordcut.js diff --git a/v1_2_0/assets/javascripts/workers/search.b8dbb3d2.min.js b/v1.3.0/assets/javascripts/workers/search.b8dbb3d2.min.js similarity index 100% rename from v1_2_0/assets/javascripts/workers/search.b8dbb3d2.min.js rename to v1.3.0/assets/javascripts/workers/search.b8dbb3d2.min.js diff --git a/v1_2_0/assets/javascripts/workers/search.b8dbb3d2.min.js.map b/v1.3.0/assets/javascripts/workers/search.b8dbb3d2.min.js.map similarity index 100% rename from v1_2_0/assets/javascripts/workers/search.b8dbb3d2.min.js.map rename to v1.3.0/assets/javascripts/workers/search.b8dbb3d2.min.js.map diff --git a/_preview/assets/stylesheets/main.6543a935.min.css b/v1.3.0/assets/stylesheets/main.6543a935.min.css similarity index 100% rename from _preview/assets/stylesheets/main.6543a935.min.css rename to v1.3.0/assets/stylesheets/main.6543a935.min.css diff --git a/_preview/assets/stylesheets/main.6543a935.min.css.map b/v1.3.0/assets/stylesheets/main.6543a935.min.css.map similarity index 100% rename from _preview/assets/stylesheets/main.6543a935.min.css.map rename to v1.3.0/assets/stylesheets/main.6543a935.min.css.map diff --git a/v1_2_0/assets/stylesheets/palette.06af60db.min.css b/v1.3.0/assets/stylesheets/palette.06af60db.min.css similarity index 100% rename from v1_2_0/assets/stylesheets/palette.06af60db.min.css rename to v1.3.0/assets/stylesheets/palette.06af60db.min.css diff --git a/v1_2_0/assets/stylesheets/palette.06af60db.min.css.map b/v1.3.0/assets/stylesheets/palette.06af60db.min.css.map similarity index 100% rename from v1_2_0/assets/stylesheets/palette.06af60db.min.css.map rename to v1.3.0/assets/stylesheets/palette.06af60db.min.css.map diff --git a/v1_3_0/bodyinterceptors/index.html b/v1.3.0/bodyinterceptors/index.html similarity index 100% rename from v1_3_0/bodyinterceptors/index.html rename to v1.3.0/bodyinterceptors/index.html diff --git a/v1_3_0/call-graph-construction/index.html b/v1.3.0/call-graph-construction/index.html similarity index 100% rename from v1_3_0/call-graph-construction/index.html rename to v1.3.0/call-graph-construction/index.html diff --git a/v1_2_0/css/hint.min.css b/v1.3.0/css/hint.min.css similarity index 100% rename from v1_2_0/css/hint.min.css rename to v1.3.0/css/hint.min.css diff --git a/v1_3_0/docguide/index.html b/v1.3.0/docguide/index.html similarity index 100% rename from v1_3_0/docguide/index.html rename to v1.3.0/docguide/index.html diff --git a/v1_3_0/faq/index.html b/v1.3.0/faq/index.html similarity index 100% rename from v1_3_0/faq/index.html rename to v1.3.0/faq/index.html diff --git a/v1_2_0/figures/CopyPropagator Example_1.png b/v1.3.0/figures/CopyPropagator Example_1.png similarity index 100% rename from v1_2_0/figures/CopyPropagator Example_1.png rename to v1.3.0/figures/CopyPropagator Example_1.png diff --git a/v1_2_0/figures/CopyPropagator Example_2.png b/v1.3.0/figures/CopyPropagator Example_2.png similarity index 100% rename from v1_2_0/figures/CopyPropagator Example_2.png rename to v1.3.0/figures/CopyPropagator Example_2.png diff --git a/v1_2_0/figures/DominanceFinder Example.png b/v1.3.0/figures/DominanceFinder Example.png similarity index 100% rename from v1_2_0/figures/DominanceFinder Example.png rename to v1.3.0/figures/DominanceFinder Example.png diff --git a/v1_2_0/figures/EmptySwitchEliminator Example.png b/v1.3.0/figures/EmptySwitchEliminator Example.png similarity index 100% rename from v1_2_0/figures/EmptySwitchEliminator Example.png rename to v1.3.0/figures/EmptySwitchEliminator Example.png diff --git a/v1_2_0/figures/LocalLiveness Example.png b/v1.3.0/figures/LocalLiveness Example.png similarity index 100% rename from v1_2_0/figures/LocalLiveness Example.png rename to v1.3.0/figures/LocalLiveness Example.png diff --git a/v1_2_0/figures/LocalPacker Example.png b/v1.3.0/figures/LocalPacker Example.png similarity index 100% rename from v1_2_0/figures/LocalPacker Example.png rename to v1.3.0/figures/LocalPacker Example.png diff --git a/v1_2_0/figures/LocalSplitter Example_1.png b/v1.3.0/figures/LocalSplitter Example_1.png similarity index 100% rename from v1_2_0/figures/LocalSplitter Example_1.png rename to v1.3.0/figures/LocalSplitter Example_1.png diff --git a/v1_2_0/figures/LocalSplitter Example_2.png b/v1.3.0/figures/LocalSplitter Example_2.png similarity index 100% rename from v1_2_0/figures/LocalSplitter Example_2.png rename to v1.3.0/figures/LocalSplitter Example_2.png diff --git a/v1_2_0/figures/SSA Example_1.png b/v1.3.0/figures/SSA Example_1.png similarity index 100% rename from v1_2_0/figures/SSA Example_1.png rename to v1.3.0/figures/SSA Example_1.png diff --git a/v1_2_0/figures/SSA Example_2.png b/v1.3.0/figures/SSA Example_2.png similarity index 100% rename from v1_2_0/figures/SSA Example_2.png rename to v1.3.0/figures/SSA Example_2.png diff --git a/v1_2_0/figures/TrapTightener Example.png b/v1.3.0/figures/TrapTightener Example.png similarity index 100% rename from v1_2_0/figures/TrapTightener Example.png rename to v1.3.0/figures/TrapTightener Example.png diff --git a/v1_2_0/figures/UnreachableCodeEliminator Example.png b/v1.3.0/figures/UnreachableCodeEliminator Example.png similarity index 100% rename from v1_2_0/figures/UnreachableCodeEliminator Example.png rename to v1.3.0/figures/UnreachableCodeEliminator Example.png diff --git a/v1_3_0/getting-started/index.html b/v1.3.0/getting-started/index.html similarity index 100% rename from v1_3_0/getting-started/index.html rename to v1.3.0/getting-started/index.html diff --git a/v1_2_0/icon.svg b/v1.3.0/icon.svg similarity index 100% rename from v1_2_0/icon.svg rename to v1.3.0/icon.svg diff --git a/v1_2_0/img/favicon.ico b/v1.3.0/img/favicon.ico similarity index 100% rename from v1_2_0/img/favicon.ico rename to v1.3.0/img/favicon.ico diff --git a/v1_3_0/index.html b/v1.3.0/index.html similarity index 100% rename from v1_3_0/index.html rename to v1.3.0/index.html diff --git a/v1_3_0/installation/index.html b/v1.3.0/installation/index.html similarity index 100% rename from v1_3_0/installation/index.html rename to v1.3.0/installation/index.html diff --git a/v1_3_0/jimple/index.html b/v1.3.0/jimple/index.html similarity index 100% rename from v1_3_0/jimple/index.html rename to v1.3.0/jimple/index.html diff --git a/v1_3_0/search/search_index.json b/v1.3.0/search/search_index.json similarity index 100% rename from v1_3_0/search/search_index.json rename to v1.3.0/search/search_index.json diff --git a/v1_3_0/sitemap.xml b/v1.3.0/sitemap.xml similarity index 100% rename from v1_3_0/sitemap.xml rename to v1.3.0/sitemap.xml diff --git a/v1_3_0/sitemap.xml.gz b/v1.3.0/sitemap.xml.gz similarity index 100% rename from v1_3_0/sitemap.xml.gz rename to v1.3.0/sitemap.xml.gz diff --git a/v1_3_0/tools/index.html b/v1.3.0/tools/index.html similarity index 100% rename from v1_3_0/tools/index.html rename to v1.3.0/tools/index.html diff --git a/v1_3_0/whatsnew/index.html b/v1.3.0/whatsnew/index.html similarity index 100% rename from v1_3_0/whatsnew/index.html rename to v1.3.0/whatsnew/index.html diff --git a/v1_3_0/write_analyses/index.html b/v1.3.0/write_analyses/index.html similarity index 100% rename from v1_3_0/write_analyses/index.html rename to v1.3.0/write_analyses/index.html diff --git a/v1_3_0/SootUp-paper.pdf b/v1_3_0/SootUp-paper.pdf deleted file mode 100644 index 39c50116ce47665f6442ef24ac983a43b252b452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342993 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

      \n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an

      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 KYH1Z2r2haeC(EY* diff --git a/v1_3_0/SootUpLogo.svg b/v1_3_0/SootUpLogo.svg deleted file mode 100644 index daa00567f46..00000000000 --- a/v1_3_0/SootUpLogo.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1_3_0/assets/images/favicon.png b/v1_3_0/assets/images/favicon.png deleted file mode 100644 index 1cf13b9f9d978896599290a74f77d5dbe7d1655c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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&$ diff --git a/v1_3_0/assets/javascripts/bundle.ad660dcc.min.js b/v1_3_0/assets/javascripts/bundle.ad660dcc.min.js deleted file mode 100644 index 0ffc0460a4a..00000000000 --- a/v1_3_0/assets/javascripts/bundle.ad660dcc.min.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={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 s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var O=f()(_);return u("cut"),O},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(j,"px"),O.setAttribute("readonly",""),O.value=V,O}var te=function(_,O){var j=A(_);O.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,O):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,O):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(O){return typeof O}:H=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},H(V)}var mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=_.action,j=O===void 0?"copy":O,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(O){return typeof O}:Ie=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var O=0;O<_.length;O++){var j=_[O];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,O){return _&&ro(V.prototype,_),O&&ro(V,O),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(O){return O.__proto__||Object.getPrototypeOf(O)},Wt(V)}function vr(V,_){var O="data-clipboard-".concat(V);if(_.hasAttribute(O))return _.getAttribute(O)}var Ri=function(V){Ci(O,V);var _=Hi(O);function O(j,D){var Y;return _i(this,O),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(O,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),O}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ft(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ft(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=bt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(gt);var me=new Mo(Oo);var M=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[ht])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return M}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),B(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(E(r=>r.observe(t)),v(r=>Go.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),v(t=>en.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(v(t=>t?M:e))}function xe(){return new URL(location.href)}function pt(e,t=!1){if(G("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),b(t=>t.length>0),B(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():M))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),B(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),B(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),B(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),B(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function G(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!G("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,c)," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);G("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Sn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Mn(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:M),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),ee(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?M:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):M})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),G("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||G("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:M)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return G("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),B(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),Na(n).pipe(E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>G("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(v(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(ct(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!G("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(b(()=>G("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?M:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),B(1))}function Kn(e){let t=$("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):M}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),M}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return M;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),v(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),M)))),v(Xn),v(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),s.pipe(v(()=>e),Z("pathname"),v(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>d(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),ee(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?M:(i.preventDefault(),I(p))}}return M}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),B(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),B(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),v(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),v(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>M),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return M}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>M),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),B(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),v(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),G("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return G("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),st({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),st({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>$(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title")))})).subscribe(),e.pipe(v(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(v(()=>$(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(v(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),b(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),B(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;G("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Qn(e,{viewport$:Oe,header$:rt})),B(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>G("search.highlight")?mi(e,{index$:Mi,location$:jt}):M),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(v(()=>hs),Pe(ds),B(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); -//# sourceMappingURL=bundle.ad660dcc.min.js.map - diff --git a/v1_3_0/assets/javascripts/bundle.ad660dcc.min.js.map b/v1_3_0/assets/javascripts/bundle.ad660dcc.min.js.map deleted file mode 100644 index 6d61170f1e7..00000000000 --- a/v1_3_0/assets/javascripts/bundle.ad660dcc.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], - "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html: