Full Code of IAIK/transientfail for AI

master 43947508d8ba cached
123 files
486.1 KB
143.0k tokens
513 symbols
1 requests
Download .txt
Showing preview only (520K chars total). Download the full file or copy to clipboard to get everything.
Repository: IAIK/transientfail
Branch: master
Commit: 43947508d8ba
Files: 123
Total size: 486.1 KB

Directory structure:
gitextract_1s0czu4x/

├── LICENSE
├── README.md
├── docs/
│   ├── CNAME
│   ├── bibliography.js
│   ├── css/
│   │   └── style.css
│   ├── dist/
│   │   ├── index.js
│   │   └── typescript/
│   │       ├── d3.d.ts
│   │       ├── draw-links.d.ts
│   │       ├── index.d.ts
│   │       ├── initializeSVG.d.ts
│   │       ├── link-enter.d.ts
│   │       ├── link-exit.d.ts
│   │       ├── link-update.d.ts
│   │       ├── links/
│   │       │   ├── draw-links.d.ts
│   │       │   ├── link-enter.d.ts
│   │       │   ├── link-exit.d.ts
│   │       │   └── link-update.d.ts
│   │       ├── node-enter.d.ts
│   │       ├── node-exit.d.ts
│   │       ├── nodes/
│   │       │   ├── node-enter.d.ts
│   │       │   ├── node-exit.d.ts
│   │       │   └── node-update.d.ts
│   │       ├── prepare-data.d.ts
│   │       ├── services.d.ts
│   │       ├── typings.d.ts
│   │       └── utils.d.ts
│   ├── index.html
│   ├── js/
│   │   ├── export.js
│   │   ├── filter.js
│   │   └── tree.js
│   └── tree.js
└── pocs/
    ├── Makefile
    ├── get_hyperthread_pair.sh
    ├── libcache/
    │   ├── Makefile
    │   ├── cache.c
    │   └── cache.h
    ├── libpte/
    │   ├── .gitignore
    │   ├── Makefile
    │   ├── module/
    │   │   ├── Makefile
    │   │   ├── pteditor.c
    │   │   └── pteditor.h
    │   ├── ptedit.c
    │   ├── ptedit.h
    │   └── ptedit_header.h
    ├── meltdown/
    │   ├── AC/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── BR/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── DE/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── GP/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── module/
    │   │       ├── Makefile
    │   │       └── kernel_module.c
    │   ├── NM/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── secret.h
    │   │   └── victim.c
    │   ├── P/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── PK/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── RW/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── SS/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── cacheutils.h
    │   │   └── main.c
    │   ├── UD/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── US/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    └── spectre/
        ├── BTB/
        │   ├── ca_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.cpp
        │   ├── ca_oop/
        │   │   ├── cacheutils.h
        │   │   ├── exploit.sh
        │   │   ├── hyper_thread_pair.sh
        │   │   ├── main.c
        │   │   └── smc_utils.h
        │   ├── sa_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.cpp
        │   └── sa_oop/
        │       ├── Makefile
        │       ├── README.md
        │       └── main.c
        ├── PHT/
        │   ├── ca_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── ca_oop/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── sa_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   └── sa_oop/
        │       ├── Makefile
        │       ├── README.md
        │       └── main.c
        ├── RSB/
        │   ├── ca_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── ca_oop/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── sa_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   └── sa_oop/
        │       ├── Makefile
        │       ├── README.md
        │       └── main.c
        └── STL/
            ├── Makefile
            ├── README.md
            └── main.c

================================================
FILE CONTENTS
================================================

================================================
FILE: LICENSE
================================================
zlib License

(C) 2020 Graz University of Technology

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 


================================================
FILE: README.md
================================================
# Transient Fail

Transient Fail is a project that gathers different proof-of-concept implementations of Transient Execution Attacks. It was originally developed for our Usenix 2019 paper

