diff --git a/notebooks/bayes-net-editor.ipynb b/notebooks/bayes-net-editor.ipynb new file mode 100644 index 00000000..3b1369d6 --- /dev/null +++ b/notebooks/bayes-net-editor.ipynb @@ -0,0 +1,158 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "bc83eb2c-32c1-4d5a-9e4f-9e0e0378c8a6", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "660a13e6881c4d69b018e42528d36b35", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Box(children=(FloatSlider(value=0.2, continuous_update=False, description='answer_is_bogon', max=1.0, step=0.0…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import ipywidgets as widgets\n", + "from ipywidgets import VBox, Box, Layout\n", + "from IPython.display import display\n", + "\n", + "slider_map = {}\n", + "\n", + "values = [\n", + "\"answer_is_bogon\", \n", + "\"answer_matches_probe_asn\", \n", + "\"answer_matches_probe_cc\",\n", + "\"answer_is_cloud_provider\",\n", + "\"answer_other\"\n", + "]\n", + "\n", + "class Changer:\n", + " change_in_progress = False\n", + " \n", + " def callback(self, value):\n", + " if self.change_in_progress:\n", + " return\n", + " self.change_in_progress = True\n", + " changed_slider = value['owner'].description\n", + " other_slider_sum = 0\n", + " for k, s in slider_map.items():\n", + " if k == changed_slider:\n", + " continue\n", + " other_slider_sum += s.value\n", + " new_other_slider_sum = 1 - value['new']\n", + " mult_factor = new_other_slider_sum/other_slider_sum\n", + " for k, s in slider_map.items():\n", + " if k == changed_slider:\n", + " continue\n", + " s.value = mult_factor * s.value\n", + " self.change_in_progress = False\n", + " \n", + "changer = Changer()\n", + "slider_values = {v: 1.0/len(values) for v in values}\n", + "\n", + "for v in values:\n", + " slider = widgets.FloatSlider(\n", + " value=1/len(values), \n", + " min=0.0,\n", + " max=1.0,\n", + " description=v,\n", + " step=0.001,\n", + " continuous_update=False\n", + " )\n", + " slider.observe(changer.callback, names='value')\n", + " slider_map[v] = slider\n", + "\n", + "display(\n", + " Box(children=list(slider_map.values()), layout=Layout(display='flex', flex_flow='column', align_items='stretch'))\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "97cc09d2-c71b-49a5-9a1c-3f6ace5e6b1f", + "metadata": {}, + "outputs": [], + "source": [ + "def validate_matrix(matrix):\n", + " cols = len(matrix[0])\n", + " rows = len(matrix)\n", + " valid = True\n", + " for col_idx in range(cols):\n", + " col_data = []\n", + " for row_idx in range(rows):\n", + " col_data.append(matrix[row_idx][col_idx])\n", + " if sum(col_data) != 1:\n", + " print(f\"col #{col_idx} INVALID ({sum(col_data)}!=1)\")\n", + " print(col_data)\n", + " valid = False\n", + " if valid:\n", + " print(\"ALL OK\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fee25b03-eec8-4db4-9021-ce92eee94dbf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ALL OK\n" + ] + } + ], + "source": [ + "validate_matrix([\n", + " # consistent inconsistent\n", + " # \"none\", \"bad_certificate\", \"connection_reset_after_ch\", \"timeout_after_ch\", \"timeout\" \"connection_reset\" \"other\" \"down\"\n", + " [0.02, 0.95, 0.90, 0.85, 0.55, 0.65, 0.07, 0.07, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02], # blocked\n", + " [0.95, 0.01, 0.01, 0.01, 0.02, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01], # ok\n", + " [0.02, 0.03, 0.07, 0.09, 0.40, 0.25, 0.07, 0.07, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05], # down\n", + " [0.01, 0.01, 0.02, 0.05, 0.03, 0.09, 0.85, 0.85, 0.92, 0.92, 0.92, 0.92, 0.92, 0.92, 0.92, 0.92], # unknown\n", + " ])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f8a25ac-80fe-4124-af4e-d5455faf71d2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/bn-notes.md b/notebooks/bn-notes.md new file mode 100644 index 00000000..b3829e00 --- /dev/null +++ b/notebooks/bn-notes.md @@ -0,0 +1,7 @@ +Useful links: + +- https://maucher.pages.mi.hdm-stuttgart.de/artificial-intelligence/05aBayesNetGarage.html +- https://github.com/paulgovan/BayesianNetwork?tab=readme-ov-file +- https://www.cs.washington.edu/dm/vfml/appendixes/bif.htm +- https://pgmpy.org/models/bayesiannetwork.html +- https://erdogant.github.io/bnlearn/pages/html/index.html diff --git a/notebooks/pyproject.toml b/notebooks/pyproject.toml new file mode 100644 index 00000000..94cdc333 --- /dev/null +++ b/notebooks/pyproject.toml @@ -0,0 +1,48 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "oonidata-notebooks" +dynamic = ["version"] +description = '' +readme = "README.md" +requires-python = ">=3.8" +license = "MIT" +keywords = [] +authors = [ + { name = "Arturo Filastò", email = "arturo@filasto.net" }, +] +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", +] +dependencies = [ + "jupyterlab", + "pandas", + "numpy", + "bnlearn", + "d3blocks", + "pygraphviz", + "bokeh", + "ipywidgets" +] + +[tool.hatch.envs.types] +extra-dependencies = [ + "mypy>=1.0.0", +] + +[tool.coverage.report] +exclude_lines = [ + "no cov", + "if __name__ == .__main__.:", + "if TYPE_CHECKING:", +] diff --git a/notebooks/web-analysis-bn.ipynb b/notebooks/web-analysis-bn.ipynb new file mode 120000 index 00000000..8c60223f --- /dev/null +++ b/notebooks/web-analysis-bn.ipynb @@ -0,0 +1 @@ +../oonipipeline/notebooks/web-analysis-bn.ipynb \ No newline at end of file diff --git a/notebooks/web-analysis-full.bif b/notebooks/web-analysis-full.bif new file mode 100644 index 00000000..8255ee41 --- /dev/null +++ b/notebooks/web-analysis-full.bif @@ -0,0 +1,151 @@ +network unknown { +} +variable DNS Answer { + type discrete [ 5 ] { answer_is_bogon, answer_matches_probe_asn, answer_matches_probe_cc, answer_is_cloud_provider, answer_other }; +} +variable DNS Answer Consistency { + type discrete [ 2 ] { consistent, inconsistent }; +} +variable DNS Answer TLS Consistency { + type discrete [ 3 ] { tls_consistent, tls_inconsistent, unknown }; +} +variable DNS Ctrl Failure { + type discrete [ 3 ] { none, nxdomain, server_failure }; +} +variable DNS Failure Consistency { + type discrete [ 3 ] { ok, expected_not_ok, unexpected_not_ok }; +} +variable DNS Outcome { + type discrete [ 3 ] { blocked, ok, down }; +} +variable DNS VP Failure { + type discrete [ 3 ] { none, nxdomain, server_failure }; +} +variable TCP Ctrl Failure { + type discrete [ 4 ] { none, connection_reset, timeout, other }; +} +variable TCP Outcome { + type discrete [ 4 ] { blocked, ok, down, unknown }; +} +variable TCP VP Result { + type discrete [ 5 ] { none, connection_reset, timeout, other, down }; +} +variable TLS Ctrl Failure { + type discrete [ 3 ] { none, bad_certificate, other }; +} +variable TLS Outcome { + type discrete [ 4 ] { blocked, ok, down, unknown }; +} +variable TLS VP Result { + type discrete [ 8 ] { none, bad_certificate, connection_reset_after_ch, timeout_after_ch, timeout, connection_reset, other, down }; +} +probability ( DNS Answer ) { + table 0.004, 0.006, 0.06, 0.73, 0.2 ; +} +probability ( DNS Answer Consistency | DNS Answer, DNS Answer TLS Consistency ) { + ( answer_is_bogon, tls_consistent ) 0.99, 0.01; + ( answer_is_bogon, tls_inconsistent ) 0.001, 0.999; + ( answer_is_bogon, unknown ) 0.001, 0.999; + ( answer_matches_probe_asn, tls_consistent ) 0.999, 0.001; + ( answer_matches_probe_asn, tls_inconsistent ) 0.01, 0.99; + ( answer_matches_probe_asn, unknown ) 0.3, 0.7; + ( answer_matches_probe_cc, tls_consistent ) 0.999, 0.001; + ( answer_matches_probe_cc, tls_inconsistent ) 0.001, 0.999; + ( answer_matches_probe_cc, unknown ) 0.3, 0.7; + ( answer_is_cloud_provider, tls_consistent ) 0.999, 0.001; + ( answer_is_cloud_provider, tls_inconsistent ) 0.01, 0.99; + ( answer_is_cloud_provider, unknown ) 0.8, 0.2; + ( answer_other, tls_consistent ) 0.999, 0.001; + ( answer_other, tls_inconsistent ) 0.001, 0.999; + ( answer_other, unknown ) 0.2, 0.8; + +} +probability ( DNS Answer TLS Consistency | DNS Answer ) { + ( answer_is_bogon ) 0.01, 0.05, 0.94; + ( answer_matches_probe_asn ) 0.8, 0.15, 0.05; + ( answer_matches_probe_cc ) 0.75, 0.2, 0.05; + ( answer_is_cloud_provider ) 0.9, 0.08, 0.02; + ( answer_other ) 0.94, 0.04, 0.02; + +} +probability ( DNS Ctrl Failure ) { + table 0.994, 0.004, 0.002 ; +} +probability ( DNS Failure Consistency | DNS Ctrl Failure, DNS VP Failure ) { + ( none, none ) 0.99, 0.01, 0.01; + ( none, nxdomain ) 0.01, 0.05, 0.94; + ( none, server_failure ) 0.01, 0.05, 0.94; + ( nxdomain, none ) 0.94, 0.01, 0.05; + ( nxdomain, nxdomain ) 0.01, 0.98, 0.01; + ( nxdomain, server_failure ) 0.01, 0.92, 0.07; + ( server_failure, none ) 0.94, 0.01, 0.05; + ( server_failure, nxdomain ) 0.01, 0.92, 0.07; + ( server_failure, server_failure ) 0.01, 0.98, 0.01; + +} +probability ( DNS Outcome | DNS Answer Consistency, DNS Failure Consistency ) { + ( consistent, ok ) 0.01, 0.99, 0.0; + ( consistent, expected_not_ok ) 0.01, 0.01, 0.98; + ( consistent, unexpected_not_ok ) 0.4, 0.4, 0.2; + ( inconsistent, ok ) 0.8, 0.2, 0.0; + ( inconsistent, expected_not_ok ) 0.2, 0.05, 0.75; + ( inconsistent, unexpected_not_ok ) 0.9, 0.01, 0.09; + +} +probability ( DNS VP Failure | DNS Ctrl Failure ) { + ( none ) 0.994, 0.004, 0.002; + ( nxdomain ) 0.02, 0.98, 0.01; + ( server_failure ) 0.02, 0.01, 0.98; + +} +probability ( TCP Ctrl Failure ) { + table 0.98, 0.001, 0.014, 0.005 ; +} +probability ( TCP Outcome | DNS Answer Consistency, TCP VP Result ) { + ( consistent, none ) 0.02, 0.95, 0.02, 0.01; + ( consistent, connection_reset ) 0.95, 0.01, 0.03, 0.01; + ( consistent, timeout ) 0.9, 0.01, 0.08, 0.01; + ( consistent, other ) 0.85, 0.01, 0.09, 0.05; + ( consistent, down ) 0.01, 0.08, 0.01, 0.9; + ( inconsistent, none ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, connection_reset ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, timeout ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, other ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, down ) 0.05, 0.01, 0.09, 0.85; + +} +probability ( TCP VP Result | TCP Ctrl Failure ) { + ( none ) 0.98, 0.001, 0.01, 0.009, 0.009; + ( connection_reset ) 0.02, 0.14, 0.05, 0.07, 0.72; + ( timeout ) 0.01, 0.02, 0.1, 0.02, 0.85; + ( other ) 0.01, 0.06, 0.06, 0.12, 0.75; + +} +probability ( TLS Ctrl Failure ) { + table 0.98, 0.005, 0.015 ; +} +probability ( TLS Outcome | DNS Answer Consistency, TLS VP Result ) { + ( consistent, none ) 0.02, 0.95, 0.02, 0.01; + ( consistent, bad_certificate ) 0.95, 0.01, 0.03, 0.01; + ( consistent, connection_reset_after_ch ) 0.9, 0.01, 0.07, 0.02; + ( consistent, timeout_after_ch ) 0.85, 0.01, 0.09, 0.05; + ( consistent, timeout ) 0.55, 0.02, 0.4, 0.03; + ( consistent, connection_reset ) 0.65, 0.01, 0.25, 0.09; + ( consistent, other ) 0.07, 0.01, 0.07, 0.85; + ( consistent, down ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, none ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, bad_certificate ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, connection_reset_after_ch ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, timeout_after_ch ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, timeout ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, connection_reset ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, other ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, down ) 0.02, 0.01, 0.05, 0.92; + +} +probability ( TLS VP Result | TLS Ctrl Failure ) { + ( none ) 0.97, 0.005, 0.005, 0.005, 0.005, 0.005, 0.004, 0.001; + ( bad_certificate ) 0.02, 0.1, 0.01, 0.01, 0.01, 0.01, 0.02, 0.82; + ( other ) 0.01, 0.01, 0.05, 0.05, 0.05, 0.05, 0.12, 0.66; + +} diff --git a/notebooks/web-analysis.bif b/notebooks/web-analysis.bif new file mode 100644 index 00000000..f537addd --- /dev/null +++ b/notebooks/web-analysis.bif @@ -0,0 +1,69 @@ +network unknown { +} +variable DNS Answer Meta { + type discrete [ 7 ] { answer_failure_nxdomain, answer_failure_other, answer_is_bogon, answer_matches_probe_asn, answer_matches_probe_cc, answer_is_cloud_provider, answer_ok }; +} +variable DNS Consistency { + type discrete [ 2 ] { consistent, inconsistent }; +} +variable DNS Ctrl Failure { + type discrete [ 3 ] { none, nxdomain, server_failure }; +} +variable DNS Outcome { + type discrete [ 3 ] { blocked, ok, down }; +} +variable DNS TLS Consistency { + type discrete [ 3 ] { tls_consistent, tls_inconsistent, tls_connection_failed }; +} +probability ( DNS Answer Meta | DNS Ctrl Failure ) { + ( none ) 0.0238, 0.01, 0.003745, 0.004537, 0.060217, 0.19626, 0.700935; + ( nxdomain ) 0.9, 0.03, 0.014, 0.014, 0.014, 0.014, 0.014; + ( server_failure ) 0.015, 0.91, 0.015, 0.015, 0.015, 0.015, 0.015; + +} +probability ( DNS Consistency | DNS Answer Meta, DNS TLS Consistency ) { + ( answer_failure_nxdomain, tls_consistent ) 0.01, 0.99; + ( answer_failure_nxdomain, tls_inconsistent ) 0.001, 0.999; + ( answer_failure_nxdomain, tls_connection_failed ) 0.001, 0.999; + ( answer_failure_other, tls_consistent ) 0.01, 0.99; + ( answer_failure_other, tls_inconsistent ) 0.001, 0.999; + ( answer_failure_other, tls_connection_failed ) 0.001, 0.999; + ( answer_is_bogon, tls_consistent ) 0.03, 0.97; + ( answer_is_bogon, tls_inconsistent ) 0.01, 0.99; + ( answer_is_bogon, tls_connection_failed ) 0.01, 0.99; + ( answer_matches_probe_asn, tls_consistent ) 0.999, 0.001; + ( answer_matches_probe_asn, tls_inconsistent ) 0.001, 0.999; + ( answer_matches_probe_asn, tls_connection_failed ) 0.3, 0.7; + ( answer_matches_probe_cc, tls_consistent ) 0.999, 0.001; + ( answer_matches_probe_cc, tls_inconsistent ) 0.001, 0.999; + ( answer_matches_probe_cc, tls_connection_failed ) 0.2, 0.8; + ( answer_is_cloud_provider, tls_consistent ) 0.98, 0.02; + ( answer_is_cloud_provider, tls_inconsistent ) 0.001, 0.999; + ( answer_is_cloud_provider, tls_connection_failed ) 0.1, 0.9; + ( answer_ok, tls_consistent ) 0.9999, 0.0001; + ( answer_ok, tls_inconsistent ) 0.01, 0.99; + ( answer_ok, tls_connection_failed ) 0.2, 0.8; + +} +probability ( DNS Ctrl Failure ) { + table 0.994, 0.004, 0.002 ; +} +probability ( DNS Outcome | DNS Ctrl Failure, DNS Consistency ) { + ( none, consistent ) 0.1, 0.9, 0.0; + ( none, inconsistent ) 0.9, 0.1, 0.0; + ( nxdomain, consistent ) 0.2, 0.0, 0.8; + ( nxdomain, inconsistent ) 0.8, 0.0, 0.2; + ( server_failure, consistent ) 0.1, 0.8, 0.1; + ( server_failure, inconsistent ) 0.7, 0.1, 0.2; + +} +probability ( DNS TLS Consistency | DNS Answer Meta ) { + ( answer_failure_nxdomain ) 0.96, 0.02, 0.02; + ( answer_failure_other ) 0.96, 0.02, 0.02; + ( answer_is_bogon ) 0.0, 0.02, 0.98; + ( answer_matches_probe_asn ) 0.05, 0.8, 0.15; + ( answer_matches_probe_cc ) 0.05, 0.8, 0.15; + ( answer_is_cloud_provider ) 0.9, 0.08, 0.02; + ( answer_ok ) 0.94, 0.04, 0.02; + +} diff --git a/notebooks/web_analysis.png b/notebooks/web_analysis.png new file mode 100644 index 00000000..310bb278 Binary files /dev/null and b/notebooks/web_analysis.png differ diff --git a/notebooks/web_analysis_complex.png b/notebooks/web_analysis_complex.png new file mode 100644 index 00000000..b1b3f860 Binary files /dev/null and b/notebooks/web_analysis_complex.png differ diff --git a/notebooks/web_analysis_full.png b/notebooks/web_analysis_full.png new file mode 100644 index 00000000..b1b3f860 Binary files /dev/null and b/notebooks/web_analysis_full.png differ diff --git a/notebooks/web_analysis_simple.png b/notebooks/web_analysis_simple.png new file mode 100644 index 00000000..3dbd1cd0 Binary files /dev/null and b/notebooks/web_analysis_simple.png differ diff --git a/oonipipeline/notebooks/.gitignore b/oonipipeline/notebooks/.gitignore new file mode 100644 index 00000000..da3a71f6 --- /dev/null +++ b/oonipipeline/notebooks/.gitignore @@ -0,0 +1,2 @@ +*.gz +*.csv diff --git a/oonipipeline/notebooks/DNS BN Analysis.ipynb b/oonipipeline/notebooks/DNS BN Analysis.ipynb new file mode 100644 index 00000000..842d2e36 --- /dev/null +++ b/oonipipeline/notebooks/DNS BN Analysis.ipynb @@ -0,0 +1,3335 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 194, + "id": "f309af11-65e3-4d73-88de-655921a52693", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from tqdm.notebook import tqdm\n", + "from IPython.display import Image\n", + "from pgmpy.models import BayesianNetwork\n", + "from pgmpy.factors.discrete import TabularCPD\n", + "tqdm.pandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "3f8fc6f9-9786-4013-8802-359432fb01a2", + "metadata": {}, + "outputs": [], + "source": [ + "dns_analysis_bn = BayesianNetwork([\n", + " ('answer_matches_probe_cc', 'answer_is_blockpage'),\n", + " ('answer_matches_probe_asn', 'answer_is_blockpage'),\n", + " ('answer_contains_unreachable_ip', 'answer_is_blockpage'),\n", + " ('answer_contains_bogon', 'answer_is_blockpage'),\n", + " ('answer_is_blockpage', 'contains_tls_consistent_answer'),\n", + " ('answer_count', 'answer_is_blockpage'),\n", + " ('answer_is_cloud_provider', 'answer_is_blockpage'),\n", + " #('contains_tls_consistent_answer', 'dns_outcome'),\n", + " #('bogon_present_in_ctrl_and_exp', 'dns_outcome'),\n", + "\n", + " #('dns_consistent_failure', 'dns_failure_outcome'),\n", + " #('dns_exp_is_nxdomain', 'dns_failure_outcome'),\n", + " #('dns_failure_outcome', 'dns_outcome')\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "fcf3aa05-a59d-4e5a-af62-9805f413bfcf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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TtbW1jKZTJcN0B0dHZWfn3/FsDoyMlLPPvusfvvtN1lZWVU7p62traZMmaJPPvmkxnHp6em1rld4qTD9wvUKO3ToUC0wBQAAACyAIBEAAABA43PhiKVLTa2alpam3NzcasdVjXK83NSqvr6+cnV1tdCdXZ23335bnp6emjBhQr2sJTdq1Cht2rRJdf1noJWVlcxms8LCwrRw4UL5+/srIyNDe/bsMQLDgwcPGqMdmzVrpq5du6pbt27q2rWrERy2adOGtTNRL06fPq3jx48rNjZWx44dM57DjIwMSZKnp6fatGkjDw8POTo6ymw2KzMzU8nJycrOzjZGK1pbW8va2lrl5eU6ePCgunfvXuv1IiMjNXv2bP3666+ysbG55GjH4OBgPf7444qLi1N8fLxOnDihkydPGutGurm5qWPHjurUqVONl7e39w3oKQAAAKBeECQCAAAAuHkVFxdfcv3GC39mZWVVCwCaNGlyyfUbL/zp7e1t0Wk1R40apY0bN6pFixZ67rnn9Nhjj6l58+bXfL6WLVsqMzPzkvutra1lY2Oj8vJymc1mWVtby9vbW15eXjKbzSorK1NsbKzMZnON9Rd79eqloKAgRk/BInJycox1QqvWDD1w4ICKi4uNgDs0NFSBgYHy8vJSbm6ukpOTlZKSonHjxmnw4MHVzrdjxw698MIL2r59u2xtbauNkr4UNze3WtcrrHoBAAAANyGCRAAAAAC3h0uNcrwwiExJSVF+fr5xjL29vTw8PK44tWrbtm3l4uJS7zV37dpVR44ckSTZ2NjI3t5eM2bM0NNPP602bdpc1blycnLk7u4u6fxUjNbW1sZoKTs7O3Xs2FFdunSRo6Ojzp07p5SUFB07dkxlZWVq0aKF+vbtq379+qlfv37q06ePmjVrVr83C9SzsrIy/frrr9q9e7d2796tnTt3KjExUdbW1goMDFS/fv10991365577lHLli0lSTt37tRLL72kH3/8sc4BonR+9G5hYaEcHR1v5C0BAAAADY0gEQAAAAAudOEox8uNdszMzKy2TtqFoxwvN9rRx8enztN8enp66vTp09W22dnZqbKyUvfff7/mzJmjO++8s07n+vnnnzV69Gh16tRJPXv2VGBgoPz9/WUymRQdHa2tW7dq586dKi8vV9euXTVo0CAjPOzcuXPdOxBoxDIzM7V7927t2rVLO3bs0K5du2QymRQSEiJfX1/99ttvSktLk9lsNv6sXWo604v99ttvCgkJucF3AAAAADQogkQAAAAAuBalpaU6c+bMFadWTUlJkclkMo5zcHCQu7v7FadW9fX1lZOT0yVDDDs7O5lMJvXt21dz587V6NGjLxtQmkwm2dnZKS8vT+vWrdPq1asVGRmp3Nxc+fr6atiwYcaLNdtwuygsLNRPP/2kyMhIRUZG6siRI7Kzs1OXLl3Url07WVlZ6dChQ0pISJDZbJatra3MZnOtfy7XrFmj++67zwJ3AQAAANwwBIkAAAAAcKNlZmYqKyvLGMl46tQpnTp1SpmZmcYajmlpadWmVbWyslJd/rlWNf1icHCw5syZo/Hjx8vW1rZam3Pnzmnt2rVauXKltmzZooqKCg0dOlSjR4/WsGHDFBQUVO/3DNyMMjIytHXrVq1fv14RERHKy8tTv379NHr0aHXs2FGpqanat2+fdu3apaSkJJnNZtnb28tkMmnBggV69tlnLX0LAAAAQH0iSAQAAACAxqKoqMgIGffu3au//OUvdT62Knj09fXV7NmzNXXqVG3fvl0ff/yxNm3aJEkaPny4xowZo/vuu89YLxFA7UpLS7VlyxatXLlSa9eu1blz59SnTx/96U9/0vjx42UymfTrr79q//792rdvn7p166YXX3zR0mUDAAAA9YkgEQAAAAAao8jISA0fPrxObaumObWxsVHXrl3l5uam48ePKz09XXfffbemTp2q3/3ud3J1db3BVQO3JpPJpK1bt+qLL77QN998I0dHR02dOlWPP/64AgICLF0eAAAAcKMQJAIAAABAY/T5559r6tSpqqysrLHP3t5eZWVlsrGxUXBwsMLCwuTv768ff/xR33zzjRwcHDRlyhTNmDFDgYGBFqgeuHWdPn1an376qf71r3/p5MmTGjZsmF577TUNGDDA0qUBAAAA9S3e2tIVAAAAAABqysrKkpWVlaTzIw6l8+sh9unTR7Nnz9aWLVuUl5enH3/8URUVFZo5c6Z27typf/7zn0pLS9OiRYsIEYEboEWLFpo9e7bi4+O1bt06mUwmhYaG6o9//KNiYmIsXR4AAABQr2wtXQAAAAAAoKaMjAxZW1vrzjvv1PDhwzV48GD1799fTk5OkqSKigq99957mj9/vmxtbbVgwQI99thjRugI4MaytrZWWFiY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cLCsra31/fffG8GjJJ04caJGUN2uXTt9+eWX2rt3r7F+4YVKSkqqvY+KilJpaan69OlTp+fAyspKrVq10sKFC1VZWamZM2dqy5YtcnFxkdTwn1t9Kiws1P3336+Kigr985//tHQ5AAAAwDUhSAQAAACAm4C1tbVWrlwpPz8/DRgwoEZQ1Jg4OTlJktasWaPy8nJFRkbq0KFDysnJUVxcnBITE3X27FlJqrZeXnl5uUwmk0pLS1VZWalXX33VCKr69++vzp07V5sa1M7OThMnTtRnn32madOmSTq/xt7IkSO1bds2Y+0+6fz6iY8//rh27dqlwYMH68svv9TSpUs1YcIEY01Ek8kkSTpz5sxV33NBQYGk8+GRpDrVXxdFRUXV1gJcsGCBpk6daoSkF1/Xy8tLf/7zn5WYmKht27YZx61Zs0YPPPCABg8erFatWmny5Mk6fPiwHnjgAf3www/68MMP9fLLL2vkyJE1zjtixAi98sor+ve//60PPvigWn25ublKTk423m/cuFG9e/fWmDFj6vQcvPPOO/rpp5+UkpIiOzs75ebmKjo62pjiti6fW2OUlpamwYMH69ixY9qwYYO8vb0tXRIAAABwTWxee+211yxdBAAAAADgyhwcHPTQQw9p7969mjt3rqTza9DVtj6fJXl6eiohIUFLly7V4sWL1b17dwUGBmrt2rXG1Jfvvfeezp07p6KiIgUEBGjz5s16//33lZOTo9LSUgUFBWnhwoVatWqVysvLtXHjRjVr1kyvv/56tfX6fH19tXv3br311lvGNicnJ5nN5mpBoiQNGTJEqampioiI0OrVq7Vt2zb99a9/VY8ePbRq1SotWrRIZ86cUXJysgICAuoc/qSkpGj+/Pnat2+fsrOz1bFjR7Vt21bz5s27Yv2X4+3trT179mjRokU6e/asli1bJkdHR/3973+XnZ2dTp06pXnz5mnfvn3KysqSr6+vAgMDNWzYMBUUFOjll1/WmTNntGLFCiUkJGj58uWys7OTJN19992KjY3Vt99+q+XLlys6OloLFy5U69at9c033+ijjz5Sdna2SkpK5O/vryZNmujLL7/Upk2blJOTo3bt2ikqKkqxsbGKiYlRTk6OPvnkE+3fv19fffWV3NzcrvgcjBs3Tnl5efr444/1xRdfaNmyZfrkk0/00UcfadmyZQoJCVHHjh0v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7Ngx4/fY2FiVlJRIkry9vRUUFKSAgAD16NFDPXr0ULdu3ZhqGAAAAJZEkAgAAAAAN0phYaEOHz6sgwcP6tdff9XBgwf122+/qaSkRPb29goJCVFISIgRGAYEBKhz586yt7e3dOkAGkBlZaWSkpIUGxurmJgYxcTE6NixYzp48KDy8vJkY2Mjf39/9ejRQz179jR+8qUCAAAANBCCRAAAAACoD2azWdHR0dq+fbt27NihvXv36vjx46qsrJSrq6sxwqgqDAgODmatNAC1MpvNSkhIML6AUPVlhPT0dEmSr6+vevXqpdDQUIWGhqp37958AQEAAAA3AkEiAAAAAFyLkpIS7du3zwgOo6KidPbsWTk7O6tfv37q16+fERp26NDB0uUCuAVkZWUZoeKePXu0Y8cOZWZmqkmTJrrzzjs1cOBAhYaGasCAAXJzc7N0uQAAALj5ESQCAAAAQF0dPHhQ69ev1/r167Vv3z6VlpaqVatWxn/eh4aGqnv37rK1tbV0qQBuE3FxcYqKijK+1BATEyMrKysFBwfr3nvvVVhYmAYNGsQIaAAAAFwLgkQAAAAAuJSioiJt3bpVERERioiIUGpqqnx8fBQWFqbBgwdr4MCBat++vaXLBADD6dOnFRUVpZ9//lkbNmxQdHS0XF1dNXz4cIWHhyssLExeXl6WLhMAAAA3B4JEAAAAALhQfn6+vv32W3399dfatm2bysrK1KtXL4WHh2v06NG64447ZGVlZekyAaBOEhMTFRERoXXr1umnn35SWVmZevfurbFjx+qhhx6Sr6+vpUsEAABA40WQCAAAAABms1k//vijlixZojVr1qiiokKjRo3S73//e4WHh8vb29vSJQLAdSssLFRkZKTWrVunVatWKTc3V4MHD9b06dM1duxYOTg4WLpEAAAANC4EiQAAAABuX6Wlpfr000/1wQcfKDo6WgMGDNCUKVM0duxYubu7W7o8ALhhSktLtWHDBn3++edau3at3N3d9cgjj2jWrFlMfQoAAIAqBIkAAAAAbj8mk0mLFy/W3/72N505c0aTJk3SE088oR49eli6NABocOnp6Vq8eLEWL16sgoICzZgxQy+88II8PDwsXRoAAAAsK97a0hUAAAAAQEPasWOH7rjjDj3//PMaO3asTpw4oX//+9+EiDdQTk6OgoODtWzZMovWUV5erlWrVmnY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363Y2Fh9++23Wr58uaKjo7Vw4UK1bt1akjRs2DAVFBTo5Zdf1pkzZ7RixQolJCRo+fLlsrOz03fffaf33ntP586dU1FRkQICArR582a9//77ysnJUWlpqbp37y4/Pz99/fXXWr58uXr16qWwsDAlJCRo6dKlWrx4sbp3767AwECtXbtW9vb26t+/v+bPn699+/YpOztbHTt21NGjR694raCgIC1cuFCrVq1SeXm5Nm7cqGbNmun111+XjY1NnfqkRYsW1Wpt06aN5s2bp3379ikrK0u+vr5q37695s2bd13XaYi+v1x/pKen1+jjtm3bXva+Lu6bPn36aMiQIUpNTVVERIRWr16tbdu26a9//at69Ohxzc9Hnz59rth/np6el32GHBwc6u158fX11e7du/XWW28Z25ycnGQ2m6sFiZIu2x+rVq3SokWLdObMGSUnJysgIEDe3t51el4aK7PZrIiICE2YMEHvvfeewsLC9P3336tv376WLg0AAACWc9bKfL3zzQAAAADATSgtLU1vv/22lixZoqZNm2r69Ol67LHH1KFDB0uXdl3S09OVnZ2t4OBg2dnZ1dhfXFysmJgYBQUFVZtG8mqYTCaVl5cb6wNK56d8bN68uXHNnJwcubm5XdtN6HyoUVxcrIqKCsXFxcnf31/Ozs71UuuNuI50Y/v+auusS/tL9c3p06eVnJysoKCgS/bb5Vypzy/lep6hq+mflJQUtWnTxnhfXl6urKwstWrVqtb219sfjd25c+e0dOlSffzxx4qLi9Pvf/97vfLKK8Z6kQAAALitxRMkAgAAALitZWZmasmSJVq8eLHS09M1aNAgTZo0SWPHjpWrq6ulywOAemcymbRx40atWLFCa9euNaZ9nTlzprp06WLp8gAAANB4ECQCAAAAgHR+VNL69eu1YsUKff/99zKbzRoyZIjCw8MVHh5+049UBHB7O3PmjDZt2qR169Zp06ZNysnJMb44MW7cODVr1szSJQIAAKDxIUgEAAAAgIvl5uZqzZo1ioiI0ObNm5Wbm6vAwECNHj1aYWFhGjhwYK1TV+LGS0lJ0cMPP3zFdlOmTNGkSZMa/XVuZfSh5R06dEjr169XRESEdu3aJWtra911110KCwvTmDFj5OfnZ+kSAQAA0LgRJAIAAADA5ZhMJm3fvl3r16/XunXrFBMTo2bNmmngwIEK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", + "text/plain": [ + "" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viz = dns_analysis_bn.to_graphviz()\n", + "viz.draw('dns_analysis_bn.png', prog='dot')\n", + "Image('dns_analysis_bn.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "1ee80ef0-9056-4c9d-b650-3231387a596b", + "metadata": {}, + "outputs": [], + "source": [ + "samples = pd.read_csv('dns_analysis_samples_1M.csv.gz', usecols=[\n", + " 'answer_matches_probe_cc',\n", + " 'answer_matches_probe_asn',\n", + " 'answer_contains_unreachable_ip',\n", + " 'answer_contains_bogon',\n", + " 'answer_is_blockpage', \n", + " 'contains_tls_consistent_answer',\n", + " 'answer_is_cloud_provider',\n", + " 'answer_count',\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "id": "bba49cb2-7a0b-4618-9c1d-714803780d74", + "metadata": {}, + "outputs": [], + "source": [ + "#samples_full = pd.read_csv('dns_analysis_samples_1M.csv.gz')\n", + "samples_extra = pd.read_csv('dns_analysis_samples_extra_1M.csv.gz')" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "id": "dffd0e2f-39ef-42e5-a545-084c2b354c28", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0target_domain_namemeasurement_uidprobe_ccprobe_asnanswer_count_numanswer_counttls_consistenttls_inconsistentcontains_tls_consistent_answer...answer_asn_in_trusted_answersanswer_asorg_in_trusted_answersanswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_providerfp_namefalse_postiveanswer_is_blockpageanswer_contains_unreachable_ip
00www.coolearth.org20240813184519.240242_RU_webconnectivity_70834...RU516452med101.0...100001NaN000
11kat.am20240415213315.451159_US_webconnectivity_cd858...US145934med101.0...100101NaN000
22www.mediafire.com20240110154226.561973_US_webconnectivity_0b177...US114272med101.0...000101NaN000
33iarf.net20240226153534.729299_US_webconnectivity_bfd46...US79221low101.0...000000NaN000
44scontent.cdninstagram.com20240401223202.866879_TW_webconnectivity_d5764...TW74822med101.0...110000NaN000
..................................................................
999995999995focus.ua20240306235145.238486_RU_webconnectivity_081e7...RU417332med00NaN...000100ooni.ru_dns_ert_1010
999996999996notifications-pa.googleapis.com20240101041556.484562_VE_webconnectivity_8657f...VE804814high00NaN...000000NaN000
999997999997www.piratpartiet.se20240302005730.751251_MX_webconnectivity_2950b...MX285092med00NaN...000000NaN000
999998999998transequality.org20240307184001.974720_TZ_webconnectivity_6a91b...TZ371334med00NaN...110001NaN000
999999999999yandexwebcache.net20240102183817.096847_SE_webconnectivity_e2ba6...SE295181low101.0...000000NaN000
\n", + "

1000000 rows × 21 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 target_domain_name \\\n", + "0 0 www.coolearth.org \n", + "1 1 kat.am \n", + "2 2 www.mediafire.com \n", + "3 3 iarf.net \n", + "4 4 scontent.cdninstagram.com \n", + "... ... ... \n", + "999995 999995 focus.ua \n", + "999996 999996 notifications-pa.googleapis.com \n", + "999997 999997 www.piratpartiet.se \n", + "999998 999998 transequality.org \n", + "999999 999999 yandexwebcache.net \n", + "\n", + " measurement_uid probe_cc probe_asn \\\n", + "0 20240813184519.240242_RU_webconnectivity_70834... RU 51645 \n", + "1 20240415213315.451159_US_webconnectivity_cd858... US 14593 \n", + "2 20240110154226.561973_US_webconnectivity_0b177... US 11427 \n", + "3 20240226153534.729299_US_webconnectivity_bfd46... US 7922 \n", + "4 20240401223202.866879_TW_webconnectivity_d5764... TW 7482 \n", + "... ... ... ... \n", + "999995 20240306235145.238486_RU_webconnectivity_081e7... RU 41733 \n", + "999996 20240101041556.484562_VE_webconnectivity_8657f... VE 8048 \n", + "999997 20240302005730.751251_MX_webconnectivity_2950b... MX 28509 \n", + "999998 20240307184001.974720_TZ_webconnectivity_6a91b... TZ 37133 \n", + "999999 20240102183817.096847_SE_webconnectivity_e2ba6... SE 29518 \n", + "\n", + " answer_count_num answer_count tls_consistent tls_inconsistent \\\n", + "0 2 med 1 0 \n", + "1 4 med 1 0 \n", + "2 2 med 1 0 \n", + "3 1 low 1 0 \n", + "4 2 med 1 0 \n", + "... ... ... ... ... \n", + "999995 2 med 0 0 \n", + "999996 14 high 0 0 \n", + "999997 2 med 0 0 \n", + "999998 4 med 0 0 \n", + "999999 1 low 1 0 \n", + "\n", + " contains_tls_consistent_answer ... answer_asn_in_trusted_answers \\\n", + "0 1.0 ... 1 \n", + "1 1.0 ... 1 \n", + "2 1.0 ... 0 \n", + "3 1.0 ... 0 \n", + "4 1.0 ... 1 \n", + "... ... ... ... \n", + "999995 NaN ... 0 \n", + "999996 NaN ... 0 \n", + "999997 NaN ... 0 \n", + "999998 NaN ... 1 \n", + "999999 1.0 ... 0 \n", + "\n", + " answer_asorg_in_trusted_answers answer_matches_probe_asn \\\n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 1 0 \n", + "... ... ... \n", + "999995 0 0 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 1 0 \n", + "999999 0 0 \n", + "\n", + " answer_matches_probe_cc answer_contains_bogon \\\n", + "0 0 0 \n", + "1 1 0 \n", + "2 1 0 \n", + "3 0 0 \n", + "4 0 0 \n", + "... ... ... \n", + "999995 1 0 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 0 0 \n", + "999999 0 0 \n", + "\n", + " answer_is_cloud_provider fp_name false_postive \\\n", + "0 1 NaN 0 \n", + "1 1 NaN 0 \n", + "2 1 NaN 0 \n", + "3 0 NaN 0 \n", + "4 0 NaN 0 \n", + "... ... ... ... \n", + "999995 0 ooni.ru_dns_ert_1 0 \n", + "999996 0 NaN 0 \n", + "999997 0 NaN 0 \n", + "999998 1 NaN 0 \n", + "999999 0 NaN 0 \n", + "\n", + " answer_is_blockpage answer_contains_unreachable_ip \n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + "... ... ... \n", + "999995 1 0 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 0 0 \n", + "999999 0 0 \n", + "\n", + "[1000000 rows x 21 columns]" + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_extra" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "id": "3ffa2874-025f-497a-b059-6a11c0501c86", + "metadata": {}, + "outputs": [], + "source": [ + "samples_extra_clean = samples_extra.drop(columns=[samples_extra.columns[idx] for idx in range(6)] + ['fp_name', 'false_postive'])" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "id": "94d8dc39-df0d-4df4-bcab-17e6642ca535", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_counttls_consistenttls_inconsistentcontains_tls_consistent_answeranswer_ip_in_trusted_answersanswer_asn_in_trusted_answersanswer_asorg_in_trusted_answersanswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_provideranswer_is_blockpageanswer_contains_unreachable_ip
0med101.0010000100
1med101.0110010100
2med101.0000010100
3low101.0000000000
4med101.0011000000
..........................................
999995med00NaN000010010
999996high00NaN000000000
999997med00NaN000000000
999998med00NaN111000100
999999low101.0000000000
\n", + "

1000000 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " answer_count tls_consistent tls_inconsistent \\\n", + "0 med 1 0 \n", + "1 med 1 0 \n", + "2 med 1 0 \n", + "3 low 1 0 \n", + "4 med 1 0 \n", + "... ... ... ... \n", + "999995 med 0 0 \n", + "999996 high 0 0 \n", + "999997 med 0 0 \n", + "999998 med 0 0 \n", + "999999 low 1 0 \n", + "\n", + " contains_tls_consistent_answer answer_ip_in_trusted_answers \\\n", + "0 1.0 0 \n", + "1 1.0 1 \n", + "2 1.0 0 \n", + "3 1.0 0 \n", + "4 1.0 0 \n", + "... ... ... \n", + "999995 NaN 0 \n", + "999996 NaN 0 \n", + "999997 NaN 0 \n", + "999998 NaN 1 \n", + "999999 1.0 0 \n", + "\n", + " answer_asn_in_trusted_answers answer_asorg_in_trusted_answers \\\n", + "0 1 0 \n", + "1 1 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 1 1 \n", + "... ... ... \n", + "999995 0 0 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 1 1 \n", + "999999 0 0 \n", + "\n", + " answer_matches_probe_asn answer_matches_probe_cc \\\n", + "0 0 0 \n", + "1 0 1 \n", + "2 0 1 \n", + "3 0 0 \n", + "4 0 0 \n", + "... ... ... \n", + "999995 0 1 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 0 0 \n", + "999999 0 0 \n", + "\n", + " answer_contains_bogon answer_is_cloud_provider answer_is_blockpage \\\n", + "0 0 1 0 \n", + "1 0 1 0 \n", + "2 0 1 0 \n", + "3 0 0 0 \n", + "4 0 0 0 \n", + "... ... ... ... \n", + "999995 0 0 1 \n", + "999996 0 0 0 \n", + "999997 0 0 0 \n", + "999998 0 1 0 \n", + "999999 0 0 0 \n", + "\n", + " answer_contains_unreachable_ip \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "... ... \n", + "999995 0 \n", + "999996 0 \n", + "999997 0 \n", + "999998 0 \n", + "999999 0 \n", + "\n", + "[1000000 rows x 13 columns]" + ] + }, + "execution_count": 183, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_extra_clean" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "id": "9cb379b3-958b-4a87-85b9-e17d2a736880", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'20240212194929.466091_FI_webconnectivity_a8a12429797483d9'" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_full.iloc[2007]['measurement_uid']" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "d5c3bf40-9e7d-4001-8b18-9583f804c6bc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_countcontains_tls_consistent_answeranswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_provideranswer_is_blockpageanswer_contains_unreachable_ip
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [answer_count, contains_tls_consistent_answer, answer_matches_probe_asn, answer_matches_probe_cc, answer_contains_bogon, answer_is_cloud_provider, answer_is_blockpage, answer_contains_unreachable_ip]\n", + "Index: []" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[\n", + " samples['answer_contains_unreachable_ip'] != 0\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "0887dbd4-0625-42d4-964c-486f321e61e8", + "metadata": {}, + "outputs": [], + "source": [ + "from pgmpy.estimators import MaximumLikelihoodEstimator\n", + "mle = MaximumLikelihoodEstimator(model=dns_analysis_bn, data=samples)\n", + "dns_analysis_bn.fit(data=samples, estimator=MaximumLikelihoodEstimator)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "49231f4d-62a9-473c-b4a3-f85f1f71fc78", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "2cecd5e1-6d51-4aaa-afa2-c7144fa69a60", + "metadata": {}, + "outputs": [], + "source": [ + "cdp = dns_analysis_bn.get_cpds('answer_contains_unreachable_ip')" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "8da3b7bf-740b-4bbd-b3a6-2d272428996f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------------------------------+---+\n", + "| answer_contains_unreachable_ip(0) | 1 |\n", + "+-----------------------------------+---+\n" + ] + } + ], + "source": [ + "print(cdp)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f67d57d4-9472-47c7-94a7-03eb97c8c4f9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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goKCFGIwRXUQCAQyH1tSUoJbt26hqqoK5NnfpTusKSsrQ2xsLJqampRtyogiLCwMd+/exV/+8hds3boV27dvh0gkGrL0BQIB1q1bh127duHNN99ERkYGwsLChix9yvCFaqAkVAOVh76+Pj777DPk5ubCxMQEAQEBOH78+JDacO3aNUydOhXx8fE4ePAgUlJSsGTJEjqiiL57GkUAACAASURBVCITg9FTANDU1MS4cePo7LFBII9ySBadr66uRm1tLa5du4aurq5nNbdPRnO+a2ho4MUXX8Tdu3exf/9+nDp1Ct7e3khOTh4yGxobGzF79mzk5OTgjz/+wCeffEJnJI1yVEG7af1UMbz44ovgcDiwsbHBjBkz2BfXK5rY2FhERUVh3759CAkJGZI0KcOLweqOvJkwYQLOnz+P3NxcfPbZZ/0f2NfCMSKRiKxcuZIYGhoOy7WQKcrjL3/5y6DW2fvss88IANLe3q5Aq5TL2rVriZ2dnbLNGLHExMSQMWPGkNdff31I0uvq6iJhYWHE1NRU6evMUYYfVAOfhmqg8unu7ibbt28n6urq5OTJk0OS5t69e4mamhpZv349aWtrG5I0KSOLweop5dmQRzkki843NTURAOS777575nQoA/P48WMSGRlJNDU1SXR0tMLTEwgExM/Pjzg5OZGqqiqFp0dRDVRFu2n9VHEIBAISGRlJjI2NSWlpqULT6unpIc7OzmT16tUKTYcyvBkuurN7926ira3d333f9xrsP/74I86fP48LFy5g3rx5Coj/U1QRDoeDvXv3Dup/tLS0FGTN8GE0XKMyWbFiBY4dO4a9e/fixIkTCk/v008/RUpKCq5du4aZM2cqPD2K6kA1sG9GwzUOdzQ0NLB7925s374dmzZtQlFRkULTu3TpErZt24YvvvgChw8fxtixYxWaHmXk8Sx6Snk25KHRspxDU1PzudOhDIyJiQnOnj2Lbdu2Yd26dUhJSVFoen//+99RWFiI2NhYWFtbKzQtimqgStpN66eKQ1tbGydPnoStrS02btyo0LQuX76MkpISfPnllwpNhzJ8GU6689prr8HS0hJ79uzpc7/GZ73GtwsEAqxatQqvvfYatmzZMhQ2KpyioiL8/vvvuHr1Kjo6OuDs7MzuKy4uxvfff485c+aguLgYe/fuRUFBAby9vaGhocEed+vWLfz8888o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u7uxZs0aFBcX4+DBg7j33nvt3ST6P05OTvDz84Onp+eIvF5VVRX27NmD5ubmAR9TU1MDjUaDzz//HEajcUTeV37vI0eOoLq6esReczJxcHDA448/jgMHDuDrr79GdnY2enp67N0sIiIimmQYsBMRERER9XHfffehvLwcBw8exOzZs+3dHLLg5eWFr7/+GuvWrRuR11uzZg3S09MHfUx0dDS+//3vj8j7WVq4cCGWLFky4q872WRkZGDPnj04efIkfvGLX9i7OURERDTJMGAnIiIiIrKwd+9efPjhh9i+fTumTZtm7+bQKHB2dh7yMU5OTtflva/X60426enp2Lx5M/72t79x4lMiIiIaVdybIyIiIiKy8Nprr2HVqlXIzMy0d1OGraysDP/973/R1taGG264ATfffLO4r7y8HFu3bsXzzz+PiooK/Pvf/0ZgYCDuvfdeq2D50KFD+OyzzxAREQFHR0c8+OCD2LlzJ7q6ugAAsbGxmDZtGvbt2yeeExQUhOXLl0OtVuPQoUMAgCVLliAsLAwdHR3417/+haKiIsTGxuLee+8VZV0qKiqwdetWPPfcc/jss89QWFiIJ554YlhBt16vx4cffoigoCCsXLly0PYPl4ODAxwcHAAAe/bsEWcu3HHHHVaPsaWnpwcHDx7EwYMHERoaitWrVyMuLs5mmwsKCpCRkYGVK1fC3d3d5uuePHkS5eXlAABHR0fccccdqKysxK5du/D444+L9UxISMBdd90FR8dvxkwN9jkALpc+evfdd9HY2Ijk5GSsWLECSqUSjo6Ooh2D/d3GujvvvBObNm3Cli1b8Pe//93ezSEiIqLJQiIiIiIiIsHHx0fasmWLvZsxbI888oh04403Ss3NzdK+ffskBwcH6X//938lSZKkrVu3SkFBQRIAaefOndJ3vvMdac2aNRIA6dlnnxWvsWHDBmn79u1SV1eX9MEHH0ienp6SJElSYWGh5O/vLwUGBkparVaSJEnKzc2VnJycpEWLFkmtra2SJElSb2+v9LOf/Ux64oknJKPRKJWWlkpr166V9u7dK509e1ZKS0uT4uLipNbWVmnbtm1ScHCwBEDaunWrNHv2bAmAdPjw4SHXtaioSLrtttskANKLL744ZPuH6+6775aio6Olp59+WlqwYIEUFhYmAZDuvPNO8Zj29nYJgPTyyy+Ln+l0OmnZ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xupXv/qVQkPn77Ucvb292rt3r/bu3auuri6lp6crPDzcer+vr0+/+93v9Nprr6msrEwJCQmKj4+33r9w4YJ+9rOfacOGDbpw4YJeeeUVlZeXa/Xq1bLZbDp+/Li2bNmitrY25eTkqKysTLfeeqskqbKyUnv27NGhQ4fU09OjrKysEXW1tLTolltumVRfAceOHdN//ud/qrKyUqdOndJtt902qbEYq9b+/n49//zz+uM//mPl5+dPu5/ZGvuJ6hxtjMdqP97fsaOjQ//zP/+jN954Q5WVlcrNzdWCBQsmVeN4252M8Y6h6YzP+++/r1OnTqmkpETd3d2KjIzUe++9p5KSEpWUlKi1tVWZmZmqq6tTUVGRSkpKFB8fL6fTOe54fPHFF3rhhRd09913q6ioSPv27dO6deuG1TMfhIaG6qGHHtKePXtUWVmphx9+ONglAQCAidXKAAAAADOgq6vL2Gw288477wS7lOuqurra3HXXXebVV181dXV15t577zXLli0zPT09xhhjenp6zIYNG8xbb71l3G63efHFF43D4bDG5fXXXzfJyclGknn//ffNt771LVNQUGAkmR/+8IfGGGOKi4vN9u3bjSSzf/9+c+jQIWOMMU899ZS56667TFtbmzl8+LAJCQkxzz//vDHGmNLSUvPNb37TSDI/+clPJt2XMcY8/fTT5o033jBdXV1m7969xm63T3o8xqrV4/EYSeanP/3pjPQzW2M/Xp2jjfF47ccam4qK+eyjKAAAEHxJREFUCvONb3zDHDp0yJw5c8asXLnS3HLLLcbtdk/r+JiM8Y6h6Y7P+fPnzaJFi0xSUpLxer3GGGN++9vfmrCwMLN+/XrjdruNMcb4/X7zl3/5l+Zv/uZvjM/nG3c8du/ebVJSUowk8/rrr5u8vDwjyRw/fnzS+zzX/Md//IeJiYkxg4ODwS4FAABM7EMCdgAAAMyIqqoqI8n83//9X7BLua7uu+8+8+d//ufW6/3795uQkBDz7rvvGmOMefTRR82uXbuGfeaRRx4xkZGRpq6uzhjzZUApybz33ntWm3vuucdkZ2dbr//5n//ZSBoWssXExJhnn33Wep2bm2vuuOMO63VDQ8Oo4e94ffX395uEhARTXl5uvf/973//msZktFqvDthnop/ZGPuJ6rx6jCdqP9rY3HfffebXv/619frgwYPDQuypHh+TMdExNN3x+clPfmJCQ0NNY2Ojte6RRx4x6enpxu/3W+u2bNliuru7JzUezzzzjBWwG2NMWVnZvA6fA8d14CQFAAC4oX04f3+3CwAAgFmVlpYmu92uY8eOBbuU6+bChQs6cuSIvvnNb1rrCgoK1NzcrIcffljd3d16++23lZeXN+xzjz/+uHp6evSLX/xCkhQdHS1JevDBB602K1euVH19/bj9HzhwQI8//rgk6eOPP5YxRj09Pdb7drt9xGcm6is8PFwOh0Nf//rXdfDgQUlf3jxzpk23n9ka+4nqvHqMr3W/mpqadOTIEZ04cUI/+MEP9IMf/EAHDhzQ7bffru7u7knVOB0THUPTHZ/CwkKFhoZqz5491rq4uDjV1NToyJEjkqSamhq5XC5FRkZOajwiIyMlSdu2bZMk5eTkKCQkZNpjcaMqLi5Wenq69bcAAAA3NgJ2AAAAzIjQ0FA98cQTev7551VbWxvscq6L0tJSSSND1qSkJEnSiRMn5PP5RtzgMzDHdUVFhSSNOj99dHS0BgYGxu1//fr1+uCDD7Rz505VVFQoIyNDxhjr/dG2O5m+XnrpJXm9Xj344IPKz8+X2+0et46pmk4/szn249U52uevZb8qKyslSU8//bSee+45Pffcc3rxxRf1ySef6F/+5V8mXeNUTeUYupbxSUlJ0QMPPKDdu3dLklpaWiRJ6enpevXVVyVJu3fv1q5duyRNbjzmc5h+tfPnz+ull17SU089FexSAADAJBGwAwAAYMY888wzSklJ0aZNm1RXVxfscmZc4EraQ4cOjXivtbVVfr9f0pdh71CLFi2SJGVnZ0+r/6efflqvvfaaXn31Ve3YsUMRERHT2l5AQUGBLly4oL/+67/WyZMndfvtt1uB9kyaTj+zOfbXWue1tA/cuPPUqVMj3uvs7Jx0jVM1E8fQRPv72GOP6fPPP9enn36ql156SX/1V3+lP/uzP9P777+v5uZmffbZZ1q7dq2k4I/HjaS8vFwPPPCA1q5dqyeffDLY5QAAgEkiYAcAAMCMcTqdOnjwoEJDQ3X77bePGobOZbm5uQoNDdVvfvMbK9CVpC+++EKffvqp8vLyFBERoePHjw/7XGtrqyTprrvuuuY+A/2cPHlSP/3pT/Xkk09q4cKF1vtDrz6eiq6uLr366quKj4/XCy+8oN///vfyer3au3fvlGu9Hv3M1thfa52TbR+oOScnRzabTT/60Y/U398/rM433nhjUjWOtt3JmIljaDL7W1BQoKSkJP37v/+7qqqqtHLlSu3atUt+v1+PPfaYNm7caLWd6fGYq375y19q3bp1Wrx4sd57770ZO3kGAACuPwJ2AAAAzKjFixfro48+0r333qtNmzZp27ZtMzJ39I0gNTVVhYWFOnv2rLZu3arf/e53evnll/XDH/5QmzZtUlJSkp566ilVVVXp6NGj1uf27dunrVu36u6775YkXblyRZKGzX09MDAgn8+nvr4+SVJiYqKkL0PR4uJia+qOffv2aWBgQL/97W/12Wefye12q7KyUlVVVfJ6vZK+DEEDJuprcHBQP/rRj9Tb2ytJuvPOO5WVlWX1PxlX19rb2zuilun2M1tjP1Gd17pfV49NZGSk/uIv/kIfffSR7r77br355pt6/fXXtX37dmuO8akcH4H+xxMVFWWNyVjH0EwcL+Hh4dqxY4d+8Ytf6LHHHpMkLVmyRJs2bdLRo0e1fft2q21cXNyE4+Hz+SRJly9fnnAf55qKigoVFBTo29/+trZv366jR48qLi4u2GUBAIBrEcxbrAIAAGB+279/v8nMzDQRERHmiSeeMDU1NcEuado8Ho95+OGHjSQjyWRkZJhPPvnEet/v95u//du/NYmJieYf//EfzXe+8x3zp3/6p6anp8cYY8y+fftMRkaGkWS+//3vm4sXL5q33nrLZGZmGknmH/7hH0xLS4u5ePGiSU5ONnFxcebnP/+5McaYnTt3mtDQUJOcnGxeeeUV8+yzz5rQ0FDz93//96a2ttY8/vjjRpLJzc01Bw8enFRfFy5cMJGRkWbVqlXm3/7t38yPf/xjs2vXLtPf3z/pMbm61sbGxmG17Nu3z3R0dEy7n9kY+/HGY7Qxnmi/Rvs7dnV1mcLCQms/nE6n+fWvfz3t42MyxjuGZvJ4KSkpMbfddtuwde+++6559NFHR9Q03nj86le/Mjk5OUaS2bp1q/nss88mva83svLyclNYWGjCwsLMypUrzYcffhjskgAAwNR8GGLMNH9TCgAAAIyjv79fr732mp577jk1NjbqoYce0hNPPKGNGzfO6ZsXNjY2qrW1Vbm5uQoPDx/xfk9Pj8rKyrRixYph03FcC5/Pp4GBAWv+cenLqTNiY2OtPt1u97SueDXGqKenR36/X5WVlcrOzh5xI9Gp1no9+pGu79hfa52TaT/W2LS1tam2tlYrVqwYc9zGM9GYj2U6x9C1jE9dXZ2WLl1qvR4YGNClS5eUmpo6avvpjseNbnBwUEVFRXr55Zd1+PBhZWVl6Z/+6Z+0bds22Wy2YJcHAACmppiAHQAAALOiv79f7777rl5++WUdO3ZMy5Yt0/bt27Vjx45p3/wTAG5UZ8+e1Z49e/Tmm2+qsbFR9913n5544gl94xvfsKZ+AgAAcxYBOwAAAGbfuXPntHv3bu3du1eNjY1avXq1CgoKVFBQoDvuuIOrOQHMWT6fT8XFxSoqKtL+/ftVXl6uzMxMbd++XYWFhcrKygp2iQAAYOYQsAMAACB4/H6/fv/73+v999/XgQMH9MUXXyghIUH333+/Nm/erPvvv1/x8fHBLvOmVFdXp127dk3Y7jvf+Y527tx5w/cznzGGwdfS0qKioiIVFRXp8OHD6ujo0IoVK7R582Y99NBDWr9+/ZyeEgsAAIyJgB0AAAA3jrKyMh04cEBFRUUqLi7W4OCgbr/9duXn5+uuu+5Sfn6+kpOTg13mTcEYo/7+/gnbhYWFTesXB7PVz3zGGM6++vp6HTt2TMePH9exY8d09uxZLViwQBs2bLB+jZOZmRnsMgEAwPVHwA4AAIAbk8fj0ZEjR/TBBx+ouLhYJSUl8vv9ys7OHha4L1++PNilApjHBgcH9fnnnw8L1GtqahQWFqa1a9cqPz9fGzdu1L333quoqKhglwsAAGYXATsAAADmho6ODp04cUInTpxQcXGxPv74Y3V3dyshIUFr165VXl6e1qxZozVr1ig7O5srdQFcM5/Pp9LSUp05c8Z6nDp1Sh6PRw6HQ/n5+dYJvnXr1ik6OjrYJQMAgOAiYAcAAMDc5PP5dOrUKX300Uc6ffq0zpw5o/Pnz8vn8ykqKkqrVq3SmjVrlJeXp7y8PK1cuZKrSwFYOjs7dfbsWStIP336tEpKStTX16eIiAitXLnS+u9Hfn6+Vq1axYk7AABwNQJ2AAAAzB8+n08VFRU6efKkTp48qfPnz+v06dO6fPmyJMnlcunWW2/VsmXLlJubay1nZmZyA0JgnnK73fr88891/vx5Xbx40Vqurq7W4OCgnE6nVq1apdtuu0233nqrcnNz9dWvflURERHBLh0AANz4CNgBAAAwvxlj9MUXX+jcuXMqLy9XWVmZSktLVV5eLo/HI0mKjY1VTk6Oli9fruXLlysrK0uZmZnKzMxUXFxckPcAwETa2tpUVVWl6upqVVRUWN/x8vJydXZ2SpLi4+O1fPlyrVixwvq+r1q1ShkZGcEtHgAAzGUE7AAAALh5NTU1qayszAreA8s1NTUK/G9ybGysMjIyrMB96HJmZibTzgCzoLOzU9XV1aqqqhrxqK6utkJ0m82m9PT0EUH68uXLlZiYGOS9AAAA8xABOwAAAHC1vr4+1dTUjAjxAsttbW1W2+TkZKWnpys1NVVLly5VamqqFi9erCVLlsjlciktLY0QHhhHZ2en6urq1NjYqIaGBtXX16upqUl1dXVqaGhQTU3NiO/cWCe80tLSFB4eHsS9AQAANxkCdgAAAOBadXZ2Dgvdq6ur1dTUpPr6ejU0NKixsVH9/f1W+5iYmBGhe3JyslJSUpSUlKTExEQlJSUpPj4+iHsFzKzW1lbr0dLSokuXLo34ntTV1cnr9VqfWbhwoRYvXmydsHK5XEpPT+dXIwAA4EZFwA4AAABcDy0tLaOGiYF1zc3Nw67KlaTw8HAlJiYqMTFRKSkp1nJSUpKSk5Ot13FxcYqPj1dcXJxsNluQ9hA3k4GBAV25ckVut1tXrlxRW1ubWltb1dTUpNbWVrW1tamlpUUtLS3W64GBAevzISEhSkxMVHJystLS0uRyubRkyRItXrzYOunkcrm0aNGiIO4lAADANSNgBwAAAIJlYGBgxBW+gdfNzc0j3uvq6hqxjZiYmGGBe3x8/LDloc9Op1OxsbGy2+2y2+2Kjo4Owl4jWLxer/XweDzyeDzDQvOhy1c/B+Y4H8rhcCg5OXnYrzCGngga+t6iRYs4GQQAAOYjAnYAAABgruju7lZbW9uYQehYQanH4xl1eyEhIYqNjZXD4bBCd6fTqZiYGOu13W5XXFyc7Ha7wsPDravmnU6nFixYoOjoaEVGRmrhwoVWm5iYGIWGhs7y6MwPfr9fHR0d6u/vV1dXl3p6etTb2yuv1yufzyePxyO/36/29nb19fWpq6tL7e3t6uzstMLzjo4OeTyeYYG62+0es8/Y2NhxT8yMti4xMVELFy6cxZEBAAC4IRGwAwAAAPOd3++X2+1WR0eH2tvbrdC1s7NTHo9HHR0dw9YF2gRC20CbQMA7GYHwPiwsTA6HQxEREdbc2YFAXtKw9YHAXpL1OUlWoH+1odsZS3h4uOx2+7htOjs7h01nMppA0H219vZ2Bf5J1dHRIb/fP2KbXV1d1pz83d3d6uvrG7Y+8LnxQvCrxcbGasGCBcNOgAQeMTExcjqdw06cjNYmJiZG8fHxCgkJmXS/AAAAGIaAHQAAAMC18fl88nq96u3tVU9Pz6hB8VhXYktjB86B7UlSX1+furu7h/V3NY/Ho8HBwXFrHdrXWIaG/GMZK+R3OBwKCwuTJOsKfkmKiopSRESEpLFPKIx25b/NZhv1xERge0P7AwAAQNARsAMAAAAAAAAAMAXFTIwIAAAAAAAAAMAUELADAAAAAAAAADAFBOwAAAAAAAAAAExBmKS3g10EAAAAAAAAAABzTOn/AxI4B8D/JkK5AAAAAElFTkSuQmCC", + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viz = dns_analysis_bn.to_graphviz()\n", + "viz.draw('dns_analysis_bn.png', prog='dot')\n", + "Image('dns_analysis_bn.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "e950bf1d-660b-49a1-85d9-9fa6b79f3217", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0target_domain_namemeasurement_uidprobe_ccprobe_asnanswer_counttls_consistenttls_inconsistentcontains_tls_consistent_answeranswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonfp_namefalse_postiveanswer_is_blockpageanswer_contains_unreachable_ip
00porvir.org20240225113555.207055_BR_webconnectivity_220a8...BR270476400NaN000NaN000
11kiwifarms.net20240212223944.798890_BR_webconnectivity_ac6a7...BR2632602101.0000NaN000
22www.cidh.org20240128161747.782557_ID_webconnectivity_e6e4e...ID7713600NaN000NaN000
33www.privacytools.io20240219103350.429741_US_webconnectivity_93aab...US79224101.0010NaN000
44www.mojeek.com20240403001615.591322_US_webconnectivity_18b05...US79221101.0000NaN000
...................................................
9999599995www.4chan.org20240112190421.724404_IN_webconnectivity_0d9ba...IN243092101.0000NaN000
9999699996reliefweb.int20240811082327.907258_BD_webconnectivity_ee069...BD1353413101.0000NaN000
9999799997www.youtube.com20240119184933.212646_US_webconnectivity_7fa02...US792219101.0010NaN000
9999899998www.churchofeuthanasia.org20240209233935.331137_US_webconnectivity_c059b...US200571101.0010NaN000
9999999999asean.org20240322132619.206003_US_webconnectivity_472a4...US3954641101.0010NaN000
\n", + "

100000 rows × 16 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 target_domain_name \\\n", + "0 0 porvir.org \n", + "1 1 kiwifarms.net \n", + "2 2 www.cidh.org \n", + "3 3 www.privacytools.io \n", + "4 4 www.mojeek.com \n", + "... ... ... \n", + "99995 99995 www.4chan.org \n", + "99996 99996 reliefweb.int \n", + "99997 99997 www.youtube.com \n", + "99998 99998 www.churchofeuthanasia.org \n", + "99999 99999 asean.org \n", + "\n", + " measurement_uid probe_cc probe_asn \\\n", + "0 20240225113555.207055_BR_webconnectivity_220a8... BR 270476 \n", + "1 20240212223944.798890_BR_webconnectivity_ac6a7... BR 263260 \n", + "2 20240128161747.782557_ID_webconnectivity_e6e4e... ID 7713 \n", + "3 20240219103350.429741_US_webconnectivity_93aab... US 7922 \n", + "4 20240403001615.591322_US_webconnectivity_18b05... US 7922 \n", + "... ... ... ... \n", + "99995 20240112190421.724404_IN_webconnectivity_0d9ba... IN 24309 \n", + "99996 20240811082327.907258_BD_webconnectivity_ee069... BD 135341 \n", + "99997 20240119184933.212646_US_webconnectivity_7fa02... US 7922 \n", + "99998 20240209233935.331137_US_webconnectivity_c059b... US 20057 \n", + "99999 20240322132619.206003_US_webconnectivity_472a4... US 395464 \n", + "\n", + " answer_count tls_consistent tls_inconsistent \\\n", + "0 4 0 0 \n", + "1 2 1 0 \n", + "2 6 0 0 \n", + "3 4 1 0 \n", + "4 1 1 0 \n", + "... ... ... ... \n", + "99995 2 1 0 \n", + "99996 3 1 0 \n", + "99997 19 1 0 \n", + "99998 1 1 0 \n", + "99999 1 1 0 \n", + "\n", + " contains_tls_consistent_answer answer_matches_probe_asn \\\n", + "0 NaN 0 \n", + "1 1.0 0 \n", + "2 NaN 0 \n", + "3 1.0 0 \n", + "4 1.0 0 \n", + "... ... ... \n", + "99995 1.0 0 \n", + "99996 1.0 0 \n", + "99997 1.0 0 \n", + "99998 1.0 0 \n", + "99999 1.0 0 \n", + "\n", + " answer_matches_probe_cc answer_contains_bogon fp_name false_postive \\\n", + "0 0 0 NaN 0 \n", + "1 0 0 NaN 0 \n", + "2 0 0 NaN 0 \n", + "3 1 0 NaN 0 \n", + "4 0 0 NaN 0 \n", + "... ... ... ... ... \n", + "99995 0 0 NaN 0 \n", + "99996 0 0 NaN 0 \n", + "99997 1 0 NaN 0 \n", + "99998 1 0 NaN 0 \n", + "99999 1 0 NaN 0 \n", + "\n", + " answer_is_blockpage answer_contains_unreachable_ip \n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + "... ... ... \n", + "99995 0 0 \n", + "99996 0 0 \n", + "99997 0 0 \n", + "99998 0 0 \n", + "99999 0 0 \n", + "\n", + "[100000 rows x 16 columns]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dns_analysis_bn" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "id": "8442b48c-9855-4c1e-8e1a-a9adf929b44c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_countcontains_tls_consistent_answeranswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_provideranswer_is_blockpageanswer_contains_unreachable_ip
0med1.0010000
1med1.0000100
2high1.0010100
3medNaN010000
4med1.0000100
\n", + "
" + ], + "text/plain": [ + " answer_count contains_tls_consistent_answer answer_matches_probe_asn \\\n", + "0 med 1.0 0 \n", + "1 med 1.0 0 \n", + "2 high 1.0 0 \n", + "3 med NaN 0 \n", + "4 med 1.0 0 \n", + "\n", + " answer_matches_probe_cc answer_contains_bogon answer_is_cloud_provider \\\n", + "0 1 0 0 \n", + "1 0 0 1 \n", + "2 1 0 1 \n", + "3 1 0 0 \n", + "4 0 0 1 \n", + "\n", + " answer_is_blockpage answer_contains_unreachable_ip \n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 " + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "efdd1cfd-5884-4192-90d1-ff152dace834", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + " 0%| | 0/4 [00:00" + ] + }, + "execution_count": 186, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viz = estimated_model.to_graphviz()\n", + "viz.draw('estimated_extra_pc_stable_1M.png', prog='dot')\n", + "Image('estimated_extra_pc_stable_1M.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "id": "76f25b67-d09e-4e94-af2d-927a4a1df47e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_counttls_consistenttls_inconsistentcontains_tls_consistent_answeranswer_ip_in_trusted_answersanswer_asn_in_trusted_answersanswer_asorg_in_trusted_answersanswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_provideranswer_is_blockpageanswer_contains_unreachable_ip
0med101.0010000100
1med101.0110010100
2med101.0000010100
3low101.0000000000
4med101.0011000000
..........................................
999995med00NaN000010010
999996high00NaN000000000
999997med00NaN000000000
999998med00NaN111000100
999999low101.0000000000
\n", + "

1000000 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " answer_count tls_consistent tls_inconsistent \\\n", + "0 med 1 0 \n", + "1 med 1 0 \n", + "2 med 1 0 \n", + "3 low 1 0 \n", + "4 med 1 0 \n", + "... ... ... ... \n", + "999995 med 0 0 \n", + "999996 high 0 0 \n", + "999997 med 0 0 \n", + "999998 med 0 0 \n", + "999999 low 1 0 \n", + "\n", + " contains_tls_consistent_answer answer_ip_in_trusted_answers \\\n", + "0 1.0 0 \n", + "1 1.0 1 \n", + "2 1.0 0 \n", + "3 1.0 0 \n", + "4 1.0 0 \n", + "... ... ... \n", + "999995 NaN 0 \n", + "999996 NaN 0 \n", + "999997 NaN 0 \n", + "999998 NaN 1 \n", + "999999 1.0 0 \n", + "\n", + " answer_asn_in_trusted_answers answer_asorg_in_trusted_answers \\\n", + "0 1 0 \n", + "1 1 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 1 1 \n", + "... ... ... \n", + "999995 0 0 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 1 1 \n", + "999999 0 0 \n", + "\n", + " answer_matches_probe_asn answer_matches_probe_cc \\\n", + "0 0 0 \n", + "1 0 1 \n", + "2 0 1 \n", + "3 0 0 \n", + "4 0 0 \n", + "... ... ... \n", + "999995 0 1 \n", + "999996 0 0 \n", + "999997 0 0 \n", + "999998 0 0 \n", + "999999 0 0 \n", + "\n", + " answer_contains_bogon answer_is_cloud_provider answer_is_blockpage \\\n", + "0 0 1 0 \n", + "1 0 1 0 \n", + "2 0 1 0 \n", + "3 0 0 0 \n", + "4 0 0 0 \n", + "... ... ... ... \n", + "999995 0 0 1 \n", + "999996 0 0 0 \n", + "999997 0 0 0 \n", + "999998 0 1 0 \n", + "999999 0 0 0 \n", + "\n", + " answer_contains_unreachable_ip \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "... ... \n", + "999995 0 \n", + "999996 0 \n", + "999997 0 \n", + "999998 0 \n", + "999999 0 \n", + "\n", + "[1000000 rows x 13 columns]" + ] + }, + "execution_count": 200, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_extra_clean" + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "id": "8e23ef60-d7ed-4384-810a-d4065997e2fb", + "metadata": {}, + "outputs": [], + "source": [ + "samples_extra_clean_part = samples_extra_clean.copy()[:100]" + ] + }, + { + "cell_type": "code", + "execution_count": 226, + "id": "471912f3-694c-409b-b719-d0d46545cea6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/factors/discrete/DiscreteFactor.py:489: RuntimeWarning: invalid value encountered in divide\n", + " phi.values = phi.values / phi.values.sum()\n", + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/factors/discrete/DiscreteFactor.py:489: RuntimeWarning: invalid value encountered in divide\n", + " phi.values = phi.values / phi.values.sum()\n", + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/factors/discrete/DiscreteFactor.py:489: RuntimeWarning: invalid value encountered in divide\n", + " phi.values = phi.values / phi.values.sum()\n", + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/factors/discrete/DiscreteFactor.py:489: RuntimeWarning: invalid value encountered in divide\n", + " phi.values = phi.values / phi.values.sum()\n", + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/factors/discrete/DiscreteFactor.py:489: RuntimeWarning: invalid value encountered in divide\n", + " phi.values = phi.values / phi.values.sum()\n" + ] + } + ], + "source": [ + "from pgmpy.inference import VariableElimination\n", + "from pgmpy.estimators import MaximumLikelihoodEstimator\n", + "bn_estimated_pc = BayesianNetwork(estimated_model)\n", + "bn_estimated_pc.fit(data=samples_extra, estimator=MaximumLikelihoodEstimator)\n", + "infer = VariableElimination(bn_estimated_pc)\n", + "def infer_blockpage_2(row):\n", + " evidence = {}\n", + " for key in row.keys():\n", + " if key != 'answer_is_blockpage' and not pd.isnull(row[key]):\n", + " evidence[key] = row[key]\n", + " res = infer.query(['answer_is_blockpage'], evidence=evidence)\n", + " row['answer_is_blockpage_0'] = res.values[0]\n", + " row['answer_is_blockpage_1'] = res.values[1]\n", + " return row\n", + "samples_extra_clean_part = samples_extra_clean_part.apply(infer_blockpage_2, axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "id": "387e6e49-d072-4bb2-85da-221b9959ae36", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 241, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(bn_estimated_pc.get_cpds('tls_consistent').get_evidence())" + ] + }, + { + "cell_type": "code", + "execution_count": 242, + "id": "b68e6c98-9273-4674-a88c-94f00cc72f70", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3072" + ] + }, + "execution_count": 242, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(a[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 246, + "id": "16cc24a0-44df-4b33-9875-f031d4510b61", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3072" + ] + }, + "execution_count": 246, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2**10*3" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "id": "11483302-ea84-4021-9ab6-0df180d83c0d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'20240220062610.565789_VE_webconnectivity_0b7437bb2801006a'" + ] + }, + "execution_count": 218, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_extra.iloc[16]['measurement_uid']" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "id": "72042d2c-6583-4127-9fa7-77e3e354c047", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 150, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viz = estimated_model.to_graphviz()\n", + "viz.draw('estimated_pc_stable_1M.png', prog='dot')\n", + "Image('estimated_pc_stable_1M.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "25c7616b-b626-4895-a16d-7d1ca586b437", + "metadata": {}, + "outputs": [], + "source": [ + "from pgmpy.estimators import MaximumLikelihoodEstimator\n", + "bn_estimated_pc = BayesianNetwork(estimated_model)\n", + "bn_estimated_pc.fit(data=samples, estimator=MaximumLikelihoodEstimator)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "95e6ad05-83ab-472d-9251-3563c0176368", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viz = bn_estimated_pc.to_graphviz()\n", + "viz.draw('estimated_pc_stable_1M.png', prog='dot')\n", + "Image('estimated_pc_stable_1M.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "4b491d78-6b7b-4a07-9b4e-564352424975", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "39d61a52-95b3-48a7-a930-33d97d0db243", + "metadata": {}, + "outputs": [], + "source": [ + "from pgmpy.inference import VariableElimination\n", + "infer = VariableElimination(bn_estimated_pc)" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "id": "9643f31a-b393-431d-8698-85a873231a00", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------------+----------------------------+\n", + "| answer_is_blockpage | phi(answer_is_blockpage) |\n", + "+========================+============================+\n", + "| answer_is_blockpage(0) | 0.9992 |\n", + "+------------------------+----------------------------+\n", + "| answer_is_blockpage(1) | 0.0008 |\n", + "+------------------------+----------------------------+\n" + ] + } + ], + "source": [ + "print(infer.query(['answer_is_blockpage']))" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "c713290f-afda-4cca-be84-bf281d12b4fa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bn_estimated_pc" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "id": "688fc8a7-17d3-4597-af04-3d002644eccf", + "metadata": {}, + "outputs": [], + "source": [ + "samples_inference = samples.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88be89fb-86cd-472b-9347-1881c3a02def", + "metadata": {}, + "outputs": [], + "source": [ + "estimated_model" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "id": "a80d59c2-822a-4140-9910-b86c2bdd4111", + "metadata": {}, + "outputs": [], + "source": [ + "def infer_blockpage(row):\n", + " evidence = {}\n", + " for key in ['answer_count', 'contains_tls_consistent_answer',\n", + " 'answer_matches_probe_asn', 'answer_matches_probe_cc',\n", + " 'answer_contains_bogon', 'answer_is_cloud_provider',\n", + " 'answer_contains_unreachable_ip']:\n", + " if not pd.isnull(row[key]):\n", + " evidence[key] = row[key]\n", + " res = infer.query(['answer_is_blockpage'], evidence=evidence)\n", + " return res.values[0]\n", + "samples_inference['answer_is_blockpage_prob'] = samples_inference.apply(infer_blockpage, axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "id": "c7115696-2216-4c97-b708-68e42f30a433", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_countcontains_tls_consistent_answeranswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_provideranswer_is_blockpageanswer_contains_unreachable_ipanswer_is_blockpage_prob
2007med0.01000000.755245
5940low0.01000100.518519
11714low0.01000100.518519
12383low0.01000000.518519
15567low0.01000100.518519
..............................
985012low0.01000000.518519
994973low0.01000100.518519
998252low0.01000100.518519
999409low0.01000000.518519
999698med0.01000100.755245
\n", + "

413 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " answer_count contains_tls_consistent_answer answer_matches_probe_asn \\\n", + "2007 med 0.0 1 \n", + "5940 low 0.0 1 \n", + "11714 low 0.0 1 \n", + "12383 low 0.0 1 \n", + "15567 low 0.0 1 \n", + "... ... ... ... \n", + "985012 low 0.0 1 \n", + "994973 low 0.0 1 \n", + "998252 low 0.0 1 \n", + "999409 low 0.0 1 \n", + "999698 med 0.0 1 \n", + "\n", + " answer_matches_probe_cc answer_contains_bogon \\\n", + "2007 0 0 \n", + "5940 0 0 \n", + "11714 0 0 \n", + "12383 0 0 \n", + "15567 0 0 \n", + "... ... ... \n", + "985012 0 0 \n", + "994973 0 0 \n", + "998252 0 0 \n", + "999409 0 0 \n", + "999698 0 0 \n", + "\n", + " answer_is_cloud_provider answer_is_blockpage \\\n", + "2007 0 0 \n", + "5940 0 1 \n", + "11714 0 1 \n", + "12383 0 0 \n", + "15567 0 1 \n", + "... ... ... \n", + "985012 0 0 \n", + "994973 0 1 \n", + "998252 0 1 \n", + "999409 0 0 \n", + "999698 0 1 \n", + "\n", + " answer_contains_unreachable_ip answer_is_blockpage_prob \n", + "2007 0 0.755245 \n", + "5940 0 0.518519 \n", + "11714 0 0.518519 \n", + "12383 0 0.518519 \n", + "15567 0 0.518519 \n", + "... ... ... \n", + "985012 0 0.518519 \n", + "994973 0 0.518519 \n", + "998252 0 0.518519 \n", + "999409 0 0.518519 \n", + "999698 0 0.755245 \n", + "\n", + "[413 rows x 9 columns]" + ] + }, + "execution_count": 202, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_inference[\n", + " samples_inference['answer_is_blockpage_prob'] < 0.8\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "3ebd867c-97b4-4746-9757-a4a158d8041b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
answer_countcontains_tls_consistent_answeranswer_matches_probe_asnanswer_matches_probe_ccanswer_contains_bogonanswer_is_cloud_provideranswer_is_blockpageanswer_contains_unreachable_ipanswer_is_blockpage_prob
192lowNaN1000100.832334
576medNaN0010100.997029
684lowNaN0100100.994409
912medNaN1000100.960802
1077lowNaN0100100.994409
..............................
999517lowNaN0010100.999102
999634lowNaN0010100.999102
999698med0.01000100.755245
999869lowNaN0010100.999102
999882lowNaN0010100.999102
\n", + "

9154 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " answer_count contains_tls_consistent_answer answer_matches_probe_asn \\\n", + "192 low NaN 1 \n", + "576 med NaN 0 \n", + "684 low NaN 0 \n", + "912 med NaN 1 \n", + "1077 low NaN 0 \n", + "... ... ... ... \n", + "999517 low NaN 0 \n", + "999634 low NaN 0 \n", + "999698 med 0.0 1 \n", + "999869 low NaN 0 \n", + "999882 low NaN 0 \n", + "\n", + " answer_matches_probe_cc answer_contains_bogon \\\n", + "192 0 0 \n", + "576 0 1 \n", + "684 1 0 \n", + "912 0 0 \n", + "1077 1 0 \n", + "... ... ... \n", + "999517 0 1 \n", + "999634 0 1 \n", + "999698 0 0 \n", + "999869 0 1 \n", + "999882 0 1 \n", + "\n", + " answer_is_cloud_provider answer_is_blockpage \\\n", + "192 0 1 \n", + "576 0 1 \n", + "684 0 1 \n", + "912 0 1 \n", + "1077 0 1 \n", + "... ... ... \n", + "999517 0 1 \n", + "999634 0 1 \n", + "999698 0 1 \n", + "999869 0 1 \n", + "999882 0 1 \n", + "\n", + " answer_contains_unreachable_ip answer_is_blockpage_prob \n", + "192 0 0.832334 \n", + "576 0 0.997029 \n", + "684 0 0.994409 \n", + "912 0 0.960802 \n", + "1077 0 0.994409 \n", + "... ... ... \n", + "999517 0 0.999102 \n", + "999634 0 0.999102 \n", + "999698 0 0.755245 \n", + "999869 0 0.999102 \n", + "999882 0 0.999102 \n", + "\n", + "[9154 rows x 9 columns]" + ] + }, + "execution_count": 165, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples_inference[\n", + " samples_inference['answer_is_blockpage'] == 1\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cb2766e-75ab-46b7-b8e7-6158d07bd7a9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23f3d25a-5904-4569-a4e4-8f2e4fd7e529", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fb70eed-73ad-4a5f-848e-c3c0197334d3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "f9b2502a-be79-49c6-b294-9e629dada251", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "\n", + " 0%| | 0/1000000 [00:00" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "viz = estimated_model.to_graphviz()\n", + "viz.draw('estimated_hillclimb_1M.png', prog='dot')\n", + "Image('estimated_hillclimb_1M.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e0703ab-7419-4d43-ad95-03d226b74004", + "metadata": {}, + "outputs": [], + "source": [ + "cpd_answer_matches_probe_cc = TabularCPD(\n", + " \"answer_matches_probe_cc\",\n", + " variable_card=2,\n", + " values=[\n", + " [0.77],\n", + " [0.23],\n", + " ],\n", + " state_names={\n", + " \"answer_matches_probe_cc\": ['t', 'f']\n", + " },\n", + ")\n", + "\n", + "cpd_contains_unreachable_answer = TabularCPD(\n", + " \"answer_contains_unreachable_ip\",\n", + " variable_card=2,\n", + " values=[\n", + " [0.15],\n", + " [0.85],\n", + " ],\n", + " state_names={\n", + " \"answer_contains_unreachable_ip\": ['t', 'f']\n", + " },\n", + ")\n", + "\n", + "cpd_contains_unreachable_answer = TabularCPD(\n", + " \"answer_contains_bogon\",\n", + " variable_card=2,\n", + " values=[\n", + " [0.015],\n", + " [0.985],\n", + " ],\n", + " state_names={\n", + " \"answer_contains_bogon\": ['t', 'f']\n", + " },\n", + ")\n", + "\n", + "\n", + "cpd_contains_unreachable_answer = TabularCPD(\n", + " \"answer_is_blockpage\",\n", + " variable_card=2,\n", + " values=[\n", + " [0.015],\n", + " [0.985],\n", + " ],\n", + " evidence=[\"answer_contains_bogon\", \"answer_contains_unreachable_ip\", \"answer_matches_probe_cc\"],\n", + " evidence_card=[3, 3],\n", + " state_names={\n", + " \"answer_is_blockpage\": ['t', 'f']\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b02005e-aa58-4ab9-ab2d-79f6b4de1bff", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95eebdc8-959b-4378-936e-da93fd532d6e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "817d57dd-4b58-46f7-8c07-d3cdaa15bcb0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "7c3f0650-e34c-4fc2-9706-8439f8223400", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f139f2ea-b491-46aa-b75f-1acc3f7b6169", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a0480af-d3c1-4c58-a8ac-4631487ee48f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "b739753b-d515-4903-8a1d-a7725604131a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "5482a37f-2532-494d-9e15-e3e40dea854b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6b1e906-58fa-4ba2-9e35-b76e9c64e4fc", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3bdc153b-19df-4434-983a-30e7a8e22cd4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea33f35b-a596-4818-ad61-ee0730fe8e24", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd1ffe75-dcba-4b67-b7fe-c839fb5030ff", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "07310d97-6023-47e9-bca3-2f011a823111", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/oonipipeline/notebooks/DNS Similarity.ipynb b/oonipipeline/notebooks/DNS Similarity.ipynb new file mode 100644 index 00000000..0be88cf2 --- /dev/null +++ b/oonipipeline/notebooks/DNS Similarity.ipynb @@ -0,0 +1,416 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "f309af11-65e3-4d73-88de-655921a52693", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from IPython.display import Image\n", + "from pgmpy.models import BayesianNetwork\n", + "from pgmpy.factors.discrete import TabularCPD" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3f8fc6f9-9786-4013-8802-359432fb01a2", + "metadata": {}, + "outputs": [], + "source": [ + "sample_uids = [\n", + " '20240101113125.808243_BG_webconnectivity_ba4cf234d47b73ec',\n", + " '20240220050354.524776_US_webconnectivity_a690552818804fc3',\n", + " '20240224232654.007984_RU_webconnectivity_9164a3df2d35316c',\n", + " '20240226225131.261075_VE_webconnectivity_a3e31c999fc8b161',\n", + " '20240226225231.612531_VE_webconnectivity_47d3561e542337d8',\n", + " '20240226225245.422977_VE_webconnectivity_37dcdd51581cbd13',\n", + " '20240227160142.829208_US_webconnectivity_2c9b945991901f8d',\n", + " '20240311005741.675686_SE_webconnectivity_2a4a84928bd17ab0',\n", + " '20240316062349.575036_US_webconnectivity_b63efd0ed694e005',\n", + " '20240328194436.111684_TR_webconnectivity_5414b98b9c9f873b',\n", + " '20240409035157.511121_BR_webconnectivity_85b1de4e410314f7',\n", + " '20240410115514.842786_BR_webconnectivity_6d224ea8b6b3ca7c',\n", + " '20240410124541.400148_BR_webconnectivity_ac16eb05475f622a',\n", + " '20240410134516.191956_BR_webconnectivity_a947a71df23203f3',\n", + " '20240410135012.070725_BR_webconnectivity_d3e9bce608599d5e',\n", + " '20240413230148.929136_KH_webconnectivity_33ae9436d7b6779c',\n", + " '20240415141511.755790_BR_webconnectivity_07547042a9307621',\n", + " '20240416214307.425888_BR_webconnectivity_c9d912510d61bc0b',\n", + " '20240418071953.744226_BR_webconnectivity_2c6b65eeff39f34f',\n", + " '20240506163355.336279_VN_webconnectivity_8de9ce661982414d',\n", + " '20240508114544.444840_BR_webconnectivity_379718729eeed45b',\n", + " '20240514091759.626287_NL_webconnectivity_38962f675df0f676',\n", + " '20240519182127.049517_US_webconnectivity_6e12ec842e98674a',\n", + " '20240522113817.495473_NL_webconnectivity_e81ed947814f9d2a',\n", + " '20240524142956.125292_JO_webconnectivity_5cd31e0f03494bd2',\n", + " '20240627074955.407639_RU_webconnectivity_99e23c2b9680c1cb',\n", + " '20240704234509.514733_NL_webconnectivity_6f924d2e43209ae1',\n", + " '20240705015016.667807_AE_webconnectivity_392604bce72a44d5',\n", + " '20240722041303.591874_MM_webconnectivity_98e6671dd7dce61a',\n", + " '20240722041334.778473_MM_webconnectivity_93a628687303be86',\n", + " '20240722042950.433988_MM_webconnectivity_d388cdc8bad1f15c',\n", + " '20240728114019.011456_VE_webconnectivity_1f0ba3819685e272',\n", + " '20240810175938.750056_VE_webconnectivity_016721e1ebfdc2ed',\n", + " '20240810182504.634031_VE_webconnectivity_853b19341a35d2f0',\n", + " '20240810182604.928599_VE_webconnectivity_f42bd5020088c498',\n", + " '20240815043926.030750_VE_webconnectivity_f034e025b6db08ea',\n", + " '20240815092817.050941_DE_webconnectivity_661003d3498d802f',\n", + " '20240815172949.387668_VE_webconnectivity_427addcd5d1ea806',\n", + " '20240818234433.791006_VE_webconnectivity_8fac03865551a8eb',\n", + " '20240820163242.249906_JO_webconnectivity_a826f460299fa996']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f67d57d4-9472-47c7-94a7-03eb97c8c4f9", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from oonidata.dataclient import load_measurement\n", + "from oonidata.apiclient import get_measurement_dict_by_uid\n", + "\n", + "from oonipipeline.netinfo import NetinfoDB\n", + "from oonipipeline.transforms.observations import measurement_to_observations" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "6e0703ab-7419-4d43-ad95-03d226b74004", + "metadata": {}, + "outputs": [], + "source": [ + "netinfodb = NetinfoDB(datadir=Path(\"datadir\"), download=False)\n", + "# 20231129041111.939896_NP_webconnectivity_32105af63774eabf\n", + "#raw_msmt = get_measurement_dict_by_uid(\"20240804233508.181041_TR_webconnectivity_9a7272e520f3d836\")\n", + "def make_obs_ctrl(measurement_uid):\n", + " raw_msmt = get_measurement_dict_by_uid(measurement_uid)\n", + " msmt = load_measurement(msmt=raw_msmt)\n", + " web_observations, web_control_observations = measurement_to_observations(\n", + " msmt, netinfodb=netinfodb\n", + " )\n", + " return web_observations, web_control_observations" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "4b02005e-aa58-4ab9-ab2d-79f6b4de1bff", + "metadata": {}, + "outputs": [], + "source": [ + "from collections import Counter\n", + "def most_frequent(asns):\n", + " if not asns:\n", + " return 0\n", + " count = Counter(asns)\n", + " most_common = count.most_common(1)\n", + " return most_common[0][0]\n", + "\n", + "CLOUD_PROVIDERS_ASNS = [\n", + " 13335, # Cloudflare: https://www.peeringdb.com/net/4224\n", + " 209242, #\tCloudflare London, LLC\t\n", + " 20940, # Akamai: https://www.peeringdb.com/net/2\n", + " 9002, # Akamai RETN\n", + " 16625, # Akamai Technologies, Inc.\t\n", + " 63949, # Akamai Technologies, Inc.\t\n", + " 16509, #\tAmazon.com, Inc.\n", + " 14618, #\tAmazon.com, Inc.\t\n", + " 15169, #\tGoogle LLC\n", + " 396982, # Google Cloud: https://www.peeringdb.com/net/30878\n", + " 54113, #\tFastly, Inc\n", + " 8075, # Microsoft Corporation\n", + " 8068, #\tMicrosoft Corporation\n", + "]\n", + "def is_cloud_provider(as_number):\n", + " return as_number in CLOUD_PROVIDERS_ASNS\n", + "\n", + "def dns_feature_vector(dns_answers, w_ctrl):\n", + " ctrl_map = {}\n", + " for ctrl in w_ctrl:\n", + " ctrl_map[ctrl.ip] = ctrl\n", + "\n", + " unreachable_count = 0\n", + " for answer in dns_answers:\n", + " if ctrl_map.get(answer.ip):\n", + " if ctrl_map[answer.ip].tcp_success == False:\n", + " unreachable_count += 1\n", + " dns_answer_vector = {\n", + " \"answer_count\": len(dns_answers),\n", + " \"answer_cloud_provider\": 1 if any([is_cloud_provider(x.ip_asn) for x in dns_answers]) else 0,\n", + " \"unreachable_answer_count\": unreachable_count,\n", + " \"top_answer_asn\": most_frequent(map(lambda x: x.ip_asn, dns_answers))\n", + " }\n", + " return dns_answer_vector" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95eebdc8-959b-4378-936e-da93fd532d6e", + "metadata": {}, + "outputs": [], + "source": [ + "obs, ctrl = make_obs_ctrl(\"20240316062349.575036_US_webconnectivity_b63efd0ed694e005\")" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "817d57dd-4b58-46f7-8c07-d3cdaa15bcb0", + "metadata": {}, + "outputs": [], + "source": [ + "from pprint import pprint\n", + "#pprint(obs[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "7c3f0650-e34c-4fc2-9706-8439f8223400", + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.spatial import distance\n", + "netinfodb = NetinfoDB(datadir=Path(\"datadir\"), download=False)\n", + "def compute_dns_distance(measurement_uid):\n", + " web_observations, web_control_observations = make_obs_ctrl(measurement_uid)\n", + " exp_dns_answers = list(filter(lambda x: x.dns_answer is not None, web_observations))\n", + " if len(exp_dns_answers) == 0:\n", + " return None\n", + " exp_vector = list(dns_feature_vector(web_observations, web_control_observations).values())\n", + " ctrl_dns_answers = list(filter(lambda x: x.dns_failure is not None or x.dns_success is True, web_control_observations))\n", + " ctrl_vector = list(dns_feature_vector(\n", + " ctrl_dns_answers,\n", + " web_control_observations\n", + " ).values())\n", + " try:\n", + " d = distance.cosine(exp_vector, ctrl_vector)\n", + " return d\n", + " except:\n", + " print(exp_vector, ctrl_vector)\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "f139f2ea-b491-46aa-b75f-1acc3f7b6169", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20240101113125.808243_BG_webconnectivity_ba4cf234d47b73ec\n", + "2.511132244364944e-07\n", + "20240220050354.524776_US_webconnectivity_a690552818804fc3\n", + "2.0243516862805677e-09\n", + "20240224232654.007984_RU_webconnectivity_9164a3df2d35316c\n", + "2.811796573354286e-09\n", + "20240226225131.261075_VE_webconnectivity_a3e31c999fc8b161\n", + "5.679824388593602e-10\n", + "20240226225231.612531_VE_webconnectivity_47d3561e542337d8\n", + "2.811796573354286e-09\n", + "20240226225245.422977_VE_webconnectivity_37dcdd51581cbd13\n", + "1.1247181741502743e-08\n", + "20240227160142.829208_US_webconnectivity_2c9b945991901f8d\n", + "None\n", + "20240311005741.675686_SE_webconnectivity_2a4a84928bd17ab0\n", + "1.834545071410787e-09\n", + "20240316062349.575036_US_webconnectivity_b63efd0ed694e005\n", + "[3, 0, 0, None] [2, 0, 0, 60781]\n", + "None\n", + "20240328194436.111684_TR_webconnectivity_5414b98b9c9f873b\n", + "1.3396325160286437e-09\n", + "20240409035157.511121_BR_webconnectivity_85b1de4e410314f7\n", + "0.0\n", + "20240410115514.842786_BR_webconnectivity_6d224ea8b6b3ca7c\n", + "2.8117966843765885e-09\n", + "20240410124541.400148_BR_webconnectivity_ac16eb05475f622a\n", + "1.2861659182128449e-08\n", + "20240410134516.191956_BR_webconnectivity_a947a71df23203f3\n", + "0.0\n", + "20240410135012.070725_BR_webconnectivity_d3e9bce608599d5e\n", + "7.02948984576679e-08\n", + "20240413230148.929136_KH_webconnectivity_33ae9436d7b6779c\n", + "None\n", + "20240415141511.755790_BR_webconnectivity_07547042a9307621\n", + "2.811796573354286e-09\n", + "20240416214307.425888_BR_webconnectivity_c9d912510d61bc0b\n", + "[3, 0, 0, None] [4, 0, 0, 40428]\n", + "None\n", + "20240418071953.744226_BR_webconnectivity_2c6b65eeff39f34f\n", + "0.0\n", + "20240506163355.336279_VN_webconnectivity_8de9ce661982414d\n", + "4.189776303675785e-10\n", + "20240508114544.444840_BR_webconnectivity_379718729eeed45b\n", + "3.71212472660698e-06\n", + "20240514091759.626287_NL_webconnectivity_38962f675df0f676\n", + "1.8090338116394378e-09\n", + "20240519182127.049517_US_webconnectivity_6e12ec842e98674a\n", + "2.7760629350837007e-09\n", + "20240522113817.495473_NL_webconnectivity_e81ed947814f9d2a\n", + "None\n", + "20240524142956.125292_JO_webconnectivity_5cd31e0f03494bd2\n", + "6.872500064591947e-07\n", + "20240627074955.407639_RU_webconnectivity_99e23c2b9680c1cb\n", + "1.8345449603884845e-09\n", + "20240704234509.514733_NL_webconnectivity_6f924d2e43209ae1\n", + "4.6097892170138266e-10\n", + "20240705015016.667807_AE_webconnectivity_392604bce72a44d5\n", + "[5, 1, 0, None] [2, 1, 0, 16509]\n", + "None\n", + "20240722041303.591874_MM_webconnectivity_98e6671dd7dce61a\n", + "4.6097892170138266e-10\n", + "20240722041334.778473_MM_webconnectivity_93a628687303be86\n", + "4.6097892170138266e-10\n", + "20240722042950.433988_MM_webconnectivity_d388cdc8bad1f15c\n", + "2.7787750989105575e-09\n", + "20240728114019.011456_VE_webconnectivity_1f0ba3819685e272\n", + "2.2500359353472277e-09\n", + "20240810175938.750056_VE_webconnectivity_016721e1ebfdc2ed\n", + "1.1115099285419205e-08\n", + "20240810182504.634031_VE_webconnectivity_853b19341a35d2f0\n", + "7.668048529474447e-09\n", + "20240810182604.928599_VE_webconnectivity_f42bd5020088c498\n", + "[3, 1, 0, None] [16, 1, 0, 54113]\n", + "None\n", + "20240815043926.030750_VE_webconnectivity_f034e025b6db08ea\n", + "2.7787750989105575e-09\n", + "20240815092817.050941_DE_webconnectivity_661003d3498d802f\n", + "None\n", + "20240815172949.387668_VE_webconnectivity_427addcd5d1ea806\n", + "2.7787750989105575e-09\n", + "20240818234433.791006_VE_webconnectivity_8fac03865551a8eb\n", + "1.8345454044776943e-09\n", + "20240820163242.249906_JO_webconnectivity_a826f460299fa996\n", + "1.004488997979891e-06\n" + ] + } + ], + "source": [ + "distance_map = {\n", + "}\n", + "for uid in sample_uids:\n", + " print(uid)\n", + " d = compute_dns_distance(uid)\n", + " print(d)\n", + " distance_map[uid] = d" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "6a0480af-d3c1-4c58-a8ac-4631487ee48f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.9001535001581544e-08" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "compute_dns_distance(\"20240729235930.015020_IR_webconnectivity_eda3016ef01b4d3b\")" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "b739753b-d515-4903-8a1d-a7725604131a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "5482a37f-2532-494d-9e15-e3e40dea854b", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6b1e906-58fa-4ba2-9e35-b76e9c64e4fc", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3bdc153b-19df-4434-983a-30e7a8e22cd4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea33f35b-a596-4818-ad61-ee0730fe8e24", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd1ffe75-dcba-4b67-b7fe-c839fb5030ff", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "07310d97-6023-47e9-bca3-2f011a823111", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/oonipipeline/notebooks/datadir b/oonipipeline/notebooks/datadir new file mode 120000 index 00000000..25c0bf37 --- /dev/null +++ b/oonipipeline/notebooks/datadir @@ -0,0 +1 @@ +../tests/data/datadir \ No newline at end of file diff --git a/oonipipeline/notebooks/dns_analysis_bn.png b/oonipipeline/notebooks/dns_analysis_bn.png new file mode 100644 index 00000000..d0ee7dda Binary files /dev/null and b/oonipipeline/notebooks/dns_analysis_bn.png differ diff --git a/oonipipeline/notebooks/estimated.png b/oonipipeline/notebooks/estimated.png new file mode 100644 index 00000000..f6fbccc9 Binary files /dev/null and b/oonipipeline/notebooks/estimated.png differ diff --git a/oonipipeline/notebooks/estimated_extra_pc_stable_1M.png b/oonipipeline/notebooks/estimated_extra_pc_stable_1M.png new file mode 100644 index 00000000..ffb21430 Binary files /dev/null and b/oonipipeline/notebooks/estimated_extra_pc_stable_1M.png differ diff --git a/oonipipeline/notebooks/estimated_hillclimb_1M.png b/oonipipeline/notebooks/estimated_hillclimb_1M.png new file mode 100644 index 00000000..f6fbccc9 Binary files /dev/null and b/oonipipeline/notebooks/estimated_hillclimb_1M.png differ diff --git a/oonipipeline/notebooks/estimated_pc_stable_1M.png b/oonipipeline/notebooks/estimated_pc_stable_1M.png new file mode 100644 index 00000000..c3c0dda9 Binary files /dev/null and b/oonipipeline/notebooks/estimated_pc_stable_1M.png differ diff --git a/oonipipeline/notebooks/msmt_feedback_clean.csv b/oonipipeline/notebooks/msmt_feedback_clean.csv new file mode 100644 index 00000000..38de02bf --- /dev/null +++ b/oonipipeline/notebooks/msmt_feedback_clean.csv @@ -0,0 +1,287 @@ +,measurement_uid,status,outcome +0,20240821111652.275207_RU_telegram_98b717d97593636f,blocked,blocked +1,0120191024c9bee71f54e22e25cdbb7007cb825c,down.unreachable,down +2,20230306T235817Z_webconnectivity_BR_263087_n1_1rNv0dEaDgiZ9i33,ok,ok +3,20230307235958.642565_FR_webconnectivity_86a528710144d5f2,ok,ok +4,20230308T092114Z_webconnectivity_IR_49100_n1_eo1anF5FIOhWAomo,blocked.blockpage.dns,blocked +5,20230315T022408Z_webconnectivity_KH_131178_n1_c1skknOHGkyIqXuF,blocked,blocked +6,20230315T114404Z_webconnectivity_BR_7738_n1_e0zJX7TbiQHa3TyQ,ok,ok +7,20230318T084015Z_webconnectivity_US_21928_n1_p5G1g3Z2ireXwKUt,blocked.dns.nxdomain,blocked +8,20230319T003935Z_webconnectivity_US_21928_n1_FH6UhDKqX9szXTsj,ok,ok +9,20230322T054150Z_webconnectivity_ID_23693_n1_RT0imyzovPkCTr13,ok,ok +10,20230403T151710Z_webconnectivity_US_36492_n1_fWvZu2SdRRElD8sF,ok,ok +11,20230403T165117Z_dash_US_36492_n1_oF4QhzOz2iokPfub,ok,ok +12,20230409084418.704983_KH_webconnectivity_69ef831610f69fbc,blocked.dns.inconsistent,blocked +13,20230410T120007Z_webconnectivity_ZA_37611_n1_nG62Z3Y6KNMearyg,blocked,blocked +14,20230412091523.463532_KH_webconnectivity_6b3e6ecbbc9fdad2,blocked.dns.inconsistent,blocked +15,20230412T155937Z_httpinvalidrequestline_IR_43395_n1_Am3AwabhuD4a31fM,ok,ok +16,20230412T164843Z_whatsapp_IR_43395_n1_H3JZHGLxMjb8v83C,ok,ok +17,20230419063137.069564_KH_webconnectivity_e0e3dab6adb1028f,blocked.dns.inconsistent,blocked +18,20230420072440.682797_DE_webconnectivity_331a7552d12271a7,ok,ok +19,20230420073441.286822_DE_webconnectivity_34316f607b053ea1,blocked.blockpage.server_side,blocked +20,20230429140933.619104_BR_webconnectivity_113edaf5ace99443,down.unreachable,down +21,20230429140941.131984_BR_telegram_a27473fa15721ef0,ok,ok +22,20230430212622.885474_DE_webconnectivity_8adaea5171f572ef,blocked.tcp,blocked +23,20230506155633.735998_RU_webconnectivity_442c71353fd69a18,blocked.tls,blocked +24,20230506191702.703249_PL_webconnectivity_2da23a91605b3d4f,ok,ok +25,20230506220522.455221_US_ndt_c92cb851b88385fe,ok,ok +26,20230510035712.850382_US_signal_443eeb3410eb0ca8,ok,ok +27,20230515030745.507798_ID_webconnectivity_470fcf34af706e2c,blocked.blockpage.http,blocked +28,20230515030746.580630_ID_webconnectivity_5e0c0f6f064de161,blocked.blockpage.http,blocked +29,20230516074416.471436_PL_signal_b582e139e0b699bc,blocked,blocked +30,20230517123222.672413_ID_webconnectivity_6c0d0ca2cca61a4e,blocked.tls,blocked +31,20230517201114.814952_ID_webconnectivity_c7935d710ec89fca,down.unreachable,down +32,20230517231719.447051_ID_webconnectivity_ae13e1073176aadb,ok,ok +33,20230519002627.334335_PL_dash_d8a74bccd1068817,ok,ok +34,20230519180717.920154_ID_webconnectivity_c76cd0d960b9cfd2,blocked.tls,blocked +35,20230520021738.805431_ID_webconnectivity_0b7bf0916f2fdbcc,ok,ok +36,20230520030722.467868_ID_webconnectivity_0d116ce9b67e184f,blocked.tls,blocked +37,20230520111939.142984_ID_webconnectivity_2c5d6f411621e6c6,blocked.tcp,blocked +38,20230522003622.046162_ID_webconnectivity_173196a9a800a699,ok,ok +39,20230522125344.729274_ID_webconnectivity_efc9fc06ac6ad40a,blocked.tls,blocked +40,20230522135356.571879_ID_webconnectivity_0fa855ea15750a87,blocked.tls,blocked +41,20230522153503.205720_ID_webconnectivity_98bcdf8384d4a24a,blocked.tcp,blocked +42,20230523050653.014355_ID_webconnectivity_25db919447af02b9,blocked.tcp,blocked +43,20230523050923.996721_ID_webconnectivity_49494b9099e0e4a2,blocked.tls,blocked +44,20230523095435.664438_ID_webconnectivity_e1b624f668831385,blocked.blockpage.dns,blocked +45,20230523125640.624646_ID_webconnectivity_8e3f37cfd08e0b28,blocked.dns.nxdomain,blocked +46,20230523141011.641608_ID_webconnectivity_0425e326829c4d49,blocked.tls,blocked +47,20230523141453.314377_ID_webconnectivity_395482ee526774fd,blocked.tls,blocked +48,20230523160502.187051_US_signal_9bb946c8e43efb4e,ok,ok +49,20230524193531.075789_TR_webconnectivity_0bb2f4d46bf9e8a2,blocked.blockpage.http,blocked +50,20230524202524.599589_US_signal_9f87235eec85a02c,ok,ok +51,20230525045532.860564_TR_webconnectivity_c08116ee020e358d,blocked.tcp,blocked +52,20230525064624.327799_DE_ndt_4a6a40065f4a41fa,ok,ok +53,20230526075940.260389_ID_webconnectivity_b6348823f2d5c115,blocked.tls,blocked +54,20230526133200.080176_ID_webconnectivity_789da2213b964de7,blocked.tls,blocked +55,20230526182043.044460_ID_webconnectivity_a02da69af3a6b54e,blocked.blockpage.dns,blocked +56,20230526190142.071390_US_webconnectivity_cb973ffe2f9faf53,ok,ok +57,20230526191241.157224_US_tor_3129e82c77812514,blocked,blocked +58,20230526210610.756064_ID_webconnectivity_29e1939781a13852,blocked.tls,blocked +59,20230530070814.322154_ID_webconnectivity_c1de30c06b952252,blocked.tls,blocked +60,20230531161439.829994_ID_webconnectivity_655eb1c901cba92e,down.unreachable,down +61,20230531175522.391540_ID_webconnectivity_4ea8b251343f5a52,blocked.tls,blocked +62,20230604160144.820099_ID_webconnectivity_50ce1eb5ed64c1ec,blocked.tls,blocked +63,20230614021608.068904_ID_webconnectivity_cace45d2cfc68bf0,blocked.blockpage.http,blocked +64,20230614033656.087821_ID_webconnectivity_af1cd52adc78f664,blocked.tls,blocked +65,20230619052509.462791_ID_webconnectivity_b8eb0fb675457674,blocked.tls,blocked +66,20230620093549.934754_ID_webconnectivity_6f13a9da1d4048a5,blocked.tls,blocked +67,20230622090617.860920_ID_webconnectivity_38e5db97e4d0a864,blocked.tls,blocked +68,20230623011140.916654_ID_webconnectivity_776ee3f5fc9eb0fa,blocked.tls,blocked +69,20230626200058.398913_AT_webconnectivity_b8daa4ab52581cf2,blocked.blockpage.http,blocked +70,20230627035520.524562_MX_webconnectivity_00c7c0e54133a4b7,down.unreachable,down +71,20230628021856.225341_MX_webconnectivity_01945948bd1209ca,down.unreachable,down +72,20230628022120.128694_MX_webconnectivity_547a4714d47eeac9,down.unreachable,down +73,20230628074233.541880_MX_webconnectivity_6430a05d221e17e8,down.unreachable,down +74,20230630010954.236755_MX_webconnectivity_5e3559a7170a052b,ok,ok +75,20230702155544.263794_MX_webconnectivity_74d9f4464a86b7e6,down.unreachable,down +76,20230704234113.923166_ID_webconnectivity_d415a24dadb99785,ok,ok +77,20230705011158.978946_ID_webconnectivity_0cdcee716a5d6520,blocked.tls,blocked +78,20230705035225.647737_ID_webconnectivity_89a08285c47d3949,blocked.tls,blocked +79,20230705035228.116127_ID_webconnectivity_dae13a46acf3e42b,blocked.blockpage.dns,blocked +80,20230705035410.155885_ID_webconnectivity_1d82cd32cb799db4,blocked.blockpage.dns,blocked +81,20230705050711.459884_ID_webconnectivity_1a53a317fcc56770,blocked.tls,blocked +82,20230705051212.687259_ID_webconnectivity_b89ae22326be0b91,blocked.blockpage.http,blocked +83,20230705051704.419148_ID_webconnectivity_3bc750a7874da842,blocked.blockpage.dns,blocked +84,20230705052205.236882_ID_webconnectivity_b24c1880c758738a,blocked.blockpage.http,blocked +85,20230707024346.319917_CN_webconnectivity_3d0d2402b23da8df,blocked.tls,blocked +86,20230711075312.981074_RU_webconnectivity_1364573db835f4dc,blocked.tcp,blocked +87,20230711075334.018552_RU_webconnectivity_a1ecf05354caf3eb,blocked,blocked +88,20230711075424.700337_RU_webconnectivity_c2e897465cd66da8,blocked.tcp,blocked +89,20230711080322.470162_RU_webconnectivity_2065192efbc094c1,down.unreachable,down +90,20230711083400.113430_RU_tor_1fd96e1f5b3262d7,blocked,blocked +91,20230711120831.518666_US_webconnectivity_1ee9ada93ff2c4d0,down.unreachable,down +92,20230711121144.618954_US_webconnectivity_961a508b685953ee,ok,ok +93,20230713050843.999480_FI_webconnectivity_87f5bd5e9df50645,ok,ok +94,20230713051752.494396_FI_ndt_2db8e1269ba20cac,ok,ok +95,20230713052214.929610_FI_ndt_30edac42d3269ed7,ok,ok +96,20230714221932.665395_CU_webconnectivity_cb8d600af6e22900,blocked.blockpage.http,blocked +97,20230715044634.141023_US_signal_3ba8d011420e9792,ok,ok +98,20230717031545.590980_US_webconnectivity_b8bdec48c582e446,blocked.tcp,blocked +99,20230718080332.935420_NL_tor_d8cd96ed329a5442,blocked,blocked +100,20230718155103.076962_JP_signal_fae8e90a56ae1e3c,blocked,blocked +101,20230722004638.476498_CA_webconnectivity_b06a8df85106f2da,ok,ok +102,20230723022739.928899_RU_webconnectivity_4d5abeef0720c9d5,blocked.tcp,blocked +103,20230725112947.634265_US_webconnectivity_9f5f65f580430a16,ok,ok +104,20230729182634.405818_US_signal_0532fafd2defced6,down.misconfigured,down +105,20230801044149.983363_FR_webconnectivity_dd2092359659ade5,ok,ok +106,20230805060504.907957_MY_facebookmessenger_f8a6eaeacea2999d,ok,ok +107,20230808105307.596396_PR_webconnectivity_9750cfd5feffa48c,blocked.tcp,blocked +108,20230808140237.587059_RU_webconnectivity_6686d8c9a5ad3c44,blocked,blocked +109,20230808142748.968758_RU_webconnectivity_d7daef2078d8cf52,blocked.blockpage,blocked +110,20230809041856.808259_JP_webconnectivity_2a12ec3eed52cfcb,blocked,blocked +111,20230811140309.308865_TR_webconnectivity_bdf0949225613d04,down,down +112,20230815082002.754851_US_tor_bd9a09634cee4fe1,blocked.tls,blocked +113,20230825110402.567539_RU_ndt_52cce8d1cb1dabdb,ok,ok +114,20230826115125.289448_ES_webconnectivity_7b27698861dbe1a1,blocked.tcp,blocked +115,20230828220327.209691_US_whatsapp_329689d11954ee75,ok,ok +116,20230906235704.499879_PH_webconnectivity_574eb687e9548c6c,blocked.blockpage.http,blocked +117,20230908044305.772448_US_signal_a991eb4214b7fc1e,ok,ok +118,20230912124627.126620_RU_webconnectivity_b0d15d19193de387,blocked.tls,blocked +119,20230912225618.913735_TR_webconnectivity_d09a6fccb4e1d0b9,blocked.blockpage,blocked +120,20230912225658.443735_TR_webconnectivity_46e1342f54f7f194,blocked.blockpage,blocked +121,20230914122755.438850_US_signal_d4a5899378d21384,ok,ok +122,20231001163322.797615_ES_webconnectivity_eac75eefdefedc01,blocked.blockpage.http,blocked +123,20231005035239.703887_AU_whatsapp_294fdc535a36c424,blocked.tls,blocked +124,20231010021137.752038_US_webconnectivity_60ffe1c368ba3015,ok,ok +125,20231011110422.455401_US_webconnectivity_c51b11720a476bac,ok,ok +126,20231011115926.887045_BR_webconnectivity_a8a69d134bec82b5,ok,ok +127,20231011212647.332599_US_webconnectivity_f3be8fa17fedc6e6,ok,ok +128,20231014084418.835313_US_httpinvalidrequestline_c770a5ef0da9e592,ok,ok +129,20231014084422.167609_US_httpheaderfieldmanipulation_5a29263e1a9ac214,ok,ok +130,20231014085824.026809_US_webconnectivity_6de6d6eb4bcf08b6,ok,ok +131,20231014085831.113063_US_webconnectivity_50fec85bf973b51f,ok,ok +132,20231014085914.883505_US_webconnectivity_93093b082611e313,ok,ok +133,20231014090503.446885_US_webconnectivity_44e24bca002b1546,ok,ok +134,20231014092400.403747_US_webconnectivity_a9f1031bf13b9e39,ok,ok +135,20231014092406.788042_US_webconnectivity_b5d51ef04e61be31,ok,ok +136,20231014092416.327049_US_webconnectivity_4c90187135a08229,ok,ok +137,20231014181353.507771_AU_ndt_e0ec80a84bf1a016,ok,ok +138,20231015010820.051938_US_webconnectivity_aa1cc35e862ec5bd,ok,ok +139,20231015011156.316177_US_webconnectivity_7b11df33265a43ec,ok,ok +140,20231015011559.837542_US_webconnectivity_2c1c19ae979de31f,ok,ok +141,20231015011620.273755_US_webconnectivity_b8a71a68f0a7aeea,down.unreachable,down +142,20231015011640.711582_US_webconnectivity_e2007ecf6093033f,down.unreachable,down +143,20231015011736.767596_US_webconnectivity_0d1ca2f88fddc4b7,down,down +144,20231015012221.728873_US_webconnectivity_60bb9b9aa1cb2913,down,down +145,20231015012854.684078_US_webconnectivity_20f6770b9ba4f6c1,down,down +146,20231015013044.582103_US_webconnectivity_24b1dd4d2ec2f436,down,down +147,20231015013130.107827_US_webconnectivity_138c58a1cffebdb8,down,down +148,20231015013538.513605_US_webconnectivity_29bdb9c85d479ade,down,down +149,20231015014122.721853_US_webconnectivity_76d27dea2a86d1e5,down,down +150,20231015015442.106007_US_webconnectivity_3b77b832f11c8b3f,down,down +151,20231015020615.512510_US_webconnectivity_57d51992fcff960d,down,down +152,20231015021237.567418_US_webconnectivity_87350bc72d590468,down,down +153,20231015021335.748059_US_webconnectivity_7d8b271c54ff1cb3,down.unreachable,down +154,20231015021613.538314_US_webconnectivity_d7af4ea95bbfd701,ok,ok +155,20231015021837.165010_US_webconnectivity_faa1a44927cf9c04,down.unreachable,down +156,20231015021923.061752_US_webconnectivity_7a10e368b164c046,down,down +157,20231015023159.423015_US_webconnectivity_a79ee8e12d5785cb,down,down +158,20231015025117.595771_US_webconnectivity_4226ec707ccf9462,ok,ok +159,20231015025529.987324_US_webconnectivity_e444b2711b1ca14d,ok,ok +160,20231015025900.194062_US_webconnectivity_fa76e48cc75b25f8,ok,ok +161,20231015070155.878989_US_webconnectivity_d554fc3bd06853b6,ok,ok +162,20231018185248.027618_US_webconnectivity_73f7fa26779eef77,blocked.tcp,blocked +163,20231020113429.531305_BR_tor_b02d028e020a0730,blocked.blockpage.http,blocked +164,20231023111352.066717_BR_httpheaderfieldmanipulation_6b6b085d94bdf9a0,blocked.tcp,blocked +165,20231023113321.912812_BR_tor_051a78d8f66280e2,blocked.tcp,blocked +166,20231031105152.595912_US_webconnectivity_3b555141744944cf,blocked.dns.nxdomain,blocked +167,20231107124530.664674_CU_signal_1f1a40d8ba9b3618,ok,ok +168,20231116211939.059228_SA_webconnectivity_3b3561e25ed31b79,ok,ok +169,20231120222913.456317_IR_torsf_f45029d8420eb75b,down,down +170,20231120235958.931398_IR_torsf_b9a3ed334e55f797,down,down +171,20231126083103.781159_US_dash_8710a68a1df0e469,ok,ok +172,20231127034710.665017_US_signal_39e71b46511010bf,blocked,blocked +173,20231204092850.298508_US_facebookmessenger_d8266190615b4524,blocked.dns,blocked +174,20231204093215.602728_US_torsf_26044acfbdf7957f,ok,ok +175,20231208180047.478544_DE_signal_f6b9d7e43036f981,blocked,blocked +176,20231209121320.661011_IR_psiphon_71802acfe6709f2e,blocked,blocked +177,20231209121424.226847_IR_tor_921f3835501f2041,down,down +178,20231209123431.938733_IR_psiphon_1f4c9d0be216f282,blocked,blocked +179,20231209124956.365976_IR_psiphon_a3b3af97fd1ce50f,ok,ok +180,20231209125647.588063_IR_psiphon_57db060f16ce5c20,ok,ok +181,20231209130951.422378_IR_tor_38227a5bdb21f027,blocked.tcp,blocked +182,20231209131715.588967_IR_ndt_611b5a204a340e2a,down.unreachable,down +183,20231209132303.641999_IR_telegram_c6780b9b7e4c9962,blocked.tcp,blocked +184,20231209133916.137248_IR_webconnectivity_ec978e7151643686,blocked,blocked +185,20231209133946.652659_IR_webconnectivity_9351a5ccf5b2b7e0,blocked,blocked +186,20231209134251.927155_IR_webconnectivity_93da8a88e31fbd64,ok,ok +187,20231209134254.777986_IR_webconnectivity_cbe0b2208a45dce7,ok,ok +188,20231209134718.819151_IR_webconnectivity_25b0062e655c5de8,ok,ok +189,20231209135052.101093_IR_webconnectivity_9935959c50c81511,ok,ok +190,20231209135327.677167_IR_webconnectivity_37580e895ea74544,ok,ok +191,20231210034024.024763_US_webconnectivity_7a31469aa4f80bf5,ok,ok +192,20231210152235.402641_RU_webconnectivity_0acd9476b871f7ce,ok,ok +193,20231210152608.723733_RU_webconnectivity_d40624d4e512b123,blocked.blockpage.server_side,blocked +194,20231211122708.857576_US_webconnectivity_300ffe11f200c19b,ok,ok +195,20231211132853.294547_DE_browserweb_3a6b3adfe1cabf8e,down.unreachable,down +196,20231211132907.360866_DE_browserweb_d65d60b8732ac6ad,ok,ok +197,20231216232110.063892_RU_signal_dd5dc7801e77f470,ok,ok +198,20231216232611.380280_RU_psiphon_a80b27ed3d8f8d44,ok,ok +199,20231217180444.177508_US_signal_98ef8d16b16604b4,blocked.dns,blocked +200,20231221000658.071248_UA_signal_a1dbd1dcaffbcc22,down,down +201,20231222101657.548811_ES_webconnectivity_9707add2136d136c,blocked.tcp,blocked +202,20231222134352.319985_US_signal_8ea4336a848ee334,blocked,blocked +203,20231223163720.255940_ES_signal_ddf2d0d181d16dfd,blocked,blocked +204,20231229195103.347678_IR_psiphon_8f12548ce2cb0a77,blocked,blocked +205,20231229195340.889994_ES_webconnectivity_affca2bb4a7ec326,blocked.tcp,blocked +206,20231229195406.710065_ES_webconnectivity_03b7356653f525ab,blocked.tcp,blocked +207,20231229201747.363140_IR_torsf_c194668522c26897,blocked,blocked +208,20231229201844.606972_IR_torsf_2f284670d3a04aca,blocked,blocked +209,20231229202156.950852_IR_torsf_722776834d44c159,blocked,blocked +210,20231229203320.595803_IR_torsf_ccc4e4c37beebae9,blocked,blocked +211,20231229203415.005426_IR_webconnectivity_1e0f8c6c1f17b26e,blocked,blocked +212,20231229203611.902257_IR_webconnectivity_a5982aa7da15c968,blocked,blocked +213,20231229203929.431269_IR_psiphon_a8c6fada699a21a5,blocked,blocked +214,20231229203947.392487_IR_webconnectivity_2b8ccfd916ce57f5,blocked,blocked +215,20231229204527.398923_IR_webconnectivity_d9e38a9e15a9933a,ok,ok +216,20231229205440.697341_IR_psiphon_c6fb7ed97692e5a5,blocked,blocked +217,20231229205650.252899_IR_tor_577675f641ac80e5,blocked,blocked +218,20231229210035.629564_IR_webconnectivity_9d2d625b7485ceae,blocked,blocked +219,20231229210122.107127_IR_webconnectivity_ce67e82e84d3da2e,blocked,blocked +220,20231229210131.103093_IR_webconnectivity_d109d16966891827,ok,ok +221,20231229210204.016924_IR_tor_ffabeacbde6c28d3,blocked,blocked +222,20231229210221.438422_IR_webconnectivity_c7914c0dcde3a32b,ok,ok +223,20231229210633.580773_IR_psiphon_1020780a3718c5c5,blocked,blocked +224,20231229211016.784415_IR_tor_b196c19a9da9343a,blocked,blocked +225,20240101113125.808243_BG_webconnectivity_ba4cf234d47b73ec,blocked.blockpage.dns,blocked +226,20240103023256.123517_FI_facebookmessenger_3f210b7d38137077,ok,ok +227,20240105124728.932609_IN_signal_665ff2718adf4813,blocked,blocked +228,20240107112214.646331_RU_tor_ff97dd2020869ed3,ok,ok +229,20240117005152.303700_US_telegram_6cec0dc4aa52e0bd,blocked.tls,blocked +230,20240117005327.704773_US_dash_8ca3355ea979f5b8,blocked.tcp,blocked +231,20240126012946.001319_US_httpheaderfieldmanipulation_7bdeca9f176138dd,blocked.blockpage.dns,blocked +232,20240126022540.485270_US_signal_3e5b544420121192,blocked.blockpage.dns,blocked +233,20240213020502.919684_US_dash_4a5737d1a962d205,ok,ok +234,20240220050354.524776_US_webconnectivity_a690552818804fc3,down,down +235,20240224232654.007984_RU_webconnectivity_9164a3df2d35316c,ok,ok +236,20240226225131.261075_VE_webconnectivity_a3e31c999fc8b161,blocked.blockpage.http,blocked +237,20240226225231.612531_VE_webconnectivity_47d3561e542337d8,blocked.blockpage.http,blocked +238,20240226225245.422977_VE_webconnectivity_37dcdd51581cbd13,blocked.blockpage.http,blocked +239,20240227160142.829208_US_webconnectivity_2c9b945991901f8d,blocked.blockpage.server_side,blocked +240,20240303212845.903681_RU_torsf_15f6d4fe79fd17d1,blocked,blocked +241,20240305115627.234066_SN_vanillator_4a25da4158ec358b,blocked,blocked +242,20240311005741.675686_SE_webconnectivity_2a4a84928bd17ab0,ok,ok +243,20240316062349.575036_US_webconnectivity_b63efd0ed694e005,blocked.tcp,blocked +244,20240328194436.111684_TR_webconnectivity_5414b98b9c9f873b,blocked.tcp,blocked +245,20240406230645.376001_EG_tor_aca852017daea25e,blocked,blocked +246,20240409035157.511121_BR_webconnectivity_85b1de4e410314f7,ok,ok +247,20240410115514.842786_BR_webconnectivity_6d224ea8b6b3ca7c,blocked.blockpage.dns,blocked +248,20240410124541.400148_BR_webconnectivity_ac16eb05475f622a,blocked.blockpage.dns,blocked +249,20240410125508.024884_BR_tor_96354b17225c86db,blocked,blocked +250,20240410134516.191956_BR_webconnectivity_a947a71df23203f3,blocked.blockpage,blocked +251,20240410135012.070725_BR_webconnectivity_d3e9bce608599d5e,blocked.blockpage,blocked +252,20240413230148.929136_KH_webconnectivity_33ae9436d7b6779c,down.misconfigured,down +253,20240415141511.755790_BR_webconnectivity_07547042a9307621,blocked.blockpage.dns,blocked +254,20240416214307.425888_BR_webconnectivity_c9d912510d61bc0b,blocked.blockpage,blocked +255,20240418071953.744226_BR_webconnectivity_2c6b65eeff39f34f,blocked.blockpage,blocked +256,20240422175948.138414_FR_httpinvalidrequestline_3db55d5c74af9da4,down.unreachable,down +257,20240505191929.287281_AE_tor_2c2ad53006c55605,blocked.tcp,blocked +258,20240506163355.336279_VN_webconnectivity_8de9ce661982414d,blocked.blockpage.http,blocked +259,20240508114544.444840_BR_webconnectivity_379718729eeed45b,blocked,blocked +260,20240514091759.626287_NL_webconnectivity_38962f675df0f676,blocked.blockpage.http,blocked +261,20240519182127.049517_US_webconnectivity_6e12ec842e98674a,ok,ok +262,20240522113817.495473_NL_webconnectivity_e81ed947814f9d2a,blocked.blockpage.dns,blocked +263,20240524142956.125292_JO_webconnectivity_5cd31e0f03494bd2,blocked.tcp,blocked +264,20240601154335.954619_SV_telegram_6a1ea4f228eec94e,blocked,blocked +265,20240627074955.407639_RU_webconnectivity_99e23c2b9680c1cb,blocked.blockpage.server_side,blocked +266,20240704234509.514733_NL_webconnectivity_6f924d2e43209ae1,ok,ok +267,20240705015016.667807_AE_webconnectivity_392604bce72a44d5,ok,ok +268,20240722041303.591874_MM_webconnectivity_98e6671dd7dce61a,blocked.tcp,blocked +269,20240722041334.778473_MM_webconnectivity_93a628687303be86,blocked.tcp,blocked +270,20240722042117.264677_MM_psiphon_d070773ff0def3a6,blocked,blocked +271,20240722042428.067975_MM_tor_c8f3f8a6599d1ba7,blocked,blocked +272,20240722042950.433988_MM_webconnectivity_d388cdc8bad1f15c,blocked.tcp,blocked +273,20240726064654.628644_PK_httpinvalidrequestline_60344e3445c0f591,blocked.tcp,blocked +274,20240728114019.011456_VE_webconnectivity_1f0ba3819685e272,blocked.blockpage.http,blocked +275,20240801104158.280450_NG_ndt_0052b6e910265283,down.unreachable,down +276,20240810153107.018326_DE_ndt_d5be83f1a7c5d605,ok,ok +277,20240810175938.750056_VE_webconnectivity_016721e1ebfdc2ed,blocked.tcp,blocked +278,20240810182504.634031_VE_webconnectivity_853b19341a35d2f0,blocked.tcp,blocked +279,20240810182604.928599_VE_webconnectivity_f42bd5020088c498,blocked.blockpage.http,blocked +280,20240815043926.030750_VE_webconnectivity_f034e025b6db08ea,blocked.tcp,blocked +281,20240815092817.050941_DE_webconnectivity_661003d3498d802f,ok,ok +282,20240815172949.387668_VE_webconnectivity_427addcd5d1ea806,blocked.tcp,blocked +283,20240818234433.791006_VE_webconnectivity_8fac03865551a8eb,ok,ok +284,20240820000738.441114_US_dash_562a4dac7563a905,ok,ok +285,20240820163242.249906_JO_webconnectivity_a826f460299fa996,blocked.dns.inconsistent,blocked diff --git a/oonipipeline/notebooks/sql-analysis.sql b/oonipipeline/notebooks/sql-analysis.sql new file mode 100644 index 00000000..012fb09d --- /dev/null +++ b/oonipipeline/notebooks/sql-analysis.sql @@ -0,0 +1,114 @@ +CLOUD_PROVIDERS_ASNS = [ + 13335, # Cloudflare: https://www.peeringdb.com/net/4224 + 209242, # Cloudflare London, LLC + 20940, # Akamai: https://www.peeringdb.com/net/2 + 9002, # Akamai RETN + 16625, # Akamai Technologies, Inc. + 63949, # Akamai Technologies, Inc. + 16509, # Amazon.com, Inc. + 14618, # Amazon.com, Inc. + 15169, # Google LLC + 396982, # Google Cloud: https://www.peeringdb.com/net/30878 + 54113, # Fastly, Inc + 8075, # Microsoft Corporation + 8068, # Microsoft Corporation +] + +df_ctrl_exp = click_query(""" +WITH +mapFilter((ip, _) -> (has(exp_dns_answer_records, ip) = 1), ctrl_tls_inconsistent_ips_map) as ctrl_tls_inconsistent_map, +mapFilter((ip, _) -> (has(exp_dns_answer_records, ip) = 1), ctrl_tls_consistent_ips_map) as ctrl_tls_consistent_map +SELECT +hostname, +measurement_uid, +probe_cc, +probe_asn, +exp_dns_answer_cloud_provider, +exp_dns_answer_matches_probe_cc, +exp_dns_answer_matches_probe_asn, +exp_dns_answer_bogon, +exp_dns_answer_record_count, +exp_dns_tls_consistent, +hasAny(ctrl_top8_ips, exp_dns_answer_records) as exp_dns_answer_matches_top8_ip_ctrl, +hasAny(ctrl_top3_asns, exp_dns_answer_asns) as exp_dns_answer_matches_top3_asn_ctrl, +ctrl_hostname, +ctrl_dns_answer_asns, +ctrl_dns_answer_ccs, +ctrl_dns_answer_bogon, +ctrl_dns_answer_record_count_q50, +ctrl_dns_answer_cloud_provider, +arraySum( + mapValues(ctrl_tls_inconsistent_map) +) as ctrl_tls_inconsistent_datum_count, + +arraySum( + mapValues(ctrl_tls_consistent_map) +) as ctrl_tls_consistent_datum_count, +length(mapKeys(ctrl_tls_inconsistent_map)) as ctrl_tls_inconsistent_ip_count, +length(mapKeys(ctrl_tls_consistent_map)) as ctrl_tls_consistent_ip_count +FROM ( + WITH + groupUniqArray(ip_cc) as exp_dns_answer_ccs, + max(ip_is_bogon) as exp_dns_answer_bogon, + max(tls_is_certificate_valid) as exp_dns_tls_consistent + SELECT + hostname, + measurement_uid, + probe_cc, + probe_asn, + groupArray(dns_answer) as exp_dns_answer_records, + groupUniqArray(ip_asn) as exp_dns_answer_asns, + max(IF(ip_asn IN %(cloud_provider_asns)s, 1, 0)) exp_dns_answer_cloud_provider, + has(exp_dns_answer_ccs, probe_cc) as exp_dns_answer_matches_probe_cc, + has(exp_dns_answer_asns, probe_asn) as exp_dns_answer_matches_probe_asn, + exp_dns_answer_bogon, + --multiIf(answer_count_num <= 1, 'low', answer_count_num <= 4, 'med', 'high') as answer_count + length(exp_dns_answer_records) exp_dns_answer_record_count, + exp_dns_answer_records, + exp_dns_tls_consistent + FROM obs_web + WHERE + dns_engine IN ('getaddrinfo', 'system', 'golang_net_resolver') + AND measurement_start_time > '2024-08-01' + AND measurement_start_time <= '2024-08-02' + AND dns_answer IS NOT NULL + GROUP BY measurement_uid, hostname, probe_cc, probe_asn +) AS exp +LEFT OUTER JOIN ( + SELECT + hostname as ctrl_hostname, + groupUniqArrayArray(ctrl_dns_answer_ip_asns) as ctrl_dns_answer_asns, + groupUniqArrayArray(ctrl_dns_answer_ccs) as ctrl_dns_answer_ccs, + MAX(ctrl_dns_answer_bogon) as ctrl_dns_answer_bogon, + quantile(0.5)(ctrl_dns_answer_record_count) as ctrl_dns_answer_record_count_q50, + MAX(ctrl_dns_answer_cloud_provider) as ctrl_dns_answer_cloud_provider, + CAST(sumMap( + ctrl_tls_consistent_ips, arrayResize(CAST([], 'Array(UInt64)'), length(ctrl_tls_consistent_ips), 1) + ), 'Map(String, UInt32)') as ctrl_tls_consistent_ips_map, + CAST(sumMap( + ctrl_tls_inconsistent_ips, arrayResize(CAST([], 'Array(UInt64)'), length(ctrl_tls_inconsistent_ips), 1) + ), 'Map(String, UInt32)') as ctrl_tls_inconsistent_ips_map, + topK(8)(arrayJoin(ctrl_dns_answer_records)) as ctrl_top8_ips, + topK(3)(arrayJoin(ctrl_dns_answer_ip_asns)) as ctrl_top3_asns + FROM ( + SELECT + hostname, + groupUniqArray(ip_cc) as ctrl_dns_answer_ccs, + max(ip_is_bogon) as ctrl_dns_answer_bogon, + groupArray(ip) as ctrl_dns_answer_records, + groupUniqArray(ip_asn) as ctrl_dns_answer_ip_asns, + length(ctrl_dns_answer_records) ctrl_dns_answer_record_count, + max(IF(ip_asn IN %(cloud_provider_asns)s, 1, 0)) ctrl_dns_answer_cloud_provider, + groupArrayIf(ip, tls_success = 1) as ctrl_tls_consistent_ips, + groupArrayIf(ip, tls_success = 0 AND tls_failure LIKE 'ssl_%%') as ctrl_tls_inconsistent_ips + FROM + obs_web_ctrl + WHERE measurement_start_time > '2024-08-01' + AND measurement_start_time <= '2024-08-02' + AND dns_success = 1 + GROUP BY hostname, measurement_uid + ) as t + GROUP BY hostname +) AS ctrl +ON ctrl.ctrl_hostname = exp.hostname +""", params={"cloud_provider_asns": CLOUD_PROVIDERS_ASNS}) diff --git a/oonipipeline/notebooks/web-analysis-bn.ipynb b/oonipipeline/notebooks/web-analysis-bn.ipynb new file mode 100644 index 00000000..6d455039 --- /dev/null +++ b/oonipipeline/notebooks/web-analysis-bn.ipynb @@ -0,0 +1,1346 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "99aba231-cfe4-4ecb-8233-b34c90515fe9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/art/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from IPython.display import Image\n", + "from pgmpy.models import BayesianNetwork\n", + "from pgmpy.factors.discrete import TabularCPD" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c76afe2b-1a36-494f-aa99-c9ae037b39be", + "metadata": {}, + "outputs": [], + "source": [ + "msmt_feedback = pd.read_csv(\"msmt_feedback_clean.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "ce851a49-6dab-472d-a5a7-78c41395acca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['20230306T235817Z_webconnectivity_BR_263087_n1_1rNv0dEaDgiZ9i33',\n", + " '20230307235958.642565_FR_webconnectivity_86a528710144d5f2',\n", + " '20230308T092114Z_webconnectivity_IR_49100_n1_eo1anF5FIOhWAomo',\n", + " '20230315T022408Z_webconnectivity_KH_131178_n1_c1skknOHGkyIqXuF',\n", + " '20230315T114404Z_webconnectivity_BR_7738_n1_e0zJX7TbiQHa3TyQ',\n", + " '20230318T084015Z_webconnectivity_US_21928_n1_p5G1g3Z2ireXwKUt',\n", + " '20230319T003935Z_webconnectivity_US_21928_n1_FH6UhDKqX9szXTsj',\n", + " '20230322T054150Z_webconnectivity_ID_23693_n1_RT0imyzovPkCTr13',\n", + " '20230403T151710Z_webconnectivity_US_36492_n1_fWvZu2SdRRElD8sF',\n", + " '20230409084418.704983_KH_webconnectivity_69ef831610f69fbc',\n", + " '20230410T120007Z_webconnectivity_ZA_37611_n1_nG62Z3Y6KNMearyg',\n", + " '20230412091523.463532_KH_webconnectivity_6b3e6ecbbc9fdad2',\n", + " '20230419063137.069564_KH_webconnectivity_e0e3dab6adb1028f',\n", + " '20230420072440.682797_DE_webconnectivity_331a7552d12271a7',\n", + " '20230420073441.286822_DE_webconnectivity_34316f607b053ea1',\n", + " '20230429140933.619104_BR_webconnectivity_113edaf5ace99443',\n", + " '20230430212622.885474_DE_webconnectivity_8adaea5171f572ef',\n", + " '20230506155633.735998_RU_webconnectivity_442c71353fd69a18',\n", + " '20230506191702.703249_PL_webconnectivity_2da23a91605b3d4f',\n", + " '20230515030745.507798_ID_webconnectivity_470fcf34af706e2c',\n", + " '20230515030746.580630_ID_webconnectivity_5e0c0f6f064de161',\n", + " '20230517123222.672413_ID_webconnectivity_6c0d0ca2cca61a4e',\n", + " '20230517201114.814952_ID_webconnectivity_c7935d710ec89fca',\n", + " '20230517231719.447051_ID_webconnectivity_ae13e1073176aadb',\n", + " '20230519180717.920154_ID_webconnectivity_c76cd0d960b9cfd2',\n", + " '20230520021738.805431_ID_webconnectivity_0b7bf0916f2fdbcc',\n", + " '20230520030722.467868_ID_webconnectivity_0d116ce9b67e184f',\n", + " '20230520111939.142984_ID_webconnectivity_2c5d6f411621e6c6',\n", + " '20230522003622.046162_ID_webconnectivity_173196a9a800a699',\n", + " '20230522125344.729274_ID_webconnectivity_efc9fc06ac6ad40a',\n", + " '20230522135356.571879_ID_webconnectivity_0fa855ea15750a87',\n", + " '20230522153503.205720_ID_webconnectivity_98bcdf8384d4a24a',\n", + " '20230523050653.014355_ID_webconnectivity_25db919447af02b9',\n", + " '20230523050923.996721_ID_webconnectivity_49494b9099e0e4a2',\n", + " '20230523095435.664438_ID_webconnectivity_e1b624f668831385',\n", + " '20230523125640.624646_ID_webconnectivity_8e3f37cfd08e0b28',\n", + " '20230523141011.641608_ID_webconnectivity_0425e326829c4d49',\n", + " '20230523141453.314377_ID_webconnectivity_395482ee526774fd',\n", + " '20230524193531.075789_TR_webconnectivity_0bb2f4d46bf9e8a2',\n", + " '20230525045532.860564_TR_webconnectivity_c08116ee020e358d',\n", + " '20230526075940.260389_ID_webconnectivity_b6348823f2d5c115',\n", + " '20230526133200.080176_ID_webconnectivity_789da2213b964de7',\n", + " '20230526182043.044460_ID_webconnectivity_a02da69af3a6b54e',\n", + " '20230526190142.071390_US_webconnectivity_cb973ffe2f9faf53',\n", + " '20230526210610.756064_ID_webconnectivity_29e1939781a13852',\n", + " '20230530070814.322154_ID_webconnectivity_c1de30c06b952252',\n", + " '20230531161439.829994_ID_webconnectivity_655eb1c901cba92e',\n", + " '20230531175522.391540_ID_webconnectivity_4ea8b251343f5a52',\n", + " '20230604160144.820099_ID_webconnectivity_50ce1eb5ed64c1ec',\n", + " '20230614021608.068904_ID_webconnectivity_cace45d2cfc68bf0',\n", + " '20230614033656.087821_ID_webconnectivity_af1cd52adc78f664',\n", + " '20230619052509.462791_ID_webconnectivity_b8eb0fb675457674',\n", + " '20230620093549.934754_ID_webconnectivity_6f13a9da1d4048a5',\n", + " '20230622090617.860920_ID_webconnectivity_38e5db97e4d0a864',\n", + " '20230623011140.916654_ID_webconnectivity_776ee3f5fc9eb0fa',\n", + " '20230626200058.398913_AT_webconnectivity_b8daa4ab52581cf2',\n", + " '20230627035520.524562_MX_webconnectivity_00c7c0e54133a4b7',\n", + " '20230628021856.225341_MX_webconnectivity_01945948bd1209ca',\n", + " '20230628022120.128694_MX_webconnectivity_547a4714d47eeac9',\n", + " '20230628074233.541880_MX_webconnectivity_6430a05d221e17e8',\n", + " '20230630010954.236755_MX_webconnectivity_5e3559a7170a052b',\n", + " '20230702155544.263794_MX_webconnectivity_74d9f4464a86b7e6',\n", + " '20230704234113.923166_ID_webconnectivity_d415a24dadb99785',\n", + " '20230705011158.978946_ID_webconnectivity_0cdcee716a5d6520',\n", + " '20230705035225.647737_ID_webconnectivity_89a08285c47d3949',\n", + " '20230705035228.116127_ID_webconnectivity_dae13a46acf3e42b',\n", + " '20230705035410.155885_ID_webconnectivity_1d82cd32cb799db4',\n", + " '20230705050711.459884_ID_webconnectivity_1a53a317fcc56770',\n", + " '20230705051212.687259_ID_webconnectivity_b89ae22326be0b91',\n", + " '20230705051704.419148_ID_webconnectivity_3bc750a7874da842',\n", + " '20230705052205.236882_ID_webconnectivity_b24c1880c758738a',\n", + " '20230707024346.319917_CN_webconnectivity_3d0d2402b23da8df',\n", + " '20230711075312.981074_RU_webconnectivity_1364573db835f4dc',\n", + " '20230711075334.018552_RU_webconnectivity_a1ecf05354caf3eb',\n", + " '20230711075424.700337_RU_webconnectivity_c2e897465cd66da8',\n", + " '20230711080322.470162_RU_webconnectivity_2065192efbc094c1',\n", + " '20230711120831.518666_US_webconnectivity_1ee9ada93ff2c4d0',\n", + " '20230711121144.618954_US_webconnectivity_961a508b685953ee',\n", + " '20230713050843.999480_FI_webconnectivity_87f5bd5e9df50645',\n", + " '20230714221932.665395_CU_webconnectivity_cb8d600af6e22900',\n", + " '20230717031545.590980_US_webconnectivity_b8bdec48c582e446',\n", + " '20230722004638.476498_CA_webconnectivity_b06a8df85106f2da',\n", + " '20230723022739.928899_RU_webconnectivity_4d5abeef0720c9d5',\n", + " '20230725112947.634265_US_webconnectivity_9f5f65f580430a16',\n", + " '20230801044149.983363_FR_webconnectivity_dd2092359659ade5',\n", + " '20230808105307.596396_PR_webconnectivity_9750cfd5feffa48c',\n", + " '20230808140237.587059_RU_webconnectivity_6686d8c9a5ad3c44',\n", + " '20230808142748.968758_RU_webconnectivity_d7daef2078d8cf52',\n", + " '20230809041856.808259_JP_webconnectivity_2a12ec3eed52cfcb',\n", + " '20230811140309.308865_TR_webconnectivity_bdf0949225613d04',\n", + " '20230826115125.289448_ES_webconnectivity_7b27698861dbe1a1',\n", + " '20230906235704.499879_PH_webconnectivity_574eb687e9548c6c',\n", + " '20230912124627.126620_RU_webconnectivity_b0d15d19193de387',\n", + " '20230912225618.913735_TR_webconnectivity_d09a6fccb4e1d0b9',\n", + " '20230912225658.443735_TR_webconnectivity_46e1342f54f7f194',\n", + " '20231001163322.797615_ES_webconnectivity_eac75eefdefedc01',\n", + " '20231010021137.752038_US_webconnectivity_60ffe1c368ba3015',\n", + " '20231011110422.455401_US_webconnectivity_c51b11720a476bac',\n", + " '20231011115926.887045_BR_webconnectivity_a8a69d134bec82b5',\n", + " '20231011212647.332599_US_webconnectivity_f3be8fa17fedc6e6',\n", + " '20231014085824.026809_US_webconnectivity_6de6d6eb4bcf08b6',\n", + " '20231014085831.113063_US_webconnectivity_50fec85bf973b51f',\n", + " '20231014085914.883505_US_webconnectivity_93093b082611e313',\n", + " '20231014090503.446885_US_webconnectivity_44e24bca002b1546',\n", + " '20231014092400.403747_US_webconnectivity_a9f1031bf13b9e39',\n", + " '20231014092406.788042_US_webconnectivity_b5d51ef04e61be31',\n", + " '20231014092416.327049_US_webconnectivity_4c90187135a08229',\n", + " '20231015010820.051938_US_webconnectivity_aa1cc35e862ec5bd',\n", + " '20231015011156.316177_US_webconnectivity_7b11df33265a43ec',\n", + " '20231015011559.837542_US_webconnectivity_2c1c19ae979de31f',\n", + " '20231015011620.273755_US_webconnectivity_b8a71a68f0a7aeea',\n", + " '20231015011640.711582_US_webconnectivity_e2007ecf6093033f',\n", + " '20231015011736.767596_US_webconnectivity_0d1ca2f88fddc4b7',\n", + " '20231015012221.728873_US_webconnectivity_60bb9b9aa1cb2913',\n", + " '20231015012854.684078_US_webconnectivity_20f6770b9ba4f6c1',\n", + " '20231015013044.582103_US_webconnectivity_24b1dd4d2ec2f436',\n", + " '20231015013130.107827_US_webconnectivity_138c58a1cffebdb8',\n", + " '20231015013538.513605_US_webconnectivity_29bdb9c85d479ade',\n", + " '20231015014122.721853_US_webconnectivity_76d27dea2a86d1e5',\n", + " '20231015015442.106007_US_webconnectivity_3b77b832f11c8b3f',\n", + " '20231015020615.512510_US_webconnectivity_57d51992fcff960d',\n", + " '20231015021237.567418_US_webconnectivity_87350bc72d590468',\n", + " '20231015021335.748059_US_webconnectivity_7d8b271c54ff1cb3',\n", + " '20231015021613.538314_US_webconnectivity_d7af4ea95bbfd701',\n", + " '20231015021837.165010_US_webconnectivity_faa1a44927cf9c04',\n", + " '20231015021923.061752_US_webconnectivity_7a10e368b164c046',\n", + " '20231015023159.423015_US_webconnectivity_a79ee8e12d5785cb',\n", + " '20231015025117.595771_US_webconnectivity_4226ec707ccf9462',\n", + " '20231015025529.987324_US_webconnectivity_e444b2711b1ca14d',\n", + " '20231015025900.194062_US_webconnectivity_fa76e48cc75b25f8',\n", + " '20231015070155.878989_US_webconnectivity_d554fc3bd06853b6',\n", + " '20231018185248.027618_US_webconnectivity_73f7fa26779eef77',\n", + " '20231031105152.595912_US_webconnectivity_3b555141744944cf',\n", + " '20231116211939.059228_SA_webconnectivity_3b3561e25ed31b79',\n", + " '20231209133916.137248_IR_webconnectivity_ec978e7151643686',\n", + " '20231209133946.652659_IR_webconnectivity_9351a5ccf5b2b7e0',\n", + " '20231209134251.927155_IR_webconnectivity_93da8a88e31fbd64',\n", + " '20231209134254.777986_IR_webconnectivity_cbe0b2208a45dce7',\n", + " '20231209134718.819151_IR_webconnectivity_25b0062e655c5de8',\n", + " '20231209135052.101093_IR_webconnectivity_9935959c50c81511',\n", + " '20231209135327.677167_IR_webconnectivity_37580e895ea74544',\n", + " '20231210034024.024763_US_webconnectivity_7a31469aa4f80bf5',\n", + " '20231210152235.402641_RU_webconnectivity_0acd9476b871f7ce',\n", + " '20231210152608.723733_RU_webconnectivity_d40624d4e512b123',\n", + " '20231211122708.857576_US_webconnectivity_300ffe11f200c19b',\n", + " '20231222101657.548811_ES_webconnectivity_9707add2136d136c',\n", + " '20231229195340.889994_ES_webconnectivity_affca2bb4a7ec326',\n", + " '20231229195406.710065_ES_webconnectivity_03b7356653f525ab',\n", + " '20231229203415.005426_IR_webconnectivity_1e0f8c6c1f17b26e',\n", + " '20231229203611.902257_IR_webconnectivity_a5982aa7da15c968',\n", + " '20231229203947.392487_IR_webconnectivity_2b8ccfd916ce57f5',\n", + " '20231229204527.398923_IR_webconnectivity_d9e38a9e15a9933a',\n", + " '20231229210035.629564_IR_webconnectivity_9d2d625b7485ceae',\n", + " '20231229210122.107127_IR_webconnectivity_ce67e82e84d3da2e',\n", + " '20231229210131.103093_IR_webconnectivity_d109d16966891827',\n", + " '20231229210221.438422_IR_webconnectivity_c7914c0dcde3a32b',\n", + " '20240101113125.808243_BG_webconnectivity_ba4cf234d47b73ec',\n", + " '20240220050354.524776_US_webconnectivity_a690552818804fc3',\n", + " '20240224232654.007984_RU_webconnectivity_9164a3df2d35316c',\n", + " '20240226225131.261075_VE_webconnectivity_a3e31c999fc8b161',\n", + " '20240226225231.612531_VE_webconnectivity_47d3561e542337d8',\n", + " '20240226225245.422977_VE_webconnectivity_37dcdd51581cbd13',\n", + " '20240227160142.829208_US_webconnectivity_2c9b945991901f8d',\n", + " '20240311005741.675686_SE_webconnectivity_2a4a84928bd17ab0',\n", + " '20240316062349.575036_US_webconnectivity_b63efd0ed694e005',\n", + " '20240328194436.111684_TR_webconnectivity_5414b98b9c9f873b',\n", + " '20240409035157.511121_BR_webconnectivity_85b1de4e410314f7',\n", + " '20240410115514.842786_BR_webconnectivity_6d224ea8b6b3ca7c',\n", + " '20240410124541.400148_BR_webconnectivity_ac16eb05475f622a',\n", + " '20240410134516.191956_BR_webconnectivity_a947a71df23203f3',\n", + " '20240410135012.070725_BR_webconnectivity_d3e9bce608599d5e',\n", + " '20240413230148.929136_KH_webconnectivity_33ae9436d7b6779c',\n", + " '20240415141511.755790_BR_webconnectivity_07547042a9307621',\n", + " '20240416214307.425888_BR_webconnectivity_c9d912510d61bc0b',\n", + " '20240418071953.744226_BR_webconnectivity_2c6b65eeff39f34f',\n", + " '20240506163355.336279_VN_webconnectivity_8de9ce661982414d',\n", + " '20240508114544.444840_BR_webconnectivity_379718729eeed45b',\n", + " '20240514091759.626287_NL_webconnectivity_38962f675df0f676',\n", + " '20240519182127.049517_US_webconnectivity_6e12ec842e98674a',\n", + " '20240522113817.495473_NL_webconnectivity_e81ed947814f9d2a',\n", + " '20240524142956.125292_JO_webconnectivity_5cd31e0f03494bd2',\n", + " '20240627074955.407639_RU_webconnectivity_99e23c2b9680c1cb',\n", + " '20240704234509.514733_NL_webconnectivity_6f924d2e43209ae1',\n", + " '20240705015016.667807_AE_webconnectivity_392604bce72a44d5',\n", + " '20240722041303.591874_MM_webconnectivity_98e6671dd7dce61a',\n", + " '20240722041334.778473_MM_webconnectivity_93a628687303be86',\n", + " '20240722042950.433988_MM_webconnectivity_d388cdc8bad1f15c',\n", + " '20240728114019.011456_VE_webconnectivity_1f0ba3819685e272',\n", + " '20240810175938.750056_VE_webconnectivity_016721e1ebfdc2ed',\n", + " '20240810182504.634031_VE_webconnectivity_853b19341a35d2f0',\n", + " '20240810182604.928599_VE_webconnectivity_f42bd5020088c498',\n", + " '20240815043926.030750_VE_webconnectivity_f034e025b6db08ea',\n", + " '20240815092817.050941_DE_webconnectivity_661003d3498d802f',\n", + " '20240815172949.387668_VE_webconnectivity_427addcd5d1ea806',\n", + " '20240818234433.791006_VE_webconnectivity_8fac03865551a8eb',\n", + " '20240820163242.249906_JO_webconnectivity_a826f460299fa996']" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(filter(lambda x: 'webconnectivity' in x, msmt_feedback['measurement_uid'].unique()))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f9393b66-f6af-4d17-884d-ffda1683b8f3", + "metadata": {}, + "outputs": [], + "source": [ + "# 20231129041111.939896_NP_webconnectivity_32105af63774eabf" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1b64f651-0707-4bb9-9205-2df6658ed0eb", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from oonidata.dataclient import load_measurement\n", + "from oonidata.apiclient import get_measurement_dict_by_uid\n", + "\n", + "from oonipipeline.netinfo import NetinfoDB\n", + "from oonipipeline.transforms.observations import measurement_to_observations" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9605bec3-2993-4520-b810-aed279284d00", + "metadata": {}, + "outputs": [], + "source": [ + "possible_states = {\n", + " 'DNS Ctrl Failure': ['none', 'nxdomain', 'server_failure'],\n", + " 'DNS VP Failure': ['none', 'nxdomain', 'server_failure'],\n", + " 'DNS Answer': [\n", + " 'answer_is_bogon',\n", + " 'answer_matches_probe_asn',\n", + " 'answer_matches_probe_cc',\n", + " 'answer_is_cloud_provider',\n", + " 'answer_other'\n", + " ],\n", + " 'DNS Answer TLS Consistency': [\n", + " 'tls_consistent',\n", + " 'tls_inconsistent',\n", + " 'unknown'\n", + " ],\n", + " 'TCP Ctrl Failure': ['none', 'connection_reset', 'timeout', 'other'],\n", + " 'TCP VP Result': ['none', 'connection_reset', 'timeout', 'other', 'down'],\n", + " 'TLS Ctrl Failure': ['none', 'bad_certificate', 'other'],\n", + " 'TLS VP Result': ['none',\n", + " 'bad_certificate',\n", + " 'connection_reset_after_ch',\n", + " 'timeout_after_ch',\n", + " 'timeout',\n", + " 'connection_reset',\n", + " 'other',\n", + " 'down'],\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83d5ed8f-569b-4345-a09e-c5c388dc31f4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23fff868-7e7f-4961-9fbb-f2857e4cb899", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfc9bfb1-8a39-4278-a072-1fb96ed1d2bf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8bd8a640-3e6d-4d54-b971-eb3332abcd89", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c736483d-b280-4972-aa38-70d272c077a8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4dc4093-fdfc-410e-b5fa-ea5fada37159", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d625a231-d3f6-4f05-93be-5710392437fd", + "metadata": {}, + "outputs": [], + "source": [ + "web_analysis_bn_full = BayesianNetwork([\n", + " ('DNS Ctrl Failure', 'DNS VP Failure'),\n", + " ('DNS Ctrl Failure', 'DNS Failure Consistency'),\n", + " #('Resolver config', 'DNS Outcome'),\n", + " ('DNS Answer', 'DNS Answer Consistency'),\n", + " ('DNS Answer', 'DNS Answer TLS Consistency'),\n", + " ('DNS Answer TLS Consistency', 'DNS Answer Consistency'),\n", + " ('DNS Answer Consistency', 'DNS Outcome'),\n", + "\n", + " ('DNS VP Failure', 'DNS Failure Consistency'),\n", + " ('DNS Failure Consistency', 'DNS Outcome'),\n", + "\n", + " ('TCP Ctrl Failure', 'TCP VP Result'),\n", + "\n", + " ('DNS Answer Consistency', 'TCP Outcome'),\n", + " ('TCP VP Result', 'TCP Outcome'),\n", + "\n", + " ('TLS Ctrl Failure', 'TLS VP Result'),\n", + " ('TLS VP Result', 'TLS Outcome'),\n", + " ('DNS Answer Consistency', 'TLS Outcome'),\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4217f9a-1ed1-4916-9014-6d43a4e82cd2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "94f26d5a-7d07-406f-ab76-a44706e5fee7", + "metadata": {}, + "outputs": [ + { + "ename": "ImportError", + "evalue": "requires pygraphviz http://pygraphviz.github.io/", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/networkx/drawing/nx_agraph.py:134\u001b[0m, in \u001b[0;36mto_agraph\u001b[0;34m(N)\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 134\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpygraphviz\u001b[39;00m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pygraphviz'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m viz \u001b[38;5;241m=\u001b[39m \u001b[43mweb_analysis_bn_full\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_graphviz\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m viz\u001b[38;5;241m.\u001b[39mdraw(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweb_analysis_full.png\u001b[39m\u001b[38;5;124m'\u001b[39m, prog\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdot\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3\u001b[0m Image(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweb_analysis_full.png\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m~/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/base/DAG.py:1082\u001b[0m, in \u001b[0;36mDAG.to_graphviz\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1069\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mto_graphviz\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 1070\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1071\u001b[0m \u001b[38;5;124;03m Retuns a pygraphviz object for the DAG. pygraphviz is useful for\u001b[39;00m\n\u001b[1;32m 1072\u001b[0m \u001b[38;5;124;03m visualizing the network structure.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1080\u001b[0m \u001b[38;5;124;03m >>> model.draw('model.png', prog='neato')\u001b[39;00m\n\u001b[1;32m 1081\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1082\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnx_agraph\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_agraph\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/networkx/drawing/nx_agraph.py:136\u001b[0m, in \u001b[0;36mto_agraph\u001b[0;34m(N)\u001b[0m\n\u001b[1;32m 134\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpygraphviz\u001b[39;00m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 136\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrequires pygraphviz http://pygraphviz.github.io/\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 137\u001b[0m directed \u001b[38;5;241m=\u001b[39m N\u001b[38;5;241m.\u001b[39mis_directed()\n\u001b[1;32m 138\u001b[0m strict \u001b[38;5;241m=\u001b[39m nx\u001b[38;5;241m.\u001b[39mnumber_of_selfloops(N) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m N\u001b[38;5;241m.\u001b[39mis_multigraph()\n", + "\u001b[0;31mImportError\u001b[0m: requires pygraphviz http://pygraphviz.github.io/" + ] + } + ], + "source": [ + "viz = web_analysis_bn_full.to_graphviz()\n", + "viz.draw('web_analysis_full.png', prog='dot')\n", + "Image('web_analysis_full.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a6346742-dc39-40e3-8673-686b25fb7d87", + "metadata": {}, + "outputs": [], + "source": [ + "web_analysis_bn = BayesianNetwork([\n", + " ('DNS Ctrl Failure', 'DNS Outcome'),\n", + " ('DNS Ctrl Failure', 'DNS Answer Meta'),\n", + " #('Resolver config', 'DNS Outcome'),\n", + " ('DNS Consistency', 'DNS Outcome'),\n", + " ('DNS Answer Meta', 'DNS Consistency'),\n", + " ('DNS Answer Meta', 'DNS TLS Consistency'),\n", + " ('DNS TLS Consistency', 'DNS Consistency'),\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f78e3c55-3826-4622-b720-74452c7c13a2", + "metadata": {}, + "outputs": [], + "source": [ + "#web_analysis_bn.save('web_analysi.bif')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3d63e9c3-0430-4bc1-a5e3-583ae71f3405", + "metadata": {}, + "outputs": [ + { + "ename": "ImportError", + "evalue": "requires pygraphviz http://pygraphviz.github.io/", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/networkx/drawing/nx_agraph.py:134\u001b[0m, in \u001b[0;36mto_agraph\u001b[0;34m(N)\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 134\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpygraphviz\u001b[39;00m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pygraphviz'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m viz \u001b[38;5;241m=\u001b[39m \u001b[43mweb_analysis_bn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_graphviz\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m viz\u001b[38;5;241m.\u001b[39mdraw(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweb_analysis_simple.png\u001b[39m\u001b[38;5;124m'\u001b[39m, prog\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdot\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3\u001b[0m Image(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mweb_analysis_simple.png\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m~/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/pgmpy/base/DAG.py:1082\u001b[0m, in \u001b[0;36mDAG.to_graphviz\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1069\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mto_graphviz\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 1070\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1071\u001b[0m \u001b[38;5;124;03m Retuns a pygraphviz object for the DAG. pygraphviz is useful for\u001b[39;00m\n\u001b[1;32m 1072\u001b[0m \u001b[38;5;124;03m visualizing the network structure.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1080\u001b[0m \u001b[38;5;124;03m >>> model.draw('model.png', prog='neato')\u001b[39;00m\n\u001b[1;32m 1081\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1082\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mnx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnx_agraph\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_agraph\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/repos/ooni/data/oonipipeline/.venv/lib/python3.11/site-packages/networkx/drawing/nx_agraph.py:136\u001b[0m, in \u001b[0;36mto_agraph\u001b[0;34m(N)\u001b[0m\n\u001b[1;32m 134\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpygraphviz\u001b[39;00m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 136\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrequires pygraphviz http://pygraphviz.github.io/\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 137\u001b[0m directed \u001b[38;5;241m=\u001b[39m N\u001b[38;5;241m.\u001b[39mis_directed()\n\u001b[1;32m 138\u001b[0m strict \u001b[38;5;241m=\u001b[39m nx\u001b[38;5;241m.\u001b[39mnumber_of_selfloops(N) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m N\u001b[38;5;241m.\u001b[39mis_multigraph()\n", + "\u001b[0;31mImportError\u001b[0m: requires pygraphviz http://pygraphviz.github.io/" + ] + } + ], + "source": [ + "viz = web_analysis_bn.to_graphviz()\n", + "viz.draw('web_analysis_simple.png', prog='dot')\n", + "Image('web_analysis_simple.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "832d93dd-4cfa-459a-8e1e-01a66cbee2d9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13312638-208f-4798-8eae-268fb29a817c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57082d9d-01d0-43ec-91af-2a54e85ae0a2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb31f020-28d9-4f3c-9d72-1ed687623fea", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b3cad79a-bce8-4efb-b811-80f6458fb16c", + "metadata": {}, + "outputs": [], + "source": [ + "def print_boilerplate():\n", + " cpd_list = []\n", + " for x in list(web_analysis_bn.nodes):\n", + " var_name = x.lower().replace(' ', '_')\n", + " var_name = f\"cpd_{var_name}\"\n", + " s = f\"{var_name} = TabularCPD('{x}', variable_card=2, values=[\\n\"\n", + " parents = web_analysis_bn.get_parents(x)\n", + " padding = \" \"*(int(len(s)/2))\n", + " for _ in range(2):\n", + " s += padding + \"[\"\n", + " s += \",\".join(\"0.\" for x in range(len(parents)))\n", + " s += \"],\\n\"\n", + " s += padding + f\"],\\n\" \n", + " s += padding + f\" # parents={parents}\\n\"\n", + " s += padding + f\"evidence={parents},\\n\"\n", + " s += padding + f\"evidence_card=[],\\n\"\n", + " s += padding + \"state_names = {\\n\"\n", + " for p in parents:\n", + " s += padding + f\"'{p}': [],\\n\"\n", + " s += \"}\\n\"\n", + " s += padding + \")\"\n", + " print(s)\n", + " cpd_list.append(var_name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c1d1232-ed7a-4539-82bf-e43fd52b8f23", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "509c45ee-b22d-461a-998b-a701c5090580", + "metadata": {}, + "outputs": [], + "source": [ + "dns_answer_states = [\n", + "\"answer_is_bogon\", \n", + "\"answer_matches_probe_asn\", \n", + "\"answer_matches_probe_cc\",\n", + "\"answer_is_cloud_provider\",\n", + "\"answer_other\"\n", + "]\n", + "dns_failure_states = [\n", + " \"none\",\n", + " \"nxdomain\",\n", + " \"server_failure\"\n", + "]\n", + "tls_consistency_states = [\"tls_consistent\", \"tls_inconsistent\", \"unknown\"]\n", + "cpd_dns_ctrl_failure = TabularCPD(\n", + " \"DNS Ctrl Failure\",\n", + " variable_card=3,\n", + " values=[\n", + " [0.994],\n", + " [0.004],\n", + " [0.002],\n", + " ],\n", + " state_names={\n", + " \"DNS Ctrl Failure\": dns_failure_states\n", + " },\n", + ")\n", + "cpd_dns_vp_failure = TabularCPD(\n", + " \"DNS VP Failure\",\n", + " variable_card=3,\n", + " values=[\n", + " # \"none\", \"nxdomain\", \"server_failure\"\n", + " [0.994, 0.02, 0.02],\n", + " [0.004, 0.98, 0.01],\n", + " [0.002, 0.01, 0.98],\n", + " ],\n", + " evidence=[\"DNS Ctrl Failure\"],\n", + " evidence_card=[3],\n", + " state_names={\n", + " \"DNS VP Failure\": dns_failure_states,\n", + " \"DNS Ctrl Failure\": dns_failure_states\n", + " },\n", + ")\n", + "cpd_dns_failure_consistency = TabularCPD(\n", + " \"DNS Failure Consistency\",\n", + " variable_card=3,\n", + " values=[\n", + " # \"none\", \"nxdomain\", \"server_failure\"\n", + " [0.99, 0.01, 0.01, 0.94, 0.01, 0.01, 0.94, 0.01, 0.01], # ok\n", + " [0.01, 0.05, 0.05, 0.01, 0.98, 0.92, 0.01, 0.92, 0.98], # expected_not_ok\n", + " [0.01, 0.94, 0.94, 0.05, 0.01, 0.07, 0.05, 0.07, 0.01] # unexpected_not_ok\n", + " ],\n", + " evidence=[\"DNS Ctrl Failure\", \"DNS VP Failure\"],\n", + " evidence_card=[3, 3],\n", + " state_names={\n", + " \"DNS Failure Consistency\": [\n", + " \"ok\", \n", + " \"expected_not_ok\",\n", + " \"unexpected_not_ok\"\n", + " ],\n", + " \"DNS VP Failure\": dns_failure_states,\n", + " \"DNS Ctrl Failure\": dns_failure_states\n", + " },\n", + ")\n", + "\n", + "cpd_dns_answer = TabularCPD(\n", + " \"DNS Answer\",\n", + " variable_card=5,\n", + " values=[\n", + " [0.004],\n", + " [0.006],\n", + " [0.06],\n", + " [0.73],\n", + " [0.2],\n", + " ],\n", + " state_names={\n", + " \"DNS Answer\": dns_answer_states,\n", + " },\n", + ")\n", + "cpd_dns_answer_tls_consistency = TabularCPD(\n", + " \"DNS Answer TLS Consistency\",\n", + " variable_card=3,\n", + " values=[\n", + " # \"answer_is_bogon\", \"answer_matches_probe_asn\", \"answer_matches_probe_cc\", \"answer_is_cloud_provider\", \"answer_other\"\n", + " [0.01, 0.80, 0.75, 0.90, 0.94], # tls_consistent\n", + " [0.05, 0.15, 0.20, 0.08, 0.04], # tls_inconsistent\n", + " [0.94, 0.05, 0.05, 0.02, 0.02], # unknown\n", + " ],\n", + " evidence=[\"DNS Answer\"],\n", + " evidence_card=[5],\n", + " state_names={\n", + " \"DNS Answer TLS Consistency\": tls_consistency_states,\n", + " \"DNS Answer\": dns_answer_states,\n", + " },\n", + ")\n", + "cpd_dns_answer_consistency = TabularCPD(\n", + " \"DNS Answer Consistency\",\n", + " variable_card=2,\n", + " values=[\n", + " # \"answer_is_bogon\", \"answer_matches_probe_asn\", \"answer_matches_probe_cc\", \"answer_is_cloud_provider\", \"answer_other\"\n", + " # tls_consistent\", \"tls_inconsistent\", \"unknown\n", + " [0.99, 0.001, 0.001, 0.999, 0.01, 0.3, 0.999, 0.001, 0.3, 0.999, 0.01, 0.8, 0.999, 0.001, 0.2], # consistent\n", + " [0.01, 0.999, 0.999, 0.001, 0.99, 0.7, 0.001, 0.999, 0.7, 0.001, 0.99, 0.2, 0.001, 0.999, 0.8], # inconsistent\n", + " ],\n", + " # parents={parents}\n", + " evidence=[\"DNS Answer\", \"DNS Answer TLS Consistency\"],\n", + " evidence_card=[5, 3],\n", + " state_names={\n", + " \"DNS Answer\": dns_answer_states,\n", + " \"DNS Answer TLS Consistency\": tls_consistency_states,\n", + " \"DNS Answer Consistency\": [\n", + " \"consistent\",\n", + " \"inconsistent\"\n", + " ],\n", + " },\n", + ")\n", + "\n", + "cpd_dns_outcome = TabularCPD(\n", + " \"DNS Outcome\",\n", + " variable_card=3,\n", + " values=[\n", + " # Consistent, inconsistent\n", + " [0.01, 0.01, 0.40, 0.8, 0.20, 0.90], # blocked\n", + " [0.99, 0.01, 0.40, 0.2, 0.05, 0.01], # ok\n", + " [0.00, 0.98, 0.20, 0.0, 0.75, 0.09], # down\n", + " ],\n", + " evidence=[\n", + " \"DNS Answer Consistency\",\n", + " \"DNS Failure Consistency\",\n", + " ],\n", + " evidence_card=[2, 3],\n", + " state_names={\n", + " \"DNS Outcome\": [\n", + " \"blocked\",\n", + " \"ok\",\n", + " \"down\"\n", + " ],\n", + " \"DNS Answer Consistency\": [\"consistent\", \"inconsistent\"],\n", + " \"DNS Failure Consistency\": [\n", + " \"ok\", \n", + " \"expected_not_ok\",\n", + " \"unexpected_not_ok\"\n", + " ],\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "710b4561-7b8f-47fd-a742-dd88e697a1bc", + "metadata": {}, + "outputs": [], + "source": [ + "tcp_failure_states = [\n", + " \"none\",\n", + " \"connection_reset\",\n", + " \"timeout\",\n", + " \"other\"\n", + "]\n", + "\n", + "cpd_tcp_ctrl_failure = TabularCPD(\n", + " \"TCP Ctrl Failure\",\n", + " variable_card=4,\n", + " values=[\n", + " [0.980],\n", + " [0.001],\n", + " [0.014],\n", + " [0.005]\n", + " ],\n", + " state_names={\n", + " \"TCP Ctrl Failure\": tcp_failure_states\n", + " },\n", + ")\n", + "\n", + "cpd_tcp_vp_result = TabularCPD(\n", + " \"TCP VP Result\",\n", + " variable_card=5,\n", + " values=[\n", + " # \"none\", \"connection_reset\", \"timeout\", \"other\"\n", + " [0.980, 0.02, 0.01, 0.01], # none\n", + " [0.001, 0.14, 0.02, 0.06], # connection_reset\n", + " [0.010, 0.05, 0.10, 0.06], # timeout\n", + " [0.009, 0.07, 0.02, 0.12], # other\n", + " [0.009, 0.72, 0.85, 0.75], # down\n", + " ],\n", + " evidence=[\"TCP Ctrl Failure\"],\n", + " evidence_card=[4],\n", + " state_names={\n", + " \"TCP VP Result\": tcp_failure_states + [\"down\"],\n", + " \"TCP Ctrl Failure\": tcp_failure_states\n", + " },\n", + ")\n", + "\n", + "cpd_tcp_outcome = TabularCPD(\n", + " \"TCP Outcome\",\n", + " variable_card=4,\n", + " values=[\n", + " # consistent inconsistent\n", + " # \"none\", \"connection_reset\", \"timeout\", \"other\", \"down\"\n", + " [0.02, 0.95, 0.90, 0.85, 0.01, 0.07, 0.07, 0.07, 0.07, 0.05], # blocked\n", + " [0.95, 0.01, 0.01, 0.01, 0.08, 0.01, 0.01, 0.01, 0.01, 0.01], # ok\n", + " [0.02, 0.03, 0.08, 0.09, 0.01, 0.07, 0.07, 0.07, 0.07, 0.09], # down\n", + " [0.01, 0.01, 0.01, 0.05, 0.90, 0.85, 0.85, 0.85, 0.85, 0.85], # unknown\n", + " ],\n", + " evidence=[\"DNS Answer Consistency\", \"TCP VP Result\"],\n", + " evidence_card=[2, 5],\n", + " state_names={\n", + " \"DNS Answer Consistency\": [\"consistent\", \"inconsistent\"],\n", + " \"TCP VP Result\": tcp_failure_states + [\"down\"],\n", + " \"TCP Outcome\": [\"blocked\", \"ok\", \"down\", \"unknown\"]\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "61234ff3-5e13-48e3-8264-e1966fdd2dc1", + "metadata": {}, + "outputs": [], + "source": [ + "tls_ctrl_failure_states = [\n", + " \"none\",\n", + " \"bad_certificate\",\n", + " \"other\"\n", + "]\n", + "\n", + "tls_vp_result_states = [\n", + " \"none\",\n", + " \"bad_certificate\",\n", + " \"connection_reset_after_ch\",\n", + " \"timeout_after_ch\",\n", + " \"timeout\",\n", + " \"connection_reset\",\n", + " \"other\",\n", + " \"down\"\n", + "]\n", + "\n", + "cpd_tls_ctrl_failure = TabularCPD(\n", + " \"TLS Ctrl Failure\",\n", + " variable_card=3,\n", + " values=[\n", + " [0.980],\n", + " [0.005],\n", + " [0.015],\n", + " ],\n", + " state_names={\n", + " \"TLS Ctrl Failure\": tls_ctrl_failure_states\n", + " },\n", + ")\n", + "\n", + "cpd_tls_vp_result = TabularCPD(\n", + " \"TLS VP Result\",\n", + " variable_card=8,\n", + " values=[\n", + " # \"none\", \"bad_certificate\", \"other\"\n", + " [0.97, 0.02, 0.01], # none\n", + " [0.005, 0.10, 0.01], # bad_certificate\n", + " [0.005, 0.01, 0.05], # connection_reset_after_ch\n", + " [0.005, 0.01, 0.05], # timeout_after_ch\n", + " [0.005, 0.01, 0.05], # timeout\n", + " [0.005, 0.01, 0.05], # connection_reset\n", + " [0.004, 0.02, 0.12], # other\n", + " [0.001, 0.82, 0.66], # down\n", + " ],\n", + " evidence=[\"TLS Ctrl Failure\"],\n", + " evidence_card=[3],\n", + " state_names={\n", + " \"TLS VP Result\": tls_vp_result_states,\n", + " \"TLS Ctrl Failure\": tls_ctrl_failure_states\n", + " },\n", + ")\n", + "\n", + "cpd_tls_outcome = TabularCPD(\n", + " \"TLS Outcome\",\n", + " variable_card=4,\n", + " values=[\n", + " # consistent inconsistent\n", + " # \"none\", \"bad_certificate\", \"connection_reset_after_ch\", \"timeout_after_ch\", \"timeout\" \"connection_reset\" \"other\" \"down\"\n", + " [0.02, 0.95, 0.90, 0.85, 0.55, 0.65, 0.07, 0.07, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02], # blocked\n", + " [0.95, 0.01, 0.01, 0.01, 0.02, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01], # ok\n", + " [0.02, 0.03, 0.07, 0.09, 0.40, 0.25, 0.07, 0.07, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05], # down\n", + " [0.01, 0.01, 0.02, 0.05, 0.03, 0.09, 0.85, 0.85, 0.92, 0.92, 0.92, 0.92, 0.92, 0.92, 0.92, 0.92], # unknown\n", + " ],\n", + " evidence=[\"DNS Answer Consistency\", \"TLS VP Result\"],\n", + " evidence_card=[2, 8],\n", + " state_names={\n", + " \"DNS Answer Consistency\": [\"consistent\", \"inconsistent\"],\n", + " \"TLS VP Result\": tls_vp_result_states,\n", + " \"TLS Outcome\": [\"blocked\", \"ok\", \"down\", \"unknown\"]\n", + " },\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4a7dff9b-4851-435e-941d-de3e736bc577", + "metadata": {}, + "outputs": [], + "source": [ + "cpd_list = [\n", + " cpd_dns_ctrl_failure, \n", + " cpd_dns_vp_failure, \n", + " cpd_dns_failure_consistency, \n", + " cpd_dns_answer, \n", + " cpd_dns_answer_tls_consistency,\n", + " cpd_dns_answer_consistency, \n", + " cpd_dns_outcome,\n", + " cpd_tcp_ctrl_failure,\n", + " cpd_tcp_vp_result,\n", + " cpd_tcp_outcome,\n", + " cpd_tls_ctrl_failure,\n", + " cpd_tls_vp_result,\n", + " cpd_tls_outcome\n", + "]\n", + "web_analysis_bn_full.add_cpds(*cpd_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "a2299f85-a607-4198-a0eb-5af82f7317e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "web_analysis_bn_full.check_model()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "73120bce-721a-4965-8a76-a4f37f7be905", + "metadata": {}, + "outputs": [], + "source": [ + "web_analysis_bn_full.save('web-analysis-full.bif')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85d58bf9-eb93-48fb-96ba-927657cfd1ef", + "metadata": {}, + "outputs": [], + "source": [ + "from oonipipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6eebd10f-58da-41a8-b2ef-520a1733607c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 122, + "id": "21c4346f-4c39-47fc-9378-306b1bb05d58", + "metadata": {}, + "outputs": [], + "source": [ + "from pgmpy.inference import VariableElimination" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "89546053-4dbb-47af-a81d-1ad5bf41f95c", + "metadata": {}, + "outputs": [], + "source": [ + "infer = VariableElimination(web_analysis_bn_full)" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "cb364bad-0321-4cba-9df6-c6a1cdb9ec05", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------+--------------------+\n", + "| DNS Outcome | phi(DNS Outcome) |\n", + "+======================+====================+\n", + "| DNS Outcome(blocked) | 0.0874 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(ok) | 0.8945 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(down) | 0.0181 |\n", + "+----------------------+--------------------+\n" + ] + } + ], + "source": [ + "print(infer.query(['DNS Outcome']))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5b30d21-a4c8-4170-ba42-c1727f5131cd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "870bd68f-7969-42c8-9c41-4f8710975497", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------+--------------------+\n", + "| DNS Outcome | phi(DNS Outcome) |\n", + "+======================+====================+\n", + "| DNS Outcome(blocked) | 0.7836 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(ok) | 0.2031 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(down) | 0.0133 |\n", + "+----------------------+--------------------+\n" + ] + } + ], + "source": [ + "print(infer.query(\n", + " ['DNS Outcome'], \n", + " evidence={\n", + " #'DNS TLS Consistency': 'tls_inconsistent',\n", + " \"DNS Answer\": \"answer_is_bogon\", \n", + " }\n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "8bd01e2f-1baf-4f63-a851-e318f8cb687b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------+--------------------+\n", + "| DNS Outcome | phi(DNS Outcome) |\n", + "+======================+====================+\n", + "| DNS Outcome(blocked) | 0.0168 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(ok) | 0.9646 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(down) | 0.0186 |\n", + "+----------------------+--------------------+\n" + ] + } + ], + "source": [ + "print(infer.query(\n", + " ['DNS Outcome'], \n", + " evidence={\n", + " 'DNS Answer TLS Consistency': 'tls_consistent',\n", + " \"DNS Answer\": \"answer_matches_probe_cc\", \n", + " }\n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "02b703c0-429b-4a6f-ae21-2134bbb9a3e4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------+--------------------+\n", + "| DNS Outcome | phi(DNS Outcome) |\n", + "+======================+====================+\n", + "| DNS Outcome(blocked) | 0.7913 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(ok) | 0.1955 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(down) | 0.0133 |\n", + "+----------------------+--------------------+\n" + ] + } + ], + "source": [ + "print(infer.query(\n", + " ['DNS Outcome'], \n", + " evidence={\n", + " 'DNS Answer TLS Consistency': 'tls_inconsistent',\n", + " \"DNS Answer\": \"answer_matches_probe_cc\", \n", + " }\n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "ce7f6e84-e728-475c-b075-73404497bd61", + "metadata": {}, + "outputs": [], + "source": [ + "CLOUD_PROVIDERS_ASNS = [\n", + " 13335, # Cloudflare: https://www.peeringdb.com/net/4224\n", + " 209242, #\tCloudflare London, LLC\t\n", + " 20940, # Akamai: https://www.peeringdb.com/net/2\n", + " 9002, # Akamai RETN\n", + " 16625, # Akamai Technologies, Inc.\t\n", + " 63949, # Akamai Technologies, Inc.\t\n", + " 16509, #\tAmazon.com, Inc.\n", + " 14618, #\tAmazon.com, Inc.\t\n", + " 15169, #\tGoogle LLC\n", + " 396982, # Google Cloud: https://www.peeringdb.com/net/30878\n", + " 54113, #\tFastly, Inc\n", + " 8075, # Microsoft Corporation\n", + " 8068, #\tMicrosoft Corporation\n", + "]\n", + "def is_cloud_provider(as_number):\n", + " return as_number in CLOUD_PROVIDERS_ASNS\n", + " \n", + "def find_relevant_control(wo, web_ctrl_observations):\n", + " for ctrl in web_ctrl_observations:\n", + " if wo.ip == ctrl.ip:\n", + " return ctrl\n", + "\n", + "def observations_to_features(web_obs, web_ctrl_observations):\n", + " for wo in web_observations:\n", + " ctrl = find_relevant_control(wo, web_control_observations)\n", + " yield produce_state(wo, ctrl)\n", + "\n", + "def produce_state(wo, ctrl):\n", + " state = {\n", + " 'DNS Ctrl Failure': None,\n", + " 'DNS VP Failure': None,\n", + " 'DNS Answer': None,\n", + " 'DNS Answer TLS Consistency': None,\n", + " 'TCP Ctrl Failure': None,\n", + " 'TCP VP Result': None,\n", + " 'TLS Ctrl Failure': None,\n", + " 'TLS VP Result': None\n", + " }\n", + " if wo.dns_failure is not None:\n", + " if wo.dns_failure in ('dns_nxdomain_error', 'android_dns_cache_no_data'):\n", + " state['DNS VP Failure'] = 'nxdomain'\n", + " else:\n", + " state['DNS VP Failure'] = 'server_failure'\n", + " elif wo.dns_answer is not None:\n", + " state['DNS VP Failure'] = 'none'\n", + "\n", + " if ctrl:\n", + " if ctrl.dns_failure is not None:\n", + " if wo.dns_failure == 'dns_nxdomain_error':\n", + " state['DNS Ctrl Failure'] = 'nxdomain'\n", + " else:\n", + " state['DNS Ctrl Failure'] = 'server_failure'\n", + " elif ctrl.dns_success:\n", + " state['DNS Ctrl Failure'] = 'none'\n", + "\n", + " if wo.dns_answer is not None:\n", + " if wo.ip_is_bogon:\n", + " state['DNS Answer'] = 'answer_is_bogon'\n", + " elif wo.ip_asn == wo.probe_meta.probe_asn:\n", + " state['DNS Answer'] = 'answer_matches_probe_asn'\n", + " elif wo.ip_as_cc == wo.probe_meta.probe_cc:\n", + " state['DNS Answer'] = 'answer_matches_probe_cc'\n", + " elif is_cloud_provider(wo.ip_asn):\n", + " state['DNS Answer'] = 'answer_is_cloud_provider'\n", + " else:\n", + " state['DNS Answer'] = 'answer_other'\n", + "\n", + " if ctrl:\n", + " tcp_ctrl_state = None\n", + " if ctrl.ip and (ctrl.tcp_failure is not None or ctrl.tcp_success):\n", + " if ctrl.tcp_failure is None:\n", + " tcp_ctrl_state = 'none'\n", + " elif ctrl.tcp_failure == 'connection_reset':\n", + " tcp_ctrl_state = 'connection_reset'\n", + " elif ctrl.tcp_failure in ('generic_timeout_error', 'timed_out'):\n", + " tcp_ctrl_state = 'timeout'\n", + " else:\n", + " tcp_ctrl_state = 'other'\n", + "\n", + " tls_consistency_state = None\n", + " if wo.ip == ctrl.ip and (ctrl.tls_success or ctrl.tls_failure is not None):\n", + " if ctrl.tls_failure is None:\n", + " tls_consistency_state = 'tls_consistent'\n", + " elif ctrl.tls_failure.startswith(\"ssl_\"):\n", + " tls_consistency_state = 'tls_inconsistent'\n", + " else:\n", + " tls_consistency_state = 'unknown'\n", + " else:\n", + " tls_consistency_state = 'unknown'\n", + "\n", + " if (tcp_ctrl_state and tcp_ctrl_state != 'none'):\n", + " tls_consistency_state = 'tls_inconsistent'\n", + " state['DNS Answer TLS Consistency'] = tls_consistency_state\n", + " state['TCP Ctrl Failure'] = tcp_ctrl_state\n", + " \n", + " if wo.ip and (wo.tcp_failure is not None or wo.tcp_success):\n", + " tcp_vp_result = None\n", + " if wo.tcp_failure is None:\n", + " tcp_vp_result = 'none'\n", + " elif wo.tcp_failure == 'connection_reset':\n", + " tcp_vp_result = 'connection_reset'\n", + " elif wo.tcp_failure in ('generic_timeout_error', 'timed_out'):\n", + " tcp_vp_result = 'timeout'\n", + " else:\n", + " tcp_vp_result = 'other'\n", + " if tcp_vp_result != 'none' and tcp_vp_result == state['TCP Ctrl Failure']:\n", + " tcp_vp_result = 'down'\n", + " state['TCP VP Result'] = tcp_vp_result\n", + "\n", + " if ctrl:\n", + " if ctrl.ip and (ctrl.tls_failure is not None or ctrl.tls_success):\n", + " if ctrl.tls_failure is None:\n", + " state['TLS Ctrl Failure'] = 'none'\n", + " elif ctrl.tls_failure.startswith('ssl_'):\n", + " state['TLS Ctrl Failure'] = 'bad_certificate'\n", + " else:\n", + " state['TLS Ctrl Failure'] = 'other'\n", + " \n", + " if wo.ip and (wo.tls_failure is not None or wo.tls_failure):\n", + " tls_vp_result = None\n", + " if wo.tls_failure is None:\n", + " tls_vp_result = 'none'\n", + " elif wo.tls_failure.startswith('ssl_'):\n", + " tls_vp_result = 'bad_certificate'\n", + " elif wo.tls_failure == 'connection_reset':\n", + " tls_vp_result = 'connection_reset'\n", + " if wo.tls_handshake_last_operation and wo.tls_handshake_last_operation == 'write_1':\n", + " tls_vp_result = 'connection_reset_after_ch'\n", + " elif wo.tcp_failure in ('generic_timeout_error', 'timed_out'):\n", + " tls_vp_result = 'timeout'\n", + " if wo.tls_handshake_last_operation and wo.tls_handshake_last_operation == 'write_1':\n", + " tls_vp_result = 'timeout_after_ch'\n", + " else:\n", + " tls_vp_result = 'other'\n", + " if tls_vp_result != 'none' and state['TLS Ctrl Failure'] != 'none':\n", + " tls_vp_result = 'down'\n", + " state['TLS VP Result'] = tls_vp_result\n", + " return state" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "0a4480e9-3c4c-43b7-bb8a-6fb34df5348c", + "metadata": {}, + "outputs": [], + "source": [ + "netinfodb = NetinfoDB(datadir=Path(\"datadir\"), download=False)\n", + "# 20231129041111.939896_NP_webconnectivity_32105af63774eabf\n", + "#raw_msmt = get_measurement_dict_by_uid(\"20240804233508.181041_TR_webconnectivity_9a7272e520f3d836\")\n", + "raw_msmt = get_measurement_dict_by_uid(\"20231129041111.939896_NP_webconnectivity_32105af63774eabf\")\n", + "msmt = load_measurement(msmt=raw_msmt)\n", + "web_observations, web_control_observations = measurement_to_observations(\n", + " msmt, netinfodb=netinfodb\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "6ce969b6-548e-4602-963e-9baeff98c8d9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'DNS Ctrl Failure': None, 'DNS VP Failure': 'none', 'DNS Answer': 'answer_is_cloud_provider', 'DNS Answer TLS Consistency': 'tls_inconsistent', 'TCP Ctrl Failure': 'other', 'TCP VP Result': 'down', 'TLS Ctrl Failure': None, 'TLS VP Result': None}\n", + "+----------------------+--------------------+\n", + "| TLS Outcome | phi(TLS Outcome) |\n", + "+======================+====================+\n", + "| TLS Outcome(blocked) | 0.0202 |\n", + "+----------------------+--------------------+\n", + "| TLS Outcome(ok) | 0.0189 |\n", + "+----------------------+--------------------+\n", + "| TLS Outcome(down) | 0.0498 |\n", + "+----------------------+--------------------+\n", + "| TLS Outcome(unknown) | 0.9111 |\n", + "+----------------------+--------------------+\n", + "+----------------------+--------------------+\n", + "| DNS Outcome | phi(DNS Outcome) |\n", + "+======================+====================+\n", + "| DNS Outcome(blocked) | 0.7872 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(ok) | 0.2044 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(down) | 0.0084 |\n", + "+----------------------+--------------------+\n", + "{'DNS Ctrl Failure': None, 'DNS VP Failure': None, 'DNS Answer': None, 'DNS Answer TLS Consistency': None, 'TCP Ctrl Failure': None, 'TCP VP Result': None, 'TLS Ctrl Failure': None, 'TLS VP Result': None}\n", + "+----------------------+--------------------+\n", + "| TLS Outcome | phi(TLS Outcome) |\n", + "+======================+====================+\n", + "| TLS Outcome(blocked) | 0.0405 |\n", + "+----------------------+--------------------+\n", + "| TLS Outcome(ok) | 0.8216 |\n", + "+----------------------+--------------------+\n", + "| TLS Outcome(down) | 0.0275 |\n", + "+----------------------+--------------------+\n", + "| TLS Outcome(unknown) | 0.1103 |\n", + "+----------------------+--------------------+\n", + "+----------------------+--------------------+\n", + "| DNS Outcome | phi(DNS Outcome) |\n", + "+======================+====================+\n", + "| DNS Outcome(blocked) | 0.0874 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(ok) | 0.8945 |\n", + "+----------------------+--------------------+\n", + "| DNS Outcome(down) | 0.0181 |\n", + "+----------------------+--------------------+\n" + ] + } + ], + "source": [ + "for features in observations_to_features(web_observations, web_control_observations):\n", + " evidence = {k: v for k,v in features.items() if v is not None}\n", + " print(features)\n", + " print(infer.query(\n", + " ['TLS Outcome'],\n", + " evidence=evidence\n", + " ))\n", + " print(infer.query(\n", + " ['DNS Outcome'],\n", + " evidence=evidence\n", + " ))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "886eb036-3fa0-4084-9a7c-6c048f0634ee", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/oonipipeline/notebooks/web-analysis-full.bif b/oonipipeline/notebooks/web-analysis-full.bif new file mode 100644 index 00000000..8255ee41 --- /dev/null +++ b/oonipipeline/notebooks/web-analysis-full.bif @@ -0,0 +1,151 @@ +network unknown { +} +variable DNS Answer { + type discrete [ 5 ] { answer_is_bogon, answer_matches_probe_asn, answer_matches_probe_cc, answer_is_cloud_provider, answer_other }; +} +variable DNS Answer Consistency { + type discrete [ 2 ] { consistent, inconsistent }; +} +variable DNS Answer TLS Consistency { + type discrete [ 3 ] { tls_consistent, tls_inconsistent, unknown }; +} +variable DNS Ctrl Failure { + type discrete [ 3 ] { none, nxdomain, server_failure }; +} +variable DNS Failure Consistency { + type discrete [ 3 ] { ok, expected_not_ok, unexpected_not_ok }; +} +variable DNS Outcome { + type discrete [ 3 ] { blocked, ok, down }; +} +variable DNS VP Failure { + type discrete [ 3 ] { none, nxdomain, server_failure }; +} +variable TCP Ctrl Failure { + type discrete [ 4 ] { none, connection_reset, timeout, other }; +} +variable TCP Outcome { + type discrete [ 4 ] { blocked, ok, down, unknown }; +} +variable TCP VP Result { + type discrete [ 5 ] { none, connection_reset, timeout, other, down }; +} +variable TLS Ctrl Failure { + type discrete [ 3 ] { none, bad_certificate, other }; +} +variable TLS Outcome { + type discrete [ 4 ] { blocked, ok, down, unknown }; +} +variable TLS VP Result { + type discrete [ 8 ] { none, bad_certificate, connection_reset_after_ch, timeout_after_ch, timeout, connection_reset, other, down }; +} +probability ( DNS Answer ) { + table 0.004, 0.006, 0.06, 0.73, 0.2 ; +} +probability ( DNS Answer Consistency | DNS Answer, DNS Answer TLS Consistency ) { + ( answer_is_bogon, tls_consistent ) 0.99, 0.01; + ( answer_is_bogon, tls_inconsistent ) 0.001, 0.999; + ( answer_is_bogon, unknown ) 0.001, 0.999; + ( answer_matches_probe_asn, tls_consistent ) 0.999, 0.001; + ( answer_matches_probe_asn, tls_inconsistent ) 0.01, 0.99; + ( answer_matches_probe_asn, unknown ) 0.3, 0.7; + ( answer_matches_probe_cc, tls_consistent ) 0.999, 0.001; + ( answer_matches_probe_cc, tls_inconsistent ) 0.001, 0.999; + ( answer_matches_probe_cc, unknown ) 0.3, 0.7; + ( answer_is_cloud_provider, tls_consistent ) 0.999, 0.001; + ( answer_is_cloud_provider, tls_inconsistent ) 0.01, 0.99; + ( answer_is_cloud_provider, unknown ) 0.8, 0.2; + ( answer_other, tls_consistent ) 0.999, 0.001; + ( answer_other, tls_inconsistent ) 0.001, 0.999; + ( answer_other, unknown ) 0.2, 0.8; + +} +probability ( DNS Answer TLS Consistency | DNS Answer ) { + ( answer_is_bogon ) 0.01, 0.05, 0.94; + ( answer_matches_probe_asn ) 0.8, 0.15, 0.05; + ( answer_matches_probe_cc ) 0.75, 0.2, 0.05; + ( answer_is_cloud_provider ) 0.9, 0.08, 0.02; + ( answer_other ) 0.94, 0.04, 0.02; + +} +probability ( DNS Ctrl Failure ) { + table 0.994, 0.004, 0.002 ; +} +probability ( DNS Failure Consistency | DNS Ctrl Failure, DNS VP Failure ) { + ( none, none ) 0.99, 0.01, 0.01; + ( none, nxdomain ) 0.01, 0.05, 0.94; + ( none, server_failure ) 0.01, 0.05, 0.94; + ( nxdomain, none ) 0.94, 0.01, 0.05; + ( nxdomain, nxdomain ) 0.01, 0.98, 0.01; + ( nxdomain, server_failure ) 0.01, 0.92, 0.07; + ( server_failure, none ) 0.94, 0.01, 0.05; + ( server_failure, nxdomain ) 0.01, 0.92, 0.07; + ( server_failure, server_failure ) 0.01, 0.98, 0.01; + +} +probability ( DNS Outcome | DNS Answer Consistency, DNS Failure Consistency ) { + ( consistent, ok ) 0.01, 0.99, 0.0; + ( consistent, expected_not_ok ) 0.01, 0.01, 0.98; + ( consistent, unexpected_not_ok ) 0.4, 0.4, 0.2; + ( inconsistent, ok ) 0.8, 0.2, 0.0; + ( inconsistent, expected_not_ok ) 0.2, 0.05, 0.75; + ( inconsistent, unexpected_not_ok ) 0.9, 0.01, 0.09; + +} +probability ( DNS VP Failure | DNS Ctrl Failure ) { + ( none ) 0.994, 0.004, 0.002; + ( nxdomain ) 0.02, 0.98, 0.01; + ( server_failure ) 0.02, 0.01, 0.98; + +} +probability ( TCP Ctrl Failure ) { + table 0.98, 0.001, 0.014, 0.005 ; +} +probability ( TCP Outcome | DNS Answer Consistency, TCP VP Result ) { + ( consistent, none ) 0.02, 0.95, 0.02, 0.01; + ( consistent, connection_reset ) 0.95, 0.01, 0.03, 0.01; + ( consistent, timeout ) 0.9, 0.01, 0.08, 0.01; + ( consistent, other ) 0.85, 0.01, 0.09, 0.05; + ( consistent, down ) 0.01, 0.08, 0.01, 0.9; + ( inconsistent, none ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, connection_reset ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, timeout ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, other ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, down ) 0.05, 0.01, 0.09, 0.85; + +} +probability ( TCP VP Result | TCP Ctrl Failure ) { + ( none ) 0.98, 0.001, 0.01, 0.009, 0.009; + ( connection_reset ) 0.02, 0.14, 0.05, 0.07, 0.72; + ( timeout ) 0.01, 0.02, 0.1, 0.02, 0.85; + ( other ) 0.01, 0.06, 0.06, 0.12, 0.75; + +} +probability ( TLS Ctrl Failure ) { + table 0.98, 0.005, 0.015 ; +} +probability ( TLS Outcome | DNS Answer Consistency, TLS VP Result ) { + ( consistent, none ) 0.02, 0.95, 0.02, 0.01; + ( consistent, bad_certificate ) 0.95, 0.01, 0.03, 0.01; + ( consistent, connection_reset_after_ch ) 0.9, 0.01, 0.07, 0.02; + ( consistent, timeout_after_ch ) 0.85, 0.01, 0.09, 0.05; + ( consistent, timeout ) 0.55, 0.02, 0.4, 0.03; + ( consistent, connection_reset ) 0.65, 0.01, 0.25, 0.09; + ( consistent, other ) 0.07, 0.01, 0.07, 0.85; + ( consistent, down ) 0.07, 0.01, 0.07, 0.85; + ( inconsistent, none ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, bad_certificate ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, connection_reset_after_ch ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, timeout_after_ch ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, timeout ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, connection_reset ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, other ) 0.02, 0.01, 0.05, 0.92; + ( inconsistent, down ) 0.02, 0.01, 0.05, 0.92; + +} +probability ( TLS VP Result | TLS Ctrl Failure ) { + ( none ) 0.97, 0.005, 0.005, 0.005, 0.005, 0.005, 0.004, 0.001; + ( bad_certificate ) 0.02, 0.1, 0.01, 0.01, 0.01, 0.01, 0.02, 0.82; + ( other ) 0.01, 0.01, 0.05, 0.05, 0.05, 0.05, 0.12, 0.66; + +} diff --git a/oonipipeline/pyproject.toml b/oonipipeline/pyproject.toml index c5aa3381..de3182a7 100644 --- a/oonipipeline/pyproject.toml +++ b/oonipipeline/pyproject.toml @@ -26,17 +26,17 @@ dependencies = [ "tabulate ~= 0.9.0", "warcio ~= 1.7.4", "msgpack ~= 1.0.4", - "statsd ~= 4.0.1", "click-loglevel ~= 0.5.0", - "dask ~= 2023.3.2", "altair ~= 4.2.0", "numpy ~= 1.23.5", "pandas ~= 2.0.0", - "flask ~= 2.2.0", "jupyterlab ~= 4.0.7", "temporalio ~= 1.7.0", "temporalio[opentelemetry] ~= 1.7.0", "opentelemetry-exporter-otlp-proto-grpc ~= 1.18.0", + "bokeh ~= 3.5.2", + "uvicorn ~= 0.25.0", + "pydantic-settings ~= 2.1.0", ] [tool.hatch.build.targets.sdist] @@ -59,6 +59,8 @@ dependencies = [ "pytest-docker", "pytest-asyncio", "ipdb", + "pgmpy", + "pygraphviz" ] python = "3.11" path = ".venv/" @@ -68,6 +70,7 @@ path = "src/oonipipeline/__about__.py" [tool.hatch.envs.default.scripts] oonipipeline = "python -m oonipipeline.main {args}" +dataviz = "uvicorn oonipipeline.dataviz.main:app {args}" test = "pytest {args:tests}" # --full-trace --log-level=INFO --log-cli-level=INFO -v --setup-show -s test-cov = "pytest --cov=./ --cov-report=xml --cov-report=html --cov-report=term {args:tests}" diff --git a/oonipipeline/src/oonipipeline/dataviz/dependencies.py b/oonipipeline/src/oonipipeline/dataviz/dependencies.py new file mode 100644 index 00000000..7a3674bc --- /dev/null +++ b/oonipipeline/src/oonipipeline/dataviz/dependencies.py @@ -0,0 +1,25 @@ +from functools import lru_cache +from typing import Annotated + +from fastapi import Depends +from clickhouse_driver import Client as Clickhouse + +from pydantic_settings import BaseSettings + + +class Settings(BaseSettings): + clickhouse_url: str = "clickhouse://localhost" + data_dir: str = "tests/data/datadir" + + +@lru_cache +def get_settings() -> Settings: + return Settings() + + +def get_clickhouse_session(settings: Annotated[Settings, Depends(get_settings)]): + db = Clickhouse.from_url(settings.clickhouse_url) + try: + yield db + finally: + db.disconnect() diff --git a/oonipipeline/src/oonipipeline/dataviz/main.py b/oonipipeline/src/oonipipeline/dataviz/main.py new file mode 100644 index 00000000..6ed6309b --- /dev/null +++ b/oonipipeline/src/oonipipeline/dataviz/main.py @@ -0,0 +1,175 @@ +from dataclasses import asdict +import json +import os +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +from fastapi import Depends, FastAPI, Request +from fastapi.templating import Jinja2Templates + +from oonidata.dataclient import load_measurement +from oonidata.apiclient import get_measurement_dict_by_uid +from oonipipeline.dataviz.dependencies import get_settings + +from ..analysis.control import ( + BodyDB, + WebGroundTruthDB, + iter_ground_truths_from_web_control, +) +from ..analysis.web_analysis import make_web_analysis +from ..analysis.website_experiment_results import make_website_experiment_results + +from ..fingerprintdb import FingerprintDB +from ..netinfo import NetinfoDB + +from ..transforms.observations import measurement_to_observations + +app = FastAPI() + +current_dir = os.path.dirname(os.path.abspath(__file__)) +templates = Jinja2Templates(directory=f"{current_dir}/templates") + + +def extract_meta(orig_obs_list) -> Tuple[List, Dict, Dict, Dict]: + obs_list = [] + + measurement_meta = {} + probe_meta = {} + processing_meta = {} + for obs in orig_obs_list: + wo_dict = asdict(obs) + measurement_meta = wo_dict.pop("probe_meta", None) + probe_meta = wo_dict.pop("measurement_meta", None) + processing_meta = wo_dict.pop("processing_meta", None) + obs_list.append(wo_dict) + return obs_list, measurement_meta, probe_meta, processing_meta + + +@app.get("/analysis/") +def analysis_index( + request: Request, +): + return templates.TemplateResponse( + request=request, name="redirect.html", context={"scope": "analysis"} + ) + + +@app.get("/observations/") +def observations( + request: Request, +): + return templates.TemplateResponse( + request=request, name="redirect.html", context={"scope": "observations"} + ) + + +@app.get("/analysis/m/{measurement_uid}") +def analysis_by_msmt( + request: Request, + measurement_uid: Optional[str], + settings=Depends(get_settings), +): + + data_dir = Path(settings.data_dir) + + fingerprintdb = FingerprintDB(datadir=data_dir, download=False) + netinfodb = NetinfoDB(datadir=data_dir, download=False) + raw_msmt = get_measurement_dict_by_uid(measurement_uid) + msmt = load_measurement(msmt=raw_msmt) + web_observations, web_control_observations = measurement_to_observations( + msmt, netinfodb=netinfodb + ) + web_ground_truth_db = WebGroundTruthDB() + web_ground_truth_db.build_from_rows( + rows=iter_ground_truths_from_web_control( + web_control_observations=web_control_observations, + netinfodb=netinfodb, + ), + ) + + web_ground_truths = web_ground_truth_db.lookup_by_web_obs(web_obs=web_observations) + web_analysis = list( + make_web_analysis( + web_observations=web_observations, + web_ground_truths=web_ground_truths, + body_db=BodyDB(db=None), # type: ignore + fingerprintdb=fingerprintdb, + ) + ) + + # assert len(web_analysis) == len( + # web_observations + # ), f"web_analysis != web_obs {len(web_analysis)} != {len(web_observations)}" + # for wa in web_analysis: + # print_nice_vertical(wa) + + website_er = list(make_website_experiment_results(web_analysis)) + assert len(website_er) == 1 + + wer = website_er[0] + analysis_transcript_list = wer.analysis_transcript_list + + # wer.analysis_transcript_list = None + # print_nice_vertical(wer) + # for loni in loni_list: + # pprint(loni.to_dict()) + # print(analysis_transcript_list) + + web_analysis_list, _, _, _ = extract_meta(web_analysis) + web_observations_list, measurement_meta, probe_meta, processing_meta = extract_meta( + web_observations + ) + return templates.TemplateResponse( + request=request, + name="analysis.html", + context=dict( + website_experiment_result=asdict(wer), + analysis_transcript_list=analysis_transcript_list, + loni_list=wer.loni_list, + raw_msmt=raw_msmt, + measurement_uid=measurement_uid, + web_analysis=web_analysis_list, + web_observations=web_observations_list, + measurement_meta=measurement_meta, + probe_meta=probe_meta, + processing_meta=processing_meta, + loni_blocked_dict=dict(zip(wer.loni_blocked_keys, wer.loni_blocked_values)), + loni_blocked_value=sum(wer.loni_blocked_values), + loni_down_dict=dict(zip(wer.loni_down_keys, wer.loni_down_values)), + loni_down_value=sum(wer.loni_down_values), + loni_ok_value=wer.loni_ok_value, + ), + ) + + +@app.get("/observations/m/{measurement_uid}") +def observations_by_msmt( + request: Request, + measurement_uid: str, + settings=Depends(get_settings), +): + data_dir = Path(settings.data_dir) + + netinfodb = NetinfoDB(datadir=data_dir, download=False) + raw_msmt = get_measurement_dict_by_uid(measurement_uid) + msmt = load_measurement(msmt=raw_msmt) + web_observations, web_control_observations = measurement_to_observations( + msmt, netinfodb=netinfodb + ) + + web_observations_list, probe_meta, measurement_meta, processing_meta = extract_meta( + web_observations + ) + web_control_observations, _, _, _ = extract_meta(web_control_observations) + return templates.TemplateResponse( + request=request, + name="observations.html", + context=dict( + measurement_uid=measurement_uid, + web_observations=web_observations_list, + web_control_observations=web_control_observations, + probe_meta=probe_meta, + measurement_meta=measurement_meta, + processing_meta=processing_meta, + ), + ) diff --git a/oonipipeline/src/oonipipeline/dataviz/react/.gitignore b/oonipipeline/src/oonipipeline/dataviz/react/.gitignore deleted file mode 100644 index 59dc1f7c..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -.parcel-cache/ diff --git a/oonipipeline/src/oonipipeline/dataviz/react/Readme.md b/oonipipeline/src/oonipipeline/dataviz/react/Readme.md deleted file mode 100644 index 20d56760..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/Readme.md +++ /dev/null @@ -1,10 +0,0 @@ -To build the react component do -``` -yarn install -yarn run build -``` - -During development do -``` -yarn run watch -``` diff --git a/oonipipeline/src/oonipipeline/dataviz/react/package.json b/oonipipeline/src/oonipipeline/dataviz/react/package.json deleted file mode 100644 index 3d6dc320..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "oonidataviz", - "version": "1.0.0", - "license": "MIT", - "scripts": { - "build": "parcel build src/index.tsx", - "watch": "parcel watch src/index.tsx" - }, - "targets": { - "default": { - "isLibrary": false, - "scopeHoist": false, - "outputFormat": "global", - "context": "browser", - "distDir": "../static/dist/" - } - }, - "devDependencies": { - "@babel/core": "^7.16.5", - "@babel/preset-react": "^7.17.12", - "@parcel/reporter-bundle-analyzer": "^2.6.0", - "@parcel/transformer-svg-react": "^2.5.0", - "buffer": "^6.0.3", - "gh-pages": "^3.2.3", - "parcel": "2.6.0", - "prettier": "^2.6.2", - "process": "^0.11.10", - "typescript": "^4.2.4" - }, - "dependencies": { - "@fontsource/fira-sans": "^4.5.10", - "@rebass/forms": "^4.0.6", - "ooni-components": "^0.5.0-alpha.5", - "prop-types": "^15.8.1", - "rc-progress": "^3.2.1", - "rc-util": "^5.16.1", - "react": "^16.0.0 || ^17.0.0", - "react-dom": "^17.0.2", - "react-hook-form": "^7.31.1", - "react-icon-base": "^2.1.2", - "react-icons": "^4.4.0", - "react-intl": "^5.24.0", - "react-json-view": "^1.21.3", - "react-lottie-player": "^1.4.1", - "react-router-dom": "6", - "react-spinners": "^0.13.7", - "react-table": "^7.8.0", - "react-vega": "^7.6.0", - "rehype-react": "^7.0.3", - "remark-parse": "^10.0.1", - "remark-rehype": "^10.1.0", - "styled-components": "^5.3.3", - "unified": "^10.1.1", - "vega": "^5.22.1", - "vega-lite": "^5.6.0" - }, - "resolutions": { - "ansi-regex": "^5.0.1", - "postcss": "^7.0.36", - "json-schema": "^0.4.0", - "minimist": "^1.2.3", - "path-parse": "^1.0.7", - "ws": "^7.4.6" - } -} diff --git a/oonipipeline/src/oonipipeline/dataviz/react/src/App.tsx b/oonipipeline/src/oonipipeline/dataviz/react/src/App.tsx deleted file mode 100644 index 1e52424b..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/src/App.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import * as React from "react"; - -import { createGlobalStyle, ThemeProvider } from "styled-components"; - -import { Container, theme } from "ooni-components"; - -import { Routes, Route, Outlet, Link } from "react-router-dom"; - -import DataViz from './components/Dataviz' -import DNSAnalysis from "./components/DNSAnalysis"; - -const GlobalStyle = createGlobalStyle` - * { - text-rendering: geometricPrecision; - box-sizing: border-box; - } - body, html { - margin: 0; - padding: 0; - font-family: "Fira Sans"; - font-size: 14px; - height: 100%; - background-color: #ffffff; - } -`; - -const Layout = () => ( - - - - - - - -) - -const Home = () => ( -
Hello home
-) - -const App = () => { - return ( - - }> - } /> - } /> - } /> - } /> - - - ); -}; - -export default App; diff --git a/oonipipeline/src/oonipipeline/dataviz/react/src/components/DNSAnalysis.tsx b/oonipipeline/src/oonipipeline/dataviz/react/src/components/DNSAnalysis.tsx deleted file mode 100644 index 20b8ce13..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/src/components/DNSAnalysis.tsx +++ /dev/null @@ -1,204 +0,0 @@ -import * as React from "react"; - -import { useEffect, useState, useMemo } from "react"; - -import { Flex, Box, Text, theme, Heading, Button } from "ooni-components" - -import styled from 'styled-components' - -import ReactJson from 'react-json-view' -import PacmanLoader from "react-spinners/PacmanLoader"; - - -const DataSectionTitle = styled.p` - font-weight: bold; - padding: 8px 0 0; - margin: 0; -` -const DataSectionValue = styled.p` - font-weight: normal; - padding: 0; - margin: 0; - width: 50%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -` - -const DataSectionContainer = styled.div` - background-color: ${props => props.theme.colors.gray3}; - padding: 16px; - margin-bottom: 16px; -` - -const AnalysisTableName = styled.td` - font-weight: bold; - padding-right: 8px; -` - -const DNSAnswersList = styled.ul` - padding: 0px; - margin: 0; - list-style: none; -` - -const DataSection = ({ keys, data }) => { - console.log(data) - return ( - - {keys.map((k) => ( - - {k} - {data[k]} - - ))} - - ) -} - -const AnalysisTable = ({ keys, data }) => { - return ( - - - {keys.map((key) => ({key}))} - -
{data[key]}
- ) -} - -const AnalysisElement = ({ data }) => { - const metaKeys = [ - 'report_id', 'input', 'measurement_uid', 'probe_cc', 'probe_asn', - 'measurement_start_time', 'resolver_ip', 'resolver_asn', 'resolver_cc', - 'resolver_as_org_name', 'resolver_as_cc', 'resolver_is_scrubbed', - 'resolver_asn_probe', 'resolver_as_org_name_probe', - 'dns_engine_resolver_address', 'dns_engine' - ] - - const analysisKeys = [ - 'exp_dns_failure', 'exp_dns_answers', 'exp_dns_answers_count', - ] - - const analysisTableBoolsKeys = [ - 'exp_answer_contains_bogon', - 'exp_answer_contains_matching_probe_cc', - 'exp_answer_contains_matching_probe_asn', - 'exp_answer_contains_matching_probe_as_org_name', - ] - - const analysisTableAnswersKeys = [ - 'dns_answers_all_asn_count', - 'dns_answers_ip_match_all_count', - 'dns_answers_ip_match_tls_consistent_count', - 'dns_answers_ip_match_tls_consistent_include_probe_count', - 'dns_answers_ip_match_ctrl_count', - 'dns_answers_asn_match_all_count', - 'dns_answers_asn_match_tls_consistent_count', - 'dns_answers_as_org_name_match_all_count', - 'dns_answers_as_org_name_match_tls_consistent_count', - ] - - const analysisTableFailureKeys = [ - 'failure_asn_count', - 'nxdomain_asn_count', - 'ok_asn_count', - 'ctrl_matching_failures_count', - 'ctrl_failure_count' - ] - - const [loading, setLoading] = useState(false); - const [rawData, setRawData] = useState(null); - - const loadRawData = async () => { - setRawData(null) - setLoading(true) - try { - let response = await fetch(`/api/_/data/dns_analysis_raw?measurement_uid=${data.measurement_uid}`); - let json = await response.json(); - setLoading(false) - setRawData(json) - } catch (error) { - console.log(error); - setLoading(false) - return { success: false }; - } - } - - return ( - - {data.hostname} - -
- - - exp_dns_answers - - {data['exp_dns_answers'].map((answer) => (
  • {answer[0]} - {answer[1]} - {answer[2]}
  • ))} -
    -
    - - exp_dns_answers_count - {data['exp_dns_answers_count']} - - - exp_dns_failure - {data['exp_dns_failure']} - -
    - - - - - - - - - - - - - - - {rawData && } -
    - ) -} - -const DNSAnalysis = () => { - const [analysisData, setAnalysisData] = useState([]); - const [loading, setLoading] = useState(false); - - const fetchData = async () => { - setLoading(true) - try { - let response = await fetch(`/api/_/data/dns_analysis`); - let json = await response.json(); - setLoading(false) - return { success: true, data: json }; - } catch (error) { - console.log(error); - setLoading(false) - return { success: false }; - } - } - - useEffect(() => { - (async () => { - let res = await fetchData(); - if (res.success) { - setAnalysisData(res.data); - } - })(); - }, []); - - return ( - <> - {analysisData.length == 0 && } - {analysisData && - analysisData.map((data) => ) - } - - ) -} - -export default DNSAnalysis \ No newline at end of file diff --git a/oonipipeline/src/oonipipeline/dataviz/react/src/components/Dataviz.tsx b/oonipipeline/src/oonipipeline/dataviz/react/src/components/Dataviz.tsx deleted file mode 100644 index a18673e5..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/src/components/Dataviz.tsx +++ /dev/null @@ -1,422 +0,0 @@ -import * as React from "react"; -import { useState, useEffect, useMemo } from "react"; -import { Vega } from 'react-vega'; - -import PacmanLoader from "react-spinners/PacmanLoader"; - -import styled from 'styled-components' - -import { MdExpandMore, MdExpandLess, MdArrowUpward, MdArrowDownward } from "react-icons/md"; - -import { useTable, useSortBy, useGroupBy, useExpanded } from 'react-table' - -import { Flex, Box, Heading, Text, theme } from "ooni-components"; - -const vegaEmbedDefaults = { - actions: { - export: true, - source: true, - editor: false, - compiled: false, - } -} - -const ChartDomainBlockingByASN = ({ probeCC, domainName, onClick }) => { - const [data, setData] = useState({}); - const [dataLoaded, setDataLoaded] = useState(false); - - const fetchData = async () => { - try { - let response = await fetch(`/api/_/viz/chart/blocking_of_domain_by_asn?probe_cc=${probeCC}&domain_name=${domainName}`); - let json = await response.json(); - return { success: true, data: json }; - } catch (error) { - console.log(error); - return { success: false }; - } - } - - useEffect(() => { - (async () => { - setDataLoaded(false); - let res = await fetchData(); - if (res.success) { - setData(res.data); - setDataLoaded(true); - } - })(); - }, [probeCC, domainName]); - - - const handleNewView = (view) => { - view.addEventListener("click", (_, item) => { - if (item) { - onClick(item.datum.probe_asn) - } - }) - } - - return ( - dataLoaded ? - - : Loading data... - ) -} - -const ChartDomainBlockingInASN = ({ probeCC, domainName, probeASN }) => { - const [data, setData] = useState({}); - const [dataLoaded, setDataLoaded] = useState(false); - - const fetchData = async () => { - try { - let response = await fetch(`/api/_/viz/chart/blocking_of_domain_in_asn?probe_cc=${probeCC}&domain_name=${domainName}&probe_asn=${probeASN}`); - let json = await response.json(); - return { success: true, data: json }; - } catch (error) { - console.log(error); - return { success: false }; - } - } - - useEffect(() => { - (async () => { - setDataLoaded(false); - let res = await fetchData(); - if (res.success) { - setData(res.data); - setDataLoaded(true); - } - })(); - }, [probeCC, domainName, probeASN]); - - return ( - dataLoaded ? - - : Loading data... - ) -} - -const ChartWorldMap = ({ data, onClick }) => { - const [spec, setSpec] = useState({}); - const [dataLoaded, setDataLoaded] = useState(false); - - const fetchSpec = async () => { - try { - let response = await fetch(`/api/_/viz/chart/world_map`); - let json = await response.json(); - return { success: true, data: json }; - } catch (error) { - console.log(error); - return { success: false }; - } - } - - useEffect(() => { - (async () => { - setDataLoaded(false); - let res = await fetchSpec(); - if (res.success) { - setSpec(res.data); - setDataLoaded(true); - } - })(); - }, [data]); - - - const handleNewView = (view) => { - view.addEventListener("click", (_, item) => { - if (item) { - onClick({ "cc": item.datum.probe_cc, "name": item.datum.name }) - } - }) - } - - return ( - dataLoaded ? - - : Loading data... - ) -} - -const StyleCountryTable = styled.div` - padding: 1rem; - - table { - border-spacing: 0; - border: 1px solid black; - - tr { - :last-child { - td { - border-bottom: 0; - } - } - } - - th, - td { - margin: 0; - padding: 0.5rem; - border-bottom: 1px solid black; - border-right: 1px solid black; - - :last-child { - border-right: 0; - } - } - } -` - -const CountryTable = ({ data, onDomainSelected }) => { - const columns = useMemo(() => [ - { - id: 'category_code', - Header: 'Category Code', - accessor: 'category_code' - }, - { - id: 'domain_name', - Header: 'Domain', - accessor: 'domain_name', - aggregate: 'count', - Aggregated: ({ value }) => `${value} domains`, - }, - { - id: 'blocked_asns', - Header: 'Blocked ASNS', - accessor: 'blocked_asns', - aggregate: 'average', - Aggregated: ({ value }) => `${value} (avg)`, - }, - { - id: 'ok_asns', - Header: 'OK ASNS', - accessor: 'ok_asns', - aggregate: 'average', - Aggregated: ({ value }) => `${value} (avg)`, - }, - ], []) - - const initialGroupBy = useMemo(() => ["category_code"], []) - const initialSortBy = useMemo(() => [{ "id": "category_code" }], []) - - const { - getTableProps, - getTableBodyProps, - headerGroups, - rows, - prepareRow, - state: { groupBy, expanded }, - } = useTable( - { - initialState: { - groupBy: initialGroupBy, - sortBy: initialSortBy - }, - columns, - data, - }, - useGroupBy, - useSortBy, - useExpanded - ) - - const onClickCell = (cell) => { - if (!cell.isAggregated && cell.column.id == "domain_name") { - onDomainSelected(cell.value) - } - } - - return ( - - - - {headerGroups.map(headerGroup => ( - - {headerGroup.headers.map(column => ( - // Add the sorting props to control sorting. For this example - // we can add them into the header props - - ))} - - ))} - - - {rows.map( - (row, i) => { - prepareRow(row); - return ( - - {row.cells.map(cell => { - return ( - - ) - })} - - ) - } - )} - -
    - {column.render('Header')} - {/* Add a sort direction indicator */} - - {column.isSorted - ? column.isSortedDesc - ? - : - : ''} - -
    onClickCell(cell)} - {...cell.getCellProps()} - style={{ - background: cell.isGrouped - ? theme.colors.gray2 - : cell.isAggregated - ? theme.colors.gray1 - : cell.isPlaceholder - ? 'white' - : 'white', - }} - > - {cell.isGrouped ? ( - // If it's a grouped cell, add an expander and row count - <> - - {row.isExpanded ? : } - {' '} - {cell.render('Cell')} ({row.subRows.length}) - - ) : cell.isAggregated ? ( - // If the cell is aggregated, use the Aggregated - // renderer for cell - cell.render('Aggregated') - ) : cell.isPlaceholder ? null : ( // For cells with repeated values, render null - // Otherwise, just render the regular cell - cell.render('Cell') - )} -
    -
    - ) - -} - -const StyleLoader = styled.div` - position: fixed; - left: 0px; - top: 0px; - width: 100%; - height: 100%; - z-index: 9999999999; - overflow: hidden; -` - -const GeneralLoader = ({ loading }) => { - return ( - loading ? - - - - - - - ...loading... - - - - : null - ) -} - -const DataViz = () => { - const [selectedASN, setSelectedASN] = useState(null); - const [selectedCC, setSelectedCC] = useState(null); - const [selectedCountry, setSelectedCountry] = useState(""); - const [selectedDomainName, setSelectedDomainName] = useState(null); - - const [worldMapData, setWorldMapData] = useState([]); - const [loading, setLoading] = useState(false) - - const [tableData, setTableData] = useState(null); - - const fetchData = async () => { - try { - let response = await fetch(`/api/_/viz/data/world_map`); - let json = await response.json(); - return { success: true, data: json }; - } catch (error) { - console.log(error); - return { success: false }; - } - } - - useEffect(() => { - (async () => { - setLoading(true); - let res = await fetchData(); - if (res.success) { - setWorldMapData(res.data); - setLoading(false); - } - })(); - }, []); - - const onSelectedASN = (probe_asn) => { - setSelectedASN(probe_asn) - } - - const onSelectedCountry = ({ cc, name }) => { - setSelectedDomainName(null) - setSelectedASN(null) - - setSelectedCountry(name) - setSelectedCC(cc) - } - - useEffect(() => { - if (selectedCC !== null) { - const tableData = worldMapData.filter((d) => d.probe_cc == selectedCC) - console.log("setting table data", tableData, worldMapData) - setTableData(tableData) - } - }, [selectedCC]) - - const onDomainSelected = (domainName) => { - if (domainName == selectedDomainName) { - return - } - setSelectedASN(null) - setSelectedDomainName(domainName) - } - - return ( - - - - - - - {selectedCountry} - - - {tableData && } - - - - - {selectedASN !== null && } - - - {selectedDomainName !== null && } - - - - - - - ) - -} - -export default DataViz \ No newline at end of file diff --git a/oonipipeline/src/oonipipeline/dataviz/react/src/index.tsx b/oonipipeline/src/oonipipeline/dataviz/react/src/index.tsx deleted file mode 100644 index e3ed545e..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/src/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; -import { HashRouter } from "react-router-dom"; -import "@fontsource/fira-sans"; - -import App from "./App"; - -document.addEventListener("DOMContentLoaded", (event) => { - ReactDOM.render( - - - , - document.getElementById("root") - ); -}); diff --git a/oonipipeline/src/oonipipeline/dataviz/react/yarn.lock b/oonipipeline/src/oonipipeline/dataviz/react/yarn.lock deleted file mode 100644 index d276b91d..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/react/yarn.lock +++ /dev/null @@ -1,4476 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== - -"@babel/core@^7.16.5", "@babel/core@^7.19.6": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" - integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== - -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" - integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.20.7" - -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/preset-react@^7.17.12": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/runtime@^7.10.1", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" - integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.10.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" - integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@emotion/cache@^10.0.27": - version "10.0.29" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" - integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== - dependencies: - "@emotion/sheet" "0.9.4" - "@emotion/stylis" "0.8.5" - "@emotion/utils" "0.11.3" - "@emotion/weak-memoize" "0.2.5" - -"@emotion/core@^10.0.0": - version "10.3.1" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.3.1.tgz#4021b6d8b33b3304d48b0bb478485e7d7421c69d" - integrity sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/cache" "^10.0.27" - "@emotion/css" "^10.0.27" - "@emotion/serialize" "^0.11.15" - "@emotion/sheet" "0.9.4" - "@emotion/utils" "0.11.3" - -"@emotion/css@^10.0.27": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" - integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== - dependencies: - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - babel-plugin-emotion "^10.0.27" - -"@emotion/hash@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.1": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/is-prop-valid@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== - dependencies: - "@emotion/memoize" "^0.8.0" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/memoize@^0.7.1": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": - version "0.11.16" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" - integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== - dependencies: - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/unitless" "0.7.5" - "@emotion/utils" "0.11.3" - csstype "^2.5.7" - -"@emotion/sheet@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" - integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== - -"@emotion/styled-base@^10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.3.0.tgz#9aa2c946100f78b47316e4bc6048321afa6d4e36" - integrity sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/is-prop-valid" "0.8.8" - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - -"@emotion/styled@^10.0.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.3.0.tgz#8ee959bf75730789abb5f67f7c3ded0c30aec876" - integrity sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ== - dependencies: - "@emotion/styled-base" "^10.3.0" - babel-plugin-emotion "^10.0.27" - -"@emotion/stylis@0.8.5", "@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== - -"@emotion/weak-memoize@0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== - -"@fontsource/fira-sans@^4.5.10": - version "4.5.10" - resolved "https://registry.yarnpkg.com/@fontsource/fira-sans/-/fira-sans-4.5.10.tgz#63a6dacfa482017a840b40e9c2cfefb187a0e515" - integrity sha512-4Edj+GA0LYSqfXOvdTwVGmCShT8Ycd8bKzdfzM302n+I6Hsg6h3gBkBeNgN19PhkcngDznZyHv3EkyrKqvMTGw== - -"@formatjs/ecma402-abstract@1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz#b962dfc4ae84361f9f08fbce411b4e4340930eda" - integrity sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw== - dependencies: - "@formatjs/intl-localematcher" "0.2.25" - tslib "^2.1.0" - -"@formatjs/fast-memoize@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz#e6f5aee2e4fd0ca5edba6eba7668e2d855e0fc21" - integrity sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg== - dependencies: - tslib "^2.1.0" - -"@formatjs/icu-messageformat-parser@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz#a54293dd7f098d6a6f6a084ab08b6d54a3e8c12d" - integrity sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/icu-skeleton-parser" "1.3.6" - tslib "^2.1.0" - -"@formatjs/icu-skeleton-parser@1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz#4ce8c0737d6f07b735288177049e97acbf2e8964" - integrity sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - tslib "^2.1.0" - -"@formatjs/intl-displaynames@5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-5.4.3.tgz#e468586694350c722c7efab1a31fcde68aeaed8b" - integrity sha512-4r12A3mS5dp5hnSaQCWBuBNfi9Amgx2dzhU4lTFfhSxgb5DOAiAbMpg6+7gpWZgl4ahsj3l2r/iHIjdmdXOE2Q== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/intl-localematcher" "0.2.25" - tslib "^2.1.0" - -"@formatjs/intl-listformat@6.5.3": - version "6.5.3" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-6.5.3.tgz#f29da613a8062dc3e4e3d847ba890c3ea745f051" - integrity sha512-ozpz515F/+3CU+HnLi5DYPsLa6JoCfBggBSSg/8nOB5LYSFW9+ZgNQJxJ8tdhKYeODT+4qVHX27EeJLoxLGLNg== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/intl-localematcher" "0.2.25" - tslib "^2.1.0" - -"@formatjs/intl-localematcher@0.2.25": - version "0.2.25" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz#60892fe1b271ec35ba07a2eb018a2dd7bca6ea3a" - integrity sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA== - dependencies: - tslib "^2.1.0" - -"@formatjs/intl@2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.2.1.tgz#6daf4dabed055b17f467f0aa1bc073a626bc9189" - integrity sha512-vgvyUOOrzqVaOFYzTf2d3+ToSkH2JpR7x/4U1RyoHQLmvEaTQvXJ7A2qm1Iy3brGNXC/+/7bUlc3lpH+h/LOJA== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/fast-memoize" "1.2.1" - "@formatjs/icu-messageformat-parser" "2.1.0" - "@formatjs/intl-displaynames" "5.4.3" - "@formatjs/intl-listformat" "6.5.3" - intl-messageformat "9.13.0" - tslib "^2.1.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@lezer/common@^0.15.0", "@lezer/common@^0.15.7": - version "0.15.12" - resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.12.tgz#2f21aec551dd5fd7d24eb069f90f54d5bc6ee5e9" - integrity sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig== - -"@lezer/lr@^0.15.4": - version "0.15.8" - resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-0.15.8.tgz#1564a911e62b0a0f75ca63794a6aa8c5dc63db21" - integrity sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg== - dependencies: - "@lezer/common" "^0.15.0" - -"@lmdb/lmdb-darwin-arm64@2.5.2": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz#bc66fa43286b5c082e8fee0eacc17995806b6fbe" - integrity sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A== - -"@lmdb/lmdb-darwin-x64@2.5.2": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz#89d8390041bce6bab24a82a20392be22faf54ffc" - integrity sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA== - -"@lmdb/lmdb-linux-arm64@2.5.2": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz#14fe4c96c2bb1285f93797f45915fa35ee047268" - integrity sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ== - -"@lmdb/lmdb-linux-arm@2.5.2": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz#05bde4573ab10cf21827339fe687148f2590cfa1" - integrity sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw== - -"@lmdb/lmdb-linux-x64@2.5.2": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz#d2f85afd857d2c33d2caa5b057944574edafcfee" - integrity sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q== - -"@lmdb/lmdb-win32-x64@2.5.2": - version "2.5.2" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz#28f643fbc0bec30b07fbe95b137879b6b4d1c9c5" - integrity sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA== - -"@mapbox/hast-util-table-cell-style@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" - integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== - dependencies: - unist-util-visit "^1.4.1" - -"@mischnic/json-sourcemap@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz#38af657be4108140a548638267d02a2ea3336507" - integrity sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA== - dependencies: - "@lezer/common" "^0.15.7" - "@lezer/lr" "^0.15.4" - json5 "^2.2.1" - -"@msgpackr-extract/msgpackr-extract-darwin-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz#901c5937e1441572ea23e631fe6deca68482fe76" - integrity sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ== - -"@msgpackr-extract/msgpackr-extract-darwin-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz#fb877fe6bae3c4d3cea29786737840e2ae689066" - integrity sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw== - -"@msgpackr-extract/msgpackr-extract-linux-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz#986179c38b10ac41fbdaf7d036c825cbc72855d9" - integrity sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA== - -"@msgpackr-extract/msgpackr-extract-linux-arm@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz#15f2c6fe9e0adc06c21af7e95f484ff4880d79ce" - integrity sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg== - -"@msgpackr-extract/msgpackr-extract-linux-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz#30cae5c9a202f3e1fa1deb3191b18ffcb2f239a2" - integrity sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw== - -"@msgpackr-extract/msgpackr-extract-win32-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz#016d855b6bc459fd908095811f6826e45dd4ba64" - integrity sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA== - -"@parcel/bundler-default@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.6.0.tgz#3b091d2f6ebdb333558fc25c1fb98e28b854ace3" - integrity sha512-AplEdGm/odV7yGmoeOnglxnY31WlNB5EqGLFGxkgs7uwDaTWoTX/9SWPG6xfvirhjDpms8sLSiVuBdFRCCLtNA== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/cache@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.6.0.tgz#19a5132e5715d7ab1df7cb7a5ae5e8c29003a7b1" - integrity sha512-4vbD5uSuf+kRnrFesKhpn0AKnOw8u2UlvCyrplYmp1g9bNAkIooC/nDGdmkb/9SviPEbni9PEanQEHDU2+slpA== - dependencies: - "@parcel/fs" "2.6.0" - "@parcel/logger" "2.6.0" - "@parcel/utils" "2.6.0" - lmdb "2.3.10" - -"@parcel/cache@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.8.2.tgz#64ab1a4ecc20033b7d20a72ddd8898fea035e553" - integrity sha512-kiyoOgh1RXp5qp+wlb8Pi/Z7o9D82Oj5RlHnKSAauyR7jgnI8Vq8JTeBmlLqrf+kHxcDcp2p86hidSeANhlQNg== - dependencies: - "@parcel/fs" "2.8.2" - "@parcel/logger" "2.8.2" - "@parcel/utils" "2.8.2" - lmdb "2.5.2" - -"@parcel/codeframe@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.6.0.tgz#1de477a8772191d5990348b6c75922c1350b835c" - integrity sha512-yXXxrO9yyedHKpTwC+Af0+vPmQm+A9xeEhkt4f0yVg1n4t4yUIxYlTedzbM8ygZEEBtkXU9jJ+PkgXbfMf0dqw== - dependencies: - chalk "^4.1.0" - -"@parcel/codeframe@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.8.2.tgz#a170050404792acb6d9beac931b5ece25e3fc0b9" - integrity sha512-U2GT9gq1Zs3Gr83j8JIs10bLbGOHFl57Y8D57nrdR05F4iilV/UR6K7jkhdoiFc9WiHh3ewvrko5+pSdAVFPgQ== - dependencies: - chalk "^4.1.0" - -"@parcel/compressor-raw@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/compressor-raw/-/compressor-raw-2.6.0.tgz#d8b238db719f43807ebd96ec08270b3c937221e2" - integrity sha512-rtMU2mGl88bic6Xbq1u5L49bMK4s5185b0k7h3JRdS6/0rR+Xp4k/o9Wog+hHjK/s82z1eF9WmET779ZpIDIQQ== - dependencies: - "@parcel/plugin" "2.6.0" - -"@parcel/config-default@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.6.0.tgz#2cc9a05d195a97a93b6e14cbbda96d47d2ccf118" - integrity sha512-DXovFPhZITmTvFaSEdC8RRqROs9FLIJ4u8yFSU6FUyq2wpvtYVRXXoDrvXgClh2csXmK7JTJTp5JF7r0rd2UaA== - dependencies: - "@parcel/bundler-default" "2.6.0" - "@parcel/compressor-raw" "2.6.0" - "@parcel/namer-default" "2.6.0" - "@parcel/optimizer-css" "2.6.0" - "@parcel/optimizer-htmlnano" "2.6.0" - "@parcel/optimizer-image" "2.6.0" - "@parcel/optimizer-svgo" "2.6.0" - "@parcel/optimizer-terser" "2.6.0" - "@parcel/packager-css" "2.6.0" - "@parcel/packager-html" "2.6.0" - "@parcel/packager-js" "2.6.0" - "@parcel/packager-raw" "2.6.0" - "@parcel/packager-svg" "2.6.0" - "@parcel/reporter-dev-server" "2.6.0" - "@parcel/resolver-default" "2.6.0" - "@parcel/runtime-browser-hmr" "2.6.0" - "@parcel/runtime-js" "2.6.0" - "@parcel/runtime-react-refresh" "2.6.0" - "@parcel/runtime-service-worker" "2.6.0" - "@parcel/transformer-babel" "2.6.0" - "@parcel/transformer-css" "2.6.0" - "@parcel/transformer-html" "2.6.0" - "@parcel/transformer-image" "2.6.0" - "@parcel/transformer-js" "2.6.0" - "@parcel/transformer-json" "2.6.0" - "@parcel/transformer-postcss" "2.6.0" - "@parcel/transformer-posthtml" "2.6.0" - "@parcel/transformer-raw" "2.6.0" - "@parcel/transformer-react-refresh-wrap" "2.6.0" - "@parcel/transformer-svg" "2.6.0" - -"@parcel/core@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.6.0.tgz#dad1f5f529ffb47df772c155ef09119d3294538c" - integrity sha512-8OOWbPuxpFydpwNyKoz6d3e3O4DmxNYmMw4DXwrPSj/jyg7oa+SDtMT0/VXEhujE0HYkQPCHt4npRajkSuf99A== - dependencies: - "@mischnic/json-sourcemap" "^0.1.0" - "@parcel/cache" "2.6.0" - "@parcel/diagnostic" "2.6.0" - "@parcel/events" "2.6.0" - "@parcel/fs" "2.6.0" - "@parcel/graph" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/logger" "2.6.0" - "@parcel/package-manager" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - "@parcel/workers" "2.6.0" - abortcontroller-polyfill "^1.1.9" - base-x "^3.0.8" - browserslist "^4.6.6" - clone "^2.1.1" - dotenv "^7.0.0" - dotenv-expand "^5.1.0" - json5 "^2.2.0" - msgpackr "^1.5.4" - nullthrows "^1.1.1" - semver "^5.7.1" - -"@parcel/css@^1.9.0": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@parcel/css/-/css-1.14.0.tgz#233750a1e3648b3746f27c2d8f3fd85a2290e512" - integrity sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w== - dependencies: - lightningcss "^1.14.0" - -"@parcel/diagnostic@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.6.0.tgz#99570b28ed44d64d57a3c3521bcfa4f6f631b495" - integrity sha512-+p8gC2FKxSI2veD7SoaNlP572v4kw+nafCQEPDtJuzYYRqywYUGncch25dkpgNApB4W4cXVkZu3ZbtIpCAmjQQ== - dependencies: - "@mischnic/json-sourcemap" "^0.1.0" - nullthrows "^1.1.1" - -"@parcel/diagnostic@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.8.2.tgz#7a6ca8c537cd59570ebc44615e1637cfd9675698" - integrity sha512-tGSMwM2rSYLjJW0fCd9gb3tNjfCX/83PZ10/5u2E33UZVkk8OIHsQmsrtq2H2g4oQL3rFxkfEx6nGPDGHwlx7A== - dependencies: - "@mischnic/json-sourcemap" "^0.1.0" - nullthrows "^1.1.1" - -"@parcel/events@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.6.0.tgz#6066c8c7b320e12fd206877bd549825b7eea8c63" - integrity sha512-2WaKtBs4iYwS88j4zRdyTJTgh8iuY4E32FMmjzzbheqETs6I05gWuPReGukJYxk8vc0Ir7tbzp12oAfpgo0Y+g== - -"@parcel/events@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.8.2.tgz#9ef8d93f1a41369ac1685a1e2bbef7b76390259c" - integrity sha512-o5etrsKm16y8iRPnjtEBNy4lD0WAigD66yt/RZl9Rx0vPVDly/63Rr9+BrXWVW7bJ7x0S0VVpWW4j3f/qZOsXg== - -"@parcel/fs-search@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/fs-search/-/fs-search-2.6.0.tgz#35c52da3186cab953cf6686304921a7ab0c81be8" - integrity sha512-1nXzM3H/cA4kzLKvDBvwmNisKCdRqlgkLXh+OR1Zu28Kn4W34KuJMcHWW8cC+WIuuKqDh5oo2WPsC5y65GXBKQ== - dependencies: - detect-libc "^1.0.3" - -"@parcel/fs-search@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/fs-search/-/fs-search-2.8.2.tgz#6d68fedac193ef1ab28d3bf4cb69a4c03f44b9a8" - integrity sha512-ovQnupRm/MoE/tbgH0Ivknk0QYenXAewjcog+T5umDmUlTmnIRZjURrgDf5Xtw8T/CD5Xv+HmIXpJ9Ez/LzJpw== - dependencies: - detect-libc "^1.0.3" - -"@parcel/fs@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.6.0.tgz#287a3cda558f16aae5c67ccbe33a17c1bbd75ceb" - integrity sha512-6vxtx5Zy6MvDvH1EPx9JxjKGF03bR7VE1dUf4HLeX2D8YmpL5hkHJnlRCFdcH08rzOVwaJLzg1QNtblWJXQ9CA== - dependencies: - "@parcel/fs-search" "2.6.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - "@parcel/watcher" "^2.0.0" - "@parcel/workers" "2.6.0" - -"@parcel/fs@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.8.2.tgz#380b76962f908cafec1fda6d4bb6ccda450325ab" - integrity sha512-aN8znbMndSqn1xwZEmMblzqmJsxcExv2jKLl/a9RUHAP7LaPYcPZIykDL3YwGCiKTCzjmRpXnNoyosjFFeBaHA== - dependencies: - "@parcel/fs-search" "2.8.2" - "@parcel/types" "2.8.2" - "@parcel/utils" "2.8.2" - "@parcel/watcher" "^2.0.7" - "@parcel/workers" "2.8.2" - -"@parcel/graph@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/graph/-/graph-2.6.0.tgz#04f9660333e314a51af38483efefd766a5841bb0" - integrity sha512-rxrAzWm6rwbCRPbu0Z+zwMscpG8omffODniVWPlX2G0jgQGpjKsutBQ6RMfFIcfaQ4MzL3pIQOTf8bkjQOPsbg== - dependencies: - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/hash@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/hash/-/hash-2.6.0.tgz#c41364425e08d7e0ae5dae8b49ebfec2094124fe" - integrity sha512-YugWqhLxqK80Lo++3B3Kr5UPCHOdS8iI2zJ1jkzUeH9v6WUzbwWOnmPf6lN2S5m1BrIFFJd8Jc+CbEXWi8zoJA== - dependencies: - detect-libc "^1.0.3" - xxhash-wasm "^0.4.2" - -"@parcel/hash@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/hash/-/hash-2.8.2.tgz#f621431391cf873139125bacd4617c493c737cd7" - integrity sha512-NBnP8Hu0xvAqAfZXRaMM66i8nJyxpKS86BbhwkbgTGbwO1OY87GERliHeREJfcER0E0ZzwNow7MNR8ZDm6IvJQ== - dependencies: - detect-libc "^1.0.3" - xxhash-wasm "^0.4.2" - -"@parcel/logger@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.6.0.tgz#f7aa26368e39573a5362997bb215f4a987c799e4" - integrity sha512-J1/7kPfSGBvMKSZdi0WCNuN0fIeiWxifnDGn7W/K8KhD422YwFJA8N046ps8nkDOPIXf1osnIECNp4GIR9oSYw== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/events" "2.6.0" - -"@parcel/logger@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.8.2.tgz#21df19cf2a084d247199b71a01511560a7ba98fc" - integrity sha512-zlhK6QHxfFJMlVJxxcCw0xxBDrYPFPOhMxSD6p6b0z9Yct1l3NdpmfabgjKX8wnZmHokFsil6daleM+M80n2Ew== - dependencies: - "@parcel/diagnostic" "2.8.2" - "@parcel/events" "2.8.2" - -"@parcel/markdown-ansi@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.6.0.tgz#69720735d27ca039e1e03f0277224ec5a99c0ef7" - integrity sha512-fyjkrJQQSfKTUFTTasdZ6WrAkDoQ2+DYDjj+3p+RncYyrIa9zArKx4IiRiipsvNdtMvP0/hTdK8F3BOJ3KSU/g== - dependencies: - chalk "^4.1.0" - -"@parcel/markdown-ansi@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.8.2.tgz#cb453c70de9c1ea85e2650fb46abbdf2ccbafa9e" - integrity sha512-5y29TXgRgG0ybuXaDsDk4Aofg/nDUeAAyVl9/toYCDDhxpQV4yZt8WNPu4PaNYKGLuNgXwsmz+ryZQHGmfbAIQ== - dependencies: - chalk "^4.1.0" - -"@parcel/namer-default@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.6.0.tgz#1978397aabf13824f433157c683f64e1b6d37936" - integrity sha512-r8O12r7ozJBctnFxVdXbf/fK97GIdNj3hiiUNWlXEmED9sw6ZPcChaLcfot0/443g8i87JDmSTKJ8js2tuz5XA== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/node-resolver-core@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-2.6.0.tgz#2666897414274e0de72221f8ec34590f029ab95d" - integrity sha512-AJDj5DZbB58plv0li8bdVSD+zpnkHE36Om3TYyNn1jgXXwgBM64Er/9p8yQn356jBqTQMh7zlJqvbdIyOiMeMg== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/optimizer-css@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-css/-/optimizer-css-2.6.0.tgz#ae48b468d528f19a10e64b588dff8859aa31a15d" - integrity sha512-VMJknUwfKCw6Woov0lnPGdsGZewcI4ghW8WKmNZzC5uKCetk1XetV55QHBc1RNjGfsjfSTZiSa3guATj2zFJkQ== - dependencies: - "@parcel/css" "^1.9.0" - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - browserslist "^4.6.6" - nullthrows "^1.1.1" - -"@parcel/optimizer-htmlnano@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.6.0.tgz#ad1775de73a338e19bfbb4c43ccda2a8eb99433d" - integrity sha512-HmvcUoYpfdx8ZfID4WOj/SE8N78NEBmzAffZ8f827mYMr4ZrbKzAgg6OG3tBbfF0zxH0bIjZcwqwZYk4SdbG7g== - dependencies: - "@parcel/plugin" "2.6.0" - htmlnano "^2.0.0" - nullthrows "^1.1.1" - posthtml "^0.16.5" - svgo "^2.4.0" - -"@parcel/optimizer-image@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-image/-/optimizer-image-2.6.0.tgz#2dca41db64b51fa5d5a463278851c729d9ff1d8c" - integrity sha512-FDNr3LJ8SWR9rrtdCrZOlYF1hE9G5pxUWawGxUasbvqwcY5lEQwr2KRmfGZeg+KwOnzlImlY6dP2LGox1NFddQ== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - "@parcel/workers" "2.6.0" - detect-libc "^1.0.3" - -"@parcel/optimizer-svgo@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.6.0.tgz#6ed5e6bd50dd8b432818bf61881a2b602e1cc394" - integrity sha512-LMTDVMd7T/IfLG59yLWl8Uw2HYGbj2C3jIwkMqH9MBUT5KILK66T3t0yV86SoZJnxZ6xBIJ+kCcCRssCzhvanw== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - svgo "^2.4.0" - -"@parcel/optimizer-terser@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/optimizer-terser/-/optimizer-terser-2.6.0.tgz#98179f7e5e4c74f80aaca7660d4a83d0ed03877e" - integrity sha512-oezRt6Lz/QqcVDXyMfFjzQc7n0ThJowLJ4Lyhu8rMh0ZJYzc4UCFCw/19d4nRnzE+Qg0vj3mQCpdkA9/64E44g== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - terser "^5.2.0" - -"@parcel/package-manager@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.6.0.tgz#2d5dca646f2484ff6d643e1a2ed88cc48b25c6f6" - integrity sha512-AqFfdkbOw51q/3ia2mIsFTmrpYEyUb3k+2uYC5GsLMz3go6OGn7/Crz0lZLSclv5EtwpRg3TWr9yL7RekVN/Uw== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/fs" "2.6.0" - "@parcel/logger" "2.6.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - "@parcel/workers" "2.6.0" - semver "^5.7.1" - -"@parcel/package-manager@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.8.2.tgz#fd7886bb4f828929ffed93cfc345cf160b540d4c" - integrity sha512-hx4Imi0yhsSS0aNZkEANPYNNKqBuR63EUNWSxMyHh4ZOvbHoOXnMn1ySGdx6v0oi9HvKymNsLMQ1T5CuI4l4Bw== - dependencies: - "@parcel/diagnostic" "2.8.2" - "@parcel/fs" "2.8.2" - "@parcel/logger" "2.8.2" - "@parcel/types" "2.8.2" - "@parcel/utils" "2.8.2" - "@parcel/workers" "2.8.2" - semver "^5.7.1" - -"@parcel/packager-css@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.6.0.tgz#b3dff55c1a3d65bd359d1dd3753c25ea7ea44d62" - integrity sha512-iXUttSe+wtnIM2PKCyFC2I4+Szv+8qHpC3wXeJlXlzd8wljm42y+6Fs4FZ0zihTccRxI2UUhFnKu90ag+5AmjA== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/packager-html@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.6.0.tgz#a23b268cac7f4a8841f3f6c570a00fd4fe9ca859" - integrity sha512-HsiXMkU9AJr3LLjsP2Kteho2jCVpabTwcU/fauwbwirhg0xNlRsKxYZRCllRhPkb0FWAnkjzwjOj01MHD6NJCg== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - posthtml "^0.16.5" - -"@parcel/packager-js@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.6.0.tgz#31810f10de497dd67e1912f83de0aba66db58173" - integrity sha512-Uz3pqIFchFfKszWnNGDgIwM1uwHHJp7Dts6VzS9lf/2RbRgZT0fmce+NPgnVO5MMKBHzdvm32ShT6gFAABF5Vw== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - globals "^13.2.0" - nullthrows "^1.1.1" - -"@parcel/packager-raw@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.6.0.tgz#8ccf041acd102a38b2ffa02fd8ef634652255bd2" - integrity sha512-ktT6Qc/GgCq8H1+6y+AXufVzQj1s6KRoKf83qswCD0iY3MwCbJoEfc3IsB4K64FpHIL5Eu0z54IId+INvGbOYA== - dependencies: - "@parcel/plugin" "2.6.0" - -"@parcel/packager-svg@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/packager-svg/-/packager-svg-2.6.0.tgz#676a3ba95259deece6cd9826f1a677cbbf1d2ea3" - integrity sha512-OF2RShyspXu7H4Dn2PmchfMMYPx+kWjOXiYVQ6OkOI0MZmOydx7p8nrcG5+y7vCJTPlta828BSwva0GdKfn46A== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - posthtml "^0.16.4" - -"@parcel/plugin@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.6.0.tgz#84fd9fffd7891027e4040be4b94647652fd46354" - integrity sha512-LzOaiK8R6eFEoov1cb3/W+o0XvXdI/VbDhMDl0L0II+/56M0UeayYtFP5QGTDn/fZqVlYfzPCtt3EMwdG7/dow== - dependencies: - "@parcel/types" "2.6.0" - -"@parcel/plugin@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.8.2.tgz#f8d147cf32e52f7feff245d64d640890a18a6fd9" - integrity sha512-YG7TWfKsoNm72jbz3b3TLec0qJHVkuAWSzGzowdIhX37cP1kRfp6BU2VcH+qYPP/KYJLzhcZa9n3by147mGcxw== - dependencies: - "@parcel/types" "2.8.2" - -"@parcel/reporter-bundle-analyzer@^2.6.0": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-analyzer/-/reporter-bundle-analyzer-2.8.2.tgz#996986c477911cde5bdb8a4a2fe44ffcdd11e571" - integrity sha512-naUFCTNO0WmSyDkpC9T9QiAEfyqVA6ToDm42rTKZ8MXUP0b88yGxMRfWZ4FY4eK0nJIyWGdalj5a5vzTE55nWA== - dependencies: - "@parcel/plugin" "2.8.2" - "@parcel/utils" "2.8.2" - nullthrows "^1.1.1" - -"@parcel/reporter-cli@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.6.0.tgz#09fe5a8eecc368f2bcaaf6ab8154378bab0e0242" - integrity sha512-QFG957NXx3L0D8Zw0+B2j7IHy8f/UzOVu6VvKE3rMkhq/iR2qLrPohQ+uvxlee+CLC0cG2qRSgJ7Ve/rjQPoJg== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - chalk "^4.1.0" - term-size "^2.2.1" - -"@parcel/reporter-dev-server@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.6.0.tgz#8e692916c6684c3c04fecef058ddddae6b74121c" - integrity sha512-VvygsCA+uzWyijIV8zqU1gFyhAWknuaY4KIWhV4kCT8afRJwsLSwt/tpdaKDPuPU45h3tTsUdXH1wjaIk+dGeQ== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - -"@parcel/resolver-default@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.6.0.tgz#a80bc39c402abe0e78e3de8997ca2ea636c28a91" - integrity sha512-ATk9wXvy5GOHAqyHbnCnU11fUPTtf8dLjpgVqL5XylwugZnyBXbynoTWX4w8h6mffkVtdfmzTJx/o4Lresz9sA== - dependencies: - "@parcel/node-resolver-core" "2.6.0" - "@parcel/plugin" "2.6.0" - -"@parcel/runtime-browser-hmr@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.6.0.tgz#e817ead910f9ba572ed8f477447c862acbfe8d73" - integrity sha512-90xvv/10cFML5dAhClBEJZ/ExiBQVPqQsZcvRmVZmc5mpZVJMKattWCQrd7pAf7FDYl4JAcvsK3DTwvRT/oLNA== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - -"@parcel/runtime-js@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.6.0.tgz#a10c672c7f90360d5903180d0e2b808355708e80" - integrity sha512-R4tJAIT/SX7VBQ+f7WmeekREQzzLsmgP1j486uKhQNyYrpvsN0HnRbg5aqvZjEjkEmSeJR0mOlWtMK5/m+0yTA== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/runtime-react-refresh@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.6.0.tgz#52ae4d9acba3e1e3b20a4f2712ea140fac21aaaf" - integrity sha512-2sRd13gc2EbMV/O5n2NPVGGhKBasb1fDTXGEY8y7qi9xDKc+ewok/D83T+w243FhCPS9Pf3ur5GkbPlrJGcenQ== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - react-error-overlay "6.0.9" - react-refresh "^0.9.0" - -"@parcel/runtime-service-worker@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.6.0.tgz#10e90d02d83ebe763bb8de838a8f03eb3118aef9" - integrity sha512-nVlknGw5J5Bkd1Wr1TbyWHhUd9CmVVebaRg/lpfVKYhAuE/2r+3N0+J8qbEIgtTRcHaSV7wTNpg4weSWq46VeA== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/source-map@^2.0.0", "@parcel/source-map@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@parcel/source-map/-/source-map-2.1.1.tgz#fb193b82dba6dd62cc7a76b326f57bb35000a782" - integrity sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew== - dependencies: - detect-libc "^1.0.3" - -"@parcel/transformer-babel@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.6.0.tgz#f47454438b2beae348f3caf9aecc4619f81759f1" - integrity sha512-qTDzhLoaTpRJoppCNqaAlcUYxcDEvJffem1h3SAQiwvCLUBQowLyeaBy8sUxu54AU6eHFJyBld5ZocENyHTBCA== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - browserslist "^4.6.6" - json5 "^2.2.0" - nullthrows "^1.1.1" - semver "^5.7.0" - -"@parcel/transformer-css@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.6.0.tgz#6b91cb23d569f9ce9eed39e30d965c92baf54720" - integrity sha512-Ei9NPE5Rl9V+MGd8qddfZD0Fsqbvky8J62RwYsqLkptFl9FkhgwOu8Cmokz7IIc4GJ2qzfnG5y54K/Bi7Moq4Q== - dependencies: - "@parcel/css" "^1.9.0" - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - browserslist "^4.6.6" - nullthrows "^1.1.1" - -"@parcel/transformer-html@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.6.0.tgz#47d0deed12d83ea0286baf65a87b00e47a686674" - integrity sha512-YQh5WzNFjPhgV09P+zVS++albTCTvbPYAJXp5zUJ4HavzcpV2IB3HAPRk9x+iXUeRBQYYiO5SMMRkdy9a4CzQQ== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/plugin" "2.6.0" - nullthrows "^1.1.1" - posthtml "^0.16.5" - posthtml-parser "^0.10.1" - posthtml-render "^3.0.0" - semver "^5.7.1" - -"@parcel/transformer-image@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.6.0.tgz#db754a00670dbfaaa22b372017d827e009da9513" - integrity sha512-Zkh1i6nWNOTOReKlZD+bLJCHA16dPLO6Or7ETAHtSF3iRzMNFcVFp+851Awj3l4zeJ6CoCWlyxsR4CEdioRgiQ== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/workers" "2.6.0" - nullthrows "^1.1.1" - -"@parcel/transformer-js@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.6.0.tgz#b9f297e391a7091aaf0432135cd7f6c86e76301b" - integrity sha512-4v2r3EVdMKowBziVBW9HZqvAv88HaeiezkWyMX4wAfplo9jBtWEp99KEQINzSEdbXROR81M9oJjlGF5+yoVr/w== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/utils" "2.6.0" - "@parcel/workers" "2.6.0" - "@swc/helpers" "^0.3.15" - browserslist "^4.6.6" - detect-libc "^1.0.3" - nullthrows "^1.1.1" - regenerator-runtime "^0.13.7" - semver "^5.7.1" - -"@parcel/transformer-json@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.6.0.tgz#c15fc774431bab4c7059b4013e0d1ca9b66fad5c" - integrity sha512-zb+TQAdHWdXijKcFhLe+5KN1O0IzXwW1gJhPr8DJEA3qhPaCsncsw5RCVjQlP3a7NXr1mMm1eMtO6bhIMqbXeA== - dependencies: - "@parcel/plugin" "2.6.0" - json5 "^2.2.0" - -"@parcel/transformer-postcss@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.6.0.tgz#4ff590a60fb71244bc7165326c73eaa39dc70f93" - integrity sha512-czmh2mOPJLwYbtnPTFlxKYcaQHH6huIlpfNX1XgdsaEYS+yFs8ZXpzqjxI1wu6rMW0R0q5aon72yB3PJewvqNQ== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - clone "^2.1.1" - nullthrows "^1.1.1" - postcss-value-parser "^4.2.0" - semver "^5.7.1" - -"@parcel/transformer-posthtml@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.6.0.tgz#6080b59d2de05d212fe7bfd18af5724e824bca66" - integrity sha512-R1FmPMZ0pgrbPZkDppa2pE+6KDK3Wxof6uQo7juHLB2ELGOTaYofsG3nrRdk+chyAHaVv4qWLqXbfZK6pGepEg== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - nullthrows "^1.1.1" - posthtml "^0.16.5" - posthtml-parser "^0.10.1" - posthtml-render "^3.0.0" - semver "^5.7.1" - -"@parcel/transformer-raw@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.6.0.tgz#c0648e0f788bc71a26235788edc662f303f7c91b" - integrity sha512-QDirlWCS/qy0DQ3WvDIAnFP52n1TJW/uWH+4PGMNnX4/M3/2UchY8xp9CN0tx4NQ4g09S8o3gLlHvNxQqZxFrQ== - dependencies: - "@parcel/plugin" "2.6.0" - -"@parcel/transformer-react-refresh-wrap@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.6.0.tgz#8a3c2274549189c04440562ae4d3ca17ac4a861a" - integrity sha512-G34orfvLDUTumuerqNmA8T8NUHk+R0jwUjbVPO7gpB6VCVQ5ocTABdE9vN9Uu/cUsHij40TUFwqK4R9TFEBIEQ== - dependencies: - "@parcel/plugin" "2.6.0" - "@parcel/utils" "2.6.0" - react-refresh "^0.9.0" - -"@parcel/transformer-svg-react@^2.5.0": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/transformer-svg-react/-/transformer-svg-react-2.8.2.tgz#a72c6000cbb6611aecd4bd122a3627e1e14877f4" - integrity sha512-wamjIInN9Imw+urP/mwF4ZDk+Kgl4mqRfxa9XwFS9KJ2n9UOkTjLCciC23aAlgAG5F+pqgZ9XETkPMIJz16A/Q== - dependencies: - "@parcel/plugin" "2.8.2" - "@svgr/core" "^6.2.0" - "@svgr/plugin-jsx" "^6.2.0" - "@svgr/plugin-svgo" "^6.2.0" - -"@parcel/transformer-svg@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.6.0.tgz#ca307c7309787c1b4180ae4742f33edc5fc073d0" - integrity sha512-e7yrb7775A7tEGRsAHQSMhXe+u4yisH5W0PuIzAQQy/a2IwBjaSxNnvyelN7tNX0FYq0BK6An5wRbhK4YmM+xw== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/plugin" "2.6.0" - nullthrows "^1.1.1" - posthtml "^0.16.5" - posthtml-parser "^0.10.1" - posthtml-render "^3.0.0" - semver "^5.7.1" - -"@parcel/types@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.6.0.tgz#b9b7f93edaafcb77425e231a0b4662d3c8d61900" - integrity sha512-lAMYvOBfNEJMsPJ+plbB50305o0TwNrY1xX5RRIWBqwOa6bYmbW1ZljUk1tQvnkpIE4eAHQwnPR5Z2XWg18wGQ== - dependencies: - "@parcel/cache" "2.6.0" - "@parcel/diagnostic" "2.6.0" - "@parcel/fs" "2.6.0" - "@parcel/package-manager" "2.6.0" - "@parcel/source-map" "^2.0.0" - "@parcel/workers" "2.6.0" - utility-types "^3.10.0" - -"@parcel/types@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.8.2.tgz#1a2cc2ec20a52f42dabd9260dbb912b927e2d75d" - integrity sha512-HAYhokWxM10raIhqaYj9VR9eAvJ+xP2sNfQ1IcQybHpq3qblcBe/4jDeuUpwIyKeQ4gorp7xY+q8KDoR20j43w== - dependencies: - "@parcel/cache" "2.8.2" - "@parcel/diagnostic" "2.8.2" - "@parcel/fs" "2.8.2" - "@parcel/package-manager" "2.8.2" - "@parcel/source-map" "^2.1.1" - "@parcel/workers" "2.8.2" - utility-types "^3.10.0" - -"@parcel/utils@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.6.0.tgz#d2d42635ad5b398fa21b26940868e7ff30175c07" - integrity sha512-ElXz+QHtT1JQIucbQJBk7SzAGoOlBp4yodEQVvTKS7GA+hEGrSP/cmibl6qm29Rjtd0zgQsdd+2XmP3xvP2gQQ== - dependencies: - "@parcel/codeframe" "2.6.0" - "@parcel/diagnostic" "2.6.0" - "@parcel/hash" "2.6.0" - "@parcel/logger" "2.6.0" - "@parcel/markdown-ansi" "2.6.0" - "@parcel/source-map" "^2.0.0" - chalk "^4.1.0" - -"@parcel/utils@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.8.2.tgz#7e917d2ebd5326e12e878858a416e50706bc804d" - integrity sha512-Ufax7wZxC9FNsUpR0EU7Z22LEY/q9jjsDTwswctCdfpWb7TE/NudOfM9myycfRvwBVEYN50lPbkt1QltEVnXQQ== - dependencies: - "@parcel/codeframe" "2.8.2" - "@parcel/diagnostic" "2.8.2" - "@parcel/hash" "2.8.2" - "@parcel/logger" "2.8.2" - "@parcel/markdown-ansi" "2.8.2" - "@parcel/source-map" "^2.1.1" - chalk "^4.1.0" - -"@parcel/watcher@^2.0.0", "@parcel/watcher@^2.0.7": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545" - integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw== - dependencies: - is-glob "^4.0.3" - micromatch "^4.0.5" - node-addon-api "^3.2.1" - node-gyp-build "^4.3.0" - -"@parcel/workers@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.6.0.tgz#09a53d62425d26eb1ee288371348c4dedf0347c9" - integrity sha512-3tcI2LF5fd/WZtSnSjyWdDE+G+FitdNrRgSObzSp+axHKMAM23sO0z7KY8s2SYCF40msdYbFUW8eI6JlYNJoWQ== - dependencies: - "@parcel/diagnostic" "2.6.0" - "@parcel/logger" "2.6.0" - "@parcel/types" "2.6.0" - "@parcel/utils" "2.6.0" - chrome-trace-event "^1.0.2" - nullthrows "^1.1.1" - -"@parcel/workers@2.8.2": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.8.2.tgz#7d170bd153e35ebd7fb59f239930bd5669babe7d" - integrity sha512-Eg6CofIrJSNBa2fjXwvnzVLPKwR/6fkfQTFAm3Jl+4JYLVknBtTSFzQNp/Fa+HUEG889H9ucTk2CBi/fVPBAFw== - dependencies: - "@parcel/diagnostic" "2.8.2" - "@parcel/logger" "2.8.2" - "@parcel/types" "2.8.2" - "@parcel/utils" "2.8.2" - chrome-trace-event "^1.0.2" - nullthrows "^1.1.1" - -"@rebass/forms@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@rebass/forms/-/forms-4.0.6.tgz#19a3af64f855baa65dec65aecadda5cd95a09dd7" - integrity sha512-20dHAlb5V0Na2HxCr73Jjoc4hD1ElimmlBpQtclXMoXUsjJ7ORdCNL1S9R54MX5f7iU2VrLGHU42eL7+nONNPQ== - dependencies: - reflexbox "^4.0.6" - -"@remix-run/router@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.2.1.tgz#812edd4104a15a493dda1ccac0b352270d7a188c" - integrity sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ== - -"@styled-system/background@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/background/-/background-5.1.2.tgz#75c63d06b497ab372b70186c0bf608d62847a2ba" - integrity sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/border@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/border/-/border-5.1.5.tgz#0493d4332d2b59b74bb0d57d08c73eb555761ba6" - integrity sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/color@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/color/-/color-5.1.2.tgz#b8d6b4af481faabe4abca1a60f8daa4ccc2d9f43" - integrity sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/core@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/core/-/core-5.1.2.tgz#b8b7b86455d5a0514f071c4fa8e434b987f6a772" - integrity sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw== - dependencies: - object-assign "^4.1.1" - -"@styled-system/css@^5.0.0", "@styled-system/css@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/css/-/css-5.1.5.tgz#0460d5f3ff962fa649ea128ef58d9584f403bbbc" - integrity sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A== - -"@styled-system/flexbox@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/flexbox/-/flexbox-5.1.2.tgz#077090f43f61c3852df63da24e4108087a8beecf" - integrity sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/grid@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/grid/-/grid-5.1.2.tgz#7165049877732900b99cd00759679fbe45c6c573" - integrity sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/layout@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/layout/-/layout-5.1.2.tgz#12d73e79887e10062f4dbbbc2067462eace42339" - integrity sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/position@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/position/-/position-5.1.2.tgz#56961266566836f57a24d8e8e33ce0c1adb59dd3" - integrity sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/shadow@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/shadow/-/shadow-5.1.2.tgz#beddab28d7de03cd0177a87ac4ed3b3b6d9831fd" - integrity sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/should-forward-prop@^5.0.0": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz#c392008c6ae14a6eb78bf1932733594f7f7e5c76" - integrity sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q== - dependencies: - "@emotion/is-prop-valid" "^0.8.1" - "@emotion/memoize" "^0.7.1" - styled-system "^5.1.5" - -"@styled-system/space@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/space/-/space-5.1.2.tgz#38925d2fa29a41c0eb20e65b7c3efb6e8efce953" - integrity sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/typography@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@styled-system/typography/-/typography-5.1.2.tgz#65fb791c67d50cd2900d234583eaacdca8c134f7" - integrity sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg== - dependencies: - "@styled-system/core" "^5.1.2" - -"@styled-system/variant@^5.1.5": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@styled-system/variant/-/variant-5.1.5.tgz#8446d8aad06af3a4c723d717841df2dbe4ddeafd" - integrity sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw== - dependencies: - "@styled-system/core" "^5.1.2" - "@styled-system/css" "^5.1.5" - -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== - -"@svgr/babel-plugin-remove-jsx-attribute@*": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" - integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" - integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== - -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== - -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== - -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== - -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== - -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" - -"@svgr/core@^6.2.0": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" - -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== - dependencies: - "@babel/types" "^7.20.0" - entities "^4.4.0" - -"@svgr/plugin-jsx@^6.2.0", "@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^6.2.0": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== - dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@swc/helpers@^0.3.15": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.3.17.tgz#7c1b91f43c77e2bba99492162a498d465ef253d5" - integrity sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q== - dependencies: - tslib "^2.4.0" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/clone@~2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/clone/-/clone-2.1.1.tgz#9b880d0ce9b1f209b5e0bd6d9caa38209db34024" - integrity sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg== - -"@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - -"@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/hoist-non-react-statics@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react@*", "@types/react@16 || 17 || 18": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/unist@*", "@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -abortcontroller-polyfill@^1.1.9: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - -acorn@^8.5.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -async@^2.6.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -babel-plugin-emotion@^10.0.27: - version "10.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d" - integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.16" - babel-plugin-macros "^2.0.0" - babel-plugin-syntax-jsx "^6.18.0" - convert-source-map "^1.5.0" - escape-string-regexp "^1.0.5" - find-root "^1.1.0" - source-map "^0.5.7" - -babel-plugin-macros@^2.0.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz#c81ef34b713f9da2b7d3f5550df0d1e19e798086" - integrity sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - picomatch "^2.3.0" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3, browserslist@^4.6.6: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-lite@^1.0.30001400: - version "1.0.30001443" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001443.tgz#8fc85f912d5471c9821acacf9e715c421ca0dd1f" - integrity sha512-jUo8svymO8+Mkj3qbUbVjR8zv8LUGpGkUM/jKvc9SO2BvjCI980dp9fQbf/dyLs6RascPzgR4nhAKFA4OHeSaA== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -classnames@^2.2.6: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^2.1.1, clone@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@2, commander@^2.18.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@7, commander@^7.0.0, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^1.5.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-to-react-native@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.1.0.tgz#e783474149997608986afcff614405714a8fe1ac" - integrity sha512-AryfkFA29b4I3vG7N4kxFboq15DxwSXzhXM37XNEjwJMgjYIc8BcqfiprpAqX0zadI5PMByEIwAMzXxk5Vcc4g== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^2.5.7: - version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" - integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== - -csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.1.tgz#39331ea706f5709417d31bbb6ec152e0328b39b3" - integrity sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ== - dependencies: - internmap "1 - 2" - -d3-array@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.1.1.tgz#7797eb53ead6b9083c75a45a681e93fc41bc468c" - integrity sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ== - dependencies: - internmap "1 - 2" - -"d3-color@1 - 3", d3-color@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-delaunay@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" - integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== - dependencies: - delaunator "5" - -"d3-dispatch@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -d3-dsv@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -d3-force@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-format@1 - 3", d3-format@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo-projection@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz#dc229e5ead78d31869a4e87cf1f45bd2716c48ca" - integrity sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg== - dependencies: - commander "7" - d3-array "1 - 3" - d3-geo "1.12.0 - 3" - -"d3-geo@1.12.0 - 3", d3-geo@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -d3-path@^3.0.1, d3-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - -"d3-quadtree@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-scale@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -d3-shape@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - -"d3-time-format@2 - 4", d3-time-format@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" - integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== - dependencies: - d3-array "2 - 3" - -"d3-timer@1 - 3", d3-timer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -debug@^4.0.0, debug@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - -dequal@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c" - integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g== - -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== - -email-addresses@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.1.0.tgz#cabf7e085cbdb63008a70319a74e6136188812fb" - integrity sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3, fast-deep-equal@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-patch@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" - integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== - -fast-json-stable-stringify@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== - -filenamify@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" - integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flux@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" - integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-port@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" - integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== - -gh-pages@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-3.2.3.tgz#897e5f15e111f42af57d21d430b83e5cdf29472c" - integrity sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg== - dependencies: - async "^2.6.1" - commander "^2.18.0" - email-addresses "^3.0.1" - filenamify "^4.3.0" - find-cache-dir "^3.3.1" - fs-extra "^8.1.0" - globby "^6.1.0" - -glob@^7.0.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.2.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== - dependencies: - type-fest "^0.20.2" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-to-hyperscript@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz#3decd7cb4654bca8883f6fcbd4fb3695628c4296" - integrity sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw== - dependencies: - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.3.0" - unist-util-is "^5.0.0" - web-namespaces "^2.0.0" - -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -htmlnano@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-2.0.3.tgz#50ee639ed63357d4a6c01309f52a35892e4edc2e" - integrity sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A== - dependencies: - cosmiconfig "^7.0.1" - posthtml "^0.16.5" - timsort "^0.3.0" - -htmlparser2@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" - integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.2" - domutils "^2.8.0" - entities "^3.0.1" - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -intl-messageformat@9.13.0: - version "9.13.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.13.0.tgz#97360b73bd82212e4f6005c712a4a16053165468" - integrity sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/fast-memoize" "1.2.1" - "@formatjs/icu-messageformat-parser" "2.1.0" - tslib "^2.1.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-json@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff" - integrity sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stringify-pretty-compact@^3.0.0, json-stringify-pretty-compact@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz#f71ef9d82ef16483a407869556588e91b681d9ab" - integrity sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA== - -json5@^2.2.0, json5@^2.2.1, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -lightningcss-darwin-arm64@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.18.0.tgz#bcd7d494d99c69947abd71136a42e80dfa80c682" - integrity sha512-OqjydwtiNPgdH1ByIjA1YzqvDG/OMR6L3LPN6wRl1729LB0y4Mik7L06kmZaTb+pvUHr+NmDd2KCwnlrQ4zO3w== - -lightningcss-darwin-x64@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.18.0.tgz#952abea2405fe2bb8dd0bb57a9d5590f8d1d6414" - integrity sha512-mNiuPHj89/JHZmJMp+5H8EZSt6EL5DZRWJ31O6k3DrLLnRIQjXuXdDdN8kP7LoIkeWI5xvyD60CsReJm+YWYAw== - -lightningcss-linux-arm-gnueabihf@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.18.0.tgz#23ca85e05dc4def9b4975aef307554ef292b56cd" - integrity sha512-S+25JjI6601HiAVoTDXW6SqH+E94a+FHA7WQqseyNHunOgVWKcAkNEc2LJvVxgwTq6z41sDIb9/M3Z9wa9lk4A== - -lightningcss-linux-arm64-gnu@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.18.0.tgz#6c8e0a6e2c8b44cf180f3a0f0740402e8f656155" - integrity sha512-JSqh4+21dCgBecIQUet35dtE4PhhSEMyqe3y0ZNQrAJQ5kyUPSQHiw81WXnPJcOSTTpG0TyMLiC8K//+BsFGQA== - -lightningcss-linux-arm64-musl@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.18.0.tgz#88393c101cf236ea0cdc97fddd66b82db964d835" - integrity sha512-2FWHa8iUhShnZnqhn2wfIcK5adJat9hAAaX7etNsoXJymlliDIOFuBQEsba2KBAZSM4QqfQtvRdR7m8i0I7ybQ== - -lightningcss-linux-x64-gnu@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.18.0.tgz#ad068d24836568337bfe545650565e13f813c8ee" - integrity sha512-plCPGQJtDZHcLVKVRLnQVF2XRsIC32WvuJhQ7fJ7F6BV98b/VZX0OlX05qUaOESD9dCDHjYSfxsgcvOKgCWh7A== - -lightningcss-linux-x64-musl@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.18.0.tgz#4d84de26b8185aa42450e0f4c83bbfb5a36ae750" - integrity sha512-na+BGtVU6fpZvOHKhnlA0XHeibkT3/46nj6vLluG3kzdJYoBKU6dIl7DSOk++8jv4ybZyFJ0aOFMMSc8g2h58A== - -lightningcss-win32-x64-msvc@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.18.0.tgz#f83952d16b83dfce65f4615f87c867769220d117" - integrity sha512-5qeAH4RMNy2yMNEl7e5TI6upt/7xD2ZpHWH4RkT8iJ7/6POS5mjHbXWUO9Q1hhDhqkdzGa76uAdMzEouIeCyNw== - -lightningcss@^1.14.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.18.0.tgz#ca3327a1a7571a83bbb9733ed4e4cded775bdadf" - integrity sha512-uk10tNxi5fhZqU93vtYiQgx/8a9f0Kvtj5AXIm+VlOXY+t/DWDmCZWJEkZJmmALgvbS6aAW8or+Kq85eJ6TDTw== - dependencies: - detect-libc "^1.0.3" - optionalDependencies: - lightningcss-darwin-arm64 "1.18.0" - lightningcss-darwin-x64 "1.18.0" - lightningcss-linux-arm-gnueabihf "1.18.0" - lightningcss-linux-arm64-gnu "1.18.0" - lightningcss-linux-arm64-musl "1.18.0" - lightningcss-linux-x64-gnu "1.18.0" - lightningcss-linux-x64-musl "1.18.0" - lightningcss-win32-x64-msvc "1.18.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lmdb-darwin-arm64@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.3.10.tgz#4e20f75770eeedc60af3d4630975fd105a89ffe8" - integrity sha512-LVXbH2MYu7/ZuQ8+P9rv+SwNyBKltxo7vHAGJS94HWyfwnCbKEYER9PImBvNBwzvgtaYk6x0RMX3oor6e6KdDQ== - -lmdb-darwin-x64@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb-darwin-x64/-/lmdb-darwin-x64-2.3.10.tgz#e53637a6735488eaa15feb7c0e9da142015b9476" - integrity sha512-gAc/1b/FZOb9yVOT+o0huA+hdW82oxLo5r22dFTLoRUFG1JMzxdTjmnW6ONVOHdqC9a5bt3vBCEY3jmXNqV26A== - -lmdb-linux-arm64@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb-linux-arm64/-/lmdb-linux-arm64-2.3.10.tgz#ac7db8bdfe0e9dbf2be1cc3362d6f2b79e2a9722" - integrity sha512-Ihr8mdICTK3jA4GXHxrXGK2oekn0mY6zuDSXQDNtyRSH19j3D2Y04A7SEI9S0EP/t5sjKSudYgZbiHDxRCsI5A== - -lmdb-linux-arm@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb-linux-arm/-/lmdb-linux-arm-2.3.10.tgz#74235418bbe7bf41e8ea5c9d52365c4ff5ca4b49" - integrity sha512-Rb8+4JjsThuEcJ7GLLwFkCFnoiwv/3hAAbELWITz70buQFF+dCZvCWWgEgmDTxwn5r+wIkdUjmFv4dqqiKQFmQ== - -lmdb-linux-x64@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb-linux-x64/-/lmdb-linux-x64-2.3.10.tgz#d790b95061d03c5c99a57b3ad5126f7723c60a2f" - integrity sha512-E3l3pDiCA9uvnLf+t3qkmBGRO01dp1EHD0x0g0iRnfpAhV7wYbayJGfG93BUt22Tj3fnq4HDo4dQ6ZWaDI1nuw== - -lmdb-win32-x64@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb-win32-x64/-/lmdb-win32-x64-2.3.10.tgz#bff73d12d94084343c569b16069d8d38626eb2d6" - integrity sha512-gspWk34tDANhjn+brdqZstJMptGiwj4qFNVg0Zey9ds+BUlif+Lgf5szrfOVzZ8gVRkk1Lgbz7i78+V7YK7SCA== - -lmdb@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-2.3.10.tgz#640fc60815846babcbe088d7f8ed0a51da857f6a" - integrity sha512-GtH+nStn9V59CfYeQ5ddx6YTfuFCmu86UJojIjJAweG+/Fm0PDknuk3ovgYDtY/foMeMdZa8/P7oSljW/d5UPw== - dependencies: - msgpackr "^1.5.4" - nan "^2.14.2" - node-addon-api "^4.3.0" - node-gyp-build-optional-packages "^4.3.2" - ordered-binary "^1.2.4" - weak-lru-cache "^1.2.2" - optionalDependencies: - lmdb-darwin-arm64 "2.3.10" - lmdb-darwin-x64 "2.3.10" - lmdb-linux-arm "2.3.10" - lmdb-linux-arm64 "2.3.10" - lmdb-linux-x64 "2.3.10" - lmdb-win32-x64 "2.3.10" - -lmdb@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-2.5.2.tgz#37e28a9fb43405f4dc48c44cec0e13a14c4a6ff1" - integrity sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA== - dependencies: - msgpackr "^1.5.4" - node-addon-api "^4.3.0" - node-gyp-build-optional-packages "5.0.3" - ordered-binary "^1.2.4" - weak-lru-cache "^1.2.2" - optionalDependencies: - "@lmdb/lmdb-darwin-arm64" "2.5.2" - "@lmdb/lmdb-darwin-x64" "2.5.2" - "@lmdb/lmdb-linux-arm" "2.5.2" - "@lmdb/lmdb-linux-arm64" "2.5.2" - "@lmdb/lmdb-linux-x64" "2.5.2" - "@lmdb/lmdb-win32-x64" "2.5.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash@^4.17.11, lodash@^4.17.14: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lottie-web@^5.7.6: - version "5.10.1" - resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.10.1.tgz#fde8e6be374afc3906f78b4152ada9be44ce3ccf" - integrity sha512-u17bVNf/vA3oK9Wkyb1Vpo83WUIEQwaT0GeEN0qcvaExizyJ/RjmcbjSDj0CnwQCtpGqTgYhqprCC7cTWuXMNw== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -mdast-util-definitions@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db" - integrity sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-from-markdown@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268" - integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-to-hast@^12.1.0: - version "12.2.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.5.tgz#91532ebd929a7def21585034f7901eb367d2d272" - integrity sha512-EFNhT35ZR/VZ85/EedDdCNTq0oFM+NM/+qBomVGQ0+Lcg0nhI8xIwmdCzNMlVlCJNXRprpobtKP/IUh8cfz6zQ== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-builder "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-string@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" - integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== - -micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== - -micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== - -micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.3: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -msgpackr-extract@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz#4bb749b58d9764cfdc0d91c7977a007b08e8f262" - integrity sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog== - dependencies: - node-gyp-build-optional-packages "5.0.3" - optionalDependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-arm" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-linux-x64" "2.2.0" - "@msgpackr-extract/msgpackr-extract-win32-x64" "2.2.0" - -msgpackr@^1.5.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.8.1.tgz#2298aed8a14f83e99df77d344cbda3e436f29b5b" - integrity sha512-05fT4J8ZqjYlR4QcRDIhLCYKUOHXk7C/xa62GzMKj74l3up9k2QZ3LgFc6qWdsPHl91QA2WLWqWc8b8t7GLNNw== - optionalDependencies: - msgpackr-extract "^2.2.0" - -nan@^2.14.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== - -node-addon-api@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - -node-addon-api@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== - -node-fetch@2.6.7, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build-optional-packages@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz#92a89d400352c44ad3975010368072b41ad66c17" - integrity sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA== - -node-gyp-build-optional-packages@^4.3.2: - version "4.3.5" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-4.3.5.tgz#a1de0039f81ecacecefcbb4349cdb96842343b31" - integrity sha512-5ke7D8SiQsTQL7CkHpfR1tLwfqtKc0KYEmlnkwd40jHCASskZeS98qoZ1qDUns2aUQWikcjidRUs6PM/3iyN/w== - -node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nullthrows@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -ooni-components@^0.5.0-alpha.5: - version "0.5.0-alpha.6" - resolved "https://registry.yarnpkg.com/ooni-components/-/ooni-components-0.5.0-alpha.6.tgz#dfdeba61b255829b3558568b9f6abff99aeb3587" - integrity sha512-s6pRzTGZMmyR2ef4kpD5cnsJ5Exh5nbHMy/hSLSTb3xnMSoTMDywk88ZnwWK/vhCVoDattgqrVGM9VgVH5/P/w== - dependencies: - "@rebass/forms" "^4.0.6" - react-icon-base "^2.1.2" - rebass "^4.0.7" - styled-system "^5.1.5" - -ordered-binary@^1.2.4: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.4.0.tgz#6bb53d44925f3b8afc33d1eed0fa15693b211389" - integrity sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parcel@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.6.0.tgz#801bd3af8339966fc52370033e1b7f3c9b9e457d" - integrity sha512-pSTJ7wC6uTl16PKLXQV7RfL9FGoIDA1iVpNvaav47n6UkUdKqfx0spcVPpw35kWdRcHJF61YAvkPjP2hTwHQ+Q== - dependencies: - "@parcel/config-default" "2.6.0" - "@parcel/core" "2.6.0" - "@parcel/diagnostic" "2.6.0" - "@parcel/events" "2.6.0" - "@parcel/fs" "2.6.0" - "@parcel/logger" "2.6.0" - "@parcel/package-manager" "2.6.0" - "@parcel/reporter-cli" "2.6.0" - "@parcel/reporter-dev-server" "2.6.0" - "@parcel/utils" "2.6.0" - chalk "^4.1.0" - commander "^7.0.0" - get-port "^4.2.0" - v8-compile-cache "^2.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.0, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^7.0.36: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -posthtml-parser@^0.10.1: - version "0.10.2" - resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz#df364d7b179f2a6bf0466b56be7b98fd4e97c573" - integrity sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg== - dependencies: - htmlparser2 "^7.1.1" - -posthtml-parser@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz#25d1c7bf811ea83559bc4c21c189a29747a24b7a" - integrity sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw== - dependencies: - htmlparser2 "^7.1.1" - -posthtml-render@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-3.0.0.tgz#97be44931496f495b4f07b99e903cc70ad6a3205" - integrity sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA== - dependencies: - is-json "^2.0.1" - -posthtml@^0.16.4, posthtml@^0.16.5: - version "0.16.6" - resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.16.6.tgz#e2fc407f67a64d2fa3567afe770409ffdadafe59" - integrity sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ== - dependencies: - posthtml-parser "^0.11.0" - posthtml-render "^3.0.0" - -prettier@^2.6.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.2.tgz#c4ea1b5b454d7c4b59966db2e06ed7eec5dfd160" - integrity sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -rc-progress@^3.2.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.4.1.tgz#a9ffe099e88a4fc03afb09d8603162bf0760d743" - integrity sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw== - dependencies: - "@babel/runtime" "^7.10.1" - classnames "^2.2.6" - rc-util "^5.16.1" - -rc-util@^5.16.1: - version "5.27.1" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.27.1.tgz#d12f02b9577b04299c0f1a235c8acbcf56e2824b" - integrity sha512-PsjHA+f+KBCz+YTZxrl3ukJU5RoNKoe3KSNMh0xGiISbR67NaM9E9BiMjCwxa3AcCUOg/rZ+V0ZKLSimAA+e3w== - dependencies: - "@babel/runtime" "^7.18.3" - react-is "^16.12.0" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@6.0.9: - version "6.0.9" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" - integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== - -react-hook-form@^7.31.1: - version "7.41.5" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.41.5.tgz#dcd0e7438c15044eadc99df6deb889da5858a03b" - integrity sha512-DAKjSJ7X9f16oQrP3TW2/eD9N6HOgrmIahP4LOdFphEWVfGZ2LulFd6f6AQ/YS/0cx/5oc4j8a1PXxuaurWp/Q== - -react-icon-base@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.2.tgz#a17101dad9c1192652356096860a9ab43a0766c7" - integrity sha512-NRlRo0RPxWRMQT7osj8UCBSSXsGOxhF1pre84ildhuft5S2U382NOs7tg29osWSjbO90L2a3VTCqadA/LnAzHQ== - -react-icons@^4.4.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.7.1.tgz#0f4b25a5694e6972677cb189d2a72eabea7a8345" - integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw== - -react-intl@^5.24.0: - version "5.25.1" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.25.1.tgz#68a73aefc485c9bf70062381ae7f6f4791680879" - integrity sha512-pkjdQDvpJROoXLMltkP/5mZb0/XqrqLoPGKUCfbdkP8m6U9xbK40K51Wu+a4aQqTEvEK5lHBk0fWzUV72SJ3Hg== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/icu-messageformat-parser" "2.1.0" - "@formatjs/intl" "2.2.1" - "@formatjs/intl-displaynames" "5.4.3" - "@formatjs/intl-listformat" "6.5.3" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/react" "16 || 17 || 18" - hoist-non-react-statics "^3.3.2" - intl-messageformat "9.13.0" - tslib "^2.1.0" - -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-lottie-player@^1.4.1: - version "1.5.4" - resolved "https://registry.yarnpkg.com/react-lottie-player/-/react-lottie-player-1.5.4.tgz#8205cc334d11b923d9bac78e1d19bcc0d475d751" - integrity sha512-eM0g11bAc4EJJuDDfCoNloaAYphfXlIpYnriOt4nRU66PpVmvKhajvP2aif4YflGY2ArAFXhWxs418YzdebK9w== - dependencies: - fast-deep-equal "^3.1.3" - lottie-web "^5.7.6" - rfdc "^1.3.0" - -react-refresh@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" - integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ== - -react-router-dom@6: - version "6.6.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.6.2.tgz#bbf1f9b45855b218d22fc2d294b79408a084740a" - integrity sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA== - dependencies: - "@remix-run/router" "1.2.1" - react-router "6.6.2" - -react-router@6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.6.2.tgz#556f7b56cff7fe32c5c02429fef3fcb2ecd08111" - integrity sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ== - dependencies: - "@remix-run/router" "1.2.1" - -react-spinners@^0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/react-spinners/-/react-spinners-0.13.7.tgz#0f423c415bfa56765ce9fb36ff604e52a92b37a9" - integrity sha512-mRamn56bfxWbGcacif5RT3UbeJaXi2AttjtPwSmomuv2IcxjpbfETCzdTvaQpNDk0E33ENJsStsQeKAZFuJcpA== - -react-table@^7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.8.0.tgz#07858c01c1718c09f7f1aed7034fcfd7bda907d2" - integrity sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA== - -react-textarea-autosize@^8.3.2: - version "8.4.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz#4d0244d6a50caa897806b8c44abc0540a69bfc8c" - integrity sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react-vega@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/react-vega/-/react-vega-7.6.0.tgz#b791c944046b20e02d366c7d0f8dcc21bdb4a6bb" - integrity sha512-2oMML4wH9qWLnZPRxJm06ozwrVN/K+nkjqdI5/ofWWsrBnnH4iB9rRKrsV8px0nlWgZrwfdCH4g5RUiyyJHWSA== - dependencies: - "@types/react" "*" - fast-deep-equal "^3.1.1" - prop-types "^15.8.1" - vega-embed "^6.5.1" - -"react@^16.0.0 || ^17.0.0": - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -rebass@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/rebass/-/rebass-4.0.7.tgz#0a84e5558750c1f416c3baf41ec4c7fc8d64a98a" - integrity sha512-GJot6j6Qcr7jk1QIgf9qBoud75CGRpN8pGcEo98TSp4KNSWV01ZLvGwFKGI35oEBuNs+lpEd3+pnwkQUTSFytg== - dependencies: - reflexbox "^4.0.6" - -reflexbox@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/reflexbox/-/reflexbox-4.0.6.tgz#fc756d2cc1ca493baf9b96bb27dd640ad8154cf1" - integrity sha512-UNUL4YoJEXAPjRKHuty1tuOk+LV1nDJ2KYViDcH7lYm5yU3AQ+EKNXxPU3E14bQNK/pE09b1hYl+ZKdA94tWLQ== - dependencies: - "@emotion/core" "^10.0.0" - "@emotion/styled" "^10.0.0" - "@styled-system/css" "^5.0.0" - "@styled-system/should-forward-prop" "^5.0.0" - styled-system "^5.0.0" - -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -rehype-react@^7.0.3: - version "7.1.1" - resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-7.1.1.tgz#e0403019f6dc8c434751c3dd51edf4a08fa75920" - integrity sha512-6yaitxM95JFsuTA74OH54OyvTAeRqR4/A6f45S2sEk2FEG04iGgsObcmEIFQRsjK9pfAhc74lR4iGf/W2G/sBw== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.2.0" - "@types/hast" "^2.0.0" - hast-to-hyperscript "^10.0.0" - hast-util-whitespace "^2.0.0" - unified "^10.0.0" - -remark-parse@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - -remark-rehype@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.12.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" - integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== - -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -safe-buffer@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@^5.7.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -styled-components@^5.3.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.6.tgz#27753c8c27c650bee9358e343fc927966bfd00d1" - integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -styled-system@^5.0.0, styled-system@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/styled-system/-/styled-system-5.1.5.tgz#e362d73e1dbb5641a2fd749a6eba1263dc85075e" - integrity sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A== - dependencies: - "@styled-system/background" "^5.1.2" - "@styled-system/border" "^5.1.5" - "@styled-system/color" "^5.1.2" - "@styled-system/core" "^5.1.2" - "@styled-system/flexbox" "^5.1.2" - "@styled-system/grid" "^5.1.2" - "@styled-system/layout" "^5.1.2" - "@styled-system/position" "^5.1.2" - "@styled-system/shadow" "^5.1.2" - "@styled-system/space" "^5.1.2" - "@styled-system/typography" "^5.1.2" - "@styled-system/variant" "^5.1.5" - object-assign "^4.1.1" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^2.4.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -term-size@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - -terser@^5.2.0: - version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" - integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -topojson-client@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" - integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== - dependencies: - commander "2" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== - dependencies: - escape-string-regexp "^1.0.2" - -trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - -tslib@^2.1.0, tslib@^2.4.0, tslib@~2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typescript@^4.2.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -ua-parser-js@^0.7.30: - version "0.7.34" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" - integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== - -unified@^10.0.0, unified@^10.1.1: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unist-builder@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04" - integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-generated@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113" - integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw== - -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== - -unist-util-position@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07" - integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447" - integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz#868f353e6fce6bf8fa875b251b0f4fec3be709bb" - integrity sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.1.tgz#1c4842d70bd3df6cc545276f5164f933390a9aad" - integrity sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - -v8-compile-cache@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -vega-canvas@^1.2.5, vega-canvas@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.6.tgz#55e032ce9a62acd17229f6bac66d99db3d6879cd" - integrity sha512-rgeYUpslYn/amIfnuv3Sw6n4BGns94OjjZNtUc9IDji6b+K8LGS/kW+Lvay8JX/oFqtulBp8RLcHN6QjqPLA9Q== - -vega-crossfilter@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vega-crossfilter/-/vega-crossfilter-4.1.0.tgz#b6c5a728ce987f2514074adb22cf86b9bc63e0c8" - integrity sha512-aiOJcvVpiEDIu5uNc4Kf1hakkkPaVOO5fw5T4RSFAw6GEDbdqcB6eZ1xePcsLVic1hxYD5SGiUPdiiIs0SMh2g== - dependencies: - d3-array "^3.1.1" - vega-dataflow "^5.7.3" - vega-util "^1.15.2" - -vega-dataflow@^5.7.3, vega-dataflow@^5.7.4, vega-dataflow@~5.7.4: - version "5.7.4" - resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.7.4.tgz#7cafc0a41b9d0b11dd2e34a513f8b7ca345dfd74" - integrity sha512-JGHTpUo8XGETH3b1V892we6hdjzCWB977ybycIu8DPqRoyrZuj6t1fCVImazfMgQD1LAfJlQybWP+alwKDpKig== - dependencies: - vega-format "^1.0.4" - vega-loader "^4.3.2" - vega-util "^1.16.1" - -vega-embed@^6.5.1: - version "6.21.0" - resolved "https://registry.yarnpkg.com/vega-embed/-/vega-embed-6.21.0.tgz#a6f7d4965c653e40620bfd0a51fb419321cff02c" - integrity sha512-Tzo9VAfgNRb6XpxSFd7uphSeK2w5OxDY2wDtmpsQ+rQlPSEEI9TE6Jsb2nHRLD5J4FrmXKLrTcORqidsNQSXEg== - dependencies: - fast-json-patch "^3.1.1" - json-stringify-pretty-compact "^3.0.0" - semver "^7.3.7" - tslib "^2.4.0" - vega-interpreter "^1.0.4" - vega-schema-url-parser "^2.2.0" - vega-themes "^2.10.0" - vega-tooltip "^0.28.0" - -vega-encode@~4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/vega-encode/-/vega-encode-4.9.0.tgz#3dd1031056bb8029f262afc4b4d58372c8f073a6" - integrity sha512-etv2BHuCn9bzEc0cxyA2TnbtcAFQGVFmsaqmB4sgBCaqTSEfXMoX68LK3yxBrsdm5LU+y3otJVoewi3qWYCx2g== - dependencies: - d3-array "^3.1.1" - d3-interpolate "^3.0.1" - vega-dataflow "^5.7.3" - vega-scale "^7.0.3" - vega-util "^1.15.2" - -vega-event-selector@^3.0.0, vega-event-selector@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/vega-event-selector/-/vega-event-selector-3.0.0.tgz#7b855ac0c3ddb59bc5b5caa0d96dbbc9fbd33a4c" - integrity sha512-Gls93/+7tEJGE3kUuUnxrBIxtvaNeF01VIFB2Q2Of2hBIBvtHX74jcAdDtkh5UhhoYGD8Q1J30P5cqEBEwtPoQ== - -vega-expression@^5.0.0, vega-expression@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-5.0.0.tgz#938f26689693a1e0d26716030cdaed43ca7abdfb" - integrity sha512-y5+c2frq0tGwJ7vYXzZcfVcIRF/QGfhf2e+bV1Z0iQs+M2lI1II1GPDdmOcMKimpoCVp/D61KUJDIGE1DSmk2w== - dependencies: - "@types/estree" "^0.0.50" - vega-util "^1.16.0" - -vega-force@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vega-force/-/vega-force-4.1.0.tgz#cc8dea972baa52adc60840ff744ebb9e57d8f1f5" - integrity sha512-Sssf8iH48vYlz+E7/RpU+SUaJbuLoIL87U4tG2Av4gf/hRiImU49x2TI3EuhFWg1zpaCFxlz0CAaX++Oh/gjdw== - dependencies: - d3-force "^3.0.0" - vega-dataflow "^5.7.3" - vega-util "^1.15.2" - -vega-format@^1.0.4, vega-format@^1.1.0, vega-format@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vega-format/-/vega-format-1.1.0.tgz#b9d81cf1bcf222ae5cbd94357ae70245d2c7b18d" - integrity sha512-6mgpeWw8yGdG0Zdi8aVkx5oUrpJGOpNxqazC2858RSDPvChM/jDFlgRMTYw52qk7cxU0L08ARp4BwmXaI75j0w== - dependencies: - d3-array "^3.1.1" - d3-format "^3.1.0" - d3-time-format "^4.1.0" - vega-time "^2.0.3" - vega-util "^1.15.2" - -vega-functions@^5.12.1, vega-functions@^5.13.0, vega-functions@~5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/vega-functions/-/vega-functions-5.13.0.tgz#c9ab8c6eedbf39f75b424cca6776b1d0b8c74b32" - integrity sha512-Mf53zNyx+c9fFqagEI0T8zc9nMlx0zozOngr8oOpG1tZDKOgwOnUgN99zQKbLHjyv+UzWrq3LYTnSLyVe0ZmhQ== - dependencies: - d3-array "^3.1.1" - d3-color "^3.0.1" - d3-geo "^3.0.1" - vega-dataflow "^5.7.3" - vega-expression "^5.0.0" - vega-scale "^7.2.0" - vega-scenegraph "^4.9.3" - vega-selections "^5.3.1" - vega-statistics "^1.7.9" - vega-time "^2.1.0" - vega-util "^1.16.0" - -vega-geo@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/vega-geo/-/vega-geo-4.4.0.tgz#ce792df57f8ca4c54a7a1a29467cfa24bc53f573" - integrity sha512-3YX41y+J5pu0PMjvBCASg0/lgvu9+QXWJZ+vl6FFKa8AlsIopQ67ZL7ObwqjZcoZMolJ4q0rc+ZO8aj1pXCYcw== - dependencies: - d3-array "^3.1.1" - d3-color "^3.0.1" - d3-geo "^3.0.1" - vega-canvas "^1.2.5" - vega-dataflow "^5.7.3" - vega-projection "^1.4.5" - vega-statistics "^1.7.9" - vega-util "^1.15.2" - -vega-hierarchy@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vega-hierarchy/-/vega-hierarchy-4.1.0.tgz#605edbe3a6232853f9e8b57e3b905471d33b1a48" - integrity sha512-DWBK39IEt4FiQru12twzKSFUvFFZ7KtlH9+lAaqrJnKuIZFCyQ1XOUfKScfbKIlk4KS+DuCTNLI/pxC/f7Sk9Q== - dependencies: - d3-hierarchy "^3.1.0" - vega-dataflow "^5.7.3" - vega-util "^1.15.2" - -vega-interpreter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vega-interpreter/-/vega-interpreter-1.0.4.tgz#291ebf85bc2d1c3550a3da22ff75b3ba0d326a39" - integrity sha512-6tpYIa/pJz0cZo5fSxDSkZkAA51pID2LjOtQkOQvbzn+sJiCaWKPFhur8MBqbcmYZ9bnap1OYNwlrvpd2qBLvg== - -vega-label@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vega-label/-/vega-label-1.2.0.tgz#bcb2659aec54f890f9debab3e41ab87a58292dce" - integrity sha512-1prOqkCAfXaUvMqavbGI0nbYGqV8UQR9qvuVwrPJ6Yxm3GIUIOA/JRqNY8eZR8USwMP/kzsqlfVEixj9+Y75VQ== - dependencies: - vega-canvas "^1.2.6" - vega-dataflow "^5.7.3" - vega-scenegraph "^4.9.2" - vega-util "^1.15.2" - -vega-lite@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/vega-lite/-/vega-lite-5.6.0.tgz#0f0adfc8b86f5eea071df186b2877d828c870c11" - integrity sha512-aTjQk//SzL9ctHY4ItA8yZSGflHMWPJmCXEs8LeRlixuOaAbamZmeL8xNMbQpS/vAZQeFAqjcJ32Fuztz/oGww== - dependencies: - "@types/clone" "~2.1.1" - clone "~2.1.2" - fast-deep-equal "~3.1.3" - fast-json-stable-stringify "~2.1.0" - json-stringify-pretty-compact "~3.0.0" - tslib "~2.4.0" - vega-event-selector "~3.0.0" - vega-expression "~5.0.0" - vega-util "~1.17.0" - yargs "~17.6.0" - -vega-loader@^4.3.2, vega-loader@^4.4.0, vega-loader@~4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.5.0.tgz#b15acc4c8f84191f500e94d35ddfb9721ac943ad" - integrity sha512-EkAyzbx0pCYxH3v3wghGVCaKINWxHfgbQ2pYDiYv0yo8e04S8Mv/IlRGTt6BAe7cLhrk1WZ4zh20QOppnGG05w== - dependencies: - d3-dsv "^3.0.1" - node-fetch "^2.6.7" - topojson-client "^3.1.0" - vega-format "^1.1.0" - vega-util "^1.16.0" - -vega-parser@~6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-6.1.4.tgz#4868e41af2c9645b6d7daeeb205cfad06b9d465c" - integrity sha512-tORdpWXiH/kkXcpNdbSVEvtaxBuuDtgYp9rBunVW9oLsjFvFXbSWlM1wvJ9ZFSaTfx6CqyTyGMiJemmr1QnTjQ== - dependencies: - vega-dataflow "^5.7.3" - vega-event-selector "^3.0.0" - vega-functions "^5.12.1" - vega-scale "^7.1.1" - vega-util "^1.16.0" - -vega-projection@^1.4.5, vega-projection@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.5.0.tgz#51c5f0455170cd35b3c5f3e653e99c3616520640" - integrity sha512-aob7qojh555x3hQWZ/tr8cIJNSWQbm6EoWTJaheZgFOY2x3cDa4Qrg3RJbGw6KwVj/IQk2p40paRzixKZ2kr+A== - dependencies: - d3-geo "^3.0.1" - d3-geo-projection "^4.0.0" - -vega-regression@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.1.0.tgz#b4394db403ada93de52bb4536d04be336c983a8c" - integrity sha512-09K0RemY6cdaXBAyakDUNFfEkRcLkGjkDJyWQPAUqGK59hV2J+G3i4uxkZp18Vu0t8oqU7CgzwWim1s5uEpOcA== - dependencies: - d3-array "^3.1.1" - vega-dataflow "^5.7.3" - vega-statistics "^1.7.9" - vega-util "^1.15.2" - -vega-runtime@^6.1.3, vega-runtime@~6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/vega-runtime/-/vega-runtime-6.1.3.tgz#01e18246f7a80cee034a96017ac30113b92c4034" - integrity sha512-gE+sO2IfxMUpV0RkFeQVnHdmPy3K7LjHakISZgUGsDI/ZFs9y+HhBf8KTGSL5pcZPtQsZh3GBQ0UonqL1mp9PA== - dependencies: - vega-dataflow "^5.7.3" - vega-util "^1.15.2" - -vega-scale@^7.0.3, vega-scale@^7.1.1, vega-scale@^7.2.0, vega-scale@~7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-7.2.0.tgz#9e298cc02ad340498cb56847436b19439911f0fc" - integrity sha512-QYltO/otrZHLrCGGf06Y99XtPtqWXITr6rw7rO9oL+l3d9o5RFl9sjHrVxiM7v+vGoZVWbBd5IPbFhPsXZ6+TA== - dependencies: - d3-array "^3.1.1" - d3-interpolate "^3.0.1" - d3-scale "^4.0.2" - vega-time "^2.1.0" - vega-util "^1.17.0" - -vega-scenegraph@^4.10.0, vega-scenegraph@^4.9.2, vega-scenegraph@^4.9.3, vega-scenegraph@~4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.10.1.tgz#944da67b8a28758fab2e1306259fb7ff6be89f6b" - integrity sha512-takIpkmNxYHhJYALOYzhTin3EDzbys6U4g+l1yJZVlXG9YTdiCMuEVAdtaQOCqF9/7qytD6pCrMxJY2HaoN0qQ== - dependencies: - d3-path "^3.0.1" - d3-shape "^3.1.0" - vega-canvas "^1.2.5" - vega-loader "^4.4.0" - vega-scale "^7.2.0" - vega-util "^1.15.2" - -vega-schema-url-parser@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz#a0d1e02915adfbfcb1fd517c8c2ebe2419985c1e" - integrity sha512-yAtdBnfYOhECv9YC70H2gEiqfIbVkq09aaE4y/9V/ovEFmH9gPKaEgzIZqgT7PSPQjKhsNkb6jk6XvSoboxOBw== - -vega-selections@^5.3.1: - version "5.4.0" - resolved "https://registry.yarnpkg.com/vega-selections/-/vega-selections-5.4.0.tgz#c2783897421fa39b674c015fa8f15a0023b8054e" - integrity sha512-Un3JdLDPjIpF9Dh4sw6m1c/QAcfam6m1YXHJ9vJxE/GdJ+sOrPxc7bcEU8VhOmTUN7IQUn4/1ry4JqqOVMbEhw== - dependencies: - d3-array "3.1.1" - vega-expression "^5.0.0" - vega-util "^1.16.0" - -vega-statistics@^1.7.9, vega-statistics@^1.8.0, vega-statistics@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.8.0.tgz#ad66f7461473d58bc96671588981a059ffd60b59" - integrity sha512-dl+LCRS6qS4jWDme/NEdPVt5r649uB4IK6Kyr2/czmGA5JqjuFmtQ9lHQOnRu8945XLkqLf+JIQQo7vnw+nslA== - dependencies: - d3-array "^3.1.1" - -vega-themes@^2.10.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/vega-themes/-/vega-themes-2.12.0.tgz#1005f67d64795ce239becc1005a605ee07a52e71" - integrity sha512-gHNYCzDgexSQDmGzQsxH57OYgFVbAOmvhIYN3MPOvVucyI+zhbUawBVIVNzG9ftucRp0MaaMVXi6ctC5HLnBsg== - -vega-time@^2.0.3, vega-time@^2.1.0, vega-time@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/vega-time/-/vega-time-2.1.0.tgz#acfbab88d7798b87ff63913b0dce2ca5eb0d46ca" - integrity sha512-Q9/l3S6Br1RPX5HZvyLD/cQ4K6K8DtpR09/1y7D66gxNorg2+HGzYZINH9nUvN3mxoXcBWg4cCUh3+JvmkDaEg== - dependencies: - d3-array "^3.1.1" - d3-time "^3.0.0" - vega-util "^1.15.2" - -vega-tooltip@^0.28.0: - version "0.28.0" - resolved "https://registry.yarnpkg.com/vega-tooltip/-/vega-tooltip-0.28.0.tgz#8bae2601ffae5e67622de37108f53f284e9a978b" - integrity sha512-DbK0V5zzk+p9cphZZXV91ZGeKq0zr6JIS0VndUoGTisldzw4tRgmpGQcTfMjew53o7/voeTM2ELTnJAJRzX4tg== - dependencies: - vega-util "^1.17.0" - -vega-transforms@~4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.10.0.tgz#a1017ede13cf4e25499f588610a3be4da615d82d" - integrity sha512-Yk6ByzVq5F2niFfPlSsrU5wi+NZhsF7IBpJCcTfms4U7eoyNepUXagdFEJ3VWBD/Lit6GorLXFgO17NYcyS5gg== - dependencies: - d3-array "^3.1.1" - vega-dataflow "^5.7.4" - vega-statistics "^1.8.0" - vega-time "^2.1.0" - vega-util "^1.16.1" - -vega-typings@~0.22.0: - version "0.22.3" - resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.22.3.tgz#f6c73b5ffcdb152539cfcc5ad240a413af579ba7" - integrity sha512-PREcya3nXT9Tk7xU0IhEpOLVTlqizNtKXV55NhI6ApBjJtqVYbJL7IBh2ckKxGBy3YeUQ37BQZl56UqqiYVWBw== - dependencies: - vega-event-selector "^3.0.0" - vega-expression "^5.0.0" - vega-util "^1.15.2" - -vega-util@^1.15.2, vega-util@^1.16.0, vega-util@^1.16.1, vega-util@^1.17.0, vega-util@~1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.17.0.tgz#b72ae0baa97f943bf591f8f5bb27ceadf06834ac" - integrity sha512-HTaydZd9De3yf+8jH66zL4dXJ1d1p5OIFyoBzFiOli4IJbwkL1jrefCKz6AHDm1kYBzDJ0X4bN+CzZSCTvNk1w== - -vega-view-transforms@~4.5.8: - version "4.5.8" - resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.5.8.tgz#c8dc42c3c7d4aa725d40b8775180c9f23bc98f4e" - integrity sha512-966m7zbzvItBL8rwmF2nKG14rBp7q+3sLCKWeMSUrxoG+M15Smg5gWEGgwTG3A/RwzrZ7rDX5M1sRaAngRH25g== - dependencies: - vega-dataflow "^5.7.3" - vega-scenegraph "^4.9.2" - vega-util "^1.15.2" - -vega-view@~5.11.0: - version "5.11.0" - resolved "https://registry.yarnpkg.com/vega-view/-/vega-view-5.11.0.tgz#8a7b29a36776e43cc6599e087ed7f48a918b805d" - integrity sha512-MI9NTRFmtFX6ADk6KOHhi8bhHjC9pPm42Bj2+74c6l1d3NQZf9Jv7lkiGqKohdkQDNH9LPwz/6slhKwPU9JdkQ== - dependencies: - d3-array "^3.1.1" - d3-timer "^3.0.1" - vega-dataflow "^5.7.3" - vega-format "^1.1.0" - vega-functions "^5.13.0" - vega-runtime "^6.1.3" - vega-scenegraph "^4.10.0" - vega-util "^1.16.1" - -vega-voronoi@~4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vega-voronoi/-/vega-voronoi-4.2.0.tgz#14c74c84f52d9a16be2facd1bede879d32d988f2" - integrity sha512-1iuNAVZgUHRlBpdq4gSga3KlQmrgFfwy+KpyDgPLQ8HbLkhcVeT7RDh2L6naluqD7Op0xVLms3clR920WsYryQ== - dependencies: - d3-delaunay "^6.0.2" - vega-dataflow "^5.7.3" - vega-util "^1.15.2" - -vega-wordcloud@~4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/vega-wordcloud/-/vega-wordcloud-4.1.3.tgz#ce90900333f4e0d3ee706ba4f36bb0905f8b4a9f" - integrity sha512-is4zYn9FMAyp9T4SAcz2P/U/wqc0Lx3P5YtpWKCbOH02a05vHjUQrQ2TTPOuvmMfAEDCSKvbMSQIJMOE018lJA== - dependencies: - vega-canvas "^1.2.5" - vega-dataflow "^5.7.3" - vega-scale "^7.1.1" - vega-statistics "^1.7.9" - vega-util "^1.15.2" - -vega@^5.22.1: - version "5.22.1" - resolved "https://registry.yarnpkg.com/vega/-/vega-5.22.1.tgz#e028f3645de18e0070317bc04410282975549e1e" - integrity sha512-KJBI7OWSzpfCPbmWl3GQCqBqbf2TIdpWS0mzO6MmWbvdMhWHf74P9IVnx1B1mhg0ZTqWFualx9ZYhWzMMwudaQ== - dependencies: - vega-crossfilter "~4.1.0" - vega-dataflow "~5.7.4" - vega-encode "~4.9.0" - vega-event-selector "~3.0.0" - vega-expression "~5.0.0" - vega-force "~4.1.0" - vega-format "~1.1.0" - vega-functions "~5.13.0" - vega-geo "~4.4.0" - vega-hierarchy "~4.1.0" - vega-label "~1.2.0" - vega-loader "~4.5.0" - vega-parser "~6.1.4" - vega-projection "~1.5.0" - vega-regression "~1.1.0" - vega-runtime "~6.1.3" - vega-scale "~7.2.0" - vega-scenegraph "~4.10.1" - vega-statistics "~1.8.0" - vega-time "~2.1.0" - vega-transforms "~4.10.0" - vega-typings "~0.22.0" - vega-util "~1.17.0" - vega-view "~5.11.0" - vega-view-transforms "~4.5.8" - vega-voronoi "~4.2.0" - vega-wordcloud "~4.1.3" - -vfile-message@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.3.tgz#1360c27a99234bebf7bddbbbca67807115e6b0dd" - integrity sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^5.0.0: - version "5.3.6" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.6.tgz#61b2e70690cc835a5d0d0fd135beae74e5a39546" - integrity sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -weak-lru-cache@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" - integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== - -web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -xxhash-wasm@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz#752398c131a4dd407b5132ba62ad372029be6f79" - integrity sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@~17.6.0: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" diff --git a/oonipipeline/src/oonipipeline/dataviz/templates/analysis.html b/oonipipeline/src/oonipipeline/dataviz/templates/analysis.html index 8b801e61..a3e84264 100644 --- a/oonipipeline/src/oonipipeline/dataviz/templates/analysis.html +++ b/oonipipeline/src/oonipipeline/dataviz/templates/analysis.html @@ -20,8 +20,7 @@
    -

    OONI Data Kraken Analysis

    -

    When data krakens and LoNIs join forces!

    +

    Analysis viewer

    @@ -126,8 +125,11 @@

    Experiment result

    Individual LoNIs

    + +
    {% for loni in loni_list %} -
    +
    +

    Loni #{{loop.index}}

    ok_final: {{loni["ok_final"]}}
    @@ -166,71 +168,60 @@

    Loni #{{loop.index}}

    Analysis transcript

    -
    +            
      {% for analysis_line in analysis_transcript_list[loop.index0] %} -{{ analysis_line }} +
    • {{ analysis_line }}
    • {% endfor %} -
    +
    +
    {% endfor %} - +

    Analysis output

    - -{% for wa in web_analysis %} -
    -
    -

    Analysis #{{loop.index}}

    -
    - +
    - - + {% for key in web_analysis[0].keys() %} + + {% endfor %} - - {% for key, value in wa.items() %} - - - + + {% for wa in web_analysis %} + + {% for value in wa.values() %} + + {% endfor %} {% endfor %}
    keyvalue{{ key }}
    {{key}}{{value}}
    {{value}}
    -
    -
    -{% endfor %}

    Web Observations

    -{% for wo in web_observations %} -
    -
    -

    Observation #{{loop.index}}

    - +
    - - + {% for key in web_observations[0].keys() %} + + {% endfor %} - - {% for key, value in wo.items() %} - - - + + {% for wo in web_observations %} + + {% for value in wo.values() %} + + {% endfor %} {% endfor %}
    keyvalue{{ key }}
    {{key}}{{value}}
    {{value}}
    -
    -
    -
    -{% endfor %} +

    Experiment results raw

    diff --git a/oonipipeline/src/oonipipeline/dataviz/templates/observations.html b/oonipipeline/src/oonipipeline/dataviz/templates/observations.html new file mode 100644 index 00000000..dd66ecd0 --- /dev/null +++ b/oonipipeline/src/oonipipeline/dataviz/templates/observations.html @@ -0,0 +1,89 @@ + + + + + + + + + + +
    +
    +
    +
    +

    Observations viewer

    +
    +
    +
    + +
    + +

    Web Observations

    +
    + + + + {% for key in web_observations[0].keys() %} + + {% endfor %} + + + + {% for wo in web_observations %} + + {% for value in wo.values() %} + + {% endfor %} + + {% endfor %} + +
    {{ key }}
    {{value}}
    +
    + +

    Web Control Observations

    +
    + + + + {% for key in web_control_observations[0].keys() %} + + {% endfor %} + + + + {% for wo in web_control_observations %} + + {% for value in wo.values() %} + + {% endfor %} + + {% endfor %} + +
    {{ key }}
    {{value}}
    +
    + +

    Measurement Meta

    +
    + {% for key, value in measurement_meta.items() %} +
    +
    {{ key }}
    +
    {{ value }}
    +
    + {% endfor %} +
    + +

    Probe Meta

    +
    + {% for key, value in probe_meta.items() %} +
    +
    {{ key }}
    +
    {{ value }}
    +
    + {% endfor %} +
    + +
    + + + diff --git a/oonipipeline/src/oonipipeline/dataviz/templates/react.html b/oonipipeline/src/oonipipeline/dataviz/templates/react.html deleted file mode 100644 index fae496c6..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/templates/react.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - OONI Data Viz - - - {% block css %}{% endblock %} - - - -
    - - {% block js %}{% endblock %} - - - diff --git a/oonipipeline/src/oonipipeline/dataviz/templates/redirect.html b/oonipipeline/src/oonipipeline/dataviz/templates/redirect.html new file mode 100644 index 00000000..fdfc0a05 --- /dev/null +++ b/oonipipeline/src/oonipipeline/dataviz/templates/redirect.html @@ -0,0 +1,43 @@ + + + + + + + + + + +
    + +
    +
    +

    {{ scope }}: enter measurement UID

    +
    +

    You will be redirected to the relevant {{ scope }} page.

    +
    +
    +
    + + +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/oonipipeline/src/oonipipeline/dataviz/templates/vega.html b/oonipipeline/src/oonipipeline/dataviz/templates/vega.html deleted file mode 100644 index ab592e4d..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/templates/vega.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - -
    - - - - - diff --git a/oonipipeline/src/oonipipeline/dataviz/viz.py b/oonipipeline/src/oonipipeline/dataviz/viz.py deleted file mode 100644 index c15bac8e..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/viz.py +++ /dev/null @@ -1,1055 +0,0 @@ -# This is currently enabled due to: https://github.com/altair-viz/altair/pull/2681 -# type: ignore - -import numpy as np -import pandas as pd -import altair as alt - -from .theme import OONI_COLOR_SCHEME -from .utils import click_query - -from urllib.parse import urlparse -import requests - -world_100m = requests.get( - "https://cdn.jsdelivr.net/npm/vega-datasets@v1.29.0/data/world-110m.json" -).json() -alt_data_world_110m = alt.Data( - values=world_100m, format={"type": "topojson", "feature": "countries"} -) - -country_centers = pd.read_csv( - "https://raw.githubusercontent.com/albertyw/avenews/master/old/data/average-latitude-longitude-countries.csv" -) -country_centers = country_centers[ - ["ISO 3166 Country Code", "Latitude", "Longitude"] -].set_index("ISO 3166 Country Code") - -country_meta = pd.read_json( - "https://raw.githubusercontent.com/ooni/country-util/master/data/country-list.json" -) -country_meta = country_meta[["name", "iso3166_alpha2", "iso3166_num"]].set_index( - "iso3166_alpha2" -) - -citizenlab_global_tl = pd.read_csv( - "https://raw.githubusercontent.com/citizenlab/test-lists/master/lists/global.csv" -) -citizenlab_global_tl["domain_name"] = citizenlab_global_tl["url"].apply( - lambda x: urlparse(x).netloc -) - - -def get_df_dns_analysis_raw( - measurement_uid, start_day="2023-01-01", end_day="2023-01-02" -): - params = { - "start_day": start_day, - "end_day": end_day, - "measurement_uid": measurement_uid, - } - q = """ - SELECT * FROM ( - SELECT - report_id, - input, - measurement_uid, - probe_cc, - probe_asn, - probe_as_org_name, - measurement_start_time, - resolver_ip, - resolver_asn, - resolver_cc, - resolver_as_org_name, - resolver_as_cc, - resolver_is_scrubbed, - resolver_asn_probe, - resolver_as_org_name_probe, - dns_engine_resolver_address, - dns_engine, - dns_query_type, - hostname, - any(dns_failure) as exp_dns_failure, - any(ip_is_bogon) OR 0 as exp_answer_contains_bogon, - any(ip_as_cc = probe_cc) OR 0 as exp_answer_contains_matching_probe_cc, - any(dns_answer_asn = probe_asn) OR 0 as exp_answer_contains_matching_probe_asn, - any(lower(ip_as_org_name) = lower(probe_as_org_name)) OR 0 as exp_answer_contains_matching_probe_as_org_name, - groupArrayIf( - tuple(dns_answer, dns_answer_asn, dns_answer_as_org_name, ip_as_cc), - dns_answer IS NOT NULL - ) as dns_answers - FROM obs_web - WHERE - measurement_start_time > %(start_day)s - AND measurement_start_time < %(end_day)s - AND measurement_uid = %(measurement_uid)s - AND test_name = 'web_connectivity' - AND (dns_answer IS NOT NULL OR dns_failure IS NOT NULL) - GROUP BY report_id, - input, - measurement_uid, - probe_cc, - probe_asn, - probe_as_org_name, - measurement_start_time, - resolver_ip, - resolver_asn, - resolver_cc, - resolver_as_org_name, - resolver_as_cc, - resolver_is_scrubbed, - resolver_asn_probe, - resolver_as_org_name_probe, - dns_engine_resolver_address, - dns_engine, hostname, dns_query_type -) as exp -LEFT JOIN ( - SELECT - hostname, - answers, - failure_asns, - nxdomain_asns, - ok_asns, - ctrl_answers, - ctrl_failures - FROM ( - SELECT - hostname, - - groupArrayIf(tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns), dns_answer IS NOT NULL) as answers, - - anyIf(failure_asns, dns_answer IS NULL) as failure_asns, - - anyIf(nxdomain_asns, dns_answer IS NULL) as nxdomain_asns, - - arrayReduce('groupUniqArray', arrayFlatten(groupUniqArray(answer_asns))) as ok_asns - FROM ( - SELECT - hostname, - dns_answer, - ip_as_org_name, - ip_asn, - groupUniqArrayIf(tuple(probe_cc, probe_asn), tls_is_certificate_valid = 1) as tls_consistent_asns, - groupUniqArrayIf(tuple(probe_cc, probe_asn), dns_failure IS NULL) as answer_asns, - groupUniqArrayIf(tuple(probe_cc, probe_asn), dns_failure IS NOT NULL) as failure_asns, - groupUniqArrayIf(tuple(probe_cc, probe_asn), dns_failure = 'dns_nxdomain_error') as nxdomain_asns - FROM obs_web - WHERE - measurement_start_time > %(start_day)s - AND measurement_start_time < %(end_day)s - AND (dns_answer IS NOT NULL OR dns_failure IS NOT NULL) - GROUP BY hostname, dns_answer, ip_as_org_name, ip_asn - ) GROUP BY hostname - ) as obs - FULL OUTER JOIN ( - SELECT - hostname, - groupUniqArrayIf(tuple(ip, ip_count), dns_failure IS NULL) as ctrl_answers, - groupArrayIf(tuple(dns_failure, failure_count), dns_failure IS NOT NULL) as ctrl_failures - FROM ( - SELECT - hostname, - ip, - COUNT() as ip_count, - dns_failure, - COUNT() as failure_count - FROM obs_web_ctrl - WHERE - measurement_start_time > %(start_day)s - AND measurement_start_time < %(end_day)s - AND ( - dns_success = 1 - OR dns_failure IS NOT NULL - ) - GROUP BY hostname, ip, dns_failure - ) GROUP BY hostname - ) as ctrl - USING hostname -) as dns_gt -USING hostname - """ - return click_query(q, **params) - - -def get_df_dns_analysis(start_day="2023-01-01", end_day="2023-01-02", limit=100): - params = {"start_day": start_day, "end_day": end_day} - q = """WITH -arrayDistinct(arrayMap(x -> x.1, exp.dns_answers)) as exp_dns_answers_ips, -arrayDistinct(arrayMap(x -> x.2, exp.dns_answers)) as exp_dns_answers_asns, -arrayDistinct(arrayMap(x -> lower(x.3), exp.dns_answers)) as exp_dns_answers_as_org_names, - --- tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns) -flatten(arrayMap( - asn -> arrayFilter( - y -> y.3 IS NOT NULL AND asn IS NOT NULL AND assumeNotNull(y.3) = assumeNotNull(asn), - dns_gt.answers - ), - exp_dns_answers_asns -)) as dns_answers_asn_match, - --- tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns) -arrayMap( - x -> tuple( - x.1, - x.2, - x.3, - -- all answers_asns, except probe_asn - arrayFilter( - y -> y.1 != exp.probe_cc OR y.2 != exp.probe_asn, - x.4 - ), - -- all tls_consistent_asns, except probe_asn - arrayFilter( - y -> y.1 != exp.probe_cc OR y.2 != exp.probe_asn, - x.5 - ) - ), - dns_answers_asn_match -) as dns_answers_asn_match_no_asn, - -arrayMap( - x -> tuple( - x.2, - x.3, - length(x.4), - length(x.5) - ), dns_answers_asn_match_no_asn -) as dns_answers_asn_match_no_asn_counts_tup, - --- dns_answers in the ground_truth that match the AS ORG name of the answers in the experiment --- tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns) -flatten(arrayMap( - asorgname -> arrayFilter( - y -> y.2 IS NOT NULL AND asorgname IS NOT NULL AND lower(assumeNotNull(y.2)) = lower(assumeNotNull(asorgname)), - dns_gt.answers - ), - exp_dns_answers_as_org_names -)) as dns_answers_as_org_name_match, - --- filter the sub-lists in the answers to exclude the ones from the VP of the probe --- tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns) -arrayMap( - x -> tuple( - x.1, -- dns_answer - x.2, -- ip_as_org_name - x.3, -- ip_asn - -- all answers_asns, except probe_asn - arrayFilter( - y -> y.1 != exp.probe_cc OR y.2 != exp.probe_asn, - x.4 - ), - -- all tls_consistent_asns, except probe_asn - arrayFilter( - y -> y.1 != exp.probe_cc OR y.2 != exp.probe_asn, - x.5 - ) - ), - dns_answers_as_org_name_match -) as dns_answers_as_org_name_match_no_asn, - --- tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns) -arrayMap( - ip -> arrayFirst( - y -> y.1 IS NOT NULL AND ip IS NOT NULL AND assumeNotNull(y.1) = assumeNotNull(ip), - dns_gt.answers - ), - exp_dns_answers_ips -) as dns_answers_match, - --- tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns) -arrayMap( - x -> tuple( - x.1, -- dns_answer - x.2, -- ip_as_org_name - x.3, -- ip_asn - -- all answers_asns, except probe_asn - arrayFilter( - y -> y.1 != exp.probe_cc OR y.2 != exp.probe_asn, - x.4 - ), - -- all tls_consistent_asns, except probe_asn - arrayFilter( - y -> y.1 != exp.probe_cc OR y.2 != exp.probe_asn, - x.5 - ) - ), - dns_answers_match -) as dns_answers_match_no_asn, - -arrayMap( - x -> tuple( - x.2, -- ip_as_org_name - x.3, -- ip_asn - length(x.4), -- all_answers - length(x.5) -- tls_consistent - ), dns_answers_match_no_asn -) as dns_answers_match_no_asn_counts_tup, - -arrayFilter( - x -> indexOf(exp_dns_answers_asns, x.2) != 0, - dns_answers_asn_match_no_asn_counts_tup -) as dns_answer_matching_asn, - -arrayFilter( - x -> indexOf(exp_dns_answers_as_org_names, lower(x.1)) != 0, - dns_answers_as_org_name_match_no_asn_counts_tup -) as dns_answer_matching_as_org_name, - -arrayMap( - x -> tuple( - x.2, -- ip_as_org_name - x.3, -- ip_asn - length(x.4), - length(x.5) - ), dns_answers_as_org_name_match_no_asn -) as dns_answers_as_org_name_match_no_asn_counts_tup - - -SELECT - exp.report_id, - exp.input, - exp.measurement_uid, - exp.probe_cc, - exp.probe_asn, - exp.measurement_start_time, - exp.resolver_ip, - exp.resolver_asn, - exp.resolver_cc, - exp.resolver_as_org_name, - exp.resolver_as_cc, - exp.resolver_is_scrubbed, - exp.resolver_asn_probe, - exp.resolver_as_org_name_probe, - exp.dns_engine_resolver_address, - exp.dns_engine, - exp.hostname, - exp.exp_dns_failure, - - -- tuple(dns_answer, dns_answer_asn, dns_answer_as_org_name) - exp.dns_answers as exp_dns_answers, - - length(exp_dns_answers) as exp_dns_answers_count, - exp.exp_answer_contains_bogon, - - exp.exp_answer_contains_matching_probe_cc, - exp.exp_answer_contains_matching_probe_asn, - exp.exp_answer_contains_matching_probe_as_org_name, - - arraySum(arrayMap(x -> length(x.4), dns_gt.answers)) as dns_answers_all_asn_count, - - arraySum( - arrayMap( - x -> x.3, - dns_answers_match_no_asn_counts_tup - ) - ) as dns_answers_ip_match_all_count, - - --dns_answers_asn_match_tls_consistent_include_probe_count, - --dns_answers_as_org_name_match_tls_consistent_include_probe_count, - - arraySum( - arrayMap( - x -> x.4, - dns_answers_match_no_asn_counts_tup - ) - ) as dns_answers_ip_match_tls_consistent_count, - - arraySum( - arrayMap( - x -> length(x.5), - dns_answers_match - ) - ) as dns_answers_ip_match_tls_consistent_include_probe_count, - - arraySum( - arrayMap( - x -> x.2, - arrayFilter( - x -> indexOf(exp_dns_answers_ips, x.1) != 0, - dns_gt.ctrl_answers - ) - ) - ) as dns_answers_ip_match_ctrl_count, - - arraySum( - arrayMap( - x -> x.3, - dns_answer_matching_asn - ) - ) as dns_answers_asn_match_all_count, - - arraySum( - arrayMap( - x -> x.4, - dns_answer_matching_asn - ) - ) as dns_answers_asn_match_tls_consistent_count, - - arraySum( - arrayMap( - x -> x.3, - dns_answer_matching_as_org_name - ) - ) as dns_answers_as_org_name_match_all_count, - - arraySum( - arrayMap( - x -> x.4, - dns_answer_matching_as_org_name - ) - ) as dns_answers_as_org_name_match_tls_consistent_count, - - -- tuple(probe_cc, probe_asn) - --dns_gt.failure_asns, - - length(arrayFilter( - x -> x.1 != exp.probe_cc OR x.2 != exp.probe_asn, - dns_gt.failure_asns - )) as failure_asn_count, - - -- tuple(probe_cc, probe_asn) - --dns_gt.nxdomain_asns, - - -- All ASNS with NXDOMAIN != (probe_cc, probe_asn) - length(arrayFilter( - x -> x.1 != exp.probe_cc OR x.2 != exp.probe_asn, - dns_gt.nxdomain_asns - )) as nxdomain_asn_count, - - -- tuple(probe_cc, probe_asn) - --dns_gt.ok_asns, - - -- All ASNS with NXDOMAIN != (probe_cc, probe_asn) - length(arrayFilter( - x -> x.1 != exp.probe_cc OR x.2 != exp.probe_asn, - dns_gt.ok_asns - )) as ok_asn_count, - - -- tuple(ip, ip_count) - --dns_gt.ctrl_answers, - - -- tuple(dns_failure, failure_count) - --dns_gt.ctrl_failures, - - --dns_answers_ip_match_ctrl_count, - --ctrl_failures_count - - - arraySum( - arrayMap( - x -> x.2, - arrayFilter( - x -> exp_dns_failure IS NOT NULL AND x.1 = exp_dns_failure, - dns_gt.ctrl_failures - ) - ) - ) as ctrl_matching_failures_count, - - arraySum( - arrayMap( - x -> x.2, - arrayFilter( - x -> x.1 IS NOT NULL, - dns_gt.ctrl_failures - ) - ) - ) as ctrl_failure_count - -FROM ( - SELECT - report_id, - input, - measurement_uid, - probe_cc, - probe_asn, - probe_as_org_name, - measurement_start_time, - resolver_ip, - resolver_asn, - resolver_cc, - resolver_as_org_name, - resolver_as_cc, - resolver_is_scrubbed, - resolver_asn_probe, - resolver_as_org_name_probe, - dns_engine_resolver_address, - dns_engine, - dns_query_type, - hostname, - any(dns_failure) as exp_dns_failure, - any(ip_is_bogon) OR 0 as exp_answer_contains_bogon, - any(ip_as_cc = probe_cc) OR 0 as exp_answer_contains_matching_probe_cc, - any(dns_answer_asn = probe_asn) OR 0 as exp_answer_contains_matching_probe_asn, - any(lower(ip_as_org_name) = lower(probe_as_org_name)) OR 0 as exp_answer_contains_matching_probe_as_org_name, - groupArrayIf( - tuple(dns_answer, dns_answer_asn, dns_answer_as_org_name, ip_as_cc), - dns_answer IS NOT NULL - ) as dns_answers - FROM obs_web - WHERE - measurement_start_time > %(start_day)s - AND measurement_start_time < %(end_day)s - AND test_name = 'web_connectivity' - AND (dns_answer IS NOT NULL OR dns_failure IS NOT NULL) - GROUP BY report_id, - input, - measurement_uid, - probe_cc, - probe_asn, - probe_as_org_name, - measurement_start_time, - resolver_ip, - resolver_asn, - resolver_cc, - resolver_as_org_name, - resolver_as_cc, - resolver_is_scrubbed, - resolver_asn_probe, - resolver_as_org_name_probe, - dns_engine_resolver_address, - dns_engine, hostname, dns_query_type -) as exp -LEFT JOIN ( - SELECT - hostname, - answers, - failure_asns, - nxdomain_asns, - ok_asns, - ctrl_answers, - ctrl_failures - FROM ( - SELECT - hostname, - - groupArrayIf(tuple(dns_answer, ip_as_org_name, ip_asn, answer_asns, tls_consistent_asns), dns_answer IS NOT NULL) as answers, - - anyIf(failure_asns, dns_answer IS NULL) as failure_asns, - - anyIf(nxdomain_asns, dns_answer IS NULL) as nxdomain_asns, - - arrayReduce('groupUniqArray', arrayFlatten(groupUniqArray(answer_asns))) as ok_asns - FROM ( - SELECT - hostname, - dns_answer, - ip_as_org_name, - ip_asn, - groupUniqArrayIf(tuple(probe_cc, probe_asn), tls_is_certificate_valid = 1) as tls_consistent_asns, - groupUniqArrayIf(tuple(probe_cc, probe_asn), dns_failure IS NULL) as answer_asns, - groupUniqArrayIf(tuple(probe_cc, probe_asn), dns_failure IS NOT NULL) as failure_asns, - groupUniqArrayIf(tuple(probe_cc, probe_asn), dns_failure = 'dns_nxdomain_error') as nxdomain_asns - FROM obs_web - WHERE - measurement_start_time > %(start_day)s - AND measurement_start_time < %(end_day)s - AND (dns_answer IS NOT NULL OR dns_failure IS NOT NULL) - GROUP BY hostname, dns_answer, ip_as_org_name, ip_asn - ) GROUP BY hostname - ) as obs - FULL OUTER JOIN ( - SELECT - hostname, - groupUniqArrayIf(tuple(ip, ip_count), dns_failure IS NULL) as ctrl_answers, - groupArrayIf(tuple(dns_failure, failure_count), dns_failure IS NOT NULL) as ctrl_failures - FROM ( - SELECT - hostname, - ip, - COUNT() as ip_count, - dns_failure, - COUNT() as failure_count - FROM obs_web_ctrl - WHERE - measurement_start_time > %(start_day)s - AND measurement_start_time < %(end_day)s - AND ( - dns_success = 1 - OR dns_failure IS NOT NULL - ) - GROUP BY hostname, ip, dns_failure - ) GROUP BY hostname - ) as ctrl - USING hostname -) as dns_gt -USING hostname - """ - if limit > 0: - params["limit"] = limit - q += "LIMIT %(limit)d" - - return click_query(q, **params) - - -def get_df_blocking_of_domain_by_asn( - domain_name, probe_cc, start_time="2022-11-03", end_time="2022-12-03" -): - q_args = { - "domain_name": domain_name, - "probe_cc": probe_cc, - "start_time": start_time, - "end_time": end_time, - } - - df = click_query( - """ - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - any(max_blocked) as max_blocked, - any(max_blocked_label) as blocked_label, - any(max_down) as max_down, - any(max_down_label) as down_label, - any(max_ok) as max_ok, - - (max_blocked / (max_ok + max_down + max_blocked)) as blocked, - (max_down / (max_ok + max_down + max_blocked)) as down, - (max_ok / (max_ok + max_down + max_blocked)) as ok, - SUM(cnt) as count - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - max(ema_avg_blocked) OVER (PARTITION BY probe_cc, probe_asn, domain_name) as max_blocked, - any(outcome_label) OVER (PARTITION BY probe_cc, probe_asn, domain_name ORDER BY ema_avg_blocked DESC) as max_blocked_label, - max(ema_avg_down) OVER (PARTITION BY probe_cc, probe_asn, domain_name) as max_down, - any(outcome_label) OVER (PARTITION BY probe_cc, probe_asn, domain_name ORDER BY ema_avg_down DESC) as max_down_label, - max(ema_avg_down) OVER (PARTITION BY probe_cc, probe_asn, domain_name) as max_down, - max(IF(outcome_category == 'http' OR outcome_category == 'https', ema_avg_ok, 0)) OVER (PARTITION BY probe_cc, probe_asn, domain_name) as max_ok, - cnt - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - outcome_category, - outcome_detail, - outcome_label, - avgWeighted(ema_blocked, cnt) OVER (PARTITION BY probe_cc, probe_asn, domain_name, outcome_category) as ema_avg_blocked, - avgWeighted(ema_down, cnt) OVER (PARTITION BY probe_cc, probe_asn, domain_name, outcome_category) as ema_avg_down, - avgWeighted(ema_ok, cnt) OVER (PARTITION BY probe_cc, probe_asn, domain_name, outcome_category) as ema_avg_ok, - cnt - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - outcome_category, - outcome_detail, - IF(outcome_category = 'ok', 'ok', concat(outcome_category, '.', outcome_detail)) as outcome_label, - exponentialMovingAverage(1)(blocked_score, t) as ema_blocked, - exponentialMovingAverage(1)(down_score, t) as ema_down, - exponentialMovingAverage(1)(ok_score, t) as ema_ok, - toFloat64(Count()) as cnt - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - outcome_category, - IF(startsWith(outcome_detail, 'failure.unknown_failure') OR startsWith(outcome_detail, 'unknown_failure'), - 'failure.unknown', - outcome_detail - ) as outcome_detail, - blocked_score, - ok_score, - down_score, - row_number() OVER (PARTITION BY domain_name, probe_asn, outcome_category, outcome_detail) as t - FROM experiment_result - WHERE timestamp > %(start_time)s AND timestamp < %(end_time)s - AND domain_name = %(domain_name)s AND probe_cc = %(probe_cc)s - ) GROUP BY probe_cc, probe_asn, probe_as_org_name, domain_name, outcome_category, outcome_detail - ) - ) - ) GROUP BY probe_cc, probe_asn, probe_as_org_name, domain_name - """, - **q_args, - ) - return df[ - [ - "domain_name", - "probe_cc", - "probe_asn", - "probe_as_org_name", - "blocked_label", - "down_label", - "count", - "ok", - "blocked", - "down", - ] - ].melt( - [ - "domain_name", - "probe_cc", - "probe_asn", - "probe_as_org_name", - "blocked_label", - "down_label", - "count", - ], - var_name="stat", - value_name="stat_value", - ) - - -def plot_blocking_of_domain_by_asn( - df=None, - domain_name=None, - probe_cc=None, - start_time="2022-11-03", - end_time="2022-12-03", -): - if df is None: - df = get_df_blocking_of_domain_by_asn( - domain_name, probe_cc, start_time=start_time, end_time=end_time - ) - - color_scale = alt.Scale( - domain=["blocked", "down", "ok"], - range=[ - OONI_COLOR_SCHEME["red7"], - OONI_COLOR_SCHEME["orange6"], - OONI_COLOR_SCHEME["green8"], - ], - ) - - base_chart = ( - alt.Chart(df) - .mark_bar() - .encode( - y=alt.Y("probe_asn:O", axis=alt.Axis(labels=False, title=None)), - ) - ) - - bars = base_chart.encode( - x="stat_value:Q", - color=alt.Color("stat", scale=color_scale, title="status"), - tooltip=[ - alt.Tooltip("probe_as_org_name:N", title="Network name"), - alt.Tooltip("probe_asn:N", title="ASN"), - alt.Tooltip("stat_value:Q", title="value"), - alt.Tooltip("blocked_label:N", title="blocked_label"), - alt.Tooltip("down_label:N", title="down_label"), - alt.Tooltip("count:Q", title="count"), - ], - order=alt.Order("stat_value", sort="descending"), - ) - - text = ( - base_chart.mark_text( - align="center", - ) - .transform_filter( - "indexof(datum.blocked_label, 'ok') == -1 & datum.stat == 'blocked'" - ) - .encode(color=alt.value(OONI_COLOR_SCHEME["gray9"]), text="blocked_label:N") - ) - - bar_count = base_chart.encode( - y=alt.Y("probe_asn:O", axis=alt.Axis(labels=True, title="ASN")), - x="count:Q", - ).properties(width=30) - - return alt.hconcat(bar_count, (bars + text)).properties( - title=f"Blocking of {domain_name} in {probe_cc} by ASN" - ) - - -def get_df_blocking_of_domain_in_asn( - domain_name, - probe_cc, - probe_asn, - start_time="2022-11-03", - end_time="2022-12-03", -): - q_args = { - "domain_name": domain_name, - "probe_cc": probe_cc, - "probe_asn": probe_asn, - "start_time": start_time, - "end_time": end_time, - } - return click_query( - """ - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - outcome_category, - outcome_detail, - IF(outcome_category = 'ok', 'ok', concat(outcome_category, '.', outcome_detail)) as outcome_label, - exponentialMovingAverage(1)(blocked_score, t) as ema_blocked, - exponentialMovingAverage(1)(down_score, t) as ema_down, - exponentialMovingAverage(1)(ok_score, t) as ema_ok, - toFloat64(Count()) as cnt - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - probe_as_org_name, - outcome_category, - IF(startsWith(outcome_detail, 'failure.unknown_failure') OR startsWith(outcome_detail, 'unknown_failure'), - 'failure.unknown', - outcome_detail - ) as outcome_detail, - blocked_score, - ok_score, - down_score, - row_number() OVER (PARTITION BY domain_name, probe_asn, outcome_category, outcome_detail) as t - FROM experiment_result - WHERE timestamp > %(start_time)s AND timestamp < %(end_time)s - AND domain_name = %(domain_name)s AND probe_cc = %(probe_cc)s - AND probe_asn = %(probe_asn)d - ) GROUP BY probe_cc, probe_asn, probe_as_org_name, domain_name, outcome_category, outcome_detail - """, - **q_args, - ) - - -def plot_blocking_of_domain_in_asn( - df=None, - data_name=None, - domain_name=None, - probe_cc=None, - probe_asn=None, - start_time="2022-11-03", - end_time="2022-12-03", -): - if df is None and data_name: - df = alt.NamedData(data_name) - - if df is None: - df = get_df_blocking_of_domain_in_asn( - domain_name=domain_name, - probe_cc=probe_cc, - probe_asn=probe_asn, - start_time=start_time, - end_time=end_time, - ) - - return ( - alt.Chart(df) - .mark_bar() - .encode( - x=alt.X("outcome_detail:O", title=None), - y=alt.Y("cnt:Q", title="Count"), - color=alt.Color( - "ema_blocked:Q", scale=alt.Scale(scheme="redyellowgreen", reverse=True) - ), - tooltip=[ - alt.Tooltip("cnt:N", title="Measurement count"), - alt.Tooltip("outcome_label:N", title="Outcome"), - alt.Tooltip("ema_blocked:Q", title="Blocked EMA"), - alt.Tooltip("ema_ok:Q", title="OK EMA"), - alt.Tooltip("ema_down:Q", title="Down EMA"), - ], - ) - .properties(height=250) - .facet( - column=alt.Column( - "outcome_category:N", - sort=["dns", "tcp", "tls", "https", "http"], - title=None, - ), - ) - .resolve_scale(x="independent") - .properties( - title=f"{domain_name} in AS{probe_asn} ({probe_cc}) from {start_time} to {end_time}" - ) - ) - - -def get_df_blocking_world_map(blocking_threshold=0.7): - q_args = {"blocking_threshold": blocking_threshold} - df = click_query( - """SELECT - probe_cc, - CountIf(max_blocked > %(blocking_threshold)f) as blocked_asns, - CountIf(max_ok > 0.5) as ok_asns, - domain_name - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - any(max_blocked) as max_blocked, - any(max_blocked_label) as max_blocked_label, - any(max_down) as max_down, - any(max_down_label) as max_down_label, - arrayMax([0, 1 - max_blocked - max_down]) as max_ok, - COUNT() - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - max(ema_avg_blocked) OVER (PARTITION BY probe_cc, probe_asn, domain_name) as max_blocked, - any(outcome_label) OVER (PARTITION BY probe_cc, probe_asn, domain_name ORDER BY ema_avg_blocked DESC) as max_blocked_label, - max(ema_avg_down) OVER (PARTITION BY probe_cc, probe_asn, domain_name) as max_down, - any(outcome_label) OVER (PARTITION BY probe_cc, probe_asn, domain_name ORDER BY ema_avg_down DESC) as max_down_label - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - outcome_category, - outcome_detail, - outcome_label, - avgWeighted(ema_blocked, cnt) OVER (PARTITION BY probe_cc, probe_asn, domain_name, outcome_category) as ema_avg_blocked, - avgWeighted(ema_down, cnt) OVER (PARTITION BY probe_cc, probe_asn, domain_name, outcome_category) as ema_avg_down, - avgWeighted(ema_ok, cnt) OVER (PARTITION BY probe_cc, probe_asn, domain_name, outcome_category) as ema_avg_ok - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - outcome_category, - outcome_detail, - IF(outcome_category = 'ok', 'ok', concat(outcome_category, '.', outcome_detail)) as outcome_label, - exponentialMovingAverage(1)(blocked_score, t) as ema_blocked, - exponentialMovingAverage(1)(down_score, t) as ema_down, - exponentialMovingAverage(1)(ok_score, t) as ema_ok, - toFloat64(Count()) as cnt - FROM ( - SELECT - domain_name, - probe_cc, - probe_asn, - outcome_category, - IF(startsWith(outcome_detail, 'failure.unknown_failure') OR startsWith(outcome_detail, 'unknown_failure'), - 'failure.unknown', - outcome_detail - ) as outcome_detail, - blocked_score, - ok_score, - down_score, - row_number() OVER (PARTITION BY domain_name, probe_asn, outcome_category, outcome_detail) as t - FROM experiment_result - WHERE timestamp > '2022-11-03' AND timestamp < '2022-12-03' - ) GROUP BY probe_cc, probe_asn, domain_name, outcome_category, outcome_detail - ) - ) - ) GROUP BY probe_cc, probe_asn, domain_name - ) GROUP BY probe_cc, domain_name - """, - **q_args, - ) - df_blocked_cat = df[df["blocked_asns"] > 0].merge( - citizenlab_global_tl[["category_code", "category_description", "domain_name"]], - how="left", - on="domain_name", - ) - df_final = ( - df_blocked_cat[(~df_blocked_cat["category_code"].isnull())] - .join(country_centers, on="probe_cc") - .join(country_meta, on="probe_cc") - ) - df_final.loc[:, "asn_blocking_perc"] = df_final["blocked_asns"] / ( - df_final["blocked_asns"] + df_final["ok_asns"] - ) - return df_final - - -def plot_blocking_world_map(df=None, data_name=None, blocking_threshold=0.7): - if df is None and data_name: - df = alt.NamedData(data_name) - - if df is None: - df = get_df_blocking_world_map(blocking_threshold=blocking_threshold) - - world_background = alt.Chart(alt_data_world_110m).mark_geoshape( - fill="lightgray", stroke="white" - ) - - world_foreground = ( - alt.Chart(df) - .transform_filter((alt.datum.asn_blocking_perc > 0.2)) - .transform_aggregate( - blocked_sites_in_cat="distinct(domain_name)", - groupby=[ - "probe_cc", - "category_code", - "name", - "Latitude", - "Longitude", - "iso3166_num", - ], - ) - .transform_joinaggregate( - blocked_sites="sum(blocked_sites_in_cat)", - blocked_categories="count()", - blocked_category_array="values(category_code)", - groupby=["probe_cc"], - ) - .transform_calculate( - blocked_category_names="pluck(datum.blocked_category_array, 'category_code')", - ) - .transform_lookup( - lookup="iso3166_num", - from_=alt.LookupData(alt_data_world_110m, "id"), - as_="geom", - default="Other", - ) - .transform_calculate(geometry="datum.geom.geometry", type="datum.geom.type") - .mark_geoshape() - .encode( - color=alt.Color( - "blocked_categories:Q", - scale=alt.Scale(scheme="reds"), - ), - tooltip=[ - alt.Tooltip("name:N", title="Country"), - alt.Tooltip("blocked_categories:Q", title="blocked_categories"), - alt.Tooltip("blocked_sites:Q", title="blocked_sites"), - alt.Tooltip("blocked_category_names:N", title="blocked_category_names"), - ], - ) - ) - - circles = ( - alt.Chart(df) - .transform_filter((alt.datum.asn_blocking_perc > 0.2)) - .transform_aggregate( - blocked_sites_in_cat="distinct(domain_name)", - groupby=["probe_cc", "category_code", "name", "Latitude", "Longitude"], - ) - .transform_joinaggregate( - blocked_sites="sum(blocked_sites_in_cat)", - blocked_categories="count()", - blocked_category_array="values(category_code)", - groupby=["probe_cc"], - ) - .transform_calculate( - blocked_category_names="pluck(datum.blocked_category_array, 'category_code')", - ) - .mark_circle() - .encode( - latitude="Latitude:Q", - longitude="Longitude:Q", - size=alt.Size("blocked_sites:Q", title="blocked_sites"), - tooltip=[ - alt.Tooltip("name:N", title="Country"), - alt.Tooltip("blocked_categories:Q", title="blocked_categories"), - alt.Tooltip("blocked_sites:Q", title="blocked_sites"), - alt.Tooltip("blocked_category_names:N", title="blocked_category_names"), - ], - ) - ) - - return ( - (world_background + world_foreground + circles) - .configure_view(strokeWidth=0) - .properties(width=900, height=600) - .project("naturalEarth1") - ) diff --git a/oonipipeline/src/oonipipeline/dataviz/web.py b/oonipipeline/src/oonipipeline/dataviz/web.py deleted file mode 100644 index 7cb342a7..00000000 --- a/oonipipeline/src/oonipipeline/dataviz/web.py +++ /dev/null @@ -1,201 +0,0 @@ -from dataclasses import asdict -import json -from pathlib import Path - -from flask import Flask, request, render_template - -from oonidata.dataclient import load_measurement -from oonidata.apiclient import get_measurement_dict_by_uid - -from ..analysis.control import ( - BodyDB, - WebGroundTruthDB, - iter_ground_truths_from_web_control, -) -from ..analysis.web_analysis import make_web_analysis -from ..analysis.website_experiment_results import make_website_experiment_results - -from .viz import ( - plot_blocking_world_map, - plot_blocking_of_domain_in_asn, - plot_blocking_of_domain_by_asn, -) -from .viz import ( - get_df_blocking_world_map, - get_df_blocking_of_domain_in_asn, - get_df_blocking_of_domain_by_asn, - get_df_dns_analysis, - get_df_dns_analysis_raw, -) -from ..fingerprintdb import FingerprintDB -from ..netinfo import NetinfoDB - -from ..transforms.observations import measurement_to_observations - -app = Flask(__name__) - - -def to_pretty_json(value): - return json.dumps( - value, sort_keys=True, indent=4, separators=(",", ": "), default=str - ) - - -app.jinja_env.filters["tojson_pretty"] = to_pretty_json - - -@app.route("/analysis/m/") -def analysis_by_msmt(measurement_uid): - data_dir = Path("tests/data/datadir/") - - fingerprintdb = FingerprintDB(datadir=data_dir, download=False) - netinfodb = NetinfoDB(datadir=data_dir, download=False) - raw_msmt = get_measurement_dict_by_uid(measurement_uid) - msmt = load_measurement(msmt=raw_msmt) - web_observations, web_control_observations = measurement_to_observations( - msmt, netinfodb=netinfodb - ) - web_ground_truth_db = WebGroundTruthDB() - web_ground_truth_db.build_from_rows( - rows=iter_ground_truths_from_web_control( - web_control_observations=web_control_observations, - netinfodb=netinfodb, - ), - ) - - web_ground_truths = web_ground_truth_db.lookup_by_web_obs(web_obs=web_observations) - web_analysis = list( - make_web_analysis( - web_observations=web_observations, - web_ground_truths=web_ground_truths, - body_db=BodyDB(db=None), # type: ignore - fingerprintdb=fingerprintdb, - ) - ) - - # assert len(web_analysis) == len( - # web_observations - # ), f"web_analysis != web_obs {len(web_analysis)} != {len(web_observations)}" - # for wa in web_analysis: - # print_nice_vertical(wa) - - website_er = list(make_website_experiment_results(web_analysis)) - assert len(website_er) == 1 - - wer = website_er[0] - analysis_transcript_list = wer.analysis_transcript_list - - # wer.analysis_transcript_list = None - # print_nice_vertical(wer) - # for loni in loni_list: - # pprint(loni.to_dict()) - # print(analysis_transcript_list) - - return render_template( - "analysis.html", - website_experiment_result=asdict(wer), - analysis_transcript_list=analysis_transcript_list, - loni_list=wer.loni_list, - raw_msmt=raw_msmt, - measurement_uid=measurement_uid, - web_analysis=list(map(lambda x: asdict(x), web_analysis)), - web_observations=list(map(lambda x: asdict(x), web_observations)), - loni_blocked_dict=dict(zip(wer.loni_blocked_keys, wer.loni_blocked_values)), - loni_blocked_value=sum(wer.loni_blocked_values), - loni_down_dict=dict(zip(wer.loni_down_keys, wer.loni_down_values)), - loni_down_value=sum(wer.loni_down_values), - loni_ok_value=wer.loni_ok_value, - ) - - -@app.route("/api/_/viz/data/world_map") -def data_world_map(): - blocking_threshold = float(request.args.get("blocking_threshold", 0.7)) - return get_df_blocking_world_map(blocking_threshold=blocking_threshold).to_json( - orient="records" - ) - - -@app.route("/api/_/viz/chart/world_map") -def chart_world_map(): - return plot_blocking_world_map(data_name="data").to_json() - - -@app.route("/viz/world_map") -def viz_world_map(): - return render_template("vega.html", endpoint="chart_world_map") - - -@app.route("/api/_/viz/data/blocking_of_domain_in_asn") -def data_blocking_of_domain_in_asn(): - return get_df_blocking_of_domain_in_asn( - domain_name=request.args.get("domain_name", None), - probe_cc=request.args.get("probe_cc", None), - probe_asn=int(request.args.get("probe_asn", 0)), - start_time=request.args.get("start_time", "2022-11-03"), - end_time=request.args.get("start_time", "2022-12-03"), - ).to_json(orient="records") - - -@app.route("/api/_/viz/chart/blocking_of_domain_in_asn") -def chart_blocking_of_domain_in_asn(): - return plot_blocking_of_domain_in_asn( - domain_name=request.args.get("domain_name", None), - probe_cc=request.args.get("probe_cc", None), - probe_asn=int(request.args.get("probe_asn", 0)), - start_time=request.args.get("start_time", "2022-11-03"), - end_time=request.args.get("start_time", "2022-12-03"), - ).to_json() - - -@app.route("/viz/blocking_of_domain_in_asn") -def viz_blocking_of_domain_in_asn(): - return render_template( - "vega.html", - endpoint="chart_blocking_of_domain_in_asn", - query_args=request.args.to_dict(), - ) - - -@app.route("/api/_/viz/chart/blocking_of_domain_by_asn") -def chart_blocking_of_domain_by_asn(): - return plot_blocking_of_domain_by_asn( - domain_name=request.args.get("domain_name", None), - probe_cc=request.args.get("probe_cc", None), - start_time=request.args.get("start_time", "2022-11-03"), - end_time=request.args.get("start_time", "2022-12-03"), - ).to_json() - - -@app.route("/viz/blocking_of_domain_by_asn") -def viz_blocking_of_domain_by_asn(): - return render_template( - "vega.html", - endpoint="chart_blocking_of_domain_by_asn", - query_args=request.args.to_dict(), - ) - - -@app.route("/api/_/data/dns_analysis") -def data_dns_analysis(): - return get_df_dns_analysis( - start_day="2023-01-01", end_day="2023-01-02", limit=100 - ).to_json(orient="records") - - -@app.route("/api/_/data/dns_analysis_raw") -def data_dns_analysis_raw(): - return get_df_dns_analysis_raw( - measurement_uid=request.args["measurement_uid"], - start_day="2023-01-01", - end_day="2023-01-02", - ).to_json(orient="records") - - -@app.route("/") -def index(): - return render_template("react.html") - - -if __name__ == "__main__": - app.run(debug=True) diff --git a/oonipipeline/src/oonipipeline/temporal/to_port/response_archiver.py b/oonipipeline/src/oonipipeline/temporal/to_port/response_archiver.py index f40688e5..9547342c 100644 --- a/oonipipeline/src/oonipipeline/temporal/to_port/response_archiver.py +++ b/oonipipeline/src/oonipipeline/temporal/to_port/response_archiver.py @@ -25,7 +25,7 @@ from oonidata.dataclient import date_interval, iter_measurements, load_measurement from oonidata.models.nettests.web_connectivity import WebConnectivity -from ..fingerprintdb import FingerprintDB, Fingerprint +from ...fingerprintdb import FingerprintDB, Fingerprint log = logging.getLogger("oonidata.processing")