diff --git a/marimo/stylus.py b/marimo/stylus.py
new file mode 100644
index 0000000..5b66564
--- /dev/null
+++ b/marimo/stylus.py
@@ -0,0 +1,1461 @@
+import marimo
+
+__generated_with = "0.16.2"
+app = marimo.App(width="full")
+
+
+@app.cell
+def setup_pyoso():
+ # This code sets up pyoso to be used as a database provider for this notebook
+ # This code is autogenerated. Modification could lead to unexpected results :)
+ import pyoso
+ import marimo as mo
+ client = pyoso.Client()
+ pyoso_db_conn = client.dbapi_connection()
+ return client, mo
+
+
+@app.cell
+def about_app(mo):
+ mo.vstack([
+ mo.md("""
+ # Stylus SDK Developer Ecosystem
+ Author: OSO Team · Last Updated: 2025-09-25
+ """)
+ ])
+ return
+
+
+@app.cell
+def create_overview_tab(
+ dev_funnel_stats,
+ ecosystem_stats,
+ mo,
+ sdk_stats,
+ stylus_sprint_stats,
+):
+ _intro = mo.vstack([
+ mo.md("## Overview"),
+ mo.Html("""
+ Stylus Sprint is a 5M ARB initiative supporting projects building with
+ Stylus — a WASM-based virtual machine that lets developers write smart
+ contracts in Rust, C, C++, and other WebAssembly-compatible languages.
+ The long-term objective is to attract non-Solidity developers to build
+ on Arbitrum.
+ """),
+ ])
+
+ _stats = mo.vstack([
+ mo.md("### Selected Metrics"),
+ mo.md("#### Stylus Sprint Teams"),
+ stylus_sprint_stats,
+ mo.md("#### Stylus SDK Usage"),
+ sdk_stats,
+ mo.md("#### Ecosystem Benchmarks"),
+ ecosystem_stats,
+ mo.md("#### Stylus Developer Funnel"),
+ dev_funnel_stats,
+ ])
+
+ _resources = mo.vstack([
+ mo.md("### Further Resources"),
+ mo.accordion({
+ "Data": """
+ - [OSO API](https://docs.opensource.observer/docs/get-started/python) - GitHub metrics and developer activity data
+ - [Electric Capital Crypto Ecosystems](https://github.com/electric-capital/crypto-ecosystems) - Ecosystem repository data
+ - [Open Source Insights (aka deps.dev)](https://deps.dev) - SDK usage and adoption metrics
+ - [GH Archive](https://www.gharchive.org/) - a public archive of historical events to GitHub
+ """,
+ "Docs": """
+ - [Stylus Sprint Announcement](https://blog.arbitrum.io/stylus-sprint/) - More info on Stylus
+ - [Project Velocity Definition](https://chaoss.community/kb/metric-project-velocity/) - We use the CHAOSS metric for "velocity"
+ - [How to Add/Update OSO Project Info](https://docs.google.com/document/d/1bOjjHiaY-8bx5d_Bwce4ePDYq3H7W8r_3Wq0dJCyLoA/edit?tab=t.0) - Steps for Stylus Sprint projects
+ - [Getting Started with Pyoso](https://docs.opensource.observer/docs/get-started/python) - Run your own queries
+ - [Marimo Documentation](https://docs.marimo.io/) - Make your own dashboard on OSO
+ """,
+ "Caveats": """
+ - We can only see developer activity on *public* GitHub repos. We are not able to identify teams using Stylus in private repos.
+ - We don't have visibility into the very top of the developer funnel. For instance, we are unable to capture how many developers
+ have read the docs or browsed the use case examples.
+ - We rely on Electric Capital's Crypto Ecosystems registry for comparing Arbitrum to other ecosystems. The registry is
+ community-maintained and not always accurate / up-to-date for new projects.
+ - We are not yet linking developer activity to onchain activity. We currently do not have a robust way of distinguishing
+ between developers who are tinkering on personal projects and ones who are using Stylus in a high-value application.
+ """
+ }, multiple=True)
+ ])
+
+ overview_tab = mo.vstack([
+ _intro,
+ _stats,
+ _resources
+ ])
+ return (overview_tab,)
+
+
+@app.cell
+def create_stylus_sprint_tab(
+ SPRINT_START_DATE,
+ df_stylus_project_metrics,
+ df_stylus_sdk_deps_project_metrics,
+ make_joyplot,
+ mo,
+ pd,
+ sprint_velocity_change,
+ summarize_monthly_metrics,
+):
+ _df = df_stylus_project_metrics[df_stylus_project_metrics['metric_name'] == 'GITHUB_project_velocity_daily']
+ _mm = summarize_monthly_metrics(df_stylus_project_metrics, num_months=6)
+
+ _project_applications = pd.read_csv("https://raw.githubusercontent.com/rohitmalekar/stylus-dashboard/refs/heads/main/data/project_applications.csv")
+ _df_projects = pd.merge(_project_applications, _df[['display_name', 'project_name']].drop_duplicates(), on='project_name', how='left')
+ _ossd_base_url = 'https://github.com/opensource-observer/oss-directory/tree/main/data/projects'
+ _df_projects['OSS Directory URL'] = _df_projects['project_name'].apply(lambda x: f"{_ossd_base_url}/{x[0]}/{x}.yaml")
+ _df_projects['Using Stylus SDK?'] = _df_projects['project_name'].apply(lambda x: x in df_stylus_sdk_deps_project_metrics['project_name'].unique())
+ _df_projects.rename(columns={
+ 'questbook_title': 'Grant Name',
+ 'display_name': 'Team Name',
+ 'questbook_link': 'Questbook URL'
+ }, inplace=True)
+ _df_projects = _df_projects[['Grant Name', 'Team Name', 'Using Stylus SDK?', 'Questbook URL', 'OSS Directory URL']]
+ _df_projects.sort_values(by='Grant Name', inplace=True)
+
+ # Calculate Stylus Sprint stats
+ _total_budget = 5_000_000
+ _total_grants = len(_df_projects)
+ _active_devs = _mm['Active Developers'].sum()
+ _change_in_velocity = sprint_velocity_change(
+ df=df_stylus_project_metrics,
+ metric_name="GITHUB_project_velocity_weekly",
+ sprint_start=SPRINT_START_DATE
+ )
+
+ stylus_sprint_stats = mo.hstack(
+ items=[
+ mo.stat(
+ label="Total Budget",
+ bordered=True,
+ value=f"{_total_budget:,.0f} ARB",
+ caption="Approved by the Arbitrum DAO"
+ ),
+ mo.stat(
+ label="Approved Grants",
+ bordered=True,
+ value=f"{_total_grants:,.0f}",
+ caption="Teams with grants awarded by the Stylus Sprint program"
+ ),
+ mo.stat(
+ label="Active Developers with Stylus Grant",
+ bordered=True,
+ value=f"{_active_devs:,.0f}",
+ caption="All teams with grants, averaged over last 6 months"
+ ),
+ mo.stat(
+ label="Change in Velocity",
+ bordered=True,
+ value=f"{_change_in_velocity*100:.1f}%",
+ caption=f"All dependent teams, before/after {SPRINT_START_DATE}"
+ )
+ ],
+ widths="equal",
+ gap=1
+ )
+
+ stylus_sprint_tab = mo.vstack([
+ mo.md("## Stylus Sprint Teams"),
+ mo.Html("""
+ This tab tracks (public) development activity of teams with grants from the Stylus Sprint.
+ """),
+
+ stylus_sprint_stats,
+
+ mo.callout("""Note: Development metrics like commits, issues closed, and PRs merged can vary widely based on a project's workflow, team size, or codebase structure. These numbers aren't meant for head-to-head comparisons, but rather to track changes within the same project over time. Use them as directional signals to guide deeper, qualitative evaluation.""", kind="warn"),
+
+ mo.md("### Developer Velocity"),
+ mo.ui.plotly(
+ figure=make_joyplot(df=_df, smoothing=7),
+ config={'displayModeBar': False}
+ ),
+
+ mo.md("### Activities Over Last 6 Months"),
+ mo.ui.table(
+ data=_mm,
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=20,
+ format_mapping={c: '{:,.0f}' for c in _mm.columns if c != 'Project'},
+ freeze_columns_left=['Project']
+ ),
+
+ mo.md("### Registry of (Known) Projects"),
+ mo.ui.table(
+ data=_df_projects.reset_index(drop=True),
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=50
+ )
+ ])
+ return stylus_sprint_stats, stylus_sprint_tab
+
+
+@app.cell
+def create_sdk_usage_tab(
+ SPRINT_START_DATE,
+ df_stylus_project_metrics,
+ df_stylus_sdk_deps,
+ df_stylus_sdk_deps_project_metrics,
+ make_joyplot,
+ mo,
+ sprint_velocity_change,
+ summarize_monthly_metrics,
+):
+ _df = df_stylus_sdk_deps_project_metrics[df_stylus_sdk_deps_project_metrics['metric_name'] == 'GITHUB_project_velocity_daily']
+ _mm = summarize_monthly_metrics(df_stylus_sdk_deps_project_metrics, num_months=6)
+
+ _df_dep_repos = df_stylus_sdk_deps.copy()
+ _df_dep_repos['Project Name'] = _df_dep_repos['dependent_project_name'].map(
+ _df
+ .drop_duplicates(subset=['display_name', 'project_name'])
+ .set_index('project_name')['display_name']
+ .to_dict()
+ )
+ _df_dep_repos['In Stylus Sprint?'] = _df_dep_repos['dependent_project_name'].isin(df_stylus_project_metrics['project_name'])
+ _df_dep_repos['Dependent Repo URL'] = _df_dep_repos.apply(lambda x: f"https://github.com/{x['repo_owner']}/{x['repo_name']}", axis=1)
+ _ossd_base_url = 'https://github.com/opensource-observer/oss-directory/tree/main/data/projects'
+ _df_dep_repos['OSS Directory URL'] = _df_dep_repos['dependent_project_name'].apply(lambda x: f"{_ossd_base_url}/{x[0]}/{x}.yaml")
+ _df_dep_repos.drop(columns=['dependent_project_name', 'repo_owner', 'repo_name', 'artifact_id'], inplace=True)
+
+ # Calculate SDK usage stats
+ _total_dependents = len(_df_dep_repos)
+ _sprint_participants = _df_dep_repos['In Stylus Sprint?'].sum()
+ _active_devs = _mm['Active Developers'].sum()
+ _change_in_velocity = sprint_velocity_change(
+ df=df_stylus_sdk_deps_project_metrics,
+ metric_name="GITHUB_project_velocity_weekly",
+ sprint_start=SPRINT_START_DATE
+ )
+
+ sdk_stats = mo.hstack(
+ items=[
+ mo.stat(
+ label="Stylus SDK Dependents",
+ bordered=True,
+ value=f"{_total_dependents:,.0f}",
+ caption="Linked to (known) teams with public GitHub activity"
+ ),
+ mo.stat(
+ label="Sprint Participants using Stylus SDK",
+ bordered=True,
+ value=f"{_sprint_participants:,.0f}",
+ caption="Subset of teams with public GitHub activity"
+ ),
+ mo.stat(
+ label="Active Developers using Stylus SDK",
+ bordered=True,
+ value=f"{_active_devs:,.0f}",
+ caption="All dependent teams, averaged over last 6 months"
+ ),
+ mo.stat(
+ label="Change in Velocity",
+ bordered=True,
+ value=f"{_change_in_velocity*100:.1f}%",
+ caption=f"All dependent teams, before/after {SPRINT_START_DATE}"
+ )
+ ],
+ widths="equal",
+ gap=1
+ )
+
+ sdk_tab = mo.vstack([
+ mo.md("## Stylus SDK Usage"),
+ mo.Html("""
+ This tab tracks (public) development activity of teams with repos that import the Stylus SDK as a direct dependency.
+ """),
+
+ sdk_stats,
+
+ mo.callout("""Note: We rely on the GitHub API for tracing a project's SBOM (software bill of materials).
+ We only fetch SBOMs for projects registered on OSO, which is a curated subset of all GitHub repos. New projects are
+ being added continuously. We try to fetch the current state of each project's SBOM on a monthly basis.
+ """, kind="warn"),
+
+ mo.md("### Developer Velocity"),
+ mo.ui.plotly(
+ figure=make_joyplot(df=_df, smoothing=7),
+ config={'displayModeBar': False}
+ ),
+
+ mo.md("### Activities Over Last 6 Months"),
+ mo.ui.table(
+ data=_mm,
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=25,
+ format_mapping={c: '{:,.0f}' for c in _mm.columns if c != 'Project'},
+ freeze_columns_left=['Project']
+ ),
+
+ mo.md("### Registry of (Known) Projects"),
+ mo.ui.table(
+ data=_df_dep_repos.reset_index(drop=True),
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=50
+ )
+
+ ])
+ return sdk_stats, sdk_tab
+
+
+@app.cell
+def create_ecosystem_tab(
+ SPRINT_START_DATE,
+ df_ecosystem_metrics,
+ df_repo_overlap,
+ get_total_repos_in_crypto_ecosystems,
+ make_joyplot,
+ make_repo_overlap_barchart,
+ mo,
+ sprint_velocity_change,
+ summarize_monthly_metrics,
+):
+ _df = df_ecosystem_metrics[df_ecosystem_metrics['metric_name'] == 'GITHUB_project_velocity_daily']
+ _mm = summarize_monthly_metrics(df_ecosystem_metrics, num_months=6)
+
+ # Calculate ecosystem stats
+ _total_repos = get_total_repos_in_crypto_ecosystems()
+
+ _arb_repos = df_repo_overlap[df_repo_overlap['ecosystem_name'] == 'Arbitrum']['total_repos'].sum()
+ _active_devs = _mm[_mm['Project'] == 'Arbitrum']['Active Developers'].sum()
+ _change_in_velocity = sprint_velocity_change(
+ df=df_ecosystem_metrics,
+ metric_name="GITHUB_project_velocity_weekly",
+ sprint_start=SPRINT_START_DATE
+ )
+
+
+ ecosystem_stats = mo.hstack(
+ items=[
+ mo.stat(
+ label="All Repositories",
+ bordered=True,
+ value=f"{_total_repos:,.0f}",
+ caption="Repos included in the latest Electric Capital registry"
+ ),
+ mo.stat(
+ label="Arbitrum Repositories",
+ bordered=True,
+ value=f"{_arb_repos:,.0f}",
+ caption="Repos included in the latest Electric Capital registry"
+ ),
+ mo.stat(
+ label="Active Developers in Arbitrum Ecosystem",
+ bordered=True,
+ value=f"{_active_devs:,.0f}",
+ caption="All 'Arbitrum' repos, averaged over last 6 months"
+ ),
+ mo.stat(
+ label="Change in Velocity",
+ bordered=True,
+ value=f"{_change_in_velocity*100:.1f}%",
+ caption=f"All 'Arbitrum' repos, before/after {SPRINT_START_DATE}"
+ )
+ ],
+ widths="equal",
+ gap=1
+ )
+
+ ecosystem_tab = mo.vstack([
+ mo.md("## Ecosystem Benchmarks"),
+ mo.Html("""
+ This tab tracks (public) development activity on Arbitrum compared to other crypto ecosystems registered by Electric Capital.
+ """),
+
+ ecosystem_stats,
+
+ mo.callout("""
+ Note: Electric Capital's Crypto Ecosystems registry is community-maintained and not always accurate / up-to-date for
+ new projects. There is also significant overlap between ecosystems, ie, the same repository belongs to multiple ecosystems.
+ New repositories can be added by making a pull request to the Crypto Ecosystems GitHub.
+ """, kind="warn"),
+
+
+ mo.md("### Developer Velocity"),
+ mo.ui.plotly(
+ figure=make_joyplot(df=_df, smoothing=7),
+ config={'displayModeBar': False}
+ ),
+
+ mo.md("### Activities Over Last 6 Months"),
+ mo.ui.table(
+ data=_mm,
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=20,
+ format_mapping={c: '{:,.0f}' for c in _mm.columns if c != 'Project'},
+ freeze_columns_left=['Project']
+ ),
+
+ mo.md("### Repository Overlap"),
+ mo.ui.plotly(
+ figure=make_repo_overlap_barchart(df=df_repo_overlap),
+ config={'displayModeBar': False}
+ ),
+
+ ])
+ return ecosystem_stats, ecosystem_tab
+
+
+@app.cell
+def create_developer_funnel_tab(
+ df_fork_devs,
+ df_fork_devs_labeled,
+ df_fork_devs_ranked,
+ mo,
+ px,
+):
+ # 1. Table of example repos and fork count
+ _forks_table = df_fork_devs_labeled.groupby('first_fork_repo_url')['dev_id'].nunique().sort_values(ascending=False)
+ _forks_table = _forks_table.reset_index()
+ _forks_table.columns = ['Repo URL', 'Num. Developers']
+
+ # 2. Area chart of cumulative forks
+ _df_fork_count = df_fork_devs.groupby(['first_fork_repo_url', 'first_fork'], as_index=False)['dev_id'].nunique()
+ _df_fork_count.sort_values(by='first_fork', inplace=True)
+ _df_fork_count['Fork Count (Cumulative)'] = _df_fork_count['dev_id'].cumsum()
+
+ _forks_barchart = px.area(data_frame=_df_fork_count, x='first_fork', y='Fork Count (Cumulative)')
+ _forks_barchart.update_traces(line=dict(color='#104C35', width=1.5), fillcolor=rgba_from_rgb(rgb='rgb(8, 135, 43)', alpha=0.80))
+ _layout = dict(
+ plot_bgcolor='white',
+ paper_bgcolor='white',
+ title_x=0,
+ legend_title="",
+ autosize=True,
+ margin=dict(t=0, l=0, r=0, b=0),
+ height=300,
+ yaxis=dict(showgrid=True, gridcolor='lightgray', linecolor='black', linewidth=1, ticks='outside', rangemode='tozero', title=''),
+ xaxis=dict(showgrid=False, linecolor='black', linewidth=1, ticks='outside', title=''),
+ )
+ _forks_barchart.update_layout(**_layout)
+
+ # 3. Developer funnel, PageRanked
+ df_devs_by_project = (
+ df_fork_devs_labeled.merge(df_fork_devs_ranked[['dev_id', 'dev_score']], on='dev_id')
+ .groupby(['dev_id', 'dev_url', 'dev_score'], as_index=False)
+ .agg(
+ first_fork=('first_fork','min'),
+ num_repos=('repo_url', 'nunique'),
+ alignment=('project_type', lambda x: min(set(x))[3:]),
+ #repos_worked_on_by_this_dev=('repo_url', lambda x: ' | '.join(sorted(set(x))))
+ )
+ .sort_values(by=['dev_score', 'num_repos', 'first_fork'], ascending=[False, False, True])
+ .reset_index(drop=True)
+ .drop(columns=['dev_id', 'dev_score'])
+ .rename(columns={
+ 'dev_url': 'Git Username',
+ 'first_fork': 'Earliest Fork',
+ 'num_repos': 'Num OSS Repos',
+ 'alignment': 'Contribution Type to Look For'
+ })
+ )
+
+ # 4. Projects worked on by developers in the funnel
+ df_projects_from_devs = (
+ df_fork_devs_labeled.merge(df_fork_devs_ranked[['dev_id', 'dev_score']], on='dev_id')
+ .groupby('repo_owner', as_index=False)
+ .agg(
+ repo_rank=('dev_score', 'sum'),
+ alignment=('project_type', lambda x: min(set(x))[3:]),
+ first_fork=('first_fork','min'),
+ num_devs=('dev_id', 'nunique'),
+ dev_names=('dev_url', lambda x: ', '.join(sorted(set(x))).replace('https://github.com/',''))
+ )
+ .sort_values(by=['repo_rank', 'num_devs', 'first_fork'], ascending=[False, False, True])
+ .query("repo_owner not in @SDK_PROJECT_MAINTAINERS")
+ .drop(columns=['repo_rank'])
+ .reset_index(drop=True)
+ )
+ df_projects_from_devs['repo_owner'] = df_projects_from_devs['repo_owner'].apply(lambda x: f'https://github.com/{x}')
+ df_projects_from_devs.rename(columns={
+ 'repo_owner': 'GitHub Owner', 'first_fork': 'Earliest Fork', 'num_devs': 'Num Developers', 'dev_names': 'Git Username(s)', 'alignment': 'Alignment'
+ }, inplace=True)
+
+
+ # Calculate developer funnel stats
+ _example_repos = len(_forks_table)
+ _unique_developers = len(df_devs_by_project)
+ _total_projects = len(df_projects_from_devs)
+ _avg_forks_per_month = _unique_developers / ((df_fork_devs['first_fork'].max() - df_fork_devs['first_fork'].min()).days / 30)
+
+ dev_funnel_stats = mo.hstack(
+ items=[
+ mo.stat(
+ label="Stylus Example Repos",
+ bordered=True,
+ value=f"{_example_repos:,.0f}",
+ #caption="Git users who forked Stylus examples"
+ ),
+ mo.stat(
+ label="Forking Developers",
+ bordered=True,
+ value=f"{_unique_developers:,.0f}",
+ #caption="Git users who forked Stylus examples"
+ ),
+ mo.stat(
+ label="Projects Linked to Forking Developers",
+ bordered=True,
+ value=f"{_total_projects:,.0f}",
+ #caption="Public GitHub repos with recent commits from developers identified"
+ ),
+ mo.stat(
+ label="Avg Forks/Month",
+ bordered=True,
+ value=f"{_avg_forks_per_month:.1f}",
+ #caption="Average developers per project"
+ )
+ ],
+ widths="equal",
+ gap=1
+ )
+
+ dev_funnel_tab = mo.vstack([
+ mo.md("## Stylus Developer Funnel"),
+ mo.Html(
+ """
+ This tab tracks when developers engage with Stylus by forking the example repositories created by Offchain Labs.
+ It also applies a basic ranking algorithm to identify developers and projects worth watching.
+ """),
+
+ dev_funnel_stats,
+
+ mo.hstack([
+ mo.vstack([
+ mo.md("### Forks by Example Repo"),
+ mo.ui.table(
+ data=_forks_table,
+ show_column_summaries=False,
+ show_data_types=False,
+ )
+ ]),
+ mo.vstack([
+ mo.md("### Forking Developers"),
+ mo.ui.plotly(figure=_forks_barchart, config={'displayModeBar': False})
+ ])
+ ], widths='equal', wrap=True),
+
+ mo.md("### Developers Identified"),
+ mo.ui.table(
+ data=df_devs_by_project[['Git Username', 'Num OSS Repos', 'Contribution Type to Look For', 'Earliest Fork']],
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=20
+ ),
+
+ mo.md("### Projects Linked to Forking Developers"),
+ mo.ui.table(
+ data=df_projects_from_devs[['GitHub Owner', 'Git Username(s)', 'Num Developers', 'Alignment', 'Earliest Fork']],
+ selection=None,
+ show_column_summaries=False,
+ show_data_types=False,
+ page_size=20
+ ),
+
+ ])
+ return dev_funnel_stats, dev_funnel_tab
+
+
+@app.cell
+def display_tabs(
+ dev_funnel_tab,
+ ecosystem_tab,
+ mo,
+ overview_tab,
+ sdk_tab,
+ stylus_sprint_tab,
+):
+ mo.ui.tabs({
+ "Overview": overview_tab,
+ "Stylus Sprint Teams": stylus_sprint_tab,
+ "Stylus SDK Usage": sdk_tab,
+ "Ecosystem Benchmarks": ecosystem_tab,
+ "Stylus Developer Funnel": dev_funnel_tab,
+ }, value="Overview")
+ return
+
+
+@app.cell
+def generate_joyplot(SPRINT_START_DATE, go, np, pd, px):
+ def make_joyplot(df, smoothing=7):
+
+ colorscale = 'Greens'
+ gap = 1.10
+ fill_alpha = 0.40
+
+ wide = df.pivot_table(index="date", columns="display_name", values="amount", aggfunc="sum").sort_index()
+ if smoothing > 1:
+ wide = wide.rolling(window=smoothing, min_periods=1, center=True).mean()
+
+ wide_norm = wide.copy()
+ for col in wide.columns:
+ non_zero_count = (wide[col] > 0).sum()
+ if non_zero_count > 50:
+ threshold = int(wide[col].quantile(0.95))
+ wide_norm[col] = wide_norm[col].clip(upper=threshold)
+ denom = wide_norm[col].max(skipna=True)
+ wide_norm[col] = wide_norm[col].divide(denom, axis=0)
+
+ cols = list(wide_norm.columns)[::-1]
+ cmap = getattr(px.colors.sequential, colorscale)
+ cmap_subset = cmap[len(cmap)//2:][::-1]
+
+ n = len(cols)
+ proj_colors = {}
+ for rank, col in enumerate(cols):
+ idx = int(round(rank * (len(cmap_subset) - 1) / max(1, n - 1)))
+ proj_colors[col] = cmap_subset[idx]
+
+ sprint_start_date = pd.to_datetime(SPRINT_START_DATE).date()
+ last_date = wide_norm.index.max()
+
+ fig = go.Figure()
+ tickvals, ticktext = [], []
+
+ for i, col in enumerate(cols):
+ y_offset = i * gap
+ y_vals = wide_norm[col].fillna(0).values
+ x_vals = wide_norm.index
+
+ color = proj_colors[col]
+ fill_color = rgba_from_rgb(color, fill_alpha)
+
+ fig.add_trace(
+ go.Scatter(
+ x=x_vals,
+ y=np.full(y_vals.shape, y_offset, dtype=float),
+ mode="lines",
+ line=dict(width=0),
+ hoverinfo="skip",
+ showlegend=False
+ )
+ )
+ fig.add_trace(
+ go.Scatter(
+ x=x_vals,
+ y=y_vals + y_offset,
+ mode="lines",
+ fill="tonexty",
+ line=dict(color=color, width=1.5),
+ line_shape="spline",
+ fillcolor=fill_color,
+ name=col,
+ customdata=np.c_[wide_norm[col].reindex(x_vals).fillna(0).values * 100],
+ hovertemplate="%{fullData.name}
Week of: %{x|%d %b %Y}
Velocity: %{customdata[0]:,.0f}% of max",
+ showlegend=False
+ )
+ )
+ tickvals.append(y_offset)
+
+ # Calculate velocity change
+ pre_sprint_data = wide_norm[col][wide_norm.index < sprint_start_date]
+ post_sprint_data = wide_norm[col][wide_norm.index >= sprint_start_date]
+
+ pre_sprint_avg = pre_sprint_data.fillna(0).mean()
+ post_sprint_avg = post_sprint_data.fillna(0).mean()
+
+ if pre_sprint_avg > 0:
+ change = ((post_sprint_avg - pre_sprint_avg) / pre_sprint_avg) * 100
+ else:
+ change = 0
+
+ if int(change) > 0:
+ annotation_text = f"+{change:,.0f}%"
+ elif int(change) < 0:
+ annotation_text = f"{change:,.0f}%"
+ else:
+ annotation_text = "No change"
+
+ ticktext.append(f"{col}: {annotation_text}")
+
+ fig.add_vrect(
+ x0=sprint_start_date, x1=last_date,
+ fillcolor="rgba(128,128,128,0.05)",
+ line_width=0.25,
+ annotation_text="Stylus Sprint",
+ annotation_position="top left",
+ )
+
+ fig.update_layout(
+ template="plotly_white",
+ paper_bgcolor="white",
+ plot_bgcolor="white",
+ font=dict(size=12, color="#111"),
+ margin=dict(l=0, r=80, t=0, b=0),
+ showlegend=False,
+ title=dict(text="", x=0, xanchor="left", font=dict(size=14, color="#111"))
+ )
+ fig.update_xaxes(title="", showgrid=False, visible=False, linecolor="#000", linewidth=1)
+ fig.update_yaxes(
+ title="",
+ side="right",
+ showgrid=False,
+ tickmode="array",
+ ticklabelposition="outside top",
+ #ticklabelshift=-1,
+ ticklabelstandoff=5,
+ tickvals=tickvals,
+ ticktext=ticktext,
+ zeroline=False,
+ tickcolor="#000",
+ showline=False
+ )
+ return fig
+ return (make_joyplot,)
+
+
+@app.cell
+def generate_repo_overlap_barchart(go, np):
+ def make_repo_overlap_barchart(
+ df,
+ target_ecosystem="Arbitrum"
+ ):
+ # Expect columns: ecosystem_name, repos_shared_with_target, repos_not_shared_with_target, total_repos
+ d = df.copy()
+ d.sort_values(["repos_shared_with_target", "total_repos", "ecosystem_name"], ascending=[False,False,True], inplace=True)
+
+ d["shared_val"] = d["repos_shared_with_target"]
+ d["not_shared_val"] = d["repos_not_shared_with_target"]
+
+ xaxis_title = "Repositories"
+ hover_suffix = ""
+ hover_shared_val = d["shared_val"]
+ hover_not_shared_val = d["not_shared_val"]
+
+ # Colors (fixed, readable on black)
+ COLOR_SHARED = "#2ecc71"
+ COLOR_NOT_SHARED = "#888888"
+ COLOR_HILITE = "Green" # slightly brighter for the highlighted ecosystem
+ shared_colors = [COLOR_HILITE if name==target_ecosystem else COLOR_SHARED for name in d["ecosystem_name"]]
+
+ fig = go.Figure()
+ fig.add_trace(go.Bar(
+ y=d["ecosystem_name"],
+ x=d["shared_val"],
+ name=f"Shared with {target_ecosystem}",
+ orientation="h",
+ marker=dict(color=shared_colors),
+ hovertemplate=(
+ "%{y}
"
+ "Shared: %{customdata[0]:,.0f}"+hover_suffix+"
"
+ "Not shared: %{customdata[1]:,.0f}"+hover_suffix+"
"
+ "Total: %{customdata[2]:,.0f}"
+ ),
+ customdata=np.stack([
+ hover_shared_val,
+ hover_not_shared_val,
+ d["total_repos"]
+ ], axis=-1)
+ ))
+ fig.add_trace(go.Bar(
+ y=d["ecosystem_name"],
+ x=d["not_shared_val"],
+ name="Not shared",
+ orientation="h",
+ marker=dict(color=COLOR_NOT_SHARED),
+ hovertemplate=(
+ "%{y}
"
+ "Shared: %{customdata[1]:,.0f}"+hover_suffix+"
"
+ "Not shared: %{customdata[0]:,.0f}"+hover_suffix+"
"
+ "Total: %{customdata[2]:,.0f}"
+ ),
+ customdata=np.stack([
+ hover_not_shared_val,
+ hover_shared_val,
+ d["total_repos"]
+ ], axis=-1)
+ ))
+ fig.update_layout(
+ barmode="stack",
+ title="",
+ paper_bgcolor="white", plot_bgcolor="white",
+ font=dict(size=12, color="black"),
+ margin=dict(t=0, l=0, r=20, b=40),
+ showlegend=True,
+ legend=dict(orientation="h", y=1.02, x=1, xanchor='right')
+ )
+ fig.update_xaxes(title=xaxis_title, showgrid=True, gridcolor="#AAA", zeroline=False, color="black")
+ fig.update_yaxes(title="", showgrid=False, color="black", automargin=True)
+
+ return fig
+ return (make_repo_overlap_barchart,)
+
+
+@app.cell
+def configuration_settings():
+ # Configuration constants
+ SPRINT_START_DATE = '2025-03-01'
+ PROJECT_START_DATE = '2023-07-01'
+ ECOSYSTEM_START_DATE = '2023-07-01' #'2020-01-01'
+ COLLECTION_NAME = 'arb-stylus'
+ SDK_PROJECT_MAINTAINERS = ['offchainlabs', 'arbitrumfoundation']
+ EVM_ECOSYSTEMS = [
+ 'arbitrum',
+ 'base',
+ 'bnb_chain',
+ 'evm_toolkit',
+ 'ethereum',
+ 'ethereum_l2s',
+ 'ethereum_virtual_machine_stack',
+ 'foundry',
+ 'polygon',
+ 'solidity',
+ ]
+ OTHER_ECOSYSTEMS = [
+ 'bitcoin',
+ 'cosmos_network_stack',
+ 'solana',
+ 'sui'
+ ]
+ ECOSYSTEMS = EVM_ECOSYSTEMS + OTHER_ECOSYSTEMS
+ MONTHLY_METRICS = [
+ 'GITHUB_active_developers_monthly',
+ 'GITHUB_full_time_developers_monthly',
+ 'GITHUB_commits_monthly',
+ 'GITHUB_releases_monthly',
+ 'GITHUB_forks_monthly',
+ 'GITHUB_stars_monthly',
+ 'GITHUB_opened_pull_requests_monthly',
+ 'GITHUB_merged_pull_requests_monthly',
+ 'GITHUB_opened_issues_monthly',
+ 'GITHUB_closed_issues_monthly',
+ 'GITHUB_project_velocity_monthly',
+ 'GITHUB_bot_activity_monthly',
+ ]
+ WEEKLY_METRICS = [
+ 'GITHUB_commits_weekly',
+ 'GITHUB_forks_weekly',
+ 'GITHUB_stars_weekly',
+ 'GITHUB_opened_pull_requests_weekly',
+ 'GITHUB_merged_pull_requests_weekly',
+ 'GITHUB_opened_issues_weekly',
+ 'GITHUB_closed_issues_weekly',
+ 'GITHUB_project_velocity_weekly',
+ 'GITHUB_contributors_weekly'
+ ]
+ DAILY_METRICS = [
+ 'GITHUB_project_velocity_daily'
+ ]
+ METRIC_NAMES = MONTHLY_METRICS + WEEKLY_METRICS + DAILY_METRICS
+ return (
+ COLLECTION_NAME,
+ ECOSYSTEMS,
+ ECOSYSTEM_START_DATE,
+ EVM_ECOSYSTEMS,
+ METRIC_NAMES,
+ MONTHLY_METRICS,
+ OTHER_ECOSYSTEMS,
+ PROJECT_START_DATE,
+ SDK_PROJECT_MAINTAINERS,
+ SPRINT_START_DATE,
+ )
+
+
+@app.cell
+def get_data(
+ COLLECTION_NAME,
+ ECOSYSTEMS,
+ ECOSYSTEM_START_DATE,
+ EVM_ECOSYSTEMS,
+ METRIC_NAMES,
+ OTHER_ECOSYSTEMS,
+ PROJECT_START_DATE,
+ SDK_PROJECT_MAINTAINERS,
+ client,
+ pd,
+ wraps,
+):
+ # QUERY HELPERS
+ def parse_dates(*cols):
+ def decorator(func):
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ df = func(*args, **kwargs)
+ for col in cols:
+ if col in df.columns:
+ df[col] = pd.to_datetime(df[col]).dt.date
+ return df
+ return wrapper
+ return decorator
+
+ stringify = lambda arr: "'" + "','".join(arr) + "'"
+
+ # QUERIES
+ @parse_dates("date")
+ def get_metrics_by_developer_ecosystem():
+ return client.to_pandas(f"""
+ SELECT
+ sample_date AS date,
+ metric_name,
+ projects_v1.display_name,
+ amount
+ FROM timeseries_metrics_by_project_v0
+ JOIN metrics_v0 USING metric_id
+ JOIN projects_v1 USING project_id
+ WHERE
+ sample_date >= DATE '{ECOSYSTEM_START_DATE}'
+ AND metric_name IN ({stringify(METRIC_NAMES)})
+ AND project_source = 'CRYPTO_ECOSYSTEMS'
+ AND project_namespace = 'eco'
+ AND project_name IN ({stringify(ECOSYSTEMS)})
+ ORDER BY 1,2,3
+ """)
+
+ @parse_dates("date")
+ def get_metrics_by_stylus_project():
+ return client.to_pandas(f"""
+ SELECT DISTINCT
+ p.display_name AS display_name,
+ p.project_name AS project_name,
+ m.metric_name AS metric_name,
+ ts.sample_date AS date,
+ ts.amount AS amount
+ FROM timeseries_metrics_by_project_v0 ts
+ JOIN metrics_v0 m
+ ON m.metric_id = ts.metric_id
+ JOIN projects_v1 p
+ ON p.project_id = ts.project_id
+ JOIN projects_by_collection_v1 pc
+ ON p.project_id = pc.project_id
+ WHERE
+ ts.sample_date >= DATE '{PROJECT_START_DATE}'
+ AND m.metric_name IN ({stringify(METRIC_NAMES)})
+ AND pc.collection_name = '{COLLECTION_NAME}'
+ AND ts.amount IS NOT NULL
+ """)
+
+ @parse_dates("date")
+ def get_metrics_by_stylus_sdk_dependent(repo_ids):
+ return client.to_pandas(f"""
+ WITH ossd_projects AS (
+ SELECT DISTINCT project_id
+ FROM artifacts_by_project_v1
+ WHERE
+ artifact_id IN ({stringify(repo_ids)})
+ AND artifact_source = 'GITHUB'
+ AND project_source = 'OSS_DIRECTORY'
+ AND project_namespace = 'oso'
+ AND project_name NOT IN ({stringify(SDK_PROJECT_MAINTAINERS)})
+ )
+ SELECT DISTINCT
+ p.display_name AS display_name,
+ p.project_name AS project_name,
+ m.metric_name AS metric_name,
+ ts.sample_date AS date,
+ ts.amount AS amount
+ FROM timeseries_metrics_by_project_v0 ts
+ JOIN metrics_v0 m
+ ON m.metric_id = ts.metric_id
+ JOIN projects_v1 p
+ ON p.project_id = ts.project_id
+ WHERE
+ ts.sample_date >= DATE '{PROJECT_START_DATE}'
+ AND m.metric_name IN ({stringify(METRIC_NAMES)})
+ AND p.project_id IN (SELECT project_id FROM ossd_projects)
+ AND ts.amount IS NOT NULL
+ """)
+
+ @parse_dates("date")
+ def get_metrics_by_stylus_repo():
+ return client.to_pandas(f"""
+ SELECT
+ ap.artifact_name AS artifact_name,
+ ap.project_name AS project_name,
+ m.metric_name AS metric_name,
+ ts.sample_date AS date,
+ ts.amount AS amount
+ FROM artifacts_by_project_v1 ap
+ JOIN projects_by_collection_v1 pc
+ ON ap.project_id = pc.project_id
+ JOIN timeseries_metrics_by_artifact_v0 ts
+ ON ts.artifact_id = ap.artifact_id
+ JOIN metrics_v0 m
+ ON m.metric_id = ts.metric_id
+ WHERE
+ pc.collection_name = '{COLLECTION_NAME}'
+ AND ap.artifact_source = 'GITHUB'
+ AND m.metric_name = 'GITHUB_active_developers_monthly'
+ AND ts.sample_date >= DATE '{PROJECT_START_DATE}'
+ """)
+
+ def get_stylus_sdk_dependents():
+ return client.to_pandas(f"""
+ WITH stylus AS (
+ SELECT DISTINCT
+ package_artifact_id,
+ package_owner_artifact_id
+ FROM package_owners_v0
+ WHERE
+ package_owner_artifact_namespace = 'offchainlabs'
+ AND package_owner_artifact_name = 'stylus-sdk-rs'
+ AND package_artifact_name = 'stylus-sdk'
+ )
+ SELECT DISTINCT
+ abp.project_name AS dependent_project_name,
+ sboms_v0.dependent_artifact_namespace AS repo_owner,
+ sboms_v0.dependent_artifact_name AS repo_name,
+ sboms_v0.dependent_artifact_id AS artifact_id
+ FROM sboms_v0
+ JOIN stylus
+ ON sboms_v0.package_artifact_id = stylus.package_artifact_id
+ JOIN artifacts_by_project_v1 AS abp
+ ON
+ sboms_v0.dependent_artifact_id = abp.artifact_id
+ AND abp.project_source = 'OSS_DIRECTORY'
+ AND abp.project_namespace = 'oso'
+ AND abp.project_name NOT IN ({stringify(SDK_PROJECT_MAINTAINERS)})
+ WHERE stylus.package_owner_artifact_id != sboms_v0.dependent_artifact_id
+ ORDER BY 1,2,3
+ """)
+
+ @parse_dates("first_fork")
+ def get_devs_who_forked_examples():
+ return client.to_pandas(f"""
+ WITH stylus AS (
+ SELECT DISTINCT package_artifact_id
+ FROM package_owners_v0
+ WHERE
+ package_owner_artifact_namespace = 'offchainlabs'
+ AND package_owner_artifact_name = 'stylus-sdk-rs'
+ AND package_artifact_name = 'stylus-sdk'
+ ),
+ example_repos AS (
+ SELECT DISTINCT dependent_artifact_id
+ FROM sboms_v0
+ JOIN stylus USING package_artifact_id
+ WHERE dependent_artifact_namespace = 'offchainlabs'
+ ),
+ devs AS (
+ SELECT
+ artifact_id AS dev_id,
+ artifact_url AS dev_url,
+ MIN(time) AS first_fork,
+ MIN_BY(to_artifact_id, time) AS forked_repo_id
+ FROM int_first_of_event_from_artifact__github AS fe
+ JOIN example_repos AS er
+ ON fe.to_artifact_id = er.dependent_artifact_id
+ JOIN int_github_users AS u
+ ON fe.from_artifact_id = u.artifact_id
+ WHERE
+ event_type = 'FORKED'
+ AND time >= DATE '{PROJECT_START_DATE}'
+ GROUP BY 1,2
+ ),
+ dev_events AS (
+ SELECT
+ devs.dev_id,
+ devs.first_fork,
+ e.to_artifact_id AS repo_id,
+ SUM(e.amount) AS num_commits
+ FROM int_events_daily__github AS e
+ JOIN devs ON e.from_artifact_id = devs.dev_id
+ WHERE
+ e.event_type = 'COMMIT_CODE'
+ AND e.bucket_day >= devs.first_fork
+ GROUP BY 1,2,3
+ ),
+ star_counts AS (
+ SELECT
+ de.repo_id,
+ APPROX_DISTINCT(e.from_artifact_id) AS star_count
+ FROM int_events_daily__github AS e
+ JOIN dev_events AS de
+ ON e.to_artifact_id = de.repo_id
+ WHERE
+ e.event_type = 'STARRED'
+ AND e.bucket_day >= de.first_fork
+ AND e.from_artifact_id != de.dev_id
+ GROUP BY 1
+ )
+ SELECT DISTINCT
+ devs.dev_url,
+ fr.artifact_url AS first_fork_repo_url,
+ a.artifact_url AS repo_url,
+ devs.first_fork,
+ de.num_commits,
+ COALESCE(sc.star_count, 0) AS star_count,
+ a.artifact_namespace AS repo_owner,
+ de.dev_id,
+ de.repo_id
+ FROM dev_events AS de
+ JOIN devs ON de.dev_id = devs.dev_id
+ JOIN int_artifacts__github AS a
+ ON de.repo_id = a.artifact_id
+ LEFT JOIN star_counts AS sc
+ ON a.artifact_id = sc.repo_id
+ JOIN repositories_v0 AS fr
+ ON devs.forked_repo_id = fr.artifact_id
+ """)
+
+ def get_repo_alignment_tags(list_of_repo_artifact_ids):
+ df = client.to_pandas(f"""
+ WITH projects AS (
+ SELECT DISTINCT
+ artifact_id,
+ project_id,
+ project_name,
+ project_source
+ FROM artifacts_by_project_v1
+ WHERE
+ artifact_id IN ({stringify(list_of_repo_artifact_ids)})
+ AND project_source IN ('OSS_DIRECTORY', 'CRYPTO_ECOSYSTEMS')
+ AND project_namespace IN ('oso', 'eco')
+ ),
+ stylus_collection AS (
+ SELECT DISTINCT
+ project_id,
+ True AS in_stylus_collection
+ FROM projects_by_collection_v1 AS pbc
+ JOIN projects USING project_id
+ WHERE pbc.collection_name = '{COLLECTION_NAME}'
+ ),
+ alignment AS (
+ SELECT
+ project_id,
+ MAX(CASE WHEN project_name = 'arbitrum' THEN True ELSE False END) AS in_arbitrum,
+ MAX(CASE WHEN project_name IN ({stringify(OTHER_ECOSYSTEMS)}) THEN True ELSE False END) AS in_nonevm_ecosystem,
+ MAX(CASE WHEN project_name IN ({stringify(EVM_ECOSYSTEMS)}) THEN True ELSE False END) AS in_evm_ecosystem
+ FROM projects
+ WHERE project_source = 'CRYPTO_ECOSYSTEMS'
+ GROUP BY 1
+ )
+ SELECT DISTINCT
+ projects.artifact_id AS repo_id,
+ stylus_collection.*,
+ alignment.*
+ FROM projects
+ LEFT JOIN stylus_collection USING project_id
+ LEFT JOIN alignment USING project_id
+ """)
+ df = df.fillna(False)
+ return df
+
+ def get_artifact_overlap(target_ecosystem='Arbitrum'):
+ return client.to_pandas(f"""
+ WITH base AS (
+ SELECT DISTINCT
+ p.display_name AS ecosystem_name,
+ ap.artifact_id
+ FROM artifacts_by_project_v1 ap
+ JOIN projects_v1 p ON p.project_id=ap.project_id
+ WHERE
+ ap.artifact_source='GITHUB'
+ AND ap.project_source='CRYPTO_ECOSYSTEMS'
+ AND ap.project_namespace='eco'
+ AND ap.project_name IN ({stringify(ECOSYSTEMS)})
+ ),
+ target_set AS (
+ SELECT artifact_id FROM base WHERE ecosystem_name='{target_ecosystem}'
+ ),
+ totals AS (
+ SELECT
+ ecosystem_name,
+ COUNT(DISTINCT artifact_id) AS total_repos
+ FROM base
+ GROUP BY ecosystem_name
+ ),
+ shared AS (
+ SELECT
+ ecosystem_name,
+ COUNT(DISTINCT artifact_id) AS shared_with_target
+ FROM base
+ WHERE artifact_id IN (SELECT artifact_id FROM target_set)
+ GROUP BY ecosystem_name
+ )
+ SELECT
+ t.ecosystem_name,
+ COALESCE(s.shared_with_target,0) AS repos_shared_with_target,
+ (t.total_repos - COALESCE(s.shared_with_target,0)) AS repos_not_shared_with_target,
+ t.total_repos AS total_repos
+ FROM totals t
+ LEFT JOIN shared s
+ ON t.ecosystem_name = s.ecosystem_name
+ ORDER BY
+ repos_shared_with_target DESC,
+ ecosystem_name
+ """)
+
+ def get_total_repos_in_crypto_ecosystems():
+ df = client.to_pandas("""
+ SELECT APPROX_DISTINCT(artifact_id) AS count
+ FROM artifacts_by_project_v1
+ WHERE
+ project_source = 'CRYPTO_ECOSYSTEMS'
+ AND project_namespace = 'eco'
+ AND artifact_source = 'GITHUB'
+ """)
+ return df['count'].sum()
+ return (
+ get_artifact_overlap,
+ get_devs_who_forked_examples,
+ get_metrics_by_developer_ecosystem,
+ get_metrics_by_stylus_project,
+ get_metrics_by_stylus_sdk_dependent,
+ get_repo_alignment_tags,
+ get_stylus_sdk_dependents,
+ get_total_repos_in_crypto_ecosystems,
+ )
+
+
+@app.cell
+def process_data(
+ dev_pagerank,
+ get_artifact_overlap,
+ get_devs_who_forked_examples,
+ get_metrics_by_developer_ecosystem,
+ get_metrics_by_stylus_project,
+ get_metrics_by_stylus_sdk_dependent,
+ get_stylus_sdk_dependents,
+ label_repos,
+):
+ # Get the data
+ df_ecosystem_metrics = get_metrics_by_developer_ecosystem()
+ df_repo_overlap = get_artifact_overlap()
+ df_stylus_project_metrics = get_metrics_by_stylus_project()
+ df_stylus_sdk_deps = get_stylus_sdk_dependents()
+ df_stylus_sdk_deps_project_metrics = get_metrics_by_stylus_sdk_dependent(df_stylus_sdk_deps['artifact_id'].unique())
+ df_fork_devs = get_devs_who_forked_examples()
+
+ # Process developer data
+ df_fork_devs_labeled = label_repos(df_fork_devs)
+ df_fork_devs_ranked = dev_pagerank(df_fork_devs)
+
+ # Helper variables
+ most_recent_month = df_stylus_project_metrics[df_stylus_project_metrics['metric_name'].str.contains('monthly')==True]['date'].max()
+ return (
+ df_ecosystem_metrics,
+ df_fork_devs,
+ df_fork_devs_labeled,
+ df_fork_devs_ranked,
+ df_repo_overlap,
+ df_stylus_project_metrics,
+ df_stylus_sdk_deps,
+ df_stylus_sdk_deps_project_metrics,
+ most_recent_month,
+ )
+
+
+@app.cell
+def helper_monthly_metrics(MONTHLY_METRICS, datetime, most_recent_month):
+ def summarize_monthly_metrics(df, num_months=6):
+ start_month = datetime(2025, most_recent_month.month - (num_months-1), 1).date()
+ table = (
+ df[
+ (df['metric_name'].str.endswith('monthly') == True) &
+ (df['date'].between(start_month, most_recent_month)) &
+ (df['amount'].notna())
+ ]
+ .pivot_table(index='display_name', columns='metric_name', values='amount', aggfunc='sum', fill_value=0)
+ .map(lambda x: round(x/num_months,2))
+ [MONTHLY_METRICS]
+ .rename(columns={c:clean_metric_name(c) for c in MONTHLY_METRICS})
+ .reset_index()
+ .rename(columns={'display_name': 'Project'})
+ )
+ return table
+ return (summarize_monthly_metrics,)
+
+
+@app.cell
+def helper_velocity_calculation(np, pd):
+ def sprint_velocity_change(
+ df,
+ metric_name,
+ sprint_start,
+ date_col = "date",
+ amount_col = "amount",
+ metric_col = "metric_name",
+ ):
+
+ d = df[df[metric_col] == metric_name].copy()
+ d[date_col] = pd.to_datetime(d[date_col], utc=False, errors="coerce")
+
+ if d[date_col].dt.tz is not None:
+ d[date_col] = d[date_col].dt.tz_convert(None)
+
+ sprint_start_ts = pd.to_datetime(sprint_start, utc=False, errors="coerce")
+ if getattr(sprint_start_ts, "tzinfo", None) is not None:
+ sprint_start_ts = sprint_start_ts.tz_localize(None)
+
+ before = d[d[date_col] < sprint_start_ts]
+ after = d[d[date_col] >= sprint_start_ts]
+
+ def week_span(x: pd.Series) -> float:
+ if x.empty: return np.nan
+ delta_days = (x.max() - x.min()).days
+ return max(delta_days/7, np.nan)
+
+ before_weeks = week_span(before[date_col])
+ after_weeks = week_span(after[date_col])
+
+ def velocity(frame: pd.DataFrame, weeks: float) -> float:
+ if frame.empty or not np.isfinite(weeks) or weeks <= 0:
+ return np.nan
+ return frame[amount_col].sum()/weeks
+
+ v_before = velocity(before, before_weeks)
+ v_after = velocity(after, after_weeks)
+
+ if not np.isfinite(v_before) or v_before == 0:
+ return np.nan
+ return (v_after-v_before)/v_before
+ return (sprint_velocity_change,)
+
+
+@app.cell
+def helper_labeling_and_pagerank(get_repo_alignment_tags, np, nx, pd):
+ def label_repos(df):
+
+ _repos = df['repo_id'].unique()
+
+ df_labeled = get_repo_alignment_tags(_repos)
+ df_labeled = df_labeled.groupby('repo_id').max()
+ df_labeled["tags"] = df_labeled.apply(lambda row: ";".join([col.replace('in_','') for col in df_labeled.columns if row[col]]), axis=1)
+ df_merged = df.set_index('repo_id').join(df_labeled[["tags"]])
+
+ def label_project(tags, dev_url, repo_url):
+ if not isinstance(tags, str):
+ tags = '8 - n/a'
+ if 'stylus' in tags:
+ return '0 - Project (Stylus Sprint)'
+ if '/offchainlabs/' in repo_url:
+ return '1 - Offchain Labs'
+ if 'arbitrum' in tags:
+ return '2 - Project (Arbitrum Ecosystem)'
+ if 'nonevm' in tags:
+ if ';' in tags:
+ return '4 - Project (EVM + Non-EVM Ecosystems)'
+ else:
+ return '3 - Project (Non-EVM Ecosystem)'
+ if len(tags) > 1:
+ if dev_url in repo_url:
+ return '7 - Personal'
+ else:
+ return '5 - Project (EVM Ecosystem)'
+ return '6 - Project (Other)'
+
+ df_merged['project_type'] = df_merged.apply(lambda x: label_project(x['tags'], x['dev_url'], x['repo_url']), axis=1)
+ df_merged.drop(columns="tags", inplace=True)
+
+ return df_merged
+
+
+
+ def dev_pagerank(
+ df,
+ alpha=0.85,
+ max_iter=100,
+ star_exp=1.0, # how strongly repo stars matter
+ commit_exp=1.0, # how strongly commit volume matters
+ star_floor=0.0 # add to stars to avoid zero-sinks; e.g., 1.0
+ ):
+
+ # Nodes
+ devs = df[['dev_id','dev_url']].drop_duplicates().reset_index(drop=True)
+ repos = df[['repo_url','star_count']].drop_duplicates().reset_index(drop=True)
+
+ G = nx.DiGraph()
+ for _, r in devs.iterrows():
+ G.add_node(("dev", r.dev_id), url=r.dev_url, ntype="dev")
+ for _, r in repos.iterrows():
+ stars = float(r.star_count or 0.0)
+ G.add_node(("repo", r.repo_url), stars=stars, ntype="repo")
+
+ # Edges (commit-weighted dev→repo, star-weighted repo→dev)
+ for _, r in df.iterrows():
+ d = ("dev", r.dev_id); rep = ("repo", r.repo_url)
+ if d not in G or rep not in G:
+ continue
+
+ c = max(0.0, float(r.num_commits or 0.0))
+ s = max(0.0, float(r.star_count or 0.0))
+ w_dr = c**commit_exp
+ w_rd = (s + star_floor)**star_exp
+
+ if w_dr > 0: G.add_edge(d, rep, weight=w_dr)
+ if w_rd > 0: G.add_edge(rep, d, weight=w_rd)
+
+ # Personalization: devs by commits, repos by stars
+ dev_commit_sum = df.groupby("dev_id")["num_commits"].sum().reindex(devs.dev_id).fillna(0)
+ repo_stars = repos.set_index("repo_url")["star_count"].fillna(0)
+
+ p = {}
+ for n in G.nodes:
+ ntype, key = n
+ if ntype == "dev":
+ p[n] = 1.0 + np.log1p(float(dev_commit_sum.get(key, 0.0)))
+ else:
+ p[n] = 1.0 + np.log1p(float(repo_stars.get(key, 0.0)) + star_floor)
+
+ z = sum(p.values()) or 1.0
+ p = {k:v/z for k,v in p.items()}
+
+ pr = nx.pagerank(G, alpha=alpha, personalization=p, weight="weight", max_iter=max_iter)
+ rows = []
+ for (ntype, key), score in pr.items():
+ if ntype != "dev":
+ continue
+ rows.append({
+ "dev_id": key,
+ "dev_score": score,
+ "dev_url": G.nodes[(ntype,key)]["url"]
+ })
+ dev_rank = pd.DataFrame(rows).sort_values("dev_score", ascending=False, kind="mergesort").reset_index(drop=True)
+
+ # Some diagnostics
+ dev_rank = dev_rank.merge(
+ devs.assign(total_commits=dev_commit_sum.values), on=["dev_id","dev_url"], how="left"
+ )
+ repo_star_map = repos.set_index("repo_url")["star_count"].to_dict()
+ exposure = (
+ df.assign(w=lambda x: (x["num_commits"].clip(lower=0).astype(float)**commit_exp)
+ * (df["repo_url"].map(repo_star_map).fillna(0).astype(float)))
+ .groupby("dev_id")["w"]
+ .sum()
+ .rename("star_exposure")
+ )
+ dev_rank = dev_rank.merge(exposure, on="dev_id", how="left").fillna({"star_exposure":0.0})
+
+ return dev_rank
+ return dev_pagerank, label_repos
+
+
+@app.function
+def clean_metric_name(col):
+ return col.replace('GITHUB_','').replace('_monthly','').replace('_',' ').title()
+
+
+@app.function
+def rgba_from_rgb(rgb, alpha):
+ return rgb.replace("rgb", "rgba").replace(")", f",{alpha})")
+
+
+@app.cell
+def import_libraries():
+ from datetime import datetime, date, timedelta
+ from functools import wraps
+ import pandas as pd
+ import plotly.graph_objects as go
+ import plotly.express as px
+ import networkx as nx
+ import numpy as np
+ return datetime, go, np, nx, pd, px, wraps
+
+
+if __name__ == "__main__":
+ app.run()
diff --git a/pyproject.toml b/pyproject.toml
index 65585bb..93bc021 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,6 +17,7 @@ dependencies = [
"pyarrow>=21.0.0",
"pyoso>=0.6.5",
"pyyaml>=6.0.2",
+ "scipy>=1.16.2",
"trino>=0.336.0",
"vega-datasets>=0.9.0",
"web3>=7.13.0",
diff --git a/uv.lock b/uv.lock
index 6b7d93f..afaad59 100644
--- a/uv.lock
+++ b/uv.lock
@@ -84,15 +84,15 @@ wheels = [
[[package]]
name = "anyio"
-version = "4.10.0"
+version = "4.11.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "idna" },
{ name = "sniffio" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252 }
+sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213 },
+ { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097 },
]
[[package]]
@@ -177,31 +177,31 @@ wheels = [
[[package]]
name = "ckzg"
-version = "2.1.2"
+version = "2.1.4"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/7e/77/9a44934373eff2013cab641f4ac70b98bb8372fe2938ea78c349501aa825/ckzg-2.1.2.tar.gz", hash = "sha256:7d445215261068d914c3607fd89889bb405260911804cd0eea789ce7422db0d8", size = 1124054 }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/b2/0e27adcfc241ac53fc8dd788019bb1700b37a4809c23bcd0de955bbcc952/ckzg-2.1.4.tar.gz", hash = "sha256:f8f20a8ad28173197d250920a3e9f957184259def9a2326eb46f24fdf536e9c8", size = 1123742 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/11/ed/007ddc03613be6e8b246cace85edc943116fd78413a228789ca490775971/ckzg-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:457635f924610414b7e7460b1e5097187ca4c40406ea80c73848866267213fed", size = 116305 },
- { url = "https://files.pythonhosted.org/packages/fc/9f/1a9df26c78b5f26c06a9a97948e12db434c2b4a784708b9214f72ad8cea7/ckzg-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:32b750784bef9fc7832dee07635eb46309eca5b55a6eb350ff40021b5fc483f2", size = 99956 },
- { url = "https://files.pythonhosted.org/packages/7b/d8/9fc6537a8fcc0a373f0bb0cf2747e28e7aa99918c9d96385ef1f3ec51c9c/ckzg-2.1.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4eeff254f60b08dba7991d3ab20018d5df7cbe3318e67efd070d2361104e6d4", size = 176341 },
- { url = "https://files.pythonhosted.org/packages/12/f1/06b20839ac10c4e839bad82e32ccf1078be810c972fdf703c08754fbd348/ckzg-2.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad66afefac5836c340a853b543f932a9e98830359617414b1972233eaa5a069", size = 161827 },
- { url = "https://files.pythonhosted.org/packages/c4/fa/04df1f37a4075c7e0032c960f037d14fead960db699504781fd421c735a4/ckzg-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3046c1541f9b3aed997860fdab106795ac4e8335cb1d3fe6a2a45958fb00ab", size = 171088 },
- { url = "https://files.pythonhosted.org/packages/6a/9d/50b82acbf1f89159fb70853ecd42a5b67ecba0e298eebb31760bb41b2aa0/ckzg-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b98029c67d34bcf6b0e030d06505a1accc1829a378736e2cb69e4af852add99", size = 173505 },
- { url = "https://files.pythonhosted.org/packages/61/6f/97085ef1002fcfd7620b774df13c918cd83a84247f1b5ece098073a3fc25/ckzg-2.1.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59541361c9402ec14790db88c16532e66ece8e56d985b75756f36387858549fa", size = 188738 },
- { url = "https://files.pythonhosted.org/packages/2e/7a/e8208411860bd2dca57eae2771e045b1a4dcde8dc08004d74401ad74f23a/ckzg-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:edf41132119d67673af1cf6cbf22f3852d092e94c9c890ff153e761d7be6e684", size = 183486 },
- { url = "https://files.pythonhosted.org/packages/41/28/8b381db79aa362e975e86c3bf2c85de6b9482923dc55f19bb21419d12994/ckzg-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:0074cbfe11702c1d413ed86a74d9fcfef48fcb206c31a37c0b3eeb830f6d0a05", size = 100693 },
+ { url = "https://files.pythonhosted.org/packages/c8/1c/141fa943f64116d10bcf50641dc7a4c04d94dbdaf4401d07a1a14e86a0af/ckzg-2.1.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b93ffd0cfe5f799c0be9816cd6fa1d8296d3ca0624e5ba41ea9de0c42cacbcb", size = 116343 },
+ { url = "https://files.pythonhosted.org/packages/79/b4/f6807048c724e4f172c433957562bdb29ca939300b1db9ac9e09f88b6a6d/ckzg-2.1.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:76d554f05c83cf84cb4a838656f102cd2e175a9518baa988cb88f1dd4d1ee6a1", size = 99818 },
+ { url = "https://files.pythonhosted.org/packages/e6/2a/d1db9b3f59f074caa989ccb8d9afbecd3526cff5d86038a314dba9254edb/ckzg-2.1.4-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c305285b4f207e946a7a79eb48943cabf4568ece3cd143ad51a3250d1272ca4d", size = 176588 },
+ { url = "https://files.pythonhosted.org/packages/8e/33/1d7f0ad9ddbcde0e390bd53ffa838e04a888e715efc68161d0e159ade71f/ckzg-2.1.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:552721623883b6c552b0fa6c11a244bf61d572163160c19c33dc12a486b7c804", size = 161985 },
+ { url = "https://files.pythonhosted.org/packages/5f/3f/364d52b473eafb2115c8dfa8ec0308367d07b5ce264114f2f91ec6ccaddb/ckzg-2.1.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abda2e14da6d0f19ff7af09f42bde63f5d1aa3a73e56a8eb1f294d6c96f8119", size = 171364 },
+ { url = "https://files.pythonhosted.org/packages/0b/cb/314523f94d518390eea973dd19fba7447ca96eab8d5363baa13f29d72867/ckzg-2.1.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:21d73fe7bb7fd2b712f4246f8c87248519b97bbf60e8c873276fddb21f4693f9", size = 173576 },
+ { url = "https://files.pythonhosted.org/packages/89/28/f89aa3d8b8d37bc5be8f3c06fed77012524ddfa2af63c5a1b12719e06764/ckzg-2.1.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f84b511409eda6f19a138ececfe2437ec08e9be894ab95a586642380e73690e3", size = 189035 },
+ { url = "https://files.pythonhosted.org/packages/98/4f/1d357473e9bc7833141353e178ca281d39fdc6db314d6a9583ffb618a692/ckzg-2.1.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:354e0eb75871b317095d0d1edf4f6f72f66d6accf1fb692ece6a6c4fb3eec9e9", size = 183704 },
+ { url = "https://files.pythonhosted.org/packages/b1/6d/ed7c6f2c7a83e05686ca2e719c772bac6554bd1bc7d720379444944f3fec/ckzg-2.1.4-cp313-cp313-win_amd64.whl", hash = "sha256:b7685e0aca6e70171d2e5e5cf1bcbcdbc3a6279ba48ba2087990da32b72a752a", size = 101041 },
]
[[package]]
name = "click"
-version = "8.2.1"
+version = "8.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 }
+sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 },
+ { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295 },
]
[[package]]
@@ -240,11 +240,11 @@ wheels = [
[[package]]
name = "docutils"
-version = "0.22"
+version = "0.22.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e9/86/5b41c32ecedcfdb4c77b28b6cb14234f252075f8cdb254531727a35547dd/docutils-0.22.tar.gz", hash = "sha256:ba9d57750e92331ebe7c08a1bbf7a7f8143b86c476acd51528b042216a6aad0f", size = 2277984 }
+sdist = { url = "https://files.pythonhosted.org/packages/4a/c0/89fe6215b443b919cb98a5002e107cb5026854ed1ccb6b5833e0768419d1/docutils-0.22.2.tar.gz", hash = "sha256:9fdb771707c8784c8f2728b67cb2c691305933d68137ef95a75db5f4dfbc213d", size = 2289092 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/44/57/8db39bc5f98f042e0153b1de9fb88e1a409a33cda4dd7f723c2ed71e01f6/docutils-0.22-py3-none-any.whl", hash = "sha256:4ed966a0e96a0477d852f7af31bdcb3adc049fbb35ccba358c2ea8a03287615e", size = 630709 },
+ { url = "https://files.pythonhosted.org/packages/66/dd/f95350e853a4468ec37478414fc04ae2d61dad7a947b3015c3dcc51a09b9/docutils-0.22.2-py3-none-any.whl", hash = "sha256:b0e98d679283fc3bb0ead8a5da7f501baa632654e7056e9c5846842213d674d8", size = 632667 },
]
[[package]]
@@ -457,7 +457,7 @@ wheels = [
[[package]]
name = "google-cloud-bigquery"
-version = "3.37.0"
+version = "3.38.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "google-api-core", extra = ["grpc"] },
@@ -468,9 +468,9 @@ dependencies = [
{ name = "python-dateutil" },
{ name = "requests" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/5e/01/3e1b7858817ba8f9555ae10f5269719f5d1d6e0a384ea0105c0228c0ce22/google_cloud_bigquery-3.37.0.tar.gz", hash = "sha256:4f8fe63f5b8d43abc99ce60b660d3ef3f63f22aabf69f4fe24a1b450ef82ed97", size = 502826 }
+sdist = { url = "https://files.pythonhosted.org/packages/07/b2/a17e40afcf9487e3d17db5e36728ffe75c8d5671c46f419d7b6528a5728a/google_cloud_bigquery-3.38.0.tar.gz", hash = "sha256:8afcb7116f5eac849097a344eb8bfda78b7cfaae128e60e019193dd483873520", size = 503666 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/47/90/f0f7db64ee5b96e30434b45ead3452565d0f65f6c0d85ec9ef6e059fb748/google_cloud_bigquery-3.37.0-py3-none-any.whl", hash = "sha256:f006611bcc83b3c071964a723953e918b699e574eb8614ba564ae3cdef148ee1", size = 258889 },
+ { url = "https://files.pythonhosted.org/packages/39/3c/c8cada9ec282b29232ed9aed5a0b5cca6cf5367cb2ffa8ad0d2583d743f1/google_cloud_bigquery-3.38.0-py3-none-any.whl", hash = "sha256:e06e93ff7b245b239945ef59cb59616057598d369edac457ebf292bd61984da6", size = 259257 },
]
[[package]]
@@ -503,7 +503,7 @@ wheels = [
[[package]]
name = "google-genai"
-version = "1.36.0"
+version = "1.38.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
@@ -515,9 +515,9 @@ dependencies = [
{ name = "typing-extensions" },
{ name = "websockets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/11/31/e4f6a049ce92ee4a961c37727c9c8ea68f3ab72f2a1880abc7dc309ea670/google_genai-1.36.0.tar.gz", hash = "sha256:6501f18cbf44488becab6fbff09529ff77e856f1baa65d55686261e4677cec3f", size = 243681 }
+sdist = { url = "https://files.pythonhosted.org/packages/b4/11/108ddd3aca8af6a9e2369e59b9646a3a4c64aefb39d154f6467ab8d79f34/google_genai-1.38.0.tar.gz", hash = "sha256:363272fc4f677d0be6a1aed7ebabe8adf45e1626a7011a7886a587e9464ca9ec", size = 244903 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a1/7a/61a9a98d09bc507d1c7e089a65b260cafd22f62b250d8e34acacc996f01d/google_genai-1.36.0-py3-none-any.whl", hash = "sha256:bd48d800547cb90e40648178620c89474807305b03f6cd147fb3cc7faab27670", size = 244345 },
+ { url = "https://files.pythonhosted.org/packages/53/6c/1de711bab3c118284904c3bedf870519e8c63a7a8e0905ac3833f1db9cbc/google_genai-1.38.0-py3-none-any.whl", hash = "sha256:95407425132d42b3fa11bc92b3f5cf61a0fbd8d9add1f0e89aac52c46fbba090", size = 245558 },
]
[[package]]
@@ -546,34 +546,37 @@ wheels = [
[[package]]
name = "grpcio"
-version = "1.74.0"
+version = "1.75.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/38/b4/35feb8f7cab7239c5b94bd2db71abb3d6adb5f335ad8f131abb6060840b6/grpcio-1.74.0.tar.gz", hash = "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1", size = 12756048 }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/91/88/fe2844eefd3d2188bc0d7a2768c6375b46dfd96469ea52d8aeee8587d7e0/grpcio-1.75.0.tar.gz", hash = "sha256:b989e8b09489478c2d19fecc744a298930f40d8b27c3638afbfe84d22f36ce4e", size = 12722485 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d4/d8/1004a5f468715221450e66b051c839c2ce9a985aa3ee427422061fcbb6aa/grpcio-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89", size = 5449488 },
- { url = "https://files.pythonhosted.org/packages/94/0e/33731a03f63740d7743dced423846c831d8e6da808fcd02821a4416df7fa/grpcio-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01", size = 10974059 },
- { url = "https://files.pythonhosted.org/packages/0d/c6/3d2c14d87771a421205bdca991467cfe473ee4c6a1231c1ede5248c62ab8/grpcio-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e", size = 5945647 },
- { url = "https://files.pythonhosted.org/packages/c5/83/5a354c8aaff58594eef7fffebae41a0f8995a6258bbc6809b800c33d4c13/grpcio-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91", size = 6626101 },
- { url = "https://files.pythonhosted.org/packages/3f/ca/4fdc7bf59bf6994aa45cbd4ef1055cd65e2884de6113dbd49f75498ddb08/grpcio-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249", size = 6182562 },
- { url = "https://files.pythonhosted.org/packages/fd/48/2869e5b2c1922583686f7ae674937986807c2f676d08be70d0a541316270/grpcio-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362", size = 6303425 },
- { url = "https://files.pythonhosted.org/packages/a6/0e/bac93147b9a164f759497bc6913e74af1cb632c733c7af62c0336782bd38/grpcio-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f", size = 6996533 },
- { url = "https://files.pythonhosted.org/packages/84/35/9f6b2503c1fd86d068b46818bbd7329db26a87cdd8c01e0d1a9abea1104c/grpcio-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20", size = 6491489 },
- { url = "https://files.pythonhosted.org/packages/75/33/a04e99be2a82c4cbc4039eb3a76f6c3632932b9d5d295221389d10ac9ca7/grpcio-1.74.0-cp313-cp313-win32.whl", hash = "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa", size = 3805811 },
- { url = "https://files.pythonhosted.org/packages/34/80/de3eb55eb581815342d097214bed4c59e806b05f1b3110df03b2280d6dfd/grpcio-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24", size = 4489214 },
+ { url = "https://files.pythonhosted.org/packages/00/64/dbce0ffb6edaca2b292d90999dd32a3bd6bc24b5b77618ca28440525634d/grpcio-1.75.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:1bb78d052948d8272c820bb928753f16a614bb2c42fbf56ad56636991b427518", size = 5666860 },
+ { url = "https://files.pythonhosted.org/packages/f3/e6/da02c8fa882ad3a7f868d380bb3da2c24d35dd983dd12afdc6975907a352/grpcio-1.75.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:9dc4a02796394dd04de0b9673cb79a78901b90bb16bf99ed8cb528c61ed9372e", size = 11455148 },
+ { url = "https://files.pythonhosted.org/packages/ba/a0/84f87f6c2cf2a533cfce43b2b620eb53a51428ec0c8fe63e5dd21d167a70/grpcio-1.75.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:437eeb16091d31498585d73b133b825dc80a8db43311e332c08facf820d36894", size = 6243865 },
+ { url = "https://files.pythonhosted.org/packages/be/12/53da07aa701a4839dd70d16e61ce21ecfcc9e929058acb2f56e9b2dd8165/grpcio-1.75.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c2c39984e846bd5da45c5f7bcea8fafbe47c98e1ff2b6f40e57921b0c23a52d0", size = 6915102 },
+ { url = "https://files.pythonhosted.org/packages/5b/c0/7eaceafd31f52ec4bf128bbcf36993b4bc71f64480f3687992ddd1a6e315/grpcio-1.75.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38d665f44b980acdbb2f0e1abf67605ba1899f4d2443908df9ec8a6f26d2ed88", size = 6432042 },
+ { url = "https://files.pythonhosted.org/packages/6b/12/a2ce89a9f4fc52a16ed92951f1b05f53c17c4028b3db6a4db7f08332bee8/grpcio-1.75.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e8e752ab5cc0a9c5b949808c000ca7586223be4f877b729f034b912364c3964", size = 7062984 },
+ { url = "https://files.pythonhosted.org/packages/55/a6/2642a9b491e24482d5685c0f45c658c495a5499b43394846677abed2c966/grpcio-1.75.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3a6788b30aa8e6f207c417874effe3f79c2aa154e91e78e477c4825e8b431ce0", size = 8001212 },
+ { url = "https://files.pythonhosted.org/packages/19/20/530d4428750e9ed6ad4254f652b869a20a40a276c1f6817b8c12d561f5ef/grpcio-1.75.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc33e67cab6141c54e75d85acd5dec616c5095a957ff997b4330a6395aa9b51", size = 7457207 },
+ { url = "https://files.pythonhosted.org/packages/e2/6f/843670007e0790af332a21468d10059ea9fdf97557485ae633b88bd70efc/grpcio-1.75.0-cp313-cp313-win32.whl", hash = "sha256:c8cfc780b7a15e06253aae5f228e1e84c0d3c4daa90faf5bc26b751174da4bf9", size = 3934235 },
+ { url = "https://files.pythonhosted.org/packages/4b/92/c846b01b38fdf9e2646a682b12e30a70dc7c87dfe68bd5e009ee1501c14b/grpcio-1.75.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c91d5b16eff3cbbe76b7a1eaaf3d91e7a954501e9d4f915554f87c470475c3d", size = 4637558 },
]
[[package]]
name = "grpcio-status"
-version = "1.74.0"
+version = "1.75.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "googleapis-common-protos" },
{ name = "grpcio" },
{ name = "protobuf" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/93/22/238c5f01e6837df54494deb08d5c772bc3f5bf5fb80a15dce254892d1a81/grpcio_status-1.74.0.tar.gz", hash = "sha256:c58c1b24aa454e30f1fc6a7e0dbbc194c54a408143971a94b5f4e40bb5831432", size = 13662 }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/8a/2e45ec0512d4ce9afa136c6e4186d063721b5b4c192eec7536ce6b7ba615/grpcio_status-1.75.0.tar.gz", hash = "sha256:69d5b91be1b8b926f086c1c483519a968c14640773a0ccdd6c04282515dbedf7", size = 13646 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/28/aa/1b1fe7d8ab699e1ec26d3a36b91d3df9f83a30abc07d4c881d0296b17b67/grpcio_status-1.74.0-py3-none-any.whl", hash = "sha256:52cdbd759a6760fc8f668098a03f208f493dd5c76bf8e02598bbbaf1f6fc2876", size = 14425 },
+ { url = "https://files.pythonhosted.org/packages/2b/24/d536f0a0fda3a3eeb334893e5fb9d567c2777de6a5384413f71b35cfd0e5/grpcio_status-1.75.0-py3-none-any.whl", hash = "sha256:de62557ef97b7e19c3ce6da19793a12c5f6c1fbbb918d233d9671aba9d9e1d78", size = 14424 },
]
[[package]]
@@ -648,6 +651,7 @@ dependencies = [
{ name = "pyarrow" },
{ name = "pyoso" },
{ name = "pyyaml" },
+ { name = "scipy" },
{ name = "trino" },
{ name = "vega-datasets" },
{ name = "web3" },
@@ -667,6 +671,7 @@ requires-dist = [
{ name = "pyarrow", specifier = ">=21.0.0" },
{ name = "pyoso", specifier = ">=0.6.5" },
{ name = "pyyaml", specifier = ">=6.0.2" },
+ { name = "scipy", specifier = ">=1.16.2" },
{ name = "trino", specifier = ">=0.336.0" },
{ name = "vega-datasets", specifier = ">=0.9.0" },
{ name = "web3", specifier = ">=7.13.0" },
@@ -734,38 +739,38 @@ wheels = [
[[package]]
name = "loro"
-version = "1.6.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fa/9e/dfdb32e85b4e3b3485162576e7d6b557b1b6450948255f5129866efccd4b/loro-1.6.0.tar.gz", hash = "sha256:f543b85c77f7366df2162de1c00e3dd2c2c75171b7e9670cffc0b6ac561d7293", size = 63849 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/77/b2/cf3ac17e3104dcffebf11e1c0eeb9fd063f99232aa7ad1978b31174b5389/loro-1.6.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e81fabda7b05ff6b6a0d742fbd5aff950b07ecdd484bf43f3492ff9f24e5f189", size = 3076319 },
- { url = "https://files.pythonhosted.org/packages/01/98/57fac35ec82302409586d564d389292733eb5c9f7e091fbf15f107439265/loro-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d417d6fccc7dea7c094aefdacd6096e93a1e9dc054aa40115ebab0e6cc8f2918", size = 2860968 },
- { url = "https://files.pythonhosted.org/packages/7d/50/2f0348ad2105dd8945b4a0a63db22c90d5e770aaf7399c81c5c074056612/loro-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b1a4b4ecd316be844341be361bca04b444e1be12660fbb5ed0360eb02535e0", size = 3108951 },
- { url = "https://files.pythonhosted.org/packages/66/5c/813492c3a568a84977482419d96c3cde2a44e0b6ade8823cd65cf47a727f/loro-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c5609bb34d00fc767d396b6b23988aaa506549c719bfe5d88de3594ab96c328a", size = 3186291 },
- { url = "https://files.pythonhosted.org/packages/b4/fd/8e22639c3fdbc5540ad42e1852e97cf8e6a705109ae4c6536795b02be927/loro-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1fe0618c18ecb11a36f6247e42b702c7810bac961b867f4a461a11de4fae70d7", size = 3555655 },
- { url = "https://files.pythonhosted.org/packages/5b/d9/ec32a72f863fffcc3935d1825271116dc4ea214944074b4e3738060815a7/loro-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa27a487bda836cf890c4be40350b9c449c72e9fe0be71e4b5f3344d476797c9", size = 3290644 },
- { url = "https://files.pythonhosted.org/packages/98/6e/6507d029efe5caa9b4453812afcf4f294925a7723427d75c6c35075782e6/loro-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52ddc2121aca2c4d8922f8cd6301b53c485369056da38db96e301a0b46c35659", size = 3238641 },
- { url = "https://files.pythonhosted.org/packages/ee/cb/b04036097a9a54db2753837e7e730f2f9a3331cd93a25dfca6f69a4e251f/loro-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1adaba4fae3773356067c0cc42a46ab1073c85dac021c1dbf7356a4c31b88a14", size = 3495139 },
- { url = "https://files.pythonhosted.org/packages/e4/8d/0299361757a0dce5a67b49b9c7a7d0e2db4963b6da42ac861402fe01ce83/loro-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a33e42aca4680e3bc067d953dd2a4013f972ed7ff47c8e60cfe8a035d0b7066", size = 3260701 },
- { url = "https://files.pythonhosted.org/packages/d1/b8/e6fcc3e06806b21785dc4ed0c5df14ce671c7b9a52f1b1d9a4eac0de1bc5/loro-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f265a379207d10722d6be486fefc8f852aadb495423fbe2a4ccb78d5f7268885", size = 3448086 },
- { url = "https://files.pythonhosted.org/packages/24/48/eb45ffbe89685af485aed662b9d5b566dda0f6b62010922ea5a8c1ce7176/loro-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4f4700233a7cca1f4ee6c515a617496a7378c9d1af235bd76636878622c3f265", size = 3491324 },
- { url = "https://files.pythonhosted.org/packages/da/d5/55ebccdc7f974e651bc4c56f788d624a3a60bc299801ce3581d21fcbfbc8/loro-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d1386d9a32cdc1f84235cc579d0d038d24a8fe68ae8f19f9bc3dfcbe0b38e0b9", size = 3404214 },
- { url = "https://files.pythonhosted.org/packages/de/f2/aef74bd9dcc65449ad2eb4adf2e392d52a1761e76de6b64b4094ec2da04f/loro-1.6.0-cp313-cp313-win32.whl", hash = "sha256:b5051d628d6404bec73a355cfd3e75b3d8c6be287b470956e83846bd000dcd3f", size = 2585936 },
- { url = "https://files.pythonhosted.org/packages/56/c5/313975f7d41a2dba78d04d95051b4a0d8c98f278dc1916ecf8f4e78b972d/loro-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:ae8269e826c3a0c401d24efeeff1b95040df4c4bd8fc0b79f0a3c04005e31fc2", size = 2746678 },
- { url = "https://files.pythonhosted.org/packages/d2/6c/0146e45d16ad68eb846ffea9bffde704e6cb8b7c84948b410e251d0ac1b8/loro-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31d40258f35bf3316020370ee5c1b24bf46689142b1d27abb824c2b5a834f1e", size = 3108286 },
- { url = "https://files.pythonhosted.org/packages/1c/01/c92dac8261ae03b49c4d5577382c2d52301346e670af556cd6492f413be9/loro-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2b335fc483c19cce84cfe2cf16a21d02a6df7c750906791c605c273f04695b2", size = 3181384 },
- { url = "https://files.pythonhosted.org/packages/28/09/212d5e86236bc4fe212c8edcb44c841dbd361ed0133c22f490fdfcc05317/loro-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:406b538128001c507fe3d922ff1efdc721be44b4d7d078488e76afee605a42d3", size = 3552402 },
- { url = "https://files.pythonhosted.org/packages/46/63/3568800791fb7a44d9c7c052415e9554ba43cfb394536e14f56e85316f43/loro-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f2fc4db7b5dfefecc5caf7cc4cee50538369fba7adde235ecdde85303426a9a", size = 3290210 },
- { url = "https://files.pythonhosted.org/packages/91/9d/48482b135fc7366931a73cdb4af43cd050b21595e6059e1ca660613e1690/loro-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:625697361cf71fc95e4a855cc2ab523ed8e573d9d338485536856559b2446ad1", size = 3258404 },
- { url = "https://files.pythonhosted.org/packages/f4/a8/7071db3470ec51a1fc5fa875517c4bd128a742045f55cceeea0bb892309e/loro-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:423bda709359390cef568c5b6495b8fbba3097306384492d440dfe3b917a7a8a", size = 3443698 },
- { url = "https://files.pythonhosted.org/packages/48/22/713b4bae9847b22c59480362ebb00cca981e46874691b4676cb8c1b575f6/loro-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:975bd2d570a216e15d74edf1ab62015d6d501b1f2e1c37d27c69f4b79a776e7f", size = 3485093 },
- { url = "https://files.pythonhosted.org/packages/d4/c9/af48a3628e67fe11964717e532892fc007c569567af9db243bf27e180e1f/loro-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bbb46223a00a128bb8d2aeadd885feceb09f5d3f9ce9a76605fb6e1f0633518", size = 3402754 },
- { url = "https://files.pythonhosted.org/packages/82/2f/89c50eff27346d646c765383ad8fc01d27dfe4fba8d0caba3f1079dc9e3f/loro-1.6.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:12c3534766c63366af320704821e0edb04c302081ca8eef315cfc08058680204", size = 3060404 },
- { url = "https://files.pythonhosted.org/packages/08/b8/eb993ebad42271a23add5c99bbc1641e2388864e8637b3bdb8e8ecd52466/loro-1.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20678ee6f37f5e78f5e8262a83510cff3669e5fdb2a34c23c7e82c2389604295", size = 2850228 },
- { url = "https://files.pythonhosted.org/packages/c0/85/8a7ab8888101f56f93ebaa81c5203039f9544e8f2c0df3d4abd3b0a17423/loro-1.6.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2be102c1ab43fa0c5d592c2b26d81ab7b0f48efae69dc1940afd35d3f5b65d5", size = 3220322 },
- { url = "https://files.pythonhosted.org/packages/b5/2f/8c44a25b506a589df6359cde382e08c6ea35ec57165a19197abf8429e6e6/loro-1.6.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c7f2e6aa42107ad89082f2cb7d873ee4dc5d91cab801f63a6aa9ce2e87c82d", size = 3482803 },
- { url = "https://files.pythonhosted.org/packages/b0/01/b0f290185a74166a948d2402da810c45b9071cb454680c6e688fab06d90f/loro-1.6.0-cp314-cp314-win32.whl", hash = "sha256:1422b01d780218bd87a6dbe738c885b27d7034bb8d34b269876cadc379e484ab", size = 2572334 },
- { url = "https://files.pythonhosted.org/packages/4f/8b/f641421fa11c7fde5dd3ed78a823ebdb19dcc7a5b09f2e07927db59bea67/loro-1.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:532c2fd24d5da7aafc1375389113f61da02aa7061e286cc96fb265d9c73658b5", size = 2725881 },
+version = "1.8.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/00/be/4e00ced4b8f2d852dc581109de9b4cd9362395e276b509eece098c42eedd/loro-1.8.1.tar.gz", hash = "sha256:22cfb19625bd7245e9747ee9d43b10511c16a35775a38cf914dc74863c4dbe88", size = 64093 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/7c/e0f6d6376dedb504e826b09a71bb871f4c032c2c95db0f96ee9f1b463a17/loro-1.8.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:55ee9ded98d6e328f210a1b9e2f01e8befb6994da82dd03756c56d8aa047a2ce", size = 3088156 },
+ { url = "https://files.pythonhosted.org/packages/7b/3c/9fa9fd4a244539943df17c4fb3e3c5e90f0726731b9bf59bfbd9e57b09bb/loro-1.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4dcc9a3f558912d0ba2d39954f8391084e987e7970b375bfd96f67d9499ad4a0", size = 2879185 },
+ { url = "https://files.pythonhosted.org/packages/5b/f2/48ab3634a1dc3f5951e05905d93c7e9dc2061d93e1facf6896f0d385cb61/loro-1.8.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a2b318bb08d1bdc7a0b8467a7ec6d90c7c46b0c58e7aafc9fc307825fa868f7", size = 3115017 },
+ { url = "https://files.pythonhosted.org/packages/00/a1/7a80b48fca9366cb6867e4394b80dae7db9044e3f1e8ed586d5dfc467c2c/loro-1.8.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42a7e09cb68da97559cd103a93ae69004bb929fba3db6a13846c83ac979698ce", size = 3181487 },
+ { url = "https://files.pythonhosted.org/packages/50/f9/881d9a4658f5d33ac822735ee503d8e5590db552a1ac3f992a36a4fae03d/loro-1.8.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc5acb22ca0ae3e6793024cfc3ea99f200b57c549fa71e48cdaedf22cde6fe19", size = 3566686 },
+ { url = "https://files.pythonhosted.org/packages/be/6b/3ff95d187483b0f71e026e86a3b3043e27048d9a554777254b8005f396c8/loro-1.8.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92b19a44b16e86dced2b76d760715f1099aa99433c908e0fe5627d7897b98d", size = 3286348 },
+ { url = "https://files.pythonhosted.org/packages/31/03/414915e26d2463107425f3ff249a2f992f2b15d0f98d75c99422fc34eb48/loro-1.8.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eed7933a3e1500c5a8e826c5faf7904ce253725512234eb2b2bfb01ca085217", size = 3177439 },
+ { url = "https://files.pythonhosted.org/packages/d0/25/538488ceb0a7b857eadecc4e46c6bea20df2b9f6ad1660ad6d10b201d931/loro-1.8.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e62783de33f8bf0cf8b834defacd4dd62d1adb227d93d9d24cc28febf9f53eec", size = 3508131 },
+ { url = "https://files.pythonhosted.org/packages/6a/f0/8c06a5ae198c7fdc636fd40cf6edc604b45e51affbd537d099eb93a95143/loro-1.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8f394e65acd54af19b5cea796d9d9aa4e512f7979f8514f6938fd9813a753f5", size = 3295009 },
+ { url = "https://files.pythonhosted.org/packages/bf/4a/2fb82afaab5899cc3a05d31e4059aded41571e6fd5c310cb5bc5520c563f/loro-1.8.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6205cc3fcb75b4913678ca399ab97abab0f253c8f72ece637d183979c06d19a1", size = 3444600 },
+ { url = "https://files.pythonhosted.org/packages/f6/87/4b9ac56d371c7a4b85ea223ca17b7ab33de858dab8a1a176ad33af9d7cb7/loro-1.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1cd5d028309f8ae94b14b7b1fb3a6e488b8a09d205a37d44eb3af04061be742", size = 3489090 },
+ { url = "https://files.pythonhosted.org/packages/32/90/abf2a9f9f6c0cfd6ccb940fa81d9561767d01d43684505884e404ee4e930/loro-1.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3da7bc3cc0e8b04f094bc52c3f416f86be4c3a332dcbd9428b466d98329f26f5", size = 3393536 },
+ { url = "https://files.pythonhosted.org/packages/4a/34/76136846dc793e96a34f73220d65279f7b7f391a3446838fd095bf804d73/loro-1.8.1-cp313-cp313-win32.whl", hash = "sha256:a90e5d56a030e284a998b73a1c55c5b8c5f62f96bee4cc017b88ff815f9fb743", size = 2598079 },
+ { url = "https://files.pythonhosted.org/packages/f5/6e/dfd0d18a7bd7d90b111cde4e628e0fc26d70307caae33f3ee6d28094125b/loro-1.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:fbee625170327de616709af943410b72c5a4c12ebd8f7dff6324d59aa51da5b2", size = 2742638 },
+ { url = "https://files.pythonhosted.org/packages/6c/ac/e134286c4275af5ab0149ee1a200c64f35df2cccb1b70142af04b509ed7f/loro-1.8.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df6f3dfa58cebfe1f0e08a8a929303338c506733dd8650afd3d1f3ac70546ece", size = 3109397 },
+ { url = "https://files.pythonhosted.org/packages/0d/ee/578a588f5f0a642491b852d0bc7bbec90e6a93fa95b12c4e22e7514d156e/loro-1.8.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c632a0a4a00f4a73df32fcaf266320995f89b68fc5f1d875efc979cda810babd", size = 3182019 },
+ { url = "https://files.pythonhosted.org/packages/fc/b6/6b8932e77fb6563fcab5ce470a3b754a758b8ce743a389b14ba9c436cd5d/loro-1.8.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:888de919b082ace4cb88f7244aa7a5263233604fc0fb9e7571703940a6897be2", size = 3562136 },
+ { url = "https://files.pythonhosted.org/packages/3d/a6/440e9ff25150908e9e91362fed32097c008956ff173e9d852adfd06ce25f/loro-1.8.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1689f8fd79dc76f75e4bd027e9685bb73b44e0b60cfc0412d78369da300e6f68", size = 3283645 },
+ { url = "https://files.pythonhosted.org/packages/f3/3d/4444939a3d244242dbcc14c98789c7c89d2468cb541629695335a953cbc3/loro-1.8.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:028194142bc4b628ec0f926018fbfd18d92912d69eb2f57a14adf4a3ef1fc7e7", size = 3288947 },
+ { url = "https://files.pythonhosted.org/packages/2a/43/70201ccf7b57f172ee1bb4d14fc7194359802aa17c1ac1608d503c19ee47/loro-1.8.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:9e6dde01971d72ba678161aaa24bc5261929def86a6feb8149d3e2dab0964aea", size = 3444718 },
+ { url = "https://files.pythonhosted.org/packages/14/b8/01c1d4339ab67d8aff6a5038db6251f6d44967a663f2692be6aabe276035/loro-1.8.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8d3789752b26b40f26a44a80d784a4f9e40f2bd0e40a4eeb01e1e386920feaaa", size = 3490418 },
+ { url = "https://files.pythonhosted.org/packages/60/67/88e0edaf4158184d87eee4efdce283306831632ef7ef010153abf6d36b82/loro-1.8.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ab04743218b6cbbfdf4ca74d158aed20ed0c9d7019620d35548e89f1d519923b", size = 3389761 },
+ { url = "https://files.pythonhosted.org/packages/54/fb/ccf317276518df910340ddf7729a0ed1602d215db1f6ca8ccda0fc6071df/loro-1.8.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:29c25f33c659a8027974cd88c94f08b4708376b200290a858c8abd891d64ba15", size = 3072231 },
+ { url = "https://files.pythonhosted.org/packages/bd/5c/87f37c4bbef478373b15ad4052ab9ee69ae87646a9c853dda97147f4e87a/loro-1.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a9643d19eee7379b6980fc3b31a492bd22aa1e9aaa6fd67c8b5b4b57a0c7a1c", size = 2870631 },
+ { url = "https://files.pythonhosted.org/packages/a2/7f/b0d121297000d1278c4be96ebaed245b7e1edf74851b9ed5aa552daf85eb/loro-1.8.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323370115c37a793e805952e21703d8e8c91cc7ef16dd3a378043fe40174599f", size = 3156119 },
+ { url = "https://files.pythonhosted.org/packages/70/ee/35c62e7acfc572397ffb09db60f20b32be422a7983ae3d891527983a6a7e/loro-1.8.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69265d6751e536fd7ba1f04c6be200239b4d8090bcd1325a95ded08621c4c910", size = 3492080 },
+ { url = "https://files.pythonhosted.org/packages/23/36/543916bb43228e4d13e155d9f31cbe16cf4f995d306aa5dbf4aba2b44170/loro-1.8.1-cp314-cp314-win32.whl", hash = "sha256:00c3662f50b81276a0f45d90504402e36512fda9f98e3e9353cc2b2394aa56a5", size = 2584938 },
+ { url = "https://files.pythonhosted.org/packages/4e/b1/8369c393107cafcaf6d5bdfe8cc4fead384b8ab8c7ddaf5d16235e5482e2/loro-1.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:c6ebacceed553dad118dd61f946f5f8fb23ace5ca93e8ee8ebd4f6ca4cffa854", size = 2722278 },
]
[[package]]
@@ -786,7 +791,7 @@ wheels = [
[[package]]
name = "marimo"
-version = "0.15.3"
+version = "0.16.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
@@ -807,9 +812,9 @@ dependencies = [
{ name = "uvicorn" },
{ name = "websockets" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/d5/a9/a5f39815e93688219fcad5604e14578c2dec54447370f9ec79256c4d01dc/marimo-0.15.3.tar.gz", hash = "sha256:110e90229381b963349b0a9ec33177ad700e73e76c20b500ed60d082c81ba0c5", size = 31720473 }
+sdist = { url = "https://files.pythonhosted.org/packages/5f/62/d8def85c7ddf58a3a371eef3e553b8426e685b99a9cb8c3847c702422ec8/marimo-0.16.2.tar.gz", hash = "sha256:2bd90431846c470b4a83ded7ee8b4442854c47ad670b0aafa5fe697e54bddd5a", size = 33654187 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/97/bb/e922181c69207b3eea4717f74fcdf806b4a5669caa7e31b0b7a9c5e30c1b/marimo-0.15.3-py3-none-any.whl", hash = "sha256:199c55bbc369db64dc20a1ed98814bfea321820acdabb7e01b262fea8f46507d", size = 31965498 },
+ { url = "https://files.pythonhosted.org/packages/b3/0c/65a605b99486461babb6a44e516cff7cfd892a7476df8c9990e023c07625/marimo-0.16.2-py3-none-any.whl", hash = "sha256:4617864fec69a5114ce74d3200dd2f1fb38e3757afd00e0a89b2fe2b56532d09", size = 34058910 },
]
[[package]]
@@ -1152,17 +1157,18 @@ wheels = [
[[package]]
name = "psutil"
-version = "7.0.0"
+version = "7.1.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 }
+sdist = { url = "https://files.pythonhosted.org/packages/b3/31/4723d756b59344b643542936e37a31d1d3204bcdc42a7daa8ee9eb06fb50/psutil-7.1.0.tar.gz", hash = "sha256:655708b3c069387c8b77b072fc429a57d0e214221d01c0a772df7dfedcb3bcd2", size = 497660 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 },
- { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 },
- { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 },
- { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 },
- { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 },
- { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 },
- { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 },
+ { url = "https://files.pythonhosted.org/packages/46/62/ce4051019ee20ce0ed74432dd73a5bb087a6704284a470bb8adff69a0932/psutil-7.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76168cef4397494250e9f4e73eb3752b146de1dd950040b29186d0cce1d5ca13", size = 245242 },
+ { url = "https://files.pythonhosted.org/packages/38/61/f76959fba841bf5b61123fbf4b650886dc4094c6858008b5bf73d9057216/psutil-7.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:5d007560c8c372efdff9e4579c2846d71de737e4605f611437255e81efcca2c5", size = 246682 },
+ { url = "https://files.pythonhosted.org/packages/88/7a/37c99d2e77ec30d63398ffa6a660450b8a62517cabe44b3e9bae97696e8d/psutil-7.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e4454970b32472ce7deaa45d045b34d3648ce478e26a04c7e858a0a6e75ff3", size = 287994 },
+ { url = "https://files.pythonhosted.org/packages/9d/de/04c8c61232f7244aa0a4b9a9fbd63a89d5aeaf94b2fc9d1d16e2faa5cbb0/psutil-7.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c70e113920d51e89f212dd7be06219a9b88014e63a4cec69b684c327bc474e3", size = 291163 },
+ { url = "https://files.pythonhosted.org/packages/f4/58/c4f976234bf6d4737bc8c02a81192f045c307b72cf39c9e5c5a2d78927f6/psutil-7.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d4a113425c037300de3ac8b331637293da9be9713855c4fc9d2d97436d7259d", size = 293625 },
+ { url = "https://files.pythonhosted.org/packages/79/87/157c8e7959ec39ced1b11cc93c730c4fb7f9d408569a6c59dbd92ceb35db/psutil-7.1.0-cp37-abi3-win32.whl", hash = "sha256:09ad740870c8d219ed8daae0ad3b726d3bf9a028a198e7f3080f6a1888b99bca", size = 244812 },
+ { url = "https://files.pythonhosted.org/packages/bf/e9/b44c4f697276a7a95b8e94d0e320a7bf7f3318521b23de69035540b39838/psutil-7.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:57f5e987c36d3146c0dd2528cd42151cf96cd359b9d67cfff836995cc5df9a3d", size = 247965 },
+ { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971 },
]
[[package]]
@@ -1240,7 +1246,7 @@ wheels = [
[[package]]
name = "pydantic"
-version = "2.11.7"
+version = "2.11.9"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "annotated-types" },
@@ -1248,9 +1254,9 @@ dependencies = [
{ name = "typing-extensions" },
{ name = "typing-inspection" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 }
+sdist = { url = "https://files.pythonhosted.org/packages/ff/5d/09a551ba512d7ca404d785072700d3f6727a02f6f3c24ecfd081c7cf0aa8/pydantic-2.11.9.tar.gz", hash = "sha256:6b8ffda597a14812a7975c90b82a8a2e777d9257aba3453f973acd3c032a18e2", size = 788495 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 },
+ { url = "https://files.pythonhosted.org/packages/3e/d3/108f2006987c58e76691d5ae5d200dd3e0f532cb4e5fa3560751c3a1feba/pydantic-2.11.9-py3-none-any.whl", hash = "sha256:c42dd626f5cfc1c6950ce6205ea58c93efa406da65f479dcb4029d5934857da2", size = 444855 },
]
[[package]]
@@ -1305,7 +1311,7 @@ wheels = [
[[package]]
name = "pyoso"
-version = "0.6.5"
+version = "0.6.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pandas" },
@@ -1313,9 +1319,9 @@ dependencies = [
{ name = "requests" },
{ name = "sqlglot" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/6c/f0/41a7cdec437513f87d45b8035717792c77f9dd5d4c8f32e973ccf340c0cc/pyoso-0.6.5.tar.gz", hash = "sha256:1e19a5202adba5975842aeb5e51af89eaba400e85769985b3e2f2ba0c526613a", size = 11017 }
+sdist = { url = "https://files.pythonhosted.org/packages/07/c9/105d21951195378cf4ae15fc06e29a190d6dc5bcc8f93b63f5d50fc47b39/pyoso-0.6.6.tar.gz", hash = "sha256:1faf8c0668d9a2d4b1fce2f762b891423185ba7555ac11192ebdc3b61527e5ab", size = 10582 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d6/63/e84175236f40b53fe9e2263fd67efafb268144758282e9d934688bd0129f/pyoso-0.6.5-py3-none-any.whl", hash = "sha256:aed1f396f6ff7c91c23be83799981a0b73b114117eae910251e8005455a4239b", size = 9949 },
+ { url = "https://files.pythonhosted.org/packages/af/b0/7a1d5fee5441d703de8374798e5a8f27da36409c1b4fedd03bd8f0f1aee2/pyoso-0.6.6-py3-none-any.whl", hash = "sha256:aa444cdb7f2712e5a36115cf9baab068a09aa4bc60f61f5d6c0a0de2581c7155", size = 9241 },
]
[[package]]
@@ -1402,38 +1408,66 @@ wheels = [
[[package]]
name = "regex"
-version = "2025.9.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b2/5a/4c63457fbcaf19d138d72b2e9b39405954f98c0349b31c601bfcb151582c/regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff", size = 400852 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/98/25/b2959ce90c6138c5142fe5264ee1f9b71a0c502ca4c7959302a749407c79/regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef", size = 485932 },
- { url = "https://files.pythonhosted.org/packages/49/2e/6507a2a85f3f2be6643438b7bd976e67ad73223692d6988eb1ff444106d3/regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025", size = 289568 },
- { url = "https://files.pythonhosted.org/packages/c7/d8/de4a4b57215d99868f1640e062a7907e185ec7476b4b689e2345487c1ff4/regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad", size = 286984 },
- { url = "https://files.pythonhosted.org/packages/03/15/e8cb403403a57ed316e80661db0e54d7aa2efcd85cb6156f33cc18746922/regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2", size = 797514 },
- { url = "https://files.pythonhosted.org/packages/e4/26/2446f2b9585fed61faaa7e2bbce3aca7dd8df6554c32addee4c4caecf24a/regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249", size = 862586 },
- { url = "https://files.pythonhosted.org/packages/fd/b8/82ffbe9c0992c31bbe6ae1c4b4e21269a5df2559102b90543c9b56724c3c/regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba", size = 910815 },
- { url = "https://files.pythonhosted.org/packages/2f/d8/7303ea38911759c1ee30cc5bc623ee85d3196b733c51fd6703c34290a8d9/regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a", size = 802042 },
- { url = "https://files.pythonhosted.org/packages/fc/0e/6ad51a55ed4b5af512bb3299a05d33309bda1c1d1e1808fa869a0bed31bc/regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df", size = 786764 },
- { url = "https://files.pythonhosted.org/packages/8d/d5/394e3ffae6baa5a9217bbd14d96e0e5da47bb069d0dbb8278e2681a2b938/regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0", size = 856557 },
- { url = "https://files.pythonhosted.org/packages/cd/80/b288d3910c41194ad081b9fb4b371b76b0bbfdce93e7709fc98df27b37dc/regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac", size = 849108 },
- { url = "https://files.pythonhosted.org/packages/d1/cd/5ec76bf626d0d5abdc277b7a1734696f5f3d14fbb4a3e2540665bc305d85/regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7", size = 788201 },
- { url = "https://files.pythonhosted.org/packages/b5/36/674672f3fdead107565a2499f3007788b878188acec6d42bc141c5366c2c/regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8", size = 264508 },
- { url = "https://files.pythonhosted.org/packages/83/ad/931134539515eb64ce36c24457a98b83c1b2e2d45adf3254b94df3735a76/regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7", size = 275469 },
- { url = "https://files.pythonhosted.org/packages/24/8c/96d34e61c0e4e9248836bf86d69cb224fd222f270fa9045b24e218b65604/regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0", size = 268586 },
- { url = "https://files.pythonhosted.org/packages/21/b1/453cbea5323b049181ec6344a803777914074b9726c9c5dc76749966d12d/regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1", size = 486111 },
- { url = "https://files.pythonhosted.org/packages/f6/0e/92577f197bd2f7652c5e2857f399936c1876978474ecc5b068c6d8a79c86/regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03", size = 289520 },
- { url = "https://files.pythonhosted.org/packages/af/c6/b472398116cca7ea5a6c4d5ccd0fc543f7fd2492cb0c48d2852a11972f73/regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca", size = 287215 },
- { url = "https://files.pythonhosted.org/packages/cf/11/f12ecb0cf9ca792a32bb92f758589a84149017467a544f2f6bfb45c0356d/regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597", size = 797855 },
- { url = "https://files.pythonhosted.org/packages/46/88/bbb848f719a540fb5997e71310f16f0b33a92c5d4b4d72d4311487fff2a3/regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5", size = 863363 },
- { url = "https://files.pythonhosted.org/packages/54/a9/2321eb3e2838f575a78d48e03c1e83ea61bd08b74b7ebbdeca8abc50fc25/regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d", size = 910202 },
- { url = "https://files.pythonhosted.org/packages/33/07/d1d70835d7d11b7e126181f316f7213c4572ecf5c5c97bdbb969fb1f38a2/regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171", size = 801808 },
- { url = "https://files.pythonhosted.org/packages/13/d1/29e4d1bed514ef2bf3a4ead3cb8bb88ca8af94130239a4e68aa765c35b1c/regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5", size = 786824 },
- { url = "https://files.pythonhosted.org/packages/33/27/20d8ccb1bee460faaa851e6e7cc4cfe852a42b70caa1dca22721ba19f02f/regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a", size = 857406 },
- { url = "https://files.pythonhosted.org/packages/74/fe/60c6132262dc36430d51e0c46c49927d113d3a38c1aba6a26c7744c84cf3/regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b", size = 848593 },
- { url = "https://files.pythonhosted.org/packages/cc/ae/2d4ff915622fabbef1af28387bf71e7f2f4944a348b8460d061e85e29bf0/regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273", size = 787951 },
- { url = "https://files.pythonhosted.org/packages/85/37/dc127703a9e715a284cc2f7dbdd8a9776fd813c85c126eddbcbdd1ca5fec/regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86", size = 269833 },
- { url = "https://files.pythonhosted.org/packages/83/bf/4bed4d3d0570e16771defd5f8f15f7ea2311edcbe91077436d6908956c4a/regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70", size = 278742 },
- { url = "https://files.pythonhosted.org/packages/cf/3e/7d7ac6fd085023312421e0d69dfabdfb28e116e513fadbe9afe710c01893/regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993", size = 271860 },
+version = "2025.9.18"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/49/d3/eaa0d28aba6ad1827ad1e716d9a93e1ba963ada61887498297d3da715133/regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4", size = 400917 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/c7/5c48206a60ce33711cf7dcaeaed10dd737733a3569dc7e1dce324dd48f30/regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2", size = 485955 },
+ { url = "https://files.pythonhosted.org/packages/e9/be/74fc6bb19a3c491ec1ace943e622b5a8539068771e8705e469b2da2306a7/regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb", size = 289583 },
+ { url = "https://files.pythonhosted.org/packages/25/c4/9ceaa433cb5dc515765560f22a19578b95b92ff12526e5a259321c4fc1a0/regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af", size = 287000 },
+ { url = "https://files.pythonhosted.org/packages/7d/e6/68bc9393cb4dc68018456568c048ac035854b042bc7c33cb9b99b0680afa/regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29", size = 797535 },
+ { url = "https://files.pythonhosted.org/packages/6a/1c/ebae9032d34b78ecfe9bd4b5e6575b55351dc8513485bb92326613732b8c/regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f", size = 862603 },
+ { url = "https://files.pythonhosted.org/packages/3b/74/12332c54b3882557a4bcd2b99f8be581f5c6a43cf1660a85b460dd8ff468/regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68", size = 910829 },
+ { url = "https://files.pythonhosted.org/packages/86/70/ba42d5ed606ee275f2465bfc0e2208755b06cdabd0f4c7c4b614d51b57ab/regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783", size = 802059 },
+ { url = "https://files.pythonhosted.org/packages/da/c5/fcb017e56396a7f2f8357412638d7e2963440b131a3ca549be25774b3641/regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac", size = 786781 },
+ { url = "https://files.pythonhosted.org/packages/c6/ee/21c4278b973f630adfb3bcb23d09d83625f3ab1ca6e40ebdffe69901c7a1/regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e", size = 856578 },
+ { url = "https://files.pythonhosted.org/packages/87/0b/de51550dc7274324435c8f1539373ac63019b0525ad720132866fff4a16a/regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23", size = 849119 },
+ { url = "https://files.pythonhosted.org/packages/60/52/383d3044fc5154d9ffe4321696ee5b2ee4833a28c29b137c22c33f41885b/regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f", size = 788219 },
+ { url = "https://files.pythonhosted.org/packages/20/bd/2614fc302671b7359972ea212f0e3a92df4414aaeacab054a8ce80a86073/regex-2025.9.18-cp313-cp313-win32.whl", hash = "sha256:3810a65675845c3bdfa58c3c7d88624356dd6ee2fc186628295e0969005f928d", size = 264517 },
+ { url = "https://files.pythonhosted.org/packages/07/0f/ab5c1581e6563a7bffdc1974fb2d25f05689b88e2d416525271f232b1946/regex-2025.9.18-cp313-cp313-win_amd64.whl", hash = "sha256:16eaf74b3c4180ede88f620f299e474913ab6924d5c4b89b3833bc2345d83b3d", size = 275481 },
+ { url = "https://files.pythonhosted.org/packages/49/22/ee47672bc7958f8c5667a587c2600a4fba8b6bab6e86bd6d3e2b5f7cac42/regex-2025.9.18-cp313-cp313-win_arm64.whl", hash = "sha256:4dc98ba7dd66bd1261927a9f49bd5ee2bcb3660f7962f1ec02617280fc00f5eb", size = 268598 },
+ { url = "https://files.pythonhosted.org/packages/e8/83/6887e16a187c6226cb85d8301e47d3b73ecc4505a3a13d8da2096b44fd76/regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2", size = 489765 },
+ { url = "https://files.pythonhosted.org/packages/51/c5/e2f7325301ea2916ff301c8d963ba66b1b2c1b06694191df80a9c4fea5d0/regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3", size = 291228 },
+ { url = "https://files.pythonhosted.org/packages/91/60/7d229d2bc6961289e864a3a3cfebf7d0d250e2e65323a8952cbb7e22d824/regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12", size = 289270 },
+ { url = "https://files.pythonhosted.org/packages/3c/d7/b4f06868ee2958ff6430df89857fbf3d43014bbf35538b6ec96c2704e15d/regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0", size = 806326 },
+ { url = "https://files.pythonhosted.org/packages/d6/e4/bca99034a8f1b9b62ccf337402a8e5b959dd5ba0e5e5b2ead70273df3277/regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6", size = 871556 },
+ { url = "https://files.pythonhosted.org/packages/6d/df/e06ffaf078a162f6dd6b101a5ea9b44696dca860a48136b3ae4a9caf25e2/regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef", size = 913817 },
+ { url = "https://files.pythonhosted.org/packages/9e/05/25b05480b63292fd8e84800b1648e160ca778127b8d2367a0a258fa2e225/regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a", size = 811055 },
+ { url = "https://files.pythonhosted.org/packages/70/97/7bc7574655eb651ba3a916ed4b1be6798ae97af30104f655d8efd0cab24b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d", size = 794534 },
+ { url = "https://files.pythonhosted.org/packages/b4/c2/d5da49166a52dda879855ecdba0117f073583db2b39bb47ce9a3378a8e9e/regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368", size = 866684 },
+ { url = "https://files.pythonhosted.org/packages/bd/2d/0a5c4e6ec417de56b89ff4418ecc72f7e3feca806824c75ad0bbdae0516b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90", size = 853282 },
+ { url = "https://files.pythonhosted.org/packages/f4/8e/d656af63e31a86572ec829665d6fa06eae7e144771e0330650a8bb865635/regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7", size = 797830 },
+ { url = "https://files.pythonhosted.org/packages/db/ce/06edc89df8f7b83ffd321b6071be4c54dc7332c0f77860edc40ce57d757b/regex-2025.9.18-cp313-cp313t-win32.whl", hash = "sha256:168be0d2f9b9d13076940b1ed774f98595b4e3c7fc54584bba81b3cc4181742e", size = 267281 },
+ { url = "https://files.pythonhosted.org/packages/83/9a/2b5d9c8b307a451fd17068719d971d3634ca29864b89ed5c18e499446d4a/regex-2025.9.18-cp313-cp313t-win_amd64.whl", hash = "sha256:d59ecf3bb549e491c8104fea7313f3563c7b048e01287db0a90485734a70a730", size = 278724 },
+ { url = "https://files.pythonhosted.org/packages/3d/70/177d31e8089a278a764f8ec9a3faac8d14a312d622a47385d4b43905806f/regex-2025.9.18-cp313-cp313t-win_arm64.whl", hash = "sha256:dbef80defe9fb21310948a2595420b36c6d641d9bea4c991175829b2cc4bc06a", size = 269771 },
+ { url = "https://files.pythonhosted.org/packages/44/b7/3b4663aa3b4af16819f2ab6a78c4111c7e9b066725d8107753c2257448a5/regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129", size = 486130 },
+ { url = "https://files.pythonhosted.org/packages/80/5b/4533f5d7ac9c6a02a4725fe8883de2aebc713e67e842c04cf02626afb747/regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea", size = 289539 },
+ { url = "https://files.pythonhosted.org/packages/b8/8d/5ab6797c2750985f79e9995fad3254caa4520846580f266ae3b56d1cae58/regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1", size = 287233 },
+ { url = "https://files.pythonhosted.org/packages/cb/1e/95afcb02ba8d3a64e6ffeb801718ce73471ad6440c55d993f65a4a5e7a92/regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47", size = 797876 },
+ { url = "https://files.pythonhosted.org/packages/c8/fb/720b1f49cec1f3b5a9fea5b34cd22b88b5ebccc8c1b5de9cc6f65eed165a/regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379", size = 863385 },
+ { url = "https://files.pythonhosted.org/packages/a9/ca/e0d07ecf701e1616f015a720dc13b84c582024cbfbb3fc5394ae204adbd7/regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203", size = 910220 },
+ { url = "https://files.pythonhosted.org/packages/b6/45/bba86413b910b708eca705a5af62163d5d396d5f647ed9485580c7025209/regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164", size = 801827 },
+ { url = "https://files.pythonhosted.org/packages/b8/a6/740fbd9fcac31a1305a8eed30b44bf0f7f1e042342be0a4722c0365ecfca/regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb", size = 786843 },
+ { url = "https://files.pythonhosted.org/packages/80/a7/0579e8560682645906da640c9055506465d809cb0f5415d9976f417209a6/regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743", size = 857430 },
+ { url = "https://files.pythonhosted.org/packages/8d/9b/4dc96b6c17b38900cc9fee254fc9271d0dde044e82c78c0811b58754fde5/regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282", size = 848612 },
+ { url = "https://files.pythonhosted.org/packages/b3/6a/6f659f99bebb1775e5ac81a3fb837b85897c1a4ef5acffd0ff8ffe7e67fb/regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773", size = 787967 },
+ { url = "https://files.pythonhosted.org/packages/61/35/9e35665f097c07cf384a6b90a1ac11b0b1693084a0b7a675b06f760496c6/regex-2025.9.18-cp314-cp314-win32.whl", hash = "sha256:0c3506682ea19beefe627a38872d8da65cc01ffa25ed3f2e422dffa1474f0788", size = 269847 },
+ { url = "https://files.pythonhosted.org/packages/af/64/27594dbe0f1590b82de2821ebfe9a359b44dcb9b65524876cd12fabc447b/regex-2025.9.18-cp314-cp314-win_amd64.whl", hash = "sha256:57929d0f92bebb2d1a83af372cd0ffba2263f13f376e19b1e4fa32aec4efddc3", size = 278755 },
+ { url = "https://files.pythonhosted.org/packages/30/a3/0cd8d0d342886bd7d7f252d701b20ae1a3c72dc7f34ef4b2d17790280a09/regex-2025.9.18-cp314-cp314-win_arm64.whl", hash = "sha256:6a4b44df31d34fa51aa5c995d3aa3c999cec4d69b9bd414a8be51984d859f06d", size = 271873 },
+ { url = "https://files.pythonhosted.org/packages/99/cb/8a1ab05ecf404e18b54348e293d9b7a60ec2bd7aa59e637020c5eea852e8/regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306", size = 489773 },
+ { url = "https://files.pythonhosted.org/packages/93/3b/6543c9b7f7e734d2404fa2863d0d710c907bef99d4598760ed4563d634c3/regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946", size = 291221 },
+ { url = "https://files.pythonhosted.org/packages/cd/91/e9fdee6ad6bf708d98c5d17fded423dcb0661795a49cba1b4ffb8358377a/regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f", size = 289268 },
+ { url = "https://files.pythonhosted.org/packages/94/a6/bc3e8a918abe4741dadeaeb6c508e3a4ea847ff36030d820d89858f96a6c/regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95", size = 806659 },
+ { url = "https://files.pythonhosted.org/packages/2b/71/ea62dbeb55d9e6905c7b5a49f75615ea1373afcad95830047e4e310db979/regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b", size = 871701 },
+ { url = "https://files.pythonhosted.org/packages/6a/90/fbe9dedb7dad24a3a4399c0bae64bfa932ec8922a0a9acf7bc88db30b161/regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3", size = 913742 },
+ { url = "https://files.pythonhosted.org/packages/f0/1c/47e4a8c0e73d41eb9eb9fdeba3b1b810110a5139a2526e82fd29c2d9f867/regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571", size = 811117 },
+ { url = "https://files.pythonhosted.org/packages/2a/da/435f29fddfd015111523671e36d30af3342e8136a889159b05c1d9110480/regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad", size = 794647 },
+ { url = "https://files.pythonhosted.org/packages/23/66/df5e6dcca25c8bc57ce404eebc7342310a0d218db739d7882c9a2b5974a3/regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494", size = 866747 },
+ { url = "https://files.pythonhosted.org/packages/82/42/94392b39b531f2e469b2daa40acf454863733b674481fda17462a5ffadac/regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b", size = 853434 },
+ { url = "https://files.pythonhosted.org/packages/a8/f8/dcc64c7f7bbe58842a8f89622b50c58c3598fbbf4aad0a488d6df2c699f1/regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41", size = 798024 },
+ { url = "https://files.pythonhosted.org/packages/20/8d/edf1c5d5aa98f99a692313db813ec487732946784f8f93145e0153d910e5/regex-2025.9.18-cp314-cp314t-win32.whl", hash = "sha256:2e1eddc06eeaffd249c0adb6fafc19e2118e6308c60df9db27919e96b5656096", size = 273029 },
+ { url = "https://files.pythonhosted.org/packages/a7/24/02d4e4f88466f17b145f7ea2b2c11af3a942db6222429c2c146accf16054/regex-2025.9.18-cp314-cp314t-win_amd64.whl", hash = "sha256:8620d247fb8c0683ade51217b459cb4a1081c0405a3072235ba43a40d355c09a", size = 282680 },
+ { url = "https://files.pythonhosted.org/packages/1f/a3/c64894858aaaa454caa7cc47e2f225b04d3ed08ad649eacf58d45817fad2/regex-2025.9.18-cp314-cp314t-win_arm64.whl", hash = "sha256:b7531a8ef61de2c647cdf68b3229b071e46ec326b3138b2180acb4275f470b01", size = 273034 },
]
[[package]]
@@ -1541,6 +1575,57 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696 },
]
+[[package]]
+name = "scipy"
+version = "1.16.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856 },
+ { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626 },
+ { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689 },
+ { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151 },
+ { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824 },
+ { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881 },
+ { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219 },
+ { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147 },
+ { url = "https://files.pythonhosted.org/packages/a1/57/0f38e396ad19e41b4c5db66130167eef8ee620a49bc7d0512e3bb67e0cab/scipy-1.16.2-cp313-cp313-win_amd64.whl", hash = "sha256:fda714cf45ba43c9d3bae8f2585c777f64e3f89a2e073b668b32ede412d8f52c", size = 38520766 },
+ { url = "https://files.pythonhosted.org/packages/1b/a5/85d3e867b6822d331e26c862a91375bb7746a0b458db5effa093d34cdb89/scipy-1.16.2-cp313-cp313-win_arm64.whl", hash = "sha256:2f5350da923ccfd0b00e07c3e5cfb316c1c0d6c1d864c07a72d092e9f20db104", size = 25451169 },
+ { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682 },
+ { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926 },
+ { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152 },
+ { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410 },
+ { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880 },
+ { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425 },
+ { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622 },
+ { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985 },
+ { url = "https://files.pythonhosted.org/packages/3e/9f/bc81c1d1e033951eb5912cd3750cc005943afa3e65a725d2443a3b3c4347/scipy-1.16.2-cp313-cp313t-win_amd64.whl", hash = "sha256:116296e89fba96f76353a8579820c2512f6e55835d3fad7780fece04367de351", size = 38631367 },
+ { url = "https://files.pythonhosted.org/packages/d6/5e/2cc7555fd81d01814271412a1d59a289d25f8b63208a0a16c21069d55d3e/scipy-1.16.2-cp313-cp313t-win_arm64.whl", hash = "sha256:98e22834650be81d42982360382b43b17f7ba95e0e6993e2a4f5b9ad9283a94d", size = 25787992 },
+ { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109 },
+ { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110 },
+ { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110 },
+ { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014 },
+ { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155 },
+ { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174 },
+ { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752 },
+ { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010 },
+ { url = "https://files.pythonhosted.org/packages/e4/9f/b62587029980378304ba5a8563d376c96f40b1e133daacee76efdcae32de/scipy-1.16.2-cp314-cp314-win_amd64.whl", hash = "sha256:f5a85d7b2b708025af08f060a496dd261055b617d776fc05a1a1cc69e09fe9ff", size = 39360061 },
+ { url = "https://files.pythonhosted.org/packages/82/04/7a2f1609921352c7fbee0815811b5050582f67f19983096c4769867ca45f/scipy-1.16.2-cp314-cp314-win_arm64.whl", hash = "sha256:2cc73a33305b4b24556957d5857d6253ce1e2dcd67fa0ff46d87d1670b3e1e1d", size = 26126914 },
+ { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193 },
+ { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172 },
+ { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326 },
+ { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036 },
+ { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341 },
+ { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840 },
+ { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716 },
+ { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088 },
+ { url = "https://files.pythonhosted.org/packages/c6/b4/5c18a766e8353015439f3780f5fc473f36f9762edc1a2e45da3ff5a31b21/scipy-1.16.2-cp314-cp314t-win_amd64.whl", hash = "sha256:26284797e38b8a75e14ea6631d29bda11e76ceaa6ddb6fdebbfe4c4d90faf2f9", size = 39457455 },
+ { url = "https://files.pythonhosted.org/packages/97/30/2f9a5243008f76dfc5dee9a53dfb939d9b31e16ce4bd4f2e628bfc5d89d2/scipy-1.16.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d2a4472c231328d4de38d5f1f68fdd6d28a615138f842580a8a321b5845cf779", size = 26448374 },
+]
+
[[package]]
name = "six"
version = "1.17.0"
@@ -1561,23 +1646,23 @@ wheels = [
[[package]]
name = "sqlglot"
-version = "27.14.0"
+version = "27.18.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/3e/1a/ce57767e3b791c670aa395c92c42c5b5fe11f12c2504a656f8463862ba98/sqlglot-27.14.0.tar.gz", hash = "sha256:456c82ec95dd05927cfe37cb57d4540acbfec6f0743f8c8f246147d56549ba88", size = 5462946 }
+sdist = { url = "https://files.pythonhosted.org/packages/01/56/ef3c705c750b262d4cca787982e3b640d46e8b40ba06d1d5577fb1bb4d76/sqlglot-27.18.0.tar.gz", hash = "sha256:6901eb1805226f38852e53c473d67c8e13bacf11ffe5d90170874f3d7b199acf", size = 5478250 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c6/be/fbd6905dc14e0cd118a21cd48ff39a60407f7059801cd1afc1913d9e86da/sqlglot-27.14.0-py3-none-any.whl", hash = "sha256:a5adc68abc85ccd249258ae0f3aff3c1869bb5b086e360375e16518858ce8a7a", size = 515883 },
+ { url = "https://files.pythonhosted.org/packages/ca/cc/110103f57c249bed40e85bd069ec3d2c29250ea228c89ed9d161924bb44d/sqlglot-27.18.0-py3-none-any.whl", hash = "sha256:71c122ddc99128347e1cd9ad6ed08b378cdf233e27eb78abce7542f47c723edd", size = 520293 },
]
[[package]]
name = "starlette"
-version = "0.47.3"
+version = "0.48.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/15/b9/cc3017f9a9c9b6e27c5106cc10cc7904653c3eec0729793aec10479dd669/starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9", size = 2584144 }
+sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/d6f429d43394057b67a6b5bbe6eae2f77a6bf7459d961fdb224bf206eee6/starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46", size = 2652949 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ce/fd/901cfa59aaa5b30a99e16876f11abe38b59a1a2c51ffb3d7142bb6089069/starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51", size = 72991 },
+ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736 },
]
[[package]]
@@ -1627,14 +1712,14 @@ wheels = [
[[package]]
name = "types-requests"
-version = "2.32.4.20250809"
+version = "2.32.4.20250913"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "urllib3" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ed/b0/9355adb86ec84d057fea765e4c49cce592aaf3d5117ce5609a95a7fc3dac/types_requests-2.32.4.20250809.tar.gz", hash = "sha256:d8060de1c8ee599311f56ff58010fb4902f462a1470802cf9f6ed27bc46c4df3", size = 23027 }
+sdist = { url = "https://files.pythonhosted.org/packages/36/27/489922f4505975b11de2b5ad07b4fe1dca0bca9be81a703f26c5f3acfce5/types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d", size = 23113 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2b/6f/ec0012be842b1d888d46884ac5558fd62aeae1f0ec4f7a581433d890d4b5/types_requests-2.32.4.20250809-py3-none-any.whl", hash = "sha256:f73d1832fb519ece02c85b1f09d5f0dd3108938e7d47e7f94bbfa18a6782b163", size = 20644 },
+ { url = "https://files.pythonhosted.org/packages/2a/20/9a227ea57c1285986c4cf78400d0a91615d25b24e257fd9e2969606bdfae/types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1", size = 20658 },
]
[[package]]
@@ -1808,40 +1893,40 @@ wheels = [
[[package]]
name = "zstandard"
-version = "0.24.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/09/1b/c20b2ef1d987627765dcd5bf1dadb8ef6564f00a87972635099bb76b7a05/zstandard-0.24.0.tar.gz", hash = "sha256:fe3198b81c00032326342d973e526803f183f97aa9e9a98e3f897ebafe21178f", size = 905681 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/ef/db949de3bf81ed122b8ee4db6a8d147a136fe070e1015f5a60d8a3966748/zstandard-0.24.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e4ebb000c0fe24a6d0f3534b6256844d9dbf042fdf003efe5cf40690cf4e0f3e", size = 795700 },
- { url = "https://files.pythonhosted.org/packages/99/56/fc04395d6f5eabd2fe6d86c0800d198969f3038385cb918bfbe94f2b0c62/zstandard-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:498f88f5109666c19531f0243a90d2fdd2252839cd6c8cc6e9213a3446670fa8", size = 640343 },
- { url = "https://files.pythonhosted.org/packages/9b/0f/0b0e0d55f2f051d5117a0d62f4f9a8741b3647440c0ee1806b7bd47ed5ae/zstandard-0.24.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0a9e95ceb180ccd12a8b3437bac7e8a8a089c9094e39522900a8917745542184", size = 5342571 },
- { url = "https://files.pythonhosted.org/packages/5d/43/d74e49f04fbd62d4b5d89aeb7a29d693fc637c60238f820cd5afe6ca8180/zstandard-0.24.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bcf69e0bcddbf2adcfafc1a7e864edcc204dd8171756d3a8f3340f6f6cc87b7b", size = 5062723 },
- { url = "https://files.pythonhosted.org/packages/8e/97/df14384d4d6a004388e6ed07ded02933b5c7e0833a9150c57d0abc9545b7/zstandard-0.24.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:10e284748a7e7fbe2815ca62a9d6e84497d34cfdd0143fa9e8e208efa808d7c4", size = 5393282 },
- { url = "https://files.pythonhosted.org/packages/7e/09/8f5c520e59a4d41591b30b7568595eda6fd71c08701bb316d15b7ed0613a/zstandard-0.24.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1bda8a85e5b9d5e73af2e61b23609a8cc1598c1b3b2473969912979205a1ff25", size = 5450895 },
- { url = "https://files.pythonhosted.org/packages/d9/3d/02aba892327a67ead8cba160ee835cfa1fc292a9dcb763639e30c07da58b/zstandard-0.24.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b14bc92af065d0534856bf1b30fc48753163ea673da98857ea4932be62079b1", size = 5546353 },
- { url = "https://files.pythonhosted.org/packages/6a/6e/96c52afcde44da6a5313a1f6c356349792079808f12d8b69a7d1d98ef353/zstandard-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b4f20417a4f511c656762b001ec827500cbee54d1810253c6ca2df2c0a307a5f", size = 5046404 },
- { url = "https://files.pythonhosted.org/packages/da/b6/eefee6b92d341a7db7cd1b3885d42d30476a093720fb5c181e35b236d695/zstandard-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:337572a7340e1d92fd7fb5248c8300d0e91071002d92e0b8cabe8d9ae7b58159", size = 5576095 },
- { url = "https://files.pythonhosted.org/packages/a3/29/743de3131f6239ba6611e17199581e6b5e0f03f268924d42468e29468ca0/zstandard-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:df4be1cf6e8f0f2bbe2a3eabfff163ef592c84a40e1a20a8d7db7f27cfe08fc2", size = 4953448 },
- { url = "https://files.pythonhosted.org/packages/c9/11/bd36ef49fba82e307d69d93b5abbdcdc47d6a0bcbc7ffbbfe0ef74c2fec5/zstandard-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6885ae4b33aee8835dbdb4249d3dfec09af55e705d74d9b660bfb9da51baaa8b", size = 5267388 },
- { url = "https://files.pythonhosted.org/packages/c0/23/a4cfe1b871d3f1ce1f88f5c68d7e922e94be0043f3ae5ed58c11578d1e21/zstandard-0.24.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:663848a8bac4fdbba27feea2926049fdf7b55ec545d5b9aea096ef21e7f0b079", size = 5433383 },
- { url = "https://files.pythonhosted.org/packages/77/26/f3fb85f00e732cca617d4b9cd1ffa6484f613ea07fad872a8bdc3a0ce753/zstandard-0.24.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:05d27c953f2e0a3ecc8edbe91d6827736acc4c04d0479672e0400ccdb23d818c", size = 5813988 },
- { url = "https://files.pythonhosted.org/packages/3d/8c/d7e3b424b73f3ce66e754595cbcb6d94ff49790c9ac37d50e40e8145cd44/zstandard-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77b8b7b98893eaf47da03d262816f01f251c2aa059c063ed8a45c50eada123a5", size = 5359756 },
- { url = "https://files.pythonhosted.org/packages/90/6c/f1f0e11f1b295138f9da7e7ae22dcd9a1bb96a9544fa3b31507e431288f5/zstandard-0.24.0-cp313-cp313-win32.whl", hash = "sha256:cf7fbb4e54136e9a03c7ed7691843c4df6d2ecc854a2541f840665f4f2bb2edd", size = 435957 },
- { url = "https://files.pythonhosted.org/packages/9f/03/ab8b82ae5eb49eca4d3662705399c44442666cc1ce45f44f2d263bb1ae31/zstandard-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:d64899cc0f33a8f446f1e60bffc21fa88b99f0e8208750d9144ea717610a80ce", size = 505171 },
- { url = "https://files.pythonhosted.org/packages/db/12/89a2ecdea4bc73a934a30b66a7cfac5af352beac94d46cf289e103b65c34/zstandard-0.24.0-cp313-cp313-win_arm64.whl", hash = "sha256:57be3abb4313e0dd625596376bbb607f40059d801d51c1a1da94d7477e63b255", size = 461596 },
- { url = "https://files.pythonhosted.org/packages/c9/56/f3d2c4d64aacee4aab89e788783636884786b6f8334c819f09bff1aa207b/zstandard-0.24.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b7fa260dd2731afd0dfa47881c30239f422d00faee4b8b341d3e597cface1483", size = 795747 },
- { url = "https://files.pythonhosted.org/packages/32/2d/9d3e5f6627e4cb5e511803788be1feee2f0c3b94594591e92b81db324253/zstandard-0.24.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e05d66239d14a04b4717998b736a25494372b1b2409339b04bf42aa4663bf251", size = 640475 },
- { url = "https://files.pythonhosted.org/packages/be/5d/48e66abf8c146d95330e5385633a8cfdd556fa8bd14856fe721590cbab2b/zstandard-0.24.0-cp314-cp314-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:622e1e04bd8a085994e02313ba06fbcf4f9ed9a488c6a77a8dbc0692abab6a38", size = 5343866 },
- { url = "https://files.pythonhosted.org/packages/95/6c/65fe7ba71220a551e082e4a52790487f1d6bb8dfc2156883e088f975ad6d/zstandard-0.24.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:55872e818598319f065e8192ebefecd6ac05f62a43f055ed71884b0a26218f41", size = 5062719 },
- { url = "https://files.pythonhosted.org/packages/cb/68/15ed0a813ff91be80cc2a610ac42e0fc8d29daa737de247bbf4bab9429a1/zstandard-0.24.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb2446a55b3a0fd8aa02aa7194bd64740015464a2daaf160d2025204e1d7c282", size = 5393090 },
- { url = "https://files.pythonhosted.org/packages/d4/89/e560427b74fa2da6a12b8f3af8ee29104fe2bb069a25e7d314c35eec7732/zstandard-0.24.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2825a3951f945fb2613ded0f517d402b1e5a68e87e0ee65f5bd224a8333a9a46", size = 5450383 },
- { url = "https://files.pythonhosted.org/packages/a3/95/0498328cbb1693885509f2fc145402b108b750a87a3af65b7250b10bd896/zstandard-0.24.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09887301001e7a81a3618156bc1759e48588de24bddfdd5b7a4364da9a8fbc20", size = 5546142 },
- { url = "https://files.pythonhosted.org/packages/8a/8a/64aa15a726594df3bf5d8decfec14fe20cd788c60890f44fcfc74d98c2cc/zstandard-0.24.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:98ca91dc9602cf351497d5600aa66e6d011a38c085a8237b370433fcb53e3409", size = 4953456 },
- { url = "https://files.pythonhosted.org/packages/b0/b6/e94879c5cd6017af57bcba08519ed1228b1ebb15681efd949f4a00199449/zstandard-0.24.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e69f8e534b4e254f523e2f9d4732cf9c169c327ca1ce0922682aac9a5ee01155", size = 5268287 },
- { url = "https://files.pythonhosted.org/packages/fd/e5/1a3b3a93f953dbe9e77e2a19be146e9cd2af31b67b1419d6cc8e8898d409/zstandard-0.24.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:444633b487a711e34f4bccc46a0c5dfbe1aee82c1a511e58cdc16f6bd66f187c", size = 5433197 },
- { url = "https://files.pythonhosted.org/packages/39/83/b6eb1e1181de994b29804e1e0d2dc677bece4177f588c71653093cb4f6d5/zstandard-0.24.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f7d3fe9e1483171e9183ffdb1fab07c5fef80a9c3840374a38ec2ab869ebae20", size = 5813161 },
- { url = "https://files.pythonhosted.org/packages/f6/d3/2fb4166561591e9d75e8e35c79182aa9456644e2f4536f29e51216d1c513/zstandard-0.24.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:27b6fa72b57824a3f7901fc9cc4ce1c1c834b28f3a43d1d4254c64c8f11149d4", size = 5359831 },
- { url = "https://files.pythonhosted.org/packages/11/94/6a9227315b774f64a67445f62152c69b4e5e49a52a3c7c4dad8520a55e20/zstandard-0.24.0-cp314-cp314-win32.whl", hash = "sha256:fdc7a52a4cdaf7293e10813fd6a3abc0c7753660db12a3b864ab1fb5a0c60c16", size = 444448 },
- { url = "https://files.pythonhosted.org/packages/fc/de/67acaba311013e0798cb96d1a2685cb6edcdfc1cae378b297ea7b02c319f/zstandard-0.24.0-cp314-cp314-win_amd64.whl", hash = "sha256:656ed895b28c7e42dd5b40dfcea3217cfc166b6b7eef88c3da2f5fc62484035b", size = 516075 },
- { url = "https://files.pythonhosted.org/packages/10/ae/45fd8921263cea0228b20aa31bce47cc66016b2aba1afae1c6adcc3dbb1f/zstandard-0.24.0-cp314-cp314-win_arm64.whl", hash = "sha256:0101f835da7de08375f380192ff75135527e46e3f79bef224e3c49cb640fef6a", size = 476847 },
+version = "0.25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735 },
+ { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440 },
+ { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070 },
+ { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001 },
+ { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120 },
+ { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230 },
+ { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173 },
+ { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736 },
+ { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368 },
+ { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022 },
+ { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889 },
+ { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952 },
+ { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054 },
+ { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113 },
+ { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936 },
+ { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232 },
+ { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671 },
+ { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887 },
+ { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658 },
+ { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849 },
+ { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095 },
+ { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751 },
+ { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818 },
+ { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402 },
+ { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108 },
+ { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248 },
+ { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330 },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123 },
+ { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591 },
+ { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513 },
+ { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118 },
+ { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940 },
]