thoughtleaders-cli 0.6.7__tar.gz → 0.6.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/.claude-plugin/plugin.json +1 -1
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/PKG-INFO +1 -1
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/pyproject.toml +1 -1
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/SKILL.md +28 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/__init__.py +1 -1
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/channels.py +38 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/sponsorships.py +38 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/.claude-plugin/marketplace.json +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/.github/workflows/python-publish.yml +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/.gitignore +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/AGENTS.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/CLAUDE.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/LICENSE +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/README.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/agents/tl-analyst.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/commands/tl-balance.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/commands/tl-reports.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/commands/tl-sponsorships.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/commands/tl.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/docs/architecture.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/hooks/hooks.json +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/hooks/scripts/post-usage.sh +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/hooks/scripts/pre-check.sh +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/business-glossary.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/elasticsearch-schema.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/firebolt-schema.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/postgres-schema.md +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/_completions.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/auth/__init__.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/auth/commands.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/auth/login.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/auth/pkce.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/auth/token_store.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/client/__init__.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/client/errors.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/client/http.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/__init__.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/ask.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/balance.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/brands.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/changelog.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/comments.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/db.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/deals.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/describe.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/doctor.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/matches.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/proposals.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/recommender.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/reports.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/schema.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/setup.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/snapshots.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/uploads.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/commands/whoami.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/config.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/filters.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/hints.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/main.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/output/__init__.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/output/formatter.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/src/tl_cli/self_update.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/tests/__init__.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/tests/test_auth.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/tests/test_filters.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/tests/test_output.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/tests/test_sponsorships.py +0 -0
- {thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thoughtleaders-cli
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.8
|
|
4
4
|
Summary: ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence
|
|
5
5
|
Project-URL: Homepage, https://thoughtleaders.io
|
|
6
6
|
Project-URL: Repository, https://github.com/ThoughtLeaders-io/thoughtleaders-cli
|
|
@@ -141,6 +141,7 @@ Prefer writing Python code, shell code, or `jq` commands that fetche or analysis
|
|
|
141
141
|
tl sponsorships list [filters...] # Sponsorships — list curve, mult 1.0
|
|
142
142
|
tl sponsorships show <id> # Sponsorship detail (2 credits)
|
|
143
143
|
tl sponsorships create --channel <id> --brand <id> # Create proposal (free)
|
|
144
|
+
tl sponsorships update <id> '<json>' # Update whitelisted fields (2 credits) — only `publish_status` editable; non-full-access users can only edit sponsorships in their own org
|
|
144
145
|
tl deals list [filters...] # Shortcut: agreed-upon sponsorships (status:deal); same curve as sponsorships list
|
|
145
146
|
tl deals show <id> # Deal detail (2 credits)
|
|
146
147
|
tl matches list [filters...] # Shortcut: possible brand-channel pairings (status:match); same curve
|
|
@@ -152,6 +153,7 @@ tl proposals create --channel <id> --brand <id> # Create proposal (free)
|
|
|
152
153
|
tl uploads list [filters...] # Video uploads from ES — list curve, mult 1.0
|
|
153
154
|
tl uploads show <id> # Upload detail (2 credits)
|
|
154
155
|
tl channels show <id-or-name> # Channel detail (2 credits; accepts numeric ID or name) — for channel search use raw SQL on thoughtleaders_channel
|
|
156
|
+
tl channels update <id> '<json>' # Update whitelisted demographic fields (2 credits; full-access only)
|
|
155
157
|
tl channels history <id-or-name> # Sponsorship history (5 credits/result, linear)
|
|
156
158
|
tl channels similar <id-or-name> # Similarity recommender (25 credits flat; Intelligence plan)
|
|
157
159
|
tl brands show <id-or-name> # Brand detail (1 credit)
|
|
@@ -188,6 +190,30 @@ tl comments add <adlink-id> "msg" # Add comment (free)
|
|
|
188
190
|
|
|
189
191
|
The marginal per-row cost is exactly proportional to `mult` — a 1.4× resource costs 1.4× the row part of a 1.0× resource at any size. Splitting a 500-row pull into ten 50-row calls saves ~30% but burns 10 setup floors instead of 1; "narrow the query" is almost always the better move than "fragment the pagination."
|
|
190
192
|
|
|
193
|
+
### Updating records
|
|
194
|
+
|
|
195
|
+
A narrow write surface is exposed for two resources. Each command takes the record id and a single JSON object with the fields to change; the server enforces a hard-coded field whitelist and rejects anything else with a 400. Each call costs 2 credits.
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
tl sponsorships update <id> '<json>' # Edit a sponsorship (adlink)
|
|
199
|
+
tl channels update <id> '<json>' # Edit a channel
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Sponsorships** — only `publish_status` is editable. Accepts either an int code or a status label (`proposed`, `pending`, `sold`, `matched`, `outreach`, `proposal_approved`, `advertiser_reject`, `publisher_reject`, `agency_reject`, `unavailable`). Non-full-access users may only update sponsorships tied to their own organization (either through `creator_profile` or through the channel's `publication`). Trying to edit a sponsorship outside the user's org returns 403.
|
|
203
|
+
|
|
204
|
+
**Channels** — only the demographic fields are editable: `demographic_usa_share` and `demographic_male_share` (integers 0–100), `demographic_age` / `demographic_device` / `demographic_geo` (JSON objects with numeric values). Requires full-access permission; non-full-access users get a 403. The `demographics_updated_at` timestamp is refreshed automatically when any whitelisted demographic field changes.
|
|
205
|
+
|
|
206
|
+
Examples:
|
|
207
|
+
```bash
|
|
208
|
+
tl sponsorships update 98765 '{"publish_status": "sold"}'
|
|
209
|
+
tl sponsorships update 98765 '{"publish_status": 3}'
|
|
210
|
+
tl channels update 12345 '{"demographic_male_share": 62}'
|
|
211
|
+
tl channels update 12345 '{"demographic_geo": {"US": 60, "UK": 12, "CA": 8}}'
|
|
212
|
+
tl channels update 12345 '{"demographic_male_share": 55, "demographic_usa_share": 70}'
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Anything outside these whitelists — price, cost, owner, channel name, etc. — is not editable through the CLI and must be done in the app or by a human with DB access.
|
|
216
|
+
|
|
191
217
|
### Raw queries (`tl db`)
|
|
192
218
|
|
|
193
219
|
`tl db pg|fb|es` is the default tool. Reach for it whenever the question is anything beyond a trivially simple lookup — and use the structured commands only for those trivial cases (single-record `show`, plain filtered `list`). Don't paginate-and-reduce in your head when one SQL or ES body would do it server-side.
|
|
@@ -310,6 +336,8 @@ See [references/business-glossary.md](references/business-glossary.md) for reven
|
|
|
310
336
|
| Arbitrary read-only `SELECT` on Postgres | **Available** via `tl db pg`. | SELECT-only, mandatory `LIMIT ≤ 500` + `OFFSET`, only certain SQL forms are allowed. See `references/postgres-schema.md`. |
|
|
311
337
|
| Cross-reference helpers ("channels proposed to brand X", "channels sponsored by MBN brands in last N days") | **Available** via `tl db pg`. | Write the join: `thoughtleaders_adlink` ↔ `adspot` ↔ `channel` ↔ `profile` ↔ `profile_brands` ↔ `brand`. Filter by `publish_status` for proposed/sold and by date range as needed. See `references/postgres-schema.md` for the exact column names. |
|
|
312
338
|
| **AdLink INSERT** with custom price/cost/owner/`weighted_price`/`created_where` | **Unavailable** — `tl sponsorships create` exists but only creates a free *proposal* between a channel and a brand. The `tl db pg` sanitizer accepts SELECT only — no INSERT/UPDATE. | Done in the app or by a human with DB access. |
|
|
339
|
+
| **AdLink UPDATE** of any field other than `publish_status` (price, cost, owner, send_date, …) | **Unavailable** — `tl sponsorships update` only accepts `publish_status` and only for sponsorships in the user's org (full-access bypasses the org check). | Done in the app or by a human with DB access. |
|
|
340
|
+
| **Channel UPDATE** of any field other than the demographic fields (`demographic_usa_share`, `demographic_male_share`, `demographic_age`, `demographic_device`, `demographic_geo`) | **Unavailable** — `tl channels update` only accepts those fields, and only for full-access users. | Done in the app or by a human with DB access. |
|
|
313
341
|
| Pre-insert validation queries (joining `adspot ↔ channel ↔ profile ↔ org` to confirm MSN, integration=1, persona, plan) | **Available** via `tl db pg`. | One SELECT joining the four tables. Use `thoughtleaders_channel.media_selling_network_join_date IS NOT NULL` for MSN, `thoughtleaders_adspot.integration = 1` for mention adspots, `thoughtleaders_profile.persona` for the persona code (see persona constants in `references/postgres-schema.md`). |
|
|
314
342
|
| Firebolt cross-table or join queries; filtering on non-indexed columns in WHERE | **Unavailable** — not accepted. | Fetch a wider slice keyed on `channel_id` (and optionally `id`), filter the rest in `jq`/Python. |
|
|
315
343
|
| ES `query_string`, `regexp`, `wildcard`, `fuzzy`, `more_like_this`, parent/child joins; any `script_*`; multiple aggregations in one body | **Unavailable** — not accepted. | Rewrite using `term`/`terms`/`match`/`bool`/`nested`. For multi-agg dashboards, run multiple `tl db es` calls and combine client-side. For "similar"-style queries, try `tl channels similar` / `tl brands similar` (server-implemented similarity search). |
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""tl channels — Search and show YouTube channels."""
|
|
2
2
|
|
|
3
|
+
import json as _json
|
|
3
4
|
import urllib.parse
|
|
4
5
|
|
|
5
6
|
import typer
|
|
@@ -232,6 +233,43 @@ def history_cmd(
|
|
|
232
233
|
client.close()
|
|
233
234
|
|
|
234
235
|
|
|
236
|
+
@app.command("update")
|
|
237
|
+
def update_cmd(
|
|
238
|
+
channel_id: int = typer.Argument(..., help="Channel ID (numeric)"),
|
|
239
|
+
fields: str = typer.Argument(..., help='JSON object of fields to update, e.g. \'{"demographic_male_share": 62}\''),
|
|
240
|
+
json_output: bool = typer.Option(False, "--json", help="JSON output"),
|
|
241
|
+
toon_output: bool = typer.Option(False, "--toon", help="TOON output (token-efficient for LLMs)"),
|
|
242
|
+
) -> None:
|
|
243
|
+
"""Update whitelisted channel fields (demographics; full-access only).
|
|
244
|
+
|
|
245
|
+
Editable fields: demographic_usa_share, demographic_male_share,
|
|
246
|
+
demographic_age, demographic_device, demographic_geo. The
|
|
247
|
+
demographics_updated_at timestamp is refreshed automatically.
|
|
248
|
+
|
|
249
|
+
Examples:
|
|
250
|
+
tl channels update 12345 '{"demographic_male_share": 62}'
|
|
251
|
+
tl channels update 12345 '{"demographic_geo": {"US": 60, "UK": 12}}'
|
|
252
|
+
"""
|
|
253
|
+
fmt = detect_format(json_output, False, False, toon_output)
|
|
254
|
+
try:
|
|
255
|
+
body = _json.loads(fields)
|
|
256
|
+
except _json.JSONDecodeError as exc:
|
|
257
|
+
Console(stderr=True).print(f"[red]Error:[/red] fields argument must be a JSON object: {exc}")
|
|
258
|
+
raise typer.Exit(1)
|
|
259
|
+
if not isinstance(body, dict):
|
|
260
|
+
Console(stderr=True).print("[red]Error:[/red] fields argument must be a JSON object.")
|
|
261
|
+
raise typer.Exit(1)
|
|
262
|
+
|
|
263
|
+
client = get_client()
|
|
264
|
+
try:
|
|
265
|
+
data = client.post(f"/channels/{channel_id}/edit", json_body=body)
|
|
266
|
+
output_single(data, fmt)
|
|
267
|
+
except ApiError as e:
|
|
268
|
+
handle_api_error(e)
|
|
269
|
+
finally:
|
|
270
|
+
client.close()
|
|
271
|
+
|
|
272
|
+
|
|
235
273
|
@app.command("look-alike", hidden=True)
|
|
236
274
|
def look_alike_cmd(
|
|
237
275
|
channel_ref: str = typer.Argument(..., help="Channel ID or name"),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""tl sponsorships — List, show, and create sponsorships."""
|
|
2
2
|
|
|
3
|
+
import json as _json
|
|
3
4
|
from typing import Optional
|
|
4
5
|
|
|
5
6
|
import typer
|
|
@@ -191,3 +192,40 @@ def create_cmd(
|
|
|
191
192
|
"""
|
|
192
193
|
fmt = detect_format(json_output, False, False, toon_output)
|
|
193
194
|
do_create(channel, brand, price, fmt, status="proposed")
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@app.command("update")
|
|
198
|
+
def update_cmd(
|
|
199
|
+
sponsorship_id: int = typer.Argument(..., help="Sponsorship (adlink) ID"),
|
|
200
|
+
fields: str = typer.Argument(..., help='JSON object of fields to update, e.g. \'{"publish_status": "sold"}\''),
|
|
201
|
+
json_output: bool = typer.Option(False, "--json", help="JSON output"),
|
|
202
|
+
toon_output: bool = typer.Option(False, "--toon", help="TOON output (token-efficient for LLMs)"),
|
|
203
|
+
) -> None:
|
|
204
|
+
"""Update whitelisted sponsorship fields.
|
|
205
|
+
|
|
206
|
+
Editable fields: publish_status (int code or status label, e.g. 'sold',
|
|
207
|
+
'pending', 'matched'). Non-full-access users may only update sponsorships
|
|
208
|
+
tied to their own organization.
|
|
209
|
+
|
|
210
|
+
Examples:
|
|
211
|
+
tl sponsorships update 98765 '{"publish_status": "sold"}'
|
|
212
|
+
tl sponsorships update 98765 '{"publish_status": 3}'
|
|
213
|
+
"""
|
|
214
|
+
fmt = detect_format(json_output, False, False, toon_output)
|
|
215
|
+
try:
|
|
216
|
+
body = _json.loads(fields)
|
|
217
|
+
except _json.JSONDecodeError as exc:
|
|
218
|
+
Console(stderr=True).print(f"[red]Error:[/red] fields argument must be a JSON object: {exc}")
|
|
219
|
+
raise typer.Exit(1)
|
|
220
|
+
if not isinstance(body, dict):
|
|
221
|
+
Console(stderr=True).print("[red]Error:[/red] fields argument must be a JSON object.")
|
|
222
|
+
raise typer.Exit(1)
|
|
223
|
+
|
|
224
|
+
client = get_client()
|
|
225
|
+
try:
|
|
226
|
+
data = client.post(f"/sponsorships/{sponsorship_id}/edit", json_body=body)
|
|
227
|
+
output_single(data, fmt)
|
|
228
|
+
except ApiError as e:
|
|
229
|
+
handle_api_error(e)
|
|
230
|
+
finally:
|
|
231
|
+
client.close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/business-glossary.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/elasticsearch-schema.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/firebolt-schema.md
RENAMED
|
File without changes
|
{thoughtleaders_cli-0.6.7 → thoughtleaders_cli-0.6.8}/skills/tl/references/postgres-schema.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|