Introduce Feedser plugin scaffolding
This commit is contained in:
		
							
								
								
									
										18
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | # Build outputs | ||||||
|  | bin/ | ||||||
|  | obj/ | ||||||
|  |  | ||||||
|  | # IDE state | ||||||
|  | .vs/ | ||||||
|  | *.user | ||||||
|  | *.suo | ||||||
|  | *.userprefs | ||||||
|  |  | ||||||
|  | # Rider/VSCode | ||||||
|  | .idea/ | ||||||
|  | .vscode/ | ||||||
|  |  | ||||||
|  | # Packages and logs | ||||||
|  | *.log | ||||||
|  | TestResults/ | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								global.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								global.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  |   "sdk": { | ||||||
|  |     "version": "10.0.100-preview.7.25380.108", | ||||||
|  |     "rollForward": "latestMinor" | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| # AGENTS.md — Feedser (Stella Ops) | # AGENTS.md — Feedser (Stella Ops) | ||||||
|  |  | ||||||
| > YOU ARE: a senior C#/.NET 8 engineer‑agent tasked with building **Feedser**, a CLI that fetches, normalizes, reconciles, and packages *primary, non‑aggregated* vulnerability intelligence into a single **feed‑merge** database and exports a **Trivy‑compatible** DB (OCI artifact) for offline/self‑hosted scanning.   | > YOU ARE: a senior C#/.NET 10 (Preview 7, SDK 10.0.100-preview.7.25380.108) engineer‑agent tasked with building **Feedser**, a CLI that fetches, normalizes, reconciles, and packages *primary, non‑aggregated* vulnerability intelligence into a single **feed‑merge** database and exports a **Trivy‑compatible** DB (OCI artifact) for offline/self‑hosted scanning.   | ||||||
| > MODE: factual, deterministic, test‑first, with strict provenance and reproducibility.   | > MODE: factual, deterministic, test‑first, with strict provenance and reproducibility.   | ||||||
| > BOUNDARIES: implement architecture & code in this repo only. No secret exfiltration. Default offline. | > BOUNDARIES: implement architecture & code in this repo only. No secret exfiltration. Default offline. | ||||||
|  |  | ||||||
| @@ -69,7 +69,7 @@ Debian, SUSE), ICS (CISA ICS, Kaspersky ICS-CERT) | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| src/Feedser/ | src/Feedser/ | ||||||
| Feedser.Cli/                     # .NET 8 console (System.CommandLine) | Feedser.Cli/                     # .NET 10 preview console (System.CommandLine) | ||||||
| Feedser.Core/                    # domain model & orchestration | Feedser.Core/                    # domain model & orchestration | ||||||
| Feedser.Storage/                 # EF Core migrations (SQLite dev/CI; Postgres prod) | Feedser.Storage/                 # EF Core migrations (SQLite dev/CI; Postgres prod) | ||||||
| Feedser.Connectors/ | Feedser.Connectors/ | ||||||
| @@ -607,3 +607,76 @@ If you want me to produce **starter EF models + migrations** and a **full `feeds | |||||||
| [32]: https://www.cisa.gov/known-exploited-vulnerabilities-catalog?utm_source=chatgpt.com "Known Exploited Vulnerabilities Catalog" | [32]: https://www.cisa.gov/known-exploited-vulnerabilities-catalog?utm_source=chatgpt.com "Known Exploited Vulnerabilities Catalog" | ||||||
| [33]: https://www.cisa.gov/news-events/ics-advisories?utm_source=chatgpt.com "ICS Advisories" | [33]: https://www.cisa.gov/news-events/ics-advisories?utm_source=chatgpt.com "ICS Advisories" | ||||||
| [34]: https://ics-cert.kaspersky.com/advisories/?utm_source=chatgpt.com "Advisories" | [34]: https://ics-cert.kaspersky.com/advisories/?utm_source=chatgpt.com "Advisories" | ||||||
|  |  | ||||||
|  | ## 19) Role Kickstart Playbooks (aligned with ARCHITECTURE.md & IMPLEMENTATION.md) | ||||||
|  |  | ||||||
|  | ### 19.1 Shared pre-flight checklist | ||||||
|  | - Read **ARCHITECTURE.md §§1–3** and **IMPLEMENTATION.md §§0–3** before writing code; treat this document as the quick-start guide and the others as depth references. | ||||||
|  | - Confirm local toolchain: .NET 10 Preview 7 SDK (10.0.100-preview.7.25380.108), Docker, MongoDB (local or container), `oras` CLI, `cosign`, `yq`, `jq`, Chrome/Chromium for HTML schema inspection, `pdftotext` for NKCKI extracts. | ||||||
|  | - Sync repo structure with `IMPLEMENTATION.md` naming (`StellaOps.Feedser.*` projects, Mongo storage) even if the CLI-first layout above still exists; prefer additive commits that converge both plans until deprecation is agreed. | ||||||
|  | - Establish secrets handling: load tokens (GitHub, Cisco openVuln, etc.) via environment variables referenced in `etc/feedser.yaml`. | ||||||
|  | - Instrument everything: Serilog + OpenTelemetry hooks should be wired during the first implementation of any loop so QA can observe behaviour from day one. | ||||||
|  | - Definition of Done (all roles): schema validation in tests, deterministic outputs (hash snapshot checked in), logging/metrics assertions, and hand-off notes in `/docs/handbook/ROLE/<source>.md`. | ||||||
|  |  | ||||||
|  | ### 19.2 BE-Base — Platform & Pipeline owner | ||||||
|  | - **Sprint 0 focus** (IMPLEMENTATION.md §1): create the `StellaOps.Feedser.sln`, add the WebService, Core, Models, Storage.Mongo, Source.Common, Exporter.Json, Exporter.TrivyDb projects; seed `Directory.Build.props/targets`, `.editorconfig`, and analyzer packages (`StyleCop.Analyzers`, nullable `enable`, treat warnings as errors in CI). | ||||||
|  | - Wire **CI** (`.github/workflows/feedser-ci.yml` or internal equivalent) running `dotnet restore/build/test`, lint (StyleCop), and container build check; artifacts should include the WebService image and test results. | ||||||
|  | - Produce **devcontainer + Dockerfile** aligned with the Mongo-first run mode (ARCHITECTURE.md §2). Ensure `mongo` sidecar is declared in `devcontainer.json` for immediate onboarding. | ||||||
|  | - Establish **configuration plumbing**: bind `appsettings.json` + `feedser.yaml` into strongly typed options, configure reload-on-change, and hydrate `SourceState`/`ExportState` repositories. | ||||||
|  | - Create **Mongo collections/indexes** exactly as catalogued in ARCHITECTURE.md §3; provide integration tests under `StellaOps.Feedser.Tests/Storage` that assert index presence and TTL semantics. | ||||||
|  | - Publish **contribution docs**: `/docs/contribute.md` summarizing coding standards, release tagging, and commit style (Implementation §1.5–1.6). | ||||||
|  | - Hand-off: once WebService boots with `/health` and `/ready` endpoints, scheduler skeleton, and Mongo indices created on startup, notify BE-Conn/BE-Merge/BE-Export via project board and land a baseline tag (`v0.1.0-alpha1`). | ||||||
|  |  | ||||||
|  | ### 19.3 BE-Conn-X — Source Connector engineers | ||||||
|  | - Priority waves (IMPLEMENTATION.md §4 + §5): registries (CVE/NVD/GHSA/OSV), national CERTs, vendor PSIRTs, distros, KEV, ICS. Pick sources in order of dependency on precedence rules (e.g., Red Hat before Debian for RPM logic). | ||||||
|  | - **Workflow** per source: | ||||||
|  |   1. Extend `StellaOps.Feedser.Source.Common` with fetch helpers (rate-limit, retries) if not already present; reuse `IConnectorClock` to respect windowed crawls. | ||||||
|  |   2. Implement `FetchAsync` to persist documents into Mongo `document` collection with SHA256 + metadata; follow the watermark guidance in §5 of this file. | ||||||
|  |   3. Validate raw payloads against schemas (JSON Schema, XSD, or `Joi` equivalent) and store sanitized DTOs in `dto`. Record validation stats in metrics. | ||||||
|  |   4. Map DTOs into canonical advisories using `StellaOps.Feedser.Models`. Guarantee alias completeness and provenance entries (`parser` vs `llm`). | ||||||
|  |   5. Provide **golden fixtures** in `samples/<source>/` and component tests under `StellaOps.Feedser.Tests/Source.<SourceName>` that cover fetch (with canned HTTP responses), parse, map, and incremental resume. | ||||||
|  | - **Definition of Ready**: Base pipeline live, HTTP client registered, schema stub written, test scaffolding ready, tokens/keys documented. Coordinate with BE-Base for any additional shared tooling (HTML to XML transforms, PDF text extraction). | ||||||
|  | - **Definition of Done**: deterministic DTO + map outputs (snapshot hashed, stored under `Feedser.Tests/__snapshots__`), metrics counters added, resume cursor unit tests, and documentation entry in `/docs/sources/<source>.md` describing rate limits, cursor logic, tested fixtures. | ||||||
|  | - Engage QA early: schedule schema reviews before mapper coding to catch field omissions. | ||||||
|  |  | ||||||
|  | ### 19.4 BE-Merge — Canonical merge & dedupe | ||||||
|  | - Start after BE-Base lands canonical models scaffold (IMPLEMENTATION.md §5). Own the `StellaOps.Feedser.Models` definitions, canonical serialization, and hash calculator used by `merge_event`. | ||||||
|  | - Implement **version range utilities** (RPM NEVRA, Debian EVR, SemVer) with exhaustive tests covering edge cases (epoch handling, tilde comparisons, wildcard SUSE ranges). Use fixtures from distro connectors to validate precedence rules. | ||||||
|  | - Build the **identity graph**: CVE-first resolution with fallback to other alias schemes (outlined in §8 of this file). Guarantee deterministic ordering (sort keys + stable merges) and record `beforeHash/afterHash` deltas. | ||||||
|  | - Enforce **precedence policies**: PSIRT/OVAL override generic ranges, KEV toggles exploitation flags without modifying severity, regional feeds enrich severity text but do not downgrade vendor truth. Cover these with integration tests using fused fixture sets. | ||||||
|  | - Expose a **Merge service** with idempotent `MergeAsync(IEnumerable<Guid> advisoryIds)` that writes both canonical document and `merge_event` records per run. Provide metrics (`merge.delta.count`, `merge.identity.conflicts`). | ||||||
|  | - Deliver initial **merge deterministic test**: same fixture set processed twice yields identical hashes; store hash snapshot under `/tests/data/merge/expected-hash.json`. | ||||||
|  |  | ||||||
|  | ### 19.5 BE-Export — JSON & Trivy DB packaging | ||||||
|  | - After BE-Merge exposes stable canonical output, implement **JSON exporter** mirroring `aquasecurity/vuln-list` layout (Implementation §5 step 4; ARCHITECTURE.md stage 3). Ensure directory determinism (sorted keys, newline conventions) and record export cursor consumption. | ||||||
|  | - For **Trivy DB exporter**: wrap the official `trivy-db` builder initially; orchestrate invocation in-process or via CLI with reproducible environment variables. Persist resulting `metadata.json`, BoltDB file, and tarball in `export_state` with digests. | ||||||
|  | - Integrate **ORAS push** pipeline guarded by dry-run flag; support offline bundle packaging (zip/tar) for air-gapped delivery. Provide config-driven repo/tag resolution from `feedser.yaml`. | ||||||
|  | - Metrics to emit: `export.duration`, `export.records`, `export.size_bytes`, `export.delta` counts, ORAS push success/failure. | ||||||
|  | - Tests: snapshot JSON tree, verify OCI manifest media types, simulate incremental export using seeded `advisory` records. Provide CLI smoke test hitting `POST /jobs/export/trivydb` (or CLI equivalent once added). | ||||||
|  |  | ||||||
|  | ### 19.6 QA — Validation & observability lead | ||||||
|  | - Build and maintain **test matrix** covering connectors, merge, export; enforce schema evolution workflows (any schema change must include updated fixtures, docs, and backward-compat diff summary). | ||||||
|  | - Own **component test harness** utilities (HTTP canned server, PDF→text conversion mocks, time-travel clock). Ensure connectors implement `IClock` dependency for deterministic tests. | ||||||
|  | - Set up **golden snapshot review** cadence; add tooling (`dotnet test --filter Category=Golden -- Dump`) to regenerate fixtures and compare diffs. | ||||||
|  | - Monitor **observability baselines**: define default alert thresholds for fetch failures, merge conflicts, export delays. Provide dashboards or documented query templates (Grafana/Prometheus) referenced in `/docs/observability.md`. | ||||||
|  | - Verify **reproducibility**: rerun end-to-end pipeline twice and compare exported digests; document discrepancies and feed them back to BE-Merge/BE-Export. | ||||||
|  |  | ||||||
|  | ### 19.7 Coordination & delivery cadence | ||||||
|  | - Sprint naming follows Implementation plan (Sprint 0–4+). Maintain a shared Kanban board with swimlanes per role; entries should reference the numbered tasks from IMPLEMENTATION.md for traceability. | ||||||
|  | - Hold **daily 15-minute sync** focused on blockers, schema changes, and source-specific rate limits discovered. Escalate major schema/API shifts immediately and capture in `/docs/incidents/YYYY-MM-DD.md`. | ||||||
|  | - Milestone gates: | ||||||
|  |   1. **Platform GA** — BE-Base tasks 1–6 closed; Mongo + scheduler operational. | ||||||
|  |   2. **Core connectors online** — NVD, GHSA, OSV, KEV delivering mapped advisories. | ||||||
|  |   3. **Distro precedence** — Red Hat + Ubuntu connectors validating version precedence vs NVD. | ||||||
|  |   4. **Merge deterministic** — hash stability test green. | ||||||
|  |   5. **Export ready** — JSON + Trivy DB artifacts validated and pushed to staging registry. | ||||||
|  |  | ||||||
|  | ### 19.8 Hand-off artifacts & documentation expectations | ||||||
|  | - Every completed task must append/adjust documentation: connector guides, merge rules, exporter usage. Store under `/docs` mirroring role ownership; include sample commands, curl invocations, and expected outputs. | ||||||
|  | - Check in sample configs (`etc/feedser.local.yaml.example`) per role with placeholders for sensitive values. | ||||||
|  | - Capture **post-task retros** in `docs/retros/<sprint>-<task>.md` summarizing lessons, API quirks, schema diffs, and follow-up tickets. | ||||||
|  | - Maintain a shared **glossary** (`docs/glossary.md`) covering abbreviations (KEV, OVAL, EVR, NEVRA, GridFS) to speed up onboarding for new engineers. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | The sections above convert the role taxonomy from IMPLEMENTATION.md into actionable playbooks while keeping the authoritative architecture and data contracts inline with this guide. Use them to bootstrap work, then dive into ARCHITECTURE.md and IMPLEMENTATION.md for exhaustive references and sprint-by-sprint sequencing. | ||||||
|   | |||||||
							
								
								
									
										191
									
								
								src/Feedser/ARCHITECTURE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								src/Feedser/ARCHITECTURE.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | |||||||
|  | # ARCHITECTURE.md — **StellaOps.Feedser** | ||||||
|  |  | ||||||
|  | > **Goal**: Build a sovereign-ready, self-hostable **feed-merge service** that ingests authoritative vulnerability sources, normalizes and de-duplicates them into **MongoDB**, and exports **JSON** and **Trivy-compatible DB** artifacts. | ||||||
|  | > **Form factor**: Long-running **Web Service** with **REST APIs** (health, status, control) and an embedded **internal cron scheduler**. | ||||||
|  | > **No signing inside Feedser** (signing is a separate pipeline step). | ||||||
|  | > **Runtime SDK baseline**: .NET 10 Preview 7 (SDK 10.0.100-preview.7.25380.108) targeting `net10.0`, aligned with the deployed api.stella-ops.org service. | ||||||
|  | > **Three explicit stages**: | ||||||
|  | > | ||||||
|  | > 1. **Source Download** → raw documents. | ||||||
|  | > 2. **Merge + Dedupe + Normalization** → MongoDB canonical. | ||||||
|  | > 3. **Export** → JSON or TrivyDB (full or delta), then (externally) sign/publish. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 1) Naming & Solution Layout | ||||||
|  |  | ||||||
|  | **Solution root**: `StellaOps.Feedser` | ||||||
|  | **Source connectors** namespace prefix: `StellaOps.Feedser.Source.*` | ||||||
|  | **Exporters**: | ||||||
|  |  | ||||||
|  | * `StellaOps.Feedser.Exporter.Json` | ||||||
|  | * `StellaOps.Feedser.Exporter.TrivyDb` | ||||||
|  |  | ||||||
|  | **Projects** (`/src`): | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | StellaOps.Feedser.WebService/        # ASP.NET Core (Minimal API, net10.0 preview) WebService + embedded scheduler | ||||||
|  | StellaOps.Feedser.Core/              # Domain models, pipelines, merge/dedupe engine, jobs orchestration | ||||||
|  | StellaOps.Feedser.Models/            # Canonical POCOs, JSON Schemas, enums | ||||||
|  | StellaOps.Feedser.Storage.Mongo/     # Mongo repositories, GridFS access, indexes, resume "flags" | ||||||
|  | StellaOps.Feedser.Source.Common/     # HTTP clients, rate-limiters, schema validators, parsers utils | ||||||
|  | StellaOps.Feedser.Source.Cve/ | ||||||
|  | StellaOps.Feedser.Source.Nvd/ | ||||||
|  | StellaOps.Feedser.Source.Ghsa/ | ||||||
|  | StellaOps.Feedser.Source.Osv/ | ||||||
|  | StellaOps.Feedser.Source.Jvn/ | ||||||
|  | StellaOps.Feedser.Source.CertCc/ | ||||||
|  | StellaOps.Feedser.Source.Kev/ | ||||||
|  | StellaOps.Feedser.Source.Kisa/ | ||||||
|  | StellaOps.Feedser.Source.CertIn/ | ||||||
|  | StellaOps.Feedser.Source.CertFr/ | ||||||
|  | StellaOps.Feedser.Source.CertBund/ | ||||||
|  | StellaOps.Feedser.Source.Acsc/ | ||||||
|  | StellaOps.Feedser.Source.Cccs/ | ||||||
|  | StellaOps.Feedser.Source.Ru.Bdu/     # HTML→schema with LLM fallback (gated) | ||||||
|  | StellaOps.Feedser.Source.Ru.Nkcki/   # PDF/HTML bulletins → structured | ||||||
|  | StellaOps.Feedser.Source.Vndr.Msrc/ | ||||||
|  | StellaOps.Feedser.Source.Vndr.Cisco/ | ||||||
|  | StellaOps.Feedser.Source.Vndr.Oracle/ | ||||||
|  | StellaOps.Feedser.Source.Vndr.Adobe/ | ||||||
|  | StellaOps.Feedser.Source.Vndr.Apple/ | ||||||
|  | StellaOps.Feedser.Source.Vndr.Chromium/ | ||||||
|  | StellaOps.Feedser.Source.Vndr.Vmware/ | ||||||
|  | StellaOps.Feedser.Source.Distro.RedHat/ | ||||||
|  | StellaOps.Feedser.Source.Distro.Ubuntu/ | ||||||
|  | StellaOps.Feedser.Source.Distro.Debian/ | ||||||
|  | StellaOps.Feedser.Source.Distro.Suse/ | ||||||
|  | StellaOps.Feedser.Source.Ics.Cisa/ | ||||||
|  | StellaOps.Feedser.Source.Ics.Kaspersky/ | ||||||
|  | StellaOps.Feedser.Normalization/     # Canonical mappers, validators, version-range normalization | ||||||
|  | StellaOps.Feedser.Merge/             # Identity graph, precedence, deterministic merge | ||||||
|  | StellaOps.Feedser.Exporter.Json/ | ||||||
|  | StellaOps.Feedser.Exporter.TrivyDb/ | ||||||
|  | StellaOps.Feedser.Tests/             # Unit, component, integration & golden fixtures | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 2) Runtime Shape | ||||||
|  |  | ||||||
|  | **Process**: single service (`StellaOps.Feedser.WebService`) | ||||||
|  |  | ||||||
|  | * `Program.cs`: top-level entry using **Generic Host**, **DI**, **Options** binding from `appsettings.json` + environment + optional `feedser.yaml`. | ||||||
|  | * Built-in **scheduler** (cron-like) + **job manager** with **distributed locks** in Mongo to prevent overlaps, enforce timeouts, allow cancel/kill. | ||||||
|  | * **REST APIs** for health/readiness/progress/trigger/kill/status. | ||||||
|  |  | ||||||
|  | **Key NuGet concepts** (indicative): `MongoDB.Driver`, `Polly` (retry/backoff), `System.Threading.Channels`, `Microsoft.Extensions.Http`, `Microsoft.Extensions.Hosting`, `Serilog`, `OpenTelemetry`. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 3) Data Storage — **MongoDB** (single source of truth) | ||||||
|  |  | ||||||
|  | **Database**: `feedser` | ||||||
|  | **Write concern**: `majority` for merge/export state, `acknowledged` for raw docs. | ||||||
|  | **Collections** (with “flags”/resume points): | ||||||
|  |  | ||||||
|  | * `source` | ||||||
|  |   * `_id`, `name`, `type`, `baseUrl`, `auth`, `notes`. | ||||||
|  | * `source_state` | ||||||
|  |   * Keys: `sourceName` (unique), `enabled`, `cursor`, `lastSuccess`, `failCount`, `backoffUntil`, `paceOverrides`, `paused`. | ||||||
|  |   * Drives incremental fetch/parse/map resume and operator pause/pace controls. | ||||||
|  | * `document` | ||||||
|  |   * `_id`, `sourceName`, `uri`, `fetchedAt`, `sha256`, `contentType`, `status`, `metadata`, `gridFsId`, `etag`, `lastModified`. | ||||||
|  |   * Index `{sourceName:1, uri:1}` unique; optional TTL for superseded versions. | ||||||
|  | * `dto` | ||||||
|  |   * `_id`, `sourceName`, `documentId`, `schemaVer`, `payload` (BSON), `validatedAt`. | ||||||
|  |   * Index `{sourceName:1, documentId:1}`. | ||||||
|  | * `advisory` | ||||||
|  |   * `_id`, `advisoryKey`, `title`, `summary`, `lang`, `published`, `modified`, `severity`, `exploitKnown`. | ||||||
|  |   * Unique `{advisoryKey:1}` plus indexes on `modified` and `published`. | ||||||
|  | * `alias` | ||||||
|  |   * `advisoryId`, `scheme`, `value` with index `{scheme:1, value:1}`. | ||||||
|  | * `affected` | ||||||
|  |   * `advisoryId`, `platform`, `name`, `versionRange`, `cpe`, `purl`, `fixedBy`, `introducedVersion`. | ||||||
|  |   * Index `{platform:1, name:1}`, `{advisoryId:1}`. | ||||||
|  | * `reference` | ||||||
|  |   * `advisoryId`, `url`, `kind`, `sourceTag` (e.g., advisory/patch/kb). | ||||||
|  | * Flags collections: `kev_flag`, `ru_flags`, `jp_flags`, `psirt_flags` keyed by `advisoryId`. | ||||||
|  | * `merge_event` | ||||||
|  |   * `_id`, `advisoryKey`, `beforeHash`, `afterHash`, `mergedAt`, `inputs` (document ids). | ||||||
|  | * `export_state` | ||||||
|  |   * `_id` (`json`/`trivydb`), `baseExportId`, `baseDigest`, `lastFullDigest`, `lastDeltaDigest`, `exportCursor`, `targetRepo`, `exporterVersion`. | ||||||
|  | * `locks` | ||||||
|  |   * `_id` (`jobKey`), `holder`, `acquiredAt`, `heartbeatAt`, `leaseMs`, `ttlAt` (TTL index cleans dead locks). | ||||||
|  | * `jobs` | ||||||
|  |   * `_id`, `type`, `args`, `state`, `startedAt`, `endedAt`, `error`, `owner`, `heartbeatAt`, `timeoutMs`. | ||||||
|  |  | ||||||
|  | **GridFS buckets**: `fs.documents` for raw large payloads; referenced by `document.gridFsId`. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 4) Job & Scheduler Model | ||||||
|  |  | ||||||
|  | * Scheduler stores cron expressions per source/exporter in config; persists next-run pointers in Mongo. | ||||||
|  | * Jobs acquire locks (`locks` collection) to ensure singleton execution per source/exporter. | ||||||
|  | * Supports manual triggers via API endpoints (`POST /jobs/{type}`) and pause/resume toggles per source. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 5) Connector Contracts | ||||||
|  |  | ||||||
|  | Connectors implement: | ||||||
|  |  | ||||||
|  | ```csharp | ||||||
|  | public interface IFeedConnector { | ||||||
|  |     string SourceName { get; } | ||||||
|  |     Task FetchAsync(IServiceProvider sp, CancellationToken ct); | ||||||
|  |     Task ParseAsync(IServiceProvider sp, CancellationToken ct); | ||||||
|  |     Task MapAsync(IServiceProvider sp, CancellationToken ct); | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | * Fetch populates `document` rows respecting rate limits, conditional GET, and `source_state.cursor`. | ||||||
|  | * Parse validates schema (JSON Schema, XSD) and writes sanitized DTO payloads. | ||||||
|  | * Map produces canonical advisory rows + provenance entries; must be idempotent. | ||||||
|  | * Base helpers in `StellaOps.Feedser.Source.Common` provide HTTP clients, retry policies, and watermark utilities. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 6) Merge & Normalization | ||||||
|  |  | ||||||
|  | * Canonical model stored in `StellaOps.Feedser.Models` with serialization contracts used by storage/export layers. | ||||||
|  | * `StellaOps.Feedser.Normalization` handles NEVRA/EVR/PURL range parsing, CVSS normalization, localization. | ||||||
|  | * `StellaOps.Feedser.Merge` builds alias graphs keyed by CVE first, then falls back to vendor/regional IDs. | ||||||
|  | * Precedence rules: PSIRT/OVAL overrides generic ranges; KEV only toggles exploitation; regional feeds enrich severity but don’t override vendor truth. | ||||||
|  | * Determinism enforced via canonical JSON hashing logged in `merge_event`. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 7) Exporters | ||||||
|  |  | ||||||
|  | * JSON exporter mirrors `aquasecurity/vuln-list` layout with deterministic ordering and reproducible timestamps. | ||||||
|  | * Trivy DB exporter initially shells out to `trivy-db` builder; later will emit BoltDB directly. | ||||||
|  | * `StellaOps.Feedser.Storage.Mongo` provides cursors for delta exports based on `export_state.exportCursor`. | ||||||
|  | * Export jobs produce OCI tarballs (layer media type `application/vnd.aquasec.trivy.db.layer.v1.tar+gzip`) and optionally push via ORAS. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 8) Observability | ||||||
|  |  | ||||||
|  | * Serilog structured logging with enrichment fields (`source`, `uri`, `stage`, `durationMs`). | ||||||
|  | * OpenTelemetry traces around fetch/parse/map/export; metrics for rate limit hits, schema failures, dedupe ratios, package size. | ||||||
|  | * Prometheus scraping endpoint served by WebService. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 9) Security Considerations | ||||||
|  |  | ||||||
|  | * Offline-first: connectors only reach allowlisted hosts. | ||||||
|  | * BDU LLM fallback gated by config flag; logs audit trail with confidence score. | ||||||
|  | * No secrets written to logs; secrets loaded via environment or mounted files. | ||||||
|  | * Signing handled outside Feedser pipeline. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 10) Deployment Notes | ||||||
|  |  | ||||||
|  | * Default storage MongoDB; for air-gapped, bundle Mongo image + seeded data backup. | ||||||
|  | * Horizontal scale achieved via multiple web service instances sharing Mongo locks. | ||||||
|  | * Provide `feedser.yaml` template describing sources, rate limits, and export settings. | ||||||
|  |  | ||||||
							
								
								
									
										175
									
								
								src/Feedser/IMPLEMENTATION.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								src/Feedser/IMPLEMENTATION.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | |||||||