[A Systematic Evaluation of Transient Execution Attacks and Defenses](http://cc0x1f.net/publications/transient_sytematization.pdf) by Canella, Van Bulck, Schwarz, Lipp, von Berg, Ortner, Piessens, Evtyushkin and Gruss

## Content
This project provides two different things:
* In the docs folder, we provide the source for the content of the [transient.fail](http://transient.fail) website.
* In the pocs folder, we provide our proof-of-concept implementations as well as two libraries required for them. Libcache is a small library that provides all the required functionality for time measurement, flushing and loading values, TSX transactions and so on. Libpte is a fork of [PTEditor](https://github.com/misc0110/PTEditor) developed by Michael Schwarz and allows manipulation of paging structures via a Linux kernel module.

## Status

Transient Fail is under active development as we add new proof-of-concepts that we discover during our research. We invite everybody who wants to contribute to do so via pull requests.

## Compilers and Operating Systems

So far, we only support Linux with gcc on x86 and ARMv8. Therefore, we have only tested them on such platforms, but welcome any feedback and pull requests on other platforms.

## Literature

* [Meltdown](https://meltdownattack.com)
* [Spectre](https://spectreattack.com)
* [Foreshadow](https://foreshadowattack.eu)
* [Systematic Evaluation](https://www.usenix.org/conference/usenixsecurity19/presentation/canella)
* [SpectreReturns](https://www.usenix.org/conference/woot18/presentation/koruyeh)
* [ret2spec](https://arxiv.org/pdf/1807.10364.pdf)
* [LazyFP](https://arxiv.org/pdf/1806.07480.pdf)



================================================
FILE: docs/CNAME
================================================
transient.fail

================================================
FILE: docs/bibliography.js
================================================
var sources = {
    "Canella2018": {
            "title": "A Systematic Evaluation of Transient Execution Attacks and Defenses",
            "author": "Claudio Canella, Jo Van Bulck, Michael Schwarz, Moritz Lipp, Benjamin von Berg, Philipp Ortner, Frank Piessens, Dmitry Evtyushkin, Daniel Gruss",
            "url": "https://arxiv.org/pdf/1811.05441.pdf",
            "conference": "USENIX Security 2019"
    },
    "Kocher2019": {
            title: "Spectre Attacks: Exploiting Speculative Execution",
            author: "Paul Kocher, Jann Horn, Anders Fogh, Daniel Genkin, Daniel Gruss, Werner Haas, Mike Hamburg, Moritz Lipp, Stefan Mangard, Thomas Prescher, Michael Schwarz, Yuval Yarom",
            url: "https://spectreattack.com/spectre.pdf",
            conference: "IEEE S&P 2019"
    },
    "Lipp2018": {
            title: "Meltdown: Reading Kernel Memory from User Space",
            author: "Moritz Lipp, Michael Schwarz, Daniel Gruss, Thomas Prescher, Werner Haas, Anders Fogh, Jann Horn, Stefan Mangard, Paul Kocher, Daniel Genkin, Yuval Yarom, Mike Hamburg",
            url: "https://meltdownattack.com/meltdown.pdf",
            conference: "USENIX Security 2018"
    },
    "Schwarz2019": {
            title: "ZombieLoad: Cross-Privilege-Boundary Data Sampling",
            author: "Michael Schwarz, Moritz Lipp, Daniel Moghimi, Jo Van Bulck, Julian Stecklina, Thomas Prescher, Daniel Gruss",
            url: "https://zombieloadattack.com/zombieload.pdf",
            conference: "ACM CCS 2019"
    },
    "Evtyushkin2018": {
            title: "BranchScope: A New Side-Channel Attack on Directional Branch Predictor",
            author: "Dmitry Evtyushkin, Ryan Riley, Nael Abu-Ghazaleh, Dmitry Ponomarev",
            url: "http://www.cs.ucr.edu/~nael/pubs/asplos18.pdf",
            conference: "ASPLOS 2018"
    },
    "Fog": {
            url: "https://www.agner.org/optimize/microarchitecture.pdf",
            author: "Agner Fog",
            title: "The microarchitecture of Intel, AMD and VIA CPUs"
    },
    "Maisuradze2018": {
            url: "https://arxiv.org/pdf/1807.10364.pdf",
            title: "ret2spec: Speculative Execution Using Return Stack Buffers",
            author: "Giorgi Maisuradze, Christian Rossow",
            conference: "ACM CCS 2018"
    },
    "Koruyeh2018": {
            url: "https://www.usenix.org/system/files/conference/woot18/woot18-paper-koruyeh.pdf",
            title: "Spectre Returns! Speculation Attacks using the Return Stack Buffer",
            author: "Esmaeil Mohammadian Koruyeh, Khaled N. Khasawneh, Chengyu Song, Nael Abu-Ghazaleh",
            conference: "USENIX WOOT 2018"
    },
    "Horn2018": {
            url: "https://bugs.chromium.org/p/project-zero/issues/detail?id=1528",
            title: "Speculative execution, variant 4: speculative store bypass",
            author: "Jann Horn"
    },
    "Stecklina2018": {
            url: "https://arxiv.org/pdf/1806.07480.pdf",
            title: "LazyFP: Leaking FPU Register State using Microarchitectural Side-Channels",
            author: "Julian Stecklina, Thomas Prescher"
    },
    "Intel2018": {
            url: "https://software.intel.com/security-software-guidance/api-app/sites/default/files/336996-Speculative-Execution-Side-Channel-Mitigations.pdf",
            author: "Intel",
            title: "Speculative Execution Side Channel Mitigations"
    },
    "ARM2018": {
            url: "https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability/download-the-whitepaper",
            author: "ARM",
            title: "Whitepaper Cache Speculation Side-channels"
    },
    "VanBulck2018": {
            title: "Foreshadow: Extracting the Keys to the Intel SGX Kingdom with Transient Out-of-Order Execution",
            author: "Jo Van Bulck, Marina Minkin, Ofir Weisse, Daniel Genkin, Baris Kasikci, Frank Piessens, Mark Silberstein, Thomas F. Wenisch, Yuval Yarom, Raoul Strackx",
            url: "https://foreshadowattack.eu/foreshadow.pdf",
            conference: "USENIX Security 2018"
    },
    "Weisse2018": {
            title: "Foreshadow-NG: Breaking the Virtual Memory Abstraction with Transient Out-of-Order Execution",
            author: "Ofir Weisse, Jo Van Bulck, Marina Minkin, Daniel Genkin, Baris Kasikci, Frank Piessens, Mark Silberstein, Raoul Strackx, Thomas F. Wenisch, Yuval Yarom",
            url: "https://foreshadowattack.eu/foreshadow-NG.pdf"
    },
    "Kiriansky2018": {
            url: "https://arxiv.org/pdf/1807.03757.pdf",
            title: "Speculative Buffer Overflows: Attacks and Defenses",
            author: "Vladimir Kiriansky, Carl Waldspurger"
    },
    "VanSchaik2019": {
            title: "RIDL: Rogue In-flight Data Load",
            author: "Stephan van Schaik, Alyssa Milburn, Sebastian Österlund, Pietro Frigo, Giorgi Maisuradze, Kaveh Razavi, Herbert Bos, Cristiano Giuffrida",
            url: "https://mdsattacks.com/files/ridl.pdf",
            conference: "IEEE S&P 2019"
    },
    "RIDLAddendum1": {
            title: "Addendum 1 to RIDL: Rogue In-flight Data Load",
            author: "Stephan van Schaik, Alyssa Milburn, Sebastian Österlund, Pietro Frigo, Giorgi Maisuradze, Kaveh Razavi, Herbert Bos, Cristiano Giuffrida",
            url: "https://mdsattacks.com/files/ridl-addendum.pdf",
            conference: "Addendum to IEEE S&P 2019 paper",
    },
    "Canella2019": {
            title: "Fallout: Leaking Data on Meltdown-Resistant CPUs",
            author: "Claudio Canella, Daniel Genkin, Lukas Giner, Daniel Gruss, Moritz Lipp, Marina Minkin, Daniel Moghimi, Frank Piessens, Michael Schwarz, Berk Sunar, Jo Van Bulck, Yuval Yarom",
            url: "https://dl.acm.org/doi/abs/10.1145/3319535.3363219",
            conference: "ACM CCS 2019"
    },
    "IntelMDS": {
            url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling",
            author: "Intel",
            title: "Deep Dive: Intel Analysis of Microarchitectural Data Sampling"
    },
    "IntelTAA": {
            url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-transactional-synchronization-extensions-intel-tsx-asynchronous-abort",
            author: "Intel",
            title: "Deep Dive: Intel Transactional Synchronization Extensions (Intel TSX) Asynchronous Abort"
    },
    "Chen2019": {
            title: "SGXPECTRE: Stealing Intel Secrets from SGX Enclaves via Speculative Execution",
            author: "Guoxing Chen, Sanchuan Chen, Yuan Xiao, Yinqian Zhang, Zhiqiang Lin, Ten H. Lai",
            conference: "IEEE EuroS&P 2019",
            url: "https://arxiv.org/pdf/1802.09085.pdf"
    },
    "Falk2019": {
            author: "Brandon Falk",
            title: "CPU Introspection: Intel Load Port Snooping",
            url: "https://gamozolabs.github.io/metrology/2019/12/30/load-port-monitor.html",
            conference: "Gamozo Labs Blog",
    },
};
 


================================================
FILE: docs/css/style.css
================================================
.desc_top {
    position: fixed;
    top: -3em;
}
.desc_bottom {
    position: fixed;
    top: 3em;
}
.node {
    cursor: pointer;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    border-radius: 5px;
    z-index: 99;
}
.highlight {
    background-color: yellow;
}
 
*{
    font-family:"Roboto";
}


================================================
FILE: docs/dist/index.js
================================================
!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.Treeviz=n():t.Treeviz=n()}(window,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="/",e(e.s=4)}([function(t,n,e){"use strict";e.r(n);var r="http://www.w3.org/1999/xhtml",i={svg:"http://www.w3.org/2000/svg",xhtml:r,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},o=function(t){var n=t+="",e=n.indexOf(":");return e>=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),i.hasOwnProperty(n)?{space:i[n],local:t}:t};var u=function(t){var n=o(t);return(n.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===r&&n.documentElement.namespaceURI===r?n.createElement(t):n.createElementNS(e,t)}})(n)};function a(){}var c=function(t){return null==t?a:function(){return this.querySelector(t)}};function s(){return[]}var l=function(t){return null==t?s:function(){return this.querySelectorAll(t)}},h=function(t){return function(){return this.matches(t)}},f=function(t){return new Array(t.length)};function p(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}p.prototype={constructor:p,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var d="$";function v(t,n,e,r,i,o){for(var u,a=0,c=n.length,s=o.length;a<s;++a)(u=n[a])?(u.__data__=o[a],r[a]=u):e[a]=new p(t,o[a]);for(;a<c;++a)(u=n[a])&&(i[a]=u)}function y(t,n,e,r,i,o,u){var a,c,s,l={},h=n.length,f=o.length,v=new Array(h);for(a=0;a<h;++a)(c=n[a])&&(v[a]=s=d+u.call(c,c.__data__,a,n),s in l?i[a]=c:l[s]=c);for(a=0;a<f;++a)(c=l[s=d+u.call(t,o[a],a,o)])?(r[a]=c,c.__data__=o[a],l[s]=null):e[a]=new p(t,o[a]);for(a=0;a<h;++a)(c=n[a])&&l[v[a]]===c&&(i[a]=c)}function m(t,n){return t<n?-1:t>n?1:t>=n?0:NaN}var g=function(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView};function _(t,n){return t.style.getPropertyValue(n)||g(t).getComputedStyle(t,null).getPropertyValue(n)}function w(t){return t.trim().split(/^|\s+/)}function x(t){return t.classList||new b(t)}function b(t){this._node=t,this._names=w(t.getAttribute("class")||"")}function M(t,n){for(var e=x(t),r=-1,i=n.length;++r<i;)e.add(n[r])}function k(t,n){for(var e=x(t),r=-1,i=n.length;++r<i;)e.remove(n[r])}b.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var n=this._names.indexOf(t);n>=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function A(){this.textContent=""}function z(){this.innerHTML=""}function N(){this.nextSibling&&this.parentNode.appendChild(this)}function E(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function S(){return null}function O(){var t=this.parentNode;t&&t.removeChild(this)}function j(){return this.parentNode.insertBefore(this.cloneNode(!1),this.nextSibling)}function P(){return this.parentNode.insertBefore(this.cloneNode(!0),this.nextSibling)}var T={},L=null;"undefined"!=typeof document&&("onmouseenter"in document.documentElement||(T={mouseenter:"mouseover",mouseleave:"mouseout"}));function q(t,n,e){return t=B(t,n,e),function(n){var e=n.relatedTarget;e&&(e===this||8&e.compareDocumentPosition(this))||t.call(this,n)}}function B(t,n,e){return function(r){var i=L;L=r;try{t.call(this,this.__data__,n,e)}finally{L=i}}}function I(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r<o;++r)e=n[r],t.type&&e.type!==t.type||e.name!==t.name?n[++i]=e:this.removeEventListener(e.type,e.listener,e.capture);++i?n.length=i:delete this.__on}}}function C(t,n,e){var r=T.hasOwnProperty(t.type)?q:B;return function(i,o,u){var a,c=this.__on,s=r(n,o,u);if(c)for(var l=0,h=c.length;l<h;++l)if((a=c[l]).type===t.type&&a.name===t.name)return this.removeEventListener(a.type,a.listener,a.capture),this.addEventListener(a.type,a.listener=s,a.capture=e),void(a.value=n);this.addEventListener(t.type,s,e),a={type:t.type,name:t.name,value:n,listener:s,capture:e},c?c.push(a):this.__on=[a]}}function D(t,n,e,r){var i=L;t.sourceEvent=L,L=t;try{return n.apply(e,r)}finally{L=i}}function H(t,n,e){var r=g(t),i=r.CustomEvent;"function"==typeof i?i=new i(n,e):(i=r.document.createEvent("Event"),e?(i.initEvent(n,e.bubbles,e.cancelable),i.detail=e.detail):i.initEvent(n,!1,!1)),t.dispatchEvent(i)}var X=[null];function Y(t,n){this._groups=t,this._parents=n}function R(){return new Y([[document.documentElement]],X)}Y.prototype=R.prototype={constructor:Y,select:function(t){"function"!=typeof t&&(t=c(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i<e;++i)for(var o,u,a=n[i],s=a.length,l=r[i]=new Array(s),h=0;h<s;++h)(o=a[h])&&(u=t.call(o,o.__data__,h,a))&&("__data__"in o&&(u.__data__=o.__data__),l[h]=u);return new Y(r,this._parents)},selectAll:function(t){"function"!=typeof t&&(t=l(t));for(var n=this._groups,e=n.length,r=[],i=[],o=0;o<e;++o)for(var u,a=n[o],c=a.length,s=0;s<c;++s)(u=a[s])&&(r.push(t.call(u,u.__data__,s,a)),i.push(u));return new Y(r,i)},filter:function(t){"function"!=typeof t&&(t=h(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i<e;++i)for(var o,u=n[i],a=u.length,c=r[i]=[],s=0;s<a;++s)(o=u[s])&&t.call(o,o.__data__,s,u)&&c.push(o);return new Y(r,this._parents)},data:function(t,n){if(!t)return d=new Array(this.size()),l=-1,this.each(function(t){d[++l]=t}),d;var e,r=n?y:v,i=this._parents,o=this._groups;"function"!=typeof t&&(e=t,t=function(){return e});for(var u=o.length,a=new Array(u),c=new Array(u),s=new Array(u),l=0;l<u;++l){var h=i[l],f=o[l],p=f.length,d=t.call(h,h&&h.__data__,l,i),m=d.length,g=c[l]=new Array(m),_=a[l]=new Array(m);r(h,f,g,_,s[l]=new Array(p),d,n);for(var w,x,b=0,M=0;b<m;++b)if(w=g[b]){for(b>=M&&(M=b+1);!(x=_[M])&&++M<m;);w._next=x||null}}return(a=new Y(a,i))._enter=c,a._exit=s,a},enter:function(){return new Y(this._enter||this._groups.map(f),this._parents)},exit:function(){return new Y(this._exit||this._groups.map(f),this._parents)},join:function(t,n,e){var r=this.enter(),i=this,o=this.exit();return r="function"==typeof t?t(r):r.append(t+""),null!=n&&(i=n(i)),null==e?o.remove():e(o),r&&i?r.merge(i).order():i},merge:function(t){for(var n=this._groups,e=t._groups,r=n.length,i=e.length,o=Math.min(r,i),u=new Array(r),a=0;a<o;++a)for(var c,s=n[a],l=e[a],h=s.length,f=u[a]=new Array(h),p=0;p<h;++p)(c=s[p]||l[p])&&(f[p]=c);for(;a<r;++a)u[a]=n[a];return new Y(u,this._parents)},order:function(){for(var t=this._groups,n=-1,e=t.length;++n<e;)for(var r,i=t[n],o=i.length-1,u=i[o];--o>=0;)(r=i[o])&&(u&&4^r.compareDocumentPosition(u)&&u.parentNode.insertBefore(r,u),u=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=m);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o<r;++o){for(var u,a=e[o],c=a.length,s=i[o]=new Array(c),l=0;l<c;++l)(u=a[l])&&(s[l]=u);s.sort(n)}return new Y(i,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){var t=new Array(this.size()),n=-1;return this.each(function(){t[++n]=this}),t},node:function(){for(var t=this._groups,n=0,e=t.length;n<e;++n)for(var r=t[n],i=0,o=r.length;i<o;++i){var u=r[i];if(u)return u}return null},size:function(){var t=0;return this.each(function(){++t}),t},empty:function(){return!this.node()},each:function(t){for(var n=this._groups,e=0,r=n.length;e<r;++e)for(var i,o=n[e],u=0,a=o.length;u<a;++u)(i=o[u])&&t.call(i,i.__data__,u,o);return this},attr:function(t,n){var e=o(t);if(arguments.length<2){var r=this.node();return e.local?r.getAttributeNS(e.space,e.local):r.getAttribute(e)}return this.each((null==n?e.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}}:"function"==typeof n?e.local?function(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}:function(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}:e.local?function(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}:function(t,n){return function(){this.setAttribute(t,n)}})(e,n))},style:function(t,n,e){return arguments.length>1?this.each((null==n?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof n?function(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}:function(t,n,e){return function(){this.style.setProperty(t,n,e)}})(t,n,null==e?"":e)):_(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?function(t){return function(){delete this[t]}}:"function"==typeof n?function(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}:function(t,n){return function(){this[t]=n}})(t,n)):this.node()[t]},classed:function(t,n){var e=w(t+"");if(arguments.length<2){for(var r=x(this.node()),i=-1,o=e.length;++i<o;)if(!r.contains(e[i]))return!1;return!0}return this.each(("function"==typeof n?function(t,n){return function(){(n.apply(this,arguments)?M:k)(this,t)}}:n?function(t){return function(){M(this,t)}}:function(t){return function(){k(this,t)}})(e,n))},text:function(t){return arguments.length?this.each(null==t?A:("function"==typeof t?function(t){return function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}}:function(t){return function(){this.textContent=t}})(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?z:("function"==typeof t?function(t){return function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}}:function(t){return function(){this.innerHTML=t}})(t)):this.node().innerHTML},raise:function(){return this.each(N)},lower:function(){return this.each(E)},append:function(t){var n="function"==typeof t?t:u(t);return this.select(function(){return this.appendChild(n.apply(this,arguments))})},insert:function(t,n){var e="function"==typeof t?t:u(t),r=null==n?S:"function"==typeof n?n:c(n);return this.select(function(){return this.insertBefore(e.apply(this,arguments),r.apply(this,arguments)||null)})},remove:function(){return this.each(O)},clone:function(t){return this.select(t?P:j)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,n,e){var r,i,o=function(t){return t.trim().split(/^|\s+/).map(function(t){var n="",e=t.indexOf(".");return e>=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}(t+""),u=o.length;if(!(arguments.length<2)){for(a=n?C:I,null==e&&(e=!1),r=0;r<u;++r)this.each(a(o[r],n,e));return this}var a=this.node().__on;if(a)for(var c,s=0,l=a.length;s<l;++s)for(r=0,c=a[s];r<u;++r)if((i=o[r]).type===c.type&&i.name===c.name)return c.value},dispatch:function(t,n){return this.each(("function"==typeof n?function(t,n){return function(){return H(this,t,n.apply(this,arguments))}}:function(t,n){return function(){return H(this,t,n)}})(t,n))}};var V=R,W=function(t){return"string"==typeof t?new Y([[document.querySelector(t)]],[document.documentElement]):new Y([[t]],X)},F=function(t){return W(u(t).call(document.documentElement))},U=0;function $(){return new G}function G(){this._="@"+(++U).toString(36)}G.prototype=$.prototype={constructor:G,get:function(t){for(var n=this._;!(n in t);)if(!(t=t.parentNode))return;return t[n]},set:function(t,n){return t[this._]=n},remove:function(t){return this._ in t&&delete t[this._]},toString:function(){return this._}};var K=function(){for(var t,n=L;t=n.sourceEvent;)n=t;return n},Q=function(t,n){var e=t.ownerSVGElement||t;if(e.createSVGPoint){var r=e.createSVGPoint();return r.x=n.clientX,r.y=n.clientY,[(r=r.matrixTransform(t.getScreenCTM().inverse())).x,r.y]}var i=t.getBoundingClientRect();return[n.clientX-i.left-t.clientLeft,n.clientY-i.top-t.clientTop]},Z=function(t){var n=K();return n.changedTouches&&(n=n.changedTouches[0]),Q(t,n)},J=function(t){return"string"==typeof t?new Y([document.querySelectorAll(t)],[document.documentElement]):new Y([null==t?[]:t],X)},tt=function(t,n,e){arguments.length<3&&(e=n,n=K().changedTouches);for(var r,i=0,o=n?n.length:0;i<o;++i)if((r=n[i]).identifier===e)return Q(t,r);return null},nt=function(t,n){null==n&&(n=K().touches);for(var e=0,r=n?n.length:0,i=new Array(r);e<r;++e)i[e]=Q(t,n[e]);return i};e.d(n,"create",function(){return F}),e.d(n,"creator",function(){return u}),e.d(n,"local",function(){return $}),e.d(n,"matcher",function(){return h}),e.d(n,"mouse",function(){return Z}),e.d(n,"namespace",function(){return o}),e.d(n,"namespaces",function(){return i}),e.d(n,"clientPoint",function(){return Q}),e.d(n,"select",function(){return W}),e.d(n,"selectAll",function(){return J}),e.d(n,"selection",function(){return V}),e.d(n,"selector",function(){return c}),e.d(n,"selectorAll",function(){return l}),e.d(n,"style",function(){return _}),e.d(n,"touch",function(){return tt}),e.d(n,"touches",function(){return nt}),e.d(n,"window",function(){return g}),e.d(n,"event",function(){return L}),e.d(n,"customEvent",function(){return D})},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getAreaSize=function(t){var n=document.querySelector("#"+t);if(null===n)throw new Error("Cannot find dom element with id:"+t);var e=n.clientWidth,r=n.clientHeight;if(0===r||0===e)throw new Error("The tree can't be display because the svg height or width of the container is null");return{areaWidth:e,areaHeight:r}},n.getFirstDisplayedAncestor=function(t,e,r){try{var i=t.find(function(t){return t.id===r}),o=i.ancestors()[1].id;return e.some(function(t){return t.id===o})?i.ancestors()[1]:n.getFirstDisplayedAncestor(t,e,o)}catch(n){return t.find(function(t){return t.id===r})}},n.setNodeLocation=function(t,n,e){return e.isHorizontal?"translate("+n+","+t+")":"translate("+t+","+n+")"}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.generateLinkLayout=function(t,n,e){var i=e.isHorizontal,o=e.nodeHeight,u=e.nodeWidth,a=e.linkShape;return"orthogonal"===a?i?"M "+t.y+" "+(t.x+o/2)+"\n        L "+(t.y+n.y+u)/2+" "+(t.x+o/2)+"\n        L  "+(t.y+n.y+u)/2+" "+(n.x+o/2)+"\n          "+(n.y+u)+" "+(n.x+o/2):"M "+(t.x+u/2)+" "+t.y+"\n        L "+(t.x+u/2)+" "+(t.y+n.y+o)/2+"\n        L  "+(n.x+u/2)+" "+(t.y+n.y+o)/2+"\n          "+(n.x+u/2)+" "+(n.y+o)+" ":"curve"===a?i?"M "+t.y+" "+(t.x+o/2)+"\n      L "+(t.y-(t.y-n.y-u)/2+15)+" "+(t.x+o/2)+"\n      Q"+(t.y-(t.y-n.y-u)/2)+" "+(t.x+o/2)+"\n       "+(t.y-(t.y-n.y-u)/2)+" "+(t.x+o/2-r(t.x,n.x,15))+"\n      L "+(t.y-(t.y-n.y-u)/2)+" "+(n.x+o/2)+"\n      L "+(n.y+u)+" "+(n.x+o/2):"M "+(t.x+u/2)+" "+t.y+"\n      L "+(t.x+u/2)+" "+(t.y-(t.y-n.y-o)/2+15)+"\n      Q"+(t.x+u/2)+" "+(t.y-(t.y-n.y-o)/2)+"\n      "+(t.x+u/2-r(t.x,n.x,15))+" "+(t.y-(t.y-n.y-o)/2)+"\n      L "+(n.x+u/2)+" "+(t.y-(t.y-n.y-o)/2)+" \n      L "+(n.x+u/2)+" "+(n.y+o)+" ":i?"M "+t.y+" "+(t.x+o/2)+"\n        C "+(t.y+n.y+u)/2+" "+(t.x+o/2)+"\n          "+(t.y+n.y+u)/2+" "+(n.x+o/2)+"\n          "+(n.y+u)+" "+(n.x+o/2):"M "+(t.x+u/2)+" "+t.y+"\n        C "+(t.x+u/2)+" "+(t.y+n.y+o)/2+"\n          "+(n.x+u/2)+" "+(t.y+n.y+o)/2+"\n          "+(n.x+u/2)+" "+(n.y+o)+" "};var r=function(t,n,e){return t>n?e:t<n?-e:0}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e(14),i=e(0),o=e(13);n.default={hierarchy:r.hierarchy,stratify:r.stratify,tree:r.tree,treemap:r.treemap,select:i.select,selectAll:i.selectAll,event:i.event,zoom:o.zoom}},function(t,n,e){"use strict";var r=this&&this.__assign||function(){return(r=Object.assign||function(t){for(var n,e=1,r=arguments.length;e<r;e++)for(var i in n=arguments[e])Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i]);return t}).apply(this,arguments)};Object.defineProperty(n,"__esModule",{value:!0});var i=e(5),o=e(6),u=e(7),a=e(8),c=e(9),s=e(10),l=e(11),h=e(12);n.create=function(t){var n=r({},{htmlId:"",idKey:"",relationnalField:"father",hasFlatData:!0,nodeWidth:160,nodeHeight:100,mainAxisNodeSpacing:300,renderNode:function(){return"Node"},linkColor:function(){return"#ffcc80"},linkWidth:function(){return 10},linkShape:"quadraticBeziers",isHorizontal:!0,hasPanAndZoom:!1,duration:600,onNodeClick:function(){},onNodeMouseEnter:function(){},onNodeMouseLeave:function(){},marginBottom:0,marginLeft:0,marginRight:0,marginTop:0,secondaryAxisNodeSpacing:1.25},t),e=[],f={refresh:function(t,i){i&&(n=r({},n,i));var f=h.generateNestedData(t,n),d=h.generateBasicTreemap(n)(f);!function(t,r){var i=r.descendants(),h=r.descendants().slice(1),f=n.mainAxisNodeSpacing;"auto"!==f&&i.forEach(function(t){t.y=t.depth*n.nodeWidth*f}),i.forEach(function(t){var n=e.find(function(n){return n.id===t.id});t.x0=n?n.x0:t.x,t.y0=n?n.y0:t.y});var p=t.selectAll("g.node").data(i,function(t){return t[n.idKey]}),d=c.drawNodeEnter(p,n,i,e);l.drawNodeUpdate(d,p,n),s.drawNodeExit(p,n,i,e);var v=t.selectAll("path.link").data(h,function(t){return t.id}),y=o.drawLinkEnter(v,n,i,e);a.drawLinkUpdate(y,v,n),u.drawLinkExit(v,n,i,e),e=i.slice()}(p,d)},clean:function(t){var r=t?document.querySelector("#"+n.htmlId+" svg g"):document.querySelector("#"+n.htmlId);if(r)for(;r.firstChild;)r.removeChild(r.firstChild);e=[]}},p=i.initiliazeSVG(n);return f}},function(t,n,e){"use strict";var r=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var e in t)Object.hasOwnProperty.call(t,e)&&(n[e]=t[e]);return n.default=t,n},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(n,"__esModule",{value:!0});var o=r(e(0)),u=i(e(3)),a=e(1);n.initiliazeSVG=function(t){var n=t.htmlId,e=t.isHorizontal,r=t.hasPanAndZoom,i=t.mainAxisNodeSpacing,c=t.nodeHeight,s=t.nodeWidth,l=t.marginBottom,h=t.marginLeft,f=t.marginRight,p=t.marginTop,d=f,v=l,y=h,m=a.getAreaSize(t.htmlId),g=m.areaHeight,_=m.areaWidth,w=_-y-d,x=g-p-v,b=o.select("#"+n).append("svg").attr("width",_).attr("height",g).call(u.default.zoom().on("zoom",function(){return r?b.attr("transform",o.event.transform):null})).append("g");return b.append("g").attr("transform","auto"===i?"translate(0,0)":e?"translate("+y+","+(p+x/2-c/2)+")":"translate("+(y+w/2-s/2)+","+p+")")}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e(1),i=e(2);n.drawLinkEnter=function(t,n,e,o){return t.enter().insert("path","g").attr("class","link").attr("d",function(t){var u=r.getFirstDisplayedAncestor(e,o,t.id),a={x:u.x0,y:u.y0};return i.generateLinkLayout(a,a,n)}).attr("fill","none").attr("stroke-width",function(t){var e=t.data;return n.linkWidth(e)}).attr("stroke",function(t){var e=t.data;return n.linkColor(e)})}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e(1),i=e(2);n.drawLinkExit=function(t,n,e,o){t.exit().transition().duration(n.duration).style("opacity",0).attr("d",function(t){var u=r.getFirstDisplayedAncestor(o,e,t.id),a={x:u.x0,y:u.y0};return i.generateLinkLayout(a,a,n)}).remove()}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e(2);n.drawLinkUpdate=function(t,n,e){t.merge(n).transition().duration(e.duration).attr("d",function(t){return r.generateLinkLayout(t,t.parent,e)})}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e(1);n.drawNodeEnter=function(t,n,e,i){var o=t.enter().append("g").attr("class","node").attr("transform",function(t){var o=r.getFirstDisplayedAncestor(e,i,t.id);return r.setNodeLocation(o.x0,o.y0,n)});return o.append("foreignObject").attr("width",n.nodeWidth).attr("height",n.nodeHeight),o}},function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=e(1);n.drawNodeExit=function(t,n,e,i){var o=t.exit().transition().duration(n.duration).style("opacity",0).attr("transform",function(t){var o=r.getFirstDisplayedAncestor(i,e,t.id);return r.setNodeLocation(o.x0,o.y0,n)}).remove();o.select("rect").style("fill-opacity",1e-6),o.select("circle").attr("r",1e-6),o.select("text").style("fill-opacity",1e-6)}},function(t,n,e){"use strict";var r=this&&this.__assign||function(){return(r=Object.assign||function(t){for(var n,e=1,r=arguments.length;e<r;e++)for(var i in n=arguments[e])Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i]);return t}).apply(this,arguments)};Object.defineProperty(n,"__esModule",{value:!0}),n.drawNodeUpdate=function(t,n,e){var i=t.merge(n);i.transition().duration(e.duration).attr("transform",function(t){return e.isHorizontal?"translate("+t.y+","+t.x+")":"translate("+t.x+","+t.y+")"}),i.select("foreignObject").attr("width",e.nodeWidth).attr("height",e.nodeHeight).style("overflow","visible").on("click",e.onNodeClick).on("mouseenter",e.onNodeMouseEnter).on("mouseleave",e.onNodeMouseLeave).html(function(t){return e.renderNode(r({},t,{settings:e}))})}},function(t,n,e){"use strict";var r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(n,"__esModule",{value:!0});var i=r(e(3)),o=e(1);n.generateNestedData=function(t,n){var e=n.idKey,r=n.relationnalField;return n.hasFlatData?i.default.stratify().id(function(t){return t[e]}).parentId(function(t){return t[r]})(t):i.default.hierarchy(t,function(t){return t[r]})},n.generateBasicTreemap=function(t){var n=o.getAreaSize(t.htmlId),e=n.areaHeight,r=n.areaWidth;return"auto"===t.mainAxisNodeSpacing&&t.isHorizontal?i.default.tree().size([e-t.nodeHeight,r-t.nodeWidth]):"auto"!==t.mainAxisNodeSpacing||t.isHorizontal?!0===t.isHorizontal?i.default.tree().nodeSize([t.nodeHeight*t.secondaryAxisNodeSpacing,t.nodeWidth]):i.default.tree().nodeSize([t.nodeWidth*t.secondaryAxisNodeSpacing,t.nodeHeight]):i.default.tree().size([r-t.nodeWidth,e-t.nodeHeight])}},function(t,n,e){"use strict";e.r(n);var r={value:function(){}};function i(){for(var t,n=0,e=arguments.length,r={};n<e;++n){if(!(t=arguments[n]+"")||t in r)throw new Error("illegal type: "+t);r[t]=[]}return new o(r)}function o(t){this._=t}function u(t,n){for(var e,r=0,i=t.length;r<i;++r)if((e=t[r]).name===n)return e.value}function a(t,n,e){for(var i=0,o=t.length;i<o;++i)if(t[i].name===n){t[i]=r,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=e&&t.push({name:n,value:e}),t}o.prototype=i.prototype={constructor:o,on:function(t,n){var e,r,i=this._,o=(r=i,(t+"").trim().split(/^|\s+/).map(function(t){var n="",e=t.indexOf(".");if(e>=0&&(n=t.slice(e+1),t=t.slice(0,e)),t&&!r.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}})),c=-1,s=o.length;if(!(arguments.length<2)){if(null!=n&&"function"!=typeof n)throw new Error("invalid callback: "+n);for(;++c<s;)if(e=(t=o[c]).type)i[e]=a(i[e],t.name,n);else if(null==n)for(e in i)i[e]=a(i[e],t.name,null);return this}for(;++c<s;)if((e=(t=o[c]).type)&&(e=u(i[e],t.name)))return e},copy:function(){var t={},n=this._;for(var e in n)t[e]=n[e].slice();return new o(t)},call:function(t,n){if((e=arguments.length-2)>0)for(var e,r,i=new Array(e),o=0;o<e;++o)i[o]=arguments[o+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(o=0,e=(r=this._[t]).length;o<e;++o)r[o].value.apply(n,i)},apply:function(t,n,e){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var r=this._[t],i=0,o=r.length;i<o;++i)r[i].value.apply(n,e)}};var c=i,s=e(0);var l=function(){s.event.preventDefault(),s.event.stopImmediatePropagation()},h=function(t){var n=t.document.documentElement,e=Object(s.select)(t).on("dragstart.drag",l,!0);"onselectstart"in n?e.on("selectstart.drag",l,!0):(n.__noselect=n.style.MozUserSelect,n.style.MozUserSelect="none")};function f(t,n){var e=t.document.documentElement,r=Object(s.select)(t).on("dragstart.drag",null);n&&(r.on("click.drag",l,!0),setTimeout(function(){r.on("click.drag",null)},0)),"onselectstart"in e?r.on("selectstart.drag",null):(e.style.MozUserSelect=e.__noselect,delete e.__noselect)}function p(t,n,e,r,i,o,u,a,c,s){this.target=t,this.type=n,this.subject=e,this.identifier=r,this.active=i,this.x=o,this.y=u,this.dx=a,this.dy=c,this._=s}p.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};var d=function(t,n,e){t.prototype=n.prototype=e,e.constructor=t};function v(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[r];return e}function y(){}var m="\\s*([+-]?\\d+)\\s*",g="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",_="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",w=/^#([0-9a-f]{3})$/,x=/^#([0-9a-f]{6})$/,b=new RegExp("^rgb\\("+[m,m,m]+"\\)$"),M=new RegExp("^rgb\\("+[_,_,_]+"\\)$"),k=new RegExp("^rgba\\("+[m,m,m,g]+"\\)$"),A=new RegExp("^rgba\\("+[_,_,_,g]+"\\)$"),z=new RegExp("^hsl\\("+[g,_,_]+"\\)$"),N=new RegExp("^hsla\\("+[g,_,_,g]+"\\)$"),E={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function S(t){var n;return t=(t+"").trim().toLowerCase(),(n=w.exec(t))?new L((n=parseInt(n[1],16))>>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):(n=x.exec(t))?O(parseInt(n[1],16)):(n=b.exec(t))?new L(n[1],n[2],n[3],1):(n=M.exec(t))?new L(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=k.exec(t))?j(n[1],n[2],n[3],n[4]):(n=A.exec(t))?j(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=z.exec(t))?B(n[1],n[2]/100,n[3]/100,1):(n=N.exec(t))?B(n[1],n[2]/100,n[3]/100,n[4]):E.hasOwnProperty(t)?O(E[t]):"transparent"===t?new L(NaN,NaN,NaN,0):null}function O(t){return new L(t>>16&255,t>>8&255,255&t,1)}function j(t,n,e,r){return r<=0&&(t=n=e=NaN),new L(t,n,e,r)}function P(t){return t instanceof y||(t=S(t)),t?new L((t=t.rgb()).r,t.g,t.b,t.opacity):new L}function T(t,n,e,r){return 1===arguments.length?P(t):new L(t,n,e,null==r?1:r)}function L(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function q(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function B(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new C(t,n,e,r)}function I(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof C)return new C(t.h,t.s,t.l,t.opacity);if(t instanceof y||(t=S(t)),!t)return new C;if(t instanceof C)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),u=NaN,a=o-i,c=(o+i)/2;return a?(u=n===o?(e-r)/a+6*(e<r):e===o?(r-n)/a+2:(n-e)/a+4,a/=c<.5?o+i:2-o-i,u*=60):a=c>0&&c<1?0:u,new C(u,a,c,t.opacity)}(t):new C(t,n,e,null==r?1:r)}function C(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function D(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}d(y,S,{displayable:function(){return this.rgb().displayable()},hex:function(){return this.rgb().hex()},toString:function(){return this.rgb()+""}}),d(L,T,v(y,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new L(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new L(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},hex:function(){return"#"+q(this.r)+q(this.g)+q(this.b)},toString:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}})),d(C,I,v(y,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new C(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new C(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new L(D(t>=240?t-240:t+120,i,r),D(t,i,r),D(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var H=Math.PI/180,X=180/Math.PI,Y=.96422,R=1,V=.82521,W=4/29,F=6/29,U=3*F*F,$=F*F*F;function G(t){if(t instanceof Q)return new Q(t.l,t.a,t.b,t.opacity);if(t instanceof it){if(isNaN(t.h))return new Q(t.l,0,0,t.opacity);var n=t.h*H;return new Q(t.l,Math.cos(n)*t.c,Math.sin(n)*t.c,t.opacity)}t instanceof L||(t=P(t));var e,r,i=nt(t.r),o=nt(t.g),u=nt(t.b),a=Z((.2225045*i+.7168786*o+.0606169*u)/R);return i===o&&o===u?e=r=a:(e=Z((.4360747*i+.3850649*o+.1430804*u)/Y),r=Z((.0139322*i+.0971045*o+.7141733*u)/V)),new Q(116*a-16,500*(e-a),200*(a-r),t.opacity)}function K(t,n,e,r){return 1===arguments.length?G(t):new Q(t,n,e,null==r?1:r)}function Q(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Z(t){return t>$?Math.pow(t,1/3):t/U+W}function J(t){return t>F?t*t*t:U*(t-W)}function tt(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function nt(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function et(t){if(t instanceof it)return new it(t.h,t.c,t.l,t.opacity);if(t instanceof Q||(t=G(t)),0===t.a&&0===t.b)return new it(NaN,0,t.l,t.opacity);var n=Math.atan2(t.b,t.a)*X;return new it(n<0?n+360:n,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function rt(t,n,e,r){return 1===arguments.length?et(t):new it(t,n,e,null==r?1:r)}function it(t,n,e,r){this.h=+t,this.c=+n,this.l=+e,this.opacity=+r}d(Q,K,v(y,{brighter:function(t){return new Q(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new Q(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,n=isNaN(this.a)?t:t+this.a/500,e=isNaN(this.b)?t:t-this.b/200;return new L(tt(3.1338561*(n=Y*J(n))-1.6168667*(t=R*J(t))-.4906146*(e=V*J(e))),tt(-.9787684*n+1.9161415*t+.033454*e),tt(.0719453*n-.2289914*t+1.4052427*e),this.opacity)}})),d(it,rt,v(y,{brighter:function(t){return new it(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new it(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return G(this).rgb()}}));var ot=-.14861,ut=1.78277,at=-.29227,ct=-.90649,st=1.97294,lt=st*ct,ht=st*ut,ft=ut*at-ct*ot;function pt(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof dt)return new dt(t.h,t.s,t.l,t.opacity);t instanceof L||(t=P(t));var n=t.r/255,e=t.g/255,r=t.b/255,i=(ft*r+lt*n-ht*e)/(ft+lt-ht),o=r-i,u=(st*(e-i)-at*o)/ct,a=Math.sqrt(u*u+o*o)/(st*i*(1-i)),c=a?Math.atan2(u,o)*X-120:NaN;return new dt(c<0?c+360:c,a,i,t.opacity)}(t):new dt(t,n,e,null==r?1:r)}function dt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function vt(t,n,e,r,i){var o=t*t,u=o*t;return((1-3*t+3*o-u)*n+(4-6*o+3*u)*e+(1+3*t+3*o-3*u)*r+u*i)/6}d(dt,pt,v(y,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new dt(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new dt(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*H,n=+this.l,e=isNaN(this.s)?0:this.s*n*(1-n),r=Math.cos(t),i=Math.sin(t);return new L(255*(n+e*(ot*r+ut*i)),255*(n+e*(at*r+ct*i)),255*(n+e*(st*r)),this.opacity)}}));var yt=function(t){return function(){return t}};function mt(t,n){return function(e){return t+e*n}}function gt(t,n){var e=n-t;return e?mt(t,e>180||e<-180?e-360*Math.round(e/360):e):yt(isNaN(t)?n:t)}function _t(t){return 1==(t=+t)?wt:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):yt(isNaN(n)?e:n)}}function wt(t,n){var e=n-t;return e?mt(t,e):yt(isNaN(t)?n:t)}var xt=function t(n){var e=_t(n);function r(t,n){var r=e((t=T(t)).r,(n=T(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),u=wt(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=u(n),t+""}}return r.gamma=t,r}(1);function bt(t){return function(n){var e,r,i=n.length,o=new Array(i),u=new Array(i),a=new Array(i);for(e=0;e<i;++e)r=T(n[e]),o[e]=r.r||0,u[e]=r.g||0,a[e]=r.b||0;return o=t(o),u=t(u),a=t(a),r.opacity=1,function(t){return r.r=o(t),r.g=u(t),r.b=a(t),r+""}}}bt(function(t){var n=t.length-1;return function(e){var r=e<=0?e=0:e>=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],u=r>0?t[r-1]:2*i-o,a=r<n-1?t[r+2]:2*o-i;return vt((e-r/n)*n,u,i,o,a)}}),bt(function(t){var n=t.length;return function(e){var r=Math.floor(((e%=1)<0?++e:e)*n),i=t[(r+n-1)%n],o=t[r%n],u=t[(r+1)%n],a=t[(r+2)%n];return vt((e-r/n)*n,i,o,u,a)}});var Mt=function(t,n){return n-=t=+t,function(e){return t+n*e}},kt=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,At=new RegExp(kt.source,"g");var zt,Nt,Et,St,Ot=function(t,n){var e,r,i,o=kt.lastIndex=At.lastIndex=0,u=-1,a=[],c=[];for(t+="",n+="";(e=kt.exec(t))&&(r=At.exec(n));)(i=r.index)>o&&(i=n.slice(o,i),a[u]?a[u]+=i:a[++u]=i),(e=e[0])===(r=r[0])?a[u]?a[u]+=r:a[++u]=r:(a[++u]=null,c.push({i:u,x:Mt(e,r)})),o=At.lastIndex;return o<n.length&&(i=n.slice(o),a[u]?a[u]+=i:a[++u]=i),a.length<2?c[0]?function(t){return function(n){return t(n)+""}}(c[0].x):function(t){return function(){return t}}(n):(n=c.length,function(t){for(var e,r=0;r<n;++r)a[(e=c[r]).i]=e.x(t);return a.join("")})},jt=180/Math.PI,Pt={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1},Tt=function(t,n,e,r,i,o){var u,a,c;return(u=Math.sqrt(t*t+n*n))&&(t/=u,n/=u),(c=t*e+n*r)&&(e-=t*c,r-=n*c),(a=Math.sqrt(e*e+r*r))&&(e/=a,r/=a,c/=a),t*r<n*e&&(t=-t,n=-n,c=-c,u=-u),{translateX:i,translateY:o,rotate:Math.atan2(n,t)*jt,skewX:Math.atan(c)*jt,scaleX:u,scaleY:a}};function Lt(t,n,e,r){function i(t){return t.length?t.pop()+" ":""}return function(o,u){var a=[],c=[];return o=t(o),u=t(u),function(t,r,i,o,u,a){if(t!==i||r!==o){var c=u.push("translate(",null,n,null,e);a.push({i:c-4,x:Mt(t,i)},{i:c-2,x:Mt(r,o)})}else(i||o)&&u.push("translate("+i+n+o+e)}(o.translateX,o.translateY,u.translateX,u.translateY,a,c),function(t,n,e,o){t!==n?(t-n>180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:Mt(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,u.rotate,a,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:Mt(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,u.skewX,a,c),function(t,n,e,r,o,u){if(t!==e||n!==r){var a=o.push(i(o)+"scale(",null,",",null,")");u.push({i:a-4,x:Mt(t,e)},{i:a-2,x:Mt(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,u.scaleX,u.scaleY,a,c),o=u=null,function(t){for(var n,e=-1,r=c.length;++e<r;)a[(n=c[e]).i]=n.x(t);return a.join("")}}}var qt=Lt(function(t){return"none"===t?Pt:(zt||(zt=document.createElement("DIV"),Nt=document.documentElement,Et=document.defaultView),zt.style.transform=t,t=Et.getComputedStyle(Nt.appendChild(zt),null).getPropertyValue("transform"),Nt.removeChild(zt),t=t.slice(7,-1).split(","),Tt(+t[0],+t[1],+t[2],+t[3],+t[4],+t[5]))},"px, ","px)","deg)"),Bt=Lt(function(t){return null==t?Pt:(St||(St=document.createElementNS("http://www.w3.org/2000/svg","g")),St.setAttribute("transform",t),(t=St.transform.baseVal.consolidate())?(t=t.matrix,Tt(t.a,t.b,t.c,t.d,t.e,t.f)):Pt)},", ",")",")"),It=Math.SQRT2;function Ct(t){return((t=Math.exp(t))+1/t)/2}var Dt=function(t,n){var e,r,i=t[0],o=t[1],u=t[2],a=n[0],c=n[1],s=n[2],l=a-i,h=c-o,f=l*l+h*h;if(f<1e-12)r=Math.log(s/u)/It,e=function(t){return[i+t*l,o+t*h,u*Math.exp(It*t*r)]};else{var p=Math.sqrt(f),d=(s*s-u*u+4*f)/(2*u*2*p),v=(s*s-u*u-4*f)/(2*s*2*p),y=Math.log(Math.sqrt(d*d+1)-d),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-y)/It,e=function(t){var n,e=t*r,a=Ct(y),c=u/(2*p)*(a*(n=It*e+y,((n=Math.exp(2*n))-1)/(n+1))-function(t){return((t=Math.exp(t))-1/t)/2}(y));return[i+c*l,o+c*h,u*a/Ct(It*e+y)]}}return e.duration=1e3*r,e};function Ht(t){return function(n,e){var r=t((n=I(n)).h,(e=I(e)).h),i=wt(n.s,e.s),o=wt(n.l,e.l),u=wt(n.opacity,e.opacity);return function(t){return n.h=r(t),n.s=i(t),n.l=o(t),n.opacity=u(t),n+""}}}Ht(gt),Ht(wt);function Xt(t){return function(n,e){var r=t((n=rt(n)).h,(e=rt(e)).h),i=wt(n.c,e.c),o=wt(n.l,e.l),u=wt(n.opacity,e.opacity);return function(t){return n.h=r(t),n.c=i(t),n.l=o(t),n.opacity=u(t),n+""}}}Xt(gt),Xt(wt);function Yt(t){return function n(e){function r(n,r){var i=t((n=pt(n)).h,(r=pt(r)).h),o=wt(n.s,r.s),u=wt(n.l,r.l),a=wt(n.opacity,r.opacity);return function(t){return n.h=i(t),n.s=o(t),n.l=u(Math.pow(t,e)),n.opacity=a(t),n+""}}return e=+e,r.gamma=n,r}(1)}Yt(gt),Yt(wt);var Rt,Vt,Wt=0,Ft=0,Ut=0,$t=1e3,Gt=0,Kt=0,Qt=0,Zt="object"==typeof performance&&performance.now?performance:Date,Jt="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function tn(){return Kt||(Jt(nn),Kt=Zt.now()+Qt)}function nn(){Kt=0}function en(){this._call=this._time=this._next=null}function rn(t,n,e){var r=new en;return r.restart(t,n,e),r}function on(){Kt=(Gt=Zt.now())+Qt,Wt=Ft=0;try{!function(){tn(),++Wt;for(var t,n=Rt;n;)(t=Kt-n._time)>=0&&n._call.call(null,t),n=n._next;--Wt}()}finally{Wt=0,function(){var t,n,e=Rt,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Rt=n);Vt=t,an(r)}(),Kt=0}}function un(){var t=Zt.now(),n=t-Gt;n>$t&&(Qt-=n,Gt=t)}function an(t){Wt||(Ft&&(Ft=clearTimeout(Ft)),t-Kt>24?(t<1/0&&(Ft=setTimeout(on,t-Zt.now()-Qt)),Ut&&(Ut=clearInterval(Ut))):(Ut||(Gt=Zt.now(),Ut=setInterval(un,$t)),Wt=1,Jt(on)))}en.prototype=rn.prototype={constructor:en,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?tn():+e)+(null==n?0:+n),this._next||Vt===this||(Vt?Vt._next=this:Rt=this,Vt=this),this._call=t,this._time=e,an()},stop:function(){this._call&&(this._call=null,this._time=1/0,an())}};var cn=function(t,n,e){var r=new en;return n=null==n?0:+n,r.restart(function(e){r.stop(),t(e+n)},n,e),r},sn=c("start","end","cancel","interrupt"),ln=[],hn=0,fn=1,pn=2,dn=3,vn=4,yn=5,mn=6,gn=function(t,n,e,r,i,o){var u=t.__transition;if(u){if(e in u)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(c){var s,l,h,f;if(e.state!==fn)return a();for(s in i)if((f=i[s]).name===e.name){if(f.state===dn)return cn(o);f.state===vn?(f.state=mn,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[s]):+s<n&&(f.state=mn,f.timer.stop(),f.on.call("cancel",t,t.__data__,f.index,f.group),delete i[s])}if(cn(function(){e.state===dn&&(e.state=vn,e.timer.restart(u,e.delay,e.time),u(c))}),e.state=pn,e.on.call("start",t,t.__data__,e.index,e.group),e.state===pn){for(e.state=dn,r=new Array(h=e.tween.length),s=0,l=-1;s<h;++s)(f=e.tween[s].value.call(t,t.__data__,e.index,e.group))&&(r[++l]=f);r.length=l+1}}function u(n){for(var i=n<e.duration?e.ease.call(null,n/e.duration):(e.timer.restart(a),e.state=yn,1),o=-1,u=r.length;++o<u;)r[o].call(t,i);e.state===yn&&(e.on.call("end",t,t.__data__,e.index,e.group),a())}function a(){for(var r in e.state=mn,e.timer.stop(),delete i[n],i)return;delete t.__transition}i[n]=e,e.timer=rn(function(t){e.state=fn,e.timer.restart(o,e.delay,e.time),e.delay<=t&&o(t-e.delay)},0,e.time)}(t,e,{name:n,index:r,group:i,on:sn,tween:ln,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:hn})};function _n(t,n){var e=xn(t,n);if(e.state>hn)throw new Error("too late; already scheduled");return e}function wn(t,n){var e=xn(t,n);if(e.state>dn)throw new Error("too late; already running");return e}function xn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}var bn=function(t,n){var e,r,i,o=t.__transition,u=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>pn&&e.state<yn,e.state=mn,e.timer.stop(),e.on.call(r?"interrupt":"cancel",t,t.__data__,e.index,e.group),delete o[i]):u=!1;u&&delete t.__transition}};function Mn(t,n,e){var r=t._id;return t.each(function(){var t=wn(this,r);(t.value||(t.value={}))[n]=e.apply(this,arguments)}),function(t){return xn(t,r).value[n]}}var kn=function(t,n){var e;return("number"==typeof n?Mt:n instanceof S?xt:(e=S(n))?(n=e,xt):Ot)(t,n)};var An=s.selection.prototype.constructor;function zn(t){return function(){this.style.removeProperty(t)}}var Nn=0;function En(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._id=r}function Sn(){return++Nn}var On=s.selection.prototype;En.prototype=function(t){return Object(s.selection)().transition(t)}.prototype={constructor:En,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=Object(s.selector)(t));for(var r=this._groups,i=r.length,o=new Array(i),u=0;u<i;++u)for(var a,c,l=r[u],h=l.length,f=o[u]=new Array(h),p=0;p<h;++p)(a=l[p])&&(c=t.call(a,a.__data__,p,l))&&("__data__"in a&&(c.__data__=a.__data__),f[p]=c,gn(f[p],n,e,p,f,xn(a,e)));return new En(o,this._parents,n,e)},selectAll:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=Object(s.selectorAll)(t));for(var r=this._groups,i=r.length,o=[],u=[],a=0;a<i;++a)for(var c,l=r[a],h=l.length,f=0;f<h;++f)if(c=l[f]){for(var p,d=t.call(c,c.__data__,f,l),v=xn(c,e),y=0,m=d.length;y<m;++y)(p=d[y])&&gn(p,n,e,y,d,v);o.push(d),u.push(c)}return new En(o,u,n,e)},filter:function(t){"function"!=typeof t&&(t=Object(s.matcher)(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i<e;++i)for(var o,u=n[i],a=u.length,c=r[i]=[],l=0;l<a;++l)(o=u[l])&&t.call(o,o.__data__,l,u)&&c.push(o);return new En(r,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var n=this._groups,e=t._groups,r=n.length,i=e.length,o=Math.min(r,i),u=new Array(r),a=0;a<o;++a)for(var c,s=n[a],l=e[a],h=s.length,f=u[a]=new Array(h),p=0;p<h;++p)(c=s[p]||l[p])&&(f[p]=c);for(;a<r;++a)u[a]=n[a];return new En(u,this._parents,this._name,this._id)},selection:function(){return new An(this._groups,this._parents)},transition:function(){for(var t=this._name,n=this._id,e=Sn(),r=this._groups,i=r.length,o=0;o<i;++o)for(var u,a=r[o],c=a.length,s=0;s<c;++s)if(u=a[s]){var l=xn(u,n);gn(u,t,e,s,a,{time:l.time+l.delay+l.duration,delay:0,duration:l.duration,ease:l.ease})}return new En(r,this._parents,t,e)},call:On.call,nodes:On.nodes,node:On.node,size:On.size,empty:On.empty,each:On.each,on:function(t,n){var e=this._id;return arguments.length<2?xn(this.node(),e).on.on(t):this.each(function(t,n,e){var r,i,o=function(t){return(t+"").trim().split(/^|\s+/).every(function(t){var n=t.indexOf(".");return n>=0&&(t=t.slice(0,n)),!t||"start"===t})}(n)?_n:wn;return function(){var u=o(this,t),a=u.on;a!==r&&(i=(r=a).copy()).on(n,e),u.on=i}}(e,t,n))},attr:function(t,n){var e=Object(s.namespace)(t),r="transform"===e?Bt:kn;return this.attrTween(t,"function"==typeof n?(e.local?function(t,n,e){var r,i,o;return function(){var u,a,c=e(this);if(null!=c)return(u=this.getAttributeNS(t.space,t.local))===(a=c+"")?null:u===r&&a===i?o:(i=a,o=n(r=u,c));this.removeAttributeNS(t.space,t.local)}}:function(t,n,e){var r,i,o;return function(){var u,a,c=e(this);if(null!=c)return(u=this.getAttribute(t))===(a=c+"")?null:u===r&&a===i?o:(i=a,o=n(r=u,c));this.removeAttribute(t)}})(e,r,Mn(this,"attr."+t,n)):null==n?(e.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(e):(e.local?function(t,n,e){var r,i,o=e+"";return function(){var u=this.getAttributeNS(t.space,t.local);return u===o?null:u===r?i:i=n(r=u,e)}}:function(t,n,e){var r,i,o=e+"";return function(){var u=this.getAttribute(t);return u===o?null:u===r?i:i=n(r=u,e)}})(e,r,n))},attrTween:function(t,n){var e="attr."+t;if(arguments.length<2)return(e=this.tween(e))&&e._value;if(null==n)return this.tween(e,null);if("function"!=typeof n)throw new Error;var r=Object(s.namespace)(t);return this.tween(e,(r.local?function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttributeNS(t.space,t.local,n(e))}}(t,i)),e}return i._value=n,i}:function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttribute(t,n(e))}}(t,i)),e}return i._value=n,i})(r,n))},style:function(t,n,e){var r="transform"==(t+="")?qt:kn;return null==n?this.styleTween(t,function(t,n){var e,r,i;return function(){var o=Object(s.style)(this,t),u=(this.style.removeProperty(t),Object(s.style)(this,t));return o===u?null:o===e&&u===r?i:i=n(e=o,r=u)}}(t,r)).on("end.style."+t,zn(t)):"function"==typeof n?this.styleTween(t,function(t,n,e){var r,i,o;return function(){var u=Object(s.style)(this,t),a=e(this),c=a+"";return null==a&&(this.style.removeProperty(t),c=a=Object(s.style)(this,t)),u===c?null:u===r&&c===i?o:(i=c,o=n(r=u,a))}}(t,r,Mn(this,"style."+t,n))).each(function(t,n){var e,r,i,o,u="style."+n,a="end."+u;return function(){var c=wn(this,t),s=c.on,l=null==c.value[u]?o||(o=zn(n)):void 0;s===e&&i===l||(r=(e=s).copy()).on(a,i=l),c.on=r}}(this._id,t)):this.styleTween(t,function(t,n,e){var r,i,o=e+"";return function(){var u=Object(s.style)(this,t);return u===o?null:u===r?i:i=n(r=u,e)}}(t,r,n),e).on("end.style."+t,null)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,n,e){return function(r){this.style.setProperty(t,n(r),e)}}(t,o,e)),r}return o._value=n,o}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(Mn(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},remove:function(){return this.on("end.remove",(t=this._id,function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}));var t},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=xn(this.node(),e).tween,o=0,u=i.length;o<u;++o)if((r=i[o]).name===t)return r.value;return null}return this.each((null==n?function(t,n){var e,r;return function(){var i=wn(this,t),o=i.tween;if(o!==e)for(var u=0,a=(r=e=o).length;u<a;++u)if(r[u].name===n){(r=r.slice()).splice(u,1);break}i.tween=r}}:function(t,n,e){var r,i;if("function"!=typeof e)throw new Error;return function(){var o=wn(this,t),u=o.tween;if(u!==r){i=(r=u).slice();for(var a={name:n,value:e},c=0,s=i.length;c<s;++c)if(i[c].name===n){i[c]=a;break}c===s&&i.push(a)}o.tween=i}})(e,t,n))},delay:function(t){var n=this._id;return arguments.length?this.each(("function"==typeof t?function(t,n){return function(){_n(this,t).delay=+n.apply(this,arguments)}}:function(t,n){return n=+n,function(){_n(this,t).delay=n}})(n,t)):xn(this.node(),n).delay},duration:function(t){var n=this._id;return arguments.length?this.each(("function"==typeof t?function(t,n){return function(){wn(this,t).duration=+n.apply(this,arguments)}}:function(t,n){return n=+n,function(){wn(this,t).duration=n}})(n,t)):xn(this.node(),n).duration},ease:function(t){var n=this._id;return arguments.length?this.each(function(t,n){if("function"!=typeof n)throw new Error;return function(){wn(this,t).ease=n}}(n,t)):xn(this.node(),n).ease},end:function(){var t,n,e=this,r=e._id,i=e.size();return new Promise(function(o,u){var a={value:u},c={value:function(){0==--i&&o()}};e.each(function(){var e=wn(this,r),i=e.on;i!==t&&((n=(t=i).copy())._.cancel.push(a),n._.interrupt.push(a),n._.end.push(c)),e.on=n})})}};(function t(n){function e(t){return Math.pow(t,n)}return n=+n,e.exponent=t,e})(3),function t(n){function e(t){return 1-Math.pow(1-t,n)}return n=+n,e.exponent=t,e}(3),function t(n){function e(t){return((t*=2)<=1?Math.pow(t,n):2-Math.pow(2-t,n))/2}return n=+n,e.exponent=t,e}(3),Math.PI;(function t(n){function e(t){return t*t*((n+1)*t-n)}return n=+n,e.overshoot=t,e})(1.70158),function t(n){function e(t){return--t*t*((n+1)*t+n)+1}return n=+n,e.overshoot=t,e}(1.70158),function t(n){function e(t){return((t*=2)<1?t*t*((n+1)*t-n):(t-=2)*t*((n+1)*t+n)+2)/2}return n=+n,e.overshoot=t,e}(1.70158);var jn=2*Math.PI,Pn=(function t(n,e){var r=Math.asin(1/(n=Math.max(1,n)))*(e/=jn);function i(t){return n*Math.pow(2,10*--t)*Math.sin((r-t)/e)}return i.amplitude=function(n){return t(n,e*jn)},i.period=function(e){return t(n,e)},i}(1,.3),function t(n,e){var r=Math.asin(1/(n=Math.max(1,n)))*(e/=jn);function i(t){return 1-n*Math.pow(2,-10*(t=+t))*Math.sin((t+r)/e)}return i.amplitude=function(n){return t(n,e*jn)},i.period=function(e){return t(n,e)},i}(1,.3),function t(n,e){var r=Math.asin(1/(n=Math.max(1,n)))*(e/=jn);function i(t){return((t=2*t-1)<0?n*Math.pow(2,10*t)*Math.sin((r-t)/e):2-n*Math.pow(2,-10*t)*Math.sin((r+t)/e))/2}return i.amplitude=function(n){return t(n,e*jn)},i.period=function(e){return t(n,e)},i}(1,.3),{time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}});function Tn(t,n){for(var e;!(e=t.__transition)||!(e=e[n]);)if(!(t=t.parentNode))return Pn.time=tn(),Pn;return e}s.selection.prototype.interrupt=function(t){return this.each(function(){bn(this,t)})},s.selection.prototype.transition=function(t){var n,e;t instanceof En?(n=t._id,t=t._name):(n=Sn(),(e=Pn).time=tn(),t=null==t?null:t+"");for(var r=this._groups,i=r.length,o=0;o<i;++o)for(var u,a=r[o],c=a.length,s=0;s<c;++s)(u=a[s])&&gn(u,t,n,s,a,e||Tn(u,n));return new En(r,this._parents,t,n)};var Ln=function(t){return function(){return t}};function qn(t,n,e){this.target=t,this.type=n,this.transform=e}function Bn(t,n,e){this.k=t,this.x=n,this.y=e}Bn.prototype={constructor:Bn,scale:function(t){return 1===t?this:new Bn(this.k*t,this.x,this.y)},translate:function(t,n){return 0===t&0===n?this:new Bn(this.k,this.x+this.k*t,this.y+this.k*n)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var In=new Bn(1,0,0);function Cn(t){return t.__zoom||In}function Dn(){s.event.stopImmediatePropagation()}Cn.prototype=Bn.prototype;var Hn=function(){s.event.preventDefault(),s.event.stopImmediatePropagation()};function Xn(){return!s.event.button}function Yn(){var t,n,e=this;return e instanceof SVGElement?(t=(e=e.ownerSVGElement||e).width.baseVal.value,n=e.height.baseVal.value):(t=e.clientWidth,n=e.clientHeight),[[0,0],[t,n]]}function Rn(){return this.__zoom||In}function Vn(){return-s.event.deltaY*(s.event.deltaMode?120:1)/500}function Wn(){return"ontouchstart"in this}function Fn(t,n,e){var r=t.invertX(n[0][0])-e[0][0],i=t.invertX(n[1][0])-e[1][0],o=t.invertY(n[0][1])-e[0][1],u=t.invertY(n[1][1])-e[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),u>o?(o+u)/2:Math.min(0,o)||Math.max(0,u))}var Un=function(){var t,n,e=Xn,r=Yn,i=Fn,o=Vn,u=Wn,a=[0,1/0],l=[[-1/0,-1/0],[1/0,1/0]],p=250,d=Dt,v=[],y=c("start","zoom","end"),m=500,g=150,_=0;function w(t){t.property("__zoom",Rn).on("wheel.zoom",N).on("mousedown.zoom",E).on("dblclick.zoom",S).filter(u).on("touchstart.zoom",O).on("touchmove.zoom",j).on("touchend.zoom touchcancel.zoom",P).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function x(t,n){return(n=Math.max(a[0],Math.min(a[1],n)))===t.k?t:new Bn(n,t.x,t.y)}function b(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Bn(t.k,r,i)}function M(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function k(t,n,e){t.on("start.zoom",function(){A(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){A(this,arguments).end()}).tween("zoom",function(){var t=arguments,i=A(this,t),o=r.apply(this,t),u=e||M(o),a=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),c=this.__zoom,s="function"==typeof n?n.apply(this,t):n,l=d(c.invert(u).concat(a/c.k),s.invert(u).concat(a/s.k));return function(t){if(1===t)t=s;else{var n=l(t),e=a/n[2];t=new Bn(e,u[0]-n[0]*e,u[1]-n[1]*e)}i.zoom(null,t)}})}function A(t,n){for(var e,r=0,i=v.length;r<i;++r)if((e=v[r]).that===t)return e;return new z(t,n)}function z(t,n){this.that=t,this.args=n,this.index=-1,this.active=0,this.extent=r.apply(t,n)}function N(){if(e.apply(this,arguments)){var t=A(this,arguments),n=this.__zoom,r=Math.max(a[0],Math.min(a[1],n.k*Math.pow(2,o.apply(this,arguments)))),u=Object(s.mouse)(this);if(t.wheel)t.mouse[0][0]===u[0]&&t.mouse[0][1]===u[1]||(t.mouse[1]=n.invert(t.mouse[0]=u)),clearTimeout(t.wheel);else{if(n.k===r)return;t.mouse=[u,n.invert(u)],bn(this),t.start()}Hn(),t.wheel=setTimeout(function(){t.wheel=null,t.end()},g),t.zoom("mouse",i(b(x(n,r),t.mouse[0],t.mouse[1]),t.extent,l))}}function E(){if(!n&&e.apply(this,arguments)){var t=A(this,arguments),r=Object(s.select)(s.event.view).on("mousemove.zoom",function(){if(Hn(),!t.moved){var n=s.event.clientX-u,e=s.event.clientY-a;t.moved=n*n+e*e>_}t.zoom("mouse",i(b(t.that.__zoom,t.mouse[0]=Object(s.mouse)(t.that),t.mouse[1]),t.extent,l))},!0).on("mouseup.zoom",function(){r.on("mousemove.zoom mouseup.zoom",null),f(s.event.view,t.moved),Hn(),t.end()},!0),o=Object(s.mouse)(this),u=s.event.clientX,a=s.event.clientY;h(s.event.view),Dn(),t.mouse=[o,this.__zoom.invert(o)],bn(this),t.start()}}function S(){if(e.apply(this,arguments)){var t=this.__zoom,n=Object(s.mouse)(this),o=t.invert(n),u=t.k*(s.event.shiftKey?.5:2),a=i(b(x(t,u),n,o),r.apply(this,arguments),l);Hn(),p>0?Object(s.select)(this).transition().duration(p).call(k,a,n):Object(s.select)(this).call(w.transform,a)}}function O(){if(e.apply(this,arguments)){var n,r,i,o,u=A(this,arguments),a=s.event.changedTouches,c=a.length;for(Dn(),r=0;r<c;++r)i=a[r],o=[o=Object(s.touch)(this,a,i.identifier),this.__zoom.invert(o),i.identifier],u.touch0?u.touch1||(u.touch1=o):(u.touch0=o,n=!0);if(t&&(t=clearTimeout(t),!u.touch1))return u.end(),void((o=Object(s.select)(this).on("dblclick.zoom"))&&o.apply(this,arguments));n&&(t=setTimeout(function(){t=null},m),bn(this),u.start())}}function j(){var n,e,r,o,u=A(this,arguments),a=s.event.changedTouches,c=a.length;for(Hn(),t&&(t=clearTimeout(t)),n=0;n<c;++n)e=a[n],r=Object(s.touch)(this,a,e.identifier),u.touch0&&u.touch0[2]===e.identifier?u.touch0[0]=r:u.touch1&&u.touch1[2]===e.identifier&&(u.touch1[0]=r);if(e=u.that.__zoom,u.touch1){var h=u.touch0[0],f=u.touch0[1],p=u.touch1[0],d=u.touch1[1],v=(v=p[0]-h[0])*v+(v=p[1]-h[1])*v,y=(y=d[0]-f[0])*y+(y=d[1]-f[1])*y;e=x(e,Math.sqrt(v/y)),r=[(h[0]+p[0])/2,(h[1]+p[1])/2],o=[(f[0]+d[0])/2,(f[1]+d[1])/2]}else{if(!u.touch0)return;r=u.touch0[0],o=u.touch0[1]}u.zoom("touch",i(b(e,r,o),u.extent,l))}function P(){var t,e,r=A(this,arguments),i=s.event.changedTouches,o=i.length;for(Dn(),n&&clearTimeout(n),n=setTimeout(function(){n=null},m),t=0;t<o;++t)e=i[t],r.touch0&&r.touch0[2]===e.identifier?delete r.touch0:r.touch1&&r.touch1[2]===e.identifier&&delete r.touch1;r.touch1&&!r.touch0&&(r.touch0=r.touch1,delete r.touch1),r.touch0?r.touch0[1]=this.__zoom.invert(r.touch0[0]):r.end()}return w.transform=function(t,n){var e=t.selection?t.selection():t;e.property("__zoom",Rn),t!==e?k(t,n):e.interrupt().each(function(){A(this,arguments).start().zoom(null,"function"==typeof n?n.apply(this,arguments):n).end()})},w.scaleBy=function(t,n){w.scaleTo(t,function(){return this.__zoom.k*("function"==typeof n?n.apply(this,arguments):n)})},w.scaleTo=function(t,n){w.transform(t,function(){var t=r.apply(this,arguments),e=this.__zoom,o=M(t),u=e.invert(o),a="function"==typeof n?n.apply(this,arguments):n;return i(b(x(e,a),o,u),t,l)})},w.translateBy=function(t,n,e){w.transform(t,function(){return i(this.__zoom.translate("function"==typeof n?n.apply(this,arguments):n,"function"==typeof e?e.apply(this,arguments):e),r.apply(this,arguments),l)})},w.translateTo=function(t,n,e){w.transform(t,function(){var t=r.apply(this,arguments),o=this.__zoom,u=M(t);return i(In.translate(u[0],u[1]).scale(o.k).translate("function"==typeof n?-n.apply(this,arguments):-n,"function"==typeof e?-e.apply(this,arguments):-e),t,l)})},z.prototype={start:function(){return 1==++this.active&&(this.index=v.push(this)-1,this.emit("start")),this},zoom:function(t,n){return this.mouse&&"mouse"!==t&&(this.mouse[1]=n.invert(this.mouse[0])),this.touch0&&"touch"!==t&&(this.touch0[1]=n.invert(this.touch0[0])),this.touch1&&"touch"!==t&&(this.touch1[1]=n.invert(this.touch1[0])),this.that.__zoom=n,this.emit("zoom"),this},end:function(){return 0==--this.active&&(v.splice(this.index,1),this.index=-1,this.emit("end")),this},emit:function(t){Object(s.customEvent)(new qn(w,t,this.that.__zoom),y.apply,y,[t,this.that,this.args])}},w.wheelDelta=function(t){return arguments.length?(o="function"==typeof t?t:Ln(+t),w):o},w.filter=function(t){return arguments.length?(e="function"==typeof t?t:Ln(!!t),w):e},w.touchable=function(t){return arguments.length?(u="function"==typeof t?t:Ln(!!t),w):u},w.extent=function(t){return arguments.length?(r="function"==typeof t?t:Ln([[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]]),w):r},w.scaleExtent=function(t){return arguments.length?(a[0]=+t[0],a[1]=+t[1],w):[a[0],a[1]]},w.translateExtent=function(t){return arguments.length?(l[0][0]=+t[0][0],l[1][0]=+t[1][0],l[0][1]=+t[0][1],l[1][1]=+t[1][1],w):[[l[0][0],l[0][1]],[l[1][0],l[1][1]]]},w.constrain=function(t){return arguments.length?(i=t,w):i},w.duration=function(t){return arguments.length?(p=+t,w):p},w.interpolate=function(t){return arguments.length?(d=t,w):d},w.on=function(){var t=y.on.apply(y,arguments);return t===y?w:t},w.clickDistance=function(t){return arguments.length?(_=(t=+t)*t,w):Math.sqrt(_)},w};e.d(n,"zoom",function(){return Un}),e.d(n,"zoomTransform",function(){return Cn}),e.d(n,"zoomIdentity",function(){return In})},function(t,n,e){"use strict";function r(t,n){return t.parent===n.parent?1:2}function i(t,n){return t+n.x}function o(t,n){return Math.max(t,n.y)}e.r(n);var u=function(){var t=r,n=1,e=1,u=!1;function a(r){var a,c=0;r.eachAfter(function(n){var e=n.children;e?(n.x=function(t){return t.reduce(i,0)/t.length}(e),n.y=function(t){return 1+t.reduce(o,0)}(e)):(n.x=a?c+=t(n,a):0,n.y=0,a=n)});var s=function(t){for(var n;n=t.children;)t=n[0];return t}(r),l=function(t){for(var n;n=t.children;)t=n[n.length-1];return t}(r),h=s.x-t(s,l)/2,f=l.x+t(l,s)/2;return r.eachAfter(u?function(t){t.x=(t.x-r.x)*n,t.y=(r.y-t.y)*e}:function(t){t.x=(t.x-h)/(f-h)*n,t.y=(1-(r.y?t.y/r.y:1))*e})}return a.separation=function(n){return arguments.length?(t=n,a):t},a.size=function(t){return arguments.length?(u=!1,n=+t[0],e=+t[1],a):u?null:[n,e]},a.nodeSize=function(t){return arguments.length?(u=!0,n=+t[0],e=+t[1],a):u?[n,e]:null},a};function a(t){var n=0,e=t.children,r=e&&e.length;if(r)for(;--r>=0;)n+=e[r].value;else n=1;t.value=n}function c(t,n){var e,r,i,o,u,a=new f(t),c=+t.value&&(a.value=t.value),l=[a];for(null==n&&(n=s);e=l.pop();)if(c&&(e.value=+e.data.value),(i=n(e.data))&&(u=i.length))for(e.children=new Array(u),o=u-1;o>=0;--o)l.push(r=e.children[o]=new f(i[o])),r.parent=e,r.depth=e.depth+1;return a.eachBefore(h)}function s(t){return t.children}function l(t){t.data=t.data.data}function h(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function f(t){this.data=t,this.depth=this.height=0,this.parent=null}f.prototype=c.prototype={constructor:f,count:function(){return this.eachAfter(a)},each:function(t){var n,e,r,i,o=this,u=[o];do{for(n=u.reverse(),u=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r<i;++r)u.push(e[r])}while(u.length);return this},eachAfter:function(t){for(var n,e,r,i=this,o=[i],u=[];i=o.pop();)if(u.push(i),n=i.children)for(e=0,r=n.length;e<r;++e)o.push(n[e]);for(;i=u.pop();)t(i);return this},eachBefore:function(t){for(var n,e,r=this,i=[r];r=i.pop();)if(t(r),n=r.children)for(e=n.length-1;e>=0;--e)i.push(n[e]);return this},sum:function(t){return this.eachAfter(function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e})},sort:function(t){return this.eachBefore(function(n){n.children&&n.children.sort(t)})},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;for(t=e.pop(),n=r.pop();t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){var t=[];return this.each(function(n){t.push(n)}),t},leaves:function(){var t=[];return this.eachBefore(function(n){n.children||t.push(n)}),t},links:function(){var t=this,n=[];return t.each(function(e){e!==t&&n.push({source:e.parent,target:e})}),n},copy:function(){return c(this).eachBefore(l)}};var p=Array.prototype.slice;var d=function(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(p.call(t))).length,o=[];r<i;)n=t[r],e&&m(e,n)?++r:(e=_(o=v(o,n)),r=0);return e};function v(t,n){var e,r;if(g(n,t))return[n];for(e=0;e<t.length;++e)if(y(n,t[e])&&g(w(t[e],n),t))return[t[e],n];for(e=0;e<t.length-1;++e)for(r=e+1;r<t.length;++r)if(y(w(t[e],t[r]),n)&&y(w(t[e],n),t[r])&&y(w(t[r],n),t[e])&&g(x(t[e],t[r],n),t))return[t[e],t[r],n];throw new Error}function y(t,n){var e=t.r-n.r,r=n.x-t.x,i=n.y-t.y;return e<0||e*e<r*r+i*i}function m(t,n){var e=t.r-n.r+1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function g(t,n){for(var e=0;e<n.length;++e)if(!m(t,n[e]))return!1;return!0}function _(t){switch(t.length){case 1:return{x:(n=t[0]).x,y:n.y,r:n.r};case 2:return w(t[0],t[1]);case 3:return x(t[0],t[1],t[2])}var n}function w(t,n){var e=t.x,r=t.y,i=t.r,o=n.x,u=n.y,a=n.r,c=o-e,s=u-r,l=a-i,h=Math.sqrt(c*c+s*s);return{x:(e+o+c/h*l)/2,y:(r+u+s/h*l)/2,r:(h+i+a)/2}}function x(t,n,e){var r=t.x,i=t.y,o=t.r,u=n.x,a=n.y,c=n.r,s=e.x,l=e.y,h=e.r,f=r-u,p=r-s,d=i-a,v=i-l,y=c-o,m=h-o,g=r*r+i*i-o*o,_=g-u*u-a*a+c*c,w=g-s*s-l*l+h*h,x=p*d-f*v,b=(d*w-v*_)/(2*x)-r,M=(v*y-d*m)/x,k=(p*_-f*w)/(2*x)-i,A=(f*m-p*y)/x,z=M*M+A*A-1,N=2*(o+b*M+k*A),E=b*b+k*k-o*o,S=-(z?(N+Math.sqrt(N*N-4*z*E))/(2*z):E/N);return{x:r+b+M*S,y:i+k+A*S,r:S}}function b(t,n,e){var r,i,o,u,a=t.x-n.x,c=t.y-n.y,s=a*a+c*c;s?(i=n.r+e.r,i*=i,u=t.r+e.r,i>(u*=u)?(r=(s+u-i)/(2*s),o=Math.sqrt(Math.max(0,u/s-r*r)),e.x=t.x-r*a-o*c,e.y=t.y-r*c+o*a):(r=(s+i-u)/(2*s),o=Math.sqrt(Math.max(0,i/s-r*r)),e.x=n.x+r*a-o*c,e.y=n.y+r*c+o*a)):(e.x=n.x+e.r,e.y=n.y)}function M(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function k(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function A(t){this._=t,this.next=null,this.previous=null}function z(t){if(!(i=t.length))return 0;var n,e,r,i,o,u,a,c,s,l,h;if((n=t[0]).x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;b(e,n,r=t[2]),n=new A(n),e=new A(e),r=new A(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(a=3;a<i;++a){b(n._,e._,r=t[a]),r=new A(r),c=e.next,s=n.previous,l=e._.r,h=n._.r;do{if(l<=h){if(M(c._,r._)){e=c,n.next=e,e.previous=n,--a;continue t}l+=c._.r,c=c.next}else{if(M(s._,r._)){(n=s).next=e,e.previous=n,--a;continue t}h+=s._.r,s=s.previous}}while(c!==s.next);for(r.previous=n,r.next=e,n.next=e.previous=e=r,o=k(n);(r=r.next)!==e;)(u=k(r))<o&&(n=r,o=u);e=n.next}for(n=[e._],r=e;(r=r.next)!==e;)n.push(r._);for(r=d(n),a=0;a<i;++a)(n=t[a]).x-=r.x,n.y-=r.y;return r.r}var N=function(t){return z(t),t};function E(t){if("function"!=typeof t)throw new Error;return t}function S(){return 0}var O=function(t){return function(){return t}};function j(t){return Math.sqrt(t.value)}var P=function(){var t=null,n=1,e=1,r=S;function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(T(t)).eachAfter(L(r,.5)).eachBefore(q(1)):i.eachBefore(T(j)).eachAfter(L(S,1)).eachAfter(L(r,i.r/Math.min(n,e))).eachBefore(q(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=null==(e=n)?null:E(e),i):t;var e},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:O(+t),i):r},i};function T(t){return function(n){n.children||(n.r=Math.max(0,+t(n)||0))}}function L(t,n){return function(e){if(r=e.children){var r,i,o,u=r.length,a=t(e)*n||0;if(a)for(i=0;i<u;++i)r[i].r+=a;if(o=z(r),a)for(i=0;i<u;++i)r[i].r-=a;e.r=o+a}}}function q(t){return function(n){var e=n.parent;n.r*=t,e&&(n.x=e.x+t*n.x,n.y=e.y+t*n.y)}}var B=function(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)},I=function(t,n,e,r,i){for(var o,u=t.children,a=-1,c=u.length,s=t.value&&(r-n)/t.value;++a<c;)(o=u[a]).y0=e,o.y1=i,o.x0=n,o.x1=n+=o.value*s},C=function(){var t=1,n=1,e=0,r=!1;function i(i){var o=i.height+1;return i.x0=i.y0=e,i.x1=t,i.y1=n/o,i.eachBefore(function(t,n){return function(r){r.children&&I(r,r.x0,t*(r.depth+1)/n,r.x1,t*(r.depth+2)/n);var i=r.x0,o=r.y0,u=r.x1-e,a=r.y1-e;u<i&&(i=u=(i+u)/2),a<o&&(o=a=(o+a)/2),r.x0=i,r.y0=o,r.x1=u,r.y1=a}}(n,o)),r&&i.eachBefore(B),i}return i.round=function(t){return arguments.length?(r=!!t,i):r},i.size=function(e){return arguments.length?(t=+e[0],n=+e[1],i):[t,n]},i.padding=function(t){return arguments.length?(e=+t,i):e},i},D="$",H={depth:-1},X={};function Y(t){return t.id}function R(t){return t.parentId}var V=function(){var t=Y,n=R;function e(e){var r,i,o,u,a,c,s,l=e.length,p=new Array(l),d={};for(i=0;i<l;++i)r=e[i],a=p[i]=new f(r),null!=(c=t(r,i,e))&&(c+="")&&(d[s=D+(a.id=c)]=s in d?X:a);for(i=0;i<l;++i)if(a=p[i],null!=(c=n(e[i],i,e))&&(c+="")){if(!(u=d[D+c]))throw new Error("missing: "+c);if(u===X)throw new Error("ambiguous: "+c);u.children?u.children.push(a):u.children=[a],a.parent=u}else{if(o)throw new Error("multiple roots");o=a}if(!o)throw new Error("no root");if(o.parent=H,o.eachBefore(function(t){t.depth=t.parent.depth+1,--l}).eachBefore(h),o.parent=null,l>0)throw new Error("cycle");return o}return e.id=function(n){return arguments.length?(t=E(n),e):t},e.parentId=function(t){return arguments.length?(n=E(t),e):n},e};function W(t,n){return t.parent===n.parent?1:2}function F(t){var n=t.children;return n?n[0]:t.t}function U(t){var n=t.children;return n?n[n.length-1]:t.t}function $(t,n,e){var r=e/(n.i-t.i);n.c-=r,n.s+=e,t.c+=r,n.z+=e,n.m+=e}function G(t,n,e){return t.a.parent===n.parent?t.a:e}function K(t,n){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=n}K.prototype=Object.create(f.prototype);var Q=function(){var t=W,n=1,e=1,r=null;function i(i){var c=function(t){for(var n,e,r,i,o,u=new K(t,0),a=[u];n=a.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)a.push(e=n.children[i]=new K(r[i],i)),e.parent=n;return(u.parent=new K(null,0)).children=[u],u}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(u),r)i.eachBefore(a);else{var s=i,l=i,h=i;i.eachBefore(function(t){t.x<s.x&&(s=t),t.x>l.x&&(l=t),t.depth>h.depth&&(h=t)});var f=s===l?1:t(s,l)/2,p=f-s.x,d=n/(l.x+f+p),v=e/(h.depth||1);i.eachBefore(function(t){t.x=(t.x+p)*d,t.y=t.depth*v})}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,u=n,a=e,c=o.parent.children[0],s=o.m,l=u.m,h=a.m,f=c.m;a=U(a),o=F(o),a&&o;)c=F(c),(u=U(u)).a=n,(i=a.z+h-o.z-s+t(a._,o._))>0&&($(G(a,n,r),n,i),s+=i,l+=i),h+=a.m,s+=o.m,f+=c.m,l+=u.m;a&&!U(u)&&(u.t=a,u.m+=h-l),o&&!F(c)&&(c.t=o,c.m+=s-f,r=n)}return r}(n,i,n.parent.A||r[0])}function u(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function a(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},Z=function(t,n,e,r,i){for(var o,u=t.children,a=-1,c=u.length,s=t.value&&(i-e)/t.value;++a<c;)(o=u[a]).x0=n,o.x1=r,o.y0=e,o.y1=e+=o.value*s},J=(1+Math.sqrt(5))/2;function tt(t,n,e,r,i,o){for(var u,a,c,s,l,h,f,p,d,v,y,m=[],g=n.children,_=0,w=0,x=g.length,b=n.value;_<x;){c=i-e,s=o-r;do{l=g[w++].value}while(!l&&w<x);for(h=f=l,y=l*l*(v=Math.max(s/c,c/s)/(b*t)),d=Math.max(f/y,y/h);w<x;++w){if(l+=a=g[w].value,a<h&&(h=a),a>f&&(f=a),y=l*l*v,(p=Math.max(f/y,y/h))>d){l-=a;break}d=p}m.push(u={value:l,dice:c<s,children:g.slice(_,w)}),u.dice?I(u,e,r,i,b?r+=s*l/b:o):Z(u,e,r,b?e+=c*l/b:i,o),b-=l,_=w}return m}var nt=function t(n){function e(t,e,r,i,o){tt(n,t,e,r,i,o)}return e.ratio=function(n){return t((n=+n)>1?n:1)},e}(J),et=function(){var t=nt,n=!1,e=1,r=1,i=[0],o=S,u=S,a=S,c=S,s=S;function l(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(h),i=[0],n&&t.eachBefore(B),t}function h(n){var e=i[n.depth],r=n.x0+e,l=n.y0+e,h=n.x1-e,f=n.y1-e;h<r&&(r=h=(r+h)/2),f<l&&(l=f=(l+f)/2),n.x0=r,n.y0=l,n.x1=h,n.y1=f,n.children&&(e=i[n.depth+1]=o(n)/2,r+=s(n)-e,l+=u(n)-e,(h-=a(n)-e)<r&&(r=h=(r+h)/2),(f-=c(n)-e)<l&&(l=f=(l+f)/2),t(n,r,l,h,f))}return l.round=function(t){return arguments.length?(n=!!t,l):n},l.size=function(t){return arguments.length?(e=+t[0],r=+t[1],l):[e,r]},l.tile=function(n){return arguments.length?(t=E(n),l):t},l.padding=function(t){return arguments.length?l.paddingInner(t).paddingOuter(t):l.paddingInner()},l.paddingInner=function(t){return arguments.length?(o="function"==typeof t?t:O(+t),l):o},l.paddingOuter=function(t){return arguments.length?l.paddingTop(t).paddingRight(t).paddingBottom(t).paddingLeft(t):l.paddingTop()},l.paddingTop=function(t){return arguments.length?(u="function"==typeof t?t:O(+t),l):u},l.paddingRight=function(t){return arguments.length?(a="function"==typeof t?t:O(+t),l):a},l.paddingBottom=function(t){return arguments.length?(c="function"==typeof t?t:O(+t),l):c},l.paddingLeft=function(t){return arguments.length?(s="function"==typeof t?t:O(+t),l):s},l},rt=function(t,n,e,r,i){var o,u,a=t.children,c=a.length,s=new Array(c+1);for(s[0]=u=o=0;o<c;++o)s[o+1]=u+=a[o].value;!function t(n,e,r,i,o,u,c){if(n>=e-1){var l=a[n];return l.x0=i,l.y0=o,l.x1=u,void(l.y1=c)}var h=s[n],f=r/2+h,p=n+1,d=e-1;for(;p<d;){var v=p+d>>>1;s[v]<f?p=v+1:d=v}f-s[p-1]<s[p]-f&&n+1<p&&--p;var y=s[p]-h,m=r-y;if(u-i>c-o){var g=(i*m+u*y)/r;t(n,p,y,i,o,g,c),t(p,e,m,g,o,u,c)}else{var _=(o*m+c*y)/r;t(n,p,y,i,o,u,_),t(p,e,m,i,_,u,c)}}(0,c,t.value,n,e,r,i)},it=function(t,n,e,r,i){(1&t.depth?Z:I)(t,n,e,r,i)},ot=function t(n){function e(t,e,r,i,o){if((u=t._squarify)&&u.ratio===n)for(var u,a,c,s,l,h=-1,f=u.length,p=t.value;++h<f;){for(c=(a=u[h]).children,s=a.value=0,l=c.length;s<l;++s)a.value+=c[s].value;a.dice?I(a,e,r,i,r+=(o-r)*a.value/p):Z(a,e,r,e+=(i-e)*a.value/p,o),p-=a.value}else t._squarify=u=tt(n,t,e,r,i,o),u.ratio=n}return e.ratio=function(n){return t((n=+n)>1?n:1)},e}(J);e.d(n,"cluster",function(){return u}),e.d(n,"hierarchy",function(){return c}),e.d(n,"pack",function(){return P}),e.d(n,"packSiblings",function(){return N}),e.d(n,"packEnclose",function(){return d}),e.d(n,"partition",function(){return C}),e.d(n,"stratify",function(){return V}),e.d(n,"tree",function(){return Q}),e.d(n,"treemap",function(){return et}),e.d(n,"treemapBinary",function(){return rt}),e.d(n,"treemapDice",function(){return I}),e.d(n,"treemapSlice",function(){return Z}),e.d(n,"treemapSliceDice",function(){return it}),e.d(n,"treemapSquarify",function(){return nt}),e.d(n,"treemapResquarify",function(){return ot})}])});

================================================
FILE: docs/dist/typescript/d3.d.ts
================================================
import { hierarchy, stratify, tree, treemap } from "d3-hierarchy";
import { select, selectAll } from "d3-selection";
import { zoom } from "d3-zoom";
declare const _default: {
    hierarchy: typeof hierarchy;
    stratify: typeof stratify;
    tree: typeof tree;
    treemap: typeof treemap;
    select: typeof select;
    selectAll: typeof selectAll;
    event: any;
    zoom: typeof zoom;
};
export default _default;


================================================
FILE: docs/dist/typescript/draw-links.d.ts
================================================
import { ITreeConfig } from "./typings";
interface ICoordinates {
    x: number;
    y: number;
}
export declare const generateLinkLayout: (s: ICoordinates, d: ICoordinates, treeConfig: ITreeConfig) => string;
export {};


================================================
FILE: docs/dist/typescript/index.d.ts
================================================
import { ITreeConfig } from "./typings";
export declare function create(userSettings: Partial<ITreeConfig>): {
    refresh: (data: any, newSettings?: Partial<ITreeConfig> | undefined) => void;
    clean: (keepConfig: boolean) => void;
};


================================================
FILE: docs/dist/typescript/initializeSVG.d.ts
================================================
import * as d3 from "d3-selection";
import { ITreeConfig } from "./typings";
export declare const initiliazeSVG: (treeConfig: ITreeConfig) => d3.Selection<SVGGElement, unknown, HTMLElement, any>;


================================================
FILE: docs/dist/typescript/link-enter.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
import { BaseType, Selection } from "d3-selection";
import { ITreeConfig } from "./typings";
export declare const drawLinkEnter: (link: Selection<BaseType, HierarchyPointNode<{}>, SVGGElement, {}>, computedTree: HierarchyPointNode<{}>, settings: ITreeConfig) => Selection<SVGPathElement, HierarchyPointNode<{}>, SVGGElement, {}>;


================================================
FILE: docs/dist/typescript/link-exit.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
import { BaseType, Selection } from "d3-selection";
import { ITreeConfig } from "./typings";
export declare const drawLinkExit: (link: Selection<BaseType, HierarchyPointNode<{}>, SVGGElement, {}>, settings: ITreeConfig) => void;


================================================
FILE: docs/dist/typescript/link-update.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
import { BaseType, Selection } from "d3-selection";
import { ITreeConfig } from "./typings";
export declare const drawLinkUpdate: (linkEnter: Selection<SVGPathElement, HierarchyPointNode<{}>, SVGGElement, {}>, link: Selection<BaseType, HierarchyPointNode<{}>, SVGGElement, {}>, settings: ITreeConfig) => void;


================================================
FILE: docs/dist/typescript/links/draw-links.d.ts
================================================
import { ITreeConfig } from "../typings";
interface ICoordinates {
    x: number;
    y: number;
}
export declare const generateLinkLayout: (s: ICoordinates, d: ICoordinates, treeConfig: ITreeConfig) => string;
export {};


================================================
FILE: docs/dist/typescript/links/link-enter.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
import { BaseType, Selection } from "d3-selection";
import { ExtendedHierarchyPointNode, ITreeConfig } from "../typings";
export declare const drawLinkEnter: (link: Selection<BaseType, HierarchyPointNode<{}>, SVGGElement, {}>, settings: ITreeConfig, nodes: ExtendedHierarchyPointNode[], oldNodes: ExtendedHierarchyPointNode[]) => Selection<SVGPathElement, HierarchyPointNode<{}>, SVGGElement, {}>;


================================================
FILE: docs/dist/typescript/links/link-exit.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
import { BaseType, Selection } from "d3-selection";
import { ExtendedHierarchyPointNode, ITreeConfig } from "../typings";
export declare const drawLinkExit: (link: Selection<BaseType, HierarchyPointNode<{}>, SVGGElement, {}>, settings: ITreeConfig, nodes: ExtendedHierarchyPointNode[], oldNodes: ExtendedHierarchyPointNode[]) => void;


================================================
FILE: docs/dist/typescript/links/link-update.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
import { BaseType, Selection } from "d3-selection";
import { ITreeConfig } from "../typings";
export declare const drawLinkUpdate: (linkEnter: Selection<SVGPathElement, HierarchyPointNode<{}>, SVGGElement, {}>, link: Selection<BaseType, HierarchyPointNode<{}>, SVGGElement, {}>, settings: ITreeConfig) => void;


================================================
FILE: docs/dist/typescript/node-enter.d.ts
================================================
import { BaseType, Selection } from "d3-selection";
import { ExtendedHierarchyPointNode, ITreeConfig } from "./typings";
export declare const placeNodeEnter: (node: Selection<BaseType, ExtendedHierarchyPointNode, SVGGElement, {}>, settings: ITreeConfig) => Selection<SVGGElement, ExtendedHierarchyPointNode, SVGGElement, {}>;


================================================
FILE: docs/dist/typescript/node-exit.d.ts
================================================
export declare const placeExit: (node: any, settings: any) => any;


================================================
FILE: docs/dist/typescript/nodes/node-enter.d.ts
================================================
import { BaseType, Selection } from "d3-selection";
import { ExtendedHierarchyPointNode, ITreeConfig } from "../typings";
export declare const drawNodeEnter: (node: Selection<BaseType, ExtendedHierarchyPointNode, SVGGElement, {}>, settings: ITreeConfig, nodes: ExtendedHierarchyPointNode[], oldNodes: ExtendedHierarchyPointNode[]) => Selection<SVGGElement, ExtendedHierarchyPointNode, SVGGElement, {}>;


================================================
FILE: docs/dist/typescript/nodes/node-exit.d.ts
================================================
import { BaseType, Selection } from "d3-selection";
import { ExtendedHierarchyPointNode, ITreeConfig } from "../typings";
export declare const drawNodeExit: (node: Selection<BaseType, ExtendedHierarchyPointNode, SVGGElement, {}>, settings: ITreeConfig, nodes: ExtendedHierarchyPointNode[], oldNodes: ExtendedHierarchyPointNode[]) => void;


================================================
FILE: docs/dist/typescript/nodes/node-update.d.ts
================================================
import { BaseType, Selection } from "d3-selection";
import { ExtendedHierarchyPointNode, ITreeConfig } from "../typings";
export declare const drawNodeUpdate: (nodeEnter: Selection<SVGGElement, ExtendedHierarchyPointNode, SVGGElement, {}>, node: Selection<BaseType, ExtendedHierarchyPointNode, SVGGElement, {}>, settings: ITreeConfig) => void;


================================================
FILE: docs/dist/typescript/prepare-data.d.ts
================================================
import { HierarchyNode } from "d3-hierarchy";
import { ITreeConfig } from "./typings";
export declare const generateNestedData: (data: any, treeConfig: ITreeConfig) => HierarchyNode<any>;
export declare const generateBasicTreemap: (treeConfig: ITreeConfig) => import("d3-hierarchy").TreeLayout<unknown>;


================================================
FILE: docs/dist/typescript/services.d.ts
================================================
export declare const getAreaSize: (htmlId: string) => {
    areaWidth: number;
    areaHeight: number;
};


================================================
FILE: docs/dist/typescript/typings.d.ts
================================================
import { HierarchyPointNode } from "d3-hierarchy";
export interface ITreeConfig {
    htmlId: string;
    idKey: string;
    relationnalField: string;
    hasFlatData: boolean;
    nodeWidth: number;
    nodeHeight: number;
    mainAxisNodeSpacing: number | "auto";
    renderNode: (node: any) => string | null;
    linkShape?: "quadraticBeziers" | "curve" | "orthogonal" | "";
    linkColor: (node: any) => string;
    linkWidth: (node: any) => number;
    onNodeClick: (node: any) => void;
    onNodeMouseEnter: (node: any) => void;
    onNodeMouseLeave: (node: any) => void;
    isHorizontal: boolean;
    hasPanAndZoom: boolean;
    duration: number;
    marginTop: number;
    marginBottom: number;
    marginLeft: number;
    marginRight: number;
    secondaryAxisNodeSpacing: number;
}
export interface ExtendedHierarchyPointNode extends HierarchyPointNode<{}> {
    x0?: number;
    y0?: number;
}


================================================
FILE: docs/dist/typescript/utils.d.ts
================================================
import { ExtendedHierarchyPointNode, ITreeConfig } from "./typings";
export declare const getAreaSize: (
  htmlId: string
) => {
  areaWidth: number;
  areaHeight: number;
};
declare type Result = ExtendedHierarchyPointNode & {
  x0: number;
  y0: number;
};
export declare const getFirstDisplayedAncestor: (
  ghostNodes: ExtendedHierarchyPointNode[],
  viewableNodes: ExtendedHierarchyPointNode[],
  id: string
) => Result;
export declare const setNodeLocation: (
  xPosition: number,
  yPosition: number,
  settings: ITreeConfig
) => string;
export {};


================================================
FILE: docs/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
    <meta name="description" content="">

    <title>Transient Execution Attacks</title>

    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">

    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script defer src="https://use.fontawesome.com/releases/v5.0.2/js/all.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

    <script src="dist/index.js"></script>
    <script src="dist/FileSaver.min.js"></script>
    <script src="bibliography.js"></script>
    <script src="js/filter.js"></script>
    <script src="js/export.js"></script>
    <script src="tree.js"></script>

    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>

<body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-lg-9 col-md-9 col-sm-9">
            <form onsubmit="filter(); return false;">
            <div class="form-group">
                <div class="custom-control custom-checkbox custom-control-inline">
                    <input type="checkbox" class="custom-control-input" id="toggleSpectre" checked>
                    <label class="custom-control-label" for="toggleSpectre">Spectre</label>
                </div>
                <div class="custom-control custom-checkbox custom-control-inline">
                    <input type="checkbox" class="custom-control-input" id="toggleMeltdown" checked>
                    <label class="custom-control-label" for="toggleMeltdown">Meltdown</label>
                </div>

                <div class="button-group custom-control-inline">
                    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">Buffer</button>
                    <ul class="dropdown-menu">
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleL1" checked>
                                <label class="custom-control-label" for="toggleL1">L1 cache</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleLFB" checked>
                                <label class="custom-control-label" for="toggleLFB">Line fill buffer</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleSB" checked>
                                <label class="custom-control-label" for="toggleSB">Store buffer</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleLP" checked>
                                <label class="custom-control-label" for="toggleLP">Load ports</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleREG" checked>
                                <label class="custom-control-label" for="toggleREG">CPU registers</label>
                            </div>
                        </a></li>
                       <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleMEM" checked>
                                <label class="custom-control-label" for="toggleMEM">Memory</label>
                            </div>
                        </a></li>
                    </ul>
                </div>

                <div class="button-group custom-control-inline">
                    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">Vendor</button>
                    <ul class="dropdown-menu">
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleIntel" checked>
                                <label class="custom-control-label" for="toggleIntel">Intel</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleARM" checked>
                                <label class="custom-control-label" for="toggleARM">ARM</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleAMD" checked>
                                <label class="custom-control-label" for="toggleAMD">AMD</label>
                            </div>
                        </a></li>
                        <!--
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleIBM" checked>
                                <label class="custom-control-label" for="toggleIBM">IBM</label>
                            </div>
                        </a></li>
                        -->
                    </ul>
                </div>

                <div class="button-group custom-control-inline">
                    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">More filters</button>
                    <ul class="dropdown-menu">
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleTodo">
                                <label class="custom-control-label" for="toggleTodo">Unexplored</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleFails">
                                <label class="custom-control-label" for="toggleFails">Non-working</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleWorking" checked>
                                <label class="custom-control-label" for="toggleWorking">Working</label>
                            </div>
                        </a></li>
                        <hr>
                        <!--
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="togglePaper" checked>
                                <label class="custom-control-label" for="togglePaper">Academic paper</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleNoPaper" checked>
                                <label class="custom-control-label" for="toggleNoPaper">No academic paper</label>
                            </div>
                        </a></li>
                        <hr>
                        -->
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="togglePoC" checked>
                                <label class="custom-control-label" for="togglePoC">With PoC</label>
                            </div>
                        </a></li>
                        <li>&nbsp;<a>
                            <div class="custom-control custom-checkbox custom-control-inline">
                                <input type="checkbox" class="custom-control-input" id="toggleNoPoC" checked>
                                <label class="custom-control-label" for="toggleNoPoC">Without PoC</label>
                            </div>
                        </a></li>

                    </ul>
                </div>

                <div class="custom-control-inline">
                    <input type="text" class="form-control" placeholder="Search" aria-label="Search" aria-describedby="basic-addon2" id="search">
                    <div class="input-group-append">
                        <button class="btn btn-outline-secondary" type="submit">Search</button>
                    </div>
                </div>


                <div class="button-group custom-control-inline pull-right">
                    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">Export</button>
                    <ul class="dropdown-menu">
                        <li><a href="#" class="dropdown-item" onclick="exportSVG()">SVG</a></li>
                        <li><a href="#" class="dropdown-item" onclick="exportTikz()">TikZ</a></li>
                        <li><a href="#" class="dropdown-item" onclick="exportDOT()">DOT</a></li>
                    </ul>
                </div>

                <!-- Modal activation button -->
                <div class="button-group custom-control-inline">
                      <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#cite-modal">Cite</button>
                </div>

                <div class="button-group custom-control-inline align-bottom">
                <a class="github-button" href="https://github.com/IAIK/transientfail" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star IAIK/transientfail on GitHub">Star</a>
                </div>

                <div class="button-group custom-control-inline align-bottom">
                <a class="github-button" href="https://github.com/IAIK/transientfail/issues" data-size="large" data-show-count="true" aria-label="Issue IAIK/transientfail on GitHub">Issue</a>
                </div>

                <!-- Modal -->
                <div class="modal fade" id="cite-modal" tabindex="1" role="dialog" aria-labelledby="cite-modal" aria-hidden="true">
                  <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
                    <div class="modal-content">
                      <div class="modal-header">
                        <h5 class="modal-title" id="ModalLongTitle">Bibtex Entry</h5>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                          <span aria-hidden="true">&times;</span>
                        </button>
                      </div>
                      <div class="modal-body">
                        @inproceedings{Canella2019extended,<br>
                        &nbsp;&nbsp;title = {{A Systematic Evaluation of Transient Execution Attacks and Defenses}},<br>
                        &nbsp;&nbsp;author = {Canella, Claudio and Van Bulck, Jo and Schwarz, Michael and Lipp, Moritz and von Berg, Benjamin and Ortner, Philipp and Piessens, Frank and Evtyushkin, Dmitry and Gruss, Daniel},<br>
                        &nbsp;&nbsp;booktitle = {USENIX Security Symposium},<br>
                        &nbsp;&nbsp;year = {2019},<br>
                        &nbsp;&nbsp;note = {extended classification tree at https://transient.fail/},<br>
                        &nbsp;}<br>
                      </div>
                      <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                      </div>
                    </div>
                  </div>
                </div>
            </div>
            </form>
            <div id="tree" style="height:90vh;width:100%;z-index:0"></div>
            </div>
            <div class="col-lg-3 col-md-3 col-sm-3">
                <div class="card">
                    <div class="card-header">
                        Details
                    </div>
                    <div class="card-body">
                        <h5 class="card-title" id="dbox_title"></h5>
                        <div id="dbox_img" align="center" style="display: none;"></div>
                        <p class="card-text" id="dbox">Click on a node for more information.</p>
                        <p class="card-text" id="dbox_todo" style="display: none;"></p>
                    </div>
                    <ul class="list-group list-group-flush">
                        <li class="list-group-item" id="dbox_h_src" style="display: none;"><b>References</b><br><div id="dbox_src"></div></li>
                        <li class="list-group-item" id="dbox_h_affected" style="display: none;"><b>Known to be affected</b><br><div id="dbox_affected"></div></li>
                        <li class="list-group-item" id="dbox_h_aka" style="display: none;"><b>Also known as</b><br><div id="dbox_aka"></div></li>
                        <li class="list-group-item" id="dbox_h_cve" style="display: none;"><b>CVE</b><br><div id="dbox_cve"></div></li>
                        <li class="list-group-item" id="dbox_h_poc" style="display: none;"><b>PoC</b><br><div id="dbox_poc"></div></li>
                    </ul>

                </div>
            </div>
        </div>
    </div>
<footer class="site-footer container-fluid"><p class="float-left"><a href="https://github.com/IAIK/transientfail" target="_blank">Proof-of-Concept Repository</a></p><p class="float-right"> &copy; 2020 Graz University of Technology. All Rights Reserved. &middot; <a href="https://www.tugraz.at/en/about-this-page/legal-notice" target="_blank">Legal Notice</a></p></footer>

<script>
    function replaceStr(str, replaceWhat, replaceTo){
        replaceWhat = replaceWhat.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
        var re = new RegExp(replaceWhat, 'gi');
        return str.replace(re, replaceTo);
    }

    function highlightSearch(input, term) {
        if(term === undefined || term == "" || term.trim().length == 0) return input;
        if(typeof(input) == "string") {
            return replaceStr(input, term, '<span class="highlight">$&</span>');
        }
        if(typeof(input) == "object") {
            if(Array.isArray(input)) {
                var new_input = [];
                for(let element of input) {
                    new_input.push(highlightSearch(element, term));
                }
                return new_input;
            } else {
                var new_input = {};
                for(let key of Object.keys(input)) {
                    if(key == "url") new_input[key] = input[key];
                    else new_input[key] = highlightSearch(input[key], term); 
                }
                return new_input;
            }
        }
        return input;
    }

    function showList(list, target, content) {
        if(list !== undefined && list.length > 0) {
            $(target).show();
            var clist = "<small><ul>";
            for(var s in list) {
                clist += "<li><b>";
                if(list[s].url !== undefined) {
                    clist += "<a href=\"" + list[s].url + "\" target='_blank'>";
                }
                clist += list[s].title||"";
                if(list[s].url !== undefined) {
                    clist += "</a>";
                }
                clist += "</b>";
                if(list[s].author !== undefined) {
                    clist += "<br>" + list[s].author;
                }
                if(list[s].conference !== undefined) {
                    clist += " (<i>" + list[s].conference + "</i>)";
                }
                if(typeof(list[s]) === "string") {
                    clist += list[s];
                }
                clist += "</li>";
            }
            clist += "</small></ul>";
            $(content).html(clist);
        } else {
            $(target).hide();
        }
    }

    function popup(node) {
        var searchterm = $("#search").val();
    
        $("#dbox").html(highlightSearch(node.description, searchterm));
        var title = highlightSearch(node.title, searchterm);
        if (node.alias) title += " <i>(aka " + highlightSearch(node.alias, searchterm) + ")</i>";
        $("#dbox_title").html(title);

        if (node.img)
        {
            $("#dbox_img").html("<img style=\"max-height:150px; max-width:95%;\" src=\"images/" + node.img + "\"/><p></p>");
            $("#dbox_img").show();
        }
        else
        {
            $("#dbox_img").hide();
        }

        if (node.todo)
        {
            $("#dbox_todo").html("<b>Future work</b><br>" + highlightSearch(node.todo, searchterm));
            $("#dbox_todo").show();
        }
        else
        {
            $("#dbox_todo").hide();
        }

        showList(highlightSearch(node.sources, searchterm), "#dbox_h_src", "#dbox_src");
        showList(highlightSearch(node.names, searchterm), "#dbox_h_aka", "#dbox_aka");
        showList(highlightSearch(node.cve, searchterm), "#dbox_h_cve", "#dbox_cve");
        showList(highlightSearch(node.poc, searchterm), "#dbox_h_poc", "#dbox_poc");
        showList(highlightSearch(node.affects, searchterm), "#dbox_h_affected", "#dbox_affected");
        
    }
    
    function nodeTemplate(node) {
        var html = "<div class='box node' style='height:" + node.settings.nodeHeight + "px; width:" + node.settings.nodeWidth + "px; background-color:" + node.data.color + ";' id='db" + node.data.id + "'>";
        html += "<div><strong>" + node.data.title + "</strong></div>";
        if(node.data.text_top !== undefined) {
            html += "<div class='desc_top'>" + node.data.text_top + "</div>";
        }
        if(node.data.text_bottom !== undefined) {
            html += "<div class='desc_bottom'>" + node.data.text_bottom + "</div>";
        }
        html += "</div>";
        return html;
    }

    var tree = Treeviz.create({
        htmlId: "tree",
        idKey: "id",
        hasFlatData: true,
        relationnalField: "father",
        hasPanAndZoom: true,
        nodeWidth: 180,
        nodeHeight: 25,
        mainAxisNodeSpacing: 1.4,
        secondaryAxisNodeSpacing: 1.05,
        isHorizontal: true,
        renderNode: nodeTemplate,
        linkWidth: (nodeData) => 4,
        linkShape: "curve",
        linkColor: (nodeData) => "#B0BEC5" ,
        onNodeClick: (nodeData) => popup(nodeData.data),
    });
    
    tree.refresh(data);

    $("#toggleMeltdown").click(filter);
    $("#toggleSpectre").click(filter);

    buildIndex();
    filter();
    

    var options = [];
    $( '.dropdown-menu a' ).on( 'click', function( event ) {
        var $target = $( event.currentTarget ),
            val = $target.attr( 'data-value' ),
            $inp = $target.find( 'input' ),
            idx;

        if ( ( idx = options.indexOf( val ) ) > -1 ) {
            options.splice( idx, 1 );
            setTimeout( function() { $inp.prop( 'checked', false ); filter();}, 0);
        } else {
            options.push( val );
            setTimeout( function() { $inp.prop( 'checked', true ); filter(); }, 0);
        }
        $( event.target ).blur();
        return false;
    });

    
</script>
<script async defer src="https://buttons.github.io/buttons.js"></script>
</body>

</html>


================================================
FILE: docs/js/export.js
================================================
function getTranslation(obj) {
    if(obj.transform === undefined) return [0,0];
    if(obj.transform.baseVal === undefined) return [0,0];
    for(let op of obj.transform.baseVal) {
        if(op.type == 2) {
            return [op.matrix.e, op.matrix.f];
        }
    }
    return [0,0];
}

function exportTikz() {
    var header = "\\begin{tikzpicture}[node distance=0.9cm,transform shape,scale=0.55]\n";
    header += "\\tikzstyle{small}  = [rectangle, rounded corners, minimum width=2.5cm, minimum height=.6cm,text centered, draw=black, fill=white]\n";
    header += "\\tikzstyle{large}  = [rectangle, rounded corners, minimum width=3.8cm, minimum height=.6cm,text centered, draw=black, fill=white]\n";
    header += "\\tikzstyle{works}  = [fill=red!30!white,thick,font=\\bfseries]\n";
    header += "\\tikzstyle{fails}  = [densely dashed,pattern=north west lines,pattern color=green!60!white]\n";
    header += "\\tikzstyle{todo}   = [fill=red!30!yellow,thick,font=\\bfseries]\n";
    header += "\\tikzstyle{group}  = [fill=blue!20!white]\n";
    header += "\\tikzstyle{arrow}  = [thick,->,>=stealth,in=180,out=0,looseness=0.6]\n";
    header += "\\tikzstyle{arrow_regular}  = [thick,->,>=stealth]\n";

    header += "\\usetikzlibrary{shapes.geometric, arrows, patterns}\n";

    var content = "";
    
    var arrows = "";
    for(let node of $("#tree svg g.node")) {
        var pos = getTranslation(node);
        var id = $(node).find(".box").prop("id").substr(2);
        var node_obj = index[id];
        var name = node_obj.title;
        
        var style = "works";
        if(node_obj.color == color.group) style = "group";
        else if(node_obj.color == color.fails) style = "fails";
        else if(node_obj.color == color.todo) style = "todo";
        
        content += "\\node[large," + style + "] (node" + id + ") at (" + ((pos[0] / 40.0) * 0.9) + "," + (-pos[1] / 40.0) + ") {" + name + "};\n";
        
        if(node_obj.father !== null) {
            arrows += "\\draw (node" + index[node_obj.father].id + ".east) edge[arrow_regular] (node" + id +".west);\n";
        }
        
    }
    
    content += arrows;

    var footer = "\\end{tikzpicture}\n";
    
    var tikz = header + content + footer;
    var blob = new Blob([ tikz ], {type:"text/x-pgf;charset=utf-8"});
    window.saveAs(blob, "tree.tikz");
}

function exportSVG() {
    var header = '<?xml version="1.0" standalone="no"?>\n';
    
    var corr_pos = getTranslation($("#tree svg g g")[0]);

    var empty_svg = $("#tree svg").clone().html("").get()[0];
    empty_svg.setAttribute("transform", "translate(" + (corr_pos[0]) + "," + (corr_pos[1]) +")");
    empty_svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
    
    var root = $("#tree svg")[0];
    empty_svg.setAttribute("transform", "");
    
    var content = empty_svg.outerHTML.replace("</svg>", "");
    content += "<g>";
    
    var path_count = 0;
    for(let node of $("#tree svg g")) {
        var cn = node.className.baseVal;

        if(cn === undefined || cn != "node") {
            path_count++;
            if(path_count == 1) continue;
            content += node.outerHTML;
        } else {
            var name = $(node).find("strong").text();
            var enode = $(node).clone();
            
            var box = $(node).find("div.box")[0];
            var bg = (box !== undefined ? box.style.backgroundColor : "white");
            
            enode.html('<svg width="180" height="25"><rect x="0" y="0" rx="5" ry="5" width="180" height="25" fill="' + bg + '" /><text x="50%" y="50%" alignment-baseline="middle" text-anchor="middle" font-weight="bold">' + name + '</text></svg>');
            
            var jenode = enode.get()[0];
            
            pos = getTranslation(jenode); 
            jenode.setAttribute("transform", "translate(" + (pos[0] + corr_pos[0]) + "," + (pos[1] + corr_pos[1]) +")");
            content += jenode.outerHTML;
        }
        
    }
    
    var footer = "</g></svg>";
    var svg = header + content + footer;
    var blob = new Blob([ svg ], {type:"image/svg+xml;charset=utf-8"});
    window.saveAs(blob, "tree.svg");

}

function exportDOT() {
    var header = "digraph tree {\n";

    var content = "rankdir=LR;\n";

    var defined = [];

    var makeUnique = (x) => x.title.replace(/[^A-Za-z0-9]*/g, "") + x.id;

    var arrows = "";
    for(let node of $("#tree svg g.node")) {
        var id = $(node).find(".box").prop("id").substr(2);
        var node_obj = index[id];
        var name = node_obj.title;
        var unique = makeUnique(node_obj);

        var shape = "box";
        if(node_obj.color == color.group) shape = "oval";
        else if(node_obj.color == color.fails) shape = "box";
        else if(node_obj.color == color.todo) shape = "box";

        if(defined.indexOf(unique) == -1) {
            content += unique + " [label=\"" + name + "\",shape=" + shape + "];\n";
            defined.push(unique);
        }

        if(node_obj.father !== null) {
            var funique = makeUnique(index[node_obj.father]);
            content += funique + " -> " + unique + ";\n";
        }

    }

    var footer = "}\n";

    var tikz = header + content + footer;
    var blob = new Blob([ tikz ], {type:"text/x-dot;charset=utf-8"});
    window.saveAs(blob, "tree.dot");
}



================================================
FILE: docs/js/filter.js
================================================
var index = {};
function buildIndex() {
    index = {};
    for(let node of data) {
        if(index[node.id] !== undefined) {
            alert("Duplicate ID " + node.id + ": " + node.title + " and " + index[node.id].title);
        }
        index[node.id] = node;
    }
}

function hasParent(node, parent_id) {
    var parent = node;
    while(parent !== undefined && parent.father != null) {
        parent = index[parent.father];
        if(parent === undefined) return false;
        if(parent.id == parent_id) return true;
    }
    return false;
}

function hasChild(node, child_id) {
    var child = index[child_id];
    return hasParent(child, node.id);
}

function toggleMeltdownSpectre(meltdown, spectre, filterInclude) {
    current_data = [];
    for(let node of data) {
        var is_meltdown = hasParent(node, 3) || node.id == 3;
        var is_spectre = hasParent(node, 2) || node.id == 2;
        if((spectre && is_spectre) || (meltdown && is_meltdown) || (!is_meltdown && !is_spectre)) {
            if(filterInclude(node)) {
                current_data.push(node);
            }
        }
    }
    // remove empty groups
    var removed;
    do {
        removed = 0;
        var has_children = {};
        for(let node of current_data) {
            if(node.father !== null) has_children[node.father] = true;
        }
        var cleaned_data = [];
        for(let node of current_data) {
            if(has_children[node.id] !== undefined || node.color != color.group) {
                cleaned_data.push(node);
            } else {
                removed++;
            }
        }    
        current_data = cleaned_data;
    } while(removed);
    
    tree.refresh(current_data);
}

function recursiveFlatten(input) {
    result = "";
    if(typeof(input) == "string") {
        result += input + " ";
    }
    else if(typeof(input) == "object") {
        if(Array.isArray(input)) {
            for(let element of input) {
                result += recursiveFlatten(element) + " ";
            }
        } else {
            for(let key of Object.keys(input)) {
                result += recursiveFlatten(input[key]) + " ";
            }
        }
    }
    return result;
}

function filter() {
    var show_meltdown = $("#toggleMeltdown").prop("checked");
    var show_spectre = $("#toggleSpectre").prop("checked");
    var show_todo = $("#toggleTodo").prop("checked");
    var show_fails = $("#toggleFails").prop("checked");
    var show_working = $("#toggleWorking").prop("checked");

    // var show_paper = $("#togglePaper").prop("checked");
    // var show_nopaper = $("#toggleNoPaper").prop("checked");

    var show_l1 = $("#toggleL1").prop("checked");
    var show_lfb = $("#toggleLFB").prop("checked");
    var show_sb = $("#toggleSB").prop("checked");
    var show_lp = $("#toggleLP").prop("checked");
    var show_reg = $("#toggleREG").prop("checked");
    var show_mem = $("#toggleMEM").prop("checked");

    var show_intel = $("#toggleIntel").prop("checked");
    var show_arm = $("#toggleARM").prop("checked");
    var show_amd = $("#toggleAMD").prop("checked");
    //var show_ibm = $("#toggleIBM").prop("checked");

    var search_term = $("#search").val();    
    var has_search = search_term.trim().length > 0;
    var show_poc = $("#togglePoC").prop("checked");
    var show_nopoc = $("#toggleNoPoC").prop("checked");
    var search_popup = 0;
    
    toggleMeltdownSpectre(show_meltdown, show_spectre, function(node) {
        var is_leaf = node.color != color.group && node.color != color.root;
        
        if(node.todo !== undefined && node.color == color.todo && !show_todo) 
            return false;
        if(node.color == color.fails && !show_fails)
            return false;
        if(node.color == color.works && !show_working)
            return false;
        
        /*
        var has_paper = false;
        if(node.sources !== undefined) {
            for(let s of node.sources) {
                if(s.conference !== undefined) {
                    has_paper = true;
                    break;
                }
            }
        }
        if(has_paper && !show_paper && is_leaf)
            return false;
        if(!has_paper && !show_nopaper && is_leaf)
            return false;
        */
        
        if(node.poc !== undefined && node.poc.length > 0 && is_leaf && !show_poc) 
            return false;
        if((node.poc === undefined || node.poc.length == 0) && is_leaf && !show_nopoc) 
            return false;

        var include = false;
        if(node.affects !== undefined) {
            for(let a of node.affects) {
                if(a.title === "Intel" && show_intel) {
                    include = true;
                    break;
                }
                if(a.title === "AMD" && show_amd) {
                    include = true;
                    break;
                }
                if(a.title === "ARM" && show_arm) {
                    include = true;
                    break;
                }
                /*if(a.title === "IBM" && show_ibm) {
                    include = true;
                    break;
                }*/
            }
            if (!include) return false;
        }

        var has_l1 = node.title.indexOf("-L1") != -1;
        var has_lfb = node.title.indexOf("-LFB") != -1;
        var has_sb = node.title.indexOf("-SB") != -1;
        var has_lp = node.title.indexOf("-LP") != -1;
        var has_reg = node.title.indexOf("-REG") != -1;
        var has_mem = !has_l1 && !has_lfb && !has_sb && !has_lp && !has_reg && (node.color == color.works);
        
        if(has_l1 && is_leaf && !show_l1)
            return false;
        if(has_lfb && is_leaf && !show_lfb)
            return false;
        if(has_sb && is_leaf && !show_sb)
            return false;
        if(has_lp && is_leaf && !show_lp)
            return false;
        if(has_reg && is_leaf && !show_reg)
            return false;
        if(has_mem && is_leaf && !show_mem)
            return false;
         
        if(has_search && is_leaf)
        {
            if(node.description.toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&
               node.title.toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&   
               (node.alias||"").toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&
               (node.affects||[]).map(x => x.title||x).join(" ").toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&
               (node.names||[]).map(x => x.title||x).join(" ").toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&
               recursiveFlatten(node.sources).toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&
               (node.cve||[]).map(x => x.title||x).join(" ").toLowerCase().indexOf(search_term.toLowerCase()) == -1 &&
               (node.poc||[]).map(x => x.title||x).join(" ").toLowerCase().indexOf(search_term.toLowerCase()) == -1
            )
                return false;
            /* automatically popup the first leaf hit when searching */
            else if(!search_popup)
            {
                search_popup = 1;
                popup(node);
            }
        }
        
        return true;
    }
    );
} 


================================================
FILE: docs/js/tree.js
================================================
$(document).ready(function(e) {
    $('[data-toggle="popover"]').popover();
    $('[data-toggle="tooltip"]').tooltip();
});

$(document).on('click', '[data-toggle="lightbox"]', function(event) {
                event.preventDefault();
                $(this).ekkoLightbox();
            });



================================================
FILE: docs/tree.js
================================================
var color = {
    root: "#DDDDDD",
    group: "#BBBBFF",
    works: "#FF5722",
    fails: "#8BC34A",
    todo: "#FFA500"
}

var data = [{
        id: 1,
        title: "Transient cause",
        father: null,
        img: "transient-overview.svg",
        description: "We split the tree based on the cause for entering transient execution. If the cause is handling a fault or a microcode assist upon instruction retirement, we have a Meltdown-type attack. If the cause is a control or data flow prediction, we have a Spectre-type attack.",
        sources: [
            sources["Canella2018"],
            sources["Kocher2019"],
            sources["Lipp2018"]
        ],
        color: color.root
    },
    {
        id: 2,
        title: "Spectre-type",
        img: "spectre-root.svg",
        text_top: "prediction",
        description: "Spectre exploits a performance optimization in modern CPUs. Instead of waiting for the correct resolution of a branch, the CPU tries to predict the most likely outcome of the branch and starts transiently executing along the predicted path. Upon resolving the branch, the CPU discards the results of the transient execution if the prediction was wrong but does not revert changes in the microarchitecture. The prediction is based on events in the past, allowing an attacker to mistrain the predictor to leak data through the microarchitecture that should normally not be accessible to the attacker.",
        sources: [
            sources["Kocher2019"],
            sources["Canella2018"]
        ],
        father: 1,
        color: color.group
    },
    {
        id: 3,
        title: "Meltdown-type",
        img: "meltdown-root.svg",
        text_bottom: "fault/assist",
        father: 1,
        description: "Meltdown exploits the fact that exceptions are only raised (i.e., become architecturally visible) upon the retirement of the faulting instruction. In some microarchitectures, this property allows transient instructions ahead in the pipeline to compute on unauthorized results of the instruction that is about to suffer a fault. The CPU's in-order instruction-retirement mechanism takes care to discard any architectural effects of such computations, but secrets may leak through microarchitectural covert channels.<p/>We further classify Meltdown-type attacks based on the fault condition. A first category of <i>architectural faults</i> iterates over all possible Intel x86 exception types. A second category considers so-called <i>microarchitectural faults</i>, which are never visible at the architectural level, by branching on different conditions that provoke microcode assists.<p/>The resulting unambiguous naming scheme results in Meltdown-type attack leaves of the form “Meltdown-TC-BUF”, where TC denotes the transient cause (specific exception type or microcode assist) and BUF denotes the microarchitectural buffer responsible for the leakage.",
        sources: [
            sources["Lipp2018"],
            sources["VanBulck2018"],
            sources["VanSchaik2019"],
            sources["Canella2019"],
            sources["Schwarz2019"],
            sources["Canella2018"],
        ],
        color: color.group
    },
    {
        id: 4,
        title: "Spectre-PHT",
        alias: "Spectre v1",
        img: "spectre.svg",
        text_top: "microarchitectural buffer",
        father: 2,
        description: "Kocher et al. first introduced Spectre-PHT, an attack that poisons the Pattern History Table (PHT) to mispredict the direction (taken or not-taken) of conditional branches. Depending on the underlying microarchitecture, the PHT is accessed based on a combination of virtual address bits of the branch instruction plus a hidden Branch History Buffer (BHB) that accumulates global behavior for the last N branches on the same physical core.",
        sources: [
            sources["Canella2018"],
            sources["Kocher2019"],
            sources["Evtyushkin2018"],
            sources["Fog"]
        ],
        names: [
            {
                title: "Spectre variant 1",
                url: "https://spectreattack.com/"
            },
            {
                title: "Spectre variant 1.1",
                url: "https://arxiv.org/pdf/1807.03757.pdf"
            },
            {
                title: "Bounds Check Bypass (BCB)",
                url: "https://software.intel.com/security-software-guidance/api-app/sites/default/files/336983-Intel-Analysis-of-Speculative-Execution-Side-Channels-White-Paper.pdf"
            }
        ],
        cve: [{
            title: "CVE-2017-5753",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5753"
        }],
        poc: [{
                title: "https://github.com/IAIK/transientfail",
                url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT"
            },
            {
                title: "https://github.com/google/safeside",
                url: "https://github.com/google/safeside/tree/master/demos"
            }
        ],
        color: color.group
    },
    {
        id: 5,
        title: "Spectre-BTB",
        alias: "Spectre v2",
        img: "spectre.svg",
        father: 2,
        description: "In Spectre-BTB, the attacker poisons the Branch Target Buffer (BTB) to steer the transient execution to a mispredicted branch target. For direct branches, the CPU indexes the BTB using a subset of the virtual address bits of the branch instruction to yield the predicted jump target. For indirect branches, CPUs use different mechanisms, which may take into account global branching history accumulated in the BHB when indexing the BTB. We refer to both types as Spectre-BTB.<p>Contrary to Spectre-PHT, where transient instructions execute along a restricted mispredicted path, Spectre-BTB enables redirection of transient control flow to an arbitrary destination. Adopting established techniques from return-oriented programming (ROP) attacks, but abusing BTB poisoning instead of application-level vulnerabilities, selected code “gadgets” found in the victim address space may be chained together to construct arbitrary transient instruction sequences. Hence, while the success of Spectre-PHT critically relies on unintended leakage along the mispredicted code path, ROP-style gadget abuse in Spectre-BTB enables more direct construction of covert channels that expose secrets from the transient domain.",
        sources: [
            sources["Kocher2019"],
            sources["Canella2018"]
        ],
        names: [
            {
                title: "Spectre variant 2",
                url: "https://spectreattack.com/"
            },
            {
                title: "Branch Target Injection (BTI)",
                url: "https://software.intel.com/security-software-guidance/api-app/sites/default/files/336983-Intel-Analysis-of-Speculative-Execution-Side-Channels-White-Paper.pdf"
            }

        ],
        cve: [{
            title: "CVE-2017-5715",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5715"
        }],
        poc: [{
                title: "https://github.com/IAIK/transientfail",
                url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB"
            },
            {
                title: "https://github.com/google/safeside",
                url: "https://github.com/google/safeside/tree/master/demos"
            }
        ],
        color: color.group
    },
    {
        id: 6,
        title: "Spectre-RSB",
        alias: "ret2spec",
        img: "spectre.svg",
        father: 2,
        description: "Maisuradze and Rossow and Koruyeh et al. introduced a Spectre variant that exploits the Return Stack Buffer (RSB). The RSB is a small per-core microarchitectural buffer that stores the virtual addresses following the N most recent <code>call</code> instructions. When encountering a <code>ret</code> instruction, the CPU pops the topmost element from the RSB to predict the return flow.<p>Misspeculation arises whenever the RSB layout diverges from the actual return addresses on the software stack. Such disparity for instance naturally occurs when restoring kernel/enclave/user stack pointers upon protection domain switches.<p>Furthermore, same-address-space adversaries may explicitly overwrite return addresses on the software stack, or transiently execute <code>call</code> instructions which update the RSB without committing architectural effects. This may allow untrusted code executing in a sandbox to transiently divert return control flow to interesting code gadgets outside of the sandboxed environment.<p>Due to the fixed-size nature of the RSB, a special case of misspeculation occurs for deeply nested function calls. Since the RSB can only store return addresses for the N most recent calls, an underfill occurs when the software stack is unrolled. In this case, the RSB can no longer provide accurate predictions. Starting from Skylake, Intel CPUs use the BTB as a fallback, thus allowing Spectre-BTB-style attacks triggered by <code>ret</code> instructions.",
        sources: [
            sources["Maisuradze2018"],
            sources["Koruyeh2018"],
            sources["Canella2018"]
        ],
        names: [
            {
                title: "ret2spec",
                url: "https://arxiv.org/pdf/1807.10364.pdf",
            },
            {
                title: "SpectreRSB",
                url: "https://www.usenix.org/conference/woot18/presentation/koruyeh",
            },
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB"
        }],
        cve: [{
            title: "CVE-2017-5715",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5715"
        }],
        color: color.group
    },
    {
        id: 7,
        title: "Spectre-STL",
        alias: "Spectre v4",
        img: "spectre.svg",
        father: 2,
        description: "Speculation in modern CPUs is not restricted to control flow but also includes predicting dependencies in the data flow. A common type, a Store To Load (STL) dependency, requires that a memory load shall not be executed before all preceding stores writing to the same location have completed. However, even before the addresses of all prior stores in the pipeline are known, the CPU's memory disambiguator may predict which loads can already be executed speculatively. <p>When the disambiguator predicts that a load does not have a dependency on a prior store, the load reads data from the L1 data cache. When the addresses of all prior stores are known, the prediction is verified. If any overlap is found, the load and all following instructions are re-executed. </p><p>Jann Horn (Google Project Zero) showed how mispredictions by the memory disambiguator could be abused to speculatively bypass store instructions. Like previous attacks, Spectre-STL adversaries rely on an appropriate transient instruction sequence to leak unsanitized stale values via a microarchitectural covert channel. Furthermore, operating on stale pointer values may speculatively break type and memory safety guarantees in the transient execution domain. </p>",
        sources: [
            sources["Horn2018"],
            sources["Canella2018"]
        ],
        poc: [{
                title: "https://github.com/IAIK/transientfail",
                url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/STL"
            },
            {
                title: "https://github.com/google/safeside",
                url: "https://github.com/google/safeside/tree/master/demos"
            }
        ],
        names: [
            {
                title: "Spectre variant 4",
                url: "https://software.intel.com/security-software-guidance/software-guidance/speculative-store-bypass"
            },
            {
                title: "Speculative Store Bypass (SSB)",
                url: "https://software.intel.com/security-software-guidance/software-guidance/speculative-store-bypass"
            },
        ],
        cve: [{
            title: "CVE-2018-3639",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-3639"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/speculative-store-bypass"
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            },
        ],
        color: color.works
    },
    {
        id: 8,
        title: "Meltdown-NM-REG",
        alias: "LazyFP",
        father: 3,
        description: "During a context switch, the OS has to save all the registers, including the floating point unit (FPU) and SIMD registers. These latter registers are large and saving them would slow down context switches. Therefore, CPUs allow for a lazy state switch, meaning that instead of saving the registers, the FPU is simply marked as “not available”. The first FPU instruction issued after the FPU was marked as “not available” causes a  device-not-available (#NM) exception, allowing the OS to save the FPU state of previous execution context before marking the FPU as available again. <p/> Stecklina and Prescher propose an attack on the above lazy state switch mechanism. The attack consists of three steps. In the first step, a victim performs operations loading data into the FPU registers. Then, in the second step, the CPUswitches to the attacker and marks the FPU as “not available”. The attacker now issues an instruction that uses the FPU, which generates an #NM fault. Before the faulting instruction retires, however, the CPU has already transiently executed the following instructions using data from the previous context. As such, analogous to previous Meltdown-type attacks, a malicious transient instruction sequence following the faulting instruction can encode the unauthorized FPU register contents through a microarchitectural covert channel.",
        sources: [
            sources["Stecklina2018"],
            sources["Canella2018"]
        ],
        names: [
            {
                title: "Lazy FP State Restore (LazyFP)",
                url: "https://www.cyberus-technology.de/posts/2018-06-06-intel-lazyfp-vulnerability.html"
            },
        ], 
        cve: [{
            title: "CVE-2018-3665",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-3665"
        }],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/NM"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00145.html"
            },
        ],
        color: color.works
    },
    {
        id: 9,
        title: "Meltdown-AC",
        alias: "",
        father: 3,
        description: "Upon detecting an unaligned memory operand, the CPU may generate an alignment-check exception (#AC) when the EFLAGS.AC flag is set. In our tests on Intel CPUs, we were unable to transiently encode the results of unaligned memory accesses. We suspect that this is because #AC is generated early in the pipeline, even before the operand’s virtual address is translated to a physical one. However, this appears not to be the case on some AMD and ARM microarchitectures, on which it is possible to transiently leak data after the exception.",
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/AC"
        }],
        affects: [
            {
                title: "AMD",
                url: "https://www.amd.com/system/files/documents/security-whitepaper.pdf"
            },
            {
                title: "ARM",
            },
        ],
        color: color.group
    },
    {
        id: 67,
        title: "Meltdown-AC-LFB",
        alias: "RIDL",
        img: "mds.svg",
        father: 9,
        description: "The RIDL addendum explained that misaligned loads due to the AC flag may leak data from line-fill buffers. Interestingly, in contrast to the main RIDL variant Meltdown-P-LFB exploiting page faults, Meltdown-AC-LFB may work even on processors enumerating RDCL_NO silicon mitigations.",
        sources: [
            sources["RIDLAddendum1"],
            sources["VanSchaik2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Rogue In-flight Data Load (RIDL) Addendum",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Fill Buffer Data Sampling (MFBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12130",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12130"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        poc: [{
            title: "https://github.com/vusec/ridl",
            url: "https://github.com/vusec/ridl",
        }],
        color: color.works
    },
    {
        id: 68,
        title: "Meltdown-AC-LP",
        alias: "RIDL",
        img: "mds.svg",
        father: 9,
        description: "The RIDL addendum explained that misaligned loads due to the AC flag may leak data from load ports. Interestingly, in contrast to the main RIDL variant Meltdown-P-LFB exploiting page faults, Meltdown-AC-LP may work even on processors enumerating RDCL_NO silicon mitigations.",
        sources: [
            sources["RIDLAddendum1"],
            sources["VanSchaik2019"],
            sources["Falk2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Rogue In-flight Data Load (RIDL) Addendum",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Load Port Data Sampling (MLPDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12127",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12127"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        poc: [{
            title: "https://github.com/vusec/ridl",
            url: "https://github.com/vusec/ridl",
        }],
        color: color.works
    },
    {
        id: 10,
        title: "Meltdown-DE",
        father: 3,
        description: "On the ARM microarchitectures we tested, division by zero produces no exception, merely yielding zero. As there is no fault, we do not count this as a Meltdown variant on ARM. On x86, the division raises a divide-by-zero exception (#DE). On both the AMD and Intel microarchitectures we tested, the CPU continues with transient execution after the exception, using zero as the result of the division. Thus the division itself does not leak a value (for example the numerator) but subsequent transient execution can still be used to leak values.", 
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/DE"
        }],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
        ],
        color: color.works
    },
    {
        id: 11,
        title: "Meltdown-PF",
        img: "pte.svg",
        father: 3,
        description: "The category of Meltdown attacks caused by a page fault. As there are many possibilities for a page fault, the attacks are further classified by the bit in the page-table entry causing the page fault.",
        sources: [
            sources["Canella2018"]
        ],
        color: color.group
    },
    {
        id: 12,
        title: "Meltdown-UD",
        father: 3,
        description: "For our original paper we did not succeed in transiently executing instructions following an invalid opcode. Google's Safeside project subsequently achieved this on ARM, and we have updated our PoC accordingly. We suspect that on Intel and AMD CPUs exceptions during instruction fetch or decode are immediately handled by the CPU, without first buffering the offending instruction in the ROB. Hence, invalid opcodes would only leak if the microarchitectural effect is an effect caused by the invalid opcode itself, rather than by subsequent transient instructions.",
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/UD"
        },
        {
            title: "https://github.com/google/safeside",
            url: "https://github.com/google/safeside/blob/master/demos/meltdown_ud.cc"
        }],
        affects: [{
            title: "ARM",
        }],
        color: color.works
    },
    {
        id: 13,
        title: "Meltdown-SS",
        father: 3,
        description: "We reliably found in our experiments on Intel CPUs that we cannot transiently leak the results of out-of-limit segment accesses. We suspect that, due to the simplistic IA32 segmentation design, segment limits are validated early-on, and immediately raise a #GP or #SS (stack-segment fault) exception, without sending the offending instruction to the ROB. However, we have successfully reproduced Meltdown-SS on some AMD microarchitectures, which is consistent with AMD's documentation that #SS does not suppress speculation.",
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/SS"
        }],
        affects: [
            {
                title: "AMD",
                url: "https://www.amd.com/system/files/documents/security-whitepaper.pdf"
            }
        ],
        color: color.works
    },
    {
        id: 14,
        title: "Meltdown-BR",
        father: 3,
        description: "A Meltdown-BR attack exploits transient execution following a #BR exception to encode out-of-bounds secrets that are never architecturally visible. As such, Meltdown-BR is an exception-driven alternative for Spectre-PHT. Using such an attack, an attcker can leak data safeguarded by either an IA32 bound instruction (Intel, AMD), or state-of-the-art MPX protection (Intel-only). This is the first experiment demonstrating a Meltdown-type transient execution attack exploiting delayed exception handling on AMD CPUs.",
        sources: [
            sources["Intel2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/BR"
        }],
        color: color.group
    },
    {
        id: 15,
        title: "Meltdown-GP",
        father: 3,
        description: "Similar to page faults, x86 general protection faults (#GP) have been abused in multiple Meltdown-type attacks. We hence categorize further based on #GP cause and targeted microarchitectural buffer.",
        todo: "While we have done our best to explore all potentially exploitable causes for #GP exceptions in the x86 architecture, we encourage future research to further investigate potential Meltdown-GP variants.",
        sources: [
            sources["Canella2018"],
            sources["ARM2018"],
            sources["Intel2018"],
            sources["Canella2019"]
        ],
        color: color.group
    },
    {
        id: 16,
        title: "Meltdown-US",
        img: "pte-us.svg",
        father: 11,
        description: "Modern CPUs commonly feature a “user/supervisor” (U/S) pagetable attribute to denote a virtual memory page as belonging to the OS kernel. Page faults raised by the U/S attribute can be abused to read cached kernel secrets, as well as to extract data from other microarchitectural buffers. We therefore categorize Meltdown-US further by the leakage source.",
        sources: [
            sources["Lipp2018"],
            sources["Schwarz2019"],
            sources["Canella2019"],
            sources["Canella2018"]
        ],
        color: color.group
    },
    {
        id: 17,
        title: "Meltdown-P",
        img: "pte-p.svg",
        father: 11,
        description: "Meltdown-P exploits transient execution following a page fault when accessing unmapped pages (present bit clear). As with the U/S attribute, page faults caused by the present bit have been abused to extract data from a variety of buffers. We therefore categorize Meltdown-P further by the leakage source.",
        sources: [
            sources["VanBulck2018"],
            sources["VanSchaik2019"],
            sources["Canella2019"],
            sources["Canella2018"]
        ],
        color: color.group
    },
    {
        id: 18,
        title: "Meltdown-RW",
        img: "pte-rw.svg",
        alias: "v1.2",
        father: 11,
        description: "Kiriansky and Waldspurger presented the first Meltdown-type attack that bypasses page-table based access rights within the current privilege level. Specifically, they showed that transient execution does not respect the “read/write” page-table attribute. The ability to transiently overwrite read-only data within the current privilege level can bypass software-based sandboxes which rely on hardware enforcement of read-only memory.",
        sources: [
            sources["Kiriansky2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/RW"
        }],
        names: [
            {
                title: "Variant 1.2",
                url: "https://arxiv.org/pdf/1807.03757.pdf"
            },

        ],
        affects: [
            {
                title: "Intel",
                url: "https://www.intel.com/content/www/us/en/support/articles/000029382/processors.html"
            },
            {
                title: "ARM",
            }
        ],
        color: color.works
    },
    {
        id: 19,
        title: "Meltdown-PK",
        img: "pte-pk.svg",
        father: 11,
        description: "Intel Skylake-SP server CPUs support memory-protection keys for user space (PKU). This feature allows processes to change the access permissions of a page directly from user space, i.e., without requiring a syscall/hypercall. Thus, with PKU, user-space applications can implement efficient hardware-enforced isolation of trusted parts. A Meltdown-PK attack bypasses both the read and write isolation provided by the PKU. Meltdown-PK works if an attacker has code execution in the containing process, even if the attacker cannot execute the <code>wrpkru</code> instruction (e.g., blacklisting).",
        todo: "We encourage exploring the possibility of using Meltdown-PK to leak data from other buffers apart from the L1 cache and store buffer.",
        sources: [
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/insights/more-information-transient-execution-findings",
            },
        ],
        color: color.group
    },
    {
        id: 70,
        title: "Meltdown-PK-L1",
        father: 19,
        description: "As part of our systematic analysis, we presented a novel Meltdown-PK-L1 variant which bypasses both the read and write isolation provided by PKU to leak unauthorized data from the L1 cache.",
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/PK"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/insights/more-information-transient-execution-findings",
            },
        ],
        color: color.works
    },
    {
        id: 71,
        title: "Meltdown-PK-SB",
        alias: "Fallout",
        img: "mds.svg",
        father: 19,
        description: "The Fallout paper includes an experiment to leak data from the store buffer using a faulting load from a page marked as unreadable with PKU.",
        sources: [
            sources["Canella2019"]
        ],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/insights/more-information-transient-execution-findings",
            },
        ],
        names: [
            {
                title: "Fallout",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Store Buffer Data Sampling (MSBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12126",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12126"
        }],
        color: color.works
    },
    {
        id: 20,
        title: "Meltdown-XD",
        img: "pte-x.svg",
        father: 11,
        description: "On our test systems, we did not succeed in transiently executing instructions residing in non-executable memory.",
        sources: [
            sources["Canella2018"]
        ],
        color: color.fails
    },
    {
        id: 21,
        title: "Meltdown-SM-SB",
        alias: "Fallout",
        img: "mds.svg",
        father: 11,
        description: "Although supervisor mode access prevention (SMAP) raises a page fault (#PF) when accessing user-space memory from the kernel, it seems to be free of any Meltdown effect in our experiments. Thus, we were not able to leak user data from kernel space using Meltdown-SM in our experiments.<p/>However, the Fallout paper includes an experiment to leak store buffer data using SMAP exceptions from kernel space.",
        sources: [
            sources["Canella2018"],
            sources["Canella2019"]
        ],
        names: [
            {
                title: "Fallout",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Store Buffer Data Sampling (MSBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12126",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12126"
        }],
        affects: [
            {
                title: "Intel"
            }
        ],
        color: color.works
    },
    {
        id: 22,
        title: "Meltdown-MPX",
        father: 14,
        description: "An attacker can leak data safeguarded by state-of-the-art MPX protection (Intel-only).",
        sources: [
            sources["Intel2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/BR"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/insights/more-information-transient-execution-findings",
            },
        ],
        color: color.works
    },
    {
        id: 23,
        title: "Meltdown-BND",
        father: 14,
        description: "An attcker can leak data safeguarded by an IA32 bound instruction (Intel, AMD). This is the first experiment demonstrating a Meltdown-type transient execution attack exploiting delayed exception handling on AMD CPUs.",
        sources: [
            sources["Intel2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/BR"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/insights/more-information-transient-execution-findings",
            },
            {
                title: "AMD"
            }
        ],
        color: color.works
    },
    {
        id: 24,
        title: "Cross-address-space",
        text_top: "mistraining strategy",
        description: "In a cross-address-space scenario, an attacker has two options. In the first, an attacker can mirror the virtual address space layout of the victim on a hyperthread (same physical core) and mistrain at the exact same virtual address as the victim branch. We refer to this as cross-address-space in-place (CA-IP). In the second, the attacker mistrains the PHT on a congruent virtual address in a different address space. We refer to this as cross-address-space out-of-place (CA-OP). Cross-address-space attacks are possible because the PHT is shared between hyperthreads on the same logical core.",
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT"
        }],
        father: 4,
        color: color.group
    },
    {
        id: 25,
        title: "Same-address-space",
        father: 4,
        description: "In a same-address-space scenario, an attacker has two options. The first option is to mistrain the exact location that is later on attacked. We refer to this as same-address-space in-place (SA-IP), In the second scenario, a congruent address is used for the mistraining. This is possible because only a subset of the virtual address is used for indexing the PHT. We refer to this as same-address-space out-of-place (SA-OP).",
        sources: [
            sources["Kocher2019"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT"
        }],
        color: color.group
    },
    {
        id: 26,
        title: "Cross-address-space",
        father: 5,
        description: "In a cross-address-space scenario, an attacker has two options. In the first, an attacker can mirror the virtual address space layout of the victim on a hyperthread (same physical core) and mistrain at the exact same virtual address as the victim branch. We refer to this as cross-address-space in-place (CA-IP). In the second, the attacker mistrains the BTB on a congruent virtual address in a different address space. We refer to this as cross-address-space out-of-place (CA-OP). Cross-address-space attacks are possible because the BTB is shared between hyperthreads on the same logical core.",
        sources: [
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB"
        }],
        color: color.group
    },
    {
        id: 27,
        title: "Same-address-space",
        father: 5,
        description: "In a same-address-space scenario, an attacker has two options. The first option is to mistrain the exact location that is later on attacked. We refer to this as same-address-space in-place (SA-IP), In the second scenario, a congruent address is used for the mistraining. This is possible because only a subset of the virtual address is used for indexing the BTB. We refer to this as same-address-space out-of-place (SA-OP).",
        sources: [
            sources["Kocher2019"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB"
        }],
        color: color.group
    },
    {
        id: 28,
        title: "Cross-address-space",
        father: 6,
        description: "In a cross-address-space RSB attack, an attacker cannot simply run on a hyperthread to influence the RSB. This is because the RSB is not shared between hyperthreads. Therefore, an attacker has to interleave the execution of their program with the victim's program to poison the RSB. This is possible in both in-place and out-of-place scenarios.",
        sources: [
            sources["Maisuradze2018"],
            sources["Koruyeh2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB"
        }],
        color: color.group
    },
    {
        id: 29,
        title: "Same-address-space",
        father: 6,
        description: "In a same-address-space RSB attack, an attacker can explicitly overwrite the return address on the software stack or transiently execute <code>call</code> instructions. Another cause for misspeculation is deeply nested function calls. This is due to the limited size of the RSB. One natural occurrence of RSB misspeculation is when restoring the kernel/enclave/user stack pointer upon switching protection domains. In all those cases, the execution might be diverted to a special code gadget that leaks data.",
        sources: [
            sources["Maisuradze2018"],
            sources["Koruyeh2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB"
        }],
        color: color.group
    },
    {
        id: 30,
        title: "PHT-CA-IP",
        img: "spectre.svg",
        text_top: "in-place (IP) vs. out-of-place (OP)",
        father: 24,
        description: "The cross-address-space, in-place variant of Spectre-PHT.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT/ca_ip"
        }],
        sources: [
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            }
        ],
        cve: [{
            title: "CVE-2017-5753",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5753"
        }],
        color: color.works
    },
    {
        id: 31,
        title: "PHT-CA-OP",
        img: "spectre.svg",
        father: 24,
        description: "The cross-address-space, out-of-place variant of Spectre-PHT.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT/ca_oop"
        }],
        sources: [
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            }
        ],
        cve: [{
            title: "CVE-2017-5753",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5753"
        }],
        color: color.works
    },
    {
        id: 32,
        title: "PHT-SA-IP",
        alias: "Spectre v1",
        img: "spectre.svg",
        father: 25,
        description: "The same-address-space, in-place variant of Spectre-PHT. This was one of the first discovered variants. It is the best-known variant of Spectre-PHT.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT/sa_ip"
        }],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            }
        ],
        sources: [
            sources["Kocher2019"],
            sources["Kiriansky2018"],
            sources["Canella2018"]
        ],
        cve: [{
            title: "CVE-2017-5753",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5753"
        }],
        color: color.works
    },
    {
        id: 33,
        title: "PHT-SA-OP",
        img: "spectre.svg",
        father: 25,
        description: "The same-address-space, out-of-place variant of Spectre-PHT.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/PHT/sa_oop"
        }],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            }
        ],
        sources: [
            sources["Canella2018"]
        ],
        cve: [{
            title: "CVE-2017-5753",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5753"
        }],
        color: color.works
    },
    {
        id: 34,
        title: "BTB-CA-IP",
        alias: "Spectre v2",
        img: "spectre.svg",
        father: 26,
        description: "The cross-address-space, in-place variant of Spectre-BTB. This was one of the first discovered variants.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB/ca_ip"
        }],
        sources: [
            sources["Kocher2019"],
            sources["Chen2019"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            }
        ],
        cve: [{
            title: "CVE-2017-5715",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5715"
        }],
        color: color.works
    },
    {
        id: 35,
        title: "BTB-CA-OP",
        alias: "Spectre v2",
        img: "spectre.svg",
        father: 26,
        description: "The cross-address-space, out-of-place variant of Spectre-BTB. This was one of the first discovered variants.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB/ca_oop"
        }],
        sources: [
            sources["Kocher2019"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
        ],
        cve: [{
            title: "CVE-2017-5715",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5715"
        }],
        color: color.works
    },
    {
        id: 36,
        title: "BTB-SA-IP",
        img: "spectre.svg",
        father: 27,
        description: "The same-address-space, in-place variant of Spectre-BTB.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB/sa_ip"
        }],
        sources: [
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            }
        ],
        cve: [{
            title: "CVE-2017-5715",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5715"
        }],
        color: color.works
    },
    {
        id: 37,
        title: "BTB-SA-OP",
        alias: "Spectre v2",
        img: "spectre.svg",
        father: 27,
        description: "The same-address-space, out-of-place variant of Spectre-BTB.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/BTB/sa_oop"
        }],
        sources: [
            sources["Chen2019"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
        ],
        cve: [{
            title: "CVE-2017-5715",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5715"
        }],
        color: color.works
    },
    {
        id: 38,
        title: "RSB-CA-IP",
        alias: "ret2spec",
        img: "spectre.svg",
        father: 28,
        description: "The cross-address-space, in-place variant of Spectre-RSB.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB/ca_ip"
        }],
        sources: [
            sources["Koruyeh2018"],
            sources["Maisuradze2018"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
        ],
        color: color.works
    },
    {
        id: 39,
        title: "RSB-CA-OP",
        img: "spectre.svg",
        father: 28,
        description: "The cross-address-space, out-of-place variant of Spectre-RSB.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB/ca_oop"
        }],
        sources: [
            sources["Koruyeh2018"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
        ],
        color: color.works
    },
    {
        id: 40,
        title: "RSB-SA-IP",
        alias: "ret2spec",
        img: "spectre.svg",
        father: 29,
        description: "The same-address-space, in-place variant of Spectre-RSB.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB/sa_ip"
        }],
        sources: [
            sources["Maisuradze2018"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            },
        ],
        color: color.works
    },
    {
        id: 41,
        title: "RSB-SA-OP",
        alias: "ret2spec",
        img: "spectre.svg",
        father: 29,
        description: "The same-address-space, out-of-place variant of Spectre-RSB.",
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/spectre/RSB/sa_oop"
        }],
        sources: [
            sources["Koruyeh2018"],
            sources["Maisuradze2018"],
            sources["Canella2018"]
        ],
        affects: [
            {
                title: "Intel",
            },
            {
                title: "AMD",
            },
            {
                title: "ARM",
            },        ],
        color: color.works
    },
    {
        id: 42,
        title: "Meltdown-US-L1",
        alias: "Meltdown",
        img: "meltdown.svg",
        father: 16,
        description: "The original Meltdown attack reads cached kernel memory from user space on CPUs that do not transiently enforce the user/supervisor flag. In the trigger phase an unauthorized kernel address is dereferenced, which eventually causes a page fault. Before the fault becomes architecturally visible, however, the attacker executes a transient instruction sequence that for instance accesses a cache line based on the privileged data read by the trigger instruction. In the final phase, after the exception has been raised, the privileged data is reconstructed at the receiving end of the covert channel (e.g., Flush+Reload).",
        sources: [
            sources["Lipp2018"],
            sources["Canella2018"]
        ],
        poc: [{
                title: "https://github.com/IAIK/meltdown",
                url: "https://github.com/IAIK/meltdown"
            },
            {
                title: "https://github.com/IAIK/transientfail",
                url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/US"
            },
            {
                title: "https://github.com/google/safeside",
                url: "https://github.com/google/safeside/tree/master/demos"
            }
        ],
        names: [
            {
                title: "Meltdown",
                url: "https://meltdownattack.com/"
            },
            {
                title: "Rogue Data Cache Load (RDCL)",
                url: "https://software.intel.com/security-software-guidance/software-guidance/rogue-data-cache-load"
            },
            {
                title: "Variant 3",
            },
        ],
        cve: [{
            title: "CVE-2017-5754",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2017-5754"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/rogue-data-cache-load"
            },
            {
                title: "ARM",
                url: "https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability"
            },
            {
                title: "IBM",
                url: "https://www.ibm.com/blogs/psirt/potential-impact-processors-power-family/"
            },
        ],
        color: color.works
    },
    {
        id: 43,
        title: "Meltdown-US-LFB",
        alias: "ZombieLoad v1",
        img: "zombieload.svg",
        father: 16,
        description: "ZombieLoad uses various architectural and microarchitectural faults to leak data from the fill buffers. In contrast to Meltdown-US-L1, only the least-significant 6 bits of the virtual address can be used to address the data, thus giving less control over which data is leaked. However, this allows ZombieLoad to cross all privilege boundaries (user-to-user, kernel, Intel SGX, VM-to-VM, VM-to-hypervisor).",
        sources: [
            sources["Schwarz2019"],
            sources["VanSchaik2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "ZombieLoad",
                url: "https://zombieloadattack.com/"
            },
            {
                title: "Microarchitectural Fill Buffer Data Sampling (MFBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        poc: [{
            title: "https://github.com/IAIK/ZombieLoad",
            url: "https://github.com/IAIK/ZombieLoad/tree/master/attacker/variant1_linux"
        }],
        cve: [{
            title: "CVE-2018-12130",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12130"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        color: color.works
    },
    {
        id: 44,
        title: "Meltdown-US-SB",
        alias: "Fallout",
        img: "mds.svg",
        father: 16,
        description: "Fallout exploits the fact that faulting loads can pick up previously stored values from the store buffer if the least-significant 12 bits of the virtual address match.",
        sources: [
            sources["Canella2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Fallout",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Store Buffer Data Sampling (MSBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ], 
        cve: [{
            title: "CVE-2018-12126",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12126"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        color: color.works
    },
    {
        id: 45,
        title: "Meltdown-US-LP",
        father: 16,
        description: "Intel explains that faulting loads which span a 64-byte cacheline boundary may leak data from the processor's load ports.",
        todo: "We encourage experimentation to confirm the possibility of reading CPU load port data through U/S exceptions.",
        sources: [
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Microarchitectural Load Port Data Sampling (MLPDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12127",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12127"
        }],
        color: color.todo
    },
    {
        id: 46,
        title: "Meltdown-P-L1",
        alias: "Foreshadow",
        img: "foreshadow.svg",
        father: 17,
        description: "Meltdown-P-L1 exploits an “L1 Terminal Fault” (L1TF) microarchitectural condition when accessing unmapped pages. A terminal page fault occurs when accessing a page-table entry with either the “present” bit cleared or a “reserved” bit set. In such cases, the CPU immediately aborts address translation. However, since the L1 data cache is indexed in parallel to address translation, the page table entry’s physical address field (i.e., frame number) may still be passed to the L1 cache. Any data present in L1 and tagged with that physical address will now be forwarded to the transient execution, regardless of access permissions.</p>Foreshadow was initially demonstrated against Intel SGX technology, and a generalized form of the attack allows an attacker to bypass operating system or hypervisor isolation. This variation allows an untrusted virtual machine, controlling guest-physical addresses, to extract the host machine’s entire L1 data cache (including data belonging to the hypervisor or other virtual machines). The underlying problem is that a terminal fault in the guest page-tables early-outs the address translation process, such that guest-physical addresses are erroneously passed to the L1 data cache, without first being translated into a proper host physical address.</p>",
        sources: [
            sources["VanBulck2018"],
            sources["Weisse2018"],
            sources["Canella2018"]
        ],
        poc: [{
                title: "https://github.com/IAIK/transientfail",
                url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/P"
            },
            {
                title: "https://github.com/jovanbulck/sgx-step/",
                url: "https://github.com/jovanbulck/sgx-step/tree/master/app/foreshadow"
            }
        ],
        names: [
            {
                title: "Foreshadow, Foreshadow-NG",
                url: "https://foreshadowattack.eu/"
            },
            {
                title: "L1 Terminal Fault (L1TF)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-l1-terminal-fault",
            }
        ],
        cve: [{
                title: "CVE-2018-3615",
                url: "https://nvd.nist.gov/vuln/detail/CVE-2018-3615"
            },
            {
                title: "CVE-2018-3620",
                url: "https://nvd.nist.gov/vuln/detail/CVE-2018-3620"
            },
            {
                title: "CVE-2018-3646",
                url: "https://nvd.nist.gov/vuln/detail/CVE-2018-3646"
            }
        ],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/l1-terminal-fault"
            },
            {
                title: "IBM",
                url: "https://www.ibm.com/blogs/psirt/potential-impact-processors-power-family/"
            },
        ],
        color: color.works
    },
    {
        id: 47,
        title: "Meltdown-P-LFB",
        alias: "RIDL",
        img: "mds.svg",
        father: 17,
        description: "RIDL leaks in-flight data from the line-fill buffer (LFB) by exploiting faulting loads on non-present addresses. If the least-significant 6 bits of the non-present virtual address match a virtual address of data currently stored in the LFB, then this data can be leaked. Any data travelling between the L1 cache and the remaining memory subsystem has to go through the LFB and can be leaked with RIDL.",
        sources: [
            sources["VanSchaik2019"],
            sources["Schwarz2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Rogue In-flight Data Load (RIDL)",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Fill Buffer Data Sampling (MFBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12130",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12130"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        poc: [{
            title: "https://github.com/vusec/ridl",
            url: "https://github.com/vusec/ridl",
        }],
        color: color.works
    },
    {
        id: 48,
        title: "Meltdown-P-SB",
        alias: "Fallout",
        img: "mds.svg",
        father: 17,
        description: "Fallout exploits the fact that faulting loads due to a non-present page fault can pick up previously stored values from the store buffer if the least-significant 12 bits of the virtual addresses match.",
        sources: [
            sources["Canella2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Fallout",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Store Buffer Data Sampling (MSBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ], 
        cve: [{
            title: "CVE-2018-12126",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12126"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        color: color.works
    },
    {
        id: 49,
        title: "Meltdown-P-LP",
        alias: "RIDL",
        img: "mds.svg",
        father: 17,
        description: "Intel, the RIDL paper, and Brandon Falk describe that faulting loads which span a 64-byte cacheline boundary may leak data from the processor's load ports.",
        sources: [
            sources["Falk2019"],
            sources["VanSchaik2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Rogue In-flight Data Load (RIDL)",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Load Port Data Sampling (MLPDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ],
        cve: [{
            title: "CVE-2018-12127",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12127"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        poc: [{
            title: "https://github.com/vusec/ridl",
            url: "https://github.com/vusec/ridl",
        }],
        color: color.works
    },
    {
        id: 50,
        title: "Meltdown-CPL-REG",
        alias: "v3a",
        father: 15,
        description: "Meltdown-CPL-REG allows an attacker to read privileged system registers. It was first discovered and published by ARM and subsequently Intel determined that their CPUs are also susceptible to the attack. Accessing privileged system registers (e.g., via <code>rdmsr</code>) raises a general protection fault (#GP) when the current privilege level (CPL) is not zero. Similarly to previous Meltdown-type attacks, however, the attack exploits the fact that the transient execution following the faulting instruction can still compute on the unauthorized data, and leak the system register contents through a microarchitectural covert channel.",
        sources: [
            sources["ARM2018"],
            sources["Intel2018"],
            sources["Canella2018"]
        ],
        poc: [{
            title: "https://github.com/IAIK/transientfail",
            url: "https://github.com/IAIK/transientfail/tree/master/pocs/meltdown/GP"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/rogue-system-register-read"
            },
            {
                title: "ARM",
                url: "https://developer.arm.com/support/arm-security-updates/speculative-processor-vulnerability"
            }
        ],
        names: [
            {
                title: "Variant 3a",
            },
            {
                title: "Rogue System Register Read (RSRR)",
                url: "https://software.intel.com/security-software-guidance/api-app/sites/default/files/336983-Intel-Analysis-of-Speculative-Execution-Side-Channels-White-Paper.pdf"
            }
        ], 
        cve: [{
            title: "CVE-2018-3640",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-3640"
        }],
        color: color.works
    },
    {
        id: 51,
        title: "Meltdown-NC-SB",
        alias: "Fallout",
        img: "mds.svg",
        father: 15,
        description: "Meltdown-NC-SB abuses #GP exceptions from non-canonical addresses to read data from the store buffer.",
        todo: "We encourage investigation of using non-canonical loads to leak data from other buffers.",
        sources: [
            sources["Canella2019"],
            sources["IntelMDS"],
        ],
        names: [
            {
                title: "Fallout",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Store Buffer Data Sampling (MSBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
        ], 
        cve: [{
            title: "CVE-2018-12126",
            url: "https://nvd.nist.gov/vuln/detail/CVE-2018-12126"
        }],
        affects: [
            {
                title: "Intel",
                url: "https://software.intel.com/security-software-guidance/software-guidance/microarchitectural-data-sampling"
            },
        ],
        color: color.works
    },
{
        id: 59,
        title: "Meltdown-AVX",
        father: 15,
        description: "Meltdown-AVX abuses #GP exceptions caused by misaligned AVX vector load instructions. According to Intel, faulting or assisting vector SSE/AVX loads that are more than 64 bits in size may leak data.",
        color: color.works,
        sources: [
            sources["IntelMDS"],
            sources["Canella2019"],
            sources["RIDLAddendum1"],
        ],
        color: color.group
},
{
        id: 65,
        title: "Meltdown-AVX-SB",
        alias: "Fallout",
        img: "mds.svg",
        father: 59,
        description: "Meltdown-AVX-SB abuses #GP exceptions caused by misaligned AVX load instructions to read data from the store buffer.",
        sources: [
            sources["Canella2019"],
        ],
        names: [
            {
                title: "Fallout",
                url: "https://mdsattacks.com/"
            },
            {
                title: "Microarchitectural Store Buffer Data Sampling (MSBDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microarchitectural-data-sampling"
            },
            {
                title: "Microarchitectural Data Sampling (MDS)",
                url: "https://software.intel.com/security-software-guidance/insights/deep-dive-intel-analysis-microar
Download .txt
gitextract_1s0czu4x/

├── LICENSE
├── README.md
├── docs/
│   ├── CNAME
│   ├── bibliography.js
│   ├── css/
│   │   └── style.css
│   ├── dist/
│   │   ├── index.js
│   │   └── typescript/
│   │       ├── d3.d.ts
│   │       ├── draw-links.d.ts
│   │       ├── index.d.ts
│   │       ├── initializeSVG.d.ts
│   │       ├── link-enter.d.ts
│   │       ├── link-exit.d.ts
│   │       ├── link-update.d.ts
│   │       ├── links/
│   │       │   ├── draw-links.d.ts
│   │       │   ├── link-enter.d.ts
│   │       │   ├── link-exit.d.ts
│   │       │   └── link-update.d.ts
│   │       ├── node-enter.d.ts
│   │       ├── node-exit.d.ts
│   │       ├── nodes/
│   │       │   ├── node-enter.d.ts
│   │       │   ├── node-exit.d.ts
│   │       │   └── node-update.d.ts
│   │       ├── prepare-data.d.ts
│   │       ├── services.d.ts
│   │       ├── typings.d.ts
│   │       └── utils.d.ts
│   ├── index.html
│   ├── js/
│   │   ├── export.js
│   │   ├── filter.js
│   │   └── tree.js
│   └── tree.js
└── pocs/
    ├── Makefile
    ├── get_hyperthread_pair.sh
    ├── libcache/
    │   ├── Makefile
    │   ├── cache.c
    │   └── cache.h
    ├── libpte/
    │   ├── .gitignore
    │   ├── Makefile
    │   ├── module/
    │   │   ├── Makefile
    │   │   ├── pteditor.c
    │   │   └── pteditor.h
    │   ├── ptedit.c
    │   ├── ptedit.h
    │   └── ptedit_header.h
    ├── meltdown/
    │   ├── AC/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── BR/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── DE/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── GP/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   └── module/
    │   │       ├── Makefile
    │   │       └── kernel_module.c
    │   ├── NM/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── main.c
    │   │   ├── secret.h
    │   │   └── victim.c
    │   ├── P/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── PK/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── RW/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   ├── SS/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   ├── cacheutils.h
    │   │   └── main.c
    │   ├── UD/
    │   │   ├── Makefile
    │   │   ├── README.md
    │   │   └── main.c
    │   └── US/
    │       ├── Makefile
    │       ├── README.md
    │       └── main.c
    └── spectre/
        ├── BTB/
        │   ├── ca_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.cpp
        │   ├── ca_oop/
        │   │   ├── cacheutils.h
        │   │   ├── exploit.sh
        │   │   ├── hyper_thread_pair.sh
        │   │   ├── main.c
        │   │   └── smc_utils.h
        │   ├── sa_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.cpp
        │   └── sa_oop/
        │       ├── Makefile
        │       ├── README.md
        │       └── main.c
        ├── PHT/
        │   ├── ca_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── ca_oop/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── sa_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   └── sa_oop/
        │       ├── Makefile
        │       ├── README.md
        │       └── main.c
        ├── RSB/
        │   ├── ca_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── ca_oop/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   ├── sa_ip/
        │   │   ├── Makefile
        │   │   ├── README.md
        │   │   └── main.c
        │   └── sa_oop/
        │       ├── Makefile
        │       ├── README.md
        │       └── main.c
        └── STL/
            ├── Makefile
            ├── README.md
            └── main.c
Download .txt
SYMBOL INDEX (513 symbols across 42 files)

FILE: docs/dist/index.js
  function e (line 1) | function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{...
  function a (line 1) | function a(){}
  function s (line 1) | function s(){return[]}
  function p (line 1) | function p(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.n...
  function v (line 1) | function v(t,n,e,r,i,o){for(var u,a=0,c=n.length,s=o.length;a<s;++a)(u=n...
  function y (line 1) | function y(t,n,e,r,i,o,u){var a,c,s,l={},h=n.length,f=o.length,v=new Arr...
  function m (line 1) | function m(t,n){return t<n?-1:t>n?1:t>=n?0:NaN}
  function _ (line 1) | function _(t,n){return t.style.getPropertyValue(n)||g(t).getComputedStyl...
  function w (line 1) | function w(t){return t.trim().split(/^|\s+/)}
  function x (line 1) | function x(t){return t.classList||new b(t)}
  function b (line 1) | function b(t){this._node=t,this._names=w(t.getAttribute("class")||"")}
  function M (line 1) | function M(t,n){for(var e=x(t),r=-1,i=n.length;++r<i;)e.add(n[r])}
  function k (line 1) | function k(t,n){for(var e=x(t),r=-1,i=n.length;++r<i;)e.remove(n[r])}
  function A (line 1) | function A(){this.textContent=""}
  function z (line 1) | function z(){this.innerHTML=""}
  function N (line 1) | function N(){this.nextSibling&&this.parentNode.appendChild(this)}
  function E (line 1) | function E(){this.previousSibling&&this.parentNode.insertBefore(this,thi...
  function S (line 1) | function S(){return null}
  function O (line 1) | function O(){var t=this.parentNode;t&&t.removeChild(this)}
  function j (line 1) | function j(){return this.parentNode.insertBefore(this.cloneNode(!1),this...
  function P (line 1) | function P(){return this.parentNode.insertBefore(this.cloneNode(!0),this...
  function q (line 1) | function q(t,n,e){return t=B(t,n,e),function(n){var e=n.relatedTarget;e&...
  function B (line 1) | function B(t,n,e){return function(r){var i=L;L=r;try{t.call(this,this.__...
  function I (line 1) | function I(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1...
  function C (line 1) | function C(t,n,e){var r=T.hasOwnProperty(t.type)?q:B;return function(i,o...
  function D (line 1) | function D(t,n,e,r){var i=L;t.sourceEvent=L,L=t;try{return n.apply(e,r)}...
  function H (line 1) | function H(t,n,e){var r=g(t),i=r.CustomEvent;"function"==typeof i?i=new ...
  function Y (line 1) | function Y(t,n){this._groups=t,this._parents=n}
  function R (line 1) | function R(){return new Y([[document.documentElement]],X)}
  function n (line 1) | function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}
  function $ (line 1) | function $(){return new G}
  function G (line 1) | function G(){this._="@"+(++U).toString(36)}
  function i (line 1) | function i(){for(var t,n=0,e=arguments.length,r={};n<e;++n){if(!(t=argum...
  function o (line 1) | function o(t){this._=t}
  function u (line 1) | function u(t,n){for(var e,r=0,i=t.length;r<i;++r)if((e=t[r]).name===n)re...
  function a (line 1) | function a(t,n,e){for(var i=0,o=t.length;i<o;++i)if(t[i].name===n){t[i]=...
  function f (line 1) | function f(t,n){var e=t.document.documentElement,r=Object(s.select)(t).o...
  function p (line 1) | function p(t,n,e,r,i,o,u,a,c,s){this.target=t,this.type=n,this.subject=e...
  function v (line 1) | function v(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[r...
  function y (line 1) | function y(){}
  function S (line 1) | function S(t){var n;return t=(t+"").trim().toLowerCase(),(n=w.exec(t))?n...
  function O (line 1) | function O(t){return new L(t>>16&255,t>>8&255,255&t,1)}
  function j (line 1) | function j(t,n,e,r){return r<=0&&(t=n=e=NaN),new L(t,n,e,r)}
  function P (line 1) | function P(t){return t instanceof y||(t=S(t)),t?new L((t=t.rgb()).r,t.g,...
  function T (line 1) | function T(t,n,e,r){return 1===arguments.length?P(t):new L(t,n,e,null==r...
  function L (line 1) | function L(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}
  function q (line 1) | function q(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"...
  function B (line 1) | function B(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=Na...
  function I (line 1) | function I(t,n,e,r){return 1===arguments.length?function(t){if(t instanc...
  function C (line 1) | function C(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}
  function D (line 1) | function D(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(2...
  function G (line 1) | function G(t){if(t instanceof Q)return new Q(t.l,t.a,t.b,t.opacity);if(t...
  function K (line 1) | function K(t,n,e,r){return 1===arguments.length?G(t):new Q(t,n,e,null==r...
  function Q (line 1) | function Q(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}
  function Z (line 1) | function Z(t){return t>$?Math.pow(t,1/3):t/U+W}
  function J (line 1) | function J(t){return t>F?t*t*t:U*(t-W)}
  function tt (line 1) | function tt(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-....
  function nt (line 1) | function nt(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}
  function et (line 1) | function et(t){if(t instanceof it)return new it(t.h,t.c,t.l,t.opacity);i...
  function rt (line 1) | function rt(t,n,e,r){return 1===arguments.length?et(t):new it(t,n,e,null...
  function it (line 1) | function it(t,n,e,r){this.h=+t,this.c=+n,this.l=+e,this.opacity=+r}
  function pt (line 1) | function pt(t,n,e,r){return 1===arguments.length?function(t){if(t instan...
  function dt (line 1) | function dt(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}
  function vt (line 1) | function vt(t,n,e,r,i){var o=t*t,u=o*t;return((1-3*t+3*o-u)*n+(4-6*o+3*u...
  function mt (line 1) | function mt(t,n){return function(e){return t+e*n}}
  function gt (line 1) | function gt(t,n){var e=n-t;return e?mt(t,e>180||e<-180?e-360*Math.round(...
  function _t (line 1) | function _t(t){return 1==(t=+t)?wt:function(n,e){return e-n?function(t,n...
  function wt (line 1) | function wt(t,n){var e=n-t;return e?mt(t,e):yt(isNaN(t)?n:t)}
  function r (line 1) | function r(t,n){var r=e((t=T(t)).r,(n=T(n)).r),i=e(t.g,n.g),o=e(t.b,n.b)...
  function bt (line 1) | function bt(t){return function(n){var e,r,i=n.length,o=new Array(i),u=ne...
  function Lt (line 1) | function Lt(t,n,e,r){function i(t){return t.length?t.pop()+" ":""}return...
  function Ct (line 1) | function Ct(t){return((t=Math.exp(t))+1/t)/2}
  function Ht (line 1) | function Ht(t){return function(n,e){var r=t((n=I(n)).h,(e=I(e)).h),i=wt(...
  function Xt (line 1) | function Xt(t){return function(n,e){var r=t((n=rt(n)).h,(e=rt(e)).h),i=w...
  function Yt (line 1) | function Yt(t){return function n(e){function r(n,r){var i=t((n=pt(n)).h,...
  function tn (line 1) | function tn(){return Kt||(Jt(nn),Kt=Zt.now()+Qt)}
  function nn (line 1) | function nn(){Kt=0}
  function en (line 1) | function en(){this._call=this._time=this._next=null}
  function rn (line 1) | function rn(t,n,e){var r=new en;return r.restart(t,n,e),r}
  function on (line 1) | function on(){Kt=(Gt=Zt.now())+Qt,Wt=Ft=0;try{!function(){tn(),++Wt;for(...
  function un (line 1) | function un(){var t=Zt.now(),n=t-Gt;n>$t&&(Qt-=n,Gt=t)}
  function an (line 1) | function an(t){Wt||(Ft&&(Ft=clearTimeout(Ft)),t-Kt>24?(t<1/0&&(Ft=setTim...
  function o (line 1) | function o(c){var s,l,h,f;if(e.state!==fn)return a();for(s in i)if((f=i[...
  function u (line 1) | function u(n){for(var i=n<e.duration?e.ease.call(null,n/e.duration):(e.t...
  function a (line 1) | function a(){for(var r in e.state=mn,e.timer.stop(),delete i[n],i)return...
  function _n (line 1) | function _n(t,n){var e=xn(t,n);if(e.state>hn)throw new Error("too late; ...
  function wn (line 1) | function wn(t,n){var e=xn(t,n);if(e.state>dn)throw new Error("too late; ...
  function xn (line 1) | function xn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("...
  function Mn (line 1) | function Mn(t,n,e){var r=t._id;return t.each(function(){var t=wn(this,r)...
  function zn (line 1) | function zn(t){return function(){this.style.removeProperty(t)}}
  function En (line 1) | function En(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._i...
  function Sn (line 1) | function Sn(){return++Nn}
  function i (line 1) | function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&funct...
  function i (line 1) | function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&funct...
  function o (line 1) | function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&funct...
  function e (line 1) | function e(t){return Math.pow(t,n)}
  function e (line 1) | function e(t){return 1-Math.pow(1-t,n)}
  function e (line 1) | function e(t){return((t*=2)<=1?Math.pow(t,n):2-Math.pow(2-t,n))/2}
  function e (line 1) | function e(t){return t*t*((n+1)*t-n)}
  function e (line 1) | function e(t){return--t*t*((n+1)*t+n)+1}
  function e (line 1) | function e(t){return((t*=2)<1?t*t*((n+1)*t-n):(t-=2)*t*((n+1)*t+n)+2)/2}
  function i (line 1) | function i(t){return n*Math.pow(2,10*--t)*Math.sin((r-t)/e)}
  function i (line 1) | function i(t){return 1-n*Math.pow(2,-10*(t=+t))*Math.sin((t+r)/e)}
  function i (line 1) | function i(t){return((t=2*t-1)<0?n*Math.pow(2,10*t)*Math.sin((r-t)/e):2-...
  function Tn (line 1) | function Tn(t,n){for(var e;!(e=t.__transition)||!(e=e[n]);)if(!(t=t.pare...
  function qn (line 1) | function qn(t,n,e){this.target=t,this.type=n,this.transform=e}
  function Bn (line 1) | function Bn(t,n,e){this.k=t,this.x=n,this.y=e}
  function Cn (line 1) | function Cn(t){return t.__zoom||In}
  function Dn (line 1) | function Dn(){s.event.stopImmediatePropagation()}
  function Xn (line 1) | function Xn(){return!s.event.button}
  function Yn (line 1) | function Yn(){var t,n,e=this;return e instanceof SVGElement?(t=(e=e.owne...
  function Rn (line 1) | function Rn(){return this.__zoom||In}
  function Vn (line 1) | function Vn(){return-s.event.deltaY*(s.event.deltaMode?120:1)/500}
  function Wn (line 1) | function Wn(){return"ontouchstart"in this}
  function Fn (line 1) | function Fn(t,n,e){var r=t.invertX(n[0][0])-e[0][0],i=t.invertX(n[1][0])...
  function w (line 1) | function w(t){t.property("__zoom",Rn).on("wheel.zoom",N).on("mousedown.z...
  function x (line 1) | function x(t,n){return(n=Math.max(a[0],Math.min(a[1],n)))===t.k?t:new Bn...
  function b (line 1) | function b(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i=...
  function M (line 1) | function M(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}
  function k (line 1) | function k(t,n,e){t.on("start.zoom",function(){A(this,arguments).start()...
  function A (line 1) | function A(t,n){for(var e,r=0,i=v.length;r<i;++r)if((e=v[r]).that===t)re...
  function z (line 1) | function z(t,n){this.that=t,this.args=n,this.index=-1,this.active=0,this...
  function N (line 1) | function N(){if(e.apply(this,arguments)){var t=A(this,arguments),n=this....
  function E (line 1) | function E(){if(!n&&e.apply(this,arguments)){var t=A(this,arguments),r=O...
  function S (line 1) | function S(){if(e.apply(this,arguments)){var t=this.__zoom,n=Object(s.mo...
  function O (line 1) | function O(){if(e.apply(this,arguments)){var n,r,i,o,u=A(this,arguments)...
  function j (line 1) | function j(){var n,e,r,o,u=A(this,arguments),a=s.event.changedTouches,c=...
  function P (line 1) | function P(){var t,e,r=A(this,arguments),i=s.event.changedTouches,o=i.le...
  function r (line 1) | function r(t,n){return t.parent===n.parent?1:2}
  function i (line 1) | function i(t,n){return t+n.x}
  function o (line 1) | function o(t,n){return Math.max(t,n.y)}
  function a (line 1) | function a(r){var a,c=0;r.eachAfter(function(n){var e=n.children;e?(n.x=...
  function a (line 1) | function a(t){var n=0,e=t.children,r=e&&e.length;if(r)for(;--r>=0;)n+=e[...
  function c (line 1) | function c(t,n){var e,r,i,o,u,a=new f(t),c=+t.value&&(a.value=t.value),l...
  function s (line 1) | function s(t){return t.children}
  function l (line 1) | function l(t){t.data=t.data.data}
  function h (line 1) | function h(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}
  function f (line 1) | function f(t){this.data=t,this.depth=this.height=0,this.parent=null}
  function v (line 1) | function v(t,n){var e,r;if(g(n,t))return[n];for(e=0;e<t.length;++e)if(y(...
  function y (line 1) | function y(t,n){var e=t.r-n.r,r=n.x-t.x,i=n.y-t.y;return e<0||e*e<r*r+i*i}
  function m (line 1) | function m(t,n){var e=t.r-n.r+1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r...
  function g (line 1) | function g(t,n){for(var e=0;e<n.length;++e)if(!m(t,n[e]))return!1;return!0}
  function _ (line 1) | function _(t){switch(t.length){case 1:return{x:(n=t[0]).x,y:n.y,r:n.r};c...
  function w (line 1) | function w(t,n){var e=t.x,r=t.y,i=t.r,o=n.x,u=n.y,a=n.r,c=o-e,s=u-r,l=a-...
  function x (line 1) | function x(t,n,e){var r=t.x,i=t.y,o=t.r,u=n.x,a=n.y,c=n.r,s=e.x,l=e.y,h=...
  function b (line 1) | function b(t,n,e){var r,i,o,u,a=t.x-n.x,c=t.y-n.y,s=a*a+c*c;s?(i=n.r+e.r...
  function M (line 1) | function M(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r...
  function k (line 1) | function k(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n....
  function A (line 1) | function A(t){this._=t,this.next=null,this.previous=null}
  function z (line 1) | function z(t){if(!(i=t.length))return 0;var n,e,r,i,o,u,a,c,s,l,h;if((n=...
  function E (line 1) | function E(t){if("function"!=typeof t)throw new Error;return t}
  function S (line 1) | function S(){return 0}
  function j (line 1) | function j(t){return Math.sqrt(t.value)}
  function i (line 1) | function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(T(t)).eachAfter(L(r,...
  function T (line 1) | function T(t){return function(n){n.children||(n.r=Math.max(0,+t(n)||0))}}
  function L (line 1) | function L(t,n){return function(e){if(r=e.children){var r,i,o,u=r.length...
  function q (line 1) | function q(t){return function(n){var e=n.parent;n.r*=t,e&&(n.x=e.x+t*n.x...
  function i (line 1) | function i(i){var o=i.height+1;return i.x0=i.y0=e,i.x1=t,i.y1=n/o,i.each...
  function Y (line 1) | function Y(t){return t.id}
  function R (line 1) | function R(t){return t.parentId}
  function e (line 1) | function e(e){var r,i,o,u,a,c,s,l=e.length,p=new Array(l),d={};for(i=0;i...
  function W (line 1) | function W(t,n){return t.parent===n.parent?1:2}
  function F (line 1) | function F(t){var n=t.children;return n?n[0]:t.t}
  function U (line 1) | function U(t){var n=t.children;return n?n[n.length-1]:t.t}
  function $ (line 1) | function $(t,n,e){var r=e/(n.i-t.i);n.c-=r,n.s+=e,t.c+=r,n.z+=e,n.m+=e}
  function G (line 1) | function G(t,n,e){return t.a.parent===n.parent?t.a:e}
  function K (line 1) | function K(t,n){this._=t,this.parent=null,this.children=null,this.A=null...
  function i (line 1) | function i(i){var c=function(t){for(var n,e,r,i,o,u=new K(t,0),a=[u];n=a...
  function o (line 1) | function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;i...
  function u (line 1) | function u(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}
  function a (line 1) | function a(t){t.x*=n,t.y=t.depth*e}
  function tt (line 1) | function tt(t,n,e,r,i,o){for(var u,a,c,s,l,h,f,p,d,v,y,m=[],g=n.children...
  function e (line 1) | function e(t,e,r,i,o){tt(n,t,e,r,i,o)}
  function l (line 1) | function l(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(h),i=[0],n&&...
  function h (line 1) | function h(n){var e=i[n.depth],r=n.x0+e,l=n.y0+e,h=n.x1-e,f=n.y1-e;h<r&&...
  function e (line 1) | function e(t,e,r,i,o){if((u=t._squarify)&&u.ratio===n)for(var u,a,c,s,l,...

FILE: docs/dist/typescript/draw-links.d.ts
  type ICoordinates (line 2) | interface ICoordinates {

FILE: docs/dist/typescript/links/draw-links.d.ts
  type ICoordinates (line 2) | interface ICoordinates {

FILE: docs/dist/typescript/typings.d.ts
  type ITreeConfig (line 2) | interface ITreeConfig {
  type ExtendedHierarchyPointNode (line 26) | interface ExtendedHierarchyPointNode extends HierarchyPointNode<{}> {

FILE: docs/dist/typescript/utils.d.ts
  type Result (line 8) | type Result = ExtendedHierarchyPointNode & {

FILE: docs/js/export.js
  function getTranslation (line 1) | function getTranslation(obj) {
  function exportTikz (line 12) | function exportTikz() {
  function exportSVG (line 56) | function exportSVG() {
  function exportDOT (line 104) | function exportDOT() {

FILE: docs/js/filter.js
  function buildIndex (line 2) | function buildIndex() {
  function hasParent (line 12) | function hasParent(node, parent_id) {
  function hasChild (line 22) | function hasChild(node, child_id) {
  function toggleMeltdownSpectre (line 27) | function toggleMeltdownSpectre(meltdown, spectre, filterInclude) {
  function recursiveFlatten (line 60) | function recursiveFlatten(input) {
  function filter (line 79) | function filter() {

FILE: pocs/libcache/cache.c
  function perf_init (line 4) | void perf_init() {
  function rdtsc (line 18) | uint64_t rdtsc() {
  function rdtsc_begin (line 32) | uint64_t rdtsc_begin() {
  function rdtsc_end (line 48) | uint64_t rdtsc_end() {
  function flush (line 64) | void flush(void *p) { asm volatile("clflush 0(%0)\n" : : "c"(p) : "rax"); }
  function maccess (line 67) | void maccess(void *p) { asm volatile("movq (%0), %%rax\n" : : "c"(p) : "...
  function mfence (line 70) | void mfence() { asm volatile("mfence"); }
  function nospec (line 73) | void nospec() { asm volatile("lfence"); }
  function xbegin (line 76) | unsigned int xbegin() {
  function xend (line 83) | void xend() {
  function has_tsx (line 88) | int has_tsx() {
  function maccess_tsx (line 99) | void maccess_tsx(void* ptr) {
  function rdtsc (line 108) | uint32_t rdtsc() {
  function flush (line 121) | void flush(void *p) { asm volatile("clflush 0(%0)\n" : : "c"(p)); }
  function maccess (line 124) | void maccess(void *p) { asm volatile("mov (%0), %%eax\n" : : "c"(p) : "e...
  function mfence (line 127) | void mfence() { asm volatile("mfence"); }
  function nospec (line 130) | void nospec() { asm volatile("lfence"); }
  function has_tsx (line 133) | int has_tsx() {
  function rdtsc (line 146) | uint64_t rdtsc() {
  function rdtsc_begin (line 185) | uint64_t rdtsc_begin() {
  function rdtsc_end (line 223) | uint64_t rdtsc_end() {
  function flush (line 260) | void flush(void *p) {
  function maccess (line 267) | void maccess(void *p) {
  function mfence (line 275) | void mfence() { asm volatile("DSB ISH"); }
  function nospec (line 278) | void nospec() { asm volatile("DSB SY\nISB"); }
  function rdtsc (line 281) | uint64_t rdtsc() {
  function rdtsc_begin (line 290) | uint64_t rdtsc_begin() {
  function rdtsc_end (line 299) | uint64_t rdtsc_end() {
  function flush (line 308) | void flush(void *p) { asm volatile( "dcbf 0, %0\n\t"
  function maccess (line 314) | void maccess(void *p) { asm volatile( "ld %%r0, 0(%0)" ::"r"(p): "r0"); }
  function mfence (line 317) | void mfence() { asm volatile( "lwsync" ); }
  function nospec (line 320) | void nospec() { asm volatile( "hwsync" ); }
  function flush_reload (line 324) | int flush_reload(void *ptr) {
  function flush_reload_t (line 350) | int flush_reload_t(void *ptr) {
  function reload_t (line 373) | int reload_t(void *ptr) {
  function detect_flush_reload_threshold (line 395) | size_t detect_flush_reload_threshold() {
  function maccess_speculative (line 414) | void maccess_speculative(void* ptr) {
  function unblock_signal (line 429) | void unblock_signal(int signum __attribute__((__unused__))) {
  function trycatch_segfault_handler (line 437) | void trycatch_segfault_handler(int signum) {
  function try_start (line 448) | int try_start() {
  function try_end (line 470) | void try_end() {
  function try_abort (line 483) | void try_abort() {
  function cache_encode (line 495) | void cache_encode(char data) {
  function cache_decode_pretty (line 500) | void cache_decode_pretty(char *leaked, int index) {
  function flush_shared_memory (line 515) | void flush_shared_memory() {

FILE: pocs/libpte/module/pteditor.c
  type pgdval_t (line 35) | typedef pgdval_t p4dval_t;
  function set_swapper_pgd (line 38) | void __attribute__((weak)) set_swapper_pgd(pgd_t* pgdp, pgd_t pgd) {}
  function pte_t (line 41) | static inline pte_t native_make_pte(pteval_t val)
  function pgd_t (line 46) | static inline pgd_t native_make_pgd(pgdval_t val)
  function pmd_t (line 51) | static inline pmd_t native_make_pmd(pmdval_t val)
  function pud_t (line 56) | static inline pud_t native_make_pud(pudval_t val)
  function p4d_t (line 62) | static inline p4d_t native_make_p4d(p4dval_t val)
  function pteval_t (line 68) | static inline pteval_t native_pte_val(pte_t pte)
  function pud_large (line 73) | static inline int pud_large(pud_t pud) {
  function pmd_large (line 81) | static inline int pmd_large(pmd_t pmd) {
  function kallsyms_lookup_name (line 104) | unsigned long kallsyms_lookup_name(const char* name) {
  type vm_t (line 120) | typedef struct {
  type mm_struct (line 138) | struct mm_struct
  type mm_struct (line 139) | struct mm_struct
  function device_open (line 141) | static int device_open(struct inode *inode, struct file *file) {
  function device_release (line 152) | static int device_release(struct inode *inode, struct file *file) {
  function _invalidate_tlb (line 159) | static void
  function invalidate_tlb_custom (line 206) | static void
  function invalidate_tlb_kernel (line 211) | static void
  function _set_pat (line 216) | static void _set_pat(void* _pat) {
  function set_pat (line 229) | static void set_pat(size_t pat) {
  type mm_struct (line 233) | struct mm_struct
  type task_struct (line 234) | struct task_struct
  type pid (line 235) | struct pid
  function resolve_vm (line 253) | static int resolve_vm(size_t addr, vm_t* entry, int lock) {
  function update_vm (line 353) | static int update_vm(ptedit_entry_t* new_entry, int lock) {
  function vm_to_user (line 411) | static void vm_to_user(ptedit_entry_t* user, vm_t* vm) {
  function device_ioctl (line 438) | static long device_ioctl(struct file *file, unsigned int ioctl_num, unsi...
  type file_operations (line 590) | struct file_operations
  type miscdevice (line 595) | struct miscdevice
  type proc_ops (line 603) | struct proc_ops
  type file_operations (line 624) | struct file_operations
  function open_umem (line 629) | static int open_umem(struct inode *inode, struct file *filp) { return 0; }
  function devmem_bypass (line 636) | static int devmem_bypass(struct kretprobe_instance *p, struct pt_regs *r...
  type kretprobe (line 643) | struct kretprobe
  function init_module (line 646) | int init_module(void) {
  function cleanup_module (line 691) | void cleanup_module(void) {

FILE: pocs/libpte/module/pteditor.h
  type ptedit_entry_t (line 29) | typedef struct {
  type ptedit_page_t (line 65) | typedef struct {
  type ptedit_page_t (line 77) | typedef struct {
  type ptedit_paging_t (line 88) | typedef struct {

FILE: pocs/libpte/ptedit.c
  type ptedit_paging_definition_t (line 39) | typedef struct {
  function ptedit_entry_t (line 50) | ptedit_entry_t ptedit_resolve_kernel(void* address, pid_t pid) {
  function ptedit_phys_read_map (line 68) | static inline size_t ptedit_phys_read_map(size_t address) {
  function ptedit_phys_write_map (line 73) | static inline void ptedit_phys_write_map(size_t address, size_t value) {
  function ptedit_phys_read_pread (line 78) | static inline size_t ptedit_phys_read_pread(size_t address) {
  function ptedit_phys_write_pwrite (line 92) | static inline void ptedit_phys_write_pwrite(size_t address, size_t value) {
  function ptedit_entry_t (line 207) | static ptedit_entry_t ptedit_resolve_user(void* address, pid_t pid) {
  function ptedit_entry_t (line 213) | static ptedit_entry_t ptedit_resolve_user_map(void* address, pid_t pid) {
  function ptedit_update_kernel (line 219) | void ptedit_update_kernel(void* address, pid_t pid, ptedit_entry_t* vm) {
  function ptedit_update_user_ext (line 230) | void ptedit_update_user_ext(void* address, pid_t pid, ptedit_entry_t* vm...
  function ptedit_update_user (line 274) | static void ptedit_update_user(void* address, pid_t pid, ptedit_entry_t*...
  function ptedit_update_user_map (line 281) | static void ptedit_update_user_map(void* address, pid_t pid, ptedit_entr...
  function ptedit_set_pfn (line 298) | size_t ptedit_set_pfn(size_t pte, size_t pfn) {
  function ptedit_get_pfn (line 310) | size_t ptedit_get_pfn(size_t pte) {
  function ptedit_print_entry_line (line 334) | void ptedit_print_entry_line(size_t entry, int line) {
  function ptedit_print_entry (line 387) | void ptedit_print_entry(size_t entry) {
  function ptedit_print_entry_t (line 395) | void ptedit_print_entry_t(ptedit_entry_t entry) {
  function ptedit_init (line 419) | int ptedit_init() {
  function ptedit_cleanup (line 477) | void ptedit_cleanup() {
  function ptedit_use_implementation (line 492) | void ptedit_use_implementation(int implementation) {
  function ptedit_get_pagesize (line 526) | int ptedit_get_pagesize() {
  function ptedit_read_physical_page (line 538) | void ptedit_read_physical_page(size_t pfn, char* buffer) {
  function ptedit_write_physical_page (line 560) | void ptedit_write_physical_page(size_t pfn, char* content) {
  function ptedit_get_paging_root (line 588) | size_t ptedit_get_paging_root(pid_t pid) {
  function ptedit_set_paging_root (line 606) | void ptedit_set_paging_root(pid_t pid, size_t root) {
  function ptedit_invalidate_tlb (line 624) | void ptedit_invalidate_tlb(void* address) {
  function ptedit_switch_tlb_invalidation (line 635) | int ptedit_switch_tlb_invalidation(int implementation) {
  function ptedit_get_mts (line 645) | size_t ptedit_get_mts() {
  function ptedit_get_mt (line 658) | char ptedit_get_mt(unsigned char mt) {
  function ptedit_set_mts (line 717) | void ptedit_set_mts(size_t mts) {
  function ptedit_set_mt (line 728) | void ptedit_set_mt(unsigned char mt, unsigned char value) {
  function ptedit_find_mt (line 741) | unsigned char ptedit_find_mt(unsigned char type) {
  function ptedit_find_first_mt (line 767) | int ptedit_find_first_mt(unsigned char type) {
  function ptedit_apply_mt (line 783) | size_t ptedit_apply_mt(size_t entry, unsigned char mt) {
  function ptedit_extract_mt (line 797) | unsigned char ptedit_extract_mt(size_t entry) {
  function ptedit_full_serializing_barrier (line 806) | void ptedit_full_serializing_barrier() {
  function ptedit_pte_set_bit (line 834) | void ptedit_pte_set_bit(void* address, pid_t pid, int bit) {
  function ptedit_pte_clear_bit (line 843) | void ptedit_pte_clear_bit(void* address, pid_t pid, int bit) {
  function ptedit_pte_get_bit (line 852) | unsigned char ptedit_pte_get_bit(void* address, pid_t pid, int bit) {
  function ptedit_pte_get_pfn (line 858) | size_t ptedit_pte_get_pfn(void* address, pid_t pid) {
  function ptedit_pte_set_pfn (line 865) | void ptedit_pte_set_pfn(void* address, pid_t pid, size_t pfn) {

FILE: pocs/libpte/ptedit.h
  type pid_t (line 10) | typedef size_t pid_t;
  type ptedit_entry_t (line 212) | typedef ptedit_entry_t(*ptedit_resolve_t)(void*, pid_t);
  type ptedit_pgd_t (line 298) | typedef struct {
  type ptedit_pgd_t (line 319) | typedef ptedit_pgd_t ptedit_p4d_t;
  type ptedit_pgd_t (line 325) | typedef ptedit_pgd_t ptedit_pud_t;
  type ptedit_pgd_t (line 331) | typedef ptedit_pgd_t ptedit_pmd_t;
  type ptedit_pmd_large_t (line 338) | typedef struct {
  type ptedit_pte_t (line 362) | typedef struct {
  type ptedit_pgd_t (line 387) | typedef struct {
  type ptedit_pgd_t (line 403) | typedef ptedit_pgd_t ptedit_p4d_t;
  type ptedit_pgd_t (line 409) | typedef ptedit_pgd_t ptedit_pud_t;
  type ptedit_pgd_t (line 415) | typedef ptedit_pgd_t ptedit_pmd_t;
  type ptedit_pgd_large_t (line 421) | typedef struct {
  type ptedit_pmd_large_t (line 443) | typedef struct {
  type ptedit_pte_t (line 465) | typedef struct {

FILE: pocs/libpte/ptedit_header.h
  type ptedit_entry_t (line 30) | typedef struct {
  type ptedit_page_t (line 66) | typedef struct {
  type ptedit_page_t (line 78) | typedef struct {
  type ptedit_paging_t (line 89) | typedef struct {
  type pid_t (line 168) | typedef size_t pid_t;
  type ptedit_entry_t (line 370) | typedef ptedit_entry_t(*ptedit_resolve_t)(void*, pid_t);
  type ptedit_pgd_t (line 456) | typedef struct {
  type ptedit_pgd_t (line 477) | typedef ptedit_pgd_t ptedit_p4d_t;
  type ptedit_pgd_t (line 483) | typedef ptedit_pgd_t ptedit_pud_t;
  type ptedit_pgd_t (line 489) | typedef ptedit_pgd_t ptedit_pmd_t;
  type ptedit_pmd_large_t (line 496) | typedef struct {
  type ptedit_pte_t (line 520) | typedef struct {
  type ptedit_pgd_t (line 545) | typedef struct {
  type ptedit_pgd_t (line 561) | typedef ptedit_pgd_t ptedit_p4d_t;
  type ptedit_pgd_t (line 567) | typedef ptedit_pgd_t ptedit_pud_t;
  type ptedit_pgd_t (line 573) | typedef ptedit_pgd_t ptedit_pmd_t;
  type ptedit_pgd_large_t (line 579) | typedef struct {
  type ptedit_pmd_large_t (line 601) | typedef struct {
  type ptedit_pte_t (line 623) | typedef struct {
  type ptedit_paging_definition_t (line 984) | typedef struct {
  function ptedit_entry_t (line 995) | ptedit_entry_t ptedit_resolve_kernel(void* address, pid_t pid) {
  function ptedit_phys_read_map (line 1013) | static inline size_t ptedit_phys_read_map(size_t address) {
  function ptedit_phys_write_map (line 1018) | static inline void ptedit_phys_write_map(size_t address, size_t value) {
  function ptedit_phys_read_pread (line 1023) | static inline size_t ptedit_phys_read_pread(size_t address) {
  function ptedit_phys_write_pwrite (line 1037) | static inline void ptedit_phys_write_pwrite(size_t address, size_t value) {
  function ptedit_entry_t (line 1152) | static ptedit_entry_t ptedit_resolve_user(void* address, pid_t pid) {
  function ptedit_entry_t (line 1158) | static ptedit_entry_t ptedit_resolve_user_map(void* address, pid_t pid) {
  function ptedit_update_kernel (line 1164) | void ptedit_update_kernel(void* address, pid_t pid, ptedit_entry_t* vm) {
  function ptedit_update_user_ext (line 1175) | void ptedit_update_user_ext(void* address, pid_t pid, ptedit_entry_t* vm...
  function ptedit_update_user (line 1219) | static void ptedit_update_user(void* address, pid_t pid, ptedit_entry_t*...
  function ptedit_update_user_map (line 1226) | static void ptedit_update_user_map(void* address, pid_t pid, ptedit_entr...
  function ptedit_set_pfn (line 1243) | size_t ptedit_set_pfn(size_t pte, size_t pfn) {
  function ptedit_get_pfn (line 1255) | size_t ptedit_get_pfn(size_t pte) {
  function ptedit_print_entry_line (line 1279) | void ptedit_print_entry_line(size_t entry, int line) {
  function ptedit_print_entry (line 1332) | void ptedit_print_entry(size_t entry) {
  function ptedit_print_entry_t (line 1340) | void ptedit_print_entry_t(ptedit_entry_t entry) {
  function ptedit_init (line 1364) | int ptedit_init() {
  function ptedit_cleanup (line 1422) | void ptedit_cleanup() {
  function ptedit_use_implementation (line 1437) | void ptedit_use_implementation(int implementation) {
  function ptedit_get_pagesize (line 1471) | int ptedit_get_pagesize() {
  function ptedit_read_physical_page (line 1483) | void ptedit_read_physical_page(size_t pfn, char* buffer) {
  function ptedit_write_physical_page (line 1505) | void ptedit_write_physical_page(size_t pfn, char* content) {
  function ptedit_get_paging_root (line 1533) | size_t ptedit_get_paging_root(pid_t pid) {
  function ptedit_set_paging_root (line 1551) | void ptedit_set_paging_root(pid_t pid, size_t root) {
  function ptedit_invalidate_tlb (line 1569) | void ptedit_invalidate_tlb(void* address) {
  function ptedit_switch_tlb_invalidation (line 1580) | int ptedit_switch_tlb_invalidation(int implementation) {
  function ptedit_get_mts (line 1590) | size_t ptedit_get_mts() {
  function ptedit_get_mt (line 1603) | char ptedit_get_mt(unsigned char mt) {
  function ptedit_set_mts (line 1662) | void ptedit_set_mts(size_t mts) {
  function ptedit_set_mt (line 1673) | void ptedit_set_mt(unsigned char mt, unsigned char value) {
  function ptedit_find_mt (line 1686) | unsigned char ptedit_find_mt(unsigned char type) {
  function ptedit_find_first_mt (line 1712) | int ptedit_find_first_mt(unsigned char type) {
  function ptedit_apply_mt (line 1728) | size_t ptedit_apply_mt(size_t entry, unsigned char mt) {
  function ptedit_extract_mt (line 1742) | unsigned char ptedit_extract_mt(size_t entry) {
  function ptedit_full_serializing_barrier (line 1751) | void ptedit_full_serializing_barrier() {
  function ptedit_pte_set_bit (line 1779) | void ptedit_pte_set_bit(void* address, pid_t pid, int bit) {
  function ptedit_pte_clear_bit (line 1788) | void ptedit_pte_clear_bit(void* address, pid_t pid, int bit) {
  function ptedit_pte_get_bit (line 1797) | unsigned char ptedit_pte_get_bit(void* address, pid_t pid, int bit) {
  function ptedit_pte_get_pfn (line 1803) | size_t ptedit_pte_get_pfn(void* address, pid_t pid) {
  function ptedit_pte_set_pfn (line 1810) | void ptedit_pte_set_pfn(void* address, pid_t pid, size_t pfn) {

FILE: pocs/meltdown/AC/main.c
  function main (line 26) | int main(void) {

FILE: pocs/meltdown/BR/main.c
  function fault_handler (line 33) | void fault_handler(int no) {
  function main (line 56) | int main(void) {

FILE: pocs/meltdown/DE/main.c
  function main (line 13) | int main(void) {

FILE: pocs/meltdown/GP/main.c
  function main (line 11) | int main(int argc, char **argv) {

FILE: pocs/meltdown/GP/module/kernel_module.c
  type mm_struct (line 14) | struct mm_struct
  type task_struct (line 15) | struct task_struct
  type pid (line 16) | struct pid
  function pid_to_cr3 (line 36) | unsigned long pid_to_cr3(size_t pid) {
  function my_proc_show (line 52) | static int my_proc_show(struct seq_file *m, void *v) {
  function my_proc_write (line 57) | static ssize_t my_proc_write(struct file *file, const char __user *buffer,
  function my_proc_open (line 67) | static int my_proc_open(struct inode *inode, struct file *file) {
  type proc_ops (line 72) | struct proc_ops
  type file_operations (line 78) | struct file_operations
  function hello_init (line 86) | static int __init hello_init(void) {
  function hello_exit (line 97) | static void __exit hello_exit(void) {

FILE: pocs/meltdown/NM/main.c
  function main (line 16) | int main(void) {

FILE: pocs/meltdown/NM/victim.c
  function main (line 5) | int main(void) {

FILE: pocs/meltdown/P/main.c
  function main (line 20) | int main(void) {

FILE: pocs/meltdown/PK/main.c
  function main (line 14) | int main(void) {

FILE: pocs/meltdown/RW/main.c
  function function (line 14) | void function() {
  function main (line 21) | int main(void) {

FILE: pocs/meltdown/SS/cacheutils.h
  function perf_init (line 35) | void perf_init() {
  function rdtsc (line 52) | uint64_t rdtsc() {
  function rdtsc_begin (line 70) | uint64_t rdtsc_begin() {
  function rdtsc_end (line 86) | uint64_t rdtsc_end() {
  function flush (line 102) | void flush(void *p) { asm volatile("clflush 0(%0)\n" : : "c"(p) : "rax"); }
  function maccess (line 105) | void maccess(void *p) { asm volatile("mov (%0), %%eax\n" : : "c"(p) : "r...
  function mfence (line 108) | void mfence() { asm volatile("mfence"); }
  function nospec (line 111) | void nospec() { asm volatile("lfence"); }
  function xbegin (line 115) | unsigned int xbegin() {
  function xend (line 122) | void xend() {
  function has_tsx (line 127) | int has_tsx() {
  function maccess_tsx (line 138) | void maccess_tsx(void* ptr) {
  function rdtsc (line 151) | uint64_t rdtsc() {
  function rdtsc_begin (line 190) | uint64_t rdtsc_begin() {
  function rdtsc_end (line 228) | uint64_t rdtsc_end() {
  function flush (line 265) | void flush(void *p) {
  function maccess (line 272) | void maccess(void *p) {
  function mfence (line 280) | void mfence() { asm volatile("DSB ISH"); }
  function nospec (line 283) | void nospec() { asm volatile("DSB SY\nISB"); }
  function flush_reload (line 288) | int flush_reload(void *ptr) {
  function flush_reload_t (line 314) | int flush_reload_t(void *ptr) {
  function reload_t (line 337) | int reload_t(void *ptr) {
  function detect_flush_reload_threshold (line 359) | size_t detect_flush_reload_threshold() {
  function maccess_speculative (line 379) | void maccess_speculative(void* ptr) {
  function unblock_signal (line 397) | void unblock_signal(int signum __attribute__((__unused__))) {
  function trycatch_segfault_handler (line 405) | void trycatch_segfault_handler(int signum) {
  function try_start (line 417) | int try_start() {
  function try_end (line 439) | void try_end() {
  function try_abort (line 452) | void try_abort() {

FILE: pocs/meltdown/SS/main.c
  type user_desc (line 21) | struct user_desc
  type user_desc (line 33) | struct user_desc
  function seg_ok (line 45) | void inline __attribute__((always_inline)) seg_ok(void) {
  function seg_fail (line 51) | void inline __attribute__((always_inline)) seg_fail(void) {
  function main (line 57) | int main(void) {

FILE: pocs/meltdown/UD/main.c
  function main (line 13) | int main(void) {

FILE: pocs/meltdown/US/main.c
  function main (line 20) | int main(void) {

FILE: pocs/spectre/BTB/ca_ip/main.cpp
  class Animal (line 19) | class Animal {
    method move (line 21) | virtual void move() {
  class Bird (line 27) | class Bird : public Animal {
    method Bird (line 31) | Bird() {
    method move (line 34) | void move() {
  class Fish (line 40) | class Fish : public Animal {
    method Fish (line 44) | Fish() {
    method move (line 47) | void move() {
  function move_animal (line 55) | void move_animal(Animal* animal) {
  function main (line 60) | int main(int argc, char **argv) {

FILE: pocs/spectre/BTB/ca_oop/cacheutils.h
  function rdtsc (line 17) | inline __attribute__((always_inline)) uint64_t rdtsc() {
  function maccess (line 35) | inline __attribute__((always_inline)) void maccess(volatile void* p)
  function flush (line 43) | inline __attribute__((always_inline)) void flush(void* p) {

FILE: pocs/spectre/BTB/ca_oop/main.c
  function calibration (line 62) | size_t calibration() {
  function main (line 96) | int main(int argc, char **argv) {

FILE: pocs/spectre/BTB/ca_oop/smc_utils.h
  function call_addr (line 1) | inline __attribute__((always_inline)) void call_addr(size_t addr)
  function inject_code (line 12) | size_t inject_code(size_t dest, char* hex, size_t length)
  function inject_jump (line 18) | size_t inject_jump(size_t dest, size_t target)
  function inject_maccess (line 27) | size_t inject_maccess(size_t dest, size_t target)
  function inject_nop (line 36) | size_t inject_nop(size_t dest, size_t no)
  function assemble (line 46) | size_t assemble(char *in, char **out)
  function inject_asm (line 80) | size_t inject_asm(size_t dest, char* asm_code)

FILE: pocs/spectre/BTB/sa_ip/main.cpp
  class Animal (line 19) | class Animal {
    method move (line 21) | virtual void move() {
  class Bird (line 26) | class Bird : public Animal {
    method Bird (line 30) | Bird() {
    method move (line 33) | void move() {
  class Fish (line 39) | class Fish : public Animal {
    method Fish (line 43) | Fish() {
    method move (line 46) | void move() {
  function move_animal (line 54) | void move_animal(Animal* animal) {
  function main (line 59) | int main(int argc, char **argv) {

FILE: pocs/spectre/BTB/sa_oop/main.c
  function segfault_handler (line 18) | static void segfault_handler(int signum) {
  function dummy (line 24) | void dummy() {
  function dump_secret (line 28) | void dump_secret() {
  function main (line 33) | int main(int argc, const char **argv) {

FILE: pocs/spectre/PHT/ca_ip/main.c
  function access_array (line 19) | char access_array(int x) {
  function main (line 37) | int main(int argc, const char **argv) {

FILE: pocs/spectre/PHT/ca_oop/main.c
  function access_array (line 23) | char access_array(int x) {
  function oop (line 54) | void oop() {
  function main (line 62) | int main(int argc, const char **argv) {

FILE: pocs/spectre/PHT/sa_ip/main.c
  function access_array (line 19) | char access_array(int x) {
  function main (line 38) | int main(int argc, const char **argv) {

FILE: pocs/spectre/PHT/sa_oop/main.c
  function access_array (line 22) | char access_array(int x) {
  function oop (line 54) | void oop() {
  function main (line 66) | int main(int argc, const char **argv) {

FILE: pocs/spectre/RSB/ca_ip/main.c
  function in_place (line 16) | void __attribute__((noinline)) in_place() {
  function attacker (line 26) | void __attribute__((noinline)) attacker() {
  function victim (line 36) | void __attribute__((noinline)) victim() {
  function main (line 58) | int main(int argc, char **argv) {

FILE: pocs/spectre/RSB/ca_oop/main.c
  function wrong_return (line 16) | void __attribute__((noinline)) wrong_return() {
  function pollute_rsb (line 22) | void __attribute__((noinline)) pollute_rsb() {
  function main (line 32) | int main(int argc, char **argv) {

FILE: pocs/spectre/RSB/sa_ip/main.c
  function in_place (line 10) | void __attribute__((noinline)) in_place() {
  function main (line 44) | int main(int argc, char **argv) {

FILE: pocs/spectre/RSB/sa_oop/main.c
  function call_manipulate_stack (line 17) | int __attribute__ ((noinline)) call_manipulate_stack() {
  function call_leak (line 26) | int __attribute__ ((noinline)) call_leak() {
  function call_start (line 35) | int __attribute__ ((noinline)) call_start() {
  function confuse_compiler (line 40) | void confuse_compiler() {
  function main (line 48) | int main(int argc, const char **argv) {

FILE: pocs/spectre/STL/main.c
  function access_array (line 20) | char access_array(int x) {
  function main (line 49) | int main(int argc, const char **argv) {
Condensed preview — 123 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (524K chars).
[
  {
    "path": "LICENSE",
    "chars": 874,
    "preview": "zlib License\n\n(C) 2020 Graz University of Technology\n\nThis software is provided 'as-is', without any express or implied\n"
  },
  {
    "path": "README.md",
    "chars": 1846,
    "preview": "# Transient Fail\n\nTransient Fail is a project that gathers different proof-of-concept implementations of Transient Execu"
  },
  {
    "path": "docs/CNAME",
    "chars": 14,
    "preview": "transient.fail"
  },
  {
    "path": "docs/bibliography.js",
    "chars": 7040,
    "preview": "var sources = {\n    \"Canella2018\": {\n            \"title\": \"A Systematic Evaluation of Transient Execution Attacks and De"
  },
  {
    "path": "docs/css/style.css",
    "chars": 353,
    "preview": ".desc_top {\n    position: fixed;\n    top: -3em;\n}\n.desc_bottom {\n    position: fixed;\n    top: 3em;\n}\n.node {\n    cursor"
  },
  {
    "path": "docs/dist/index.js",
    "chars": 75083,
    "preview": "!function(t,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n():\"function\"==typeof define&&define.am"
  },
  {
    "path": "docs/dist/typescript/d3.d.ts",
    "chars": 418,
    "preview": "import { hierarchy, stratify, tree, treemap } from \"d3-hierarchy\";\nimport { select, selectAll } from \"d3-selection\";\nimp"
  },
  {
    "path": "docs/dist/typescript/draw-links.d.ts",
    "chars": 221,
    "preview": "import { ITreeConfig } from \"./typings\";\ninterface ICoordinates {\n    x: number;\n    y: number;\n}\nexport declare const g"
  },
  {
    "path": "docs/dist/typescript/index.d.ts",
    "chars": 238,
    "preview": "import { ITreeConfig } from \"./typings\";\nexport declare function create(userSettings: Partial<ITreeConfig>): {\n    refre"
  },
  {
    "path": "docs/dist/typescript/initializeSVG.d.ts",
    "chars": 196,
    "preview": "import * as d3 from \"d3-selection\";\nimport { ITreeConfig } from \"./typings\";\nexport declare const initiliazeSVG: (treeCo"
  },
  {
    "path": "docs/dist/typescript/link-enter.d.ts",
    "chars": 381,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nimport { BaseType, Selection } from \"d3-selection\";\nimport { ITreeCon"
  },
  {
    "path": "docs/dist/typescript/link-exit.d.ts",
    "chars": 280,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nimport { BaseType, Selection } from \"d3-selection\";\nimport { ITreeCon"
  },
  {
    "path": "docs/dist/typescript/link-update.d.ts",
    "chars": 361,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nimport { BaseType, Selection } from \"d3-selection\";\nimport { ITreeCon"
  },
  {
    "path": "docs/dist/typescript/links/draw-links.d.ts",
    "chars": 222,
    "preview": "import { ITreeConfig } from \"../typings\";\ninterface ICoordinates {\n    x: number;\n    y: number;\n}\nexport declare const "
  },
  {
    "path": "docs/dist/typescript/links/link-enter.d.ts",
    "chars": 449,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nimport { BaseType, Selection } from \"d3-selection\";\nimport { Extended"
  },
  {
    "path": "docs/dist/typescript/links/link-exit.d.ts",
    "chars": 386,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nimport { BaseType, Selection } from \"d3-selection\";\nimport { Extended"
  },
  {
    "path": "docs/dist/typescript/links/link-update.d.ts",
    "chars": 362,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nimport { BaseType, Selection } from \"d3-selection\";\nimport { ITreeCon"
  },
  {
    "path": "docs/dist/typescript/node-enter.d.ts",
    "chars": 326,
    "preview": "import { BaseType, Selection } from \"d3-selection\";\nimport { ExtendedHierarchyPointNode, ITreeConfig } from \"./typings\";"
  },
  {
    "path": "docs/dist/typescript/node-exit.d.ts",
    "chars": 67,
    "preview": "export declare const placeExit: (node: any, settings: any) => any;\n"
  },
  {
    "path": "docs/dist/typescript/nodes/node-enter.d.ts",
    "chars": 403,
    "preview": "import { BaseType, Selection } from \"d3-selection\";\nimport { ExtendedHierarchyPointNode, ITreeConfig } from \"../typings\""
  },
  {
    "path": "docs/dist/typescript/nodes/node-exit.d.ts",
    "chars": 339,
    "preview": "import { BaseType, Selection } from \"d3-selection\";\nimport { ExtendedHierarchyPointNode, ITreeConfig } from \"../typings\""
  },
  {
    "path": "docs/dist/typescript/nodes/node-update.d.ts",
    "chars": 344,
    "preview": "import { BaseType, Selection } from \"d3-selection\";\nimport { ExtendedHierarchyPointNode, ITreeConfig } from \"../typings\""
  },
  {
    "path": "docs/dist/typescript/prepare-data.d.ts",
    "chars": 304,
    "preview": "import { HierarchyNode } from \"d3-hierarchy\";\nimport { ITreeConfig } from \"./typings\";\nexport declare const generateNest"
  },
  {
    "path": "docs/dist/typescript/services.d.ts",
    "chars": 106,
    "preview": "export declare const getAreaSize: (htmlId: string) => {\n    areaWidth: number;\n    areaHeight: number;\n};\n"
  },
  {
    "path": "docs/dist/typescript/typings.d.ts",
    "chars": 906,
    "preview": "import { HierarchyPointNode } from \"d3-hierarchy\";\nexport interface ITreeConfig {\n    htmlId: string;\n    idKey: string;"
  },
  {
    "path": "docs/dist/typescript/utils.d.ts",
    "chars": 556,
    "preview": "import { ExtendedHierarchyPointNode, ITreeConfig } from \"./typings\";\nexport declare const getAreaSize: (\n  htmlId: strin"
  },
  {
    "path": "docs/index.html",
    "chars": 21546,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "docs/js/export.js",
    "chars": 5329,
    "preview": "function getTranslation(obj) {\n    if(obj.transform === undefined) return [0,0];\n    if(obj.transform.baseVal === undefi"
  },
  {
    "path": "docs/js/filter.js",
    "chars": 7232,
    "preview": "var index = {};\nfunction buildIndex() {\n    index = {};\n    for(let node of data) {\n        if(index[node.id] !== undefi"
  },
  {
    "path": "docs/js/tree.js",
    "chars": 292,
    "preview": "$(document).ready(function(e) {\n    $('[data-toggle=\"popover\"]').popover();\n    $('[data-toggle=\"tooltip\"]').tooltip();\n"
  },
  {
    "path": "docs/tree.js",
    "chars": 88215,
    "preview": "var color = {\n    root: \"#DDDDDD\",\n    group: \"#BBBBFF\",\n    works: \"#FF5722\",\n    fails: \"#8BC34A\",\n    todo: \"#FFA500\""
  },
  {
    "path": "pocs/Makefile",
    "chars": 3487,
    "preview": "all: libcache/cacheutils.h libpte/libpte.a meltdown/US meltdown/P meltdown/RW meltdown/NM meltdown/GP meltdown/PK meltdo"
  },
  {
    "path": "pocs/get_hyperthread_pair.sh",
    "chars": 423,
    "preview": "#!/bin/zsh\n\nsetopt extendedglob\n\ncd /sys/devices/system/cpu/\n\nfor i in cpu[0-9]##; do\n  package=`cat $i/topology/physica"
  },
  {
    "path": "pocs/libcache/Makefile",
    "chars": 128,
    "preview": "all: header\n\nheader: cache.c cache.h\n\tcat cache.h cache.c | sed 's/#include \".*\"//g' > cacheutils.h\n\nclean:\n\trm -f cache"
  },
  {
    "path": "pocs/libcache/cache.c",
    "chars": 13077,
    "preview": "#include \"cache.h\"\n\n// ---------------------------------------------------------------------------\nvoid perf_init() {\n  "
  },
  {
    "path": "pocs/libcache/cache.h",
    "chars": 5838,
    "preview": "#ifndef _CACHEUTILS_H_\n#define _CACHEUTILS_H_\n\n#include <assert.h>\n#include <unistd.h>\n#include <sys/syscall.h>\n#include"
  },
  {
    "path": "pocs/libpte/.gitignore",
    "chars": 256,
    "preview": "# ---> C\n# Object files\n*.o\n*.ko\n*.obj\n*.elf\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Libraries\n*.lib\n*.a\n*.la\n*.lo\n\n# Shar"
  },
  {
    "path": "pocs/libpte/Makefile",
    "chars": 470,
    "preview": "all: pteditor ptedit.o header libpte.a\n\nheader: module/pteditor.c module/pteditor.h ptedit.c ptedit.h\n\tcat module/ptedit"
  },
  {
    "path": "pocs/libpte/module/Makefile",
    "chars": 189,
    "preview": "obj-m += pteditor.o\nccflags-y += -Wno-unused-result\nall:\n\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules\n"
  },
  {
    "path": "pocs/libpte/module/pteditor.c",
    "chars": 17860,
    "preview": "#include <linux/mm_types.h>\n#include <asm/tlbflush.h>\n#include <asm/uaccess.h>\n#include <asm/io.h>\n#include <linux/fs.h>"
  },
  {
    "path": "pocs/libpte/module/pteditor.h",
    "chars": 4464,
    "preview": "/* See LICENSE file for license and copyright information */\n\n#ifndef PTEDITOR_MODULE_H\n#define PTEDITOR_MODULE_H\n\n#if d"
  },
  {
    "path": "pocs/libpte/ptedit.c",
    "chars": 31998,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <fcntl.h>\n#include <string.h>\n#include \"module/pteditor.h\"\n#include \"pte"
  },
  {
    "path": "pocs/libpte/ptedit.h",
    "chars": 19080,
    "preview": "/** @file */\n\n#ifndef _PTEDITOR_H_\n#define _PTEDITOR_H_\n\n#include \"module/pteditor.h\"\n#include <sys/types.h>\n\n#if define"
  },
  {
    "path": "pocs/libpte/ptedit_header.h",
    "chars": 55525,
    "preview": "// Warning: this file was generated by make. DO NOT EDIT!\n/* See LICENSE file for license and copyright information */\n\n"
  },
  {
    "path": "pocs/meltdown/AC/Makefile",
    "chars": 226,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../\n\nmain_arm: main.c\n\taarch64-l"
  },
  {
    "path": "pocs/meltdown/AC/README.md",
    "chars": 1869,
    "preview": "# Meltdown-AC PoC\n\nThis folder contains a Meltdown-AC proof-of-concept implementation for x86_64.\n\n## Compile\n\nCompile u"
  },
  {
    "path": "pocs/meltdown/AC/main.c",
    "chars": 2310,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/BR/Makefile",
    "chars": 428,
    "preview": "ifndef MPX\n    MPX             = 1\nendif\n\nifndef TSX\n    TSX             = 0\nendif\n\nifndef LFENCE\n    LFENCE          = "
  },
  {
    "path": "pocs/meltdown/BR/README.md",
    "chars": 1335,
    "preview": "# Meltdown-BR PoC\n\nThis folder contains a Meltdown-BND and Meltdown-MPX proof-of-concept implementation for x86_64.\n\n## "
  },
  {
    "path": "pocs/meltdown/BR/main.c",
    "chars": 3274,
    "preview": "#define _GNU_SOURCE\n#include \"libcache/cacheutils.h\"\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include"
  },
  {
    "path": "pocs/meltdown/DE/Makefile",
    "chars": 226,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../\n\nmain_arm: main.c\n\taarch64-l"
  },
  {
    "path": "pocs/meltdown/DE/README.md",
    "chars": 2373,
    "preview": "# Meltdown-DE PoC\n\nThis folder contains a Meltdown-DE proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/meltdown/DE/main.c",
    "chars": 1311,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/GP/Makefile",
    "chars": 218,
    "preview": "all: x86\n\nx86: main_x86\n\nmodule/kernel_module.ko: module/kernel_module.c\n\tcd module && make\n\nmain_x86: main.c module/ker"
  },
  {
    "path": "pocs/meltdown/GP/README.md",
    "chars": 1190,
    "preview": "# Meltdown-GP PoC\n\nThis folder contains a Meltdown-GP proof-of-concept implementation for x86_64.\nFor ARM, we used the P"
  },
  {
    "path": "pocs/meltdown/GP/main.c",
    "chars": 1680,
    "preview": "#define _GNU_SOURCE\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#"
  },
  {
    "path": "pocs/meltdown/GP/module/Makefile",
    "chars": 166,
    "preview": "obj-m += kernel_module.o \n\nall:\n\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules\n\nclean:\n\tmake -C /lib/mod"
  },
  {
    "path": "pocs/meltdown/GP/module/kernel_module.c",
    "chars": 2652,
    "preview": "#include <linux/fs.h>\n#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/proc_fs.h>\n#include <linux/sched"
  },
  {
    "path": "pocs/meltdown/NM/Makefile",
    "chars": 393,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c victim.c secret.h\n\tgcc main.c -o poc_x86 -Os -I../../\n\tgcc victi"
  },
  {
    "path": "pocs/meltdown/NM/README.md",
    "chars": 1802,
    "preview": "# Meltdown-NM PoC\n\nThis folder contains a Meltdown-NM proof-of-concept implementation for x86_64.\n\n## Compile\n\nCompile u"
  },
  {
    "path": "pocs/meltdown/NM/main.c",
    "chars": 1903,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/NM/secret.h",
    "chars": 62,
    "preview": "#ifndef SECRET_H\n#define SECRET_H\n\n#define SECRET 'S'\n\n#endif\n"
  },
  {
    "path": "pocs/meltdown/NM/victim.c",
    "chars": 271,
    "preview": "#define _GNU_SOURCE\n#include <stdio.h>\n#include \"secret.h\"\n\nint main(void) {\n  size_t secret = SECRET;\n  // Constantly l"
  },
  {
    "path": "pocs/meltdown/P/Makefile",
    "chars": 278,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../ -L../../libpte -lpte -lrt\n\nm"
  },
  {
    "path": "pocs/meltdown/P/README.md",
    "chars": 2423,
    "preview": "# Meltdown-P PoC\n\nThis folder contains a Meltdown-P proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n\nC"
  },
  {
    "path": "pocs/meltdown/P/main.c",
    "chars": 2709,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/PK/Makefile",
    "chars": 99,
    "preview": "all: x86\n\nx86: main_x86\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../\n\nclean:\n\trm -f poc_*\n"
  },
  {
    "path": "pocs/meltdown/PK/README.md",
    "chars": 2006,
    "preview": "# Meltdown-PK PoC\n\nThis folder contains a Meltdown-PK proof-of-concept implementation for x86_64.\n\n## Compile\n\nCompile u"
  },
  {
    "path": "pocs/meltdown/PK/main.c",
    "chars": 2888,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/RW/Makefile",
    "chars": 226,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../\n\nmain_arm: main.c\n\taarch64-l"
  },
  {
    "path": "pocs/meltdown/RW/README.md",
    "chars": 2103,
    "preview": "# Meltdown-RW PoC\n\nThis folder contains a Meltdown-RW proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/meltdown/RW/main.c",
    "chars": 1826,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/SS/Makefile",
    "chars": 68,
    "preview": "all:\n\tgcc -m32 -DM32=1 -o poc_x86 main.c \n\nclean:\n\trm -rf poc_x86\n\t\n"
  },
  {
    "path": "pocs/meltdown/SS/README.md",
    "chars": 1648,
    "preview": "# Meltdown-SS PoC\n\nThis folder contains a Meltdown-SS proof-of-concept implementation for x86_64.\n\n## Compile\n\nCompile u"
  },
  {
    "path": "pocs/meltdown/SS/cacheutils.h",
    "chars": 11146,
    "preview": "#ifndef _CACHEUTILS_H_\n#define _CACHEUTILS_H_\n\n#include <assert.h>\n#include <unistd.h>\n#include <sys/syscall.h>\n#include"
  },
  {
    "path": "pocs/meltdown/SS/main.c",
    "chars": 2599,
    "preview": "#define _GNU_SOURCE\n#include \"cacheutils.h\"\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mma"
  },
  {
    "path": "pocs/meltdown/UD/Makefile",
    "chars": 226,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../\n\nmain_arm: main.c\n\taarch64-l"
  },
  {
    "path": "pocs/meltdown/UD/README.md",
    "chars": 2235,
    "preview": "# Meltdown-UD PoC\n\nThis folder contains a Meltdown-UD proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/meltdown/UD/main.c",
    "chars": 1618,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/meltdown/US/Makefile",
    "chars": 279,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -O3 -I../../ -L../../libpte -lpte -lrt\n\nm"
  },
  {
    "path": "pocs/meltdown/US/README.md",
    "chars": 2551,
    "preview": "# Meltdown-US PoC\n\nThis folder contains a Meltdown-US proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/meltdown/US/main.c",
    "chars": 2785,
    "preview": "#define _GNU_SOURCE\n#include <memory.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <sys/sysca"
  },
  {
    "path": "pocs/spectre/BTB/ca_ip/Makefile",
    "chars": 241,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.cpp\n\tg++ main.cpp -o poc_x86 -Os -I../../../ \n\nmain_arm: main.cpp\n"
  },
  {
    "path": "pocs/spectre/BTB/ca_ip/README.md",
    "chars": 1940,
    "preview": "# Spectre-BTB PoC \n\nThis folder contains a Spectre-BTB proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/BTB/ca_ip/main.cpp",
    "chars": 2539,
    "preview": "#ifndef _GNU_SOURCE\n#define _GNU_SOURCE\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <sche"
  },
  {
    "path": "pocs/spectre/BTB/ca_oop/cacheutils.h",
    "chars": 993,
    "preview": "#ifndef CACHEUTILS_H\n#define CACHEUTILS_H\n\n#ifndef HIDEMINMAX\n#define MAX(X,Y) (((X) > (Y)) ? (X) : (Y))\n#define MIN(X,Y"
  },
  {
    "path": "pocs/spectre/BTB/ca_oop/exploit.sh",
    "chars": 125,
    "preview": "#!/bin/zsh\nfile_name=\"main\"\ngcc -g $file_name.c -o $file_name -Wno-format-security\n./$file_name $(./hyper_thread_pair.sh"
  },
  {
    "path": "pocs/spectre/BTB/ca_oop/hyper_thread_pair.sh",
    "chars": 423,
    "preview": "#!/bin/zsh\n\nsetopt extendedglob\n\ncd /sys/devices/system/cpu/\n\nfor i in cpu[0-9]##; do\n  package=`cat $i/topology/physica"
  },
  {
    "path": "pocs/spectre/BTB/ca_oop/main.c",
    "chars": 5877,
    "preview": "#define _GNU_SOURCE\n\n#include <sys/mman.h>\n#include <stdint.h>\n#include <string.h>\n#include <stdio.h>\n#include <errno.h>"
  },
  {
    "path": "pocs/spectre/BTB/ca_oop/smc_utils.h",
    "chars": 2673,
    "preview": "inline __attribute__((always_inline)) void call_addr(size_t addr)\n{\n  asm volatile(\n    \"movq %0, %%rax\\n\\t\"\n    \"call *"
  },
  {
    "path": "pocs/spectre/BTB/sa_ip/Makefile",
    "chars": 241,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.cpp\n\tg++ main.cpp -o poc_x86 -Os -I../../../ \n\nmain_arm: main.cpp\n"
  },
  {
    "path": "pocs/spectre/BTB/sa_ip/README.md",
    "chars": 1929,
    "preview": "# Spectre-BTB PoC \n\nThis folder contains a Spectre-BTB proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/BTB/sa_ip/main.cpp",
    "chars": 2262,
    "preview": "#ifndef _GNU_SOURCE\n#define _GNU_SOURCE\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <sche"
  },
  {
    "path": "pocs/spectre/BTB/sa_oop/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/BTB/sa_oop/README.md",
    "chars": 1877,
    "preview": "# Spectre-BTB PoC \n\nThis folder contains a Spectre-BTB proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/BTB/sa_oop/main.c",
    "chars": 2382,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n#include <setjmp.h>\n#include <sched.h>\n\n#"
  },
  {
    "path": "pocs/spectre/PHT/ca_ip/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/PHT/ca_ip/README.md",
    "chars": 2392,
    "preview": "# Spectre-PHT PoC \n\nThis folder contains a Spectre-PHT proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/PHT/ca_ip/main.c",
    "chars": 2229,
    "preview": "#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n"
  },
  {
    "path": "pocs/spectre/PHT/ca_oop/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/PHT/ca_oop/README.md",
    "chars": 2771,
    "preview": "# Spectre-PHT PoC \n\nThis folder contains a Spectre-PHT proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/PHT/ca_oop/main.c",
    "chars": 3058,
    "preview": "#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n"
  },
  {
    "path": "pocs/spectre/PHT/sa_ip/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/PHT/sa_ip/README.md",
    "chars": 2199,
    "preview": "# Spectre-PHT PoC \n\nThis folder contains a Spectre-PHT proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/PHT/sa_ip/main.c",
    "chars": 2271,
    "preview": "#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n"
  },
  {
    "path": "pocs/spectre/PHT/sa_oop/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/PHT/sa_oop/README.md",
    "chars": 2615,
    "preview": "# Spectre-PHT PoC \n\nThis folder contains a Spectre-PHT proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/PHT/sa_oop/main.c",
    "chars": 3146,
    "preview": "#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n"
  },
  {
    "path": "pocs/spectre/RSB/ca_ip/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/RSB/ca_ip/README.md",
    "chars": 1949,
    "preview": "# Spectre-RSB PoC\n\nThis folder contains a Spectre RSB proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/spectre/RSB/ca_ip/main.c",
    "chars": 1778,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sched.h>\n#include <pthread.h>\n#include <sys/mman.h>"
  },
  {
    "path": "pocs/spectre/RSB/ca_oop/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/RSB/ca_oop/README.md",
    "chars": 1866,
    "preview": "# Spectre-RSB PoC\n\nThis folder contains a Spectre-RSB proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/spectre/RSB/ca_oop/main.c",
    "chars": 2180,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sched.h>\n#include <pthread.h>\n#include <sys/mman.h>"
  },
  {
    "path": "pocs/spectre/RSB/sa_ip/Makefile",
    "chars": 252,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ -lpthread\n\nmain_arm: main"
  },
  {
    "path": "pocs/spectre/RSB/sa_ip/README.md",
    "chars": 1809,
    "preview": "# Spectre-RSB PoC\n\nThis folder contains a Spectre RSB proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/spectre/RSB/sa_ip/main.c",
    "chars": 2107,
    "preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sched.h>\n#include <pthread.h>\n\n#include \"libcache/c"
  },
  {
    "path": "pocs/spectre/RSB/sa_oop/Makefile",
    "chars": 233,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../../ \n\nmain_arm: main.c\n\taarch"
  },
  {
    "path": "pocs/spectre/RSB/sa_oop/README.md",
    "chars": 2264,
    "preview": "# Spectre-RSB PoC\n\nThis folder contains a Spectre RSB proof-of-concept implementation for x86_64 and ARMv8.\n\n## Compile\n"
  },
  {
    "path": "pocs/spectre/RSB/sa_oop/main.c",
    "chars": 2145,
    "preview": "#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n"
  },
  {
    "path": "pocs/spectre/STL/Makefile",
    "chars": 229,
    "preview": "all: x86\n\nx86: main_x86\narm: main_arm\n\nmain_x86: main.c\n\tgcc main.c -o poc_x86 -Os -I../../\n\nmain_arm: main.c\n\taarch64-l"
  },
  {
    "path": "pocs/spectre/STL/README.md",
    "chars": 1727,
    "preview": "# Spectre-STL PoC \n\nThis folder contains a Spectre-STL proof-of-concept implementation for x86_64 and ARMv8. \n\n## Compil"
  },
  {
    "path": "pocs/spectre/STL/main.c",
    "chars": 2483,
    "preview": "#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n"
  }
]

About this extraction

This page contains the full source code of the IAIK/transientfail GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 123 files (486.1 KB), approximately 143.0k tokens, and a symbol index with 513 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!