|  | # ARCHITECTURE.md — **StellaOps.Feedser** · *Sprints & Tasks Delivery Plan* | ||||||
|  |  | ||||||
|  | > **Objective**: Deliver a production-ready **StellaOps.Feedser** web service that ingests authoritative vulnerability sources, normalizes & de-duplicates into **MongoDB**, and exports **JSON** and **Trivy-compatible DB** artifacts with **resume flags** for inputs and outputs. | ||||||
|  | > **Team assumption**: **1 Base Engineer** (preparation / platform) in early sprints to unlock **parallel connector work** by many engineers later. | ||||||
|  | > **Task sizing**: each task is **0.5–2.0 days** (est.). | ||||||
|  | > **Runtime SDK baseline**: .NET 10 Preview 7 (SDK 10.0.100-preview.7.25380.108) with target framework `net10.0`, matching the deployed api.stella-ops.org build. | ||||||
|  | > **Strict staging** (as previously defined): | ||||||
|  | > | ||||||
|  | > 1. **Source Download** (docs) → 2) **Merge + Dedupe + Normalization** (Mongo) → 3) **Export** (JSON / TrivyDB). | ||||||
|  | >    **No signing in Feedser**; signing/promotion is an **external pipeline** step. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 0) Roles, Notation & Constraints | ||||||
|  |  | ||||||
|  | * **BE-Base** — Base Engineer (preparation/platform). | ||||||
|  | * **BE-Conn-X** — Connector Engineer for source X (waves). | ||||||
|  | * **BE-Merge** — Engineer focusing on merge/dedupe. | ||||||
|  | * **BE-Export** — Engineer focusing on exporters. | ||||||
|  | * **QA** — test/dev-ex reviewer (could be engineers rotating). | ||||||
|  | * **Est.** — estimated effort for the task (0.5/1/1.5/2 days). | ||||||
|  | * **Depends** — tasks that must finish first. | ||||||
|  | * **Unlocks** — parallelizable work that becomes possible. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 1) Sprint 0 — Inception & Repo Bootstrap (Week 1) | ||||||
|  |  | ||||||
|  | > Goal: Stand up solution scaffolding, CI, coding standards, and minimal docs to let others clone and build. | ||||||
|  |  | ||||||
|  | 1. **Create solution & project skeletons** | ||||||
|  |  | ||||||
|  |    * Create `src/` solution with projects & namespaces: | ||||||
|  |  | ||||||
|  |      * `StellaOps.Feedser.WebService`, `StellaOps.Feedser.Core`, `StellaOps.Feedser.Models`, | ||||||
|  |        `StellaOps.Feedser.Storage.Mongo`, `StellaOps.Feedser.Source.Common`, | ||||||
|  |        `StellaOps.Feedser.Exporter.Json`, `StellaOps.Feedser.Exporter.TrivyDb`, | ||||||
|  |        stubs for `StellaOps.Feedser.Source.*` families. | ||||||
|  |    * Add top-level `Directory.Build.props` / `Directory.Build.targets`. | ||||||
|  |    * Pin all projects to `net10.0` and ensure CI/global.json uses .NET SDK 10.0.100-preview.7.25380.108 (same preview as api.stella-ops.org). | ||||||
|  |  | ||||||
|  | 2. **Coding standards & analyzers** | ||||||
|  |  | ||||||
|  |    * `.editorconfig`, `StyleCop.Analyzers`, Roslyn rulesets, nullable enabled, warnings as errors in CI. | ||||||
|  |  | ||||||
|  | 3. **Solution build & test CI** | ||||||
|  |  | ||||||
|  |    * GitHub Actions (or internal CI) with matrix: `dotnet build`, `dotnet test`, coverage, artifact publish. | ||||||
|  |  | ||||||
|  | 4. **Docker build & devcontainer** | ||||||
|  |  | ||||||
|  |    * Multi-stage Dockerfile for WebService; VS Code devcontainer (`.devcontainer/`). | ||||||
|  |  | ||||||
|  | 5. **Docs scaffold** | ||||||
|  |  | ||||||
|  |    * Seed `/docs` with `README.md`, link to `AGENTS.md`, `ARCHITECTURE.md`, contribution guide, commit message convention. | ||||||
|  |  | ||||||
|  | 6. **Versioning & release tagging** | ||||||
|  |  | ||||||
|  |    * SemVer policy; auto version from tags. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 2) Sprint 1 — Configuration, MongoDB & Resume Flags (Week 2) | ||||||
|  |  | ||||||
|  | > Goal: Stand up MongoDB storage, resume flags for **sources** and **exports**, and config plumbing. | ||||||
|  |  | ||||||
|  | 1. **Configuration plumbing** — Bind `appsettings.json` + optional `feedser.yaml` + ENV to strongly typed `FeedserConfig`. | ||||||
|  | 2. **Mongo client & database bootstrap** — Register `IMongoClient` / `IMongoDatabase`, health probes, retry policies. | ||||||
|  | 3. **Collections & indexes** — Create `source`, `source_state`, `document`, `dto`, `advisory`, `alias`, `affected`, `reference`, `kev_flag`, `ru_flags`, `jp_flags`, `psirt_flags`, `merge_event`, `export_state`, `locks`, `jobs`. | ||||||
|  | 4. **GridFS ingestion path** — Store large payloads, link via `document.gridFsId`, dedupe by SHA256. | ||||||
|  | 5. **Resume flags — sources** — CRUD helpers for `cursor`, `lastSuccess`, `failCount`, `backoffUntil`, `paused`, `paceOverrides`. | ||||||
|  | 6. **Resume flags — exports** — Manage `baseExportId`, `baseDigest`, `lastFullDigest`, `lastDeltaDigest`, `exportCursor`, `targetRepo`, `exporterVersion`. | ||||||
|  | 7. **Storage integration tests** — Validate indexes, TTL, GridFS round-trip, concurrency. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 3) Sprint 2 — Web Service, APIs & Job Infrastructure (Week 3) | ||||||
|  |  | ||||||
|  | 1. Minimal API host (`Program.cs`) exposing `/health`, `/ready`. | ||||||
|  | 2. Status & control endpoints (`/status`, `/sources`, pause/pace controls). | ||||||
|  | 3. Job ledger & state machine with `jobs` collection. | ||||||
|  | 4. Distributed lock service with lease & heartbeat. | ||||||
|  | 5. Scheduler with cron parsing, singleton enforcement, backoff. | ||||||
|  | 6. Kill/timeout support via cancellation tokens. | ||||||
|  | 7. Optional API key auth middleware. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 4) Sprint 3 — Source Common, Rate Limit & Validation (Week 4) | ||||||
|  |  | ||||||
|  | 1. Connector base classes implementing `IFeedConnector` helpers. | ||||||
|  | 2. HTTP client factory with rate limiter and retry policies. | ||||||
|  | 3. Schema/XSD/JSON validation framework. | ||||||
|  | 4. Document pipeline helpers for conditional GET, hashing, dedupe. | ||||||
|  | 5. DTO pipeline & provenance tracking. | ||||||
|  | 6. Observability wiring (Serilog, OpenTelemetry). | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 5) Sprint 4 — Normalization & Merge Engine (Week 5) | ||||||
|  |  | ||||||
|  | 1. Canonical models (`StellaOps.Feedser.Models`). | ||||||
|  | 2. Version range utilities (RPM NEVRA, Debian EVR, SemVer). | ||||||
|  | 3. Alias graph & identity resolution. | ||||||
|  | 4. Precedence enforcement & deterministic serialization. | ||||||
|  | 5. Merge service with hash logging and metrics. | ||||||
|  | 6. Merge determinism tests. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 6) Sprint 5 — Exporters & Packaging (Week 6) | ||||||
|  |  | ||||||
|  | 1. JSON exporter mirroring `vuln-list` tree. | ||||||
|  | 2. Trivy DB exporter integration (`trivy-db` builder initially). | ||||||
|  | 3. ORAS push / offline bundle support. | ||||||
|  | 4. Export metrics & audit logging. | ||||||
|  | 5. Incremental export tests and media-type validation. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 7) Sprint 6 — Connectors Wave 1 (Weeks 7–8) | ||||||
|  |  | ||||||
|  | * Registries: CVE, NVD, GHSA, OSV. | ||||||
|  | * KEV catalog ingestion. | ||||||
|  | * National CERTs: CERT/CC, JVN, CERT-FR, CERT-In, KISA, CERT-Bund, ACSC, CCCS. | ||||||
|  |  | ||||||
|  | Each connector deliverable includes: watermarking, schema validation, mapping, provenance, metrics, golden fixtures, incremental resume tests. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 8) Sprint 7 — Connectors Wave 2 (Weeks 9–10) | ||||||
|  |  | ||||||
|  | * PSIRTs: MSRC, Cisco, Oracle, Adobe, Apple, Chromium, VMware. | ||||||
|  | * Distros: Red Hat (API + OVAL), Ubuntu, Debian, SUSE. | ||||||
|  | * ICS: CISA ICS, Kaspersky ICS-CERT. | ||||||
|  | * Russia-specific: BDU (HTML + LLM fallback), NKCKI. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 9) Sprint 8 — Merge Hardening & QA | ||||||
|  |  | ||||||
|  | * Conflict resolution scenarios (mixed aliases, partial data). | ||||||
|  | * Performance tuning, batching, streaming parse. | ||||||
|  | * Deterministic output regression tests. | ||||||
|  | * Golden snapshot review tooling. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 10) Sprint 9 — Packaging, Delivery & Ops | ||||||
|  |  | ||||||
|  | * Reproducible export pipelines (hash-based build IDs). | ||||||
|  | * OCI push automation, offline bundle scripts. | ||||||
|  | * Observability dashboards, alerts. | ||||||
|  | * Disaster recovery playbooks (Mongo backups, export restore). | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 11) Sprint 10 — Launch Readiness | ||||||
|  |  | ||||||
|  | * Penetration test fixes, security hardening. | ||||||
|  | * Documentation polish (operator guides, API reference). | ||||||
|  | * Release tagging, change log, migration notes. | ||||||
|  | * GA criteria review with stakeholders. | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## Definition of Done (for any code change) | ||||||
|  |  | ||||||
|  | 1. Unit/integration tests updated and passing. | ||||||
|  | 2. Schema/golden fixtures regenerated when applicable. | ||||||
|  | 3. Telemetry (logs/metrics/traces) reviewed for signal quality. | ||||||
|  | 4. Docs updated (`/docs`, `/etc/feedser.yaml` examples). | ||||||
|  | 5. Reproducibility verified (hash match on repeated run). | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Core/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Core/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | namespace StellaOps.Feedser.Core; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | /// Marker type for assembly discovery. | ||||||
|  | /// </summary> | ||||||
|  | public sealed class FeedserCoreMarker | ||||||
|  | { | ||||||
|  | } | ||||||
| @@ -0,0 +1,60 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Reflection; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Core; | ||||||
|  |  | ||||||
|  | public static class PluginBootstrapper | ||||||
|  | { | ||||||
|  |     private static readonly string[] ConnectorPatterns = | ||||||
|  |     { | ||||||
|  |         "StellaOps.Feedser.Source.*.dll" | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     private static readonly string[] ExporterPatterns = | ||||||
|  |     { | ||||||
|  |         "StellaOps.Feedser.Exporter.*.dll" | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     public static IReadOnlyList<IConnectorPlugin> LoadConnectorPlugins(IServiceProvider? services = null, string? baseDirectory = null) | ||||||
|  |     { | ||||||
|  |         services ??= NullServiceProvider.Instance; | ||||||
|  |         var catalog = BuildCatalog(baseDirectory, ConnectorPatterns); | ||||||
|  |         return catalog.GetAvailableConnectorPlugins(services); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static IReadOnlyList<IExporterPlugin> LoadExporterPlugins(IServiceProvider? services = null, string? baseDirectory = null) | ||||||
|  |     { | ||||||
|  |         services ??= NullServiceProvider.Instance; | ||||||
|  |         var catalog = BuildCatalog(baseDirectory, ExporterPatterns); | ||||||
|  |         return catalog.GetAvailableExporterPlugins(services); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static PluginCatalog BuildCatalog(string? baseDirectory, IReadOnlyCollection<string> patterns) | ||||||
|  |     { | ||||||
|  |         var catalog = new PluginCatalog(); | ||||||
|  |  | ||||||
|  |         foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) | ||||||
|  |         { | ||||||
|  |             if (assembly.FullName is { } name && name.StartsWith("StellaOps.Feedser", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |             { | ||||||
|  |                 catalog.AddAssembly(assembly); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         baseDirectory ??= AppContext.BaseDirectory; | ||||||
|  |         foreach (var pattern in patterns) | ||||||
|  |         { | ||||||
|  |             catalog.AddFromDirectory(baseDirectory, pattern); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return catalog; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private sealed class NullServiceProvider : IServiceProvider | ||||||
|  |     { | ||||||
|  |         public static NullServiceProvider Instance { get; } = new(); | ||||||
|  |         public object? GetService(Type serviceType) => null; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,18 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Storage.Mongo/StellaOps.Feedser.Storage.Mongo.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Merge/StellaOps.Feedser.Merge.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj" /> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Exporter.Json; | ||||||
|  |  | ||||||
|  | public sealed class JsonExporterPlugin : IExporterPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "json"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedExporter Create(IServiceProvider services) => new StubExporter(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubExporter : IFeedExporter | ||||||
|  |     { | ||||||
|  |         public StubExporter(string name) => Name = name; | ||||||
|  |  | ||||||
|  |         public string Name { get; } | ||||||
|  |  | ||||||
|  |         public Task ExportAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Exporter.TrivyDb; | ||||||
|  |  | ||||||
|  | public sealed class TrivyDbExporterPlugin : IExporterPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "trivydb"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedExporter Create(IServiceProvider services) => new StubExporter(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubExporter : IFeedExporter | ||||||
|  |     { | ||||||
|  |         public StubExporter(string name) => Name = name; | ||||||
|  |  | ||||||
|  |         public string Name { get; } | ||||||
|  |  | ||||||
|  |         public Task ExportAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										6
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Merge/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Merge/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | namespace StellaOps.Feedser.Merge; | ||||||
|  |  | ||||||
|  | public class Class1 | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Normalization/StellaOps.Feedser.Normalization.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										6
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Models/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Models/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | namespace StellaOps.Feedser.Models; | ||||||
|  |  | ||||||
|  | public class Class1 | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace StellaOps.Feedser.Normalization; | ||||||
|  |  | ||||||
|  | public class Class1 | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Acsc; | ||||||
|  |  | ||||||
|  | public sealed class AcscConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "acsc"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Cccs; | ||||||
|  |  | ||||||
|  | public sealed class CccsConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "cccs"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.CertBund; | ||||||
|  |  | ||||||
|  | public sealed class CertBundConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "certbund"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.CertCc; | ||||||
|  |  | ||||||
|  | public sealed class CertCcConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "certcc"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.CertFr; | ||||||
|  |  | ||||||
|  | public sealed class CertFrConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "certfr"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.CertIn; | ||||||
|  |  | ||||||
|  | public sealed class CertInConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "certin"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | using System; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Common; | ||||||
|  |  | ||||||
|  | public static class ConnectorUtilities | ||||||
|  | { | ||||||
|  |     public static bool IsEndpointReachable(Uri endpoint) => true; | ||||||
|  | } | ||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Cve/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Cve/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Cve; | ||||||
|  |  | ||||||
|  | public sealed class CveConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "cve"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Distro.Debian; | ||||||
|  |  | ||||||
|  | public sealed class DistroDebianConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "distro-debian"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Distro.RedHat; | ||||||
|  |  | ||||||
|  | public sealed class DistroRedHatConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "distro-redhat"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Distro.Suse; | ||||||
|  |  | ||||||
|  | public sealed class DistroSuseConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "distro-suse"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Distro.Ubuntu; | ||||||
|  |  | ||||||
|  | public sealed class DistroUbuntuConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "distro-ubuntu"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Ghsa; | ||||||
|  |  | ||||||
|  | public sealed class GhsaConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "ghsa"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Ics.Cisa; | ||||||
|  |  | ||||||
|  | public sealed class IcsCisaConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "ics-cisa"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Ics.Kaspersky; | ||||||
|  |  | ||||||
|  | public sealed class IcsKasperskyConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "ics-kaspersky"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Jvn/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Jvn/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Jvn; | ||||||
|  |  | ||||||
|  | public sealed class JvnConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "jvn"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Kev/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Kev/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Kev; | ||||||
|  |  | ||||||
|  | public sealed class KevConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "kev"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Kisa; | ||||||
|  |  | ||||||
|  | public sealed class KisaConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "kisa"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Nvd/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Nvd/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Nvd; | ||||||
|  |  | ||||||
|  | public sealed class NvdConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "nvd"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Osv/Class1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.Source.Osv/Class1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Osv; | ||||||
|  |  | ||||||
|  | public sealed class OsvConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "osv"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Ru.Bdu; | ||||||
|  |  | ||||||
|  | public sealed class RuBduConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "ru-bdu"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Ru.Nkcki; | ||||||
|  |  | ||||||
|  | public sealed class RuNkckiConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "ru-nkcki"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Adobe; | ||||||
|  |  | ||||||
|  | public sealed class VndrAdobeConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-adobe"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Apple; | ||||||
|  |  | ||||||
|  | public sealed class VndrAppleConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-apple"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Chromium; | ||||||
|  |  | ||||||
|  | public sealed class VndrChromiumConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-chromium"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Cisco; | ||||||
|  |  | ||||||
|  | public sealed class VndrCiscoConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-cisco"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Msrc; | ||||||
|  |  | ||||||
|  | public sealed class VndrMsrcConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-msrc"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Oracle; | ||||||
|  |  | ||||||
|  | public sealed class VndrOracleConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-oracle"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Source.Vndr.Vmware; | ||||||
|  |  | ||||||
|  | public sealed class VndrVmwareConnectorPlugin : IConnectorPlugin | ||||||
|  | { | ||||||
|  |     public string Name => "vndr-vmware"; | ||||||
|  |  | ||||||
|  |     public bool IsAvailable(IServiceProvider services) => true; | ||||||
|  |  | ||||||
|  |     public IFeedConnector Create(IServiceProvider services) => new StubConnector(Name); | ||||||
|  |  | ||||||
|  |     private sealed class StubConnector : IFeedConnector | ||||||
|  |     { | ||||||
|  |         public StubConnector(string sourceName) => SourceName = sourceName; | ||||||
|  |  | ||||||
|  |         public string SourceName { get; } | ||||||
|  |  | ||||||
|  |         public Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |  | ||||||
|  |         public Task MapAsync(IServiceProvider services, CancellationToken cancellationToken) => Task.CompletedTask; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../../__Libraries/StellOps.AddOn/StellOps.AddOn.csproj" /> | ||||||
|  |  | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace StellaOps.Feedser.Storage.Mongo; | ||||||
|  |  | ||||||
|  | public class Class1 | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Models/StellaOps.Feedser.Models.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,30 @@ | |||||||
|  | using StellaOps.Feedser.Core; | ||||||
|  | using StellOps.AddOn; | ||||||
|  |  | ||||||
|  | namespace StellaOps.Feedser.Tests; | ||||||
|  |  | ||||||
|  | public class PluginLoaderTests | ||||||
|  | { | ||||||
|  |     private sealed class NullServices : IServiceProvider | ||||||
|  |     { | ||||||
|  |         public object? GetService(Type serviceType) => null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     [Fact] | ||||||
|  |     public void CanLoadBuiltInConnectorPlugins() | ||||||
|  |     { | ||||||
|  |         var services = new NullServices(); | ||||||
|  |         var plugins = PluginBootstrapper.LoadConnectorPlugins(services, AppContext.BaseDirectory); | ||||||
|  |         Assert.NotEmpty(plugins); | ||||||
|  |         Assert.Contains(plugins, p => p.Name == "cve"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     [Fact] | ||||||
|  |     public void CanLoadBuiltInExporterPlugins() | ||||||
|  |     { | ||||||
|  |         var services = new NullServices(); | ||||||
|  |         var plugins = PluginBootstrapper.LoadExporterPlugins(services, AppContext.BaseDirectory); | ||||||
|  |         Assert.NotEmpty(plugins); | ||||||
|  |         Assert.Contains(plugins, p => p.Name == "json"); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,25 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <IsPackable>false</IsPackable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="coverlet.collector" Version="6.0.4" /> | ||||||
|  |     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" /> | ||||||
|  |     <PackageReference Include="xunit" Version="2.9.2" /> | ||||||
|  |     <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Using Include="Xunit" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.WebService/StellaOps.Feedser.WebService.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | var builder = WebApplication.CreateBuilder(args); | ||||||
|  | var app = builder.Build(); | ||||||
|  |  | ||||||
|  | app.MapGet("/", () => "Hello World!"); | ||||||
|  |  | ||||||
|  | app.Run(); | ||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | { | ||||||
|  |   "$schema": "https://json.schemastore.org/launchsettings.json", | ||||||
|  |   "profiles": { | ||||||
|  |     "http": { | ||||||
|  |       "commandName": "Project", | ||||||
|  |       "dotnetRunMessages": true, | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "applicationUrl": "http://localhost:5191", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Development" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "https": { | ||||||
|  |       "commandName": "Project", | ||||||
|  |       "dotnetRunMessages": true, | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "applicationUrl": "https://localhost:7188;http://localhost:5191", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Development" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,45 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Core/StellaOps.Feedser.Core.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Acsc/StellaOps.Feedser.Source.Acsc.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Cccs/StellaOps.Feedser.Source.Cccs.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.CertBund/StellaOps.Feedser.Source.CertBund.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.CertCc/StellaOps.Feedser.Source.CertCc.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.CertFr/StellaOps.Feedser.Source.CertFr.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.CertIn/StellaOps.Feedser.Source.CertIn.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Common/StellaOps.Feedser.Source.Common.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Cve/StellaOps.Feedser.Source.Cve.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Distro.Debian/StellaOps.Feedser.Source.Distro.Debian.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Distro.RedHat/StellaOps.Feedser.Source.Distro.RedHat.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Distro.Suse/StellaOps.Feedser.Source.Distro.Suse.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Distro.Ubuntu/StellaOps.Feedser.Source.Distro.Ubuntu.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Ghsa/StellaOps.Feedser.Source.Ghsa.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Ics.Cisa/StellaOps.Feedser.Source.Ics.Cisa.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Ics.Kaspersky/StellaOps.Feedser.Source.Ics.Kaspersky.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Jvn/StellaOps.Feedser.Source.Jvn.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Kev/StellaOps.Feedser.Source.Kev.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Kisa/StellaOps.Feedser.Source.Kisa.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Nvd/StellaOps.Feedser.Source.Nvd.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Osv/StellaOps.Feedser.Source.Osv.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Ru.Bdu/StellaOps.Feedser.Source.Ru.Bdu.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Ru.Nkcki/StellaOps.Feedser.Source.Ru.Nkcki.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Adobe/StellaOps.Feedser.Source.Vndr.Adobe.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Apple/StellaOps.Feedser.Source.Vndr.Apple.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Chromium/StellaOps.Feedser.Source.Vndr.Chromium.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Cisco/StellaOps.Feedser.Source.Vndr.Cisco.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Msrc/StellaOps.Feedser.Source.Vndr.Msrc.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Oracle/StellaOps.Feedser.Source.Vndr.Oracle.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Source.Vndr.Vmware/StellaOps.Feedser.Source.Vndr.Vmware.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Exporter.Json/StellaOps.Feedser.Exporter.Json.csproj" /> | ||||||
|  |     <ProjectReference Include="../StellaOps.Feedser.Exporter.TrivyDb/StellaOps.Feedser.Exporter.TrivyDb.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "AllowedHosts": "*" | ||||||
|  | } | ||||||
							
								
								
									
										566
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										566
									
								
								src/StellaOps.Feedser/StellaOps.Feedser.sln
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,566 @@ | |||||||
|  |  | ||||||
|  | Microsoft Visual Studio Solution File, Format Version 12.00 | ||||||
|  | # Visual Studio Version 17 | ||||||
|  | VisualStudioVersion = 17.0.31903.59 | ||||||
|  | MinimumVisualStudioVersion = 10.0.40219.1 | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Acsc", "StellaOps.Feedser.Source.Acsc\StellaOps.Feedser.Source.Acsc.csproj", "{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Common", "StellaOps.Feedser.Source.Common\StellaOps.Feedser.Source.Common.csproj", "{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Models", "StellaOps.Feedser.Models\StellaOps.Feedser.Models.csproj", "{061B0042-9A6C-4CFD-9E48-4D3F3B924442}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Cisa", "StellaOps.Feedser.Source.Ics.Cisa\StellaOps.Feedser.Source.Ics.Cisa.csproj", "{6A301F32-2EEE-491B-9DB9-3BF26D032F07}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Tests", "StellaOps.Feedser.Tests\StellaOps.Feedser.Tests.csproj", "{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Core", "StellaOps.Feedser.Core\StellaOps.Feedser.Core.csproj", "{AFCCC916-58E8-4676-AABB-54B04CEA3392}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Storage.Mongo", "StellaOps.Feedser.Storage.Mongo\StellaOps.Feedser.Storage.Mongo.csproj", "{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Normalization", "StellaOps.Feedser.Normalization\StellaOps.Feedser.Normalization.csproj", "{429BAA6A-706D-489A-846F-4B0EF1B15121}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Merge", "StellaOps.Feedser.Merge\StellaOps.Feedser.Merge.csproj", "{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.Json", "StellaOps.Feedser.Exporter.Json\StellaOps.Feedser.Exporter.Json.csproj", "{1C5506B8-C01B-4419-B888-A48F441E0C69}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Exporter.TrivyDb", "StellaOps.Feedser.Exporter.TrivyDb\StellaOps.Feedser.Exporter.TrivyDb.csproj", "{4D936BC4-5520-4642-A237-4106E97BC7A0}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellOps.AddOn", "..\__Libraries\StellOps.AddOn\StellOps.AddOn.csproj", "{B85C1C0E-B245-44FB-877E-C112DE29041A}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.WebService", "StellaOps.Feedser.WebService\StellaOps.Feedser.WebService.csproj", "{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cccs", "StellaOps.Feedser.Source.Cccs\StellaOps.Feedser.Source.Cccs.csproj", "{A7035381-6D20-4A07-817B-A324ED735EB3}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Debian", "StellaOps.Feedser.Source.Distro.Debian\StellaOps.Feedser.Source.Distro.Debian.csproj", "{404F5F6E-37E4-4EF9-B09D-6634366B5D44}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Ubuntu", "StellaOps.Feedser.Source.Distro.Ubuntu\StellaOps.Feedser.Source.Distro.Ubuntu.csproj", "{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kisa", "StellaOps.Feedser.Source.Kisa\StellaOps.Feedser.Source.Kisa.csproj", "{23055A20-7079-4336-AD30-EFAA2FA11665}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertCc", "StellaOps.Feedser.Source.CertCc\StellaOps.Feedser.Source.CertCc.csproj", "{C2304954-9B15-4776-8DB6-22E293D311E4}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertFr", "StellaOps.Feedser.Source.CertFr\StellaOps.Feedser.Source.CertFr.csproj", "{E6895821-ED23-46D2-A5DC-06D61F90EC27}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Nvd", "StellaOps.Feedser.Source.Nvd\StellaOps.Feedser.Source.Nvd.csproj", "{378CB675-D70B-4A95-B324-62B67D79AAB7}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Oracle", "StellaOps.Feedser.Source.Vndr.Oracle\StellaOps.Feedser.Source.Vndr.Oracle.csproj", "{53AD2E55-B0F5-46AD-BFE5-82F486371872}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Nkcki", "StellaOps.Feedser.Source.Ru.Nkcki\StellaOps.Feedser.Source.Ru.Nkcki.csproj", "{B880C99C-C0BD-4953-95AD-2C76BC43F760}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.Suse", "StellaOps.Feedser.Source.Distro.Suse\StellaOps.Feedser.Source.Distro.Suse.csproj", "{23422F67-C1FB-4FF4-899C-706BCD63D9FD}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ru.Bdu", "StellaOps.Feedser.Source.Ru.Bdu\StellaOps.Feedser.Source.Ru.Bdu.csproj", "{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Kev", "StellaOps.Feedser.Source.Kev\StellaOps.Feedser.Source.Kev.csproj", "{20DB9837-715B-4515-98C6-14B50060B765}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ics.Kaspersky", "StellaOps.Feedser.Source.Ics.Kaspersky\StellaOps.Feedser.Source.Ics.Kaspersky.csproj", "{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Osv", "StellaOps.Feedser.Source.Osv\StellaOps.Feedser.Source.Osv.csproj", "{EFB16EDB-78D4-4601-852E-F4B37655FA13}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Jvn", "StellaOps.Feedser.Source.Jvn\StellaOps.Feedser.Source.Jvn.csproj", "{02289F61-0173-42CC-B8F2-25CC53F8E066}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertBund", "StellaOps.Feedser.Source.CertBund\StellaOps.Feedser.Source.CertBund.csproj", "{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Cve", "StellaOps.Feedser.Source.Cve\StellaOps.Feedser.Source.Cve.csproj", "{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Cisco", "StellaOps.Feedser.Source.Vndr.Cisco\StellaOps.Feedser.Source.Vndr.Cisco.csproj", "{19957518-A422-4622-9FD1-621DF3E31869}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Msrc", "StellaOps.Feedser.Source.Vndr.Msrc\StellaOps.Feedser.Source.Vndr.Msrc.csproj", "{69C4C061-F5A0-4EAA-A4CD-9A513523952A}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Chromium", "StellaOps.Feedser.Source.Vndr.Chromium\StellaOps.Feedser.Source.Vndr.Chromium.csproj", "{C7F7DE6F-A369-4F43-9864-286DCEC615F8}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Apple", "StellaOps.Feedser.Source.Vndr.Apple\StellaOps.Feedser.Source.Vndr.Apple.csproj", "{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Vmware", "StellaOps.Feedser.Source.Vndr.Vmware\StellaOps.Feedser.Source.Vndr.Vmware.csproj", "{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Vndr.Adobe", "StellaOps.Feedser.Source.Vndr.Adobe\StellaOps.Feedser.Source.Vndr.Adobe.csproj", "{C3A42AA3-800D-4398-A077-5560EE6451EF}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.CertIn", "StellaOps.Feedser.Source.CertIn\StellaOps.Feedser.Source.CertIn.csproj", "{5016963A-6FC9-4063-AB83-2D1F9A2BC627}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Ghsa", "StellaOps.Feedser.Source.Ghsa\StellaOps.Feedser.Source.Ghsa.csproj", "{72F43F43-F852-487F-8334-91D438CE2F7C}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StellaOps.Feedser.Source.Distro.RedHat", "StellaOps.Feedser.Source.Distro.RedHat\StellaOps.Feedser.Source.Distro.RedHat.csproj", "{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}" | ||||||
|  | EndProject | ||||||
|  | Global | ||||||
|  | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug|Any CPU = Debug|Any CPU | ||||||
|  | 		Debug|x64 = Debug|x64 | ||||||
|  | 		Debug|x86 = Debug|x86 | ||||||
|  | 		Release|Any CPU = Release|Any CPU | ||||||
|  | 		Release|x64 = Release|x64 | ||||||
|  | 		Release|x86 = Release|x86 | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{CFD7B267-46B7-4C73-A33A-3E82AD2CFABC}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{E9DE840D-0760-4324-98E2-7F2CBE06DC1A}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{061B0042-9A6C-4CFD-9E48-4D3F3B924442}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{6A301F32-2EEE-491B-9DB9-3BF26D032F07}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{8FBE9BCD-9972-4B21-9493-912DE14CEBF3}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{AFCCC916-58E8-4676-AABB-54B04CEA3392}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{BF3DAB2F-E46E-49C1-9BA5-AA389763A632}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{429BAA6A-706D-489A-846F-4B0EF1B15121}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{085CEC8E-0E10-48E8-89E2-9452CD2E7FA0}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1C5506B8-C01B-4419-B888-A48F441E0C69}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{4D936BC4-5520-4642-A237-4106E97BC7A0}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B85C1C0E-B245-44FB-877E-C112DE29041A}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{2C970A0F-FE3D-425B-B1B3-A008B194F5C2}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{A7035381-6D20-4A07-817B-A324ED735EB3}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{404F5F6E-37E4-4EF9-B09D-6634366B5D44}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1BEF4D9D-9EA4-4BE9-9664-F16DC1CA8EEB}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{23055A20-7079-4336-AD30-EFAA2FA11665}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C2304954-9B15-4776-8DB6-22E293D311E4}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{E6895821-ED23-46D2-A5DC-06D61F90EC27}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{378CB675-D70B-4A95-B324-62B67D79AAB7}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{53AD2E55-B0F5-46AD-BFE5-82F486371872}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{B880C99C-C0BD-4953-95AD-2C76BC43F760}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{23422F67-C1FB-4FF4-899C-706BCD63D9FD}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{16AD4AB9-2A80-4CFD-91A7-36CC1FEF439F}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{20DB9837-715B-4515-98C6-14B50060B765}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{10849EE2-9F34-4C23-BBB4-916A59CDB7F4}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{EFB16EDB-78D4-4601-852E-F4B37655FA13}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{02289F61-0173-42CC-B8F2-25CC53F8E066}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{4CE0B67B-2B6D-4D48-9D38-2F1165FD6BF4}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{EB037D9A-EF9C-439D-8A79-4B7D12F9C9D0}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{19957518-A422-4622-9FD1-621DF3E31869}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{69C4C061-F5A0-4EAA-A4CD-9A513523952A}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C7F7DE6F-A369-4F43-9864-286DCEC615F8}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{1C1593FE-73A4-47E8-A45B-5FC3B0BA7698}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{7255C38D-5A16-4A4D-98CE-CF0FD516B68E}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{C3A42AA3-800D-4398-A077-5560EE6451EF}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{5016963A-6FC9-4063-AB83-2D1F9A2BC627}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{72F43F43-F852-487F-8334-91D438CE2F7C}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Debug|x64.Build.0 = Debug|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Debug|x86.Build.0 = Debug|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Release|x64.ActiveCfg = Release|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Release|x64.Build.0 = Release|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Release|x86.ActiveCfg = Release|Any CPU | ||||||
|  | 		{A4DBF88F-34D0-4A05-ACCE-DE080F912FDB}.Release|x86.Build.0 = Release|Any CPU | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(SolutionProperties) = preSolution | ||||||
|  | 		HideSolutionNode = FALSE | ||||||
|  | 	EndGlobalSection | ||||||
|  | EndGlobal | ||||||
							
								
								
									
										171
									
								
								src/__Libraries/StellOps.AddOn/PluginContracts.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								src/__Libraries/StellOps.AddOn/PluginContracts.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.IO; | ||||||
|  | using System.Reflection; | ||||||
|  | using System.Runtime.Loader; | ||||||
|  | using System.Threading; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace StellOps.AddOn; | ||||||
|  |  | ||||||
|  | public interface IAvailabilityPlugin | ||||||
|  | { | ||||||
|  |     string Name { get; } | ||||||
|  |     bool IsAvailable(IServiceProvider services); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public interface IFeedConnector | ||||||
|  | { | ||||||
|  |     string SourceName { get; } | ||||||
|  |     Task FetchAsync(IServiceProvider services, CancellationToken cancellationToken); | ||||||
|  |     Task ParseAsync(IServiceProvider services, CancellationToken cancellationToken); | ||||||
|  |     Task MapAsync(IServiceProvider services, CancellationToken cancellationToken); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public interface IFeedExporter | ||||||
|  | { | ||||||
|  |     string Name { get; } | ||||||
|  |     Task ExportAsync(IServiceProvider services, CancellationToken cancellationToken); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public interface IConnectorPlugin : IAvailabilityPlugin | ||||||
|  | { | ||||||
|  |     IFeedConnector Create(IServiceProvider services); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public interface IExporterPlugin : IAvailabilityPlugin | ||||||
|  | { | ||||||
|  |     IFeedExporter Create(IServiceProvider services); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public sealed class PluginCatalog | ||||||
|  | { | ||||||
|  |     private readonly List<Assembly> _assemblies = new(); | ||||||
|  |     private readonly HashSet<string> _assemblyLocations = new(StringComparer.OrdinalIgnoreCase); | ||||||
|  |  | ||||||
|  |     public PluginCatalog AddAssembly(Assembly assembly) | ||||||
|  |     { | ||||||
|  |         if (assembly == null) throw new ArgumentNullException(nameof(assembly)); | ||||||
|  |         if (_assemblies.Contains(assembly)) | ||||||
|  |         { | ||||||
|  |             return this; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         _assemblies.Add(assembly); | ||||||
|  |         if (!string.IsNullOrWhiteSpace(assembly.Location)) | ||||||
|  |         { | ||||||
|  |             _assemblyLocations.Add(Path.GetFullPath(assembly.Location)); | ||||||
|  |         } | ||||||
|  |         return this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public PluginCatalog AddFromDirectory(string directory, string searchPattern = "StellaOps.Feedser.*.dll") | ||||||
|  |     { | ||||||
|  |         if (string.IsNullOrWhiteSpace(directory)) throw new ArgumentException("Directory is required", nameof(directory)); | ||||||
|  |         if (!Directory.Exists(directory)) | ||||||
|  |         { | ||||||
|  |             return this; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         foreach (var file in Directory.EnumerateFiles(directory, searchPattern, SearchOption.TopDirectoryOnly)) | ||||||
|  |         { | ||||||
|  |             var fullPath = Path.GetFullPath(file); | ||||||
|  |             if (_assemblyLocations.Contains(fullPath)) | ||||||
|  |             { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(fullPath); | ||||||
|  |             AddAssembly(assembly); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public IReadOnlyList<IConnectorPlugin> GetConnectorPlugins() => PluginLoader.LoadPlugins<IConnectorPlugin>(_assemblies); | ||||||
|  |  | ||||||
|  |     public IReadOnlyList<IExporterPlugin> GetExporterPlugins() => PluginLoader.LoadPlugins<IExporterPlugin>(_assemblies); | ||||||
|  |  | ||||||
|  |     public IReadOnlyList<IConnectorPlugin> GetAvailableConnectorPlugins(IServiceProvider services) | ||||||
|  |         => FilterAvailable(GetConnectorPlugins(), services); | ||||||
|  |  | ||||||
|  |     public IReadOnlyList<IExporterPlugin> GetAvailableExporterPlugins(IServiceProvider services) | ||||||
|  |         => FilterAvailable(GetExporterPlugins(), services); | ||||||
|  |  | ||||||
|  |     private static IReadOnlyList<TPlugin> FilterAvailable<TPlugin>(IEnumerable<TPlugin> plugins, IServiceProvider services) | ||||||
|  |         where TPlugin : IAvailabilityPlugin | ||||||
|  |     { | ||||||
|  |         var list = new List<TPlugin>(); | ||||||
|  |         foreach (var plugin in plugins) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (plugin.IsAvailable(services)) | ||||||
|  |                 { | ||||||
|  |                     list.Add(plugin); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch | ||||||
|  |             { | ||||||
|  |                 // Treat exceptions as plugin not available. | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return list; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public static class PluginLoader | ||||||
|  | { | ||||||
|  |     public static IReadOnlyList<TPlugin> LoadPlugins<TPlugin>(IEnumerable<Assembly> assemblies) | ||||||
|  |         where TPlugin : class | ||||||
|  |     { | ||||||
|  |         if (assemblies == null) throw new ArgumentNullException(nameof(assemblies)); | ||||||
|  |  | ||||||
|  |         var plugins = new List<TPlugin>(); | ||||||
|  |         var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase); | ||||||
|  |  | ||||||
|  |         foreach (var assembly in assemblies) | ||||||
|  |         { | ||||||
|  |             foreach (var candidate in SafeGetTypes(assembly)) | ||||||
|  |             { | ||||||
|  |                 if (candidate.IsAbstract || candidate.IsInterface) | ||||||
|  |                 { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (!typeof(TPlugin).IsAssignableFrom(candidate)) | ||||||
|  |                 { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (Activator.CreateInstance(candidate) is not TPlugin plugin) | ||||||
|  |                 { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var key = candidate.FullName ?? candidate.Name; | ||||||
|  |                 if (key is null || !seen.Add(key)) | ||||||
|  |                 { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 plugins.Add(plugin); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return plugins; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static IEnumerable<Type> SafeGetTypes(Assembly assembly) | ||||||
|  |     { | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             return assembly.GetTypes(); | ||||||
|  |         } | ||||||
|  |         catch (ReflectionTypeLoadException ex) | ||||||
|  |         { | ||||||
|  |             return ex.Types.Where(t => t is not null)!; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								src/__Libraries/StellOps.AddOn/StellOps.AddOn.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/__Libraries/StellOps.AddOn/StellOps.AddOn.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net10.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
		Reference in New Issue
	
	Block a user