From 410863d25334a551d4ea4100f1d276ff03b32bb0 Mon Sep 17 00:00:00 2001 From: Thomas Durieux <5577568+tdurieux@users.noreply.github.com> Date: Mon, 2 Nov 2026 20:49:03 +0000 Subject: [PATCH] feat: add paid author and conference hosting with Stripe --- README.md | 4 + docs/paid-hosting.md | 255 +++++++++++++++ docs/stripe-sandbox-validation.md | 104 ++++++ package-lock.json | 18 ++ package.json | 5 +- public/asset-manifest.json | 4 +- public/css/all.min.css | 2 +- public/css/style.css | 296 ++++++++++++++++++ public/i18n/locale-en.json | 10 +- public/partials/anonymize.htm | 140 +++++---- public/partials/conference.htm | 16 + public/partials/faq.htm | 184 +++++++++-- public/partials/header.htm | 3 + public/partials/newConference.htm | 8 +- public/partials/profile.htm | 210 +++++-------- public/partials/status.htm | 73 ++--- public/script/app.js | 151 ++++++++- public/script/billing.js | 83 +++++ public/script/components.js | 2 +- public/script/drafts.js | 7 +- public/script/forms.js | 2 +- public/script/main.js | 1 + public/script/vendor.min.js | 46 +-- scripts/paid-usage-report.mongosh.js | 53 ++++ scripts/test-stripe-sandbox.js | 190 +++++++++++ src/config.ts | 43 +++ src/core/AnonymizedFile.ts | 1 + src/core/Repository.ts | 6 + src/core/billing/config.ts | 24 ++ src/core/billing/drafts.ts | 23 ++ src/core/billing/events.ts | 55 ++++ src/core/billing/expiration.ts | 78 +++++ src/core/billing/maintenance.ts | 36 +++ src/core/billing/models.ts | 46 +++ src/core/billing/quotas.ts | 58 ++++ src/core/billing/reconciliation.ts | 59 ++++ src/core/billing/stripe.ts | 251 +++++++++++++++ .../anonymizedRepositories.schema.ts | 2 + .../anonymizedRepositories.types.ts | 2 + src/core/types.ts | 2 +- src/scripts/billing-operations.ts | 43 +++ src/server/index.ts | 5 + src/server/routes/billing.ts | 114 +++++++ src/server/routes/conference.ts | 55 ++-- src/server/routes/repository-private.ts | 21 ++ src/server/routes/repository-public.ts | 1 + src/server/routes/user.ts | 16 +- src/server/schedule.ts | 2 + test/billing-integration.test.js | 277 ++++++++++++++++ test/billing-reliability.test.js | 233 ++++++++++++++ test/billing.test.js | 51 +++ test/frontend-regressions.test.js | 6 +- test/vue-ui.test.js | 253 ++++++++++++++- test/zip-proxy-errors.test.js | 2 +- 54 files changed, 3263 insertions(+), 369 deletions(-) create mode 100644 docs/paid-hosting.md create mode 100644 docs/stripe-sandbox-validation.md create mode 100644 public/script/billing.js create mode 100644 scripts/paid-usage-report.mongosh.js create mode 100644 scripts/test-stripe-sandbox.js create mode 100644 src/core/billing/config.ts create mode 100644 src/core/billing/drafts.ts create mode 100644 src/core/billing/events.ts create mode 100644 src/core/billing/expiration.ts create mode 100644 src/core/billing/maintenance.ts create mode 100644 src/core/billing/models.ts create mode 100644 src/core/billing/quotas.ts create mode 100644 src/core/billing/reconciliation.ts create mode 100644 src/core/billing/stripe.ts create mode 100644 src/scripts/billing-operations.ts create mode 100644 src/server/routes/billing.ts create mode 100644 test/billing-integration.test.js create mode 100644 test/billing-reliability.test.js create mode 100644 test/billing.test.js diff --git a/README.md b/README.md index c42e412..bb88c38 100644 --- a/README.md +++ b/README.md @@ -138,3 +138,7 @@ diagram is encountered. These libraries use hashed URLs and load once per tab. The Docker build compiles the same bundles and copies them, the asset manifest, and document-worker assets into the runtime image. The Compose app serves these assets directly; no frontend development server is needed. + +### Paid hosting + +Optional Stripe billing supports monthly and annual author subscriptions, repository review passes, and prepaid conference packages. Billing is disabled by default. See the [setup and rollout guide](docs/paid-hosting.md) for prices, capacities, webhooks, migration behavior, and test-mode verification. diff --git a/docs/paid-hosting.md b/docs/paid-hosting.md new file mode 100644 index 0000000..eee2f39 --- /dev/null +++ b/docs/paid-hosting.md @@ -0,0 +1,255 @@ +# Paid hosting + +Billing is opt-in. `BILLING_ENABLED=false` preserves self-hosted behavior. This implementation uses Stripe Checkout and the customer portal. No card details are stored in the application. + +## Offers + +Configure four EUR prices in Stripe. The amounts below are suggested launch prices, not hard-coded charges: + +- Author monthly: €5/month, recurring monthly. +- Author annual: €49/year, recurring yearly. +- Author review pass: €15 once, one existing repository for 180 days from checkout creation. +- Conference review package: €199 once, up to 100 repositories during a fixed review window of at most 180 days. + +Checkout uses the configured Stripe Price ID. The settings page displays its actual amount and cadence. Do not configure trials, metered prices, tiered prices, adjustable quantities, or subscription changes to unrelated products in the customer portal. New subscriptions need a paid invoice before access is granted. A failed renewal does not extend paid time. Cancellation at period end keeps access until that period ends; immediate cancellation ends new paid usage immediately. + +Only repository hosting is covered. Gists and pull requests retain their existing behavior. Lab plans are not included. + +Default capacities, all measured in source-file bytes: + +- Free account: 5 repositories, 2 GiB total. +- Author subscription: 20 repositories, 10 GiB total, and never-expiring repositories while subscribed. +- Repository pass: 1 repository, 2 GiB. +- Conference: 100 repositories, 50 GiB total. + +These are admission limits, not a measure or guarantee of physical disk consumption. Original files, anonymized caches, metadata and backups need additional capacity. Review production usage before enabling billing. File-size safeguards and request throttles still apply to paid users. Reviewers do not need accounts or payment. + +## Configuration + +Set these environment variables in your deployment's secret/configuration manager: + +```text +BILLING_ENABLED=true +BILLING_ORIGIN=https://anonymous.example.org +STRIPE_SECRET_KEY= +STRIPE_WEBHOOK_SECRET= +STRIPE_AUTHOR_MONTHLY_PRICE= +STRIPE_AUTHOR_ANNUAL_PRICE= +STRIPE_AUTHOR_PASS_PRICE= +STRIPE_CONFERENCE_PRICE= +BILLING_AUTOMATIC_TAX=false +``` + +Price IDs can be omitted to hide offers. Use test-mode keys and prices for staging. `BILLING_ORIGIN` must be the application's canonical HTTPS origin; HTTP is accepted only for localhost development. Redirects never use request-supplied hosts or return URLs. Enable and configure Stripe Tax before setting `BILLING_AUTOMATIC_TAX=true`; otherwise configure the appropriate tax treatment in Stripe before launch. Receipts, seller details and portal settings also need configuration in Stripe. + +Capacity overrides are positive integers: + +```text +FREE_AUTHOR_REPOSITORIES=5 +FREE_AUTHOR_STORAGE=2147483648 +PAID_AUTHOR_REPOSITORIES=20 +PAID_AUTHOR_STORAGE=10737418240 +PAID_PASS_STORAGE=2147483648 +PAID_CONFERENCE_REPOSITORIES=100 +PAID_CONFERENCE_STORAGE=53687091200 +``` + +Changing these values changes the allowance of existing plans too. Keep existing Price IDs configured for as long as subscriptions using them remain active. Plan and conference review-window changes are intentionally locked in this first version. + +Configure the Stripe customer portal for payment-method updates, invoice downloads and cancellation. Disable arbitrary subscription product switches. Configure a snapshot webhook at `/api/billing/webhook` using API version `2026-10-28.endive`, matching the installed Stripe SDK, for: + +- `checkout.session.completed` +- `checkout.session.async_payment_succeeded` +- `customer.subscription.created` +- `customer.subscription.updated` +- `customer.subscription.deleted` +- `customer.subscription.paused` +- `customer.subscription.resumed` +- `invoice.paid` +- `invoice.payment_failed` +- `charge.refunded` +- `charge.dispute.created` + +The webhook is mounted before JSON parsing so Stripe verifies the original request bytes. Failed durable receipt returns 500 for Stripe retries. Processing runs asynchronously from the stored event inbox. Duplicate deliveries do not extend passes or allocate duplicate grants. Subscription events retrieve current Stripe state and use a database revision check to prevent stale concurrent writes. Full refunds and disputes suspend the affected paid grant; partial refunds preserve access; reinstatement after a resolved dispute requires operator review. + +## Lifecycle and migration + +New paid conferences remain `pending_payment` until a verified checkout activates them. Collect billing addresses in Stripe. Historic conference plans remain editable and keep their existing status, but are no longer offered to new conferences. There is no automatic charge for historical estimated usage. + +Existing repositories are not deleted or hidden on rollout or subscription expiry. New repositories are marked `billingManaged`; their file trees must fit an allowance before publication. A repository that fails this check remains available in its owner's dashboard for upgrading and retrying. Buy a pass by entering that repository's anonymized ID in Settings. Automatic refresh pauses for billing-managed repositories on the free allowance, including after paid access expires. Owners can still request a refresh within that allowance. Existing review links retain their configured expiration dates. This is not a guarantee of perpetual hosting. + +Allowances are selected in order: paid conference, repository pass, author subscription, free account. MongoDB quota ledgers atomically reserve count and source-file bytes. They initially count existing repositories using stored size metadata. Reservations never shrink during refresh, so a concurrent or failed build cannot release capacity still in use. Confirmed removed repositories release reservations on the next admission. Expired repositories and orphan reservations remain reserved until operator reconciliation. This deliberately favors conservative capacity accounting over overselling. The account usage display uses reserved capacity once a ledger exists. A moved repository can retain conservative reservations in its previous scope until removal. + +For billing-managed repositories, on-demand recovery and ZIP downloads from truncated trees are rejected with `repository_tree_incomplete`. This prevents serving unaccounted files beyond the indexed tree. A complete source tree is required; refresh after reducing repository size or excluded content upstream. + +Billing records are in separate `billingaccounts`, `billinggrants`, `billingquotas` and `billinglocks` collections. They are not serialized on anonymous repository pages. Account deletion cancels recurring subscriptions and expires any known open checkout before deleting content. Minimal provider IDs and financial records remain for reconciliation. Do not disable billing configuration while active subscriptions still need webhook processing or cancellation. + +## Verification and operation + +Run focused policy and MongoDB tests against a disposable database: + +```sh +npx mocha test/billing.test.js +BILLING_TEST_MONGODB_URI=mongodb://127.0.0.1:27017/billing_test_paid npx mocha test/billing-integration.test.js +npm run test:ui +npm run build +``` + +The integration suite deletes data in its test collections and requires a database name beginning with `billing_test_`. It covers concurrent admission, duplicate fulfillment, customer binding, refunds, subscription cancellation, failed renewal, stale event writes and conference activation. It uses a fake Stripe client and real MongoDB; it does not charge cards. + +Before production rollout, run a Stripe test-mode purchase for each configured price, renewal with a test clock, failed renewal, cancellation, refund and webhook retry. Confirm currency, tax behavior, invoice details, capacities and backups. Inspect webhook delivery failures in Stripe. The in-app Refresh payment status action reconciles the latest checkout and known subscriptions; it is not a substitute for webhooks. Failed checkout requests preserve their idempotency key so retrying the same plan recovers the session. + +Back up billing collections with the rest of MongoDB. Watch source bytes, physical storage, bandwidth and request rates separately. Stripe fees, taxes and refunds reduce gross revenue. + + +### Coauthors and the free allowance + +Only repositories owned by an account consume its allowance. Joining another author's repository does not consume a slot, and coauthors do not need subscriptions. A coauthor's own subscription does not increase the owner's allowance. Edits and refreshes use the owner's allowance, or the repository's paid conference/pass allowance. If that allowance is full, a collaborator's attempt to refresh or enlarge the repository can also be blocked. Existing review links remain available. + +The free defaults are 5 repositories and 2 GiB, revised from the initial 10-repository proposal after the November 2, 2026 production audit. The audit counted ready, unexpired repositories; stored sizes were estimates rather than a fresh recount. Paid author subscriptions retain 20 repositories, 10 GiB and automatic refresh. + +### Never-expiring repositories + +Monthly and annual author subscribers can choose Never expire. This requires the repository owner's subscription even when a conference pays its storage allowance. A coauthor subscription or a one-time review pass does not unlock it. + +Newly selected Never expire repositories store a billing deadline 90 days after the paid-through date. The five-minute maintenance job extends that deadline on renewal and changes overdue repositories to ordinary removal expiration. Cancellation does not shorten the paid-through period. Revocation does not extend a previously recorded deadline. Renewal during the grace period preserves the repository; after expiration, the author must renew and explicitly reactivate it. + +Legacy never-expiring repositories have no billing deadline and remain unchanged. Disabling billing disables this reconciliation. Free users can choose a dated expiration within one year and extend it manually. Never expire does not exempt a repository from quotas, abuse controls, or service availability. + +Real sandbox validation and repeatable API test instructions are recorded in [Stripe sandbox validation](stripe-sandbox-validation.md). + +## Billing recovery and operation + +`BILLING_CHECKOUT_ENABLED=false` stops new purchases while webhooks, reconciliation, +the customer portal, and cancellation remain available. Keep `BILLING_ENABLED=true` +and the existing Stripe price IDs configured while subscriptions exist. + +Verified webhook routing references are durably inserted into `billingevents` before +HTTP acknowledgement. A ten-second worker claims events with a five-minute lease, +retries failures with exponential backoff, and marks an event failed after 12 failed +processing attempts. Repeated delivery cannot create another inbox record. A worker +that dies after fulfillment can replay the operation without allocating another grant. +Completed envelopes are removed after 90 days; failed events remain for investigation. +The inbox deliberately omits customer names, addresses, card data, and full payloads. +Do not register Connect events on this application's platform webhook. + +Every five minutes, a separate job selects up to ten due billing accounts. Each account +is normally reconciled daily; failures retry after 15 minutes. Reconciliation paginates +subscriptions, checkout sessions, and charges, including historical purchases absent +from MongoDB. It also reconstructs confirmed paid periods from invoice lines when the +latest invoice failed. This full customer-history scan favors recovery at the current +scale. Measure Stripe request volume before shortening the daily interval. + +Before the 90-day deadline triggers expiration, maintenance performs a fresh owner +reconciliation. Provider or database failures defer that expiration and log an error. +Legacy never-expiring repositories remain excluded. The recorded grace period does not +restart during retries. Ordinary repository requests continue using local entitlements. + +Checkout retries retain their key and exact creation parameters. Sessions have an +explicit expiry. After 23 hours, unresolved requests are searched by purchase-attempt +metadata before any retry. After 24 hours, an unmatched attempt can be replaced only if +its immutable request contains an expired session deadline. Older records without that +proof require operator review. Uncertain customer creation also stops after 23 hours; +customer discovery can recover the mapping without creating another customer. + +Partial refunds preserve access. Full refunds and disputes suspend the affected grant. +`billingrevocations` records the payment decision even if its grant does not exist yet. +A dispute after a reviewed refund requires review again. Reinstatement is an explicit operator +decision; it does not create paid time or restart a subscription. Do not grant a refund +merely to cancel renewal. + +The existing application error log receives billing failures and five-minute health +warnings for failed events, old pending events, unresolved checkout attempts, and failed +reconciliation. These warnings also appear in the existing admin error viewer. External +email or paging delivery still requires deployment monitoring configuration. + +### Operator commands + +Run with the application's normal server configuration and database access. Inspection +is read-only; mutation commands require `BILLING_OPERATOR` and an audit reason. They +write an intent record to `billingaudits` before performing work. Inspect resulting +state after a command failure; an audit intent alone does not prove completion. + +```sh +node -r ts-node/register src/scripts/billing-operations.ts health +node -r ts-node/register src/scripts/billing-operations.ts inspect OWNER_ID +BILLING_OPERATOR=operator-name node -r ts-node/register src/scripts/billing-operations.ts reconcile OWNER_ID 'Investigating missing paid access' +BILLING_OPERATOR=operator-name node -r ts-node/register src/scripts/billing-operations.ts replay test:platform:evt_ID 'Retry after correcting configuration' +BILLING_OPERATOR=operator-name node -r ts-node/register src/scripts/billing-operations.ts drain all 'Process queued recovery work' +BILLING_OPERATOR=operator-name node -r ts-node/register src/scripts/billing-operations.ts discover all 'Recover customer mappings after restore' +BILLING_OPERATOR=operator-name node -r ts-node/register src/scripts/billing-operations.ts reinstate pi_ID 'Dispute resolved; access reinstatement approved' +``` + +Discovery binds only customers tagged for this application to existing users. Conflicting +customer mappings require investigation. `reinstate` reviews a payment reversal and +keeps a subscription suspended if other unreviewed payment reversals remain. Reconcile +the owner afterward. Restrict shell access to authorized operators; these are not public +HTTP endpoints. + +### Restore and launch checks + +Back up `billingaccounts`, `billinggrants`, `billingquotas`, `billinglocks`, `billingevents`, +`billingrevocations`, and `billingaudits` with repository data. Test a restore into an +isolated environment with sandbox credentials. Keep destructive repository maintenance +stopped during restore, discover customer mappings, reconcile restored owners, drain +queued events, and inspect health before re-enabling normal scheduling. Never connect a +restored test copy to live Stripe credentials. + +Before launch, configure seller details, live prices, tax treatment, invoice information, +portal restrictions, production email delivery, backup retention, and external alerts. +These are deployment/business settings, not changes made by this implementation. Grace +period email reminders are not currently sent by the app. + +The recovery suite uses a disposable MongoDB database and simulated Stripe failures: + +```sh +BILLING_TEST_MONGODB_URI=mongodb://127.0.0.1:27029/billing_test_recovery npx mocha test/billing.test.js test/billing-integration.test.js test/billing-reliability.test.js +``` + +## Payment within the repository workflow + +Repository hosting choices now appear in the anonymization form when capacity or a +new Never expire selection requires them. Free dated submissions and coauthor work +keep their existing flow. Conference admission and final capacity are still checked +server-side; an account usage display cannot authorize or permanently block admission. +Existing repository owners can also buy a repository-scoped pass from that form. + +Before leaving for hosted Stripe Checkout, the app flushes pending field edits and +saves a private task draft. `/api/billing/draft` requires authentication and the billing +CSRF token. Drafts retain only the form fields needed to resume, are limited to 64 KiB, +and expire after seven days. Retrieval checks the owner and expiry even before MongoDB's +TTL sweep runs. Account deletion also removes these drafts. + +Checkout returns to the draft's validated anonymization route, or the conference +being purchased, rather than always returning to Settings. No request-supplied external +return URL is accepted. An open or uncertain checkout attempt cannot be reused for a +different task. Returning restores the draft, refreshes billing and capacity, and leaves +submission to the author. The return token is consumed after restoration so later +navigation cannot overwrite newer edits. Confirmation does not create a repository. + +The payment form remains Stripe-hosted. Embedded Checkout is not required for this +workflow and is not enabled by this change. Settings remain available for invoices +and subscription management. + +Validation: 40 billing tests with disposable MongoDB and 160 frontend tests passed. +Additional HTTP checks cover draft CSRF, authentication, ownership and no-store headers. +The built UI was checked at desktop and mobile widths using simulated payment responses; +redaction edits survived the checkout return. These workflow changes were not charged +through a fresh real Stripe sandbox payment or deployed to production. + +### Current application layout + +The anonymization page keeps the main configuration sections visible beside a live +README preview. Source controls retain the existing GitHub connection selector, +manage-access action and branch refresh button. Conference code is a visible optional +field. Hosting choices appear within configuration, with saved drafts preserved through +Stripe Checkout and return. + +Settings separates anonymization defaults, hosting and billing, and account actions. +The header Upgrade action sits beside the user menu and opens the plan comparison. +Active subscribers see subscription management instead of another purchase offer. +The donation entry remains available. + +Local browser checks used simulated payment responses for the final layout. The real +Stripe sandbox checks and their limitations are documented in +[stripe-sandbox-validation.md](stripe-sandbox-validation.md). diff --git a/docs/stripe-sandbox-validation.md b/docs/stripe-sandbox-validation.md new file mode 100644 index 0000000..218c967 --- /dev/null +++ b/docs/stripe-sandbox-validation.md @@ -0,0 +1,104 @@ +# Stripe sandbox validation + +Validated November 2, 2026 using a real Stripe sandbox, disposable local MongoDB, Stripe-hosted Checkout and the customer portal. The Stripe CLI forwarded real signed events to the application's raw webhook route. + +## Results + +The repeatable API suite passed 16 scenarios: + +- Checkout creation, reuse, unpaid-access denial and session expiry for all four plans. +- Successful monthly and annual subscription payments and author entitlements. +- Duplicate subscription prevention for both recurring plans. +- Scheduled cancellation preserves the paid period. +- Immediate cancellation removes paid capacity; never-expiring repositories retain the recorded grace deadline and enter expiration after it. +- A declined initial payment grants no subscription access. +- Subscription refunds revoke access. Repeated signed events are idempotent; altered payloads fail signature verification; later subscription sync does not undo revocation. +- A Stripe test clock advances a monthly subscription through successful renewal, failed renewal and recovery. Only paid invoices advance paid-through time. +- Account deletion cancels its subscription. + +Interactive checks also passed: + +- A repository pass purchased through hosted Checkout activated through a real webhook. +- A conference purchase changed pending payment to ready through a real webhook. +- Monthly Checkout displayed an insufficient-funds decline without granting access, then activated after retry with a successful test card. +- Annual Checkout granted no access after failed 3-D Secure authentication and activated after successful authentication. +- Refunding the repository pass revoked its grant through a real webhook. +- The customer portal showed billing details and invoices and scheduled cancellation at the paid-period boundary. +- A disputed sandbox subscription payment triggered a real dispute webhook, revoked access and remained revoked after resync. + +The local billing regression suite passed 23 tests, including quota concurrency, coauthor accounting, authorization/CSRF, grace periods and signature checks. TypeScript and targeted lint checks passed. + +## Fixes found by real Stripe testing + +1. Open subscription Checkout sessions do not yet have a subscription ID. Fulfillment now ignores unfinished sessions instead of reporting an invalid purchase. +2. The customer portal can schedule cancellation using cancel_at while cancel_at_period_end remains false. The app now recognizes either representation when displaying cancelled renewal. + +## Repeating the API checks + +Create a private JSON file outside the repository with a secret field containing a sandbox secret key. The script rejects live keys and verifies Stripe reports sandbox mode before creating fixtures. + +Run against a disposable MongoDB database whose name begins with billing_test_: + +```sh +STRIPE_SANDBOX_CREDENTIALS=/absolute/path/to/private-credentials.json \ +BILLING_TEST_MONGODB_URI=mongodb://127.0.0.1:27029/billing_test_stripe \ +node scripts/test-stripe-sandbox.js +``` + +The script creates tagged test customers, one product and four test prices. It deletes its customers and test clocks and deactivates its prices/product afterward. Stripe retains transaction history. It does not change existing prices or production settings. Test price amounts are fixtures, not a published price commitment. + +## Limits of this validation + +- This covers the implemented card-payment flows, not every Stripe payment method or account configuration. +- Automatic tax was disabled. Tax registration, live tax calculation, live settlement, seller details and production email delivery were not tested. +- The test clock changes Stripe time, not the application's wall clock. Failed-renewal tests verify paid-through does not advance; local tests exercise access expiry and the 90-day boundary. +- Hosted Checkout, portal and live CLI-forwarded webhook checks were interactive. The repeatable API suite uses real Stripe responses with locally generated webhook signatures for its HTTP replay test. +- No production deployment or live payment occurred. Sandbox customers and active subscriptions from this run were cleaned up; products and prices were archived. + +## Reliability follow-up + +The repeatable 16-scenario sandbox suite passed again after introducing durable webhook +receipt, asynchronous processing, checkout expiry, and provider reconciliation. The +HTTP refund replay check now explicitly drains the inbox before asserting entitlements. +No live payments or production deployment were performed. + +The local billing suites now include crash recovery, concurrent event receipt, retry +exhaustion, privacy of stored envelopes, reconstruction after missing local grants, +missed renewal recovery, refund-before-fulfillment ordering, partial refunds, uncertain +checkout recovery, purchase shutdown, and expiration deferral during provider outages. +These are deterministic failure simulations against disposable MongoDB, not a claim +that production backup infrastructure or external alert delivery has been tested. + +Final follow-up checks passed: 38 local billing tests, 155 frontend regression/UI tests, +TypeScript compilation, the production build, and targeted ESLint checks. The 16-scenario +real Stripe sandbox suite also passed with historical invoice recovery enabled. + +## Full application UI check — November 2, 2026 + +Used the built application in the collaborative browser, production billing routes, +an isolated MongoDB database and real Stripe sandbox Checkout and customer portal. +GitHub login was replaced with a test-only session fixture outside the repository. + +| UI flow | Observed result | +| --- | --- | +| Free account | Five repositories and 2 GiB displayed. | +| Monthly subscription | Insufficient-funds decline granted no access; successful retry activated 20 repositories and 10 GiB. | +| Duplicate subscription | App rejected another subscription and displayed the explanation. | +| Customer portal | Billing details and invoices loaded; cancellation stopped renewal while preserving paid access. | +| Annual subscription | Failed 3-D Secure granted no access; successful authentication activated annual access. | +| Delayed webhook processing | With the worker paused, the checkout return recovered annual access from Stripe. Both billing and quota panels reflected the upgrade. Queued events completed after resuming the worker. | +| Abandoned repository pass | Returning without payment granted no access. Reopening reused the same checkout session. | +| Paid repository pass | Successful checkout created a repository-scoped grant. | +| Refunded pass | A sandbox API refund generated real webhooks; refreshing in the UI showed revoked access. Refund initiation was an operator action, not an app UI feature. | +| Conference package | Checkout from the pending conference activated the package; the conference page showed Ready. | + +Two UI issues were fixed during this run: checkout reconciliation now refreshes the +quota panel, and revoked purchases no longer display a future paid-access date. +The quota issue has a regression test. Four targeted UI tests and the UI build passed; +both fixes were also checked in the real browser. No failed or pending received +webhook events remained at the final pre-cleanup inspection. + +This run does not cover GitHub OAuth, repository ingestion, production deployment, +tax, email delivery, or the passage of the 90-day grace period. Those should not be +inferred from the payment UI results. Temporary customers/subscriptions were deleted, +prices and product archived, and the disposable local services removed after testing. diff --git a/package-lock.json b/package-lock.json index 86ae8a4..41b48f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "re2js": "^2.8.6", "redis": "^5.12.1", "sanitize-html": "^2.18.0", + "stripe": "^23.1.0", "ts-custom-error": "^3.3.1", "unzip-stream": "^0.3.4" }, @@ -10865,6 +10866,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stripe": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-23.1.0.tgz", + "integrity": "sha512-fVUfMSfTPoukfoV//MUKAx2+YxyKmYaYtnAL9VkfnHfaPNQylFdWZMD+zgUFerI8rjbaiER8Vzj2XEUQ2AhAsQ==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@types/node": ">=20" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/package.json b/package.json index 78128ec..79305ee 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "re2js": "^2.8.6", "redis": "^5.12.1", "sanitize-html": "^2.18.0", + "stripe": "^23.1.0", "ts-custom-error": "^3.3.1", "unzip-stream": "^0.3.4" }, @@ -106,9 +107,9 @@ "ts-node": "^10.9.2", "typescript": "^5.9.3", "typescript-eslint": "^8.71.1", + "vinyl-fs": "^4.0.2", "vue": "^3.5.43", - "vue-router": "^4.6.4", - "vinyl-fs": "^4.0.2" + "vue-router": "^4.6.4" }, "engines": { "node": "^22.15.0 || ^24.0.0 || >=26.0.0" diff --git a/public/asset-manifest.json b/public/asset-manifest.json index 6500c7f..2decdc0 100644 --- a/public/asset-manifest.json +++ b/public/asset-manifest.json @@ -1,8 +1,8 @@ { "core.min.js": "core.3b07189932.min.js", - "vendor.min.js": "vendor.9d3752006f.min.js", + "vendor.min.js": "vendor.a8c61c4ffb.min.js", "mermaid.min.js": "mermaid.f848a72d16.min.js", - "all.min.css": "all.d1feb1dfc4.min.css", + "all.min.css": "all.1d7ab8bc01.min.css", "markdown.min.js": "markdown.44f2e93820.min.js", "pdf.min.js": "pdf.4d9cc6ff49.min.js", "notebook.min.js": "notebook.c3144c18ae.min.js", diff --git a/public/css/all.min.css b/public/css/all.min.css index c38cce7..ee70396 100644 --- a/public/css/all.min.css +++ b/public/css/all.min.css @@ -6,4 +6,4 @@ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}/*! * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:'Font Awesome 5 Brands';font-weight:400}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:'Font Awesome 5 Free';font-weight:400}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:block;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:'Font Awesome 5 Free';font-weight:900}.nb-notebook{line-height:1.5}.nb-stderr,.nb-stdout{white-space:pre-wrap;margin:1em 0;padding:.1em .5em}.nb-stderr{background-color:#faa}.nb-cell+.nb-cell{margin-top:.5em}.nb-output table{border:1px solid #000;border-collapse:collapse}.nb-output th{font-weight:700}.nb-output td,.nb-output th{border:1px solid #000;padding:.25em;text-align:left;vertical-align:middle;border-collapse:collapse}.nb-notebook blockquote{border-left:5px solid #ccc;margin-left:0;padding-left:1em}.nb-cell{position:relative}.nb-raw-cell{white-space:pre-wrap;background-color:#f5f2f0;font-family:Consolas,Monaco,'Andale Mono',monospace;padding:1em;margin:.5em 0}.nb-output{min-height:1em;width:100%;overflow-x:scroll;border-right:1px dotted #ccc}.nb-output img{max-width:100%}.nb-input:before,.nb-output:before{position:absolute;font-family:monospace;color:#999;left:-7.5em;width:7em;text-align:right}.nb-input:before{content:"In [" attr(data-prompt-number) "]:"}.nb-output:before{content:"Out [" attr(data-prompt-number) "]:"}// Fix pandas dataframe formatting div[style="max-height:1000px;max-width:1500px;overflow:auto;"]{max-height:none!important}@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.10"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}.mermaid{text-align:center;margin:1em 0;overflow:auto}.mermaid svg{max-width:100%;height:auto}.dark-mode .mermaid{filter:invert(1) hue-rotate(180deg)}.dark-mode .mermaid svg{background:0 0}.dark-mode .mermaid .edgeLabel,.dark-mode .mermaid .nodeLabel{filter:invert(1) hue-rotate(180deg)}.mermaid .node circle,.mermaid .node ellipse,.mermaid .node polygon,.mermaid .node rect{stroke-width:2px}.mermaid .flowchart-link{stroke-width:2px}.mermaid .actor{fill:#f9f9f9;stroke:#333;stroke-width:2px}.mermaid .messageLine0,.mermaid .messageLine1{stroke:#333;stroke-width:1.5px}.mermaid .section0,.mermaid .section1,.mermaid .section2,.mermaid .section3{opacity:.8}.mermaid .pieChart .slice{opacity:.9}.markdown-body .mermaid{background:0 0;border:none;padding:10px}.mermaid .error{color:#d32f2f;font-family:monospace;font-size:12px;padding:10px;border:1px solid #d32f2f;border-radius:4px;background-color:#ffebee}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff')}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.5;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{color:#fafbfc;background-color:#b31d28}.markdown-body .pl-c2{color:#fafbfc;background-color:#d73a49}.markdown-body .pl-c2::before{content:"^M"}.markdown-body .pl-sr .pl-cce{font-weight:700;color:#22863a}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:#005cc5}.markdown-body .pl-mi{font-style:italic;color:#24292e}.markdown-body .pl-mb{font-weight:700;color:#24292e}.markdown-body .pl-md{color:#b31d28;background-color:#ffeef0}.markdown-body .pl-mi1{color:#22863a;background-color:#f0fff4}.markdown-body .pl-mc{color:#e36209;background-color:#ffebda}.markdown-body .pl-mi2{color:#f6f8fa;background-color:#005cc5}.markdown-body .pl-mdr{font-weight:700;color:#6f42c1}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{text-decoration:underline;color:#032f62}.markdown-body .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.markdown-body a{background-color:transparent;-webkit-text-decoration-skip:objects}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit}.markdown-body strong{font-weight:bolder}.markdown-body h1{font-size:2em;margin:.67em 0}.markdown-body img{border-style:none}.markdown-body svg:not(:root){overflow:hidden}.markdown-body hr{box-sizing:content-box;height:0;overflow:visible}.markdown-body input{font:inherit;margin:0}.markdown-body input{overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{height:0;margin:15px 0;overflow:hidden;background:0 0;border:0;border-bottom:1px solid #dfe2e5}.markdown-body hr::before{display:table;content:""}.markdown-body hr::after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse}.markdown-body td,.markdown-body th{padding:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:0;margin-bottom:0}.markdown-body h1{font-size:32px;font-weight:600}.markdown-body h2{font-size:24px;font-weight:600}.markdown-body h3{font-size:20px;font-weight:600}.markdown-body h4{font-size:16px;font-weight:600}.markdown-body h5{font-size:14px;font-weight:600}.markdown-body h6{font-size:12px;font-weight:600}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{padding-left:0;margin-top:0;margin-bottom:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code{font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}.markdown-body .octicon{vertical-align:text-bottom}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:0}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1{padding-bottom:.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#6a737d}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body code{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}.markdown-body .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1}.markdown-body :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}.dark-mode{--canvas-bg-color:#1B1916;--sidebar-bg-color:#1A1918;--main-bg-color:#1B1916;--header-bg-color:#1A1918;--hover-bg-color:rgba(255, 255, 255, 0.05);--header-color:#FAF9F6;--color:#D6D1C5;--link-color:#A7B2FF;--link-hover-color:#C8CEFF;--border-color:#33302B;--border-soft:#2A2825;--btn-color:#FAF9F6;--input-color:#E6E1D8;--input-bg:#25231F;--primary-bg:#FAF9F6;--primary-hover-bg:#FFFFFF;--primary-color:#1A1815;--primary-active-color:#1A1815;--accent:#A7B2FF;--accent-soft:rgba(167, 178, 255, 0.12);--ink-muted:#A39D92;--ink-faint:#8A857C;--ink-soft:#B5AFA2;--status-ready:#5FB27A;--status-progress:#E0A94A;--status-error:#F08A82;--status-inactive:#8A857C;--status-error-soft:rgba(240, 138, 130, 0.08);--status-error-soft-hover:rgba(240, 138, 130, 0.14);--admin-nav-bg:#1A1918;--admin-nav-active:rgba(167, 178, 255, 0.12);--admin-stat-bg:#25231F;--paper-card:#25231F;--paper-bg-alt:#201E1B;--highlight:#3A341E;background-color:var(--canvas-bg-color);color:var(--color)}body{--canvas-bg-color:#FAF9F6;--sidebar-bg-color:#FFFFFF;--header-bg-color:#FAF9F6;--header-color:#1A1815;--main-bg-color:#FAF9F6;--hover-bg-color:rgba(26, 24, 21, 0.05);--input-color:#1A1815;--color:#1A1815;--link-color:#3B4AD6;--link-hover-color:#2E3BB8;--border-color:#E6E1D8;--border-soft:#EDE9E1;--btn-color:#1A1815;--input-bg:#FFFFFF;--primary-bg:#1A1815;--primary-hover-bg:#000000;--primary-color:#FAF9F6;--primary-active-color:#FAF9F6;--accent:#3B4AD6;--accent-soft:#EEF0FF;--ink-muted:#6F6A61;--ink-faint:#8A857C;--ink-soft:#4A4641;--paper-bg-alt:#F3F1EC;--paper-card:#FFFFFF;--highlight:#FFF3C4;--status-ready:#2F7A44;--status-progress:#946512;--status-error:#B42318;--status-inactive:#8A857C;--status-error-soft:rgba(180, 35, 24, 0.04);--status-error-soft-hover:rgba(180, 35, 24, 0.08);--radius-control:6px;--radius-button:8px;--button-height:36px;--button-font-size:14px;--button-line-height:20px;--button-padding-x:13px;--button-compact-height:32px;--radius-surface:10px;--font-serif:'Instrument Serif','Iowan Old Style',Georgia,serif;--font-sans:'Inter',ui-sans-serif,system-ui,-apple-system,sans-serif;--font-mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;background-color:var(--canvas-bg-color);color:var(--color);font-family:var(--font-sans);font-size:14px;letter-spacing:-.005em;line-height:1.5}.fadeIn{opacity:1;animation-name:fadeInOpacity;animation-iteration-count:1;animation-timing-function:ease-in;animation-duration:.6s}@keyframes fadeInOpacity{0%{opacity:0}100%{opacity:1}}.btn:active,.btn:focus{box-shadow:none}:focus:not(:focus-visible){outline:0}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.btn:focus-visible,.dropdown-item:focus-visible,.form-control:focus-visible{outline:2px solid var(--accent);outline-offset:2px;box-shadow:none}input:active,input:hover{box-shadow:none!important}input:-webkit-autofill,input:-webkit-autofill:focus,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:focus,textarea:-webkit-autofill:hover{border-color:var(--border-color);-webkit-text-fill-color:var(--color);-webkit-box-shadow:none;transition:background-color 1000s ease-in-out 0s}.custom-select,.form-control,input:-internal-autofill-selected{color:var(--input-color);background-color:var(--input-bg)!important;border-color:var(--border-color)}.form-control:focus{border-color:var(--border-color)}body,html{position:relative;height:100%;overflow-x:hidden}body{overflow-y:hidden}#app{flex:1 1 auto;min-height:0}.app-header{flex:0 0 auto}.app-view{display:block;flex:1 1 auto;min-height:0;overflow-x:hidden!important;overflow-y:auto!important;max-width:100%}.markdown-body a,a{color:var(--link-color)}.markdown-body a:hover,a:hover{text-decoration:none;color:var(--link-hover-color)}.dropdown-menu a.dropdown-item{color:var(--color)}.dropdown-menu a.dropdown-item:hover{color:var(--color);text-decoration:none}.markdown-body .emoji{height:1.3em;margin:0;vertical-align:-.1em}.navbar.navbar-expand-lg{background:var(--header-bg-color)!important;border-bottom:1px solid var(--border-color);transition:background-color .5s ease;padding:10px max(20px,calc((100vw - 1200px)/ 2));font-family:var(--font-sans)}.navbar-toggler{border:1px solid var(--border-color)!important;color:var(--color)!important}.navbar-toggler .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='%231A1815' stroke-width='2' stroke-linecap='round' d='M4 8h22M4 15h22M4 22h22'/%3E%3C/svg%3E")!important}.navbar .navbar-nav{align-items:center}.navbar .nav-link{display:inline-flex;align-items:center;font-size:13px;color:var(--ink-muted)!important;padding:6px 0!important;margin:0 12px;border-bottom:1px solid transparent;letter-spacing:-.005em;line-height:1}.navbar .nav-link:hover{color:var(--color)!important}.navbar .nav-link.active{color:var(--color)!important;border-bottom-color:var(--color)}.navbar .nav-link.nav-icon{padding:0!important;margin:0 8px;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px}.navbar .nav-link .fa,.navbar .nav-link .fab{font-size:15px;line-height:1}.navbar #navbarSupportedContent{align-items:center}.navbar-brand{font-family:var(--font-serif)!important;font-size:20px!important;letter-spacing:-.01em;color:var(--color)!important;padding-right:18px;margin-right:12px;border-right:1px solid var(--border-color)}.navbar-brand em,.navbar-brand i{font-style:italic;font-weight:400}.navbar-dark .navbar-toggler{border-color:var(--border-color);color:var(--color)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='%231A1815' stroke-width='2' stroke-linecap='round' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar .btn-signin{display:inline-flex;align-items:center;height:32px;padding:0 14px!important;margin-left:6px;border:1px solid var(--color);background:var(--color);color:var(--canvas-bg-color)!important;border-radius:6px;font-size:13px;font-weight:500;line-height:1}.navbar .btn-signin:hover{background:var(--primary-hover-bg);color:var(--canvas-bg-color)!important}.navbar .nav-support{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;order:3;gap:6px;min-height:36px;margin-left:12px;padding:0 12px;border:1px solid var(--border-color);border-radius:8px;color:var(--color);font-size:13px;font-weight:500;text-decoration:none}.navbar .nav-support:hover{background:var(--hover-bg-color);border-color:var(--color);color:var(--color)}@media (max-width:991px){.navbar .nav-support{order:0;width:44px;min-height:44px;margin:0 8px 0 auto;padding:0}.navbar .nav-support-label{display:none}[class*=floatingchat-container-wrap],iframe.floatingchat-container{display:none!important}}.navbar .user-chip{display:inline-flex!important;align-items:center;gap:8px;padding:4px 12px 4px 6px!important;margin-left:6px;border:1px solid var(--border-color);border-radius:999px;background:var(--sidebar-bg-color);font-size:12.5px;color:var(--color)!important}.navbar .user-chip:hover{background:var(--hover-bg-color)}.navbar .user-chip img{width:22px;height:22px}.navbar .user-chip .user-chip-name{color:var(--color);font-weight:500}.navbar .user-chip::after{color:var(--ink-muted)}#navbarSupportedContent{padding-right:0}.generalMessage{display:block;text-align:center;color:var(--header-color)}.rgba-gradient{background:var(--canvas-bg-color);color:var(--color)}.paper-landing{overflow-x:clip}.paper-wrap{max-width:1140px;margin-left:auto;margin-right:auto;padding-left:32px;padding-right:32px}.paper-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);font-weight:500}.paper-hero{max-width:1140px;margin:0 auto;padding:64px 32px 0;display:grid;grid-template-columns:.95fr 1.05fr;gap:48px;align-items:center}.paper-hero h1.hero-title{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.6rem,5.4vw,4.4rem);line-height:1.02;letter-spacing:-.025em;margin:14px 0 0;color:var(--color);text-wrap:balance}.paper-hero h1 .accent{color:var(--accent);font-style:italic}.hero-subtitle{margin-top:18px;font-size:17px;line-height:1.55;color:var(--ink-soft);max-width:30em;text-wrap:pretty}.paper-cta-row{display:flex;flex-wrap:wrap;gap:18px;align-items:center;margin-top:26px}.btn-hero{display:inline-flex;align-items:center;font-family:var(--font-sans);border:1px solid var(--color);background:var(--color);color:var(--canvas-bg-color);padding:12px 20px;font-size:14px;font-weight:500;border-radius:var(--radius-control);letter-spacing:-.005em;transition:background .15s,border-color .15s,transform .1s}.btn-hero:hover{background:var(--primary-hover-bg);border-color:var(--primary-hover-bg);color:var(--canvas-bg-color);text-decoration:none;transform:translateY(-1px)}.btn-hero-ghost{background:0 0;border:1px solid var(--border-color);color:var(--color);padding:12px 20px;font-size:14px;font-weight:500;border-radius:var(--radius-control)}.btn-hero-ghost:hover{background:var(--hover-bg-color);border-color:var(--color);color:var(--color)}.paper-link-arrow{font-size:14px;color:var(--ink-soft);text-decoration:underline;text-underline-offset:4px;text-decoration-color:var(--border-color)}.paper-link-arrow:hover{color:var(--color);text-decoration-color:var(--color)}.paper-reassure{list-style:none;margin:16px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12.5px;color:var(--ink-muted)}.paper-reassure li::before{content:"\2713";color:var(--status-ready);margin-right:6px;font-size:11px}.paper-frame{border-radius:var(--radius-surface);background:var(--paper-card);border:1px solid var(--border-color);box-shadow:0 24px 60px rgba(26,24,21,.1),0 2px 6px rgba(26,24,21,.04);overflow:hidden}.dark-mode .paper-frame{box-shadow:0 24px 60px rgba(0,0,0,.45)}.paper-frame-bar{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;border-bottom:1px solid var(--border-soft);background:var(--paper-bg-alt);font-family:var(--font-mono);font-size:11px;color:var(--ink-muted)}.paper-frame-bar .dots{display:flex;gap:5px}.paper-frame-bar .dots i{width:8px;height:8px;border-radius:50%;background:var(--border-color)}.paper-frame-bar .url{flex:1;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-frame img{display:block;width:100%;height:auto}.paper-hero-shot .paper-frame{width:112%}.paper-proof{margin-top:64px;padding-top:18px;padding-bottom:18px;border-top:1px solid var(--border-color);display:flex;flex-wrap:wrap;gap:12px 30px;align-items:center}.paper-proof-venues{display:flex;gap:22px;align-items:center;font-family:var(--font-serif);font-size:22px;letter-spacing:-.01em;color:var(--ink-soft)}.paper-proof-venues i{font-style:normal;font-family:var(--font-sans);font-size:14px;color:var(--ink-faint)}.paper-stats{margin-top:12px;padding-top:22px;border-top:1px solid var(--border-color)}.paper-stats-meta{display:flex;justify-content:space-between;align-items:center;font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-muted);margin-bottom:14px}.paper-stats-meta-right{display:inline-flex;align-items:center;gap:6px}.paper-stats-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--status-ready)}.paper-stats-grid{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}.paper-stat-card{display:flex;flex-direction:column;padding:22px 26px 20px 0;margin-right:26px;border-right:1px solid var(--border-color);min-width:0}.paper-stat-card:last-child{border-right:0;margin-right:0;padding-right:0}.paper-stat-value{font-size:44px;font-weight:500;letter-spacing:-.04em;line-height:1;color:var(--color);font-variant-numeric:tabular-nums}.paper-stat-label{margin-top:6px;font-size:13px;color:var(--ink-soft)}.paper-stat-bars{display:block;width:100%;height:34px;margin-top:18px;overflow:visible}.paper-stat-bars rect{fill:var(--border-color)}.paper-stat-bars rect.is-latest{fill:var(--accent)}.paper-stat-delta{margin-top:10px;font-family:var(--font-mono);font-size:10.5px;color:var(--status-ready)}.paper-section-head{margin-top:110px;display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:end}.paper-qa h2,.paper-section-head h2{font-family:var(--font-serif);font-weight:400;font-size:clamp(2rem,4.2vw,3.25rem);line-height:1.05;letter-spacing:-.02em;margin:10px 0 0;color:var(--color);text-wrap:balance}.paper-feature-title em,.paper-qa h2 em,.paper-section-head h2 em{font-style:italic;color:var(--accent)}.paper-section-head p{font-size:15px;color:var(--ink-soft);max-width:32em;margin:0;line-height:1.6}.paper-preview{margin-top:28px;display:grid;grid-template-columns:1fr 1fr;gap:14px}.paper-preview .pane{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);overflow:hidden;min-width:0}.paper-preview .pane-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid var(--border-soft)}.paper-preview .pane-label{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);white-space:nowrap}.paper-preview .pane-url{font-family:var(--font-mono);font-size:11px;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.paper-preview .pane-body{padding:16px 18px;font-family:var(--font-mono);font-size:12.5px;line-height:1.9;color:var(--ink-soft)}.paper-preview .pane-body strong{color:var(--color);font-weight:600}.paper-preview .tok{color:var(--ink-faint)}.paper-preview .redact{background:var(--accent-soft);color:var(--accent);border-radius:4px;padding:0 5px}.paper-features{margin-top:28px;padding-top:28px;border-top:1px solid var(--border-color);display:grid;grid-template-columns:5fr 7fr;gap:48px;align-items:start}.paper-features-list{display:flex;flex-direction:column}.paper-feature{border-left:2px solid var(--border-soft);padding:16px 0 16px 20px;transition:border-color .2s}.paper-feature.is-on{border-left-color:var(--color)}.paper-feature-tab{all:unset;display:block;width:100%;cursor:pointer;color:inherit;border-radius:4px}.paper-feature-tab:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.paper-feature-tab .paper-eyebrow{display:block;margin-bottom:6px}.paper-feature-title{display:block;font-family:var(--font-serif);font-size:24px;line-height:1.15;letter-spacing:-.015em;color:var(--ink-muted);transition:color .2s}.paper-feature-title em{color:inherit}.paper-feature-tab:hover .paper-feature-title,.paper-feature.is-on .paper-feature-title{color:var(--color)}.paper-feature.is-on .paper-feature-title em{color:var(--accent)}.paper-feature-more{display:none}.paper-feature.is-on .paper-feature-more{display:block}.paper-feature-more .paper-feature-title-m{display:none}.paper-feature-more p{font-size:14.5px;color:var(--ink-soft);line-height:1.55;margin:10px 0 12px;max-width:30em}.paper-features-stage{min-width:0}.paper-feature-panel{animation:paper-feature-in .25s ease-out}@keyframes paper-feature-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){.paper-feature-panel{animation:none}}.paper-crop{position:relative;height:380px;overflow:hidden;background:var(--paper-card)}.paper-crop img{position:absolute;left:0;top:0;max-width:none;height:auto;display:block}.paper-crop-anonymize img{width:150%;transform:translate(-1.5%,-8%)}.paper-crop-review img{width:160%;transform:translate(-1%,-8%)}.paper-crop-manage img{width:150%;transform:translate(-6%,-9%)}.paper-qa{margin-top:110px;display:grid;grid-template-columns:1fr 1.4fr;gap:40px;align-items:start}.paper-qa h2{margin-bottom:12px}.paper-qa .q{border-top:1px solid var(--border-color);padding:18px 0}.paper-qa .q:last-child{border-bottom:1px solid var(--border-color)}.paper-qa .q a{display:block;font-weight:500;font-size:15px;color:var(--color);margin-bottom:6px}.paper-qa .q a:hover{color:var(--accent);text-decoration:none}.paper-qa .q p{margin:0;font-size:14px;color:var(--ink-soft);line-height:1.6}@media (max-width:1100px){.paper-hero-shot .paper-frame{width:100%}}@media (max-width:991px){.paper-hero{grid-template-columns:1fr;gap:36px;padding-top:40px}.paper-qa,.paper-section-head{grid-template-columns:1fr;gap:16px}.paper-stats-grid{grid-template-columns:1fr 1fr}.paper-stat-card:nth-child(2n){border-right:0;margin-right:0;padding-right:0}.paper-stat-card:nth-child(-n+2){border-bottom:1px solid var(--border-color)}}@media (max-width:767px){.paper-hero,.paper-wrap{padding-left:20px;padding-right:20px}.paper-hero h1.hero-title{font-size:clamp(2.4rem,11vw,3.25rem)}.hero-subtitle{font-size:16px}.paper-cta-row .btn-hero{width:100%;justify-content:center}.paper-proof{margin-top:48px}.paper-stat-card{padding:18px 16px 16px 0;margin-right:16px}.paper-stat-value{font-size:36px}.paper-qa,.paper-section-head{margin-top:72px}.paper-preview{grid-template-columns:1fr}.paper-preview .pane-body{font-size:11.5px;line-height:1.8}.paper-features{display:flex;flex-wrap:wrap;gap:0;padding-top:0;border-top:0;margin-top:24px}.paper-feature,.paper-features-list,.paper-features-stage{display:contents}.paper-feature-tab{order:1;flex:1 1 0;width:auto;padding:12px 0 10px;border-bottom:2px solid var(--border-color);border-radius:0;text-align:left}.paper-feature.is-on .paper-feature-tab{border-bottom-color:var(--color)}.paper-feature-tab .paper-eyebrow{margin:0;font-size:10.5px;letter-spacing:.08em}.paper-feature-tab .paper-feature-title{display:none}.paper-feature-panel{order:2;width:100%;margin-top:20px;animation:none}.paper-crop{height:240px}.paper-crop-anonymize img{width:230%;transform:translate(-1.5%,-8%)}.paper-crop-review img{width:240%;transform:translate(-1%,-8%)}.paper-crop-manage img{width:220%;transform:translate(-3%,-9%)}.paper-feature-more{order:3;width:100%}.paper-feature.is-on .paper-feature-more{margin-top:18px}.paper-feature-more .paper-feature-title-m{display:block;font-size:26px;line-height:1.1}.paper-feature-more p{max-width:none}.paper-footer-inner>.paper-footer-brand{grid-column:1/-1}.paper-footer-foot{flex-direction:column;gap:6px}}.dropdown-menu{background-color:var(--paper-card,var(--main-bg-color))!important;color:var(--color)!important;border:1px solid var(--border-color)!important;border-radius:8px!important;box-shadow:0 12px 28px rgba(26,24,21,.08),0 2px 6px rgba(26,24,21,.05)!important;padding:6px!important;font-family:var(--font-sans);font-size:13px;min-width:11rem}.dropdown-menu .dropdown-item{color:var(--color)!important;padding:7px 10px!important;border-radius:5px;font-size:13px}.dropdown-menu .dropdown-item:focus,.dropdown-menu .dropdown-item:hover{background:var(--hover-bg-color)!important;color:var(--color)!important}.dropdown-menu .dropdown-divider{border-top-color:var(--border-color)!important;margin:4px 2px}.dropdown-menu .dropdown-header{color:var(--ink-muted);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase}.body,.file-content,.markdown-body{background-color:var(--main-bg-color)!important;color:var(--color)!important}.markdown-body table tr{background-color:var(--main-bg-color);border-top:1px solid var(--border-color)}.markdown-body table tr:nth-child(2n){background-color:var(--paper-bg-alt)}.markdown-body table td,.markdown-body table th{border:1px solid var(--border-color)}.file-content{padding:4px 7px;text-align:left;min-height:100%}.badge{font-size:75%;font-weight:500;padding:3px 8px;border-radius:10px;vertical-align:middle}.warning-feedback{width:100%;margin-top:.25rem;font-size:80%;color:#dc8e35}.dropdown-item:focus,.dropdown-item:hover{background-color:var(--hover-bg-color)}.card-header .btn,.card-header .btn:focus,.card-header .btn:hover{border:none!important;background:0 0!important}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:var(--button-height);padding:7px var(--button-padding-x);font:500 var(--button-font-size)/var(--button-line-height) var(--font-sans);vertical-align:middle;max-width:100%;transition:background-color 120ms ease,border-color 120ms ease,color 120ms ease;color:var(--btn-color);border:1px solid var(--border-color);background:var(--paper-card);border-radius:var(--radius-button);white-space:nowrap}.btn:active,.btn:hover{color:var(--btn-color);border:1px solid var(--border-color);background-color:var(--hover-bg-color);box-shadow:none!important}.btn.btn-primary{color:var(--primary-color);background-color:var(--primary-bg)}.btn.btn-primary:active,.btn.btn-primary:hover{color:var(--primary-active-color);background-color:var(--primary-hover-bg)!important}.btn::placeholder{color:var(--color);opacity:1}.white_border{border:1px solid #fff;color:#fff}.leftCol{display:flex;position:relative;flex:0 0 auto;width:100%;z-index:9;flex-direction:column}.card,.leftCol,.sidePanel{background-color:var(--sidebar-bg-color);border:1px solid var(--border-color)}@media (min-width:768px){.leftCol{flex:0 0 310px;width:310px;height:100%}}.leftCol-search{padding:10px 12px 0}.tree-search-box{display:flex;align-items:center;gap:8px;background:var(--canvas-bg-color);border:1px solid var(--border-color);border-radius:8px;padding:7px 10px;transition:border-color .15s}.tree-search-box:focus-within{border-color:var(--ink-muted)}.tree-search-icon{font-size:12px;color:var(--ink-muted);flex-shrink:0}.tree-search-input{flex:1;border:none;outline:0;background:0 0;font-family:var(--font-sans);font-size:13px;color:var(--color);min-width:0}.tree-search-input::placeholder{color:var(--ink-muted)}.tree-search-kbd{font-family:var(--font-sans);font-size:11px;color:var(--ink-muted);background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:4px;padding:1px 6px;line-height:1.4;flex-shrink:0}.tree-search-clear{background:0 0;border:none;color:var(--ink-muted);font-size:16px;cursor:pointer;padding:0 2px;line-height:1}.tree-search-clear:hover{color:var(--color)}.leftCol-project-header{display:flex;align-items:baseline;justify-content:space-between;padding:12px 14px 4px;gap:8px}.project-name{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.project-file-count{font-family:var(--font-sans);font-size:12px;color:var(--ink-muted);white-space:nowrap;flex-shrink:0}.files{position:relative;display:block;overflow:auto;height:100%;padding:4px 6px}.files ul{list-style:none;margin:0;padding:0}.files li ul{padding-left:8px;margin-left:7px;border-left:1px solid var(--border-color)}.files .folder>ul{display:none}.files .folder.open>ul{display:block}.files .file,.files .folder{position:relative;color:var(--ink-soft);cursor:pointer;word-break:break-all}.files a{display:flex;align-items:center;gap:4px;padding:1px 8px 1px 2px;font-family:var(--font-sans);font-size:13px;color:var(--ink-soft);border-radius:4px;text-decoration:none;line-height:1.5;position:relative}.files a:hover{background:var(--hover-bg-color);color:var(--color);text-decoration:none}.files:focus{outline:0}.files a.tree-focused{background:var(--hover-bg-color);color:var(--color)}.files .file.active>a{background:rgba(128,128,128,.15);color:var(--color)}.files .file.active>a .tree-icon-file{color:#5b7ba5}.files .file.active>a .tree-count{color:var(--ink-muted)}.tree-icon-file,.tree-icon-folder{display:inline-block;flex-shrink:0}.tree-icon-folder{width:14px;height:12px;color:var(--ink-muted);opacity:.75}.tree-icon-folder svg{display:block;width:100%;height:100%;fill:currentColor;fill-opacity:0;stroke:currentColor;stroke-width:1.2;stroke-linejoin:round}.files .folder.open>a .tree-icon-folder{color:#a07d2e;opacity:.9}.files .folder.open>a .tree-icon-folder svg{fill-opacity:.12}.dark-mode .files .folder.open>a .tree-icon-folder{color:#c9a03a}.tree-icon-file{width:16px;font-size:14px;text-align:center;color:#5b7ba5}.dark-mode .files .file.active>a .tree-icon-file,.dark-mode .tree-icon-file{color:#7ba3d0}.tree-toggle{display:inline-flex;align-items:center;justify-content:center;width:10px;height:14px;flex-shrink:0;opacity:.6}.tree-toggle::after{content:"";display:block;width:0;height:0;border-style:solid;border-width:3px 0 3px 4.5px;border-color:transparent transparent transparent var(--ink-muted);transition:transform .12s ease}.files .folder.open>a .tree-toggle::after{transform:rotate(90deg)}.tree-spacer{display:inline-block;width:10px;flex-shrink:0}.tree-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-count{font-family:var(--font-sans);font-size:11px;color:var(--ink-muted);flex-shrink:0;margin-left:auto;padding-left:8px;opacity:.7}.files .folder>a{color:var(--color)}.files .file::before,.files .folder::before{display:none}.files .folder>a::after{display:none}.tree-search-path{color:var(--ink-muted);font-size:11px}.tree-search-empty{padding:16px 12px;color:var(--ink-muted);font-size:12.5px;font-family:var(--font-sans);text-align:center}.leftCol{background:var(--paper-bg-alt,#f3f1ec);border-right:1px solid var(--border-color)}.dark-mode .leftCol{background:var(--sidebar-bg-color)}.status-bar{background:var(--canvas-bg-color);border-bottom:1px solid var(--border-color);padding:10px 14px}.paths .breadcrumb-item,.paths .breadcrumb-item a{font-family:var(--font-mono);font-size:12px;color:var(--ink-muted);letter-spacing:.02em}.paths .breadcrumb-item.active,.paths .breadcrumb-item:last-child{color:var(--color)}.paths .breadcrumb-item+.breadcrumb-item::before{content:'/';color:var(--ink-muted)}.last-update{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);padding:8px 10px;border-top:1px solid var(--border-color);letter-spacing:.02em}.ace_editor{height:100%}.ace_scroller{cursor:default}.status-bar{display:flex;align-items:center;gap:12px;background-color:var(--canvas-bg-color);padding:10px 14px;margin:0;border-bottom:1px solid var(--border-color);border-radius:0;flex-shrink:0}.status-bar-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.status-bar-actions .btn{display:inline-flex;align-items:center;gap:6px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);border-radius:6px;padding:4px 10px;font-size:12.5px;min-height:30px}.status-bar-actions .btn:hover{background:var(--hover-bg-color);color:var(--color)}.status-bar-actions .btn.btn-active{border-color:currentColor;font-weight:600}.paths{flex:1 1 auto;min-width:0;padding:0;margin:0;background-color:initial;border:none;border-radius:0;align-items:center;overflow-x:auto;white-space:nowrap;flex-wrap:nowrap}.paths::-webkit-scrollbar{display:none}.paths a{color:var(--color)}.paths .breadcrumb-item{padding-left:3px}.paths .breadcrumb-item::before{padding-right:3px}.content{height:100%;overflow:scroll;padding-top:42px;background-color:var(--main-bg-color);text-align:center}.image-content{max-width:100%;max-height:100%;text-align:center;padding:4px}.pdf-viewer{display:flex;flex-direction:column;height:100%;min-height:0;background-color:var(--main-bg-color)}.pdf-toolbar{display:flex;align-items:center;gap:4px;flex:0 0 auto;padding:4px 8px;border-bottom:1px solid var(--border-color,rgba(0,0,0,.12))}.pdf-toolbar-group{display:inline-flex;align-items:center;gap:4px}.pdf-toolbar-right{margin-left:auto}.pdf-toolbar-btn{border:0;background:0 0;color:inherit;padding:4px 8px;border-radius:4px;font-size:13px;line-height:1.2;cursor:pointer}.pdf-toolbar-btn:hover:not(:disabled){background-color:rgba(128,128,128,.18)}.pdf-toolbar-btn:disabled{opacity:.4;cursor:default}.pdf-toolbar-zoom{min-width:52px;font-variant-numeric:tabular-nums}.pdf-toolbar-page{width:3.5em;text-align:right;padding:2px 4px;font-size:13px;color:inherit;background:0 0;border:1px solid var(--border-color,rgba(0,0,0,.2));border-radius:4px}.pdf-toolbar-count{font-size:13px;opacity:.75;font-variant-numeric:tabular-nums}.pdf-pages{flex:1 1 auto;min-height:0;overflow:auto;padding:8px 0}.pdf-viewer-page{margin:0 auto 12px}.pdf-viewer-page canvas{display:block;box-shadow:0 1px 4px rgba(0,0,0,.25)}.pdf-viewer-error{padding:24px;text-align:center;font-weight:700}.html-doc{display:block;height:100%}.html-doc-frame{display:block;width:100%;height:100%;border:0;background-color:#fff}.file-error{font-weight:700;font-size:50px;text-align:center}pdfviewer{display:block;padding:15px}pdfpageviewer{display:block;width:100%;margin-bottom:10px}notebook{display:block;text-align:left;padding:15px}@media (min-width:768px){notebook{padding-left:100px}}.nb-output td,.nb-output th{border:1px solid var(--border-color)!important}.paper-faq{max-width:1180px;margin:0 auto;padding:48px 32px 80px;font-family:var(--font-sans)}.paper-faq-hero{padding-bottom:40px;border-bottom:1px solid var(--border-color);margin-bottom:36px}.paper-faq-eyebrow{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);letter-spacing:.14em;text-transform:uppercase;margin-bottom:32px}.paper-faq-title{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.6rem,5.5vw,4.6rem);line-height:1.03;letter-spacing:-.02em;color:var(--color);margin:0 0 22px;max-width:14em}.paper-faq-title em{font-style:italic;color:var(--color)}.paper-faq-lede{color:var(--ink-soft);font-size:17px;line-height:1.55;max-width:38em;margin:0}.paper-faq-lede a{color:var(--color);border-bottom:1px solid var(--color)}.paper-faq-lede a:hover{color:var(--accent);border-bottom-color:var(--accent)}.paper-faq-body{display:grid;grid-template-columns:220px 1fr;gap:60px;align-items:start}.paper-faq-toc{position:sticky;top:32px;font-size:13.5px}.paper-faq-toc-head{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);letter-spacing:.14em;text-transform:uppercase;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid var(--border-color)}.paper-faq-toc nav{display:flex;flex-direction:column}.paper-faq-toc nav a{color:var(--ink-soft);padding:8px 0 8px 14px;border-left:2px solid transparent;text-decoration:none;margin-left:-2px}.paper-faq-toc nav a.active,.paper-faq-toc nav a:hover{color:var(--color);border-left-color:var(--color)}.faq-section{min-width:0}.faq-section>div{width:100%}.faq-section h4.faq-cat{font-family:var(--font-serif);font-weight:400;font-size:clamp(1.7rem,2.6vw,2.2rem);letter-spacing:-.015em;color:var(--color);margin:0 0 6px;padding-bottom:14px;border-bottom:1px solid var(--border-color)}.faq-section h4.faq-cat i{display:none}.faq-section .panel-group{margin-bottom:56px}.faq-section .panel-default .panel-title a{display:block;position:relative;padding:22px 0 22px 42px;font-family:var(--font-serif);font-weight:400;font-size:20px;line-height:1.35;letter-spacing:-.005em;color:var(--color);text-decoration:none;cursor:pointer}.faq-section .panel-default .panel-title a:hover{color:var(--accent)}.faq-section .panel-heading{background:0 0;padding:0!important;border:none}.faq-section .panel-default{background:0 0;border:none;border-bottom:1px solid var(--border-soft);border-radius:0;margin-bottom:0!important;box-shadow:none}.faq-section .panel-default .panel-title{margin-bottom:0}.faq-section .panel-default .panel-title a:after{content:"−";position:absolute;left:0;right:auto;top:22px;transform:none;font-family:var(--font-mono);font-size:18px;line-height:1.35;color:var(--ink-muted);float:none;margin:0;font-weight:400}.faq-section .panel-default .panel-title a.collapsed:after{content:"+"}.faq-section .panel-default .panel-body{padding:0 0 22px 42px!important;color:var(--ink-soft);font-size:15px;line-height:1.65;border-top:none;max-width:42em}.table{color:var(--color)}.dropdown-divider,.table td,.table th,hr{border-color:var(--border-color)}.table.repositories td{word-break:break-word}loc{display:block;position:relative;width:100%;height:5px}loc .lang{float:left;height:100%}.rounded-circle.fa{display:inline-block;font-size:75px;height:140px;width:140px;border:4px solid;line-height:140px;text-align:center}.featurette-divider{margin:4.5rem 0;border-color:var(--border-color)}.featurette-heading{font-family:var(--font-serif);font-weight:400;font-size:2rem;line-height:1.15;letter-spacing:-.02em;margin-bottom:14px;color:var(--color)}.dark-mode .shadow{box-shadow:none}.dark-mode .overflow-auto::-webkit-scrollbar{width:10px}.dark-mode .overflow-auto::-webkit-scrollbar-track{-webkit-box-shadow:none;background:inherit;border-radius:0}.dark-mode .overflow-auto::-webkit-scrollbar-thumb{border-radius:10px;border:1px solid var(--border-color);background-color:var(--hover-bg-color)}.dark-mode .rgba-gradient{background:linear-gradient(135deg,#2a2d4a,#151728)}.section-number{padding-right:10px;font-weight:700;font-style:italic}.org-subscript-child{font-size:85%}.highlighted-line{position:absolute;background:rgba(100,200,100,.5);z-index:20}code,pre{font-family:"Fira Code","Courier New",Courier,monospace;line-height:1.1;color:var(--color)}.diff-file,.diff-index,.diff-lines{background:rgba(172,172,172,.5)}.diff-add{background:rgba(100,200,100,.5)}.diff-remove{background:rgba(200,100,100,.5)}.dashboard-title{font-size:1.4rem;font-weight:600;letter-spacing:-.01em}.quota-row{display:flex;gap:16px;margin-bottom:16px;padding:0}.quota-item{flex:1;min-width:0}.quota-header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px}.quota-label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;opacity:.7}.quota-value{font-size:.8rem;font-weight:500;font-variant-numeric:tabular-nums}.quota-progress{height:6px;border-radius:3px;background:var(--hover-bg-color)}.quota-progress .progress-bar{border-radius:3px}.filter-chip{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;font-size:.8rem;font-weight:500;background:var(--primary-bg);color:var(--primary-color);border-radius:12px;line-height:1.4}.filter-chip-close{display:inline-flex;align-items:center;justify-content:center;background:0 0;border:none;color:inherit;opacity:.7;cursor:pointer;padding:0;min-width:24px;min-height:24px;margin:-6px -6px -6px 0;font-size:1rem;line-height:1;border-radius:999px}.filter-chip-close:hover{opacity:1}.repo-list{list-style:none;padding:0;margin:0}.repo-list-item{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 0;border-bottom:1px solid var(--border-color);gap:12px}.repo-list-item:first-child{border-top:1px solid var(--border-color)}.repo-list-item.repo-inactive{opacity:.6}.repo-list-item-content{flex:1;min-width:0}.repo-list-item-header{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.repo-name{font-family:var(--font-mono);font-size:14px;font-weight:500;color:var(--color);word-break:break-word}.repo-name:hover{color:var(--accent)}.repo-source{font-size:.85rem;opacity:.8;display:flex;flex-wrap:wrap;align-items:center;gap:6px}.repo-date{opacity:.7}.repo-meta{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px;font-size:.8rem;opacity:.7}.repo-meta span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}.repo-list-item-actions{flex-shrink:0;padding-top:2px;margin-left:14px}.repo-list-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:48px 20px;opacity:.5;font-size:.95rem;list-style:none;border-bottom:1px solid var(--border-color);border-top:1px solid var(--border-color)}.repo-list-empty i{font-size:1.8rem}.type-badge{display:inline-flex;align-items:center;gap:3px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;padding:2px 8px;border-radius:4px;white-space:nowrap}.type-badge{font-family:var(--font-mono);letter-spacing:.06em;padding:2px 8px;border-radius:999px;border:1px solid var(--border-color);background:var(--paper-bg-alt,transparent)}.type-badge.type-pr,.type-badge.type-repo{background:var(--paper-bg-alt);color:var(--ink-muted);border-color:var(--border-color)}.dark-mode .type-badge.type-pr,.dark-mode .type-badge.type-repo{background:rgba(255,255,255,.06);color:var(--ink-muted);border-color:var(--border-color)}.type-badge.type-coauthor{background:rgba(99,102,241,.12);color:#4f46e5;border-color:rgba(99,102,241,.35);margin-left:6px}.dark-mode .type-badge.type-coauthor{background:rgba(129,140,248,.18);color:#a5b4fc;border-color:rgba(165,180,252,.45)}.btn-group .btn:not(.btn-primary){background:var(--hover-bg-color)}.anonymize-page{display:flex;flex-direction:column;min-height:0}.anonymize-landing{flex:1 1 0;min-height:min-content;display:flex;align-items:center;justify-content:center;padding:20px}.anonymize-landing-inner{width:100%;max-width:600px}.anonymize-landing-inner h2{font-weight:700}.anonymize-workspace{display:flex;flex-direction:column;flex:1 1 0;min-height:0;background:var(--canvas-bg-color)}.anonymize-topbar{background:var(--paper-card);border-bottom:1px solid var(--border-color);padding:18px 28px;flex:0 0 auto}.anonymize-topbar-inner{max-width:1400px;margin:0 auto}.anonymize-topbar-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.anonymize-topbar-title{margin:4px 0 0;font-size:clamp(1.8rem,3vw,2.4rem)}.anonymize-split{flex:1 1 auto;display:flex;min-height:0}.anonymize-form-col{flex:0 0 auto;width:100%;min-width:0;background:var(--canvas-bg-color);border-right:1px solid var(--border-color);overflow-y:auto}.anonymize-form-col .paper-settings-main{max-width:720px;padding:28px 32px 40px;margin:0}.anonymize-form-col .paper-settings-section:first-child{padding-top:0}.anonymize-form-col .anonymize-submit-bar{position:sticky;bottom:0;background:var(--canvas-bg-color);padding:14px 0 0;border-top:1px solid var(--border-color);margin-top:20px}.anonymize-form-col .anonymize-submit-bar .btn{width:100%;padding:12px 16px;font-size:15px}.anonymize-preview-col{flex:1 1 auto;min-width:0;overflow:auto;background:var(--paper-bg-alt);padding:28px 32px}.anonymize-preview-head{display:flex;align-items:baseline;gap:12px;padding-bottom:12px;border-bottom:1px solid var(--border-color);margin-bottom:20px}.anonymize-preview-head .paper-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.anonymize-preview-sub{color:var(--ink-soft);font-size:13px}.anonymize-preview-body{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:28px 32px}.form-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.form-grid-3{display:grid;grid-template-columns:2fr 1fr 1fr;gap:16px}@media (max-width:700px){.form-grid-2,.form-grid-3{grid-template-columns:1fr}}.paper-optional{font-family:var(--font-sans);font-weight:400;color:var(--ink-muted);text-transform:none;letter-spacing:0;font-size:11px;margin-left:6px}.paper-plan-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}.paper-plan-card{position:relative;display:block;padding:18px 20px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease;margin:0}.paper-plan-card input[type=radio]{position:absolute;opacity:0;pointer-events:none}.paper-plan-card.selected{border-color:var(--color);box-shadow:0 0 0 2px var(--color) inset}.paper-plan-head{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.paper-plan-price{font-family:var(--font-serif);font-size:2rem;color:var(--color);margin:6px 0 4px}.paper-plan-price .paper-plan-per{font-family:var(--font-sans);font-size:12px;color:var(--ink-soft)}.paper-plan-desc{font-size:13px;color:var(--ink-soft)}.paper-plan-desc ul{padding-left:18px;margin:0}.paper-settings-copy{color:var(--ink-soft);font-size:13px;margin:0 0 14px}.anonymize-section-title{font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;margin:18px 0 8px 0;padding-bottom:6px;border-bottom:1px solid var(--border-color);opacity:.7}.anonymize-section-title i{margin-right:4px}.anonymize-submit-bar{padding:12px 0 4px 0}.anonymize-submit-bar .btn{font-size:1rem;padding:10px 20px;font-weight:600}.anonymize-page .form-check{padding-top:4px;padding-bottom:4px}.anonymize-page .form-check-label{font-weight:500}.anonymize-preview-col{min-height:0;min-width:0}.pr-diff pre{overflow-x:auto;max-width:100%}@media (min-width:768px){.anonymize-form-col{height:100%;width:520px;flex:0 0 520px}.anonymize-preview-col{height:100%;flex:1}}@media (max-width:767px){.anonymize-workspace{flex:0 0 auto;min-height:0}.anonymize-topbar{padding:14px 16px}.anonymize-topbar-title{font-size:1.6rem;margin-top:2px}.anonymize-split{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.anonymize-form-col{width:100%!important;flex:0 0 auto!important;height:auto!important;border-right:none;border-bottom:1px solid var(--border-color);overflow:visible}.anonymize-form-col .paper-settings-main{padding:18px 16px 24px;max-width:none}.anonymize-form-col .anonymize-submit-bar{position:sticky;bottom:0;margin:20px -16px 0;padding:12px 16px;background:var(--canvas-bg-color);border-top:1px solid var(--border-color);z-index:10}.anonymize-form-col .anonymize-submit-bar .btn{width:100%;padding:12px 16px;font-size:15px}.anonymize-preview-col{width:100%;flex:0 0 auto;height:auto!important;max-height:none;padding:18px 16px 24px;overflow:visible}.anonymize-preview-body{padding:16px;border-radius:8px}.anonymize-preview-body .pr-diff pre,.anonymize-preview-body pre{overflow-x:auto;max-width:100%}.anonymize-landing-inner{padding:16px}}@media (min-width:1280px){.anonymize-form-col{width:620px;flex:0 0 620px}}@media (max-width:767px){.btn{min-height:38px;padding:6px 14px;font-size:14px}.btn-sm{min-height:34px;padding:5px 10px}.navbar .nav-link{padding:8px 12px}.navbar .nav-link .fa,.navbar .nav-link .fab{font-size:24px;line-height:32px}.container.page{padding-left:15px;padding-right:15px;max-width:100%}h1{font-size:1.6rem}h2{font-size:1.35rem}h3{font-size:1.15rem}.repo-list-item{flex-direction:column}.repo-list-item-actions{align-self:flex-start}.quota-row{flex-direction:column;gap:10px;padding:10px 12px}.dropdown-menu{position:absolute;right:0;left:auto}.form-group{margin-bottom:12px}.form-control{font-size:16px}.status-bar{gap:6px;padding:8px 10px}.status-bar .btn{font-size:12px;padding:4px 10px;min-height:32px}.status-bar .paths{font-size:11.5px;overflow-x:auto;flex-wrap:nowrap;white-space:nowrap;-webkit-overflow-scrolling:touch}.status-bar .paths::-webkit-scrollbar{display:none}.status-bar-actions{flex-shrink:0;gap:4px}#home .display-4{font-size:1.8rem}#home h4.subtext-header{font-size:1rem}.progress:not(.quota-progress){min-width:120px!important}.badge{font-size:70%}.col-2.input-group{width:100%!important;max-width:100%;flex:0 0 100%}.color-text-secondary span{display:inline-block;margin-bottom:2px}.floatingchat-container-wrap{display:none!important}.anonymize-landing{align-items:flex-start;padding-top:60px}.anonymize-page .container-fluid>.row{height:auto!important;min-height:100%}.anonymize-form-col{width:100%!important;flex:0 0 100%!important;border-right:none;border-top:1px solid var(--border-color)}.anonymize-preview-col{height:auto!important;max-height:none}.anonymize-section-title{font-size:.8rem;margin:12px 0 8px 0}.anonymize-submit-bar{position:sticky;bottom:0;background:var(--sidebar-bg-color);padding:10px 0;margin:0 -12px;padding-left:12px;padding-right:12px;border-top:1px solid var(--border-color);z-index:10}.anonymize-submit-bar .btn{font-size:1rem;padding:12px 20px}.anonymize-page .form-check{padding-top:6px;padding-bottom:6px;min-height:36px}.anonymize-page .form-check-label{font-size:.95rem}.anonymize-page .card-body{padding:12px}.pr-title{font-size:1.15rem}.pr-diff pre{font-size:.75rem}.pr-comment .mb-1 h5{font-size:1rem}.nav-tabs .nav-link{padding:8px 12px;font-size:.9rem}}@media (min-width:768px) and (max-width:991px){.container.page{max-width:100%;padding-left:15px;padding-right:15px}.leftCol{flex:0 0 250px;width:250px}}.explorer-page{display:flex;height:100%;width:100%;background:var(--canvas-bg-color);position:relative}.explorer-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;overflow:hidden;background:var(--canvas-bg-color)}.explorer-content{flex:1 1 auto;min-height:0;width:100%;overflow:auto}.leftCol-close,.leftCol-head{display:none}.leftCol-body{flex:1 1 auto;min-height:0;overflow:auto}.leftCol-foot{padding:8px 12px;border-top:1px solid var(--border-color);background:var(--paper-bg-alt)}.leftCol-foot .last-update{display:block;border-top:none;padding:0}.leftCol-backdrop{display:none}.paper-inline-warning{display:flex;align-items:flex-start;gap:8px;margin:8px;padding:10px 12px;background:rgba(138,107,30,.08);border:1px solid rgba(138,107,30,.35);border-radius:8px;color:var(--color);font-size:12.5px;line-height:1.4}.paper-inline-warning i{color:#8a6b1e;margin-top:2px;flex-shrink:0}.dark-mode .paper-inline-warning i{color:#ffd37a}@media (min-width:768px){.leftCol-body{padding:8px 4px}}.sidebar-toggle{display:none;align-items:center;gap:8px;position:fixed;bottom:18px;right:18px;z-index:1100;padding:10px 14px;background:var(--color);color:var(--canvas-bg-color);border:1px solid var(--color);border-radius:999px;font-family:var(--font-sans);font-size:13px;font-weight:500;box-shadow:0 6px 20px rgba(0,0,0,.15);cursor:pointer;outline:0}.sidebar-toggle:hover{background:var(--primary-hover-bg)}.sidebar-toggle:focus,.sidebar-toggle:focus-visible{outline:0;box-shadow:0 6px 20px rgba(0,0,0,.15)}@media (max-width:991px){.sidebar-toggle{display:inline-flex}.leftCol{position:fixed;top:0;left:0;bottom:0;width:min(86vw,340px);max-width:340px;z-index:1200;border:none;border-right:1px solid var(--border-color);transform:translateX(0);transition:transform .22s ease;box-shadow:4px 0 24px rgba(0,0,0,.18);background:var(--sidebar-bg-color)}.leftCol.collapsed{transform:translateX(-105%);box-shadow:none;pointer-events:none}.leftCol-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--border-color);background:var(--paper-bg-alt)}.leftCol-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.leftCol-close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:0 0;border:1px solid var(--border-color);border-radius:8px;color:var(--ink-muted);cursor:pointer}.leftCol-close:hover{color:var(--color);border-color:var(--color)}.leftCol-foot{display:block}.leftCol-body{padding:4px 0}.leftCol-backdrop{display:block;position:fixed;inset:0;background:rgba(0,0,0,.32);z-index:1150;backdrop-filter:blur(2px)}.dark-mode .leftCol-backdrop{background:rgba(0,0,0,.5)}}.admin-nav{display:flex;gap:4px;padding:4px;margin:8px 0 20px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;flex-wrap:wrap}.admin-nav a{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:7px;color:var(--ink-muted);text-decoration:none;font-family:var(--font-mono);font-size:11.5px;font-weight:500;letter-spacing:.06em;text-transform:uppercase;transition:background-color .15s,color .15s;white-space:nowrap}.admin-nav a:hover{background:var(--paper-bg-alt);color:var(--color)}.admin-nav a.active{background:var(--color);color:var(--paper-card)}.admin-nav a i{font-size:12px;width:14px;text-align:center}@media (max-width:767px){.admin-nav{flex-direction:column}.admin-nav a{justify-content:flex-start}}.admin-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;margin-bottom:16px}.admin-stat-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:8px;padding:10px 12px}.admin-stat-card .stat-value{font-family:var(--font-serif);font-size:1.4rem;font-weight:400;line-height:1.1;color:var(--color)}.admin-stat-card .stat-label{font-family:var(--font-mono);font-size:9.5px;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;margin-top:4px}.admin-toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:16px 0 12px}.admin-toolbar .form-control{max-width:320px}@media (max-width:767px){.admin-toolbar .form-control{max-width:100%;width:100%}}.pagination-compact{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap;font-family:var(--font-mono);font-size:12px;color:var(--ink-muted)}.pagination-compact input{width:60px;text-align:center;flex-shrink:0}.pagination-compact .btn{padding:4px 10px;min-height:34px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);flex-shrink:0}.pagination-compact>span{white-space:nowrap}.admin-list-item{display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-bottom:1px solid var(--border-color)}.admin-list-item:last-child{border-bottom:none}.admin-list-item .item-main{flex:1;min-width:0}.admin-list-item .item-title{font-size:1rem;font-weight:600;margin-bottom:4px;word-break:break-word}.admin-list-item .item-meta{font-size:.85rem;opacity:.8}.admin-list-item .item-meta span{margin-right:12px;display:inline-block;margin-bottom:2px}.admin-list-item .item-actions{flex-shrink:0}@media (max-width:767px){.admin-list-item{flex-direction:column;gap:8px}.admin-list-item .item-actions{align-self:flex-start}}.status-badge{display:inline-block;font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px;text-transform:uppercase;letter-spacing:.3px;vertical-align:middle}.status-badge{font-family:var(--font-sans);font-weight:500;letter-spacing:.02em;border:1px solid transparent;text-transform:none;font-size:11.5px;padding:1px 9px 2px;border-radius:999px}.status-badge.status-ready{background:#e8f3ec;color:#2f7a44;border-color:#cfe6d6}.status-badge.status-error{background:#fbe7e7;color:#b42318;border-color:#f3c7c7}.status-badge.status-download,.status-badge.status-preparing{background:#eef0ff;color:#3b4ad6;border-color:#d4d8fa}.status-badge.status-expired,.status-badge.status-expiring,.status-badge.status-removed,.status-badge.status-removing{background:var(--paper-bg-alt);color:var(--ink-muted);border-color:var(--border-color)}.status-badge.status-active{background:#e8f3ec;color:#2f7a44;border-color:#cfe6d6}.queue-job-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 18px;margin-bottom:10px}.queue-job-card .job-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;flex-wrap:wrap;gap:8px}.queue-job-card .job-id{font-family:var(--font-mono);font-size:.95rem;color:var(--color);word-break:break-all;display:flex;align-items:center;gap:10px}.queue-job-card .job-timestamps{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);display:flex;flex-wrap:wrap;gap:14px}.queue-job-card .job-actions{display:flex;gap:8px;margin-top:10px}.queue-job-card .job-actions .btn{font-size:12px;padding:4px 12px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color)}.admin-section-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:24px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--border-color)}.admin-section-header h2{margin:0;font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em}.admin-section-header h2 i{margin-right:6px;color:var(--ink-muted)}.admin-section-header .section-count{background:var(--paper-bg-alt);color:var(--ink-muted);border:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;padding:1px 10px;border-radius:999px}.user-detail-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:22px;margin-bottom:24px}.user-detail-card .user-header{display:flex;align-items:center;gap:16px;margin-bottom:18px;padding-bottom:16px;border-bottom:1px solid var(--border-color);flex-wrap:wrap}.user-detail-card .user-header img{border-radius:50%}.user-detail-card .user-header h2{margin:0;font-family:var(--font-serif);font-weight:400;font-size:1.6rem;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.user-detail-grid{display:grid;grid-template-columns:160px 1fr;gap:10px 20px;font-size:.92rem}.user-detail-grid .detail-label{font-family:var(--font-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);white-space:nowrap;padding-top:2px}.user-detail-grid .detail-value{word-break:break-all;color:var(--color)}@media (max-width:767px){.user-detail-grid{grid-template-columns:1fr}.user-detail-grid .detail-label{margin-top:8px;border-top:1px solid var(--border-color);padding-top:8px}.user-detail-grid .detail-label:first-child{border-top:none;margin-top:0;padding-top:0}}.paper-empty{min-height:calc(100vh - 60px);display:flex;align-items:center;justify-content:center;padding:40px 24px}.paper-empty-inner{max-width:560px;text-align:left}.paper-empty-title{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.4rem,6vw,4.4rem);line-height:1.02;letter-spacing:-.025em;margin:18px 0 20px;color:var(--color)}.paper-empty-title em{color:var(--accent);font-style:italic}.paper-empty-lede{font-size:17px;line-height:1.55;color:var(--ink-soft);text-wrap:pretty}.paper-empty-cta{display:flex;gap:10px;margin-top:28px;flex-wrap:wrap}.paper-page{max-width:1100px;margin:0 auto;padding:32px 32px 80px}@media (max-width:991px){.paper-page,.paper-page.container,.paper-page.container-fluid{padding:20px 18px 60px!important}.paper-page .row{margin-left:0;margin-right:0}.paper-page .row>.w-100,.paper-page .row>[class*=col]{padding-left:0;padding-right:0}.navbar.navbar-expand-lg{padding:10px 18px!important}.navbar .navbar-collapse{margin:10px -18px 0;padding:12px 18px 16px;border-top:1px solid var(--border-color);background:var(--header-bg-color)}.navbar .navbar-nav{align-items:stretch!important;gap:2px}.navbar .navbar-nav .nav-item,.navbar .navbar-nav .nav-link{width:100%}.navbar .nav-link{display:flex!important;align-items:center;justify-content:flex-start;margin:0!important;padding:12px 4px!important;border-bottom:1px solid var(--border-color)!important;border-radius:0;font-size:14px;line-height:1.2;gap:0;min-height:44px;box-sizing:border-box}.navbar .nav-link:not(.btn-signin):not(.user-chip){color:var(--color)!important}.navbar .nav-link .fa,.navbar .nav-link .fab,.navbar .nav-link .fas,.navbar .nav-link i{display:inline-flex!important;align-items:center;justify-content:center;width:28px;flex-shrink:0;font-size:16px;line-height:1;margin:0 10px 0 0!important}.navbar .navbar-nav .nav-item:last-child .nav-link,.navbar .navbar-nav>.nav-link:last-child{border-bottom-color:transparent!important}.navbar .nav-link.active{color:var(--color)!important;border-bottom-color:var(--border-color)!important}.navbar .nav-item>.nav-link:not(.btn-signin):not(.user-chip)::before{content:'';display:inline-block;width:28px;margin-right:10px;flex-shrink:0}.navbar .nav-link.nav-icon::before,.navbar .nav-link:has(>i)::before{display:none!important}.navbar .nav-link.nav-icon{width:100%!important;height:auto!important;justify-content:flex-start!important;padding:12px 4px!important}.navbar .nav-link.nav-icon::after{content:attr(title);font-family:var(--font-sans);font-size:14px;color:var(--color)}.navbar .btn-signin{display:inline-flex!important;width:auto!important;align-self:flex-start;justify-content:center;height:40px;padding:0 18px!important;margin:14px 0 0!important;border-radius:8px;border-bottom:none!important}.navbar .btn-signin i{margin:0 8px 0 0!important;width:auto!important}.navbar .user-chip-wrap{width:100%}.navbar .user-chip{display:flex!important;width:100%;margin:0!important;padding:10px 4px!important;background:0 0!important;border:none!important;border-bottom:1px solid var(--border-color)!important;border-radius:0!important;justify-content:flex-start;gap:0;min-height:44px}.navbar .user-chip::before{display:none!important}.navbar .user-chip img{width:28px!important;height:28px!important;margin-right:10px!important;flex-shrink:0}.navbar .user-chip .user-chip-name{font-size:14px;font-weight:500;color:var(--color)!important}.navbar .user-chip.dropdown-toggle::after{margin-left:auto;color:var(--ink-muted)}.navbar .user-chip-wrap .dropdown-menu{position:static!important;float:none;width:100%;margin:0!important;padding:0!important;background:0 0!important;border:none!important;box-shadow:none!important;transform:none!important}.navbar .user-chip-wrap .dropdown-menu .dropdown-item{padding:10px 4px 10px 42px!important;font-size:13.5px;color:var(--ink-muted)!important;background:0 0!important;border-bottom:1px solid var(--border-color);text-align:left!important}.navbar .user-chip-wrap .dropdown-menu .dropdown-item:last-child{border-bottom:none}.navbar .user-chip-wrap .dropdown-divider{display:none}.navbar-brand{border-right:none!important;padding-right:0!important;margin-right:0!important}.dark-mode .navbar .navbar-collapse{background:var(--header-bg-color);border-top-color:var(--border-color)}.dark-mode .navbar .nav-link{border-bottom-color:var(--border-color)!important}.dark-mode .navbar-toggler .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' d='M4 8h22M4 15h22M4 22h22'/%3E%3C/svg%3E")!important}}.status-pill{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;background:var(--paper-bg-alt);border:1px solid var(--border-color);color:var(--ink-soft);font-family:var(--font-mono);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase}.paper-progress{position:relative;height:auto;background:0 0;margin:18px 0 8px}.paper-progress::before{content:"";display:block;height:8px;background:var(--paper-bg-alt);border-radius:999px}.paper-progress .paper-progress-bar{position:absolute;top:0;left:0;height:8px;background:var(--color);border-radius:999px;transition:width .4s ease;min-width:4px}.paper-progress .paper-progress-label{display:flex;justify-content:space-between;align-items:center;margin-top:10px;font-family:var(--font-mono);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.paper-progress .paper-progress-pct{color:var(--color)}.paper-progress.paper-progress-ready .paper-progress-bar{background:var(--color)}.paper-error-card{margin-top:18px;padding:20px 22px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-left:3px solid #c53030;border-radius:10px;color:var(--color)}.dark-mode .paper-error-card{border-left-color:#ff8b7b}.paper-ratelimit-card{margin-top:18px;padding:20px 22px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-left:3px solid #d69e2e;border-radius:10px;color:var(--color)}.dark-mode .paper-ratelimit-card{border-left-color:#f6e05e}.paper-ratelimit-head{display:flex;align-items:flex-start;gap:14px}.paper-ratelimit-head>i{font-size:18px;color:#d69e2e;margin-top:4px;flex-shrink:0}.dark-mode .paper-ratelimit-head>i{color:#f6e05e}.paper-ratelimit-card strong{color:var(--color)}.status-pill-ratelimit{border-color:#d69e2e;color:#d69e2e}.dark-mode .status-pill-ratelimit{border-color:#f6e05e;color:#f6e05e}.status-ratelimit{background:#d69e2e}.dark-mode .status-ratelimit{background:#f6e05e}.paper-error-head{display:flex;align-items:flex-start;gap:14px}.paper-error-head>i{font-size:18px;color:#c53030;margin-top:4px;flex-shrink:0}.dark-mode .paper-error-head>i{color:#ff8b7b}.paper-error-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.paper-error-title{font-family:var(--font-serif);font-size:1.4rem;line-height:1.2;margin-top:2px;color:var(--color)}.paper-error-msg{margin:12px 0 0;font-size:14px;line-height:1.55;color:var(--ink-soft);font-family:var(--font-mono);word-break:break-word;white-space:pre-wrap}.paper-error-hints{margin:14px 0 0;padding-left:18px;color:var(--ink-soft);font-size:13.5px;line-height:1.6}.paper-error-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.paper-detail-grid{display:grid;grid-template-columns:160px 1fr;gap:10px 20px;margin-top:18px;font-size:.92rem}.paper-detail-grid .detail-label{font-family:var(--font-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);white-space:nowrap;padding-top:2px}.paper-detail-grid .detail-value{word-break:break-all;color:var(--color)}.paper-detail-grid .detail-value a{color:var(--color);border-bottom:1px solid var(--border-color)}.paper-detail-grid .detail-value a:hover{border-bottom-color:var(--color)}@media (max-width:700px){.paper-detail-grid{grid-template-columns:1fr;gap:4px 0}.paper-detail-grid .detail-label{padding-top:8px}}.paper-support-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin:18px 0 28px}.paper-support-card{display:flex;flex-direction:column;gap:10px;padding:20px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;color:var(--color);text-decoration:none;transition:border-color .15s ease,transform .15s ease}.paper-support-card:hover{border-color:var(--color);text-decoration:none;color:var(--color)}.paper-support-card .paper-support-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);display:flex;align-items:center;gap:8px}.paper-support-card p{margin:0;font-size:14px;line-height:1.55;color:var(--ink-soft)}.paper-support-card .paper-support-cta{margin-top:auto;font-size:13px;font-weight:500;color:var(--color);display:inline-flex;align-items:center;gap:6px}.paper-support-card:hover .paper-support-cta i{transform:translateX(2px)}.paper-support-card .paper-support-cta i{transition:transform .15s ease}.paper-kofi-wrap{border:1px solid var(--border-color);border-radius:10px;overflow:hidden;background:var(--paper-card)}.paper-kofi-wrap iframe{border:0;width:100%;height:650px;display:block}.dark-mode .paper-kofi-wrap iframe{filter:invert(.88) hue-rotate(180deg) sepia(.15) saturate(1.2) brightness(1.1) contrast(.85)}@media (max-width:700px){.paper-kofi-wrap iframe{height:720px}}.pr-page{min-height:100%;background:var(--canvas-bg-color)}.pr-page-inner{padding-top:24px;padding-bottom:60px}.pr-header{margin:6px 0 18px}.pr-title{margin:4px 0 10px;font-size:clamp(1.6rem,3vw,2.4rem);line-height:1.15;word-break:break-word}.pr-header-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;font-family:var(--font-mono);font-size:12px;color:var(--ink-muted)}.pr-header-meta .pr-meta-item{display:inline-flex;align-items:center;gap:6px}.pr-header-meta .pr-meta-item i{color:var(--ink-muted)}.pr-body-card{margin:18px 0 24px;padding:20px 22px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px}.pr-body-card .paper-section-eyebrow{margin-bottom:12px}.paper-tabs{display:flex;flex-wrap:wrap;gap:0;border-bottom:1px solid var(--border-color);margin:18px 0 0}.paper-tabs .paper-tab{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;background:0 0;border:0;border-bottom:2px solid transparent;font-family:var(--font-sans);font-size:13.5px;font-weight:500;color:var(--ink-muted);cursor:pointer;transition:color .15s ease,border-color .15s ease;margin-bottom:-1px}.paper-tabs .paper-tab:hover{color:var(--color)}.paper-tabs .paper-tab.active{color:var(--color);border-bottom-color:var(--color)}.paper-tabs .paper-tab i{color:inherit;opacity:.85}.paper-tabs .paper-tab:active,.paper-tabs .paper-tab:focus,.paper-tabs .paper-tab:focus-visible{outline:0;box-shadow:none}.paper-tabs .paper-tab:focus-visible{color:var(--color);background:var(--hover-bg-color);border-radius:6px 6px 0 0}.pr-diff{margin:16px 0 28px;display:flex;flex-direction:column;gap:16px}.diff-file-block{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;overflow:hidden}.diff-file-header{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--paper-bg-alt);border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:12.5px;color:var(--color)}.diff-file-icon{color:var(--ink-muted);flex-shrink:0}.diff-file-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all}.diff-file-status{flex-shrink:0;padding:2px 8px;border-radius:999px;font-size:10px;letter-spacing:.12em;text-transform:uppercase;border:1px solid var(--border-color);color:var(--ink-muted);background:var(--paper-card)}.diff-file-status-added{color:#2f6b3e;border-color:rgba(47,107,62,.35);background:rgba(47,107,62,.08)}.diff-file-status-deleted{color:#a13a2e;border-color:rgba(161,58,46,.35);background:rgba(161,58,46,.08)}.diff-file-status-renamed{color:#8a6b1e;border-color:rgba(138,107,30,.35);background:rgba(138,107,30,.08)}.dark-mode .diff-file-status-added{color:#a7e2a7;border-color:rgba(167,226,167,.35);background:rgba(167,226,167,.08)}.dark-mode .diff-file-status-deleted{color:#ff8b7b;border-color:rgba(255,139,123,.35);background:rgba(255,139,123,.08)}.dark-mode .diff-file-status-renamed{color:#ffd37a;border-color:rgba(255,211,122,.35);background:rgba(255,211,122,.08)}.diff-file-table{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:12.5px;line-height:1.55;table-layout:fixed}.diff-file-table tr.diff-row{vertical-align:top}.diff-file-table .diff-gutter{width:48px;padding:0 10px;text-align:right;color:var(--ink-muted);background:var(--paper-bg-alt);border-right:1px solid var(--border-color);user-select:none;font-variant-numeric:tabular-nums;vertical-align:top;white-space:nowrap}.diff-file-table .diff-gutter-new{border-right:1px solid var(--border-color)}.diff-file-table .diff-sign{width:18px;padding:0 6px;text-align:center;color:var(--ink-muted);background:var(--paper-bg-alt);user-select:none;vertical-align:top}.diff-file-table .diff-code{padding:1px 12px;white-space:pre-wrap;word-break:break-word;color:var(--color)}.diff-row-hunk td{background:var(--paper-bg-alt)!important;color:var(--ink-muted);border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);font-size:12px;letter-spacing:.02em;padding-top:6px;padding-bottom:6px}.diff-row-hunk .diff-code{color:var(--ink-muted)}.diff-row-add .diff-code{background:rgba(47,107,62,.1);color:#1f4a2a}.diff-row-add .diff-gutter,.diff-row-add .diff-sign{background:rgba(47,107,62,.06);color:#2f6b3e}.diff-row-remove .diff-code{background:rgba(161,58,46,.1);color:#6e1f1a}.diff-row-remove .diff-gutter,.diff-row-remove .diff-sign{background:rgba(161,58,46,.06);color:#a13a2e}.dark-mode .diff-row-add .diff-code{background:rgba(167,226,167,.1);color:#c9f0c9}.dark-mode .diff-row-add .diff-gutter,.dark-mode .diff-row-add .diff-sign{background:rgba(167,226,167,.06);color:#a7e2a7}.dark-mode .diff-row-remove .diff-code{background:rgba(255,139,123,.1);color:#ffc9c0}.dark-mode .diff-row-remove .diff-gutter,.dark-mode .diff-row-remove .diff-sign{background:rgba(255,139,123,.06);color:#ff8b7b}@media (max-width:700px){.diff-file-table{font-size:11.5px}.diff-file-table .diff-gutter{width:36px;padding:0 6px}.diff-file-table .diff-sign{width:14px;padding:0 4px}.diff-file-table .diff-code{padding:1px 8px}}.pr-comments{list-style:none;margin:16px 0 28px;padding:0;display:flex;flex-direction:column;gap:12px}.pr-comment{padding:16px 18px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px}.pr-comment-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid var(--border-color)}.pr-comment-author{font-weight:600;color:var(--color);font-size:14px;display:inline-flex;align-items:center;gap:6px}.pr-comment-author i{color:var(--ink-muted);font-size:12px}.pr-comment-date{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);letter-spacing:.02em}.pr-comment-body{color:var(--color);font-size:14px;line-height:1.6}.pr-comment-body :last-child{margin-bottom:0}@media (max-width:700px){.pr-page-inner{padding-top:14px;padding-bottom:40px}.pr-body-card{padding:14px 14px;border-radius:8px}.pr-comment{padding:12px 14px}.paper-tabs .paper-tab{padding:10px 12px;font-size:13px}.pr-diff pre{font-size:11.5px;padding:12px}}.toast{background-color:var(--paper-card)!important;color:var(--color)!important;border:1px solid var(--border-color)!important;border-radius:10px!important;box-shadow:0 8px 24px rgba(0,0,0,.08);backdrop-filter:none;min-width:280px;max-width:calc(100vw - 24px)}.toast .toast-header{background:0 0!important;color:var(--color)!important;border-bottom:1px solid var(--border-color)!important;font-family:var(--font-sans);padding:10px 12px}.toast .toast-header strong{font-weight:600;color:var(--color);letter-spacing:.01em}.toast .toast-header .close{color:var(--ink-muted)!important;text-shadow:none;opacity:.9;font-size:1.2rem}.toast .toast-header .close:hover{color:var(--color)!important;opacity:1}.toast .toast-body{color:var(--color)!important;padding:12px;font-size:14px;line-height:1.45}.dark-mode .toast{box-shadow:0 8px 24px rgba(0,0,0,.5)}.paper-crumbs{font-family:var(--font-sans);font-size:12px;color:var(--ink-muted);letter-spacing:0}.paper-crumbs .here,.paper-crumbs a{color:var(--color);text-decoration:none}.paper-page-title{font-family:var(--font-sans);font-weight:600;font-size:32px;line-height:1.2;letter-spacing:-.035em;margin:8px 0 6px;color:var(--color)}.paper-page-title em{color:inherit;font-style:normal}.paper-page-lede{color:var(--ink-soft);font-size:16px;max-width:640px;line-height:1.55}.paper-meta-rule{display:flex;flex-wrap:wrap;gap:16px 24px;align-items:center;margin:22px 0 18px;padding:12px 0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);letter-spacing:.02em}.paper-meta-rule b{color:var(--color);font-weight:500}.paper-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:10px;padding:20px 22px}.dark-mode .paper-card{background:var(--admin-stat-bg)}.paper-section-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);font-weight:500;margin-bottom:10px;display:block}.paper-section-title{font-family:var(--font-serif);font-weight:400;font-size:22px;letter-spacing:-.01em;margin:0 0 8px}.paper-kbd{display:inline-block;font-family:var(--font-mono);font-size:10.5px;padding:1px 6px;border:1px solid var(--border-color);border-bottom-width:2px;border-radius:3px;background:var(--paper-card,#fff);color:var(--color)}.paper-pill{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:10.5px;padding:2px 8px;border:1px solid var(--border-color);border-radius:999px;color:var(--ink-soft);background:var(--paper-card,#fff);letter-spacing:.04em}.paper-pill.accent{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}.paper-pill.good{border-color:#2f6b3e;color:#2f6b3e}.paper-pill.warn{border-color:#8a6b1e;color:#8a6b1e}.paper-pill.bad{border-color:#a13a2e;color:#a13a2e}.paper-row{display:grid;grid-template-columns:1fr auto;gap:16px;align-items:start;padding:18px 0;border-bottom:1px solid var(--border-color)}.paper-row:first-child{border-top:1px solid var(--border-color)}.paper-row .row-title{font-family:var(--font-serif);font-size:20px;letter-spacing:-.01em;line-height:1.2}.paper-row .row-title a{color:var(--color)}.paper-row .row-meta{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);letter-spacing:.03em;margin-top:6px;display:flex;flex-wrap:wrap;gap:14px}.paper-row .row-actions{display:flex;gap:6px;flex-shrink:0}.paper-form-step{display:grid;grid-template-columns:48px 1fr;gap:20px;padding:22px 0;border-bottom:1px solid var(--border-color)}.paper-form-step:first-child{border-top:1px solid var(--border-color)}.paper-form-step .step-num{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);padding-top:4px;letter-spacing:.02em}.paper-form-step .step-title{font-family:var(--font-serif);font-size:22px;letter-spacing:-.01em;line-height:1.2;margin-bottom:4px}.paper-form-step .step-sub{color:var(--ink-soft);font-size:13.5px;margin-bottom:14px;text-wrap:pretty}.paper-field-label{font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--color);margin-bottom:6px;display:block}.paper-switch-row{display:flex;align-items:center;justify-content:space-between;padding:10px 0;gap:16px}.paper-switch-row+.paper-switch-row{border-top:1px dashed var(--border-soft)}.paper-switch-row .sw-label{font-weight:500}.paper-switch-row .sw-sub{display:block;font-size:12.5px;color:var(--ink-muted);margin-top:2px}.paper-page .custom-select,.paper-page .form-control{border-radius:6px;border-color:var(--border-color);font-size:14px;padding:8px 12px;height:auto;background:var(--input-bg);color:var(--input-color)}.paper-page .custom-select:focus,.paper-page .form-control:focus{color:var(--input-color);background:var(--input-bg);border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.custom-select:focus,.form-control:focus,input:focus,select:focus,textarea:focus{color:var(--input-color)!important;background-color:var(--input-bg)!important}.form-control::selection,input::selection,textarea::selection{background:var(--accent-soft);color:var(--input-color)}.dark-mode .form-control::selection,.dark-mode input::selection,.dark-mode textarea::selection{background:rgba(167,178,255,.3);color:var(--input-color)}.btn.btn-ink{background:var(--color);color:var(--canvas-bg-color);border:1px solid var(--color);font-weight:500;border-radius:6px;padding:8px 14px}.btn.btn-ink:hover{background:var(--primary-hover-bg);color:var(--canvas-bg-color);border-color:var(--primary-hover-bg)}.btn.btn-accent{background:var(--accent);color:#fff;border:1px solid var(--accent);font-weight:500;border-radius:6px}.btn.btn-accent:hover{background:#2e3bb8;border-color:#2e3bb8;color:#fff}.paper-page .dashboard-filter-row{display:flex;align-items:center;gap:10px;padding:14px 0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);margin:18px 0 0;flex-wrap:wrap}.paper-page .dashboard-filter-row .form-control{height:38px;background:var(--paper-card)}.paper-page .dashboard-filter-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.paper-page .dashboard-filter-row .btn-group .btn,.paper-page .dashboard-filter-row .dropdown-toggle{background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);height:38px;padding:0 14px;font-size:14px;font-weight:500;border-radius:var(--radius-control,6px);display:inline-flex;align-items:center;gap:6px;line-height:1}.paper-page .dashboard-filter-row .dropdown-toggle .filter-btn-label{color:var(--ink-muted);font-weight:500}.paper-page .dashboard-filter-row .dropdown-toggle .filter-btn-label::after{content:"·";margin-left:6px;color:var(--ink-faint)}.paper-page .dashboard-filter-row .dropdown-toggle .filter-btn-value{font-weight:500}.paper-page .dashboard-filter-row .dropdown-toggle .fas{font-size:11px;color:var(--ink-muted)}.paper-page .dashboard-filter-row .btn-group .btn:hover,.paper-page .dashboard-filter-row .dropdown-toggle:hover{background:var(--hover-bg-color);border-color:var(--border-color);color:var(--color)}.paper-page .dashboard-filter-row .btn-group{gap:0}.paper-page .dashboard-filter-row .btn-group .btn{border-radius:0;border-right-width:0}.paper-page .dashboard-filter-row .btn-group .btn:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.paper-page .dashboard-filter-row .btn-group .btn:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px;border-right-width:1px}.paper-page .dashboard-filter-row .btn-group .btn.btn-primary{background:var(--color);color:var(--canvas-bg-color);border-color:var(--color)}.paper-page .dashboard-filter-row .search-wrap{flex:1 1 280px;min-width:220px}.paper-page .quota-row{display:grid;grid-template-columns:repeat(3,1fr);gap:40px;margin:24px 0 0;padding:0;background:0 0;border:none;border-radius:0}.paper-page .quota-label{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);opacity:1}.paper-page .quota-value{font-family:var(--font-mono);font-size:13px;font-variant-numeric:tabular-nums;color:var(--color)}.paper-page .quota-value .quota-unlimited-tag{font-family:var(--font-sans);font-size:12px;color:var(--ink-muted);margin-left:4px}.paper-page .quota-track{height:6px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:999px;overflow:hidden;width:100%;min-width:0}.paper-page .quota-track .quota-fill{height:100%;min-width:2px;border-radius:999px;background:var(--color);transition:width .3s ease}.paper-page .quota-track.quota-warn .quota-fill{background:var(--status-progress)}.paper-page .quota-track.quota-danger .quota-fill{background:var(--status-error)}.paper-page .quota-track.quota-unlimited{background:repeating-linear-gradient(-45deg,var(--paper-bg-alt) 0 4px,var(--border-soft,var(--border-color)) 4px 6px)}.paper-page .repo-list{margin-top:8px}.paper-page .repo-list-item{padding:20px 0;gap:16px;border-bottom:1px solid var(--border-soft,var(--border-color))}.paper-page .repo-list-item:first-child{border-top:none}.paper-page .repo-list-item-header{gap:10px;margin-bottom:6px}.paper-page .repo-name{font-family:var(--font-mono);font-size:15px;color:var(--color)}.paper-page .repo-source{font-size:13px;color:var(--ink-soft);opacity:1;gap:10px}.paper-page .repo-source a{color:var(--ink-soft);border-bottom:1px dotted var(--border-color)}.paper-page .repo-source a:hover{color:var(--color)}.paper-page .repo-meta{font-family:var(--font-mono);font-size:12px;color:var(--ink-muted);opacity:1;gap:16px;margin-top:10px}.paper-page .type-badge{font-family:var(--font-mono);font-size:11px;padding:3px 8px;letter-spacing:.1em}.paper-page .repo-list-item-actions .dropdown-toggle{background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);border-radius:6px;font-size:13px;padding:6px 12px;height:auto}.paper-settings{max-width:1180px;margin:0 auto;padding:48px 32px 80px}.paper-settings .paper-page-title{max-width:14em}.paper-settings-body{display:grid;grid-template-columns:220px 1fr;gap:60px;margin-top:32px;border-top:1px solid var(--border-color);padding-top:28px}.paper-settings-toc{position:sticky;top:32px;align-self:start}.paper-settings-toc-head{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);margin-bottom:12px}.paper-settings-toc nav{display:flex;flex-direction:column;gap:2px}.paper-settings-toc nav a{padding:8px 0 8px 14px;border-left:2px solid transparent;color:var(--ink-soft);font-size:14px;text-decoration:none}.paper-settings-toc nav a.active,.paper-settings-toc nav a:hover{color:var(--color);border-left-color:var(--color)}.paper-settings-main{min-width:0;max-width:720px}.paper-settings-section{padding:28px 0;border-bottom:1px solid var(--border-soft,var(--border-color))}.paper-settings-section:first-child{padding-top:0}.paper-settings-section:last-of-type{border-bottom:none}.paper-settings-section .form-group{margin-bottom:18px}.paper-settings-section .form-check{padding:10px 0 10px 28px;border-bottom:1px solid var(--border-soft,var(--border-color))}.paper-settings-section .form-check:last-child{border-bottom:none}.paper-settings-section .form-check-label{font-family:var(--font-sans);font-size:14px;font-weight:500;color:var(--color);cursor:pointer}.paper-settings-section .form-check-input{cursor:pointer;width:16px;height:16px;margin-top:3px;margin-left:-28px;accent-color:var(--color)}.paper-settings-section .form-text{color:var(--ink-soft);font-size:13px;margin-top:4px;max-width:48em}.paper-settings-section .paper-section-copy{margin:-4px 0 14px}.paper-settings-footer{padding-top:24px;display:flex;flex-direction:column;gap:14px}.paper-settings-footer .btn-ink{align-self:flex-start}.paper-settings-actions{display:flex;align-items:center;flex-wrap:wrap;gap:14px}.paper-settings-hint{font-size:13px;color:var(--ink-muted)}.paper-inline-alert{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:var(--radius-control,6px);border:1px solid var(--border-color);background:var(--paper-bg-alt);font-size:13px;color:var(--color)}.paper-inline-alert i{margin-top:2px;color:var(--ink-muted)}.paper-inline-alert-error{border-color:var(--status-error);background:var(--status-error-soft)}.paper-inline-alert-error i{color:var(--status-error)}.paper-account-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--border-color);border-radius:var(--radius-surface,10px);background:var(--paper-card);margin-bottom:20px}.paper-account-card img{flex-shrink:0}.paper-account-identity{flex:1 1 auto;min-width:0}.paper-account-name{font-family:var(--font-mono);font-size:14px;font-weight:500;color:var(--color)}.paper-account-meta{font-size:13px;color:var(--ink-muted);margin-top:2px}.paper-danger-zone{padding:16px;border:1px solid var(--status-error);border-radius:var(--radius-surface,10px);background:var(--status-error-soft)}.paper-danger-head{font-weight:600;font-size:14px;color:var(--status-error);margin-bottom:6px}.paper-danger-copy{font-size:13px;color:var(--ink-soft);max-width:52em;margin-bottom:12px}.paper-danger-zone .paper-inline-alert{margin-bottom:12px}.btn.btn-outline-danger{background:0 0;color:var(--status-error);border:1px solid var(--status-error);font-weight:500;border-radius:var(--radius-control,6px);padding:8px 14px}.btn.btn-outline-danger:hover{background:var(--status-error);color:#fff;border-color:var(--status-error)}.navbar .user-menu{min-width:260px}.navbar .user-menu .dropdown-item{display:flex;align-items:flex-start;gap:10px;padding:8px 10px!important}.navbar .user-menu .dropdown-item i{width:16px;margin-top:3px;font-size:13px;color:var(--ink-muted);text-align:center}.navbar .user-menu .dropdown-item span{display:flex;flex-direction:column;line-height:1.3}.navbar .user-menu .dropdown-item small{font-size:12px;color:var(--ink-muted)}.navbar .user-menu .dropdown-header{font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-muted);padding:8px 10px 6px}.paper-field-label{font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--color);margin-bottom:6px;display:block}@media (max-width:900px){.paper-settings-body{grid-template-columns:1fr;gap:24px}.paper-settings-toc{position:static}.paper-settings-toc nav{flex-direction:row;flex-wrap:wrap;gap:8px}.paper-settings-toc nav a{border-left:none;border-bottom:2px solid transparent;padding:4px 0}.paper-settings-toc nav a.active,.paper-settings-toc nav a:hover{border-bottom-color:var(--color);border-left:none}}.paper-table{display:block;margin-top:20px;background:0 0;border:none;border-top:1px solid var(--border-color);border-radius:0;overflow:visible}.paper-table .paper-table-head,.paper-table .paper-table-row{display:grid;grid-template-columns:minmax(280px,2.4fr) minmax(140px,1fr) 140px 90px 140px 52px;align-items:center;gap:18px;padding:12px 4px}.paper-table.paper-table-conferences .paper-table-head,.paper-table.paper-table-conferences .paper-table-row{grid-template-columns:minmax(280px,2.4fr) 140px 90px 220px 52px}.paper-table.paper-table-repos .paper-table-head,.paper-table.paper-table-repos .paper-table-row{grid-template-columns:minmax(280px,2.4fr) minmax(140px,1fr) 90px 140px 52px}.paper-table.paper-table-repos.has-bulk .paper-table-head,.paper-table.paper-table-repos.has-bulk .paper-table-row{grid-template-columns:28px minmax(280px,2.4fr) minmax(140px,1fr) 90px 140px 52px;gap:12px}.paper-table .admin-users-row{grid-template-columns:28px minmax(280px,2.4fr) 90px 120px 100px 52px!important;gap:12px!important}.paper-table.paper-table-dashboard .paper-table-head,.paper-table.paper-table-dashboard .paper-table-row{grid-template-columns:minmax(320px,3fr) 190px 90px 170px 52px;gap:20px;padding:8px 4px}.paper-table.paper-table-dashboard .cell-anon .anon-text{gap:2px}.paper-table.paper-table-dashboard .cell-anon .repo-name{padding:0}.paper-table .paper-table-head{background:0 0;border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-muted);padding-top:8px;padding-bottom:8px}.paper-table .paper-table-head .sortable{cursor:pointer;user-select:none;display:inline-flex;align-items:center;gap:6px;background:0 0;border:none;padding:2px 0;margin:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;border-radius:4px}.paper-table .paper-table-head .sortable:hover{color:var(--color)}.paper-table .paper-table-head .sortable.active{color:var(--color)}.paper-table .paper-table-head .sortable i{font-size:10px}.paper-table .paper-table-head .num,.paper-table .paper-table-row .num{text-align:right}.paper-table .paper-table-head .num .sortable{flex-direction:row-reverse}.paper-table .paper-table-row{border-top:1px solid var(--border-soft,var(--border-color));font-size:14px;transition:background-color .12s ease}.paper-table .paper-table-row:hover{background:var(--hover-bg-color)}.paper-table .paper-table-row.row-clickable{cursor:pointer}.paper-table .paper-table-row.repo-inactive>:not(.cell-actions){opacity:.55}.paper-table .paper-table-row.repo-error{background:var(--status-error-soft);border-left:2px solid var(--status-error);padding-left:6px}.paper-table .paper-table-row.repo-error:hover{background:var(--status-error-soft-hover)}.cell-status .status-sub.status-sub-error,.paper-table .cell-status .status-sub-error{color:var(--status-error)}.paper-table .cell-status .status-sub-warn{color:var(--status-progress)}.paper-table .cell-anon{display:flex;align-items:center;gap:12px;min-width:0}.paper-table .cell-anon .type-badge{flex-shrink:0;min-width:52px;justify-content:center}.paper-table .cell-anon .anon-text{min-width:0;display:flex;flex-direction:column;gap:3px}.paper-table .cell-anon .anon-title{display:flex;align-items:center;gap:8px;min-width:0}.paper-table .cell-anon .anon-title .type-badge{margin-left:0}.paper-table .cell-anon .repo-name{font-family:var(--font-mono);font-size:14px;color:var(--color);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;max-width:100%;padding:2px 0}.paper-table .cell-anon .repo-name-static{color:var(--ink-muted);font-style:italic}.paper-table .cell-anon .anon-sub{font-family:var(--font-sans);font-size:13px;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:10px;min-width:0}.paper-table .cell-anon .anon-sub .anon-source{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-anon .anon-sub .conf-tag{flex:0 1 auto;min-width:72px;max-width:50%}.paper-table .cell-anon .anon-sub a{color:var(--ink-muted);border-bottom:1px dotted var(--border-color);padding:4px 0;margin:-4px 0}.paper-table .cell-anon .anon-sub a:hover{color:var(--color)}.paper-table .cell-anon .anon-sub .commit-hash{font-family:var(--font-mono);font-size:12px}.paper-table .cell-conf{font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-conf span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-status{display:flex;flex-wrap:wrap;align-items:center;gap:2px 8px;font-size:14px;color:var(--color);min-width:0}.paper-table .cell-status .status-line{display:inline-flex;align-items:center;gap:8px}.paper-table .cell-status .status-sub{flex-basis:100%;font-family:var(--font-sans);font-size:13px;line-height:1.3;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-views{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color)}.paper-table .cell-expires{font-family:var(--font-sans);font-size:13px;color:var(--ink-soft)}.paper-table .cell-expires .expires-never{color:var(--ink-muted)}.paper-table .cell-expires .expires-past{color:var(--ink-muted)}.paper-table .empty-dash{color:var(--ink-faint)}.paper-table .cell-actions{display:flex;justify-content:flex-end}.status-dot{width:8px;height:8px;border-radius:999px;display:inline-block;flex-shrink:0;background:var(--status-inactive)}.status-dot.status-ready{background:var(--status-ready)}.status-dot.status-error{background:var(--status-error)}.status-dot.status-preparing,.status-dot.status-progress{background:var(--status-progress)}.status-dot.status-expired,.status-dot.status-removed{background:var(--status-inactive)}.dashboard-page{padding-bottom:96px}.dashboard-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin-top:12px;font-size:13px;color:var(--ink-muted)}.dashboard-meta .dashboard-count{font-variant-numeric:tabular-nums}.btn-link-inline{background:0 0;border:none;padding:2px 4px;margin:-2px 0;font:inherit;color:var(--link-color);cursor:pointer;border-radius:4px}.btn-link-inline:hover{color:var(--link-hover-color);text-decoration:underline}.btn.btn-outline-ink{background:0 0;color:var(--color);border:1px solid var(--border-color);font-weight:500;border-radius:var(--radius-control,6px);padding:8px 14px}.btn.btn-outline-ink:hover{background:var(--hover-bg-color);color:var(--color);border-color:var(--ink-faint)}.paper-page .dropdown-menu .dropdown-item-danger,.paper-page .dropdown-menu .dropdown-item-danger i{color:var(--status-error)}.paper-page .dropdown-menu .dropdown-item-danger:focus,.paper-page .dropdown-menu .dropdown-item-danger:hover{background:var(--status-error-soft-hover);color:var(--status-error)}.paper-page .dropdown-menu button.dropdown-item{width:100%;text-align:left;background:0 0;border:none}.paper-page .dropdown-menu .dropdown-divider{border-top-color:var(--border-soft,var(--border-color));margin:4px 0}.paper-table .paper-table-skeleton{pointer-events:none}.skeleton{display:block;background:var(--paper-bg-alt);border-radius:4px;position:relative;overflow:hidden}.skeleton::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,var(--hover-bg-color),transparent);animation:skeleton-shimmer 1.4s infinite}.skeleton-line{height:12px}.skeleton-line+.skeleton-line{margin-top:8px}.skeleton-line-sm{height:10px}.skeleton-badge{width:52px;height:22px;border-radius:999px;flex-shrink:0}@keyframes skeleton-shimmer{to{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.skeleton::after{animation:none}}.paper-table .paper-table-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:56px 20px;color:var(--ink-muted);text-align:center;border-top:1px solid var(--border-soft,var(--border-color))}.paper-table .paper-table-empty>i{font-size:1.6rem;color:var(--ink-faint)}.paper-table .paper-table-empty-actions{display:flex;gap:8px;margin-top:8px}.bulk-bar{display:flex;align-items:center;gap:8px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:8px;padding:8px 12px;margin:8px 0}.paper-page.admin-page .paper-page-title{font-size:1.6rem;margin:4px 0}.paper-page.admin-page .paper-page-lede{display:none}.paper-page.admin-page .paper-crumbs{margin-bottom:4px}.paper-page.admin-page .admin-nav{margin:6px 0 12px}.admin-filter-toolbar{display:flex;flex-direction:column;gap:6px;margin:8px 0 12px;position:sticky;top:0;z-index:4;background:var(--canvas-bg-color);padding:6px 0;border-bottom:1px solid var(--border-soft,var(--border-color));box-shadow:0 1px 0 var(--canvas-bg-color)}@media (max-width:900px){.admin-filter-toolbar{position:static;box-shadow:none}}.admin-filter-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.admin-filter-row .search-wrap{flex:1;min-width:220px}.admin-filter-row .search-wrap .form-control{height:34px}.admin-filter-inline{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--ink-muted)}.admin-filter-inline>label{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);margin:0;white-space:nowrap}.admin-filter-inline .form-control-sm{height:28px;padding:2px 8px;font-size:12px}.admin-filter-inline input[type=search].form-control-sm,.admin-filter-inline input[type=text].form-control-sm{width:130px}.admin-filter-inline input[type=date].form-control-sm{width:130px}.admin-filter-inline select.form-control-sm{width:auto;min-width:88px}.admin-filter-inline .arrow{color:var(--ink-muted);font-size:11px}.admin-filter-spacer{flex:1}.admin-active-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:12px;color:var(--ink-muted)}.admin-active-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 10px;border:1px solid var(--border-color);border-radius:999px;background:var(--hover-bg-color);font-size:12px;color:var(--color)}.admin-active-chip .key{color:var(--ink-muted);font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em}.admin-active-chip button{background:0 0;border:none;cursor:pointer;padding:0 4px;color:var(--ink-muted);font-size:12px;border-radius:50%}.admin-active-chip button:hover{color:#b42318}.admin-search-hint{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);pointer-events:none;border:1px solid var(--border-color);border-radius:4px;padding:1px 5px;background:var(--paper-card)}.admin-filter-row .search-wrap{position:relative}.admin-filter-row .search-wrap .form-control{padding-right:40px}.paper-table-row.row-selected{background:rgba(47,122,68,.06)}.queue-state-pills{display:inline-flex;gap:6px;margin-left:8px;flex-wrap:wrap}.queue-state-pills .pill{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--border-color);background:var(--paper-card);color:var(--ink-muted)}.queue-state-pills .pill-active{color:#c48a2e;border-color:rgba(196,138,46,.4)}.queue-state-pills .pill-failed{color:#b42318;border-color:rgba(180,35,24,.4)}.queue-state-pills .pill-completed{color:#2f7a44;border-color:rgba(47,122,68,.3)}.queue-state-pills .pill-waiting{color:var(--ink-soft)}.queue-state-pills .pill-delayed{color:var(--ink-muted)}.admin-summary{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 12px;font-size:13px}.admin-summary .summary-total{font-family:var(--font-serif);font-size:1.05rem;color:var(--color);margin-right:8px}.admin-summary .summary-meta{color:var(--ink-muted);font-size:12px;margin-right:8px}.admin-summary .summary-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;border:1px solid var(--border-color);background:var(--paper-card);color:var(--ink-muted);cursor:pointer;font-size:12px;user-select:none;transition:background-color .1s,border-color .1s}.admin-summary .summary-pill:hover{background:var(--hover-bg-color)}.admin-summary .summary-pill .count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color)}.admin-summary .summary-pill.active{background:var(--primary-bg);color:var(--primary-color);border-color:var(--primary-bg)}.admin-summary .summary-pill.active .count{color:inherit}.admin-summary .summary-pill.error .count{color:#b42318}.admin-summary .summary-pill.warn .count{color:#c48a2e}.admin-summary .summary-pill.ok .count{color:#2f7a44}.dark-mode .admin-summary .summary-pill.error .count{color:#f08a82}.dark-mode .admin-summary .summary-pill.warn .count{color:#e8b970}.dark-mode .admin-summary .summary-pill.ok .count{color:#7dc894}.dark-mode .queue-state-pills .pill-active{color:#e8b970;border-color:rgba(232,185,112,.4)}.dark-mode .queue-state-pills .pill-failed{color:#f08a82;border-color:rgba(240,138,130,.4)}.dark-mode .queue-state-pills .pill-completed{color:#7dc894;border-color:rgba(125,200,148,.3)}.job-progress{flex:1;height:6px;background:var(--border-soft,var(--border-color));border-radius:999px;overflow:hidden;margin-left:12px;max-width:200px}.job-progress-bar{height:100%;background:#2f7a44;transition:width .3s}.paper-table-empty{padding:48px 4px;text-align:center;color:var(--ink-muted);display:flex;flex-direction:column;align-items:center;gap:8px;border-top:1px solid var(--border-soft,var(--border-color))}.paper-table-empty>i{font-size:1.6rem}.q-header{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:4px}.q-header-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.q-range-btns{display:inline-flex;border:1px solid var(--border-color);border-radius:8px;overflow:hidden}.q-range-btns .btn{border:none;border-radius:0;padding:5px 14px;font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);background:var(--paper-card)}.q-range-btns .btn+.btn{border-left:1px solid var(--border-color)}.q-range-btns .btn.active{background:var(--color);color:var(--paper-card)}.btn-dark{background:var(--color)!important;color:var(--paper-card)!important;border-color:var(--color)!important;border-radius:999px;padding:5px 18px;font-family:var(--font-mono);font-size:11px;font-weight:500;letter-spacing:.04em}.q-cards{display:flex;gap:10px;margin:16px 0;flex-wrap:wrap}.q-card{flex:1;min-width:140px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:14px 16px;cursor:pointer;transition:border-color .15s,box-shadow .15s}.q-card:hover{border-color:var(--ink-muted)}.q-card.selected{border-color:var(--color);box-shadow:0 0 0 1px var(--color)}.q-card-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}.q-dot{width:8px;height:8px;border-radius:50%;background:#2f7a44;flex-shrink:0}.q-dot-red{background:#b42318}.dark-mode .q-dot{background:#7dc894}.dark-mode .q-dot-red{background:#f08a82}.q-card-name{font-family:var(--font-mono);font-size:11.5px;font-weight:500;color:var(--ink-muted);letter-spacing:.04em}.q-card-count{font-family:var(--font-serif);font-size:2rem;font-weight:400;line-height:1.1;color:var(--color);margin-bottom:6px}.q-card-sub{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);letter-spacing:.04em}.q-card-bar{height:4px;background:var(--border-color);border-radius:2px;overflow:hidden;margin-top:6px}.q-card-bar-fill{height:100%;background:#3b4ad6;border-radius:2px;transition:width .3s}.dark-mode .q-card-bar-fill{background:#a7b2ff}.q-detail{display:grid;grid-template-columns:1fr 320px;gap:16px;margin-bottom:20px}.q-throughput{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 20px}.q-chart-wrap{position:relative}.q-throughput canvas{width:100%;display:block}.q-chart-tooltip{position:absolute;pointer-events:none;background:var(--paper-card);border:1px solid var(--border-color);border-radius:6px;padding:6px 10px;font-family:var(--font-mono);font-size:11px;line-height:1.6;white-space:nowrap;box-shadow:0 2px 8px rgba(0,0,0,.15);z-index:10}.q-chart-tooltip .q-tip-time{color:var(--ink-muted);margin-bottom:2px}.q-chart-tooltip .q-tip-completed{color:#3b4ad6}.q-chart-tooltip .q-tip-failed{color:#b42318}.dark-mode .q-chart-tooltip .q-tip-completed{color:#a7b2ff}.dark-mode .q-chart-tooltip .q-tip-failed{color:#f08a82}.q-chart-crosshair{position:absolute;top:0;width:1px;height:100%;background:var(--ink-muted);opacity:.3;pointer-events:none;z-index:9}.q-stats-panel{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 20px;display:flex;flex-direction:column}.q-section-label{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--ink-muted);text-transform:lowercase;letter-spacing:.04em;margin-bottom:14px}.q-section-right{float:right;text-transform:uppercase;font-size:10px;letter-spacing:.08em}.q-legend-completed{color:#3b4ad6}.q-legend-failed{color:#b42318;margin-left:8px}.q-legend-exec{color:#b8860b;margin-left:8px;letter-spacing:2px}.dark-mode .q-legend-completed{color:#a7b2ff}.dark-mode .q-legend-failed{color:#f08a82}.dark-mode .q-legend-exec{color:#f5c842}.q-chart-tooltip .q-tip-exec{color:#b8860b}.dark-mode .q-chart-tooltip .q-tip-exec{color:#f5c842}.q-stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 20px;flex:1}.q-stat-label{font-family:var(--font-mono);font-size:9.5px;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:2px}.q-stat-value{font-family:var(--font-serif);font-size:1.3rem;font-weight:400;color:var(--color);line-height:1.2}.q-stats-actions{display:flex;gap:8px;margin-top:16px;padding-top:14px;border-top:1px solid var(--border-color)}.q-stats-actions .btn{font-family:var(--font-mono);font-size:11px;padding:6px 14px;border-radius:8px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color)}.q-jobs{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 20px}.q-jobs-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-bottom:12px}.q-state-filters{display:inline-flex;gap:6px;flex-wrap:wrap}.q-state-toggle{cursor:pointer;display:inline-flex;align-items:center}.q-state-toggle input{display:none}.q-state-chip{font-family:var(--font-mono);font-size:11px;padding:3px 10px;border-radius:10px;border:1px solid var(--border-color);background:var(--paper-card);color:var(--ink-muted);transition:opacity .15s,background .15s;text-transform:capitalize}.q-state-toggle input:checked+.q-state-chip{opacity:1}.q-state-toggle input:not(:checked)+.q-state-chip{opacity:.4;text-decoration:line-through}.q-state-badge,.q-state-chip{font-family:var(--font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.3px}.q-state-badge{display:inline-block;padding:2px 8px;border-radius:8px}.q-state-active{background:#dbeafe;color:#1d4ed8}.q-state-waiting{background:#fef3c7;color:#92400e}.q-state-delayed{background:#e0e7ff;color:#4338ca}.q-state-failed{background:#fee2e2;color:#b91c1c}.q-state-completed{background:#dcfce7;color:#166534}.dark-mode .q-state-active{background:rgba(59,130,246,.2);color:#93bbfd}.dark-mode .q-state-waiting{background:rgba(251,191,36,.15);color:#fbbf24}.dark-mode .q-state-delayed{background:rgba(99,102,241,.2);color:#a5b4fc}.dark-mode .q-state-failed{background:rgba(239,68,68,.2);color:#fca5a5}.dark-mode .q-state-completed{background:rgba(34,197,94,.15);color:#86efac}.q-cell-state{width:120px}.q-delay-hint{display:block;font-size:10px;color:var(--ink-muted);margin-top:2px;font-family:var(--font-mono)}.q-search-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}.q-search-row .form-control{max-width:320px;height:34px}.q-auto-refresh{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);display:inline-flex;align-items:center;gap:6px;cursor:pointer;white-space:nowrap}.q-table{width:100%;border-collapse:collapse}.q-table thead th{font-family:var(--font-mono);font-size:9.5px;font-weight:500;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;padding:8px 10px;border-bottom:1px solid var(--border-color);text-align:left;white-space:nowrap}.q-table tbody tr{border-bottom:1px solid var(--border-color);transition:background .1s}.q-table tbody tr:hover{background:var(--paper-bg-alt)}.q-table tbody tr:last-child{border-bottom:none}.q-table tbody td{padding:10px 10px;font-size:.88rem;vertical-align:middle}.q-cell-id{font-family:var(--font-mono);font-size:12px;white-space:nowrap}.q-cell-id{display:flex;align-items:center;gap:8px}.q-chevron{font-size:9px;color:var(--ink-muted);transition:transform .15s;flex-shrink:0}.q-chevron-open{transform:rotate(90deg)}.q-cell-id a{color:var(--color)}.q-cell-payload{font-family:var(--font-mono);font-size:12px;color:var(--color)}.q-payload-detail{color:var(--ink-muted)}.q-cell-num{font-family:var(--font-mono);font-size:12px;text-align:center;white-space:nowrap}.q-cell-progress{min-width:120px}.q-progress-wrap{display:flex;align-items:center;gap:8px}.q-progress-bar{flex:1;height:6px;border-radius:3px;overflow:hidden;background-image:linear-gradient(to right,#3b4ad6 var(--pct,0),var(--border-color) var(--pct,0))}.dark-mode .q-progress-bar{background-image:linear-gradient(to right,#a7b2ff var(--pct,0),var(--border-color) var(--pct,0))}.q-progress-label{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);white-space:nowrap;min-width:32px;text-align:right}.q-cell-actions{text-align:right;white-space:nowrap}.q-cell-actions .btn{padding:3px 8px;font-size:11px;background:0 0;border:1px solid var(--border-color);color:var(--ink-muted)}.q-cell-actions .btn:hover{color:var(--color)}.q-row-failed{background:rgba(180,35,24,.04)}.dark-mode .q-row-failed{background:rgba(240,138,130,.06)}.q-error-detail{padding:4px 10px 12px;font-size:12px}.q-error-reason{color:#b42318;font-size:.82rem;margin-bottom:4px}.dark-mode .q-error-reason{color:#f08a82}.q-toast-error{background:#fbe7e7;color:#b42318;border:1px solid #f3c7c7;border-radius:8px;padding:10px 16px;margin-bottom:12px;font-family:var(--font-mono);font-size:12px;cursor:pointer;display:flex;align-items:center;gap:8px}.dark-mode .q-toast-error{background:rgba(240,138,130,.1);color:#f08a82;border-color:rgba(240,138,130,.25)}.q-error-stack{font-size:.78rem;max-height:120px;overflow:auto;margin:4px 0 0;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:6px;padding:8px 10px}.q-row-expanded>td{border-bottom-color:transparent}.q-detail-row>td{padding:0 10px 14px!important;border-bottom:1px solid var(--border-color)}.q-job-detail{background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:8px;padding:14px 16px}.q-job-detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px 20px;margin-bottom:10px}.q-job-detail-item{display:flex;flex-direction:column;gap:2px}.q-job-detail-label{font-family:var(--font-mono);font-size:9px;font-weight:500;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em}.q-job-detail-value{font-family:var(--font-mono);font-size:12px;color:var(--color);word-break:break-all}.q-job-detail-value a{color:var(--color)}.q-job-detail-error{margin:8px 0}.q-job-detail-actions{display:flex;gap:8px;margin-top:12px;padding-top:10px;border-top:1px solid var(--border-color)}.q-job-detail-actions .btn{font-family:var(--font-mono);font-size:11px;padding:5px 12px;border-radius:6px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color)}@media (max-width:900px){.q-detail{grid-template-columns:1fr}.q-cards{flex-direction:column}.q-card{min-width:100%}.q-jobs-header{flex-direction:column;align-items:flex-start}.q-tabs{flex-wrap:wrap}.q-search-row{flex-wrap:wrap}.q-search-row .form-control{max-width:100%;flex:1}.q-table{font-size:12px}.q-header{flex-direction:column}.q-job-detail-grid{grid-template-columns:1fr 1fr}}@media (max-width:900px){.paper-table .paper-table-head{display:none}.paper-table .admin-users-row,.paper-table .paper-table-row,.paper-table.paper-table-conferences .paper-table-row,.paper-table.paper-table-repos .paper-table-row{display:flex!important;flex-wrap:wrap;align-items:center;gap:6px 12px;padding:14px 0;grid-template-columns:none!important}.paper-table .cell-anon{flex:1 1 calc(100% - 52px);min-width:0;order:1}.paper-table .cell-actions{flex:0 0 auto;order:2;align-self:center}.paper-table .cell-conf,.paper-table .cell-expires,.paper-table .cell-status,.paper-table .cell-views{order:3;font-size:13px;color:var(--ink-muted);display:inline-flex;align-items:center;gap:6px;text-align:left}.paper-table .cell-status{flex-wrap:nowrap;gap:6px;min-width:0}.paper-table .cell-status .status-sub{flex-basis:auto;font-size:13px;line-height:inherit}.paper-table .cell-status .status-sub::before{content:"·";margin-right:6px;color:var(--ink-faint)}.paper-table .cell-conf{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-views.num{text-align:left}.paper-table .paper-table-skeleton .cell-expires,.paper-table .paper-table-skeleton .cell-status,.paper-table .paper-table-skeleton .cell-views{flex:1 1 30%}.paper-table .cell-views::before{content:'\f06e';font-family:'Font Awesome 5 Free';font-weight:900;font-size:10px;color:var(--ink-muted)}.paper-table .cell-expires::before{content:'\f017';font-family:'Font Awesome 5 Free';font-weight:400;font-size:10px;color:var(--ink-muted)}.paper-table .cell-conf::before{content:'\f51c';font-family:'Font Awesome 5 Free';font-weight:900;font-size:10px;color:var(--ink-muted)}.paper-table-dashboard .cell-conf::before{content:none}.paper-table .cell-conf:has(.empty-dash),.paper-table .cell-expires:has(.empty-dash){display:none}.paper-table .cell-expires::before,.paper-table .cell-views::before{color:var(--ink-faint)}}.paper-page .dropdown-menu{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface,10px);box-shadow:0 12px 28px rgba(26,24,21,.08);padding:6px;min-width:220px;font-family:var(--font-sans);font-size:14px;color:var(--color);margin-top:6px}.paper-page .dropdown-menu .dropdown-header{font-family:var(--font-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);padding:8px 10px 6px;font-weight:500}.paper-page .dropdown-menu .dropdown-item{border-radius:6px;padding:8px 10px;color:var(--color);font-size:14px;display:flex;align-items:center;gap:8px}.paper-page .dropdown-menu .dropdown-item:focus,.paper-page .dropdown-menu .dropdown-item:hover{background:var(--hover-bg-color);color:var(--color)}.paper-page .dropdown-menu .dropdown-item i{width:16px;font-size:13px;color:var(--ink-muted)}.paper-page .dropdown-menu .form-check.dropdown-item{padding:8px 10px 8px 36px!important;position:relative}.paper-page .dropdown-menu .form-check.dropdown-item .form-check-input{position:absolute;left:12px;top:50%;transform:translateY(-50%);margin:0;width:16px;height:16px;accent-color:var(--color);cursor:pointer}.paper-page .dropdown-menu .form-check.dropdown-item .form-check-label{font-family:var(--font-sans);font-size:14px;color:var(--color);font-weight:400;margin:0;cursor:pointer}.btn.btn-icon-dots{width:32px;height:32px;padding:0;border:1px solid transparent;background:0 0;color:var(--ink-muted);border-radius:6px;display:inline-flex;align-items:center;justify-content:center;line-height:1}.btn.btn-icon-dots:focus,.btn.btn-icon-dots:hover,.btn.btn-icon-dots[aria-expanded=true]{background:var(--hover-bg-color);border-color:var(--border-color);color:var(--color)}.btn.btn-icon-dots::after{display:none}.btn.btn-icon-dots i{font-size:15px}.paper-page .repo-list-empty{border-top:none;padding:56px 20px;color:var(--ink-muted)}.paper-page .filter-chip{background:var(--paper-bg-alt);color:var(--color);border:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;padding:4px 10px;border-radius:999px}@media (max-width:768px){.paper-page .paper-page-title{font-size:clamp(1.4rem,6vw,1.9rem);margin:4px 0 2px}.paper-page .paper-page-lede{font-size:13px;line-height:1.4;margin-bottom:0}.paper-page .btn-ink{padding:6px 12px;font-size:13px}.paper-page .quota-row{grid-template-columns:1fr;gap:12px;padding:0;margin:16px 0 0}.paper-page .dashboard-filter-row{padding:10px 0;margin-top:12px;gap:8px}.paper-page .quota-header{flex-direction:row;align-items:baseline;gap:8px}.paper-page .quota-value{white-space:nowrap}.paper-page .dashboard-filter-controls{width:100%}.paper-page .dashboard-filter-controls .btn-group{flex:1 1 100%;display:flex}.paper-page .dashboard-filter-controls .btn-group .btn{flex:1;justify-content:center}.paper-page .dashboard-filter-controls .dropdown{flex:1 1 0;min-width:0}.paper-page .dashboard-filter-controls .dropdown .dropdown-toggle{width:100%;justify-content:space-between}.paper-page .dashboard-filter-controls .dropdown .filter-btn-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media (max-width:480px){.paper-page .paper-page-lede{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}}.empty-state{text-align:center;padding:40px 20px;opacity:.6}.empty-state i{font-size:2rem;margin-bottom:10px;display:block}.paper-page .progress{height:10px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:999px;overflow:hidden;margin-bottom:20px}.paper-page .progress .progress-bar{background:var(--color);color:var(--canvas-bg-color);font-family:var(--font-mono);font-size:10px;line-height:10px}.paper-page .progress .progress-bar.bg-success{background:var(--status-ready)!important}.paper-page .progress .progress-bar.bg-warning{background:var(--status-progress)!important;color:#fff}.paper-page .progress .progress-bar.bg-danger{background:var(--status-error)!important}.paper-page .progress .progress-bar.bg-dark{background:var(--ink-faint)!important}.paper-page .form>h5,.paper-page form>h5,.paper-page>h5{font-family:var(--font-mono);font-size:11px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-muted);margin:24px 0 8px}.paper-page .accordion .card{background:var(--paper-card,var(--sidebar-bg-color));border:1px solid var(--border-color);border-radius:8px!important;margin-bottom:8px;overflow:hidden}.paper-page .accordion .card+.card{border-top:1px solid var(--border-color)}.paper-page .accordion .card-header{background:0 0;border:none;padding:0}.paper-page .accordion .card-header .btn{color:var(--color)!important;font-family:var(--font-sans);font-weight:500;font-size:14px;padding:14px 18px!important;background:0 0!important;border:none!important;position:relative}.paper-page .accordion .card-header .btn::after{content:"+";position:absolute;right:18px;font-family:var(--font-serif);font-size:20px;color:var(--ink-muted)}.paper-page .accordion .card-header .btn:not(.collapsed)::after{content:"–"}.paper-page .accordion .card-body{padding:6px 18px 18px!important;border-top:1px solid var(--border-soft)}.paper-page .accordion .form-check-label{color:var(--color);font-weight:500;font-size:13.5px}.paper-page .accordion .form-text{color:var(--ink-muted);font-size:12px;margin-top:2px}.faq-section .panel-body code{font-family:var(--font-mono);font-size:13px;padding:1px 6px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:3px;color:var(--color)}.faq-section .panel-body a{color:var(--accent)}@media (max-width:820px){.paper-faq-body{grid-template-columns:1fr;gap:24px}.paper-faq-toc{position:static}}.paper-footer{margin-top:80px;padding:56px max(20px,calc((100vw - 1200px)/ 2)) 28px;border-top:1px solid var(--border-color);background:var(--canvas-bg-color);font-family:var(--font-sans)}.paper-footer-inner{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:40px}.paper-footer-brand .paper-footer-mark{font-family:var(--font-serif);font-size:22px;letter-spacing:-.01em;color:var(--color)}.paper-footer-brand .paper-footer-mark em{font-style:italic;font-weight:400}.paper-footer-tag{margin-top:10px;color:var(--ink-soft);font-size:13.5px;line-height:1.55;max-width:340px}.paper-footer-head{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);letter-spacing:.1em;text-transform:uppercase;margin-bottom:14px}.paper-footer-col a{display:block;color:var(--color);font-size:13.5px;padding:4px 0;text-decoration:none}.paper-footer-col a:hover{color:var(--accent)}.paper-footer-rule{height:1px;background:var(--border-color);margin:40px 0 16px}.paper-footer-foot{display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--ink-muted);font-family:var(--font-mono);letter-spacing:.02em}.paper-footer-foot .paper-footer-meta{font-family:var(--font-serif);font-style:italic;font-size:13.5px;letter-spacing:0;color:var(--ink-soft)}@media (max-width:768px){.paper-footer-inner{grid-template-columns:1fr 1fr}}.file.folder.truncated .truncated-warning{color:#d39e00;margin-left:4px;font-size:.85em;flex-shrink:0}.file.folder.truncated>a{color:#d39e00}body{--bucket-error-bg:#FCEDED;--bucket-error-fg:#8A1F1F;--bucket-error-bd:#F0C4C4;--bucket-error-dot:#B53737;--bucket-warn-bg:#FFF3DF;--bucket-warn-fg:#7A4D00;--bucket-warn-bd:#F0D8A0;--bucket-warn-dot:#B07A2F;--bucket-info-bg:#EAF2EC;--bucket-info-fg:#2C5D3A;--bucket-info-bd:#C5DCCD;--bucket-info-dot:#5B8D6B;--card-shadow:0 1px 2px rgba(26, 24, 21, 0.04),0 4px 14px rgba(26, 24, 21, 0.05);--card-shadow-hover:0 1px 2px rgba(26, 24, 21, 0.06),0 8px 24px rgba(26, 24, 21, 0.08)}.dark-mode{--bucket-error-bg:rgba(255, 139, 123, 0.10);--bucket-error-fg:#FF8B7B;--bucket-error-bd:rgba(255, 139, 123, 0.28);--bucket-error-dot:#FF8B7B;--bucket-warn-bg:rgba(255, 211, 122, 0.10);--bucket-warn-fg:#FFD37A;--bucket-warn-bd:rgba(255, 211, 122, 0.28);--bucket-warn-dot:#FFD37A;--bucket-info-bg:rgba(152, 200, 168, 0.10);--bucket-info-fg:#98C8A8;--bucket-info-bd:rgba(152, 200, 168, 0.28);--bucket-info-dot:#98C8A8;--card-shadow:0 1px 2px rgba(0, 0, 0, 0.35),0 6px 18px rgba(0, 0, 0, 0.30);--card-shadow-hover:0 2px 4px rgba(0, 0, 0, 0.45),0 12px 28px rgba(0, 0, 0, 0.40)}.errors-page .errors-header{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:4px 0 8px}.errors-page .errors-actions{display:flex;gap:6px}.errors-page .kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin:14px 0 18px}.errors-page .kpi-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px 20px;display:flex;flex-direction:column;gap:4px;box-shadow:var(--card-shadow);transition:box-shadow 160ms ease,transform 160ms ease}.errors-page .kpi-card:hover{box-shadow:var(--card-shadow-hover)}.errors-page .kpi-label{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted)}.errors-page .kpi-value{font-family:var(--font-serif);font-size:2.6rem;font-weight:400;line-height:1;margin-top:2px;color:var(--color)}.errors-page .kpi-card.kpi-error .kpi-value{color:var(--bucket-error-fg)}.errors-page .kpi-card.kpi-warn .kpi-value{color:var(--bucket-warn-fg)}.errors-page .kpi-card.kpi-info .kpi-value{color:var(--bucket-info-fg)}.errors-page .kpi-sub{font-size:.78rem;color:var(--ink-muted);font-style:italic}.errors-page .kpi-sub.up{color:var(--bucket-error-fg);font-style:normal}.errors-page .kpi-sub.down{color:var(--bucket-info-fg);font-style:normal}.errors-page .dropped-warn{color:var(--bucket-error-fg);font-weight:600;font-style:normal}.errors-page .volume-chart{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;margin-bottom:18px;box-shadow:var(--card-shadow)}.errors-page .volume-head{display:flex;justify-content:space-between;align-items:center;font-family:var(--font-mono);font-size:.7rem;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}.errors-page .volume-legend{display:flex;gap:14px;align-items:center;text-transform:none;letter-spacing:0;font-family:var(--font-sans)}.errors-page .volume-legend .dot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:middle}.errors-page .dot.dot-error{background:var(--bucket-error-dot)}.errors-page .dot.dot-warn{background:var(--bucket-warn-dot)}.errors-page .dot.dot-info{background:var(--bucket-info-dot)}.errors-page .volume-bars{display:flex;align-items:flex-end;gap:4px;height:80px}.errors-page .volume-bar{display:flex;flex-direction:column-reverse;flex:1 1 0;min-width:6px;height:100%}.errors-page .volume-bar .seg{display:block;width:100%}.errors-page .seg.seg-error{background:var(--bucket-error-dot)}.errors-page .seg.seg-warn{background:var(--bucket-warn-dot)}.errors-page .seg.seg-info{background:var(--bucket-info-dot);opacity:.7}.errors-page .errors-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}.errors-page .seg-tabs{display:inline-flex;border:1px solid var(--border-color);border-radius:8px;overflow:hidden;background:var(--paper-card)}.errors-page .seg-tabs button{background:0 0;border:none;padding:6px 14px;font-size:.85rem;cursor:pointer;color:var(--color);font-family:var(--font-sans)}.errors-page .seg-tabs button+button{border-left:1px solid var(--border-color)}.errors-page .seg-tabs button.active{background:var(--primary-bg);color:var(--primary-color)}.errors-page .errors-toolbar .search-wrap{position:relative;flex:1 1 320px;min-width:220px}.errors-page .errors-toolbar .search-wrap input{width:100%;padding:6px 10px 6px 32px;border:1px solid var(--border-color);border-radius:8px;font-family:var(--font-mono);font-size:.82rem;background:var(--input-bg);color:var(--input-color)}.errors-page .errors-toolbar .search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--ink-muted);font-size:.85rem}.errors-page .errors-toolbar .filter-count{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:.72rem;color:var(--ink-muted)}.errors-page .errors-toolbar .select-wrap{display:inline-flex;align-items:center;gap:6px}.errors-page .errors-toolbar .select-wrap label{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);margin:0}.errors-page .errors-toolbar .select-wrap select{background:var(--input-bg);color:var(--input-color);border:1px solid var(--border-color);border-radius:8px}.errors-page .errors-toolbar .autoref{display:inline-flex;gap:6px;align-items:center;font-size:.82rem;color:var(--color);cursor:pointer;margin:0}.errors-page .btn-icon{width:32px;padding:4px 0}.errors-page .errors-list{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;overflow:hidden;box-shadow:var(--card-shadow)}.errors-page .errors-list-head,.errors-page .errors-row-main{display:grid;grid-template-columns:110px 100px 100px 1fr 60px 70px;gap:16px;padding:18px 20px;align-items:start}.errors-page .errors-list-head{padding:12px 20px;align-items:center}.errors-page .errors-list-head{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);border-bottom:1px solid var(--border-color);background:var(--paper-bg-alt)}.errors-page .errors-row{border-bottom:1px solid var(--border-soft)}.errors-page .errors-row:last-child{border-bottom:none}.errors-page .errors-row.open{background:var(--paper-bg-alt)}.errors-page .errors-row-main{cursor:pointer}.errors-page .errors-row-main:hover{background:var(--hover-bg-color)}.errors-page .col-when .when-rel{font-size:.95rem;color:var(--color);font-variant-numeric:tabular-nums}.errors-page .col-when .when-abs{font-family:var(--font-mono);font-size:.78rem;color:var(--ink-muted);font-variant-numeric:tabular-nums;margin-top:2px}.errors-page .col-sev{display:flex;align-items:center;gap:8px}.errors-page .sev-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.errors-page .sev-dot.sev-error{background:var(--bucket-error-dot)}.errors-page .sev-dot.sev-warn{background:var(--bucket-warn-dot)}.errors-page .sev-dot.sev-info{background:var(--bucket-info-dot)}.errors-page .sev-label{font-family:var(--font-mono);font-size:.74rem;letter-spacing:.08em;color:var(--color)}.errors-page .pill-module{display:inline-block;font-family:var(--font-mono);font-size:.78rem;background:var(--paper-bg-alt);color:var(--ink-soft);border:1px solid var(--border-color);padding:3px 10px;border-radius:6px}.errors-page .col-msg .msg-code{font-family:var(--font-mono);font-size:1rem;color:var(--color);font-weight:600}.errors-page .col-msg .msg-context{color:var(--ink-muted);font-style:italic;font-size:.88rem;margin-left:10px}.errors-page .col-msg .msg-detail{color:var(--ink-soft);font-family:var(--font-mono);font-size:.82rem;margin-left:10px}.errors-page .col-msg .msg-url{color:var(--ink-muted);font-family:var(--font-mono);font-size:.8rem;margin-top:6px;word-break:break-all}.errors-page .count-pill{display:inline-block;padding:2px 8px;border-radius:4px;background:var(--primary-bg);color:var(--primary-color);font-family:var(--font-mono);font-size:.78rem;font-variant-numeric:tabular-nums}.errors-page .count-pill.count-pill-muted{background:0 0;color:var(--ink-muted);border:1px solid var(--border-color)}.errors-page .status-pill{display:inline-block;padding:2px 10px;border-radius:4px;font-family:var(--font-mono);font-size:.8rem;font-variant-numeric:tabular-nums;border:1px solid transparent}.errors-page .status-pill.status-error{background:var(--bucket-error-bg);color:var(--bucket-error-fg);border-color:var(--bucket-error-bd)}.errors-page .status-pill.status-warn{background:var(--bucket-warn-bg);color:var(--bucket-warn-fg);border-color:var(--bucket-warn-bd)}.errors-page .status-pill.status-info{background:var(--bucket-info-bg);color:var(--bucket-info-fg);border-color:var(--bucket-info-bd)}.errors-page .errors-row-detail{padding:0 16px 16px}.errors-page .detail-tabs{display:flex;gap:4px;border-bottom:1px solid var(--border-color);margin-bottom:12px}.errors-page .detail-tabs button{background:0 0;border:0;border-bottom:2px solid transparent;padding:8px 12px;font-size:.85rem;cursor:pointer;color:var(--ink-muted);font-family:var(--font-sans)}.errors-page .detail-tabs button.active{color:var(--color);border-bottom-color:var(--color)}.errors-page .detail-body{display:grid;grid-template-columns:1fr 260px;gap:20px}.errors-page .detail-main pre{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;font-family:var(--font-mono);font-size:.85rem;line-height:1.7;color:var(--color);max-height:26em;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;margin:0;box-shadow:var(--card-shadow)}.errors-page .related-list{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;max-height:22em;overflow:auto;box-shadow:var(--card-shadow)}.errors-page .stack-pre{line-height:1.45;white-space:pre;overflow-x:auto}.errors-page .related-row{display:flex;gap:10px;padding:6px 12px;align-items:center;border-bottom:1px solid var(--border-soft);font-size:.8rem}.errors-page .related-row:last-child{border-bottom:none}.errors-page .detail-actions{display:flex;gap:6px;align-items:center;margin-top:10px}.errors-page .copy-hint{font-size:.78rem;color:var(--bucket-info-fg)}.errors-page .detail-aside{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px;box-shadow:var(--card-shadow)}.errors-page .aside-block+.aside-block{margin-top:16px}.errors-page .aside-label{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);margin-bottom:4px}.errors-page .aside-value{font-family:var(--font-serif);font-size:1.05rem;color:var(--color);word-break:break-word;line-height:1.3}.errors-page .aside-value.mono{font-family:var(--font-mono);font-size:.82rem}.errors-page .aside-sub{color:var(--ink-muted);font-style:italic;font-size:.8rem;font-family:var(--font-sans)}.errors-page .errors-pager{display:flex;justify-content:space-between;align-items:center;padding:10px 0;color:var(--ink-muted);font-size:.85rem}@media (max-width:720px){.errors-page .errors-list-head,.errors-page .errors-row-main{grid-template-columns:80px 80px 1fr 60px}.errors-page .errors-list-head .col-mod,.errors-page .errors-list-head .col-sev,.errors-page .errors-row-main .col-mod,.errors-page .errors-row-main .col-sev{display:none}.errors-page .detail-body{grid-template-columns:1fr}}.overview-page .ov-header{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:2px}.overview-page .ov-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-left:6px;vertical-align:middle}.overview-page .ov-dot-ok{background:#2f7a44}.overview-page .ov-dot-warn{background:#c48a2e}.overview-page .ov-dot-idle{background:var(--ink-muted)}.dark-mode .overview-page .ov-dot-ok{background:#7dc894}.dark-mode .overview-page .ov-dot-warn{background:#e8b970}.overview-page .ov-kpi-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;margin:16px 0 22px}.overview-page .ov-kpi-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;display:flex;flex-direction:column;gap:4px;box-shadow:var(--card-shadow);transition:box-shadow 160ms ease}.overview-page .ov-kpi-card:hover{box-shadow:var(--card-shadow-hover)}.overview-page .ov-kpi-label{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted)}.overview-page .ov-kpi-value{font-family:var(--font-serif);font-size:2.6rem;font-weight:400;line-height:1;margin-top:2px;color:var(--color)}.overview-page .ov-kpi-value.ov-val-warn{color:#b42318}.dark-mode .overview-page .ov-kpi-value.ov-val-warn{color:#f08a82}.overview-page .ov-kpi-sub{font-size:.76rem;color:var(--ink-muted);margin-top:2px}.overview-page .ov-daily-row{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:-4px 0 22px}.overview-page .ov-daily-card{background:var(--primary-bg);border:1px solid var(--border-color);border-radius:12px;padding:16px 20px;box-shadow:var(--card-shadow)}.overview-page .ov-daily-label{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted)}.overview-page .ov-daily-value{font-family:var(--font-serif);font-size:2.35rem;font-weight:400;line-height:1;color:var(--accent,#3b4ad6);margin-top:6px}.overview-page .ov-daily-sub{font-size:.76rem;color:var(--ink-muted);margin-top:5px}.dark-mode .overview-page .ov-daily-card{background:var(--paper-card)}.dark-mode .overview-page .ov-daily-value{color:#a7b2ff}.overview-page .ov-chart-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-bottom:18px}.overview-page .ov-chart-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px 14px;box-shadow:var(--card-shadow)}.overview-page .ov-chart-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}.overview-page .ov-chart-title{font-family:var(--font-serif);font-size:1.05rem}.overview-page .ov-chart-legend{font-family:var(--font-mono);font-size:.7rem;color:var(--ink-muted);display:flex;align-items:center;gap:5px}.overview-page .ov-dot-legend{display:inline-block;width:8px;height:8px;border-radius:50%}.overview-page .ov-dot-accent{background:var(--accent,#3b4ad6)}.overview-page .ov-dot-ok-fill{background:#2f7a44}.overview-page .ov-dot-user-fill{background:#8b5e2e}.overview-page .ov-dot-new-user-fill{background:#c48a2e}.dark-mode .overview-page .ov-dot-ok-fill{background:#7dc894}.dark-mode .overview-page .ov-dot-user-fill{background:#d0a15f}.dark-mode .overview-page .ov-dot-new-user-fill{background:#e8b970}.overview-page .ov-spark-bars{display:flex;align-items:flex-end;gap:3px;height:140px}.overview-page .ov-spark-col{flex:1;display:flex;align-items:flex-end;height:100%;position:relative}.overview-page .ov-spark-fill{width:100%;background:var(--accent,#3b4ad6);border-radius:2px 2px 0 0;transition:height .3s ease;opacity:.55}.overview-page .ov-spark-fill-alt{background:#2f7a44}.overview-page .ov-spark-fill-user{background:#8b5e2e}.overview-page .ov-spark-fill-new-user{background:#c48a2e}.dark-mode .overview-page .ov-spark-fill-alt{background:#7dc894}.dark-mode .overview-page .ov-spark-fill-user{background:#d0a15f}.dark-mode .overview-page .ov-spark-fill-new-user{background:#e8b970}.overview-page .ov-spark-col:hover .ov-spark-fill{opacity:1}.overview-page .ov-spark-col.has-tip::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 10px);transform:translateX(-50%) translateY(4px);z-index:10;padding:6px 8px;border-radius:6px;background:var(--color);color:var(--canvas-bg-color);font-family:var(--font-mono);font-size:.68rem;line-height:1;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity 120ms ease,transform 120ms ease}.overview-page .ov-spark-col.has-tip::before{content:"";position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%) translateY(4px);z-index:10;border:5px solid transparent;border-top-color:var(--color);opacity:0;pointer-events:none;transition:opacity 120ms ease,transform 120ms ease}.overview-page .ov-spark-col.has-tip:hover::after,.overview-page .ov-spark-col.has-tip:hover::before{opacity:1;transform:translateX(-50%) translateY(0)}.overview-page .ov-spark-x{display:flex;justify-content:space-between;font-family:var(--font-mono);font-size:.66rem;color:var(--ink-muted);margin-top:6px}.overview-page .ov-triple-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px;margin-bottom:18px}.overview-page .ov-panel-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 20px;box-shadow:var(--card-shadow)}.overview-page .ov-panel-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:14px}.overview-page .ov-panel-title{font-family:var(--font-serif);font-size:1.05rem}.overview-page .ov-panel-meta{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted)}.overview-page .ov-panel-foot{margin-top:12px;padding-top:10px;border-top:1px solid var(--border-color);font-size:.82rem}.overview-page .ov-panel-foot a{color:var(--link-color);text-decoration:none}.overview-page .ov-panel-foot a:hover{text-decoration:underline}.overview-page .ov-performance{min-width:0;margin:22px 0}.overview-page .ov-performance-head{align-items:center;flex-wrap:wrap;gap:12px 20px}.overview-page .ov-performance-head h2{margin:0 0 4px}.overview-page .ov-performance-note{margin:0 0 12px;font-size:12px;line-height:1.5;color:var(--ink-muted)}.overview-page .ov-performance-head .ov-performance-note{margin:0}.overview-page .ov-performance-window{display:flex;align-items:center;gap:8px;flex-shrink:0}.overview-page .ov-performance-window label{margin:0;font-size:12px;color:var(--ink-muted)}.overview-page .ov-performance-window select{width:auto}.overview-page .ov-performance-tabs{margin:0 0 16px;gap:4px}.overview-page .ov-performance-tabs .paper-tab{white-space:nowrap}.overview-page .ov-metrics-scroll{max-width:100%;overflow-x:auto;border:1px solid var(--border-color);border-radius:var(--radius-control,8px)}.overview-page .ov-metrics-table{width:100%;border-collapse:collapse;color:var(--color);font-size:13px;line-height:1.5;font-variant-numeric:tabular-nums}.overview-page .ov-metrics-table td,.overview-page .ov-metrics-table th{padding:10px 12px;border-bottom:1px solid var(--border-color);vertical-align:middle;white-space:nowrap}.overview-page .ov-metrics-table thead th{background:var(--paper-bg-alt);color:var(--ink-muted);font-size:12px;font-weight:500}.overview-page .ov-metrics-table .num{text-align:right}.overview-page .ov-metrics-table tr:last-child>*{border-bottom:0}.overview-page .ov-metrics-table thead tr:last-child>*{border-bottom:1px solid var(--border-color)}.overview-page .ov-metrics-table tbody tr:hover{background:var(--hover-bg-color)}.overview-page .ov-metrics-table .ov-metric-name{min-width:190px;max-width:280px;text-align:left;white-space:normal;overflow-wrap:anywhere;font-weight:500}.overview-page .ov-metrics-table small{display:block;margin-top:3px;font-size:11px;font-weight:400;color:var(--ink-muted)}.overview-page .ov-metrics-table small .ui-icon{width:12px;height:12px}.overview-page .ov-metric-warning-row{background:rgba(196,138,46,.07)}.overview-page .ov-metric-warn,.overview-page .ov-metrics-table small.ov-metric-warn{color:#946519}.dark-mode .overview-page .ov-metric-warn,.dark-mode .overview-page .ov-metrics-table small.ov-metric-warn{color:#e8b970}.overview-page .ov-performance-message{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:10px 12px;margin:0 0 16px;border:1px solid var(--border-color);border-radius:var(--radius-control,8px);font-size:13px;line-height:1.5}.overview-page .ov-performance-message span{flex:1;min-width:160px}.overview-page .ov-performance-warning{background:rgba(196,138,46,.07)}.overview-page .ov-performance-empty{margin:0;padding:24px 12px;text-align:center;font-size:13px;color:var(--ink-muted)}.overview-page .ov-performance-help{margin-top:16px;font-size:12px;line-height:1.6;color:var(--ink-muted)}.overview-page .ov-performance-help summary{width:fit-content;cursor:pointer}.overview-page .ov-performance-help p{margin:8px 0 0;max-width:80ch}@media (max-width:575px){.overview-page .ov-performance{padding:16px 12px}.overview-page .ov-performance-window{width:100%}.overview-page .ov-performance-window select{flex:1;min-width:0}.overview-page .ov-performance-tabs .paper-tab{flex:1;padding:10px 8px}}.overview-page .ov-stacked-bar{display:flex;height:18px;border-radius:6px;overflow:hidden;margin-bottom:14px}.overview-page .ov-bar-seg{min-width:2px;transition:width .4s ease}.overview-page .ov-bar-ready{background:#2f7a44}.overview-page .ov-bar-preparing{background:#c48a2e}.overview-page .ov-bar-error{background:#b42318}.overview-page .ov-bar-expired{background:#8a857c}.overview-page .ov-bar-removed{background:#b5afa2}.dark-mode .overview-page .ov-bar-ready{background:#7dc894}.dark-mode .overview-page .ov-bar-preparing{background:#e8b970}.dark-mode .overview-page .ov-bar-error{background:#f08a82}.dark-mode .overview-page .ov-bar-expired{background:#6b665e}.dark-mode .overview-page .ov-bar-removed{background:#4a453e}.overview-page .ov-bar-legend{display:flex;flex-direction:column;gap:6px}.overview-page .ov-legend-item{display:flex;align-items:center;gap:8px;font-size:.82rem;text-decoration:none;color:inherit}.overview-page .ov-legend-item:hover{text-decoration:none;color:inherit}.overview-page .ov-swatch{display:inline-block;width:12px;height:12px;border-radius:3px;flex-shrink:0}.overview-page .ov-legend-n{margin-left:auto;font-family:var(--font-mono);font-size:.8rem;font-weight:600}.overview-page .ov-error-bars{display:flex;flex-direction:column;gap:12px}.overview-page .ov-ebar-row{display:flex;align-items:center;gap:10px}.overview-page .ov-ebar-label{width:30px;flex-shrink:0;font-family:var(--font-mono);font-size:.72rem;text-transform:uppercase;color:var(--ink-muted)}.overview-page .ov-ebar-track{flex:1;height:10px;background:var(--hover-bg-color);border-radius:5px;overflow:hidden}.overview-page .ov-ebar-fill{height:100%;border-radius:5px;transition:width .4s ease}.overview-page .ov-ebar-error{background:#b42318}.overview-page .ov-ebar-warn{background:#c48a2e}.overview-page .ov-ebar-info{background:var(--accent,#3b4ad6)}.dark-mode .overview-page .ov-ebar-error{background:#f08a82}.dark-mode .overview-page .ov-ebar-warn{background:#e8b970}.overview-page .ov-ebar-n{width:36px;text-align:right;font-family:var(--font-mono);font-size:.82rem;font-weight:600;flex-shrink:0}.overview-page .ov-routes-table{display:flex;flex-direction:column}.overview-page .ov-route-row{display:grid;grid-template-columns:1fr 60px 60px 60px;padding:8px 0;border-bottom:1px solid var(--border-soft,var(--border-color));text-decoration:none;color:inherit;font-size:.85rem;align-items:center}.overview-page .ov-route-row:last-child{border-bottom:none}.overview-page .ov-route-row:hover{background:var(--hover-bg-color);text-decoration:none;color:inherit}.overview-page .ov-route-head{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);border-bottom:1px solid var(--border-color)}.overview-page .ov-route-head:hover{background:0 0}.overview-page .ov-route-name{font-family:var(--font-mono);font-size:.84rem}.overview-page .ov-route-n{text-align:right;font-family:var(--font-mono);font-size:.84rem}.overview-page .ov-route-lat{color:var(--ink-muted)}.overview-page .ov-n-bad{color:#b42318;font-weight:600}.dark-mode .overview-page .ov-n-bad{color:#f08a82}.overview-page .ov-services-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;box-shadow:var(--card-shadow);margin-bottom:18px}.overview-page .ov-services-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:16px}.overview-page .ov-services-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px}.overview-page .ov-svc{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:1px solid var(--border-soft,var(--border-color));border-radius:10px}.overview-page .ov-svc-dot{width:10px;height:10px;border-radius:50%;margin-top:3px;flex-shrink:0}.overview-page .ov-svc-info{display:flex;flex-direction:column;gap:1px;flex:1}.overview-page .ov-svc-name{font-family:var(--font-mono);font-size:.88rem;font-weight:600}.overview-page .ov-svc-meta{font-size:.76rem;color:var(--ink-muted)}.overview-page .ov-svc-detail{font-size:.74rem;color:var(--ink-muted);white-space:nowrap}@media (max-width:900px){.overview-page .ov-kpi-row{grid-template-columns:repeat(3,1fr)}.overview-page .ov-daily-row{grid-template-columns:repeat(3,1fr)}.overview-page .ov-triple-row{grid-template-columns:1fr}}@media (max-width:720px){.overview-page .ov-kpi-row{grid-template-columns:repeat(2,1fr)}.overview-page .ov-daily-row{grid-template-columns:1fr}.overview-page .ov-chart-row{grid-template-columns:1fr}.overview-page .ov-header{flex-direction:column;gap:8px}}@media (max-width:480px){.overview-page .ov-kpi-row{grid-template-columns:1fr 1fr}.overview-page .ov-services-grid{grid-template-columns:1fr 1fr}}.dashboard-heading-actions{display:flex;flex-direction:column;align-items:flex-end;gap:8px;padding-bottom:12px}.dashboard-heading-actions .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px}.dashboard-connections-link{display:inline-flex;align-items:center;gap:7px;min-height:32px;color:var(--ink-muted);font-size:12px;line-height:1.5}.dashboard-connections-link:hover{color:var(--accent);text-decoration:none}.dashboard-connections-link:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:2px}@media (max-width:767px){.dashboard-heading-actions{align-items:flex-start;padding-bottom:0;gap:4px}.dashboard-connections-link{min-height:44px}}.paper-settings-connection-link{display:flex;align-items:center;gap:12px;padding:18px 0;color:var(--color);font-size:14px}.paper-settings-connection-link>i{color:var(--ink-muted);font-size:18px}.paper-settings-connection-link>span:first-of-type{flex:1}.paper-settings-connection-link small{display:block;margin-top:4px;color:var(--ink-muted);font-size:12px}.paper-settings-connection-link:hover{color:var(--accent);text-decoration:none}.paper-settings-connection-link:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.connections-heading{margin-bottom:36px}.connections-heading .paper-page-title{font-size:clamp(38px,4.5vw,56px);margin-bottom:12px}.connections-heading .paper-page-lede{font-size:15px}.connections-grid{display:grid;grid-template-columns:1.15fr 1fr;gap:56px;align-items:start;border-top:1px solid var(--border-color);padding-top:28px}.connections-grid>section{min-width:0}.connection-title,.connection-top{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.connection-top{margin-bottom:24px;min-height:28px}.connection-top>i{color:var(--ink-muted);font-size:24px}.connection-top>.fa-key{font-size:18px}.connection-title{margin-bottom:10px}.connections-page h2{font-family:inherit;font-size:21px;font-weight:600;letter-spacing:-.5px;margin:0}.connections-page p{font-size:14px;line-height:1.65;color:var(--ink-muted)}.connection-badge{background:var(--accent-soft);color:var(--accent);font-size:11px;font-weight:600;border-radius:5px;padding:4px 8px;white-space:nowrap}.connection-badge-muted{background:var(--paper-bg-alt);color:var(--ink-muted)}.connection-status{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--ink-muted)}.connection-status::before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor}.connection-status.is-connected{color:var(--status-ready)}.connection-actions{display:flex;flex-wrap:wrap;align-items:center;gap:16px;margin:22px 0 16px}.connections-page .btn{font-size:13px;padding:9px 13px;white-space:normal}.connection-revoke p,.connections-page .connection-help{font-size:12px}.connection-link{display:inline-flex;align-items:center;gap:8px;border:0;padding:0;background:0 0;color:var(--accent);font-size:13px;line-height:1.6;font-weight:500;text-align:left;cursor:pointer}.connection-link:hover{color:var(--link-hover-color);text-decoration:underline}.connection-link:disabled{color:var(--ink-muted);opacity:.65;cursor:not-allowed;text-decoration:none}.connection-link:focus-visible{outline:2px solid var(--accent);outline-offset:5px}.connection-installations{list-style:none;padding:0;margin:18px 0;border-top:1px solid var(--border-soft)}.connection-installations li{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:14px 0;font-size:12px;border-bottom:1px solid var(--border-soft)}.connection-revoke{border-top:1px solid var(--border-soft);padding-top:18px;margin-top:24px}.connection-danger{color:var(--status-error)}.connection-resources{margin-top:36px;padding-top:28px;border-top:1px solid var(--border-color)}.connection-count{color:var(--ink-muted);font-size:12px}.connection-empty{display:flex;align-items:center;gap:18px;padding:20px 0;margin:22px 0}.connection-empty>i{font-size:22px;color:var(--ink-muted)}.connection-empty h3{font-size:14px;font-weight:600;margin:0 0 5px}.connection-empty p{font-size:12px;margin:0}.connection-empty>a{margin-left:auto;flex-shrink:0}.connection-resource{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:20px 0;border-bottom:1px solid var(--border-color)}.connection-resource-name{flex:1;min-width:180px;overflow-wrap:anywhere;font-size:14px}.connection-resource-name small{display:block;color:var(--ink-muted);font-size:11px;margin-top:5px}.connection-resource-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.connection-resource-actions .connection-help{flex-basis:100%}.connections-page .connection-footnote{display:flex;align-items:baseline;gap:10px;margin-top:22px;font-size:12px}@media (max-width:767px){.connections-grid{grid-template-columns:1fr;gap:28px}.connections-grid>section+section{border-top:1px solid var(--border-color);padding-top:28px}.connection-empty{flex-wrap:wrap}.connection-empty>div{flex:1;min-width:180px}.connection-empty>a{margin-left:40px}.connection-resource-actions{flex-basis:100%}}.paper-table-empty-actions .btn{display:inline-flex;align-items:center;justify-content:center;gap:6px}.paper-table-empty-actions .btn>i{font-size:1em;line-height:1;color:inherit;margin-right:0!important}.auth-back{display:inline-flex;align-items:center;gap:10px;font-size:13px;color:var(--ink-muted);margin-bottom:48px}.auth-layout{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:start}.auth-intro,.auth-options{padding-top:28px}.auth-title-mobile{display:none}.auth-intro .paper-page-title{font-size:clamp(48px,5vw,76px);line-height:1.06;margin:18px 0 24px}.auth-intro .paper-page-lede{max-width:330px}.auth-options{display:grid;gap:28px}.auth-options h2{font-family:inherit;font-size:21px;font-weight:600;margin:0 0 10px}.auth-options p{font-size:14px;line-height:1.65;color:var(--ink-muted)}.auth-options .auth-existing{font-size:12px;border-left:2px solid var(--accent);padding-left:14px;margin:0}.auth-permissions{padding:6px 0 12px;list-style:none;font-size:13px;line-height:1.6}.auth-permissions li{display:flex;gap:10px;margin:12px 0}.auth-permissions i{color:var(--status-ready);margin-top:4px}.auth-continue{display:flex!important;align-items:center;justify-content:space-between;min-height:48px;padding:12px 16px!important}.auth-options small{display:block;font-size:12px;text-align:center;color:var(--ink-muted);margin-top:12px}.auth-legacy{border-top:1px solid var(--border-color);padding-top:24px}.auth-legacy h2{font-size:16px;margin:0}.auth-legacy p{font-size:13px}.source-url-label-row{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 16px;margin-bottom:8px}.source-url-label-row>.paper-field-label{font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--color);margin-bottom:6px;display:block}.repo-access{margin:0}.repo-access-details{margin:12px 0 24px}.source-url-label-row .repo-access-switch{padding:2px}.source-url-label-row .repo-access-switch button{padding:6px 10px;font-size:12px;line-height:20px}.repo-access-main{display:flex;align-items:center;gap:10px;padding:0 0 8px;flex-wrap:wrap}.repo-access-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.repo-access-switch{display:inline-flex;gap:3px;padding:3px;border:1px solid var(--border-color);border-radius:7px;flex-wrap:wrap}.repo-access-switch button{border:0;border-radius:4px;background:0 0;color:var(--ink-muted);padding:7px 10px;font:inherit;font-size:12px;cursor:pointer}.repo-access-switch button[aria-pressed=true]{background:var(--accent-soft);color:var(--accent);opacity:1;cursor:default;font-weight:600}.repo-access-switch button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.repo-access-details .btn{font-size:12px;padding:8px 12px}.repo-access-note{display:flex;gap:6px 16px;flex-wrap:wrap;padding:0;color:var(--ink-muted);font-size:11px;line-height:1.6}@media (max-width:767px){.auth-page{max-width:480px}.auth-back,.auth-intro .paper-eyebrow,.auth-title-desktop{display:none}.auth-title-mobile{display:inline}.auth-layout{grid-template-columns:1fr;gap:24px}.auth-intro,.auth-options{padding-top:0}.auth-intro .paper-page-title{font-size:40px;line-height:1.15;margin:6px 0 12px}.auth-intro .paper-page-lede{max-width:none;font-size:14px;margin:0}.auth-options{gap:24px}.auth-options .connection-top{margin-bottom:16px}.auth-options h2{font-size:18px}.auth-options p{font-size:13px;margin-bottom:12px}.auth-permissions{padding:0;margin:14px 0 20px;font-size:12px}.auth-permissions li{margin:8px 0}.auth-continue{font-size:14px}.auth-legacy{padding-top:20px}.auth-legacy h2{font-size:15px}.auth-legacy .connection-link{min-height:44px}.repo-access-controls{width:100%;gap:12px}}.text-muted{color:var(--ink-muted)!important}.anonymize-review-note,.draft-status{font-size:13px;color:var(--ink-muted)}.anonymize-review-note{padding:12px 0;margin:0}.anonymize-preview-status{padding:20px 32px;color:var(--ink-muted)}.anonymize-preview-status p{margin:0 0 12px}@media (max-width:575px){.dashboard-page .paper-page-lede{margin-bottom:8px}.dashboard-page .dashboard-heading-actions{gap:4px}.dashboard-page .dashboard-connections-link{min-height:32px}.dashboard-page .dashboard-filter-row{margin-top:12px}.anonymize-preview-status{padding:16px}}.paper-page .paper-page-title{font-size:32px}.paper-page.admin-page .paper-page-title{font-size:28px}.paper-page .paper-page-lede{font-size:14px;line-height:1.5}.paper-settings{padding-top:32px}.paper-settings-body{grid-template-columns:180px minmax(0,1fr);gap:40px;margin-top:24px;padding-top:24px;border-top:0}.paper-settings-main .paper-settings-section{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);padding:20px;margin-bottom:16px}.anonymize-page .paper-section-eyebrow,.paper-settings .paper-section-eyebrow{font-family:var(--font-sans);font-size:16px;font-weight:600;color:var(--color);text-transform:none;letter-spacing:-.01em;margin-bottom:12px}.paper-settings .paper-settings-toc-head{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none}.paper-settings-section .paper-section-copy{margin-top:0}.paper-settings .quota-row{gap:24px}.paper-settings .quota-header{flex-direction:column;align-items:flex-start;gap:4px}.paper-settings .quota-value{white-space:nowrap}.paper-settings .paper-settings-footer{padding:0 0 20px}.paper-settings .form-control{font-size:14px;border-color:var(--border-color);border-radius:var(--radius-control)}.paper-settings .form-check{padding-top:8px;padding-bottom:8px}.anonymize-page .btn-ink,.paper-page .btn-ink{background:var(--accent);color:#fff;border-color:var(--accent)}.dark-mode .anonymize-page .btn-ink,.dark-mode .paper-page .btn-ink{color:#1a1815}.anonymize-page .btn-ink:hover,.paper-page .btn-ink:hover{background:var(--accent);border-color:var(--accent);color:#fff;filter:brightness(.94)}.dark-mode .anonymize-page .btn-ink:hover,.dark-mode .paper-page .btn-ink:hover{color:#1a1815}.anonymize-page .btn-ink:active,.paper-page .btn-ink:active{filter:brightness(.9)}input[type=date],select{color-scheme:light}.dark-mode input[type=date],.dark-mode select{color-scheme:dark}.draft-status{display:flex;align-items:center;flex-wrap:wrap;gap:6px 12px;padding:10px 0}.draft-discard{padding:0;border:0;color:var(--accent);font:inherit;font-size:13px;text-decoration:underline;background:0 0;cursor:pointer}.conference-feedback{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px;margin-top:16px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);width:100%}.paper-table{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);margin-top:12px}.paper-table .paper-table-head{font-family:var(--font-sans);text-transform:none;letter-spacing:0;font-size:12px;background:var(--paper-bg-alt);border-radius:var(--radius-surface) var(--radius-surface) 0 0}.paper-table .paper-table-head,.paper-table .paper-table-row{padding-left:16px;padding-right:16px}.dashboard-page{--dashboard-space-xs:4px;--dashboard-space-sm:8px;--dashboard-space-md:12px;--dashboard-space-lg:16px;--dashboard-space-xl:24px;padding-top:var(--dashboard-space-xl)}.project-icon-definitions{position:absolute;width:0;height:0;overflow:hidden}.project-type-svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.project-empty-icon{width:28px;height:28px;color:var(--ink-faint)}.project-type-icon{display:inline-flex;color:var(--ink-muted);flex-shrink:0}.dashboard-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--dashboard-space-lg)}.dashboard-heading .paper-page-title{font-size:28px;margin-bottom:var(--dashboard-space-xs)}.dashboard-heading .paper-page-lede{display:none}.dashboard-heading .btn{min-height:40px;display:inline-flex;gap:var(--dashboard-space-sm);align-items:center}.dashboard-new-mobile{display:none}.dashboard-quota{position:relative;margin:0;padding:0;border:0;background:0 0}.dashboard-quota>summary{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:5px 10px;border:1px solid var(--border-color);border-radius:6px;background:var(--paper-card);color:var(--color);font-family:var(--font-sans);font-size:12px;cursor:pointer;list-style:none;white-space:nowrap}.dashboard-quota>summary::-webkit-details-marker{display:none}.dashboard-quota>summary:hover,.dashboard-quota[open]>summary{background:var(--paper-bg-alt);border-color:var(--ink-faint)}.quota-summary-label{font-weight:600}.quota-summary-value{color:var(--ink-muted);font-variant-numeric:tabular-nums}.quota-summary-ring{width:18px;height:18px;flex-shrink:0;fill:none;stroke-width:2.5}.quota-ring-track{stroke:var(--border-color)}.quota-ring-fill{stroke:var(--accent);transform:rotate(-90deg);transform-origin:50% 50%}.quota-summary-ring.quota-warn .quota-ring-fill{stroke:var(--status-progress)}.quota-summary-ring.quota-danger .quota-ring-fill{stroke:var(--status-error)}.quota-ring-unlimited{stroke:var(--accent);stroke-width:1.7}.quota-summary-chevron{width:14px;height:14px;margin-left:2px;color:var(--ink-muted);transition:transform .15s ease}.dashboard-quota[open] .quota-summary-chevron{transform:rotate(180deg)}.dashboard-quota .quota-panel{position:absolute;z-index:25;top:calc(100% + 8px);left:0;width:344px;max-width:calc(100vw - 36px);padding:16px;border:1px solid var(--border-color);border-radius:12px;background:var(--paper-card);box-shadow:0 12px 36px rgba(26,24,21,.16)}.quota-panel-heading{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.quota-panel-heading h2{font:600 15px var(--font-sans);margin:0}.quota-panel-heading .project-close{margin:-8px -8px -8px 0}.paper-page .quota-usage{display:grid;grid-template-columns:1fr;gap:16px;margin:0;padding:0}.quota-usage .quota-item+.quota-item{padding-top:16px;border-top:1px solid var(--border-soft,var(--border-color))}.quota-usage .quota-header{display:flex;align-items:center;gap:8px;margin-bottom:6px}.quota-usage .quota-label{display:inline-flex;align-items:center;gap:8px;font:500 12px var(--font-sans);letter-spacing:0;text-transform:none;color:var(--ink-muted)}.quota-usage .quota-label .project-type-svg{width:16px;height:16px}.quota-usage .quota-value{display:flex;align-items:baseline;gap:4px;font:12px var(--font-sans);font-variant-numeric:tabular-nums;color:var(--ink-muted);margin-bottom:8px}.quota-usage .quota-value strong{font-size:20px;line-height:1.2;font-weight:600;color:var(--color)}.quota-percent,.quota-usage .quota-unlimited-tag{margin-left:auto;padding:2px 6px;border-radius:4px;background:var(--paper-bg-alt);font:11px var(--font-sans);color:var(--ink-muted);white-space:nowrap}.quota-warn>.quota-header .quota-percent{color:var(--status-progress)}.quota-danger>.quota-header .quota-percent{color:var(--status-error)}.quota-usage .quota-track{height:5px;border:0;background:var(--paper-bg-alt)}.quota-usage .quota-track .quota-fill{min-width:0;background:var(--accent)}.quota-remaining{margin:6px 0 0;color:var(--ink-muted);font-size:11px}.quota-remaining.quota-limit{color:var(--status-error)}.quota-loading{font-size:12px;color:var(--ink-muted);margin:12px 0 0}.dashboard-page .dashboard-filter-row{display:flex;align-items:center;gap:var(--dashboard-space-md);padding:0;margin:var(--dashboard-space-lg) 0 0;border:0;background:0 0}.dashboard-page .dashboard-filter-row .search-wrap{flex:1 1 240px;min-width:0}.dashboard-page .dashboard-filter-row .form-control{height:40px;padding:8px 12px;font-size:13px;background:var(--paper-card)}.dashboard-page .dashboard-filter-controls{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--dashboard-space-sm)}.dashboard-extra-filters{display:flex;gap:var(--dashboard-space-sm)}.dashboard-filters-toggle{display:none}.dashboard-page .dashboard-filter-row .btn-group .btn{border:0;background:0 0;border-radius:6px;height:36px;padding:6px 10px}.dashboard-page .dashboard-filter-row .btn-group .btn.btn-primary{background:var(--accent-soft);color:var(--accent)}.dashboard-page .dashboard-filter-row .btn-group .btn.btn-primary:active,.dashboard-page .dashboard-filter-row .btn-group .btn.btn-primary:hover{background:var(--accent-soft)!important;color:var(--accent)}.dashboard-page .dashboard-filter-row .dropdown-toggle{height:36px;padding:6px 10px}.dashboard-type-filter .project-type-svg{display:none}.sort-direction{width:14px;height:14px}.sort-direction.ascending{transform:rotate(180deg)}.dashboard-page .dashboard-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--dashboard-space-sm) var(--dashboard-space-md);margin:var(--dashboard-space-md) 0 0;padding:0}.dashboard-view-tabs{display:flex;align-items:center;gap:var(--dashboard-space-lg)}.dashboard-view-short{display:none}.dashboard-view-tabs button{min-height:36px;border:0;border-bottom:2px solid transparent;border-radius:0;background:0 0;font:inherit;font-size:13px;color:var(--ink-muted);padding:4px 0}.dashboard-view-tabs button[aria-pressed=true]{color:var(--color);border-bottom-color:var(--color);font-weight:600}.attention-count{padding:1px 5px;margin-left:4px;border-radius:4px;background:var(--paper-bg-alt);font-size:11px;font-variant-numeric:tabular-nums}.attention-count.has-attention{color:var(--status-error)}.dashboard-count{margin-left:auto;font-size:12px;color:var(--ink-muted)}.dashboard-active-filters{display:flex;align-items:center;flex-wrap:wrap;gap:var(--dashboard-space-sm);width:100%}.dashboard-page .filter-chip{display:inline-flex;font-family:var(--font-sans);font-size:11px;text-transform:none;letter-spacing:0;border-radius:6px}.dashboard-page .filter-chip .project-type-svg{width:12px;height:12px;margin-left:4px}.dashboard-page .filter-chip-close{min-width:24px;min-height:24px;display:inline-flex;align-items:center;justify-content:center;margin:-2px -4px -2px 2px}.dashboard-page .btn-link-inline{color:var(--ink-muted);font-size:12px}.dashboard-page .paper-table-dashboard{margin-top:var(--dashboard-space-md);border-left:0;border-right:0;border-radius:0}.dashboard-page .paper-table-dashboard .paper-table-head,.dashboard-page .paper-table-dashboard .paper-table-row{grid-template-columns:minmax(280px,3fr) 180px 72px 148px 64px;gap:var(--dashboard-space-lg);padding:8px 12px}.dashboard-page .paper-table-dashboard .paper-table-head{border-radius:0}.dashboard-page .paper-table .cell-anon{gap:var(--dashboard-space-sm)}.dashboard-page .paper-table .anon-text{flex:1}.dashboard-page .paper-table .repo-name{font-family:var(--font-sans);font-size:14px;font-weight:600}.dashboard-page .paper-table .anon-sub{display:flex;align-items:center;gap:var(--dashboard-space-sm);min-width:0}.anonymous-id{font-size:12px;font-family:var(--font-mono);color:var(--ink-muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-page .paper-table .type-badge{font-family:var(--font-sans);letter-spacing:0;font-size:11px;text-transform:none;border-radius:6px}.dashboard-page .paper-table .status-sub{font-size:12px}.dashboard-page .paper-table .cell-conf{font-family:var(--font-sans);letter-spacing:0;text-transform:none}.dashboard-page .conf-tag .project-type-svg{width:14px;height:14px}.dashboard-row-meta{display:contents}.dashboard-page .cell-actions{gap:0;align-items:center}.copy-link-inline,.dashboard-page .btn-icon-dots,.project-close{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:0 0;color:var(--ink-muted);padding:0;width:32px;height:32px;min-width:32px;cursor:pointer}.copy-link-inline:focus-visible,.copy-link-inline:hover,.dashboard-page .btn-icon-dots:hover,.project-close:hover{background:var(--accent-soft);color:var(--accent)}.copy-link-inline:disabled{opacity:.5;cursor:wait}.mobile-meta-icon{display:none}.project-attention-action{display:inline-block;color:var(--accent);border:0;background:0 0;padding:0;font:inherit;font-size:12px;cursor:pointer;text-decoration:underline;text-underline-offset:3px}.project-attention-action{text-align:left}.dashboard-page .cell-status .project-attention-action{flex-basis:100%}.project-details-row{width:100%;border-bottom:1px solid var(--border-color)}.project-details{padding:var(--dashboard-space-xl);background:var(--paper-bg-alt)}.project-details-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--dashboard-space-sm)}.project-details-heading h2{font:600 16px var(--font-sans);margin:0}.project-details-list{display:grid;grid-template-columns:1fr 1fr;gap:var(--dashboard-space-md) var(--dashboard-space-xl);margin:12px 0}.project-details-list dt{font-size:12px;color:var(--ink-muted);font-weight:500;margin-bottom:4px}.project-details-list dd{margin:0;font-size:13px;overflow-wrap:anywhere}.project-details-list code{color:var(--color);font-size:12px}.project-name-form{margin-top:var(--dashboard-space-lg);padding-top:var(--dashboard-space-lg);border-top:1px solid var(--border-color)}.project-name-form label{display:block;font-size:13px;font-weight:500;margin-bottom:4px}.project-name-form p,.project-progress-help{font-size:12px;color:var(--ink-muted);margin-bottom:8px}.project-name-controls{display:flex;gap:var(--dashboard-space-sm);max-width:560px}.project-name-controls .form-control{min-width:0;font-size:14px}.project-name-controls .btn{flex-shrink:0;min-height:40px}.project-name-form .project-name-error{color:var(--status-error)}.project-details-button{min-height:44px;padding:0 8px;border:0;border-radius:6px;background:0 0;font:inherit;font-size:12px;color:var(--ink-muted);cursor:pointer}.anonymize-page .anonymize-topbar-title{font-family:var(--font-sans);font-size:28px;font-weight:600}.anonymize-topbar{padding:16px 24px}.anonymize-form-col{background:var(--paper-bg-alt)}.anonymize-form-col .paper-settings-main{padding:20px 24px}.anonymize-form-col .paper-settings-section{padding:18px}.anonymize-form-col .paper-settings-section:first-child{padding-top:18px}.anonymize-form-col .anonymize-submit-bar{background:var(--paper-bg-alt);padding:12px 0}.anonymize-preview-head .paper-eyebrow{font-family:var(--font-sans);font-size:14px;font-weight:600;color:var(--color);text-transform:none;letter-spacing:0}.anonymize-preview-col{background:var(--canvas-bg-color);padding:24px}.anonymize-preview-head{flex-wrap:wrap;gap:6px 12px;margin-bottom:16px}.anonymize-preview-body{padding:24px}.anonymize-mobile-tabs,.anonymize-preview-empty,.mobile-preview-jump{display:none}.anonymize-page .repo-access-note{font-size:12px}@media (max-width:900px){.paper-settings-body{grid-template-columns:1fr;gap:18px}.paper-settings-toc{padding:0}.paper-settings-toc-head{display:none}.paper-table .paper-table-row{padding-left:14px;padding-right:14px}}@media (max-width:767px){.anonymize-page .paper-page-title,.paper-page .paper-page-title{font-size:24px}.paper-settings{padding:20px 16px 40px}.paper-settings-main .paper-settings-section{padding:16px}.anonymize-topbar{padding:12px 16px}.anonymize-topbar .paper-crumbs{display:none}.anonymize-mobile-tabs{display:flex;gap:4px;padding:8px 16px;border-bottom:1px solid var(--border-color);background:var(--paper-card)}.anonymize-mobile-tabs button{flex:1;font:inherit;font-size:13px;padding:10px;border:0;border-radius:6px;background:0 0;color:var(--ink-muted)}.anonymize-mobile-tabs button[aria-selected=true]{background:var(--accent-soft);color:var(--accent);font-weight:600}.anonymize-page:not(.mobile-preview-active) .anonymize-preview-col{display:none}.mobile-preview-active .anonymize-form-col{display:none}.mobile-preview-active .anonymize-preview-empty{display:block;padding:24px 16px;color:var(--ink-muted)}.anonymize-form-col .paper-settings-main{padding:16px}.anonymize-form-col .anonymize-submit-bar{background:var(--paper-bg-alt)}.mobile-preview-jump{display:block;width:100%;min-height:44px}.anonymize-preview-col{padding:16px}.anonymize-preview-body{padding:16px}}@media (max-width:575px){.paper-settings .quota-header{flex-direction:row;flex-wrap:wrap;align-items:baseline;gap:4px 8px}}@media (max-width:1100px) and (min-width:901px){.dashboard-page .dashboard-filter-row{flex-wrap:wrap}.dashboard-page .dashboard-filter-row .search-wrap{flex-basis:100%}.dashboard-page .dashboard-filter-controls{width:100%;justify-content:space-between}}@media (max-width:900px){.dashboard-page .paper-table.paper-table-dashboard .paper-table-row{gap:4px 8px;padding:8px 12px}.dashboard-page .paper-table .cell-anon{flex:1 1 calc(100% - 96px);min-width:0}.dashboard-page .paper-table .cell-actions{flex:0 0 88px}.dashboard-row-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;order:3;width:100%}.dashboard-page .dashboard-row-meta .cell-status{flex:1 1 80px;flex-wrap:wrap;gap:2px 8px}.dashboard-page .dashboard-row-meta .cell-expires,.dashboard-page .dashboard-row-meta .cell-views{flex-shrink:0;font-size:12px}.dashboard-page .cell-expires::before,.dashboard-page .cell-views::before{content:none}.dashboard-page .mobile-meta-icon{display:inline-block;width:14px;height:14px}.dashboard-page .dashboard-row-meta .status-sub-date{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.dashboard-page .dashboard-row-meta .status-sub-error,.dashboard-page .dashboard-row-meta .status-sub-warn{flex-basis:100%;white-space:normal;overflow-wrap:anywhere}.dashboard-page .dashboard-row-meta .status-sub::before{content:none}.dashboard-page .project-attention-action{min-height:44px;display:inline-flex;align-items:center}.dashboard-page .paper-table .anon-sub .commit-hash,.dashboard-page .paper-table .anon-sub .conf-tag{display:none}}@media (max-width:767px){.container.dashboard-page{padding-top:12px}.dashboard-heading .paper-page-title{font-size:24px}.dashboard-heading-actions .btn-ink{min-height:44px}.dashboard-new-label{display:none}.dashboard-new-mobile{display:inline}.dashboard-quota>summary{min-height:44px;gap:6px;padding:10px;font-size:12px;line-height:20px}.dashboard-quota .quota-panel{max-height:calc(100dvh - 184px);overflow-y:auto;overscroll-behavior:contain}.dashboard-page .dashboard-filter-row{flex-wrap:wrap;gap:8px;margin-top:12px}.dashboard-page .dashboard-filter-row .search-wrap{flex:1 1 0}.dashboard-page .dashboard-filter-row .form-control{height:44px}.dashboard-page .dashboard-filters-toggle{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:8px;min-height:44px;background:0 0;border:0}.dashboard-page .dashboard-filter-controls{display:none;width:100%}.dashboard-page .dashboard-filter-controls.expanded{display:flex;flex-wrap:wrap;gap:8px}.dashboard-page .dashboard-filter-controls .btn-group{width:100%;display:flex}.dashboard-page .dashboard-filter-controls .btn-group .btn{flex:1;min-height:44px}.dashboard-extra-filters{display:flex;width:100%}.dashboard-page .dashboard-extra-filters .dropdown{flex:1;min-width:0}.dashboard-page .dashboard-extra-filters .dropdown-toggle{width:100%;height:44px}.dashboard-type-filter .type-filter-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.dashboard-type-filter .project-type-svg{display:inline-block}.dashboard-page .dashboard-meta{margin-top:8px;gap:4px 8px}.dashboard-view-tabs{gap:16px}.dashboard-view-tabs button{min-width:44px;min-height:44px;font-size:12px}.dashboard-count{font-size:11px}.dashboard-count{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.dashboard-view-long{display:none}.dashboard-view-short{display:inline}.dashboard-active-filters{display:contents}.dashboard-page .filter-chip{font-size:11px;padding:0 8px;min-height:44px;gap:4px}.dashboard-page .filter-chip-close{min-width:44px;min-height:44px;margin:0}.dashboard-page .btn-link-inline{min-height:44px;font-size:12px}.dashboard-page .paper-table-dashboard{width:calc(100% + 36px);margin:8px -18px 0;border-left:0;border-right:0;border-radius:0}.dashboard-page .paper-table .repo-name{font-size:13px}.project-details{padding:16px 12px}.project-details-list{grid-template-columns:1fr;gap:12px}.project-name-controls{flex-wrap:wrap}.project-name-controls .form-control{flex-basis:100%}.project-name-controls .btn{min-height:44px}}@media (max-width:360px){.dashboard-attention-prefix{display:none}.dashboard-attention-prefix+span{text-transform:capitalize}}.ui-icon-definitions{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}.ui-icon{display:inline-block;width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0;vertical-align:-3px}.ui-icon.sort-direction{width:14px;height:14px}.pr-title-row{display:flex;align-items:flex-start;gap:16px}.pr-title-row .pr-title{flex:1;min-width:0}.pr-title-row>.btn{flex-shrink:0}.ui-icon.record-type-icon{color:var(--ink-muted)}.btn .ui-icon,.dropdown-item .ui-icon{width:16px;height:16px}.btn-icon-dots .ui-icon{width:18px;height:18px}.anonymize-page .paper-page-title,.paper-page .paper-page-title{font-size:28px}.paper-faq,.paper-page{padding-top:24px}.paper-page .paper-page-lede{margin-bottom:16px;overflow-wrap:anywhere}.paper-page-title{overflow-wrap:anywhere}.anonymize-page .form-control,.paper-page .form-control{min-height:40px;font-family:var(--font-sans);font-size:14px;border-radius:var(--radius-control)}.anonymize-page textarea.form-control,.paper-page textarea.form-control{height:auto}.anonymize-page .btn,.paper-page .btn,.status-bar-actions .btn{min-height:var(--button-height);padding:7px var(--button-padding-x);font:500 var(--button-font-size)/var(--button-line-height) var(--font-sans);border-radius:var(--radius-button);gap:6px}.anonymize-page .btn.btn-sm,.paper-page .btn.btn-sm,.status-bar-actions .btn{min-height:var(--button-compact-height);padding:5px 10px;font-size:13px;border-radius:6px}.anonymize-page .btn-ink,.paper-page .btn-ink{min-height:40px;padding:9px 15px}.btn-hero>i,.btn>.project-type-svg,.btn>.ui-icon,.btn>i{width:16px;height:16px;margin:0!important;flex-shrink:0}.btn.dropdown-toggle::after{margin-left:0}.btn.disabled,.btn:disabled{cursor:not-allowed}.btn.disabled:hover,.btn:disabled:hover{filter:none}.paper-page .btn.btn-link{background:0 0;border-color:transparent}.auth-continue.btn{min-height:44px;padding:11px 16px!important}.anonymize-page .btn.btn-icon,.paper-page .btn.btn-icon{width:32px;height:32px;min-width:32px;min-height:32px;padding:0}.paper-page .btn.btn-icon-dots{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;min-width:32px;min-height:32px;padding:0;border:0;background:0 0;color:var(--ink-muted)}.paper-page .btn-icon-dots:hover{background:var(--accent-soft);color:var(--accent)}.paper-page .btn-group .btn-primary:active,.paper-page .btn-group .btn-primary:hover{background:var(--accent-soft)!important;color:var(--accent)}.paper-page .paper-section-eyebrow{font-family:var(--font-sans);font-size:16px;font-weight:600;color:var(--color);text-transform:none;letter-spacing:0;margin-bottom:12px}.paper-page .paper-field-label{font-family:var(--font-sans);font-size:13px;letter-spacing:0}.paper-tabs .paper-tab{min-height:44px}.paper-pill,.status-pill{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none;border-radius:6px}.paper-meta-rule{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none;gap:12px 24px}.paper-meta-rule b:not(.commit-hash){font-family:var(--font-sans);font-weight:500}.connections-grid{gap:16px}.connections-grid>section{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);padding:20px}.connections-heading{margin-bottom:24px}.claim-page .claim-form,.status-page>.paper-settings-section{padding:20px;margin-top:24px;border:1px solid var(--border-color);border-radius:var(--radius-surface);background:var(--paper-card)}.claim-page .claim-form{max-width:640px}.status-page .anonymize-submit-bar{background:0 0;gap:8px;flex-wrap:wrap}.anonymize-landing{padding-top:32px}.paper-settings .quota-usage{grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}.paper-settings .quota-usage .quota-item+.quota-item{padding-top:0;border-top:0;padding-left:16px;border-left:1px solid var(--border-color)}.paper-settings .quota-usage .quota-header{flex-direction:row;align-items:center;flex-wrap:wrap}.paper-settings .quota-usage .quota-value{white-space:normal;flex-wrap:wrap}.paper-faq-hero{padding-bottom:24px;margin-bottom:24px}.paper-faq-eyebrow,.paper-faq-toc-head{font-family:var(--font-sans);font-size:12px;text-transform:none;letter-spacing:0;margin-bottom:8px}.paper-faq-title{font:600 28px/1.2 var(--font-sans);letter-spacing:-.025em;max-width:720px;margin-bottom:12px}.paper-faq-title em{font-style:normal}.paper-faq-lede{font-size:14px}.paper-faq-body{grid-template-columns:180px minmax(0,1fr);gap:40px}.faq-section h4.faq-cat{font:600 18px/1.4 var(--font-sans);padding-bottom:12px}.faq-section h4.faq-cat .ui-icon{display:none}.faq-section .panel-group{margin-bottom:32px}.faq-section .panel-default .panel-title a{font:500 15px/1.5 var(--font-sans);padding:16px 0 16px 28px;min-height:44px}.faq-section .panel-default .panel-title a:after{top:16px}.paper-empty-title{font:600 32px/1.2 var(--font-sans);letter-spacing:-.025em}.paper-empty-title em{font-style:normal}.btn-hero{justify-content:center;gap:8px;min-height:48px;padding:13px 20px;font-size:15px;line-height:20px;background:var(--accent);border-color:var(--accent);color:#fff;border-radius:var(--radius-button)}.dark-mode .btn-hero{color:#1a1815}.btn-hero:hover{background:var(--accent);color:#fff;filter:brightness(.94)}.dark-mode .btn-hero:hover{color:#1a1815}.paper-table:not(.paper-table-dashboard){border-left:0;border-right:0;border-radius:0}.paper-table:not(.paper-table-dashboard) .paper-table-head{border-radius:0}.paper-table .cell-anon{gap:8px}.paper-table .cell-anon .anon-text{flex:1}.paper-table-conferences .cell-anon .repo-name{font-family:var(--font-sans);font-weight:600}.paper-table .anon-sub>a,.paper-table .anon-sub>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.paper-table .anon-sub .ui-icon{width:14px;height:14px}.paper-page .filter-chip{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none;border-radius:6px}.paper-page .filter-chip-close .ui-icon{width:12px;height:12px}.admin-nav{gap:4px;border:0;border-bottom:1px solid var(--border-color);border-radius:0;padding:0 0 8px;background:0 0}.admin-nav a{font-family:var(--font-sans);font-size:13px;letter-spacing:0;text-transform:none;border-radius:6px;min-height:40px;padding:8px 12px}.admin-nav a.active{background:var(--accent-soft);color:var(--accent)}.admin-nav .ui-icon{width:16px;height:16px}.admin-filter-toolbar{background:0 0;border:0;padding:0}.admin-filter-inline>label,.admin-filter-inline>span{font-family:var(--font-sans);text-transform:none;letter-spacing:0}.admin-summary .summary-total{font-family:var(--font-sans);font-size:18px;font-weight:600}.admin-summary .summary-pill{font:500 13px/20px var(--font-sans);min-height:32px;padding:5px 10px;border-radius:6px}.admin-summary .summary-pill.active{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.admin-summary .summary-pill .count{font-family:var(--font-sans)}.admin-active-chip{font-family:var(--font-sans);font-size:12px}.admin-active-chip button .ui-icon{width:12px;height:12px}.user-detail-card .user-header h2{font:600 20px/1.4 var(--font-sans)}.errors-page .errors-toolbar .select-wrap label,.errors-page .volume-head,.overview-page .ov-panel-meta,.paper-detail-grid .detail-label,.paper-progress .paper-progress-label,.status-page .paper-error-eyebrow,.user-detail-grid .detail-label{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none}.overview-page .ov-chart-title,.overview-page .ov-panel-title,.paper-error-title{font:600 16px/1.4 var(--font-sans)}.paper-error-head>.ui-icon,.paper-ratelimit-head>.ui-icon{margin-top:3px;color:var(--status-error)}.paper-ratelimit-head>.ui-icon{color:var(--status-progress)}.errors-page .seg-tabs{border-radius:var(--radius-control)}.errors-page .seg-tabs button{min-height:36px;padding:7px 12px;font:500 14px/20px var(--font-sans)}.errors-page .seg-tabs button.active{background:var(--accent-soft);color:var(--accent)}.errors-page .errors-list,.errors-page .kpi-card:hover,.errors-page .volume-chart,.overview-page .ov-chart-card,.overview-page .ov-panel-card{box-shadow:none}.errors-page .kpi-value,.overview-page .ov-daily-value,.overview-page .ov-kpi-value,.q-card-count,.user-hero-name{font-family:var(--font-sans);font-size:28px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.02em}.errors-page .kpi-label,.overview-page .ov-daily-label,.overview-page .ov-kpi-label,.q-card-name,.q-section-label,.user-hero-details .detail-label{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none}.overview-page .ov-daily-card{background:var(--paper-card);box-shadow:none;border-radius:var(--radius-surface)}.dark-mode .overview-page .ov-daily-value,.overview-page .ov-daily-value{color:var(--accent)}.errors-page .kpi-card,.overview-page .ov-kpi-card{box-shadow:none;border-radius:var(--radius-surface)}.q-card{border-radius:var(--radius-surface)}.q-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.q-range-btns{border-radius:var(--radius-control)}.q-job-detail-actions .btn,.q-range-btns .btn{font-family:var(--font-sans);font-size:13px}.q-range-btns .btn.active{background:var(--accent-soft);color:var(--accent)}.btn-dark{border-radius:var(--radius-control);font-family:var(--font-sans);font-size:12px}@media (max-width:900px){.paper-settings .quota-usage{grid-template-columns:1fr;gap:16px}.paper-settings .quota-usage .quota-item+.quota-item{padding-left:0;border-left:0;border-top:1px solid var(--border-color);padding-top:16px}.paper-table:not(.paper-table-dashboard) .paper-table-row{gap:4px 8px!important;padding:8px 12px}.paper-table:not(.paper-table-dashboard) .cell-anon{flex:1 1 calc(100% - 52px);order:1}.paper-table:not(.paper-table-dashboard) .cell-actions{order:2;flex:0 0 44px}.paper-table .admin-users-row>[role=cell]:first-child,.paper-table.paper-table-repos.has-bulk .paper-table-row>[role=cell]:first-child{flex:0 0 24px;order:0}.paper-table .admin-users-row .cell-anon,.paper-table.paper-table-repos.has-bulk .cell-anon{flex-basis:calc(100% - 84px)}.paper-table:not(.paper-table-dashboard) .cell-anon .anon-sub{font-size:12px;gap:6px}.paper-table:not(.paper-table-dashboard) .cell-status .status-sub{font-size:12px}.paper-table .cell-expires::before,.paper-table .cell-views::before{content:none}.paper-table .cell-expires .mobile-meta-icon,.paper-table .cell-views .mobile-meta-icon{display:inline-block;width:14px;height:14px}.paper-faq-body{grid-template-columns:1fr;gap:24px}}@media (max-width:767px){.paper-faq,.paper-page{padding-top:20px}.anonymize-page .paper-page-title,.paper-faq-title,.paper-page .paper-page-title,.paper-page.admin-page .paper-page-title{font-size:24px}.anonymize-page .form-control,.paper-page .form-control{min-height:44px}.anonymize-page .btn,.connection-link,.draft-discard,.paper-faq-toc a,.paper-page .btn,.paper-settings-toc nav a{min-height:44px}.anonymize-page .btn,.paper-page .btn,.status-bar-actions .btn{min-height:44px;padding:11px 14px;font-size:14px;line-height:20px;white-space:normal}.anonymize-page .btn.btn-sm,.paper-page .btn.btn-sm{min-height:44px;padding:11px 12px;font-size:14px}.anonymize-page .btn.btn-icon,.copy-link-inline,.paper-page .btn.btn-icon,.paper-page .btn.btn-icon-dots,.project-close{width:44px;height:44px;min-width:44px;min-height:44px;padding:0}.dashboard-page .dashboard-filter-row .btn-group .btn,.dashboard-page .dashboard-filter-row .dropdown-toggle{height:auto;min-height:44px;font-size:14px;padding:11px 10px}.dashboard-heading-actions .btn-ink{padding:11px 16px}.dashboard-page .dashboard-filters-toggle{padding:11px 10px}.errors-page .btn-icon,.pr-title-row .btn,.status-bar-actions .btn{min-width:44px;min-height:44px;padding:0}.status-bar-actions .btn{width:44px;height:44px}.errors-page .seg-tabs button,.paper-tab{min-height:44px}.errors-page .seg-tabs button{padding:11px 12px}.status-bar-actions{flex-wrap:wrap;max-width:100%}.leftCol-close,.tree-search-clear{min-width:44px;min-height:44px}.anonymize-landing{padding:20px 18px}.anonymize-landing .repo-access-switch button,.source-url-label-row .repo-access-switch button{min-height:44px;padding:11px 10px;font-size:13px}.paper-settings-body{margin-top:16px;padding-top:0;gap:16px}.paper-settings-toc nav{gap:0 12px}.paper-settings-toc nav a{display:inline-flex;align-items:center}.paper-faq{padding-left:18px;padding-right:18px}.paper-faq-toc nav{display:flex;flex-direction:row;flex-wrap:wrap;gap:0 16px}.paper-faq-toc a{display:inline-flex;align-items:center;padding:8px 0;border-left:0;border-bottom:2px solid transparent;margin-left:0}.paper-faq-toc nav a.active,.paper-faq-toc nav a:hover{border-bottom-color:var(--accent);color:var(--accent)}.claim-page .claim-form,.status-page>.paper-settings-section{padding:16px;margin-top:16px}.admin-nav{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;gap:4px;max-width:100%;margin:8px 0 16px}.admin-nav a{flex-shrink:0;min-height:44px}.admin-summary .summary-pill{min-height:44px;padding:11px 12px;font-size:14px}.admin-active-chip button{min-width:44px;min-height:44px}.admin-filter-row{gap:8px}.admin-filter-row .admin-filter-inline{gap:8px;flex-wrap:wrap}.errors-page .kpi-grid{grid-template-columns:1fr 1fr;gap:12px}.q-cards{flex-direction:row}.q-card{min-width:130px}.q-header-actions{flex-wrap:wrap;gap:8px}} \ No newline at end of file + */.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:'Font Awesome 5 Brands';font-weight:400}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:'Font Awesome 5 Free';font-weight:400}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:block;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:'Font Awesome 5 Free';font-weight:900}.nb-notebook{line-height:1.5}.nb-stderr,.nb-stdout{white-space:pre-wrap;margin:1em 0;padding:.1em .5em}.nb-stderr{background-color:#faa}.nb-cell+.nb-cell{margin-top:.5em}.nb-output table{border:1px solid #000;border-collapse:collapse}.nb-output th{font-weight:700}.nb-output td,.nb-output th{border:1px solid #000;padding:.25em;text-align:left;vertical-align:middle;border-collapse:collapse}.nb-notebook blockquote{border-left:5px solid #ccc;margin-left:0;padding-left:1em}.nb-cell{position:relative}.nb-raw-cell{white-space:pre-wrap;background-color:#f5f2f0;font-family:Consolas,Monaco,'Andale Mono',monospace;padding:1em;margin:.5em 0}.nb-output{min-height:1em;width:100%;overflow-x:scroll;border-right:1px dotted #ccc}.nb-output img{max-width:100%}.nb-input:before,.nb-output:before{position:absolute;font-family:monospace;color:#999;left:-7.5em;width:7em;text-align:right}.nb-input:before{content:"In [" attr(data-prompt-number) "]:"}.nb-output:before{content:"Out [" attr(data-prompt-number) "]:"}// Fix pandas dataframe formatting div[style="max-height:1000px;max-width:1500px;overflow:auto;"]{max-height:none!important}@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.10"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}.mermaid{text-align:center;margin:1em 0;overflow:auto}.mermaid svg{max-width:100%;height:auto}.dark-mode .mermaid{filter:invert(1) hue-rotate(180deg)}.dark-mode .mermaid svg{background:0 0}.dark-mode .mermaid .edgeLabel,.dark-mode .mermaid .nodeLabel{filter:invert(1) hue-rotate(180deg)}.mermaid .node circle,.mermaid .node ellipse,.mermaid .node polygon,.mermaid .node rect{stroke-width:2px}.mermaid .flowchart-link{stroke-width:2px}.mermaid .actor{fill:#f9f9f9;stroke:#333;stroke-width:2px}.mermaid .messageLine0,.mermaid .messageLine1{stroke:#333;stroke-width:1.5px}.mermaid .section0,.mermaid .section1,.mermaid .section2,.mermaid .section3{opacity:.8}.mermaid .pieChart .slice{opacity:.9}.markdown-body .mermaid{background:0 0;border:none;padding:10px}.mermaid .error{color:#d32f2f;font-family:monospace;font-size:12px;padding:10px;border:1px solid #d32f2f;border-radius:4px;background-color:#ffebee}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff')}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.5;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{color:#fafbfc;background-color:#b31d28}.markdown-body .pl-c2{color:#fafbfc;background-color:#d73a49}.markdown-body .pl-c2::before{content:"^M"}.markdown-body .pl-sr .pl-cce{font-weight:700;color:#22863a}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:#005cc5}.markdown-body .pl-mi{font-style:italic;color:#24292e}.markdown-body .pl-mb{font-weight:700;color:#24292e}.markdown-body .pl-md{color:#b31d28;background-color:#ffeef0}.markdown-body .pl-mi1{color:#22863a;background-color:#f0fff4}.markdown-body .pl-mc{color:#e36209;background-color:#ffebda}.markdown-body .pl-mi2{color:#f6f8fa;background-color:#005cc5}.markdown-body .pl-mdr{font-weight:700;color:#6f42c1}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{text-decoration:underline;color:#032f62}.markdown-body .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.markdown-body a{background-color:transparent;-webkit-text-decoration-skip:objects}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit}.markdown-body strong{font-weight:bolder}.markdown-body h1{font-size:2em;margin:.67em 0}.markdown-body img{border-style:none}.markdown-body svg:not(:root){overflow:hidden}.markdown-body hr{box-sizing:content-box;height:0;overflow:visible}.markdown-body input{font:inherit;margin:0}.markdown-body input{overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{height:0;margin:15px 0;overflow:hidden;background:0 0;border:0;border-bottom:1px solid #dfe2e5}.markdown-body hr::before{display:table;content:""}.markdown-body hr::after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse}.markdown-body td,.markdown-body th{padding:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:0;margin-bottom:0}.markdown-body h1{font-size:32px;font-weight:600}.markdown-body h2{font-size:24px;font-weight:600}.markdown-body h3{font-size:20px;font-weight:600}.markdown-body h4{font-size:16px;font-weight:600}.markdown-body h5{font-size:14px;font-weight:600}.markdown-body h6{font-size:12px;font-weight:600}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{padding-left:0;margin-top:0;margin-bottom:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code{font-family:SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px}.markdown-body .octicon{vertical-align:text-bottom}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:0}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1{padding-bottom:.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#6a737d}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body code{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}.markdown-body .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1}.markdown-body :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}.dark-mode{--canvas-bg-color:#1B1916;--sidebar-bg-color:#1A1918;--main-bg-color:#1B1916;--header-bg-color:#1A1918;--hover-bg-color:rgba(255, 255, 255, 0.05);--header-color:#FAF9F6;--color:#D6D1C5;--link-color:#A7B2FF;--link-hover-color:#C8CEFF;--border-color:#33302B;--border-soft:#2A2825;--btn-color:#FAF9F6;--input-color:#E6E1D8;--input-bg:#25231F;--primary-bg:#FAF9F6;--primary-hover-bg:#FFFFFF;--primary-color:#1A1815;--primary-active-color:#1A1815;--accent:#A7B2FF;--accent-soft:rgba(167, 178, 255, 0.12);--ink-muted:#A39D92;--ink-faint:#8A857C;--ink-soft:#B5AFA2;--status-ready:#5FB27A;--status-progress:#E0A94A;--status-error:#F08A82;--status-inactive:#8A857C;--status-error-soft:rgba(240, 138, 130, 0.08);--status-error-soft-hover:rgba(240, 138, 130, 0.14);--admin-nav-bg:#1A1918;--admin-nav-active:rgba(167, 178, 255, 0.12);--admin-stat-bg:#25231F;--paper-card:#25231F;--paper-bg-alt:#201E1B;--highlight:#3A341E;background-color:var(--canvas-bg-color);color:var(--color)}body{--canvas-bg-color:#FAF9F6;--sidebar-bg-color:#FFFFFF;--header-bg-color:#FAF9F6;--header-color:#1A1815;--main-bg-color:#FAF9F6;--hover-bg-color:rgba(26, 24, 21, 0.05);--input-color:#1A1815;--color:#1A1815;--link-color:#3B4AD6;--link-hover-color:#2E3BB8;--border-color:#E6E1D8;--border-soft:#EDE9E1;--btn-color:#1A1815;--input-bg:#FFFFFF;--primary-bg:#1A1815;--primary-hover-bg:#000000;--primary-color:#FAF9F6;--primary-active-color:#FAF9F6;--accent:#3B4AD6;--accent-soft:#EEF0FF;--ink-muted:#6F6A61;--ink-faint:#8A857C;--ink-soft:#4A4641;--paper-bg-alt:#F3F1EC;--paper-card:#FFFFFF;--highlight:#FFF3C4;--status-ready:#2F7A44;--status-progress:#946512;--status-error:#B42318;--status-inactive:#8A857C;--status-error-soft:rgba(180, 35, 24, 0.04);--status-error-soft-hover:rgba(180, 35, 24, 0.08);--radius-control:6px;--radius-button:8px;--button-height:36px;--button-font-size:14px;--button-line-height:20px;--button-padding-x:13px;--button-compact-height:32px;--radius-surface:10px;--font-serif:'Instrument Serif','Iowan Old Style',Georgia,serif;--font-sans:'Inter',ui-sans-serif,system-ui,-apple-system,sans-serif;--font-mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;background-color:var(--canvas-bg-color);color:var(--color);font-family:var(--font-sans);font-size:14px;letter-spacing:-.005em;line-height:1.5}.fadeIn{opacity:1;animation-name:fadeInOpacity;animation-iteration-count:1;animation-timing-function:ease-in;animation-duration:.6s}@keyframes fadeInOpacity{0%{opacity:0}100%{opacity:1}}.btn:active,.btn:focus{box-shadow:none}:focus:not(:focus-visible){outline:0}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.btn:focus-visible,.dropdown-item:focus-visible,.form-control:focus-visible{outline:2px solid var(--accent);outline-offset:2px;box-shadow:none}input:active,input:hover{box-shadow:none!important}input:-webkit-autofill,input:-webkit-autofill:focus,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:focus,textarea:-webkit-autofill:hover{border-color:var(--border-color);-webkit-text-fill-color:var(--color);-webkit-box-shadow:none;transition:background-color 1000s ease-in-out 0s}.custom-select,.form-control,input:-internal-autofill-selected{color:var(--input-color);background-color:var(--input-bg)!important;border-color:var(--border-color)}.form-control:focus{border-color:var(--border-color)}body,html{position:relative;height:100%;overflow-x:hidden}body{overflow-y:hidden}#app{flex:1 1 auto;min-height:0}.app-header{flex:0 0 auto}.app-view{display:block;flex:1 1 auto;min-height:0;overflow-x:hidden!important;overflow-y:auto!important;max-width:100%}.markdown-body a,a{color:var(--link-color)}.markdown-body a:hover,a:hover{text-decoration:none;color:var(--link-hover-color)}.dropdown-menu a.dropdown-item{color:var(--color)}.dropdown-menu a.dropdown-item:hover{color:var(--color);text-decoration:none}.markdown-body .emoji{height:1.3em;margin:0;vertical-align:-.1em}.navbar.navbar-expand-lg{background:var(--header-bg-color)!important;border-bottom:1px solid var(--border-color);transition:background-color .5s ease;padding:10px max(20px,calc((100vw - 1200px)/ 2));font-family:var(--font-sans)}.navbar-toggler{border:1px solid var(--border-color)!important;color:var(--color)!important}.navbar-toggler .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='%231A1815' stroke-width='2' stroke-linecap='round' d='M4 8h22M4 15h22M4 22h22'/%3E%3C/svg%3E")!important}.navbar .navbar-nav{align-items:center}.navbar .nav-link{display:inline-flex;align-items:center;font-size:13px;color:var(--ink-muted)!important;padding:6px 0!important;margin:0 12px;border-bottom:1px solid transparent;letter-spacing:-.005em;line-height:1}.navbar .nav-link:hover{color:var(--color)!important}.navbar .nav-link.active{color:var(--color)!important;border-bottom-color:var(--color)}.navbar .nav-link.nav-icon{padding:0!important;margin:0 8px;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px}.navbar .nav-link .fa,.navbar .nav-link .fab{font-size:15px;line-height:1}.navbar #navbarSupportedContent{align-items:center}.navbar-brand{font-family:var(--font-serif)!important;font-size:20px!important;letter-spacing:-.01em;color:var(--color)!important;padding-right:18px;margin-right:12px;border-right:1px solid var(--border-color)}.navbar-brand em,.navbar-brand i{font-style:italic;font-weight:400}.navbar-dark .navbar-toggler{border-color:var(--border-color);color:var(--color)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='%231A1815' stroke-width='2' stroke-linecap='round' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar .btn-signin{display:inline-flex;align-items:center;height:32px;padding:0 14px!important;margin-left:6px;border:1px solid var(--color);background:var(--color);color:var(--canvas-bg-color)!important;border-radius:6px;font-size:13px;font-weight:500;line-height:1}.navbar .btn-signin:hover{background:var(--primary-hover-bg);color:var(--canvas-bg-color)!important}.navbar .nav-support{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;order:3;gap:6px;min-height:36px;margin-left:12px;padding:0 12px;border:1px solid var(--border-color);border-radius:8px;color:var(--color);font-size:13px;font-weight:500;text-decoration:none}.navbar .nav-support:hover{background:var(--hover-bg-color);border-color:var(--color);color:var(--color)}@media (max-width:991px){.navbar .nav-support{order:0;width:44px;min-height:44px;margin:0 8px 0 auto;padding:0}.navbar .nav-support-label{display:none}[class*=floatingchat-container-wrap],iframe.floatingchat-container{display:none!important}}.navbar .user-chip{display:inline-flex!important;align-items:center;gap:8px;padding:4px 12px 4px 6px!important;margin-left:6px;border:1px solid var(--border-color);border-radius:999px;background:var(--sidebar-bg-color);font-size:12.5px;color:var(--color)!important}.navbar .user-chip:hover{background:var(--hover-bg-color)}.navbar .user-chip img{width:22px;height:22px}.navbar .user-chip .user-chip-name{color:var(--color);font-weight:500}.navbar .user-chip::after{color:var(--ink-muted)}#navbarSupportedContent{padding-right:0}.generalMessage{display:block;text-align:center;color:var(--header-color)}.rgba-gradient{background:var(--canvas-bg-color);color:var(--color)}.paper-landing{overflow-x:clip}.paper-wrap{max-width:1140px;margin-left:auto;margin-right:auto;padding-left:32px;padding-right:32px}.paper-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);font-weight:500}.paper-hero{max-width:1140px;margin:0 auto;padding:64px 32px 0;display:grid;grid-template-columns:.95fr 1.05fr;gap:48px;align-items:center}.paper-hero h1.hero-title{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.6rem,5.4vw,4.4rem);line-height:1.02;letter-spacing:-.025em;margin:14px 0 0;color:var(--color);text-wrap:balance}.paper-hero h1 .accent{color:var(--accent);font-style:italic}.hero-subtitle{margin-top:18px;font-size:17px;line-height:1.55;color:var(--ink-soft);max-width:30em;text-wrap:pretty}.paper-cta-row{display:flex;flex-wrap:wrap;gap:18px;align-items:center;margin-top:26px}.btn-hero{display:inline-flex;align-items:center;font-family:var(--font-sans);border:1px solid var(--color);background:var(--color);color:var(--canvas-bg-color);padding:12px 20px;font-size:14px;font-weight:500;border-radius:var(--radius-control);letter-spacing:-.005em;transition:background .15s,border-color .15s,transform .1s}.btn-hero:hover{background:var(--primary-hover-bg);border-color:var(--primary-hover-bg);color:var(--canvas-bg-color);text-decoration:none;transform:translateY(-1px)}.btn-hero-ghost{background:0 0;border:1px solid var(--border-color);color:var(--color);padding:12px 20px;font-size:14px;font-weight:500;border-radius:var(--radius-control)}.btn-hero-ghost:hover{background:var(--hover-bg-color);border-color:var(--color);color:var(--color)}.paper-link-arrow{font-size:14px;color:var(--ink-soft);text-decoration:underline;text-underline-offset:4px;text-decoration-color:var(--border-color)}.paper-link-arrow:hover{color:var(--color);text-decoration-color:var(--color)}.paper-reassure{list-style:none;margin:16px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12.5px;color:var(--ink-muted)}.paper-reassure li::before{content:"\2713";color:var(--status-ready);margin-right:6px;font-size:11px}.paper-frame{border-radius:var(--radius-surface);background:var(--paper-card);border:1px solid var(--border-color);box-shadow:0 24px 60px rgba(26,24,21,.1),0 2px 6px rgba(26,24,21,.04);overflow:hidden}.dark-mode .paper-frame{box-shadow:0 24px 60px rgba(0,0,0,.45)}.paper-frame-bar{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;border-bottom:1px solid var(--border-soft);background:var(--paper-bg-alt);font-family:var(--font-mono);font-size:11px;color:var(--ink-muted)}.paper-frame-bar .dots{display:flex;gap:5px}.paper-frame-bar .dots i{width:8px;height:8px;border-radius:50%;background:var(--border-color)}.paper-frame-bar .url{flex:1;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-frame img{display:block;width:100%;height:auto}.paper-hero-shot .paper-frame{width:112%}.paper-proof{margin-top:64px;padding-top:18px;padding-bottom:18px;border-top:1px solid var(--border-color);display:flex;flex-wrap:wrap;gap:12px 30px;align-items:center}.paper-proof-venues{display:flex;gap:22px;align-items:center;font-family:var(--font-serif);font-size:22px;letter-spacing:-.01em;color:var(--ink-soft)}.paper-proof-venues i{font-style:normal;font-family:var(--font-sans);font-size:14px;color:var(--ink-faint)}.paper-stats{margin-top:12px;padding-top:22px;border-top:1px solid var(--border-color)}.paper-stats-meta{display:flex;justify-content:space-between;align-items:center;font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-muted);margin-bottom:14px}.paper-stats-meta-right{display:inline-flex;align-items:center;gap:6px}.paper-stats-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--status-ready)}.paper-stats-grid{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color)}.paper-stat-card{display:flex;flex-direction:column;padding:22px 26px 20px 0;margin-right:26px;border-right:1px solid var(--border-color);min-width:0}.paper-stat-card:last-child{border-right:0;margin-right:0;padding-right:0}.paper-stat-value{font-size:44px;font-weight:500;letter-spacing:-.04em;line-height:1;color:var(--color);font-variant-numeric:tabular-nums}.paper-stat-label{margin-top:6px;font-size:13px;color:var(--ink-soft)}.paper-stat-bars{display:block;width:100%;height:34px;margin-top:18px;overflow:visible}.paper-stat-bars rect{fill:var(--border-color)}.paper-stat-bars rect.is-latest{fill:var(--accent)}.paper-stat-delta{margin-top:10px;font-family:var(--font-mono);font-size:10.5px;color:var(--status-ready)}.paper-section-head{margin-top:110px;display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:end}.paper-qa h2,.paper-section-head h2{font-family:var(--font-serif);font-weight:400;font-size:clamp(2rem,4.2vw,3.25rem);line-height:1.05;letter-spacing:-.02em;margin:10px 0 0;color:var(--color);text-wrap:balance}.paper-feature-title em,.paper-qa h2 em,.paper-section-head h2 em{font-style:italic;color:var(--accent)}.paper-section-head p{font-size:15px;color:var(--ink-soft);max-width:32em;margin:0;line-height:1.6}.paper-preview{margin-top:28px;display:grid;grid-template-columns:1fr 1fr;gap:14px}.paper-preview .pane{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);overflow:hidden;min-width:0}.paper-preview .pane-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid var(--border-soft)}.paper-preview .pane-label{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);white-space:nowrap}.paper-preview .pane-url{font-family:var(--font-mono);font-size:11px;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.paper-preview .pane-body{padding:16px 18px;font-family:var(--font-mono);font-size:12.5px;line-height:1.9;color:var(--ink-soft)}.paper-preview .pane-body strong{color:var(--color);font-weight:600}.paper-preview .tok{color:var(--ink-faint)}.paper-preview .redact{background:var(--accent-soft);color:var(--accent);border-radius:4px;padding:0 5px}.paper-features{margin-top:28px;padding-top:28px;border-top:1px solid var(--border-color);display:grid;grid-template-columns:5fr 7fr;gap:48px;align-items:start}.paper-features-list{display:flex;flex-direction:column}.paper-feature{border-left:2px solid var(--border-soft);padding:16px 0 16px 20px;transition:border-color .2s}.paper-feature.is-on{border-left-color:var(--color)}.paper-feature-tab{all:unset;display:block;width:100%;cursor:pointer;color:inherit;border-radius:4px}.paper-feature-tab:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.paper-feature-tab .paper-eyebrow{display:block;margin-bottom:6px}.paper-feature-title{display:block;font-family:var(--font-serif);font-size:24px;line-height:1.15;letter-spacing:-.015em;color:var(--ink-muted);transition:color .2s}.paper-feature-title em{color:inherit}.paper-feature-tab:hover .paper-feature-title,.paper-feature.is-on .paper-feature-title{color:var(--color)}.paper-feature.is-on .paper-feature-title em{color:var(--accent)}.paper-feature-more{display:none}.paper-feature.is-on .paper-feature-more{display:block}.paper-feature-more .paper-feature-title-m{display:none}.paper-feature-more p{font-size:14.5px;color:var(--ink-soft);line-height:1.55;margin:10px 0 12px;max-width:30em}.paper-features-stage{min-width:0}.paper-feature-panel{animation:paper-feature-in .25s ease-out}@keyframes paper-feature-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){.paper-feature-panel{animation:none}}.paper-crop{position:relative;height:380px;overflow:hidden;background:var(--paper-card)}.paper-crop img{position:absolute;left:0;top:0;max-width:none;height:auto;display:block}.paper-crop-anonymize img{width:150%;transform:translate(-1.5%,-8%)}.paper-crop-review img{width:160%;transform:translate(-1%,-8%)}.paper-crop-manage img{width:150%;transform:translate(-6%,-9%)}.paper-qa{margin-top:110px;display:grid;grid-template-columns:1fr 1.4fr;gap:40px;align-items:start}.paper-qa h2{margin-bottom:12px}.paper-qa .q{border-top:1px solid var(--border-color);padding:18px 0}.paper-qa .q:last-child{border-bottom:1px solid var(--border-color)}.paper-qa .q a{display:block;font-weight:500;font-size:15px;color:var(--color);margin-bottom:6px}.paper-qa .q a:hover{color:var(--accent);text-decoration:none}.paper-qa .q p{margin:0;font-size:14px;color:var(--ink-soft);line-height:1.6}@media (max-width:1100px){.paper-hero-shot .paper-frame{width:100%}}@media (max-width:991px){.paper-hero{grid-template-columns:1fr;gap:36px;padding-top:40px}.paper-qa,.paper-section-head{grid-template-columns:1fr;gap:16px}.paper-stats-grid{grid-template-columns:1fr 1fr}.paper-stat-card:nth-child(2n){border-right:0;margin-right:0;padding-right:0}.paper-stat-card:nth-child(-n+2){border-bottom:1px solid var(--border-color)}}@media (max-width:767px){.paper-hero,.paper-wrap{padding-left:20px;padding-right:20px}.paper-hero h1.hero-title{font-size:clamp(2.4rem,11vw,3.25rem)}.hero-subtitle{font-size:16px}.paper-cta-row .btn-hero{width:100%;justify-content:center}.paper-proof{margin-top:48px}.paper-stat-card{padding:18px 16px 16px 0;margin-right:16px}.paper-stat-value{font-size:36px}.paper-qa,.paper-section-head{margin-top:72px}.paper-preview{grid-template-columns:1fr}.paper-preview .pane-body{font-size:11.5px;line-height:1.8}.paper-features{display:flex;flex-wrap:wrap;gap:0;padding-top:0;border-top:0;margin-top:24px}.paper-feature,.paper-features-list,.paper-features-stage{display:contents}.paper-feature-tab{order:1;flex:1 1 0;width:auto;padding:12px 0 10px;border-bottom:2px solid var(--border-color);border-radius:0;text-align:left}.paper-feature.is-on .paper-feature-tab{border-bottom-color:var(--color)}.paper-feature-tab .paper-eyebrow{margin:0;font-size:10.5px;letter-spacing:.08em}.paper-feature-tab .paper-feature-title{display:none}.paper-feature-panel{order:2;width:100%;margin-top:20px;animation:none}.paper-crop{height:240px}.paper-crop-anonymize img{width:230%;transform:translate(-1.5%,-8%)}.paper-crop-review img{width:240%;transform:translate(-1%,-8%)}.paper-crop-manage img{width:220%;transform:translate(-3%,-9%)}.paper-feature-more{order:3;width:100%}.paper-feature.is-on .paper-feature-more{margin-top:18px}.paper-feature-more .paper-feature-title-m{display:block;font-size:26px;line-height:1.1}.paper-feature-more p{max-width:none}.paper-footer-inner>.paper-footer-brand{grid-column:1/-1}.paper-footer-foot{flex-direction:column;gap:6px}}.dropdown-menu{background-color:var(--paper-card,var(--main-bg-color))!important;color:var(--color)!important;border:1px solid var(--border-color)!important;border-radius:8px!important;box-shadow:0 12px 28px rgba(26,24,21,.08),0 2px 6px rgba(26,24,21,.05)!important;padding:6px!important;font-family:var(--font-sans);font-size:13px;min-width:11rem}.dropdown-menu .dropdown-item{color:var(--color)!important;padding:7px 10px!important;border-radius:5px;font-size:13px}.dropdown-menu .dropdown-item:focus,.dropdown-menu .dropdown-item:hover{background:var(--hover-bg-color)!important;color:var(--color)!important}.dropdown-menu .dropdown-divider{border-top-color:var(--border-color)!important;margin:4px 2px}.dropdown-menu .dropdown-header{color:var(--ink-muted);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase}.body,.file-content,.markdown-body{background-color:var(--main-bg-color)!important;color:var(--color)!important}.markdown-body table tr{background-color:var(--main-bg-color);border-top:1px solid var(--border-color)}.markdown-body table tr:nth-child(2n){background-color:var(--paper-bg-alt)}.markdown-body table td,.markdown-body table th{border:1px solid var(--border-color)}.file-content{padding:4px 7px;text-align:left;min-height:100%}.badge{font-size:75%;font-weight:500;padding:3px 8px;border-radius:10px;vertical-align:middle}.warning-feedback{width:100%;margin-top:.25rem;font-size:80%;color:#dc8e35}.dropdown-item:focus,.dropdown-item:hover{background-color:var(--hover-bg-color)}.card-header .btn,.card-header .btn:focus,.card-header .btn:hover{border:none!important;background:0 0!important}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:var(--button-height);padding:7px var(--button-padding-x);font:500 var(--button-font-size)/var(--button-line-height) var(--font-sans);vertical-align:middle;max-width:100%;transition:background-color 120ms ease,border-color 120ms ease,color 120ms ease;color:var(--btn-color);border:1px solid var(--border-color);background:var(--paper-card);border-radius:var(--radius-button);white-space:nowrap}.btn:active,.btn:hover{color:var(--btn-color);border:1px solid var(--border-color);background-color:var(--hover-bg-color);box-shadow:none!important}.btn.btn-primary{color:var(--primary-color);background-color:var(--primary-bg)}.btn.btn-primary:active,.btn.btn-primary:hover{color:var(--primary-active-color);background-color:var(--primary-hover-bg)!important}.btn::placeholder{color:var(--color);opacity:1}.white_border{border:1px solid #fff;color:#fff}.leftCol{display:flex;position:relative;flex:0 0 auto;width:100%;z-index:9;flex-direction:column}.card,.leftCol,.sidePanel{background-color:var(--sidebar-bg-color);border:1px solid var(--border-color)}@media (min-width:768px){.leftCol{flex:0 0 310px;width:310px;height:100%}}.leftCol-search{padding:10px 12px 0}.tree-search-box{display:flex;align-items:center;gap:8px;background:var(--canvas-bg-color);border:1px solid var(--border-color);border-radius:8px;padding:7px 10px;transition:border-color .15s}.tree-search-box:focus-within{border-color:var(--ink-muted)}.tree-search-icon{font-size:12px;color:var(--ink-muted);flex-shrink:0}.tree-search-input{flex:1;border:none;outline:0;background:0 0;font-family:var(--font-sans);font-size:13px;color:var(--color);min-width:0}.tree-search-input::placeholder{color:var(--ink-muted)}.tree-search-kbd{font-family:var(--font-sans);font-size:11px;color:var(--ink-muted);background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:4px;padding:1px 6px;line-height:1.4;flex-shrink:0}.tree-search-clear{background:0 0;border:none;color:var(--ink-muted);font-size:16px;cursor:pointer;padding:0 2px;line-height:1}.tree-search-clear:hover{color:var(--color)}.leftCol-project-header{display:flex;align-items:baseline;justify-content:space-between;padding:12px 14px 4px;gap:8px}.project-name{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.project-file-count{font-family:var(--font-sans);font-size:12px;color:var(--ink-muted);white-space:nowrap;flex-shrink:0}.files{position:relative;display:block;overflow:auto;height:100%;padding:4px 6px}.files ul{list-style:none;margin:0;padding:0}.files li ul{padding-left:8px;margin-left:7px;border-left:1px solid var(--border-color)}.files .folder>ul{display:none}.files .folder.open>ul{display:block}.files .file,.files .folder{position:relative;color:var(--ink-soft);cursor:pointer;word-break:break-all}.files a{display:flex;align-items:center;gap:4px;padding:1px 8px 1px 2px;font-family:var(--font-sans);font-size:13px;color:var(--ink-soft);border-radius:4px;text-decoration:none;line-height:1.5;position:relative}.files a:hover{background:var(--hover-bg-color);color:var(--color);text-decoration:none}.files:focus{outline:0}.files a.tree-focused{background:var(--hover-bg-color);color:var(--color)}.files .file.active>a{background:rgba(128,128,128,.15);color:var(--color)}.files .file.active>a .tree-icon-file{color:#5b7ba5}.files .file.active>a .tree-count{color:var(--ink-muted)}.tree-icon-file,.tree-icon-folder{display:inline-block;flex-shrink:0}.tree-icon-folder{width:14px;height:12px;color:var(--ink-muted);opacity:.75}.tree-icon-folder svg{display:block;width:100%;height:100%;fill:currentColor;fill-opacity:0;stroke:currentColor;stroke-width:1.2;stroke-linejoin:round}.files .folder.open>a .tree-icon-folder{color:#a07d2e;opacity:.9}.files .folder.open>a .tree-icon-folder svg{fill-opacity:.12}.dark-mode .files .folder.open>a .tree-icon-folder{color:#c9a03a}.tree-icon-file{width:16px;font-size:14px;text-align:center;color:#5b7ba5}.dark-mode .files .file.active>a .tree-icon-file,.dark-mode .tree-icon-file{color:#7ba3d0}.tree-toggle{display:inline-flex;align-items:center;justify-content:center;width:10px;height:14px;flex-shrink:0;opacity:.6}.tree-toggle::after{content:"";display:block;width:0;height:0;border-style:solid;border-width:3px 0 3px 4.5px;border-color:transparent transparent transparent var(--ink-muted);transition:transform .12s ease}.files .folder.open>a .tree-toggle::after{transform:rotate(90deg)}.tree-spacer{display:inline-block;width:10px;flex-shrink:0}.tree-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-count{font-family:var(--font-sans);font-size:11px;color:var(--ink-muted);flex-shrink:0;margin-left:auto;padding-left:8px;opacity:.7}.files .folder>a{color:var(--color)}.files .file::before,.files .folder::before{display:none}.files .folder>a::after{display:none}.tree-search-path{color:var(--ink-muted);font-size:11px}.tree-search-empty{padding:16px 12px;color:var(--ink-muted);font-size:12.5px;font-family:var(--font-sans);text-align:center}.leftCol{background:var(--paper-bg-alt,#f3f1ec);border-right:1px solid var(--border-color)}.dark-mode .leftCol{background:var(--sidebar-bg-color)}.status-bar{background:var(--canvas-bg-color);border-bottom:1px solid var(--border-color);padding:10px 14px}.paths .breadcrumb-item,.paths .breadcrumb-item a{font-family:var(--font-mono);font-size:12px;color:var(--ink-muted);letter-spacing:.02em}.paths .breadcrumb-item.active,.paths .breadcrumb-item:last-child{color:var(--color)}.paths .breadcrumb-item+.breadcrumb-item::before{content:'/';color:var(--ink-muted)}.last-update{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);padding:8px 10px;border-top:1px solid var(--border-color);letter-spacing:.02em}.ace_editor{height:100%}.ace_scroller{cursor:default}.status-bar{display:flex;align-items:center;gap:12px;background-color:var(--canvas-bg-color);padding:10px 14px;margin:0;border-bottom:1px solid var(--border-color);border-radius:0;flex-shrink:0}.status-bar-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.status-bar-actions .btn{display:inline-flex;align-items:center;gap:6px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);border-radius:6px;padding:4px 10px;font-size:12.5px;min-height:30px}.status-bar-actions .btn:hover{background:var(--hover-bg-color);color:var(--color)}.status-bar-actions .btn.btn-active{border-color:currentColor;font-weight:600}.paths{flex:1 1 auto;min-width:0;padding:0;margin:0;background-color:initial;border:none;border-radius:0;align-items:center;overflow-x:auto;white-space:nowrap;flex-wrap:nowrap}.paths::-webkit-scrollbar{display:none}.paths a{color:var(--color)}.paths .breadcrumb-item{padding-left:3px}.paths .breadcrumb-item::before{padding-right:3px}.content{height:100%;overflow:scroll;padding-top:42px;background-color:var(--main-bg-color);text-align:center}.image-content{max-width:100%;max-height:100%;text-align:center;padding:4px}.pdf-viewer{display:flex;flex-direction:column;height:100%;min-height:0;background-color:var(--main-bg-color)}.pdf-toolbar{display:flex;align-items:center;gap:4px;flex:0 0 auto;padding:4px 8px;border-bottom:1px solid var(--border-color,rgba(0,0,0,.12))}.pdf-toolbar-group{display:inline-flex;align-items:center;gap:4px}.pdf-toolbar-right{margin-left:auto}.pdf-toolbar-btn{border:0;background:0 0;color:inherit;padding:4px 8px;border-radius:4px;font-size:13px;line-height:1.2;cursor:pointer}.pdf-toolbar-btn:hover:not(:disabled){background-color:rgba(128,128,128,.18)}.pdf-toolbar-btn:disabled{opacity:.4;cursor:default}.pdf-toolbar-zoom{min-width:52px;font-variant-numeric:tabular-nums}.pdf-toolbar-page{width:3.5em;text-align:right;padding:2px 4px;font-size:13px;color:inherit;background:0 0;border:1px solid var(--border-color,rgba(0,0,0,.2));border-radius:4px}.pdf-toolbar-count{font-size:13px;opacity:.75;font-variant-numeric:tabular-nums}.pdf-pages{flex:1 1 auto;min-height:0;overflow:auto;padding:8px 0}.pdf-viewer-page{margin:0 auto 12px}.pdf-viewer-page canvas{display:block;box-shadow:0 1px 4px rgba(0,0,0,.25)}.pdf-viewer-error{padding:24px;text-align:center;font-weight:700}.html-doc{display:block;height:100%}.html-doc-frame{display:block;width:100%;height:100%;border:0;background-color:#fff}.file-error{font-weight:700;font-size:50px;text-align:center}pdfviewer{display:block;padding:15px}pdfpageviewer{display:block;width:100%;margin-bottom:10px}notebook{display:block;text-align:left;padding:15px}@media (min-width:768px){notebook{padding-left:100px}}.nb-output td,.nb-output th{border:1px solid var(--border-color)!important}.paper-faq{max-width:1180px;margin:0 auto;padding:48px 32px 80px;font-family:var(--font-sans)}.paper-faq-hero{padding-bottom:40px;border-bottom:1px solid var(--border-color);margin-bottom:36px}.paper-faq-eyebrow{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);letter-spacing:.14em;text-transform:uppercase;margin-bottom:32px}.paper-faq-title{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.6rem,5.5vw,4.6rem);line-height:1.03;letter-spacing:-.02em;color:var(--color);margin:0 0 22px;max-width:14em}.paper-faq-title em{font-style:italic;color:var(--color)}.paper-faq-lede{color:var(--ink-soft);font-size:17px;line-height:1.55;max-width:38em;margin:0}.paper-faq-lede a{color:var(--color);border-bottom:1px solid var(--color)}.paper-faq-lede a:hover{color:var(--accent);border-bottom-color:var(--accent)}.paper-faq-body{display:grid;grid-template-columns:220px 1fr;gap:60px;align-items:start}.paper-faq-toc{position:sticky;top:32px;font-size:13.5px}.paper-faq-toc-head{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);letter-spacing:.14em;text-transform:uppercase;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid var(--border-color)}.paper-faq-toc nav{display:flex;flex-direction:column}.paper-faq-toc nav a{color:var(--ink-soft);padding:8px 0 8px 14px;border-left:2px solid transparent;text-decoration:none;margin-left:-2px}.paper-faq-toc nav a.active,.paper-faq-toc nav a:hover{color:var(--color);border-left-color:var(--color)}.faq-section{min-width:0}.faq-section>div{width:100%}.faq-section h4.faq-cat{font-family:var(--font-serif);font-weight:400;font-size:clamp(1.7rem,2.6vw,2.2rem);letter-spacing:-.015em;color:var(--color);margin:0 0 6px;padding-bottom:14px;border-bottom:1px solid var(--border-color)}.faq-section h4.faq-cat i{display:none}.faq-section .panel-group{margin-bottom:56px}.faq-section .panel-default .panel-title a{display:block;position:relative;padding:22px 0 22px 42px;font-family:var(--font-serif);font-weight:400;font-size:20px;line-height:1.35;letter-spacing:-.005em;color:var(--color);text-decoration:none;cursor:pointer}.faq-section .panel-default .panel-title a:hover{color:var(--accent)}.faq-section .panel-heading{background:0 0;padding:0!important;border:none}.faq-section .panel-default{background:0 0;border:none;border-bottom:1px solid var(--border-soft);border-radius:0;margin-bottom:0!important;box-shadow:none}.faq-section .panel-default .panel-title{margin-bottom:0}.faq-section .panel-default .panel-title a:after{content:"−";position:absolute;left:0;right:auto;top:22px;transform:none;font-family:var(--font-mono);font-size:18px;line-height:1.35;color:var(--ink-muted);float:none;margin:0;font-weight:400}.faq-section .panel-default .panel-title a.collapsed:after{content:"+"}.faq-section .panel-default .panel-body{padding:0 0 22px 42px!important;color:var(--ink-soft);font-size:15px;line-height:1.65;border-top:none;max-width:42em}.table{color:var(--color)}.dropdown-divider,.table td,.table th,hr{border-color:var(--border-color)}.table.repositories td{word-break:break-word}loc{display:block;position:relative;width:100%;height:5px}loc .lang{float:left;height:100%}.rounded-circle.fa{display:inline-block;font-size:75px;height:140px;width:140px;border:4px solid;line-height:140px;text-align:center}.featurette-divider{margin:4.5rem 0;border-color:var(--border-color)}.featurette-heading{font-family:var(--font-serif);font-weight:400;font-size:2rem;line-height:1.15;letter-spacing:-.02em;margin-bottom:14px;color:var(--color)}.dark-mode .shadow{box-shadow:none}.dark-mode .overflow-auto::-webkit-scrollbar{width:10px}.dark-mode .overflow-auto::-webkit-scrollbar-track{-webkit-box-shadow:none;background:inherit;border-radius:0}.dark-mode .overflow-auto::-webkit-scrollbar-thumb{border-radius:10px;border:1px solid var(--border-color);background-color:var(--hover-bg-color)}.dark-mode .rgba-gradient{background:linear-gradient(135deg,#2a2d4a,#151728)}.section-number{padding-right:10px;font-weight:700;font-style:italic}.org-subscript-child{font-size:85%}.highlighted-line{position:absolute;background:rgba(100,200,100,.5);z-index:20}code,pre{font-family:"Fira Code","Courier New",Courier,monospace;line-height:1.1;color:var(--color)}.diff-file,.diff-index,.diff-lines{background:rgba(172,172,172,.5)}.diff-add{background:rgba(100,200,100,.5)}.diff-remove{background:rgba(200,100,100,.5)}.dashboard-title{font-size:1.4rem;font-weight:600;letter-spacing:-.01em}.quota-row{display:flex;gap:16px;margin-bottom:16px;padding:0}.quota-item{flex:1;min-width:0}.quota-header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px}.quota-label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;opacity:.7}.quota-value{font-size:.8rem;font-weight:500;font-variant-numeric:tabular-nums}.quota-progress{height:6px;border-radius:3px;background:var(--hover-bg-color)}.quota-progress .progress-bar{border-radius:3px}.filter-chip{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;font-size:.8rem;font-weight:500;background:var(--primary-bg);color:var(--primary-color);border-radius:12px;line-height:1.4}.filter-chip-close{display:inline-flex;align-items:center;justify-content:center;background:0 0;border:none;color:inherit;opacity:.7;cursor:pointer;padding:0;min-width:24px;min-height:24px;margin:-6px -6px -6px 0;font-size:1rem;line-height:1;border-radius:999px}.filter-chip-close:hover{opacity:1}.repo-list{list-style:none;padding:0;margin:0}.repo-list-item{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 0;border-bottom:1px solid var(--border-color);gap:12px}.repo-list-item:first-child{border-top:1px solid var(--border-color)}.repo-list-item.repo-inactive{opacity:.6}.repo-list-item-content{flex:1;min-width:0}.repo-list-item-header{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.repo-name{font-family:var(--font-mono);font-size:14px;font-weight:500;color:var(--color);word-break:break-word}.repo-name:hover{color:var(--accent)}.repo-source{font-size:.85rem;opacity:.8;display:flex;flex-wrap:wrap;align-items:center;gap:6px}.repo-date{opacity:.7}.repo-meta{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px;font-size:.8rem;opacity:.7}.repo-meta span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}.repo-list-item-actions{flex-shrink:0;padding-top:2px;margin-left:14px}.repo-list-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:48px 20px;opacity:.5;font-size:.95rem;list-style:none;border-bottom:1px solid var(--border-color);border-top:1px solid var(--border-color)}.repo-list-empty i{font-size:1.8rem}.type-badge{display:inline-flex;align-items:center;gap:3px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;padding:2px 8px;border-radius:4px;white-space:nowrap}.type-badge{font-family:var(--font-mono);letter-spacing:.06em;padding:2px 8px;border-radius:999px;border:1px solid var(--border-color);background:var(--paper-bg-alt,transparent)}.type-badge.type-pr,.type-badge.type-repo{background:var(--paper-bg-alt);color:var(--ink-muted);border-color:var(--border-color)}.dark-mode .type-badge.type-pr,.dark-mode .type-badge.type-repo{background:rgba(255,255,255,.06);color:var(--ink-muted);border-color:var(--border-color)}.type-badge.type-coauthor{background:rgba(99,102,241,.12);color:#4f46e5;border-color:rgba(99,102,241,.35);margin-left:6px}.dark-mode .type-badge.type-coauthor{background:rgba(129,140,248,.18);color:#a5b4fc;border-color:rgba(165,180,252,.45)}.btn-group .btn:not(.btn-primary){background:var(--hover-bg-color)}.anonymize-page{display:flex;flex-direction:column;min-height:0}.anonymize-landing{flex:1 1 0;min-height:min-content;display:flex;align-items:center;justify-content:center;padding:20px}.anonymize-landing-inner{width:100%;max-width:600px}.anonymize-landing-inner h2{font-weight:700}.anonymize-workspace{display:flex;flex-direction:column;flex:1 1 0;min-height:0;background:var(--canvas-bg-color)}.anonymize-topbar{background:var(--paper-card);border-bottom:1px solid var(--border-color);padding:18px 28px;flex:0 0 auto}.anonymize-topbar-inner{max-width:1400px;margin:0 auto}.anonymize-topbar-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.anonymize-topbar-title{margin:4px 0 0;font-size:clamp(1.8rem,3vw,2.4rem)}.anonymize-split{flex:1 1 auto;display:flex;min-height:0}.anonymize-form-col{flex:0 0 auto;width:100%;min-width:0;background:var(--canvas-bg-color);border-right:1px solid var(--border-color);overflow-y:auto}.anonymize-form-col .paper-settings-main{max-width:720px;padding:28px 32px 40px;margin:0}.anonymize-form-col .paper-settings-section:first-child{padding-top:0}.anonymize-form-col .anonymize-submit-bar{position:sticky;bottom:0;background:var(--canvas-bg-color);padding:14px 0 0;border-top:1px solid var(--border-color);margin-top:20px}.anonymize-form-col .anonymize-submit-bar .btn{width:100%;padding:12px 16px;font-size:15px}.anonymize-preview-col{flex:1 1 auto;min-width:0;overflow:auto;background:var(--paper-bg-alt);padding:28px 32px}.anonymize-preview-head{display:flex;align-items:baseline;gap:12px;padding-bottom:12px;border-bottom:1px solid var(--border-color);margin-bottom:20px}.anonymize-preview-head .paper-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.anonymize-preview-sub{color:var(--ink-soft);font-size:13px}.anonymize-preview-body{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:28px 32px}.form-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.form-grid-3{display:grid;grid-template-columns:2fr 1fr 1fr;gap:16px}@media (max-width:700px){.form-grid-2,.form-grid-3{grid-template-columns:1fr}}.paper-optional{font-family:var(--font-sans);font-weight:400;color:var(--ink-muted);text-transform:none;letter-spacing:0;font-size:11px;margin-left:6px}.paper-plan-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}.paper-plan-card{position:relative;display:block;padding:18px 20px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease;margin:0}.paper-plan-card input[type=radio]{position:absolute;opacity:0;pointer-events:none}.paper-plan-card.selected{border-color:var(--color);box-shadow:0 0 0 2px var(--color) inset}.paper-plan-head{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.paper-plan-price{font-family:var(--font-serif);font-size:2rem;color:var(--color);margin:6px 0 4px}.paper-plan-price .paper-plan-per{font-family:var(--font-sans);font-size:12px;color:var(--ink-soft)}.paper-plan-desc{font-size:13px;color:var(--ink-soft)}.paper-plan-desc ul{padding-left:18px;margin:0}.paper-settings-copy{color:var(--ink-soft);font-size:13px;margin:0 0 14px}.anonymize-section-title{font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;margin:18px 0 8px 0;padding-bottom:6px;border-bottom:1px solid var(--border-color);opacity:.7}.anonymize-section-title i{margin-right:4px}.anonymize-submit-bar{padding:12px 0 4px 0}.anonymize-submit-bar .btn{font-size:1rem;padding:10px 20px;font-weight:600}.anonymize-page .form-check{padding-top:4px;padding-bottom:4px}.anonymize-page .form-check-label{font-weight:500}.anonymize-preview-col{min-height:0;min-width:0}.pr-diff pre{overflow-x:auto;max-width:100%}@media (min-width:768px){.anonymize-form-col{height:100%;width:520px;flex:0 0 520px}.anonymize-preview-col{height:100%;flex:1}}@media (max-width:767px){.anonymize-workspace{flex:0 0 auto;min-height:0}.anonymize-topbar{padding:14px 16px}.anonymize-topbar-title{font-size:1.6rem;margin-top:2px}.anonymize-split{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.anonymize-form-col{width:100%!important;flex:0 0 auto!important;height:auto!important;border-right:none;border-bottom:1px solid var(--border-color);overflow:visible}.anonymize-form-col .paper-settings-main{padding:18px 16px 24px;max-width:none}.anonymize-form-col .anonymize-submit-bar{position:sticky;bottom:0;margin:20px -16px 0;padding:12px 16px;background:var(--canvas-bg-color);border-top:1px solid var(--border-color);z-index:10}.anonymize-form-col .anonymize-submit-bar .btn{width:100%;padding:12px 16px;font-size:15px}.anonymize-preview-col{width:100%;flex:0 0 auto;height:auto!important;max-height:none;padding:18px 16px 24px;overflow:visible}.anonymize-preview-body{padding:16px;border-radius:8px}.anonymize-preview-body .pr-diff pre,.anonymize-preview-body pre{overflow-x:auto;max-width:100%}.anonymize-landing-inner{padding:16px}}@media (min-width:1280px){.anonymize-form-col{width:620px;flex:0 0 620px}}@media (max-width:767px){.btn{min-height:38px;padding:6px 14px;font-size:14px}.btn-sm{min-height:34px;padding:5px 10px}.navbar .nav-link{padding:8px 12px}.navbar .nav-link .fa,.navbar .nav-link .fab{font-size:24px;line-height:32px}.container.page{padding-left:15px;padding-right:15px;max-width:100%}h1{font-size:1.6rem}h2{font-size:1.35rem}h3{font-size:1.15rem}.repo-list-item{flex-direction:column}.repo-list-item-actions{align-self:flex-start}.quota-row{flex-direction:column;gap:10px;padding:10px 12px}.dropdown-menu{position:absolute;right:0;left:auto}.form-group{margin-bottom:12px}.form-control{font-size:16px}.status-bar{gap:6px;padding:8px 10px}.status-bar .btn{font-size:12px;padding:4px 10px;min-height:32px}.status-bar .paths{font-size:11.5px;overflow-x:auto;flex-wrap:nowrap;white-space:nowrap;-webkit-overflow-scrolling:touch}.status-bar .paths::-webkit-scrollbar{display:none}.status-bar-actions{flex-shrink:0;gap:4px}#home .display-4{font-size:1.8rem}#home h4.subtext-header{font-size:1rem}.progress:not(.quota-progress){min-width:120px!important}.badge{font-size:70%}.col-2.input-group{width:100%!important;max-width:100%;flex:0 0 100%}.color-text-secondary span{display:inline-block;margin-bottom:2px}.floatingchat-container-wrap{display:none!important}.anonymize-landing{align-items:flex-start;padding-top:60px}.anonymize-page .container-fluid>.row{height:auto!important;min-height:100%}.anonymize-form-col{width:100%!important;flex:0 0 100%!important;border-right:none;border-top:1px solid var(--border-color)}.anonymize-preview-col{height:auto!important;max-height:none}.anonymize-section-title{font-size:.8rem;margin:12px 0 8px 0}.anonymize-submit-bar{position:sticky;bottom:0;background:var(--sidebar-bg-color);padding:10px 0;margin:0 -12px;padding-left:12px;padding-right:12px;border-top:1px solid var(--border-color);z-index:10}.anonymize-submit-bar .btn{font-size:1rem;padding:12px 20px}.anonymize-page .form-check{padding-top:6px;padding-bottom:6px;min-height:36px}.anonymize-page .form-check-label{font-size:.95rem}.anonymize-page .card-body{padding:12px}.pr-title{font-size:1.15rem}.pr-diff pre{font-size:.75rem}.pr-comment .mb-1 h5{font-size:1rem}.nav-tabs .nav-link{padding:8px 12px;font-size:.9rem}}@media (min-width:768px) and (max-width:991px){.container.page{max-width:100%;padding-left:15px;padding-right:15px}.leftCol{flex:0 0 250px;width:250px}}.explorer-page{display:flex;height:100%;width:100%;background:var(--canvas-bg-color);position:relative}.explorer-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;overflow:hidden;background:var(--canvas-bg-color)}.explorer-content{flex:1 1 auto;min-height:0;width:100%;overflow:auto}.leftCol-close,.leftCol-head{display:none}.leftCol-body{flex:1 1 auto;min-height:0;overflow:auto}.leftCol-foot{padding:8px 12px;border-top:1px solid var(--border-color);background:var(--paper-bg-alt)}.leftCol-foot .last-update{display:block;border-top:none;padding:0}.leftCol-backdrop{display:none}.paper-inline-warning{display:flex;align-items:flex-start;gap:8px;margin:8px;padding:10px 12px;background:rgba(138,107,30,.08);border:1px solid rgba(138,107,30,.35);border-radius:8px;color:var(--color);font-size:12.5px;line-height:1.4}.paper-inline-warning i{color:#8a6b1e;margin-top:2px;flex-shrink:0}.dark-mode .paper-inline-warning i{color:#ffd37a}@media (min-width:768px){.leftCol-body{padding:8px 4px}}.sidebar-toggle{display:none;align-items:center;gap:8px;position:fixed;bottom:18px;right:18px;z-index:1100;padding:10px 14px;background:var(--color);color:var(--canvas-bg-color);border:1px solid var(--color);border-radius:999px;font-family:var(--font-sans);font-size:13px;font-weight:500;box-shadow:0 6px 20px rgba(0,0,0,.15);cursor:pointer;outline:0}.sidebar-toggle:hover{background:var(--primary-hover-bg)}.sidebar-toggle:focus,.sidebar-toggle:focus-visible{outline:0;box-shadow:0 6px 20px rgba(0,0,0,.15)}@media (max-width:991px){.sidebar-toggle{display:inline-flex}.leftCol{position:fixed;top:0;left:0;bottom:0;width:min(86vw,340px);max-width:340px;z-index:1200;border:none;border-right:1px solid var(--border-color);transform:translateX(0);transition:transform .22s ease;box-shadow:4px 0 24px rgba(0,0,0,.18);background:var(--sidebar-bg-color)}.leftCol.collapsed{transform:translateX(-105%);box-shadow:none;pointer-events:none}.leftCol-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--border-color);background:var(--paper-bg-alt)}.leftCol-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.leftCol-close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:0 0;border:1px solid var(--border-color);border-radius:8px;color:var(--ink-muted);cursor:pointer}.leftCol-close:hover{color:var(--color);border-color:var(--color)}.leftCol-foot{display:block}.leftCol-body{padding:4px 0}.leftCol-backdrop{display:block;position:fixed;inset:0;background:rgba(0,0,0,.32);z-index:1150;backdrop-filter:blur(2px)}.dark-mode .leftCol-backdrop{background:rgba(0,0,0,.5)}}.admin-nav{display:flex;gap:4px;padding:4px;margin:8px 0 20px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;flex-wrap:wrap}.admin-nav a{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:7px;color:var(--ink-muted);text-decoration:none;font-family:var(--font-mono);font-size:11.5px;font-weight:500;letter-spacing:.06em;text-transform:uppercase;transition:background-color .15s,color .15s;white-space:nowrap}.admin-nav a:hover{background:var(--paper-bg-alt);color:var(--color)}.admin-nav a.active{background:var(--color);color:var(--paper-card)}.admin-nav a i{font-size:12px;width:14px;text-align:center}@media (max-width:767px){.admin-nav{flex-direction:column}.admin-nav a{justify-content:flex-start}}.admin-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;margin-bottom:16px}.admin-stat-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:8px;padding:10px 12px}.admin-stat-card .stat-value{font-family:var(--font-serif);font-size:1.4rem;font-weight:400;line-height:1.1;color:var(--color)}.admin-stat-card .stat-label{font-family:var(--font-mono);font-size:9.5px;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;margin-top:4px}.admin-toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:16px 0 12px}.admin-toolbar .form-control{max-width:320px}@media (max-width:767px){.admin-toolbar .form-control{max-width:100%;width:100%}}.pagination-compact{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap;font-family:var(--font-mono);font-size:12px;color:var(--ink-muted)}.pagination-compact input{width:60px;text-align:center;flex-shrink:0}.pagination-compact .btn{padding:4px 10px;min-height:34px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);flex-shrink:0}.pagination-compact>span{white-space:nowrap}.admin-list-item{display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-bottom:1px solid var(--border-color)}.admin-list-item:last-child{border-bottom:none}.admin-list-item .item-main{flex:1;min-width:0}.admin-list-item .item-title{font-size:1rem;font-weight:600;margin-bottom:4px;word-break:break-word}.admin-list-item .item-meta{font-size:.85rem;opacity:.8}.admin-list-item .item-meta span{margin-right:12px;display:inline-block;margin-bottom:2px}.admin-list-item .item-actions{flex-shrink:0}@media (max-width:767px){.admin-list-item{flex-direction:column;gap:8px}.admin-list-item .item-actions{align-self:flex-start}}.status-badge{display:inline-block;font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px;text-transform:uppercase;letter-spacing:.3px;vertical-align:middle}.status-badge{font-family:var(--font-sans);font-weight:500;letter-spacing:.02em;border:1px solid transparent;text-transform:none;font-size:11.5px;padding:1px 9px 2px;border-radius:999px}.status-badge.status-ready{background:#e8f3ec;color:#2f7a44;border-color:#cfe6d6}.status-badge.status-error{background:#fbe7e7;color:#b42318;border-color:#f3c7c7}.status-badge.status-download,.status-badge.status-preparing{background:#eef0ff;color:#3b4ad6;border-color:#d4d8fa}.status-badge.status-expired,.status-badge.status-expiring,.status-badge.status-removed,.status-badge.status-removing{background:var(--paper-bg-alt);color:var(--ink-muted);border-color:var(--border-color)}.status-badge.status-active{background:#e8f3ec;color:#2f7a44;border-color:#cfe6d6}.queue-job-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 18px;margin-bottom:10px}.queue-job-card .job-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;flex-wrap:wrap;gap:8px}.queue-job-card .job-id{font-family:var(--font-mono);font-size:.95rem;color:var(--color);word-break:break-all;display:flex;align-items:center;gap:10px}.queue-job-card .job-timestamps{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);display:flex;flex-wrap:wrap;gap:14px}.queue-job-card .job-actions{display:flex;gap:8px;margin-top:10px}.queue-job-card .job-actions .btn{font-size:12px;padding:4px 12px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color)}.admin-section-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:24px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--border-color)}.admin-section-header h2{margin:0;font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em}.admin-section-header h2 i{margin-right:6px;color:var(--ink-muted)}.admin-section-header .section-count{background:var(--paper-bg-alt);color:var(--ink-muted);border:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;padding:1px 10px;border-radius:999px}.user-detail-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:22px;margin-bottom:24px}.user-detail-card .user-header{display:flex;align-items:center;gap:16px;margin-bottom:18px;padding-bottom:16px;border-bottom:1px solid var(--border-color);flex-wrap:wrap}.user-detail-card .user-header img{border-radius:50%}.user-detail-card .user-header h2{margin:0;font-family:var(--font-serif);font-weight:400;font-size:1.6rem;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.user-detail-grid{display:grid;grid-template-columns:160px 1fr;gap:10px 20px;font-size:.92rem}.user-detail-grid .detail-label{font-family:var(--font-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);white-space:nowrap;padding-top:2px}.user-detail-grid .detail-value{word-break:break-all;color:var(--color)}@media (max-width:767px){.user-detail-grid{grid-template-columns:1fr}.user-detail-grid .detail-label{margin-top:8px;border-top:1px solid var(--border-color);padding-top:8px}.user-detail-grid .detail-label:first-child{border-top:none;margin-top:0;padding-top:0}}.paper-empty{min-height:calc(100vh - 60px);display:flex;align-items:center;justify-content:center;padding:40px 24px}.paper-empty-inner{max-width:560px;text-align:left}.paper-empty-title{font-family:var(--font-serif);font-weight:400;font-size:clamp(2.4rem,6vw,4.4rem);line-height:1.02;letter-spacing:-.025em;margin:18px 0 20px;color:var(--color)}.paper-empty-title em{color:var(--accent);font-style:italic}.paper-empty-lede{font-size:17px;line-height:1.55;color:var(--ink-soft);text-wrap:pretty}.paper-empty-cta{display:flex;gap:10px;margin-top:28px;flex-wrap:wrap}.paper-page{max-width:1100px;margin:0 auto;padding:32px 32px 80px}@media (max-width:991px){.paper-page,.paper-page.container,.paper-page.container-fluid{padding:20px 18px 60px!important}.paper-page .row{margin-left:0;margin-right:0}.paper-page .row>.w-100,.paper-page .row>[class*=col]{padding-left:0;padding-right:0}.navbar.navbar-expand-lg{padding:10px 18px!important}.navbar .navbar-collapse{margin:10px -18px 0;padding:12px 18px 16px;border-top:1px solid var(--border-color);background:var(--header-bg-color)}.navbar .navbar-nav{align-items:stretch!important;gap:2px}.navbar .navbar-nav .nav-item,.navbar .navbar-nav .nav-link{width:100%}.navbar .nav-link{display:flex!important;align-items:center;justify-content:flex-start;margin:0!important;padding:12px 4px!important;border-bottom:1px solid var(--border-color)!important;border-radius:0;font-size:14px;line-height:1.2;gap:0;min-height:44px;box-sizing:border-box}.navbar .nav-link:not(.btn-signin):not(.user-chip){color:var(--color)!important}.navbar .nav-link .fa,.navbar .nav-link .fab,.navbar .nav-link .fas,.navbar .nav-link i{display:inline-flex!important;align-items:center;justify-content:center;width:28px;flex-shrink:0;font-size:16px;line-height:1;margin:0 10px 0 0!important}.navbar .navbar-nav .nav-item:last-child .nav-link,.navbar .navbar-nav>.nav-link:last-child{border-bottom-color:transparent!important}.navbar .nav-link.active{color:var(--color)!important;border-bottom-color:var(--border-color)!important}.navbar .nav-item>.nav-link:not(.btn-signin):not(.user-chip)::before{content:'';display:inline-block;width:28px;margin-right:10px;flex-shrink:0}.navbar .nav-link.nav-icon::before,.navbar .nav-link:has(>i)::before{display:none!important}.navbar .nav-link.nav-icon{width:100%!important;height:auto!important;justify-content:flex-start!important;padding:12px 4px!important}.navbar .nav-link.nav-icon::after{content:attr(title);font-family:var(--font-sans);font-size:14px;color:var(--color)}.navbar .btn-signin{display:inline-flex!important;width:auto!important;align-self:flex-start;justify-content:center;height:40px;padding:0 18px!important;margin:14px 0 0!important;border-radius:8px;border-bottom:none!important}.navbar .btn-signin i{margin:0 8px 0 0!important;width:auto!important}.navbar .user-chip-wrap{width:100%}.navbar .user-chip{display:flex!important;width:100%;margin:0!important;padding:10px 4px!important;background:0 0!important;border:none!important;border-bottom:1px solid var(--border-color)!important;border-radius:0!important;justify-content:flex-start;gap:0;min-height:44px}.navbar .user-chip::before{display:none!important}.navbar .user-chip img{width:28px!important;height:28px!important;margin-right:10px!important;flex-shrink:0}.navbar .user-chip .user-chip-name{font-size:14px;font-weight:500;color:var(--color)!important}.navbar .user-chip.dropdown-toggle::after{margin-left:auto;color:var(--ink-muted)}.navbar .user-chip-wrap .dropdown-menu{position:static!important;float:none;width:100%;margin:0!important;padding:0!important;background:0 0!important;border:none!important;box-shadow:none!important;transform:none!important}.navbar .user-chip-wrap .dropdown-menu .dropdown-item{padding:10px 4px 10px 42px!important;font-size:13.5px;color:var(--ink-muted)!important;background:0 0!important;border-bottom:1px solid var(--border-color);text-align:left!important}.navbar .user-chip-wrap .dropdown-menu .dropdown-item:last-child{border-bottom:none}.navbar .user-chip-wrap .dropdown-divider{display:none}.navbar-brand{border-right:none!important;padding-right:0!important;margin-right:0!important}.dark-mode .navbar .navbar-collapse{background:var(--header-bg-color);border-top-color:var(--border-color)}.dark-mode .navbar .nav-link{border-bottom-color:var(--border-color)!important}.dark-mode .navbar-toggler .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' d='M4 8h22M4 15h22M4 22h22'/%3E%3C/svg%3E")!important}}.status-pill{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;background:var(--paper-bg-alt);border:1px solid var(--border-color);color:var(--ink-soft);font-family:var(--font-mono);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase}.paper-progress{position:relative;height:auto;background:0 0;margin:18px 0 8px}.paper-progress::before{content:"";display:block;height:8px;background:var(--paper-bg-alt);border-radius:999px}.paper-progress .paper-progress-bar{position:absolute;top:0;left:0;height:8px;background:var(--color);border-radius:999px;transition:width .4s ease;min-width:4px}.paper-progress .paper-progress-label{display:flex;justify-content:space-between;align-items:center;margin-top:10px;font-family:var(--font-mono);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.paper-progress .paper-progress-pct{color:var(--color)}.paper-progress.paper-progress-ready .paper-progress-bar{background:var(--color)}.paper-error-card{margin-top:18px;padding:20px 22px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-left:3px solid #c53030;border-radius:10px;color:var(--color)}.dark-mode .paper-error-card{border-left-color:#ff8b7b}.paper-ratelimit-card{margin-top:18px;padding:20px 22px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-left:3px solid #d69e2e;border-radius:10px;color:var(--color)}.dark-mode .paper-ratelimit-card{border-left-color:#f6e05e}.paper-ratelimit-head{display:flex;align-items:flex-start;gap:14px}.paper-ratelimit-head>i{font-size:18px;color:#d69e2e;margin-top:4px;flex-shrink:0}.dark-mode .paper-ratelimit-head>i{color:#f6e05e}.paper-ratelimit-card strong{color:var(--color)}.status-pill-ratelimit{border-color:#d69e2e;color:#d69e2e}.dark-mode .status-pill-ratelimit{border-color:#f6e05e;color:#f6e05e}.status-ratelimit{background:#d69e2e}.dark-mode .status-ratelimit{background:#f6e05e}.paper-error-head{display:flex;align-items:flex-start;gap:14px}.paper-error-head>i{font-size:18px;color:#c53030;margin-top:4px;flex-shrink:0}.dark-mode .paper-error-head>i{color:#ff8b7b}.paper-error-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted)}.paper-error-title{font-family:var(--font-serif);font-size:1.4rem;line-height:1.2;margin-top:2px;color:var(--color)}.paper-error-msg{margin:12px 0 0;font-size:14px;line-height:1.55;color:var(--ink-soft);font-family:var(--font-mono);word-break:break-word;white-space:pre-wrap}.paper-error-hints{margin:14px 0 0;padding-left:18px;color:var(--ink-soft);font-size:13.5px;line-height:1.6}.paper-error-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.paper-detail-grid{display:grid;grid-template-columns:160px 1fr;gap:10px 20px;margin-top:18px;font-size:.92rem}.paper-detail-grid .detail-label{font-family:var(--font-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);white-space:nowrap;padding-top:2px}.paper-detail-grid .detail-value{word-break:break-all;color:var(--color)}.paper-detail-grid .detail-value a{color:var(--color);border-bottom:1px solid var(--border-color)}.paper-detail-grid .detail-value a:hover{border-bottom-color:var(--color)}@media (max-width:700px){.paper-detail-grid{grid-template-columns:1fr;gap:4px 0}.paper-detail-grid .detail-label{padding-top:8px}}.paper-support-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin:18px 0 28px}.paper-support-card{display:flex;flex-direction:column;gap:10px;padding:20px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;color:var(--color);text-decoration:none;transition:border-color .15s ease,transform .15s ease}.paper-support-card:hover{border-color:var(--color);text-decoration:none;color:var(--color)}.paper-support-card .paper-support-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);display:flex;align-items:center;gap:8px}.paper-support-card p{margin:0;font-size:14px;line-height:1.55;color:var(--ink-soft)}.paper-support-card .paper-support-cta{margin-top:auto;font-size:13px;font-weight:500;color:var(--color);display:inline-flex;align-items:center;gap:6px}.paper-support-card:hover .paper-support-cta i{transform:translateX(2px)}.paper-support-card .paper-support-cta i{transition:transform .15s ease}.paper-kofi-wrap{border:1px solid var(--border-color);border-radius:10px;overflow:hidden;background:var(--paper-card)}.paper-kofi-wrap iframe{border:0;width:100%;height:650px;display:block}.dark-mode .paper-kofi-wrap iframe{filter:invert(.88) hue-rotate(180deg) sepia(.15) saturate(1.2) brightness(1.1) contrast(.85)}@media (max-width:700px){.paper-kofi-wrap iframe{height:720px}}.pr-page{min-height:100%;background:var(--canvas-bg-color)}.pr-page-inner{padding-top:24px;padding-bottom:60px}.pr-header{margin:6px 0 18px}.pr-title{margin:4px 0 10px;font-size:clamp(1.6rem,3vw,2.4rem);line-height:1.15;word-break:break-word}.pr-header-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;font-family:var(--font-mono);font-size:12px;color:var(--ink-muted)}.pr-header-meta .pr-meta-item{display:inline-flex;align-items:center;gap:6px}.pr-header-meta .pr-meta-item i{color:var(--ink-muted)}.pr-body-card{margin:18px 0 24px;padding:20px 22px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px}.pr-body-card .paper-section-eyebrow{margin-bottom:12px}.paper-tabs{display:flex;flex-wrap:wrap;gap:0;border-bottom:1px solid var(--border-color);margin:18px 0 0}.paper-tabs .paper-tab{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;background:0 0;border:0;border-bottom:2px solid transparent;font-family:var(--font-sans);font-size:13.5px;font-weight:500;color:var(--ink-muted);cursor:pointer;transition:color .15s ease,border-color .15s ease;margin-bottom:-1px}.paper-tabs .paper-tab:hover{color:var(--color)}.paper-tabs .paper-tab.active{color:var(--color);border-bottom-color:var(--color)}.paper-tabs .paper-tab i{color:inherit;opacity:.85}.paper-tabs .paper-tab:active,.paper-tabs .paper-tab:focus,.paper-tabs .paper-tab:focus-visible{outline:0;box-shadow:none}.paper-tabs .paper-tab:focus-visible{color:var(--color);background:var(--hover-bg-color);border-radius:6px 6px 0 0}.pr-diff{margin:16px 0 28px;display:flex;flex-direction:column;gap:16px}.diff-file-block{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;overflow:hidden}.diff-file-header{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--paper-bg-alt);border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:12.5px;color:var(--color)}.diff-file-icon{color:var(--ink-muted);flex-shrink:0}.diff-file-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all}.diff-file-status{flex-shrink:0;padding:2px 8px;border-radius:999px;font-size:10px;letter-spacing:.12em;text-transform:uppercase;border:1px solid var(--border-color);color:var(--ink-muted);background:var(--paper-card)}.diff-file-status-added{color:#2f6b3e;border-color:rgba(47,107,62,.35);background:rgba(47,107,62,.08)}.diff-file-status-deleted{color:#a13a2e;border-color:rgba(161,58,46,.35);background:rgba(161,58,46,.08)}.diff-file-status-renamed{color:#8a6b1e;border-color:rgba(138,107,30,.35);background:rgba(138,107,30,.08)}.dark-mode .diff-file-status-added{color:#a7e2a7;border-color:rgba(167,226,167,.35);background:rgba(167,226,167,.08)}.dark-mode .diff-file-status-deleted{color:#ff8b7b;border-color:rgba(255,139,123,.35);background:rgba(255,139,123,.08)}.dark-mode .diff-file-status-renamed{color:#ffd37a;border-color:rgba(255,211,122,.35);background:rgba(255,211,122,.08)}.diff-file-table{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:12.5px;line-height:1.55;table-layout:fixed}.diff-file-table tr.diff-row{vertical-align:top}.diff-file-table .diff-gutter{width:48px;padding:0 10px;text-align:right;color:var(--ink-muted);background:var(--paper-bg-alt);border-right:1px solid var(--border-color);user-select:none;font-variant-numeric:tabular-nums;vertical-align:top;white-space:nowrap}.diff-file-table .diff-gutter-new{border-right:1px solid var(--border-color)}.diff-file-table .diff-sign{width:18px;padding:0 6px;text-align:center;color:var(--ink-muted);background:var(--paper-bg-alt);user-select:none;vertical-align:top}.diff-file-table .diff-code{padding:1px 12px;white-space:pre-wrap;word-break:break-word;color:var(--color)}.diff-row-hunk td{background:var(--paper-bg-alt)!important;color:var(--ink-muted);border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);font-size:12px;letter-spacing:.02em;padding-top:6px;padding-bottom:6px}.diff-row-hunk .diff-code{color:var(--ink-muted)}.diff-row-add .diff-code{background:rgba(47,107,62,.1);color:#1f4a2a}.diff-row-add .diff-gutter,.diff-row-add .diff-sign{background:rgba(47,107,62,.06);color:#2f6b3e}.diff-row-remove .diff-code{background:rgba(161,58,46,.1);color:#6e1f1a}.diff-row-remove .diff-gutter,.diff-row-remove .diff-sign{background:rgba(161,58,46,.06);color:#a13a2e}.dark-mode .diff-row-add .diff-code{background:rgba(167,226,167,.1);color:#c9f0c9}.dark-mode .diff-row-add .diff-gutter,.dark-mode .diff-row-add .diff-sign{background:rgba(167,226,167,.06);color:#a7e2a7}.dark-mode .diff-row-remove .diff-code{background:rgba(255,139,123,.1);color:#ffc9c0}.dark-mode .diff-row-remove .diff-gutter,.dark-mode .diff-row-remove .diff-sign{background:rgba(255,139,123,.06);color:#ff8b7b}@media (max-width:700px){.diff-file-table{font-size:11.5px}.diff-file-table .diff-gutter{width:36px;padding:0 6px}.diff-file-table .diff-sign{width:14px;padding:0 4px}.diff-file-table .diff-code{padding:1px 8px}}.pr-comments{list-style:none;margin:16px 0 28px;padding:0;display:flex;flex-direction:column;gap:12px}.pr-comment{padding:16px 18px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px}.pr-comment-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid var(--border-color)}.pr-comment-author{font-weight:600;color:var(--color);font-size:14px;display:inline-flex;align-items:center;gap:6px}.pr-comment-author i{color:var(--ink-muted);font-size:12px}.pr-comment-date{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);letter-spacing:.02em}.pr-comment-body{color:var(--color);font-size:14px;line-height:1.6}.pr-comment-body :last-child{margin-bottom:0}@media (max-width:700px){.pr-page-inner{padding-top:14px;padding-bottom:40px}.pr-body-card{padding:14px 14px;border-radius:8px}.pr-comment{padding:12px 14px}.paper-tabs .paper-tab{padding:10px 12px;font-size:13px}.pr-diff pre{font-size:11.5px;padding:12px}}.toast{background-color:var(--paper-card)!important;color:var(--color)!important;border:1px solid var(--border-color)!important;border-radius:10px!important;box-shadow:0 8px 24px rgba(0,0,0,.08);backdrop-filter:none;min-width:280px;max-width:calc(100vw - 24px)}.toast .toast-header{background:0 0!important;color:var(--color)!important;border-bottom:1px solid var(--border-color)!important;font-family:var(--font-sans);padding:10px 12px}.toast .toast-header strong{font-weight:600;color:var(--color);letter-spacing:.01em}.toast .toast-header .close{color:var(--ink-muted)!important;text-shadow:none;opacity:.9;font-size:1.2rem}.toast .toast-header .close:hover{color:var(--color)!important;opacity:1}.toast .toast-body{color:var(--color)!important;padding:12px;font-size:14px;line-height:1.45}.dark-mode .toast{box-shadow:0 8px 24px rgba(0,0,0,.5)}.paper-crumbs{font-family:var(--font-sans);font-size:12px;color:var(--ink-muted);letter-spacing:0}.paper-crumbs .here,.paper-crumbs a{color:var(--color);text-decoration:none}.paper-page-title{font-family:var(--font-sans);font-weight:600;font-size:32px;line-height:1.2;letter-spacing:-.035em;margin:8px 0 6px;color:var(--color)}.paper-page-title em{color:inherit;font-style:normal}.paper-page-lede{color:var(--ink-soft);font-size:16px;max-width:640px;line-height:1.55}.paper-meta-rule{display:flex;flex-wrap:wrap;gap:16px 24px;align-items:center;margin:22px 0 18px;padding:12px 0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);letter-spacing:.02em}.paper-meta-rule b{color:var(--color);font-weight:500}.paper-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:10px;padding:20px 22px}.dark-mode .paper-card{background:var(--admin-stat-bg)}.paper-section-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);font-weight:500;margin-bottom:10px;display:block}.paper-section-title{font-family:var(--font-serif);font-weight:400;font-size:22px;letter-spacing:-.01em;margin:0 0 8px}.paper-kbd{display:inline-block;font-family:var(--font-mono);font-size:10.5px;padding:1px 6px;border:1px solid var(--border-color);border-bottom-width:2px;border-radius:3px;background:var(--paper-card,#fff);color:var(--color)}.paper-pill{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:10.5px;padding:2px 8px;border:1px solid var(--border-color);border-radius:999px;color:var(--ink-soft);background:var(--paper-card,#fff);letter-spacing:.04em}.paper-pill.accent{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}.paper-pill.good{border-color:#2f6b3e;color:#2f6b3e}.paper-pill.warn{border-color:#8a6b1e;color:#8a6b1e}.paper-pill.bad{border-color:#a13a2e;color:#a13a2e}.paper-row{display:grid;grid-template-columns:1fr auto;gap:16px;align-items:start;padding:18px 0;border-bottom:1px solid var(--border-color)}.paper-row:first-child{border-top:1px solid var(--border-color)}.paper-row .row-title{font-family:var(--font-serif);font-size:20px;letter-spacing:-.01em;line-height:1.2}.paper-row .row-title a{color:var(--color)}.paper-row .row-meta{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);letter-spacing:.03em;margin-top:6px;display:flex;flex-wrap:wrap;gap:14px}.paper-row .row-actions{display:flex;gap:6px;flex-shrink:0}.paper-form-step{display:grid;grid-template-columns:48px 1fr;gap:20px;padding:22px 0;border-bottom:1px solid var(--border-color)}.paper-form-step:first-child{border-top:1px solid var(--border-color)}.paper-form-step .step-num{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);padding-top:4px;letter-spacing:.02em}.paper-form-step .step-title{font-family:var(--font-serif);font-size:22px;letter-spacing:-.01em;line-height:1.2;margin-bottom:4px}.paper-form-step .step-sub{color:var(--ink-soft);font-size:13.5px;margin-bottom:14px;text-wrap:pretty}.paper-field-label{font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--color);margin-bottom:6px;display:block}.paper-switch-row{display:flex;align-items:center;justify-content:space-between;padding:10px 0;gap:16px}.paper-switch-row+.paper-switch-row{border-top:1px dashed var(--border-soft)}.paper-switch-row .sw-label{font-weight:500}.paper-switch-row .sw-sub{display:block;font-size:12.5px;color:var(--ink-muted);margin-top:2px}.paper-page .custom-select,.paper-page .form-control{border-radius:6px;border-color:var(--border-color);font-size:14px;padding:8px 12px;height:auto;background:var(--input-bg);color:var(--input-color)}.paper-page .custom-select:focus,.paper-page .form-control:focus{color:var(--input-color);background:var(--input-bg);border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.custom-select:focus,.form-control:focus,input:focus,select:focus,textarea:focus{color:var(--input-color)!important;background-color:var(--input-bg)!important}.form-control::selection,input::selection,textarea::selection{background:var(--accent-soft);color:var(--input-color)}.dark-mode .form-control::selection,.dark-mode input::selection,.dark-mode textarea::selection{background:rgba(167,178,255,.3);color:var(--input-color)}.btn.btn-ink{background:var(--color);color:var(--canvas-bg-color);border:1px solid var(--color);font-weight:500;border-radius:6px;padding:8px 14px}.btn.btn-ink:hover{background:var(--primary-hover-bg);color:var(--canvas-bg-color);border-color:var(--primary-hover-bg)}.btn.btn-accent{background:var(--accent);color:#fff;border:1px solid var(--accent);font-weight:500;border-radius:6px}.btn.btn-accent:hover{background:#2e3bb8;border-color:#2e3bb8;color:#fff}.paper-page .dashboard-filter-row{display:flex;align-items:center;gap:10px;padding:14px 0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);margin:18px 0 0;flex-wrap:wrap}.paper-page .dashboard-filter-row .form-control{height:38px;background:var(--paper-card)}.paper-page .dashboard-filter-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.paper-page .dashboard-filter-row .btn-group .btn,.paper-page .dashboard-filter-row .dropdown-toggle{background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);height:38px;padding:0 14px;font-size:14px;font-weight:500;border-radius:var(--radius-control,6px);display:inline-flex;align-items:center;gap:6px;line-height:1}.paper-page .dashboard-filter-row .dropdown-toggle .filter-btn-label{color:var(--ink-muted);font-weight:500}.paper-page .dashboard-filter-row .dropdown-toggle .filter-btn-label::after{content:"·";margin-left:6px;color:var(--ink-faint)}.paper-page .dashboard-filter-row .dropdown-toggle .filter-btn-value{font-weight:500}.paper-page .dashboard-filter-row .dropdown-toggle .fas{font-size:11px;color:var(--ink-muted)}.paper-page .dashboard-filter-row .btn-group .btn:hover,.paper-page .dashboard-filter-row .dropdown-toggle:hover{background:var(--hover-bg-color);border-color:var(--border-color);color:var(--color)}.paper-page .dashboard-filter-row .btn-group{gap:0}.paper-page .dashboard-filter-row .btn-group .btn{border-radius:0;border-right-width:0}.paper-page .dashboard-filter-row .btn-group .btn:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.paper-page .dashboard-filter-row .btn-group .btn:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px;border-right-width:1px}.paper-page .dashboard-filter-row .btn-group .btn.btn-primary{background:var(--color);color:var(--canvas-bg-color);border-color:var(--color)}.paper-page .dashboard-filter-row .search-wrap{flex:1 1 280px;min-width:220px}.paper-page .quota-row{display:grid;grid-template-columns:repeat(3,1fr);gap:40px;margin:24px 0 0;padding:0;background:0 0;border:none;border-radius:0}.paper-page .quota-label{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);opacity:1}.paper-page .quota-value{font-family:var(--font-mono);font-size:13px;font-variant-numeric:tabular-nums;color:var(--color)}.paper-page .quota-value .quota-unlimited-tag{font-family:var(--font-sans);font-size:12px;color:var(--ink-muted);margin-left:4px}.paper-page .quota-track{height:6px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:999px;overflow:hidden;width:100%;min-width:0}.paper-page .quota-track .quota-fill{height:100%;min-width:2px;border-radius:999px;background:var(--color);transition:width .3s ease}.paper-page .quota-track.quota-warn .quota-fill{background:var(--status-progress)}.paper-page .quota-track.quota-danger .quota-fill{background:var(--status-error)}.paper-page .quota-track.quota-unlimited{background:repeating-linear-gradient(-45deg,var(--paper-bg-alt) 0 4px,var(--border-soft,var(--border-color)) 4px 6px)}.paper-page .repo-list{margin-top:8px}.paper-page .repo-list-item{padding:20px 0;gap:16px;border-bottom:1px solid var(--border-soft,var(--border-color))}.paper-page .repo-list-item:first-child{border-top:none}.paper-page .repo-list-item-header{gap:10px;margin-bottom:6px}.paper-page .repo-name{font-family:var(--font-mono);font-size:15px;color:var(--color)}.paper-page .repo-source{font-size:13px;color:var(--ink-soft);opacity:1;gap:10px}.paper-page .repo-source a{color:var(--ink-soft);border-bottom:1px dotted var(--border-color)}.paper-page .repo-source a:hover{color:var(--color)}.paper-page .repo-meta{font-family:var(--font-mono);font-size:12px;color:var(--ink-muted);opacity:1;gap:16px;margin-top:10px}.paper-page .type-badge{font-family:var(--font-mono);font-size:11px;padding:3px 8px;letter-spacing:.1em}.paper-page .repo-list-item-actions .dropdown-toggle{background:var(--paper-card);border:1px solid var(--border-color);color:var(--color);border-radius:6px;font-size:13px;padding:6px 12px;height:auto}.paper-settings{max-width:1180px;margin:0 auto;padding:48px 32px 80px}.paper-settings .paper-page-title{max-width:14em}.paper-settings-body{display:grid;grid-template-columns:220px 1fr;gap:60px;margin-top:32px;border-top:1px solid var(--border-color);padding-top:28px}.paper-settings-toc{position:sticky;top:32px;align-self:start}.paper-settings-toc-head{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);margin-bottom:12px}.paper-settings-toc nav{display:flex;flex-direction:column;gap:2px}.paper-settings-toc nav a{padding:8px 0 8px 14px;border-left:2px solid transparent;color:var(--ink-soft);font-size:14px;text-decoration:none}.paper-settings-toc nav a.active,.paper-settings-toc nav a:hover{color:var(--color);border-left-color:var(--color)}.paper-settings-main{min-width:0;max-width:720px}.paper-settings-section{padding:28px 0;border-bottom:1px solid var(--border-soft,var(--border-color))}.paper-settings-section:first-child{padding-top:0}.paper-settings-section:last-of-type{border-bottom:none}.paper-settings-section .form-group{margin-bottom:18px}.paper-settings-section .form-check{padding:10px 0 10px 28px;border-bottom:1px solid var(--border-soft,var(--border-color))}.paper-settings-section .form-check:last-child{border-bottom:none}.paper-settings-section .form-check-label{font-family:var(--font-sans);font-size:14px;font-weight:500;color:var(--color);cursor:pointer}.paper-settings-section .form-check-input{cursor:pointer;width:16px;height:16px;margin-top:3px;margin-left:-28px;accent-color:var(--color)}.paper-settings-section .form-text{color:var(--ink-soft);font-size:13px;margin-top:4px;max-width:48em}.paper-settings-section .paper-section-copy{margin:-4px 0 14px}.paper-settings-footer{padding-top:24px;display:flex;flex-direction:column;gap:14px}.paper-settings-footer .btn-ink{align-self:flex-start}.paper-settings-actions{display:flex;align-items:center;flex-wrap:wrap;gap:14px}.paper-settings-hint{font-size:13px;color:var(--ink-muted)}.paper-inline-alert{display:flex;align-items:flex-start;gap:8px;padding:10px 12px;border-radius:var(--radius-control,6px);border:1px solid var(--border-color);background:var(--paper-bg-alt);font-size:13px;color:var(--color)}.paper-inline-alert i{margin-top:2px;color:var(--ink-muted)}.paper-inline-alert-error{border-color:var(--status-error);background:var(--status-error-soft)}.paper-inline-alert-error i{color:var(--status-error)}.paper-account-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--border-color);border-radius:var(--radius-surface,10px);background:var(--paper-card);margin-bottom:20px}.paper-account-card img{flex-shrink:0}.paper-account-identity{flex:1 1 auto;min-width:0}.paper-account-name{font-family:var(--font-mono);font-size:14px;font-weight:500;color:var(--color)}.paper-account-meta{font-size:13px;color:var(--ink-muted);margin-top:2px}.paper-danger-zone{padding:16px;border:1px solid var(--status-error);border-radius:var(--radius-surface,10px);background:var(--status-error-soft)}.paper-danger-head{font-weight:600;font-size:14px;color:var(--status-error);margin-bottom:6px}.paper-danger-copy{font-size:13px;color:var(--ink-soft);max-width:52em;margin-bottom:12px}.paper-danger-zone .paper-inline-alert{margin-bottom:12px}.btn.btn-outline-danger{background:0 0;color:var(--status-error);border:1px solid var(--status-error);font-weight:500;border-radius:var(--radius-control,6px);padding:8px 14px}.btn.btn-outline-danger:hover{background:var(--status-error);color:#fff;border-color:var(--status-error)}.navbar .user-menu{min-width:260px}.navbar .user-menu .dropdown-item{display:flex;align-items:flex-start;gap:10px;padding:8px 10px!important}.navbar .user-menu .dropdown-item i{width:16px;margin-top:3px;font-size:13px;color:var(--ink-muted);text-align:center}.navbar .user-menu .dropdown-item span{display:flex;flex-direction:column;line-height:1.3}.navbar .user-menu .dropdown-item small{font-size:12px;color:var(--ink-muted)}.navbar .user-menu .dropdown-header{font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-muted);padding:8px 10px 6px}.paper-field-label{font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--color);margin-bottom:6px;display:block}@media (max-width:900px){.paper-settings-body{grid-template-columns:1fr;gap:24px}.paper-settings-toc{position:static}.paper-settings-toc nav{flex-direction:row;flex-wrap:wrap;gap:8px}.paper-settings-toc nav a{border-left:none;border-bottom:2px solid transparent;padding:4px 0}.paper-settings-toc nav a.active,.paper-settings-toc nav a:hover{border-bottom-color:var(--color);border-left:none}}.paper-table{display:block;margin-top:20px;background:0 0;border:none;border-top:1px solid var(--border-color);border-radius:0;overflow:visible}.paper-table .paper-table-head,.paper-table .paper-table-row{display:grid;grid-template-columns:minmax(280px,2.4fr) minmax(140px,1fr) 140px 90px 140px 52px;align-items:center;gap:18px;padding:12px 4px}.paper-table.paper-table-conferences .paper-table-head,.paper-table.paper-table-conferences .paper-table-row{grid-template-columns:minmax(280px,2.4fr) 140px 90px 220px 52px}.paper-table.paper-table-repos .paper-table-head,.paper-table.paper-table-repos .paper-table-row{grid-template-columns:minmax(280px,2.4fr) minmax(140px,1fr) 90px 140px 52px}.paper-table.paper-table-repos.has-bulk .paper-table-head,.paper-table.paper-table-repos.has-bulk .paper-table-row{grid-template-columns:28px minmax(280px,2.4fr) minmax(140px,1fr) 90px 140px 52px;gap:12px}.paper-table .admin-users-row{grid-template-columns:28px minmax(280px,2.4fr) 90px 120px 100px 52px!important;gap:12px!important}.paper-table.paper-table-dashboard .paper-table-head,.paper-table.paper-table-dashboard .paper-table-row{grid-template-columns:minmax(320px,3fr) 190px 90px 170px 52px;gap:20px;padding:8px 4px}.paper-table.paper-table-dashboard .cell-anon .anon-text{gap:2px}.paper-table.paper-table-dashboard .cell-anon .repo-name{padding:0}.paper-table .paper-table-head{background:0 0;border-bottom:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-muted);padding-top:8px;padding-bottom:8px}.paper-table .paper-table-head .sortable{cursor:pointer;user-select:none;display:inline-flex;align-items:center;gap:6px;background:0 0;border:none;padding:2px 0;margin:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;border-radius:4px}.paper-table .paper-table-head .sortable:hover{color:var(--color)}.paper-table .paper-table-head .sortable.active{color:var(--color)}.paper-table .paper-table-head .sortable i{font-size:10px}.paper-table .paper-table-head .num,.paper-table .paper-table-row .num{text-align:right}.paper-table .paper-table-head .num .sortable{flex-direction:row-reverse}.paper-table .paper-table-row{border-top:1px solid var(--border-soft,var(--border-color));font-size:14px;transition:background-color .12s ease}.paper-table .paper-table-row:hover{background:var(--hover-bg-color)}.paper-table .paper-table-row.row-clickable{cursor:pointer}.paper-table .paper-table-row.repo-inactive>:not(.cell-actions){opacity:.55}.paper-table .paper-table-row.repo-error{background:var(--status-error-soft);border-left:2px solid var(--status-error);padding-left:6px}.paper-table .paper-table-row.repo-error:hover{background:var(--status-error-soft-hover)}.cell-status .status-sub.status-sub-error,.paper-table .cell-status .status-sub-error{color:var(--status-error)}.paper-table .cell-status .status-sub-warn{color:var(--status-progress)}.paper-table .cell-anon{display:flex;align-items:center;gap:12px;min-width:0}.paper-table .cell-anon .type-badge{flex-shrink:0;min-width:52px;justify-content:center}.paper-table .cell-anon .anon-text{min-width:0;display:flex;flex-direction:column;gap:3px}.paper-table .cell-anon .anon-title{display:flex;align-items:center;gap:8px;min-width:0}.paper-table .cell-anon .anon-title .type-badge{margin-left:0}.paper-table .cell-anon .repo-name{font-family:var(--font-mono);font-size:14px;color:var(--color);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;max-width:100%;padding:2px 0}.paper-table .cell-anon .repo-name-static{color:var(--ink-muted);font-style:italic}.paper-table .cell-anon .anon-sub{font-family:var(--font-sans);font-size:13px;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:10px;min-width:0}.paper-table .cell-anon .anon-sub .anon-source{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-anon .anon-sub .conf-tag{flex:0 1 auto;min-width:72px;max-width:50%}.paper-table .cell-anon .anon-sub a{color:var(--ink-muted);border-bottom:1px dotted var(--border-color);padding:4px 0;margin:-4px 0}.paper-table .cell-anon .anon-sub a:hover{color:var(--color)}.paper-table .cell-anon .anon-sub .commit-hash{font-family:var(--font-mono);font-size:12px}.paper-table .cell-conf{font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-conf span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-status{display:flex;flex-wrap:wrap;align-items:center;gap:2px 8px;font-size:14px;color:var(--color);min-width:0}.paper-table .cell-status .status-line{display:inline-flex;align-items:center;gap:8px}.paper-table .cell-status .status-sub{flex-basis:100%;font-family:var(--font-sans);font-size:13px;line-height:1.3;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-views{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color)}.paper-table .cell-expires{font-family:var(--font-sans);font-size:13px;color:var(--ink-soft)}.paper-table .cell-expires .expires-never{color:var(--ink-muted)}.paper-table .cell-expires .expires-past{color:var(--ink-muted)}.paper-table .empty-dash{color:var(--ink-faint)}.paper-table .cell-actions{display:flex;justify-content:flex-end}.status-dot{width:8px;height:8px;border-radius:999px;display:inline-block;flex-shrink:0;background:var(--status-inactive)}.status-dot.status-ready{background:var(--status-ready)}.status-dot.status-error{background:var(--status-error)}.status-dot.status-preparing,.status-dot.status-progress{background:var(--status-progress)}.status-dot.status-expired,.status-dot.status-removed{background:var(--status-inactive)}.dashboard-page{padding-bottom:96px}.dashboard-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin-top:12px;font-size:13px;color:var(--ink-muted)}.dashboard-meta .dashboard-count{font-variant-numeric:tabular-nums}.btn-link-inline{background:0 0;border:none;padding:2px 4px;margin:-2px 0;font:inherit;color:var(--link-color);cursor:pointer;border-radius:4px}.btn-link-inline:hover{color:var(--link-hover-color);text-decoration:underline}.btn.btn-outline-ink{background:0 0;color:var(--color);border:1px solid var(--border-color);font-weight:500;border-radius:var(--radius-control,6px);padding:8px 14px}.btn.btn-outline-ink:hover{background:var(--hover-bg-color);color:var(--color);border-color:var(--ink-faint)}.paper-page .dropdown-menu .dropdown-item-danger,.paper-page .dropdown-menu .dropdown-item-danger i{color:var(--status-error)}.paper-page .dropdown-menu .dropdown-item-danger:focus,.paper-page .dropdown-menu .dropdown-item-danger:hover{background:var(--status-error-soft-hover);color:var(--status-error)}.paper-page .dropdown-menu button.dropdown-item{width:100%;text-align:left;background:0 0;border:none}.paper-page .dropdown-menu .dropdown-divider{border-top-color:var(--border-soft,var(--border-color));margin:4px 0}.paper-table .paper-table-skeleton{pointer-events:none}.skeleton{display:block;background:var(--paper-bg-alt);border-radius:4px;position:relative;overflow:hidden}.skeleton::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,var(--hover-bg-color),transparent);animation:skeleton-shimmer 1.4s infinite}.skeleton-line{height:12px}.skeleton-line+.skeleton-line{margin-top:8px}.skeleton-line-sm{height:10px}.skeleton-badge{width:52px;height:22px;border-radius:999px;flex-shrink:0}@keyframes skeleton-shimmer{to{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.skeleton::after{animation:none}}.paper-table .paper-table-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:56px 20px;color:var(--ink-muted);text-align:center;border-top:1px solid var(--border-soft,var(--border-color))}.paper-table .paper-table-empty>i{font-size:1.6rem;color:var(--ink-faint)}.paper-table .paper-table-empty-actions{display:flex;gap:8px;margin-top:8px}.bulk-bar{display:flex;align-items:center;gap:8px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:8px;padding:8px 12px;margin:8px 0}.paper-page.admin-page .paper-page-title{font-size:1.6rem;margin:4px 0}.paper-page.admin-page .paper-page-lede{display:none}.paper-page.admin-page .paper-crumbs{margin-bottom:4px}.paper-page.admin-page .admin-nav{margin:6px 0 12px}.admin-filter-toolbar{display:flex;flex-direction:column;gap:6px;margin:8px 0 12px;position:sticky;top:0;z-index:4;background:var(--canvas-bg-color);padding:6px 0;border-bottom:1px solid var(--border-soft,var(--border-color));box-shadow:0 1px 0 var(--canvas-bg-color)}@media (max-width:900px){.admin-filter-toolbar{position:static;box-shadow:none}}.admin-filter-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.admin-filter-row .search-wrap{flex:1;min-width:220px}.admin-filter-row .search-wrap .form-control{height:34px}.admin-filter-inline{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--ink-muted)}.admin-filter-inline>label{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);margin:0;white-space:nowrap}.admin-filter-inline .form-control-sm{height:28px;padding:2px 8px;font-size:12px}.admin-filter-inline input[type=search].form-control-sm,.admin-filter-inline input[type=text].form-control-sm{width:130px}.admin-filter-inline input[type=date].form-control-sm{width:130px}.admin-filter-inline select.form-control-sm{width:auto;min-width:88px}.admin-filter-inline .arrow{color:var(--ink-muted);font-size:11px}.admin-filter-spacer{flex:1}.admin-active-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:12px;color:var(--ink-muted)}.admin-active-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 10px;border:1px solid var(--border-color);border-radius:999px;background:var(--hover-bg-color);font-size:12px;color:var(--color)}.admin-active-chip .key{color:var(--ink-muted);font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em}.admin-active-chip button{background:0 0;border:none;cursor:pointer;padding:0 4px;color:var(--ink-muted);font-size:12px;border-radius:50%}.admin-active-chip button:hover{color:#b42318}.admin-search-hint{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);pointer-events:none;border:1px solid var(--border-color);border-radius:4px;padding:1px 5px;background:var(--paper-card)}.admin-filter-row .search-wrap{position:relative}.admin-filter-row .search-wrap .form-control{padding-right:40px}.paper-table-row.row-selected{background:rgba(47,122,68,.06)}.queue-state-pills{display:inline-flex;gap:6px;margin-left:8px;flex-wrap:wrap}.queue-state-pills .pill{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--border-color);background:var(--paper-card);color:var(--ink-muted)}.queue-state-pills .pill-active{color:#c48a2e;border-color:rgba(196,138,46,.4)}.queue-state-pills .pill-failed{color:#b42318;border-color:rgba(180,35,24,.4)}.queue-state-pills .pill-completed{color:#2f7a44;border-color:rgba(47,122,68,.3)}.queue-state-pills .pill-waiting{color:var(--ink-soft)}.queue-state-pills .pill-delayed{color:var(--ink-muted)}.admin-summary{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 12px;font-size:13px}.admin-summary .summary-total{font-family:var(--font-serif);font-size:1.05rem;color:var(--color);margin-right:8px}.admin-summary .summary-meta{color:var(--ink-muted);font-size:12px;margin-right:8px}.admin-summary .summary-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;border:1px solid var(--border-color);background:var(--paper-card);color:var(--ink-muted);cursor:pointer;font-size:12px;user-select:none;transition:background-color .1s,border-color .1s}.admin-summary .summary-pill:hover{background:var(--hover-bg-color)}.admin-summary .summary-pill .count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color)}.admin-summary .summary-pill.active{background:var(--primary-bg);color:var(--primary-color);border-color:var(--primary-bg)}.admin-summary .summary-pill.active .count{color:inherit}.admin-summary .summary-pill.error .count{color:#b42318}.admin-summary .summary-pill.warn .count{color:#c48a2e}.admin-summary .summary-pill.ok .count{color:#2f7a44}.dark-mode .admin-summary .summary-pill.error .count{color:#f08a82}.dark-mode .admin-summary .summary-pill.warn .count{color:#e8b970}.dark-mode .admin-summary .summary-pill.ok .count{color:#7dc894}.dark-mode .queue-state-pills .pill-active{color:#e8b970;border-color:rgba(232,185,112,.4)}.dark-mode .queue-state-pills .pill-failed{color:#f08a82;border-color:rgba(240,138,130,.4)}.dark-mode .queue-state-pills .pill-completed{color:#7dc894;border-color:rgba(125,200,148,.3)}.job-progress{flex:1;height:6px;background:var(--border-soft,var(--border-color));border-radius:999px;overflow:hidden;margin-left:12px;max-width:200px}.job-progress-bar{height:100%;background:#2f7a44;transition:width .3s}.paper-table-empty{padding:48px 4px;text-align:center;color:var(--ink-muted);display:flex;flex-direction:column;align-items:center;gap:8px;border-top:1px solid var(--border-soft,var(--border-color))}.paper-table-empty>i{font-size:1.6rem}.q-header{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:4px}.q-header-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.q-range-btns{display:inline-flex;border:1px solid var(--border-color);border-radius:8px;overflow:hidden}.q-range-btns .btn{border:none;border-radius:0;padding:5px 14px;font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);background:var(--paper-card)}.q-range-btns .btn+.btn{border-left:1px solid var(--border-color)}.q-range-btns .btn.active{background:var(--color);color:var(--paper-card)}.btn-dark{background:var(--color)!important;color:var(--paper-card)!important;border-color:var(--color)!important;border-radius:999px;padding:5px 18px;font-family:var(--font-mono);font-size:11px;font-weight:500;letter-spacing:.04em}.q-cards{display:flex;gap:10px;margin:16px 0;flex-wrap:wrap}.q-card{flex:1;min-width:140px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:14px 16px;cursor:pointer;transition:border-color .15s,box-shadow .15s}.q-card:hover{border-color:var(--ink-muted)}.q-card.selected{border-color:var(--color);box-shadow:0 0 0 1px var(--color)}.q-card-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}.q-dot{width:8px;height:8px;border-radius:50%;background:#2f7a44;flex-shrink:0}.q-dot-red{background:#b42318}.dark-mode .q-dot{background:#7dc894}.dark-mode .q-dot-red{background:#f08a82}.q-card-name{font-family:var(--font-mono);font-size:11.5px;font-weight:500;color:var(--ink-muted);letter-spacing:.04em}.q-card-count{font-family:var(--font-serif);font-size:2rem;font-weight:400;line-height:1.1;color:var(--color);margin-bottom:6px}.q-card-sub{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);letter-spacing:.04em}.q-card-bar{height:4px;background:var(--border-color);border-radius:2px;overflow:hidden;margin-top:6px}.q-card-bar-fill{height:100%;background:#3b4ad6;border-radius:2px;transition:width .3s}.dark-mode .q-card-bar-fill{background:#a7b2ff}.q-detail{display:grid;grid-template-columns:1fr 320px;gap:16px;margin-bottom:20px}.q-throughput{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 20px}.q-chart-wrap{position:relative}.q-throughput canvas{width:100%;display:block}.q-chart-tooltip{position:absolute;pointer-events:none;background:var(--paper-card);border:1px solid var(--border-color);border-radius:6px;padding:6px 10px;font-family:var(--font-mono);font-size:11px;line-height:1.6;white-space:nowrap;box-shadow:0 2px 8px rgba(0,0,0,.15);z-index:10}.q-chart-tooltip .q-tip-time{color:var(--ink-muted);margin-bottom:2px}.q-chart-tooltip .q-tip-completed{color:#3b4ad6}.q-chart-tooltip .q-tip-failed{color:#b42318}.dark-mode .q-chart-tooltip .q-tip-completed{color:#a7b2ff}.dark-mode .q-chart-tooltip .q-tip-failed{color:#f08a82}.q-chart-crosshair{position:absolute;top:0;width:1px;height:100%;background:var(--ink-muted);opacity:.3;pointer-events:none;z-index:9}.q-stats-panel{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 20px;display:flex;flex-direction:column}.q-section-label{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--ink-muted);text-transform:lowercase;letter-spacing:.04em;margin-bottom:14px}.q-section-right{float:right;text-transform:uppercase;font-size:10px;letter-spacing:.08em}.q-legend-completed{color:#3b4ad6}.q-legend-failed{color:#b42318;margin-left:8px}.q-legend-exec{color:#b8860b;margin-left:8px;letter-spacing:2px}.dark-mode .q-legend-completed{color:#a7b2ff}.dark-mode .q-legend-failed{color:#f08a82}.dark-mode .q-legend-exec{color:#f5c842}.q-chart-tooltip .q-tip-exec{color:#b8860b}.dark-mode .q-chart-tooltip .q-tip-exec{color:#f5c842}.q-stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 20px;flex:1}.q-stat-label{font-family:var(--font-mono);font-size:9.5px;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:2px}.q-stat-value{font-family:var(--font-serif);font-size:1.3rem;font-weight:400;color:var(--color);line-height:1.2}.q-stats-actions{display:flex;gap:8px;margin-top:16px;padding-top:14px;border-top:1px solid var(--border-color)}.q-stats-actions .btn{font-family:var(--font-mono);font-size:11px;padding:6px 14px;border-radius:8px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color)}.q-jobs{background:var(--paper-card);border:1px solid var(--border-color);border-radius:10px;padding:16px 20px}.q-jobs-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-bottom:12px}.q-state-filters{display:inline-flex;gap:6px;flex-wrap:wrap}.q-state-toggle{cursor:pointer;display:inline-flex;align-items:center}.q-state-toggle input{display:none}.q-state-chip{font-family:var(--font-mono);font-size:11px;padding:3px 10px;border-radius:10px;border:1px solid var(--border-color);background:var(--paper-card);color:var(--ink-muted);transition:opacity .15s,background .15s;text-transform:capitalize}.q-state-toggle input:checked+.q-state-chip{opacity:1}.q-state-toggle input:not(:checked)+.q-state-chip{opacity:.4;text-decoration:line-through}.q-state-badge,.q-state-chip{font-family:var(--font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.3px}.q-state-badge{display:inline-block;padding:2px 8px;border-radius:8px}.q-state-active{background:#dbeafe;color:#1d4ed8}.q-state-waiting{background:#fef3c7;color:#92400e}.q-state-delayed{background:#e0e7ff;color:#4338ca}.q-state-failed{background:#fee2e2;color:#b91c1c}.q-state-completed{background:#dcfce7;color:#166534}.dark-mode .q-state-active{background:rgba(59,130,246,.2);color:#93bbfd}.dark-mode .q-state-waiting{background:rgba(251,191,36,.15);color:#fbbf24}.dark-mode .q-state-delayed{background:rgba(99,102,241,.2);color:#a5b4fc}.dark-mode .q-state-failed{background:rgba(239,68,68,.2);color:#fca5a5}.dark-mode .q-state-completed{background:rgba(34,197,94,.15);color:#86efac}.q-cell-state{width:120px}.q-delay-hint{display:block;font-size:10px;color:var(--ink-muted);margin-top:2px;font-family:var(--font-mono)}.q-search-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}.q-search-row .form-control{max-width:320px;height:34px}.q-auto-refresh{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);display:inline-flex;align-items:center;gap:6px;cursor:pointer;white-space:nowrap}.q-table{width:100%;border-collapse:collapse}.q-table thead th{font-family:var(--font-mono);font-size:9.5px;font-weight:500;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;padding:8px 10px;border-bottom:1px solid var(--border-color);text-align:left;white-space:nowrap}.q-table tbody tr{border-bottom:1px solid var(--border-color);transition:background .1s}.q-table tbody tr:hover{background:var(--paper-bg-alt)}.q-table tbody tr:last-child{border-bottom:none}.q-table tbody td{padding:10px 10px;font-size:.88rem;vertical-align:middle}.q-cell-id{font-family:var(--font-mono);font-size:12px;white-space:nowrap}.q-cell-id{display:flex;align-items:center;gap:8px}.q-chevron{font-size:9px;color:var(--ink-muted);transition:transform .15s;flex-shrink:0}.q-chevron-open{transform:rotate(90deg)}.q-cell-id a{color:var(--color)}.q-cell-payload{font-family:var(--font-mono);font-size:12px;color:var(--color)}.q-payload-detail{color:var(--ink-muted)}.q-cell-num{font-family:var(--font-mono);font-size:12px;text-align:center;white-space:nowrap}.q-cell-progress{min-width:120px}.q-progress-wrap{display:flex;align-items:center;gap:8px}.q-progress-bar{flex:1;height:6px;border-radius:3px;overflow:hidden;background-image:linear-gradient(to right,#3b4ad6 var(--pct,0),var(--border-color) var(--pct,0))}.dark-mode .q-progress-bar{background-image:linear-gradient(to right,#a7b2ff var(--pct,0),var(--border-color) var(--pct,0))}.q-progress-label{font-family:var(--font-mono);font-size:11px;color:var(--ink-muted);white-space:nowrap;min-width:32px;text-align:right}.q-cell-actions{text-align:right;white-space:nowrap}.q-cell-actions .btn{padding:3px 8px;font-size:11px;background:0 0;border:1px solid var(--border-color);color:var(--ink-muted)}.q-cell-actions .btn:hover{color:var(--color)}.q-row-failed{background:rgba(180,35,24,.04)}.dark-mode .q-row-failed{background:rgba(240,138,130,.06)}.q-error-detail{padding:4px 10px 12px;font-size:12px}.q-error-reason{color:#b42318;font-size:.82rem;margin-bottom:4px}.dark-mode .q-error-reason{color:#f08a82}.q-toast-error{background:#fbe7e7;color:#b42318;border:1px solid #f3c7c7;border-radius:8px;padding:10px 16px;margin-bottom:12px;font-family:var(--font-mono);font-size:12px;cursor:pointer;display:flex;align-items:center;gap:8px}.dark-mode .q-toast-error{background:rgba(240,138,130,.1);color:#f08a82;border-color:rgba(240,138,130,.25)}.q-error-stack{font-size:.78rem;max-height:120px;overflow:auto;margin:4px 0 0;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:6px;padding:8px 10px}.q-row-expanded>td{border-bottom-color:transparent}.q-detail-row>td{padding:0 10px 14px!important;border-bottom:1px solid var(--border-color)}.q-job-detail{background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:8px;padding:14px 16px}.q-job-detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px 20px;margin-bottom:10px}.q-job-detail-item{display:flex;flex-direction:column;gap:2px}.q-job-detail-label{font-family:var(--font-mono);font-size:9px;font-weight:500;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em}.q-job-detail-value{font-family:var(--font-mono);font-size:12px;color:var(--color);word-break:break-all}.q-job-detail-value a{color:var(--color)}.q-job-detail-error{margin:8px 0}.q-job-detail-actions{display:flex;gap:8px;margin-top:12px;padding-top:10px;border-top:1px solid var(--border-color)}.q-job-detail-actions .btn{font-family:var(--font-mono);font-size:11px;padding:5px 12px;border-radius:6px;background:var(--paper-card);border:1px solid var(--border-color);color:var(--color)}@media (max-width:900px){.q-detail{grid-template-columns:1fr}.q-cards{flex-direction:column}.q-card{min-width:100%}.q-jobs-header{flex-direction:column;align-items:flex-start}.q-tabs{flex-wrap:wrap}.q-search-row{flex-wrap:wrap}.q-search-row .form-control{max-width:100%;flex:1}.q-table{font-size:12px}.q-header{flex-direction:column}.q-job-detail-grid{grid-template-columns:1fr 1fr}}@media (max-width:900px){.paper-table .paper-table-head{display:none}.paper-table .admin-users-row,.paper-table .paper-table-row,.paper-table.paper-table-conferences .paper-table-row,.paper-table.paper-table-repos .paper-table-row{display:flex!important;flex-wrap:wrap;align-items:center;gap:6px 12px;padding:14px 0;grid-template-columns:none!important}.paper-table .cell-anon{flex:1 1 calc(100% - 52px);min-width:0;order:1}.paper-table .cell-actions{flex:0 0 auto;order:2;align-self:center}.paper-table .cell-conf,.paper-table .cell-expires,.paper-table .cell-status,.paper-table .cell-views{order:3;font-size:13px;color:var(--ink-muted);display:inline-flex;align-items:center;gap:6px;text-align:left}.paper-table .cell-status{flex-wrap:nowrap;gap:6px;min-width:0}.paper-table .cell-status .status-sub{flex-basis:auto;font-size:13px;line-height:inherit}.paper-table .cell-status .status-sub::before{content:"·";margin-right:6px;color:var(--ink-faint)}.paper-table .cell-conf{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.paper-table .cell-views.num{text-align:left}.paper-table .paper-table-skeleton .cell-expires,.paper-table .paper-table-skeleton .cell-status,.paper-table .paper-table-skeleton .cell-views{flex:1 1 30%}.paper-table .cell-views::before{content:'\f06e';font-family:'Font Awesome 5 Free';font-weight:900;font-size:10px;color:var(--ink-muted)}.paper-table .cell-expires::before{content:'\f017';font-family:'Font Awesome 5 Free';font-weight:400;font-size:10px;color:var(--ink-muted)}.paper-table .cell-conf::before{content:'\f51c';font-family:'Font Awesome 5 Free';font-weight:900;font-size:10px;color:var(--ink-muted)}.paper-table-dashboard .cell-conf::before{content:none}.paper-table .cell-conf:has(.empty-dash),.paper-table .cell-expires:has(.empty-dash){display:none}.paper-table .cell-expires::before,.paper-table .cell-views::before{color:var(--ink-faint)}}.paper-page .dropdown-menu{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface,10px);box-shadow:0 12px 28px rgba(26,24,21,.08);padding:6px;min-width:220px;font-family:var(--font-sans);font-size:14px;color:var(--color);margin-top:6px}.paper-page .dropdown-menu .dropdown-header{font-family:var(--font-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);padding:8px 10px 6px;font-weight:500}.paper-page .dropdown-menu .dropdown-item{border-radius:6px;padding:8px 10px;color:var(--color);font-size:14px;display:flex;align-items:center;gap:8px}.paper-page .dropdown-menu .dropdown-item:focus,.paper-page .dropdown-menu .dropdown-item:hover{background:var(--hover-bg-color);color:var(--color)}.paper-page .dropdown-menu .dropdown-item i{width:16px;font-size:13px;color:var(--ink-muted)}.paper-page .dropdown-menu .form-check.dropdown-item{padding:8px 10px 8px 36px!important;position:relative}.paper-page .dropdown-menu .form-check.dropdown-item .form-check-input{position:absolute;left:12px;top:50%;transform:translateY(-50%);margin:0;width:16px;height:16px;accent-color:var(--color);cursor:pointer}.paper-page .dropdown-menu .form-check.dropdown-item .form-check-label{font-family:var(--font-sans);font-size:14px;color:var(--color);font-weight:400;margin:0;cursor:pointer}.btn.btn-icon-dots{width:32px;height:32px;padding:0;border:1px solid transparent;background:0 0;color:var(--ink-muted);border-radius:6px;display:inline-flex;align-items:center;justify-content:center;line-height:1}.btn.btn-icon-dots:focus,.btn.btn-icon-dots:hover,.btn.btn-icon-dots[aria-expanded=true]{background:var(--hover-bg-color);border-color:var(--border-color);color:var(--color)}.btn.btn-icon-dots::after{display:none}.btn.btn-icon-dots i{font-size:15px}.paper-page .repo-list-empty{border-top:none;padding:56px 20px;color:var(--ink-muted)}.paper-page .filter-chip{background:var(--paper-bg-alt);color:var(--color);border:1px solid var(--border-color);font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;padding:4px 10px;border-radius:999px}@media (max-width:768px){.paper-page .paper-page-title{font-size:clamp(1.4rem,6vw,1.9rem);margin:4px 0 2px}.paper-page .paper-page-lede{font-size:13px;line-height:1.4;margin-bottom:0}.paper-page .btn-ink{padding:6px 12px;font-size:13px}.paper-page .quota-row{grid-template-columns:1fr;gap:12px;padding:0;margin:16px 0 0}.paper-page .dashboard-filter-row{padding:10px 0;margin-top:12px;gap:8px}.paper-page .quota-header{flex-direction:row;align-items:baseline;gap:8px}.paper-page .quota-value{white-space:nowrap}.paper-page .dashboard-filter-controls{width:100%}.paper-page .dashboard-filter-controls .btn-group{flex:1 1 100%;display:flex}.paper-page .dashboard-filter-controls .btn-group .btn{flex:1;justify-content:center}.paper-page .dashboard-filter-controls .dropdown{flex:1 1 0;min-width:0}.paper-page .dashboard-filter-controls .dropdown .dropdown-toggle{width:100%;justify-content:space-between}.paper-page .dashboard-filter-controls .dropdown .filter-btn-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media (max-width:480px){.paper-page .paper-page-lede{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}}.empty-state{text-align:center;padding:40px 20px;opacity:.6}.empty-state i{font-size:2rem;margin-bottom:10px;display:block}.paper-page .progress{height:10px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:999px;overflow:hidden;margin-bottom:20px}.paper-page .progress .progress-bar{background:var(--color);color:var(--canvas-bg-color);font-family:var(--font-mono);font-size:10px;line-height:10px}.paper-page .progress .progress-bar.bg-success{background:var(--status-ready)!important}.paper-page .progress .progress-bar.bg-warning{background:var(--status-progress)!important;color:#fff}.paper-page .progress .progress-bar.bg-danger{background:var(--status-error)!important}.paper-page .progress .progress-bar.bg-dark{background:var(--ink-faint)!important}.paper-page .form>h5,.paper-page form>h5,.paper-page>h5{font-family:var(--font-mono);font-size:11px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-muted);margin:24px 0 8px}.paper-page .accordion .card{background:var(--paper-card,var(--sidebar-bg-color));border:1px solid var(--border-color);border-radius:8px!important;margin-bottom:8px;overflow:hidden}.paper-page .accordion .card+.card{border-top:1px solid var(--border-color)}.paper-page .accordion .card-header{background:0 0;border:none;padding:0}.paper-page .accordion .card-header .btn{color:var(--color)!important;font-family:var(--font-sans);font-weight:500;font-size:14px;padding:14px 18px!important;background:0 0!important;border:none!important;position:relative}.paper-page .accordion .card-header .btn::after{content:"+";position:absolute;right:18px;font-family:var(--font-serif);font-size:20px;color:var(--ink-muted)}.paper-page .accordion .card-header .btn:not(.collapsed)::after{content:"–"}.paper-page .accordion .card-body{padding:6px 18px 18px!important;border-top:1px solid var(--border-soft)}.paper-page .accordion .form-check-label{color:var(--color);font-weight:500;font-size:13.5px}.paper-page .accordion .form-text{color:var(--ink-muted);font-size:12px;margin-top:2px}.faq-section .panel-body code{font-family:var(--font-mono);font-size:13px;padding:1px 6px;background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:3px;color:var(--color)}.faq-section .panel-body a{color:var(--accent)}@media (max-width:820px){.paper-faq-body{grid-template-columns:1fr;gap:24px}.paper-faq-toc{position:static}}.paper-footer{margin-top:80px;padding:56px max(20px,calc((100vw - 1200px)/ 2)) 28px;border-top:1px solid var(--border-color);background:var(--canvas-bg-color);font-family:var(--font-sans)}.paper-footer-inner{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:40px}.paper-footer-brand .paper-footer-mark{font-family:var(--font-serif);font-size:22px;letter-spacing:-.01em;color:var(--color)}.paper-footer-brand .paper-footer-mark em{font-style:italic;font-weight:400}.paper-footer-tag{margin-top:10px;color:var(--ink-soft);font-size:13.5px;line-height:1.55;max-width:340px}.paper-footer-head{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-muted);letter-spacing:.1em;text-transform:uppercase;margin-bottom:14px}.paper-footer-col a{display:block;color:var(--color);font-size:13.5px;padding:4px 0;text-decoration:none}.paper-footer-col a:hover{color:var(--accent)}.paper-footer-rule{height:1px;background:var(--border-color);margin:40px 0 16px}.paper-footer-foot{display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--ink-muted);font-family:var(--font-mono);letter-spacing:.02em}.paper-footer-foot .paper-footer-meta{font-family:var(--font-serif);font-style:italic;font-size:13.5px;letter-spacing:0;color:var(--ink-soft)}@media (max-width:768px){.paper-footer-inner{grid-template-columns:1fr 1fr}}.file.folder.truncated .truncated-warning{color:#d39e00;margin-left:4px;font-size:.85em;flex-shrink:0}.file.folder.truncated>a{color:#d39e00}body{--bucket-error-bg:#FCEDED;--bucket-error-fg:#8A1F1F;--bucket-error-bd:#F0C4C4;--bucket-error-dot:#B53737;--bucket-warn-bg:#FFF3DF;--bucket-warn-fg:#7A4D00;--bucket-warn-bd:#F0D8A0;--bucket-warn-dot:#B07A2F;--bucket-info-bg:#EAF2EC;--bucket-info-fg:#2C5D3A;--bucket-info-bd:#C5DCCD;--bucket-info-dot:#5B8D6B;--card-shadow:0 1px 2px rgba(26, 24, 21, 0.04),0 4px 14px rgba(26, 24, 21, 0.05);--card-shadow-hover:0 1px 2px rgba(26, 24, 21, 0.06),0 8px 24px rgba(26, 24, 21, 0.08)}.dark-mode{--bucket-error-bg:rgba(255, 139, 123, 0.10);--bucket-error-fg:#FF8B7B;--bucket-error-bd:rgba(255, 139, 123, 0.28);--bucket-error-dot:#FF8B7B;--bucket-warn-bg:rgba(255, 211, 122, 0.10);--bucket-warn-fg:#FFD37A;--bucket-warn-bd:rgba(255, 211, 122, 0.28);--bucket-warn-dot:#FFD37A;--bucket-info-bg:rgba(152, 200, 168, 0.10);--bucket-info-fg:#98C8A8;--bucket-info-bd:rgba(152, 200, 168, 0.28);--bucket-info-dot:#98C8A8;--card-shadow:0 1px 2px rgba(0, 0, 0, 0.35),0 6px 18px rgba(0, 0, 0, 0.30);--card-shadow-hover:0 2px 4px rgba(0, 0, 0, 0.45),0 12px 28px rgba(0, 0, 0, 0.40)}.errors-page .errors-header{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:4px 0 8px}.errors-page .errors-actions{display:flex;gap:6px}.errors-page .kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin:14px 0 18px}.errors-page .kpi-card{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px 20px;display:flex;flex-direction:column;gap:4px;box-shadow:var(--card-shadow);transition:box-shadow 160ms ease,transform 160ms ease}.errors-page .kpi-card:hover{box-shadow:var(--card-shadow-hover)}.errors-page .kpi-label{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted)}.errors-page .kpi-value{font-family:var(--font-serif);font-size:2.6rem;font-weight:400;line-height:1;margin-top:2px;color:var(--color)}.errors-page .kpi-card.kpi-error .kpi-value{color:var(--bucket-error-fg)}.errors-page .kpi-card.kpi-warn .kpi-value{color:var(--bucket-warn-fg)}.errors-page .kpi-card.kpi-info .kpi-value{color:var(--bucket-info-fg)}.errors-page .kpi-sub{font-size:.78rem;color:var(--ink-muted);font-style:italic}.errors-page .kpi-sub.up{color:var(--bucket-error-fg);font-style:normal}.errors-page .kpi-sub.down{color:var(--bucket-info-fg);font-style:normal}.errors-page .dropped-warn{color:var(--bucket-error-fg);font-weight:600;font-style:normal}.errors-page .volume-chart{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;margin-bottom:18px;box-shadow:var(--card-shadow)}.errors-page .volume-head{display:flex;justify-content:space-between;align-items:center;font-family:var(--font-mono);font-size:.7rem;color:var(--ink-muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}.errors-page .volume-legend{display:flex;gap:14px;align-items:center;text-transform:none;letter-spacing:0;font-family:var(--font-sans)}.errors-page .volume-legend .dot{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:middle}.errors-page .dot.dot-error{background:var(--bucket-error-dot)}.errors-page .dot.dot-warn{background:var(--bucket-warn-dot)}.errors-page .dot.dot-info{background:var(--bucket-info-dot)}.errors-page .volume-bars{display:flex;align-items:flex-end;gap:4px;height:80px}.errors-page .volume-bar{display:flex;flex-direction:column-reverse;flex:1 1 0;min-width:6px;height:100%}.errors-page .volume-bar .seg{display:block;width:100%}.errors-page .seg.seg-error{background:var(--bucket-error-dot)}.errors-page .seg.seg-warn{background:var(--bucket-warn-dot)}.errors-page .seg.seg-info{background:var(--bucket-info-dot);opacity:.7}.errors-page .errors-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}.errors-page .seg-tabs{display:inline-flex;border:1px solid var(--border-color);border-radius:8px;overflow:hidden;background:var(--paper-card)}.errors-page .seg-tabs button{background:0 0;border:none;padding:6px 14px;font-size:.85rem;cursor:pointer;color:var(--color);font-family:var(--font-sans)}.errors-page .seg-tabs button+button{border-left:1px solid var(--border-color)}.errors-page .seg-tabs button.active{background:var(--primary-bg);color:var(--primary-color)}.errors-page .errors-toolbar .search-wrap{position:relative;flex:1 1 320px;min-width:220px}.errors-page .errors-toolbar .search-wrap input{width:100%;padding:6px 10px 6px 32px;border:1px solid var(--border-color);border-radius:8px;font-family:var(--font-mono);font-size:.82rem;background:var(--input-bg);color:var(--input-color)}.errors-page .errors-toolbar .search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--ink-muted);font-size:.85rem}.errors-page .errors-toolbar .filter-count{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:.72rem;color:var(--ink-muted)}.errors-page .errors-toolbar .select-wrap{display:inline-flex;align-items:center;gap:6px}.errors-page .errors-toolbar .select-wrap label{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);margin:0}.errors-page .errors-toolbar .select-wrap select{background:var(--input-bg);color:var(--input-color);border:1px solid var(--border-color);border-radius:8px}.errors-page .errors-toolbar .autoref{display:inline-flex;gap:6px;align-items:center;font-size:.82rem;color:var(--color);cursor:pointer;margin:0}.errors-page .btn-icon{width:32px;padding:4px 0}.errors-page .errors-list{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;overflow:hidden;box-shadow:var(--card-shadow)}.errors-page .errors-list-head,.errors-page .errors-row-main{display:grid;grid-template-columns:110px 100px 100px 1fr 60px 70px;gap:16px;padding:18px 20px;align-items:start}.errors-page .errors-list-head{padding:12px 20px;align-items:center}.errors-page .errors-list-head{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);border-bottom:1px solid var(--border-color);background:var(--paper-bg-alt)}.errors-page .errors-row{border-bottom:1px solid var(--border-soft)}.errors-page .errors-row:last-child{border-bottom:none}.errors-page .errors-row.open{background:var(--paper-bg-alt)}.errors-page .errors-row-main{cursor:pointer}.errors-page .errors-row-main:hover{background:var(--hover-bg-color)}.errors-page .col-when .when-rel{font-size:.95rem;color:var(--color);font-variant-numeric:tabular-nums}.errors-page .col-when .when-abs{font-family:var(--font-mono);font-size:.78rem;color:var(--ink-muted);font-variant-numeric:tabular-nums;margin-top:2px}.errors-page .col-sev{display:flex;align-items:center;gap:8px}.errors-page .sev-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.errors-page .sev-dot.sev-error{background:var(--bucket-error-dot)}.errors-page .sev-dot.sev-warn{background:var(--bucket-warn-dot)}.errors-page .sev-dot.sev-info{background:var(--bucket-info-dot)}.errors-page .sev-label{font-family:var(--font-mono);font-size:.74rem;letter-spacing:.08em;color:var(--color)}.errors-page .pill-module{display:inline-block;font-family:var(--font-mono);font-size:.78rem;background:var(--paper-bg-alt);color:var(--ink-soft);border:1px solid var(--border-color);padding:3px 10px;border-radius:6px}.errors-page .col-msg .msg-code{font-family:var(--font-mono);font-size:1rem;color:var(--color);font-weight:600}.errors-page .col-msg .msg-context{color:var(--ink-muted);font-style:italic;font-size:.88rem;margin-left:10px}.errors-page .col-msg .msg-detail{color:var(--ink-soft);font-family:var(--font-mono);font-size:.82rem;margin-left:10px}.errors-page .col-msg .msg-url{color:var(--ink-muted);font-family:var(--font-mono);font-size:.8rem;margin-top:6px;word-break:break-all}.errors-page .count-pill{display:inline-block;padding:2px 8px;border-radius:4px;background:var(--primary-bg);color:var(--primary-color);font-family:var(--font-mono);font-size:.78rem;font-variant-numeric:tabular-nums}.errors-page .count-pill.count-pill-muted{background:0 0;color:var(--ink-muted);border:1px solid var(--border-color)}.errors-page .status-pill{display:inline-block;padding:2px 10px;border-radius:4px;font-family:var(--font-mono);font-size:.8rem;font-variant-numeric:tabular-nums;border:1px solid transparent}.errors-page .status-pill.status-error{background:var(--bucket-error-bg);color:var(--bucket-error-fg);border-color:var(--bucket-error-bd)}.errors-page .status-pill.status-warn{background:var(--bucket-warn-bg);color:var(--bucket-warn-fg);border-color:var(--bucket-warn-bd)}.errors-page .status-pill.status-info{background:var(--bucket-info-bg);color:var(--bucket-info-fg);border-color:var(--bucket-info-bd)}.errors-page .errors-row-detail{padding:0 16px 16px}.errors-page .detail-tabs{display:flex;gap:4px;border-bottom:1px solid var(--border-color);margin-bottom:12px}.errors-page .detail-tabs button{background:0 0;border:0;border-bottom:2px solid transparent;padding:8px 12px;font-size:.85rem;cursor:pointer;color:var(--ink-muted);font-family:var(--font-sans)}.errors-page .detail-tabs button.active{color:var(--color);border-bottom-color:var(--color)}.errors-page .detail-body{display:grid;grid-template-columns:1fr 260px;gap:20px}.errors-page .detail-main pre{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;font-family:var(--font-mono);font-size:.85rem;line-height:1.7;color:var(--color);max-height:26em;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;margin:0;box-shadow:var(--card-shadow)}.errors-page .related-list{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;max-height:22em;overflow:auto;box-shadow:var(--card-shadow)}.errors-page .stack-pre{line-height:1.45;white-space:pre;overflow-x:auto}.errors-page .related-row{display:flex;gap:10px;padding:6px 12px;align-items:center;border-bottom:1px solid var(--border-soft);font-size:.8rem}.errors-page .related-row:last-child{border-bottom:none}.errors-page .detail-actions{display:flex;gap:6px;align-items:center;margin-top:10px}.errors-page .copy-hint{font-size:.78rem;color:var(--bucket-info-fg)}.errors-page .detail-aside{background:var(--paper-card);border:1px solid var(--border-color);border-radius:12px;padding:18px;box-shadow:var(--card-shadow)}.errors-page .aside-block+.aside-block{margin-top:16px}.errors-page .aside-label{font-family:var(--font-mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);margin-bottom:4px}.errors-page .aside-value{font-family:var(--font-serif);font-size:1.05rem;color:var(--color);word-break:break-word;line-height:1.3}.errors-page .aside-value.mono{font-family:var(--font-mono);font-size:.82rem}.errors-page .aside-sub{color:var(--ink-muted);font-style:italic;font-size:.8rem;font-family:var(--font-sans)}.errors-page .errors-pager{display:flex;justify-content:space-between;align-items:center;padding:10px 0;color:var(--ink-muted);font-size:.85rem}@media (max-width:720px){.errors-page .errors-list-head,.errors-page .errors-row-main{grid-template-columns:80px 80px 1fr 60px}.errors-page .errors-list-head .col-mod,.errors-page .errors-list-head .col-sev,.errors-page .errors-row-main .col-mod,.errors-page .errors-row-main .col-sev{display:none}.errors-page .detail-body{grid-template-columns:1fr}}.overview-page .ov-header{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:2px}.overview-page .ov-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-left:6px;vertical-align:middle}.overview-page .ov-dot-ok{background:#2f7a44}.overview-page .ov-dot-warn{background:#c48a2e}.overview-page .ov-dot-idle{background:var(--ink-muted)}.dark-mode .overview-page .ov-dot-ok{background:#7dc894}.dark-mode .overview-page .ov-dot-warn{background:#e8b970}.overview-page .ov-kpi-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;margin:16px 0 22px}.overview-page .ov-kpi-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;display:flex;flex-direction:column;gap:4px;box-shadow:var(--card-shadow);transition:box-shadow 160ms ease}.overview-page .ov-kpi-card:hover{box-shadow:var(--card-shadow-hover)}.overview-page .ov-kpi-label{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted)}.overview-page .ov-kpi-value{font-family:var(--font-serif);font-size:2.6rem;font-weight:400;line-height:1;margin-top:2px;color:var(--color)}.overview-page .ov-kpi-value.ov-val-warn{color:#b42318}.dark-mode .overview-page .ov-kpi-value.ov-val-warn{color:#f08a82}.overview-page .ov-kpi-sub{font-size:.76rem;color:var(--ink-muted);margin-top:2px}.overview-page .ov-daily-row{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin:-4px 0 22px}.overview-page .ov-daily-card{background:var(--primary-bg);border:1px solid var(--border-color);border-radius:12px;padding:16px 20px;box-shadow:var(--card-shadow)}.overview-page .ov-daily-label{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted)}.overview-page .ov-daily-value{font-family:var(--font-serif);font-size:2.35rem;font-weight:400;line-height:1;color:var(--accent,#3b4ad6);margin-top:6px}.overview-page .ov-daily-sub{font-size:.76rem;color:var(--ink-muted);margin-top:5px}.dark-mode .overview-page .ov-daily-card{background:var(--paper-card)}.dark-mode .overview-page .ov-daily-value{color:#a7b2ff}.overview-page .ov-chart-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-bottom:18px}.overview-page .ov-chart-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px 14px;box-shadow:var(--card-shadow)}.overview-page .ov-chart-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}.overview-page .ov-chart-title{font-family:var(--font-serif);font-size:1.05rem}.overview-page .ov-chart-legend{font-family:var(--font-mono);font-size:.7rem;color:var(--ink-muted);display:flex;align-items:center;gap:5px}.overview-page .ov-dot-legend{display:inline-block;width:8px;height:8px;border-radius:50%}.overview-page .ov-dot-accent{background:var(--accent,#3b4ad6)}.overview-page .ov-dot-ok-fill{background:#2f7a44}.overview-page .ov-dot-user-fill{background:#8b5e2e}.overview-page .ov-dot-new-user-fill{background:#c48a2e}.dark-mode .overview-page .ov-dot-ok-fill{background:#7dc894}.dark-mode .overview-page .ov-dot-user-fill{background:#d0a15f}.dark-mode .overview-page .ov-dot-new-user-fill{background:#e8b970}.overview-page .ov-spark-bars{display:flex;align-items:flex-end;gap:3px;height:140px}.overview-page .ov-spark-col{flex:1;display:flex;align-items:flex-end;height:100%;position:relative}.overview-page .ov-spark-fill{width:100%;background:var(--accent,#3b4ad6);border-radius:2px 2px 0 0;transition:height .3s ease;opacity:.55}.overview-page .ov-spark-fill-alt{background:#2f7a44}.overview-page .ov-spark-fill-user{background:#8b5e2e}.overview-page .ov-spark-fill-new-user{background:#c48a2e}.dark-mode .overview-page .ov-spark-fill-alt{background:#7dc894}.dark-mode .overview-page .ov-spark-fill-user{background:#d0a15f}.dark-mode .overview-page .ov-spark-fill-new-user{background:#e8b970}.overview-page .ov-spark-col:hover .ov-spark-fill{opacity:1}.overview-page .ov-spark-col.has-tip::after{content:attr(data-tip);position:absolute;left:50%;bottom:calc(100% + 10px);transform:translateX(-50%) translateY(4px);z-index:10;padding:6px 8px;border-radius:6px;background:var(--color);color:var(--canvas-bg-color);font-family:var(--font-mono);font-size:.68rem;line-height:1;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity 120ms ease,transform 120ms ease}.overview-page .ov-spark-col.has-tip::before{content:"";position:absolute;left:50%;bottom:calc(100% + 4px);transform:translateX(-50%) translateY(4px);z-index:10;border:5px solid transparent;border-top-color:var(--color);opacity:0;pointer-events:none;transition:opacity 120ms ease,transform 120ms ease}.overview-page .ov-spark-col.has-tip:hover::after,.overview-page .ov-spark-col.has-tip:hover::before{opacity:1;transform:translateX(-50%) translateY(0)}.overview-page .ov-spark-x{display:flex;justify-content:space-between;font-family:var(--font-mono);font-size:.66rem;color:var(--ink-muted);margin-top:6px}.overview-page .ov-triple-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px;margin-bottom:18px}.overview-page .ov-panel-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 20px;box-shadow:var(--card-shadow)}.overview-page .ov-panel-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:14px}.overview-page .ov-panel-title{font-family:var(--font-serif);font-size:1.05rem}.overview-page .ov-panel-meta{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted)}.overview-page .ov-panel-foot{margin-top:12px;padding-top:10px;border-top:1px solid var(--border-color);font-size:.82rem}.overview-page .ov-panel-foot a{color:var(--link-color);text-decoration:none}.overview-page .ov-panel-foot a:hover{text-decoration:underline}.overview-page .ov-performance{min-width:0;margin:22px 0}.overview-page .ov-performance-head{align-items:center;flex-wrap:wrap;gap:12px 20px}.overview-page .ov-performance-head h2{margin:0 0 4px}.overview-page .ov-performance-note{margin:0 0 12px;font-size:12px;line-height:1.5;color:var(--ink-muted)}.overview-page .ov-performance-head .ov-performance-note{margin:0}.overview-page .ov-performance-window{display:flex;align-items:center;gap:8px;flex-shrink:0}.overview-page .ov-performance-window label{margin:0;font-size:12px;color:var(--ink-muted)}.overview-page .ov-performance-window select{width:auto}.overview-page .ov-performance-tabs{margin:0 0 16px;gap:4px}.overview-page .ov-performance-tabs .paper-tab{white-space:nowrap}.overview-page .ov-metrics-scroll{max-width:100%;overflow-x:auto;border:1px solid var(--border-color);border-radius:var(--radius-control,8px)}.overview-page .ov-metrics-table{width:100%;border-collapse:collapse;color:var(--color);font-size:13px;line-height:1.5;font-variant-numeric:tabular-nums}.overview-page .ov-metrics-table td,.overview-page .ov-metrics-table th{padding:10px 12px;border-bottom:1px solid var(--border-color);vertical-align:middle;white-space:nowrap}.overview-page .ov-metrics-table thead th{background:var(--paper-bg-alt);color:var(--ink-muted);font-size:12px;font-weight:500}.overview-page .ov-metrics-table .num{text-align:right}.overview-page .ov-metrics-table tr:last-child>*{border-bottom:0}.overview-page .ov-metrics-table thead tr:last-child>*{border-bottom:1px solid var(--border-color)}.overview-page .ov-metrics-table tbody tr:hover{background:var(--hover-bg-color)}.overview-page .ov-metrics-table .ov-metric-name{min-width:190px;max-width:280px;text-align:left;white-space:normal;overflow-wrap:anywhere;font-weight:500}.overview-page .ov-metrics-table small{display:block;margin-top:3px;font-size:11px;font-weight:400;color:var(--ink-muted)}.overview-page .ov-metrics-table small .ui-icon{width:12px;height:12px}.overview-page .ov-metric-warning-row{background:rgba(196,138,46,.07)}.overview-page .ov-metric-warn,.overview-page .ov-metrics-table small.ov-metric-warn{color:#946519}.dark-mode .overview-page .ov-metric-warn,.dark-mode .overview-page .ov-metrics-table small.ov-metric-warn{color:#e8b970}.overview-page .ov-performance-message{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:10px 12px;margin:0 0 16px;border:1px solid var(--border-color);border-radius:var(--radius-control,8px);font-size:13px;line-height:1.5}.overview-page .ov-performance-message span{flex:1;min-width:160px}.overview-page .ov-performance-warning{background:rgba(196,138,46,.07)}.overview-page .ov-performance-empty{margin:0;padding:24px 12px;text-align:center;font-size:13px;color:var(--ink-muted)}.overview-page .ov-performance-help{margin-top:16px;font-size:12px;line-height:1.6;color:var(--ink-muted)}.overview-page .ov-performance-help summary{width:fit-content;cursor:pointer}.overview-page .ov-performance-help p{margin:8px 0 0;max-width:80ch}@media (max-width:575px){.overview-page .ov-performance{padding:16px 12px}.overview-page .ov-performance-window{width:100%}.overview-page .ov-performance-window select{flex:1;min-width:0}.overview-page .ov-performance-tabs .paper-tab{flex:1;padding:10px 8px}}.overview-page .ov-stacked-bar{display:flex;height:18px;border-radius:6px;overflow:hidden;margin-bottom:14px}.overview-page .ov-bar-seg{min-width:2px;transition:width .4s ease}.overview-page .ov-bar-ready{background:#2f7a44}.overview-page .ov-bar-preparing{background:#c48a2e}.overview-page .ov-bar-error{background:#b42318}.overview-page .ov-bar-expired{background:#8a857c}.overview-page .ov-bar-removed{background:#b5afa2}.dark-mode .overview-page .ov-bar-ready{background:#7dc894}.dark-mode .overview-page .ov-bar-preparing{background:#e8b970}.dark-mode .overview-page .ov-bar-error{background:#f08a82}.dark-mode .overview-page .ov-bar-expired{background:#6b665e}.dark-mode .overview-page .ov-bar-removed{background:#4a453e}.overview-page .ov-bar-legend{display:flex;flex-direction:column;gap:6px}.overview-page .ov-legend-item{display:flex;align-items:center;gap:8px;font-size:.82rem;text-decoration:none;color:inherit}.overview-page .ov-legend-item:hover{text-decoration:none;color:inherit}.overview-page .ov-swatch{display:inline-block;width:12px;height:12px;border-radius:3px;flex-shrink:0}.overview-page .ov-legend-n{margin-left:auto;font-family:var(--font-mono);font-size:.8rem;font-weight:600}.overview-page .ov-error-bars{display:flex;flex-direction:column;gap:12px}.overview-page .ov-ebar-row{display:flex;align-items:center;gap:10px}.overview-page .ov-ebar-label{width:30px;flex-shrink:0;font-family:var(--font-mono);font-size:.72rem;text-transform:uppercase;color:var(--ink-muted)}.overview-page .ov-ebar-track{flex:1;height:10px;background:var(--hover-bg-color);border-radius:5px;overflow:hidden}.overview-page .ov-ebar-fill{height:100%;border-radius:5px;transition:width .4s ease}.overview-page .ov-ebar-error{background:#b42318}.overview-page .ov-ebar-warn{background:#c48a2e}.overview-page .ov-ebar-info{background:var(--accent,#3b4ad6)}.dark-mode .overview-page .ov-ebar-error{background:#f08a82}.dark-mode .overview-page .ov-ebar-warn{background:#e8b970}.overview-page .ov-ebar-n{width:36px;text-align:right;font-family:var(--font-mono);font-size:.82rem;font-weight:600;flex-shrink:0}.overview-page .ov-routes-table{display:flex;flex-direction:column}.overview-page .ov-route-row{display:grid;grid-template-columns:1fr 60px 60px 60px;padding:8px 0;border-bottom:1px solid var(--border-soft,var(--border-color));text-decoration:none;color:inherit;font-size:.85rem;align-items:center}.overview-page .ov-route-row:last-child{border-bottom:none}.overview-page .ov-route-row:hover{background:var(--hover-bg-color);text-decoration:none;color:inherit}.overview-page .ov-route-head{font-family:var(--font-mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);border-bottom:1px solid var(--border-color)}.overview-page .ov-route-head:hover{background:0 0}.overview-page .ov-route-name{font-family:var(--font-mono);font-size:.84rem}.overview-page .ov-route-n{text-align:right;font-family:var(--font-mono);font-size:.84rem}.overview-page .ov-route-lat{color:var(--ink-muted)}.overview-page .ov-n-bad{color:#b42318;font-weight:600}.dark-mode .overview-page .ov-n-bad{color:#f08a82}.overview-page .ov-services-card{background:var(--paper-card,#fff);border:1px solid var(--border-color);border-radius:12px;padding:18px 22px;box-shadow:var(--card-shadow);margin-bottom:18px}.overview-page .ov-services-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:16px}.overview-page .ov-services-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px}.overview-page .ov-svc{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:1px solid var(--border-soft,var(--border-color));border-radius:10px}.overview-page .ov-svc-dot{width:10px;height:10px;border-radius:50%;margin-top:3px;flex-shrink:0}.overview-page .ov-svc-info{display:flex;flex-direction:column;gap:1px;flex:1}.overview-page .ov-svc-name{font-family:var(--font-mono);font-size:.88rem;font-weight:600}.overview-page .ov-svc-meta{font-size:.76rem;color:var(--ink-muted)}.overview-page .ov-svc-detail{font-size:.74rem;color:var(--ink-muted);white-space:nowrap}@media (max-width:900px){.overview-page .ov-kpi-row{grid-template-columns:repeat(3,1fr)}.overview-page .ov-daily-row{grid-template-columns:repeat(3,1fr)}.overview-page .ov-triple-row{grid-template-columns:1fr}}@media (max-width:720px){.overview-page .ov-kpi-row{grid-template-columns:repeat(2,1fr)}.overview-page .ov-daily-row{grid-template-columns:1fr}.overview-page .ov-chart-row{grid-template-columns:1fr}.overview-page .ov-header{flex-direction:column;gap:8px}}@media (max-width:480px){.overview-page .ov-kpi-row{grid-template-columns:1fr 1fr}.overview-page .ov-services-grid{grid-template-columns:1fr 1fr}}.dashboard-heading-actions{display:flex;flex-direction:column;align-items:flex-end;gap:8px;padding-bottom:12px}.dashboard-heading-actions .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px}.dashboard-connections-link{display:inline-flex;align-items:center;gap:7px;min-height:32px;color:var(--ink-muted);font-size:12px;line-height:1.5}.dashboard-connections-link:hover{color:var(--accent);text-decoration:none}.dashboard-connections-link:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:2px}@media (max-width:767px){.dashboard-heading-actions{align-items:flex-start;padding-bottom:0;gap:4px}.dashboard-connections-link{min-height:44px}}.paper-settings-connection-link{display:flex;align-items:center;gap:12px;padding:18px 0;color:var(--color);font-size:14px}.paper-settings-connection-link>i{color:var(--ink-muted);font-size:18px}.paper-settings-connection-link>span:first-of-type{flex:1}.paper-settings-connection-link small{display:block;margin-top:4px;color:var(--ink-muted);font-size:12px}.paper-settings-connection-link:hover{color:var(--accent);text-decoration:none}.paper-settings-connection-link:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.connections-heading{margin-bottom:36px}.connections-heading .paper-page-title{font-size:clamp(38px,4.5vw,56px);margin-bottom:12px}.connections-heading .paper-page-lede{font-size:15px}.connections-grid{display:grid;grid-template-columns:1.15fr 1fr;gap:56px;align-items:start;border-top:1px solid var(--border-color);padding-top:28px}.connections-grid>section{min-width:0}.connection-title,.connection-top{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.connection-top{margin-bottom:24px;min-height:28px}.connection-top>i{color:var(--ink-muted);font-size:24px}.connection-top>.fa-key{font-size:18px}.connection-title{margin-bottom:10px}.connections-page h2{font-family:inherit;font-size:21px;font-weight:600;letter-spacing:-.5px;margin:0}.connections-page p{font-size:14px;line-height:1.65;color:var(--ink-muted)}.connection-badge{background:var(--accent-soft);color:var(--accent);font-size:11px;font-weight:600;border-radius:5px;padding:4px 8px;white-space:nowrap}.connection-badge-muted{background:var(--paper-bg-alt);color:var(--ink-muted)}.connection-status{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--ink-muted)}.connection-status::before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor}.connection-status.is-connected{color:var(--status-ready)}.connection-actions{display:flex;flex-wrap:wrap;align-items:center;gap:16px;margin:22px 0 16px}.connections-page .btn{font-size:13px;padding:9px 13px;white-space:normal}.connection-revoke p,.connections-page .connection-help{font-size:12px}.connection-link{display:inline-flex;align-items:center;gap:8px;border:0;padding:0;background:0 0;color:var(--accent);font-size:13px;line-height:1.6;font-weight:500;text-align:left;cursor:pointer}.connection-link:hover{color:var(--link-hover-color);text-decoration:underline}.connection-link:disabled{color:var(--ink-muted);opacity:.65;cursor:not-allowed;text-decoration:none}.connection-link:focus-visible{outline:2px solid var(--accent);outline-offset:5px}.connection-installations{list-style:none;padding:0;margin:18px 0;border-top:1px solid var(--border-soft)}.connection-installations li{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:14px 0;font-size:12px;border-bottom:1px solid var(--border-soft)}.connection-revoke{border-top:1px solid var(--border-soft);padding-top:18px;margin-top:24px}.connection-danger{color:var(--status-error)}.connection-resources{margin-top:36px;padding-top:28px;border-top:1px solid var(--border-color)}.connection-count{color:var(--ink-muted);font-size:12px}.connection-empty{display:flex;align-items:center;gap:18px;padding:20px 0;margin:22px 0}.connection-empty>i{font-size:22px;color:var(--ink-muted)}.connection-empty h3{font-size:14px;font-weight:600;margin:0 0 5px}.connection-empty p{font-size:12px;margin:0}.connection-empty>a{margin-left:auto;flex-shrink:0}.connection-resource{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:20px 0;border-bottom:1px solid var(--border-color)}.connection-resource-name{flex:1;min-width:180px;overflow-wrap:anywhere;font-size:14px}.connection-resource-name small{display:block;color:var(--ink-muted);font-size:11px;margin-top:5px}.connection-resource-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.connection-resource-actions .connection-help{flex-basis:100%}.connections-page .connection-footnote{display:flex;align-items:baseline;gap:10px;margin-top:22px;font-size:12px}@media (max-width:767px){.connections-grid{grid-template-columns:1fr;gap:28px}.connections-grid>section+section{border-top:1px solid var(--border-color);padding-top:28px}.connection-empty{flex-wrap:wrap}.connection-empty>div{flex:1;min-width:180px}.connection-empty>a{margin-left:40px}.connection-resource-actions{flex-basis:100%}}.paper-table-empty-actions .btn{display:inline-flex;align-items:center;justify-content:center;gap:6px}.paper-table-empty-actions .btn>i{font-size:1em;line-height:1;color:inherit;margin-right:0!important}.auth-back{display:inline-flex;align-items:center;gap:10px;font-size:13px;color:var(--ink-muted);margin-bottom:48px}.auth-layout{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:start}.auth-intro,.auth-options{padding-top:28px}.auth-title-mobile{display:none}.auth-intro .paper-page-title{font-size:clamp(48px,5vw,76px);line-height:1.06;margin:18px 0 24px}.auth-intro .paper-page-lede{max-width:330px}.auth-options{display:grid;gap:28px}.auth-options h2{font-family:inherit;font-size:21px;font-weight:600;margin:0 0 10px}.auth-options p{font-size:14px;line-height:1.65;color:var(--ink-muted)}.auth-options .auth-existing{font-size:12px;border-left:2px solid var(--accent);padding-left:14px;margin:0}.auth-permissions{padding:6px 0 12px;list-style:none;font-size:13px;line-height:1.6}.auth-permissions li{display:flex;gap:10px;margin:12px 0}.auth-permissions i{color:var(--status-ready);margin-top:4px}.auth-continue{display:flex!important;align-items:center;justify-content:space-between;min-height:48px;padding:12px 16px!important}.auth-options small{display:block;font-size:12px;text-align:center;color:var(--ink-muted);margin-top:12px}.auth-legacy{border-top:1px solid var(--border-color);padding-top:24px}.auth-legacy h2{font-size:16px;margin:0}.auth-legacy p{font-size:13px}.source-url-label-row{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px 16px;margin-bottom:8px}.source-url-label-row>.paper-field-label{font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--color);margin-bottom:6px;display:block}.repo-access{margin:0}.repo-access-details{margin:12px 0 24px}.source-url-label-row .repo-access-switch{padding:2px}.source-url-label-row .repo-access-switch button{padding:6px 10px;font-size:12px;line-height:20px}.repo-access-main{display:flex;align-items:center;gap:10px;padding:0 0 8px;flex-wrap:wrap}.repo-access-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.repo-access-switch{display:inline-flex;gap:3px;padding:3px;border:1px solid var(--border-color);border-radius:7px;flex-wrap:wrap}.repo-access-switch button{border:0;border-radius:4px;background:0 0;color:var(--ink-muted);padding:7px 10px;font:inherit;font-size:12px;cursor:pointer}.repo-access-switch button[aria-pressed=true]{background:var(--accent-soft);color:var(--accent);opacity:1;cursor:default;font-weight:600}.repo-access-switch button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.repo-access-details .btn{font-size:12px;padding:8px 12px}.repo-access-note{display:flex;gap:6px 16px;flex-wrap:wrap;padding:0;color:var(--ink-muted);font-size:11px;line-height:1.6}@media (max-width:767px){.auth-page{max-width:480px}.auth-back,.auth-intro .paper-eyebrow,.auth-title-desktop{display:none}.auth-title-mobile{display:inline}.auth-layout{grid-template-columns:1fr;gap:24px}.auth-intro,.auth-options{padding-top:0}.auth-intro .paper-page-title{font-size:40px;line-height:1.15;margin:6px 0 12px}.auth-intro .paper-page-lede{max-width:none;font-size:14px;margin:0}.auth-options{gap:24px}.auth-options .connection-top{margin-bottom:16px}.auth-options h2{font-size:18px}.auth-options p{font-size:13px;margin-bottom:12px}.auth-permissions{padding:0;margin:14px 0 20px;font-size:12px}.auth-permissions li{margin:8px 0}.auth-continue{font-size:14px}.auth-legacy{padding-top:20px}.auth-legacy h2{font-size:15px}.auth-legacy .connection-link{min-height:44px}.repo-access-controls{width:100%;gap:12px}}.text-muted{color:var(--ink-muted)!important}.anonymize-review-note,.draft-status{font-size:13px;color:var(--ink-muted)}.anonymize-review-note{padding:12px 0;margin:0}.anonymize-preview-status{padding:20px 32px;color:var(--ink-muted)}.anonymize-preview-status p{margin:0 0 12px}@media (max-width:575px){.dashboard-page .paper-page-lede{margin-bottom:8px}.dashboard-page .dashboard-heading-actions{gap:4px}.dashboard-page .dashboard-connections-link{min-height:32px}.dashboard-page .dashboard-filter-row{margin-top:12px}.anonymize-preview-status{padding:16px}}.paper-page .paper-page-title{font-size:32px}.paper-page.admin-page .paper-page-title{font-size:28px}.paper-page .paper-page-lede{font-size:14px;line-height:1.5}.paper-settings{padding-top:32px}.paper-settings-body{grid-template-columns:180px minmax(0,1fr);gap:40px;margin-top:24px;padding-top:24px;border-top:0}.paper-settings-main .paper-settings-section{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);padding:20px;margin-bottom:16px}.anonymize-page .paper-section-eyebrow,.paper-settings .paper-section-eyebrow{font-family:var(--font-sans);font-size:16px;font-weight:600;color:var(--color);text-transform:none;letter-spacing:-.01em;margin-bottom:12px}.paper-settings .paper-settings-toc-head{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none}.paper-settings-section .paper-section-copy{margin-top:0}.paper-settings .quota-row{gap:24px}.paper-settings .quota-header{flex-direction:column;align-items:flex-start;gap:4px}.paper-settings .quota-value{white-space:nowrap}.paper-settings .paper-settings-footer{padding:0 0 20px}.paper-settings .form-control{font-size:14px;border-color:var(--border-color);border-radius:var(--radius-control)}.paper-settings .form-check{padding-top:8px;padding-bottom:8px}.anonymize-page .btn-ink,.paper-page .btn-ink{background:var(--accent);color:#fff;border-color:var(--accent)}.dark-mode .anonymize-page .btn-ink,.dark-mode .paper-page .btn-ink{color:#1a1815}.anonymize-page .btn-ink:hover,.paper-page .btn-ink:hover{background:var(--accent);border-color:var(--accent);color:#fff;filter:brightness(.94)}.dark-mode .anonymize-page .btn-ink:hover,.dark-mode .paper-page .btn-ink:hover{color:#1a1815}.anonymize-page .btn-ink:active,.paper-page .btn-ink:active{filter:brightness(.9)}input[type=date],select{color-scheme:light}.dark-mode input[type=date],.dark-mode select{color-scheme:dark}.draft-status{display:flex;align-items:center;flex-wrap:wrap;gap:6px 12px;padding:10px 0}.draft-discard{padding:0;border:0;color:var(--accent);font:inherit;font-size:13px;text-decoration:underline;background:0 0;cursor:pointer}.conference-feedback{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px;margin-top:16px;background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);width:100%}.paper-table{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);margin-top:12px}.paper-table .paper-table-head{font-family:var(--font-sans);text-transform:none;letter-spacing:0;font-size:12px;background:var(--paper-bg-alt);border-radius:var(--radius-surface) var(--radius-surface) 0 0}.paper-table .paper-table-head,.paper-table .paper-table-row{padding-left:16px;padding-right:16px}.dashboard-page{--dashboard-space-xs:4px;--dashboard-space-sm:8px;--dashboard-space-md:12px;--dashboard-space-lg:16px;--dashboard-space-xl:24px;padding-top:var(--dashboard-space-xl)}.project-icon-definitions{position:absolute;width:0;height:0;overflow:hidden}.project-type-svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.project-empty-icon{width:28px;height:28px;color:var(--ink-faint)}.project-type-icon{display:inline-flex;color:var(--ink-muted);flex-shrink:0}.dashboard-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--dashboard-space-lg)}.dashboard-heading .paper-page-title{font-size:28px;margin-bottom:var(--dashboard-space-xs)}.dashboard-heading .paper-page-lede{display:none}.dashboard-heading .btn{min-height:40px;display:inline-flex;gap:var(--dashboard-space-sm);align-items:center}.dashboard-new-mobile{display:none}.dashboard-quota{position:relative;margin:0;padding:0;border:0;background:0 0}.dashboard-quota>summary{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:5px 10px;border:1px solid var(--border-color);border-radius:6px;background:var(--paper-card);color:var(--color);font-family:var(--font-sans);font-size:12px;cursor:pointer;list-style:none;white-space:nowrap}.dashboard-quota>summary::-webkit-details-marker{display:none}.dashboard-quota>summary:hover,.dashboard-quota[open]>summary{background:var(--paper-bg-alt);border-color:var(--ink-faint)}.quota-summary-label{font-weight:600}.quota-summary-value{color:var(--ink-muted);font-variant-numeric:tabular-nums}.quota-summary-ring{width:18px;height:18px;flex-shrink:0;fill:none;stroke-width:2.5}.quota-ring-track{stroke:var(--border-color)}.quota-ring-fill{stroke:var(--accent);transform:rotate(-90deg);transform-origin:50% 50%}.quota-summary-ring.quota-warn .quota-ring-fill{stroke:var(--status-progress)}.quota-summary-ring.quota-danger .quota-ring-fill{stroke:var(--status-error)}.quota-ring-unlimited{stroke:var(--accent);stroke-width:1.7}.quota-summary-chevron{width:14px;height:14px;margin-left:2px;color:var(--ink-muted);transition:transform .15s ease}.dashboard-quota[open] .quota-summary-chevron{transform:rotate(180deg)}.dashboard-quota .quota-panel{position:absolute;z-index:25;top:calc(100% + 8px);left:0;width:344px;max-width:calc(100vw - 36px);padding:16px;border:1px solid var(--border-color);border-radius:12px;background:var(--paper-card);box-shadow:0 12px 36px rgba(26,24,21,.16)}.quota-panel-heading{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.quota-panel-heading h2{font:600 15px var(--font-sans);margin:0}.quota-panel-heading .project-close{margin:-8px -8px -8px 0}.paper-page .quota-usage{display:grid;grid-template-columns:1fr;gap:16px;margin:0;padding:0}.quota-usage .quota-item+.quota-item{padding-top:16px;border-top:1px solid var(--border-soft,var(--border-color))}.quota-usage .quota-header{display:flex;align-items:center;gap:8px;margin-bottom:6px}.quota-usage .quota-label{display:inline-flex;align-items:center;gap:8px;font:500 12px var(--font-sans);letter-spacing:0;text-transform:none;color:var(--ink-muted)}.quota-usage .quota-label .project-type-svg{width:16px;height:16px}.quota-usage .quota-value{display:flex;align-items:baseline;gap:4px;font:12px var(--font-sans);font-variant-numeric:tabular-nums;color:var(--ink-muted);margin-bottom:8px}.quota-usage .quota-value strong{font-size:20px;line-height:1.2;font-weight:600;color:var(--color)}.quota-percent,.quota-usage .quota-unlimited-tag{margin-left:auto;padding:2px 6px;border-radius:4px;background:var(--paper-bg-alt);font:11px var(--font-sans);color:var(--ink-muted);white-space:nowrap}.quota-warn>.quota-header .quota-percent{color:var(--status-progress)}.quota-danger>.quota-header .quota-percent{color:var(--status-error)}.quota-usage .quota-track{height:5px;border:0;background:var(--paper-bg-alt)}.quota-usage .quota-track .quota-fill{min-width:0;background:var(--accent)}.quota-remaining{margin:6px 0 0;color:var(--ink-muted);font-size:11px}.quota-remaining.quota-limit{color:var(--status-error)}.quota-loading{font-size:12px;color:var(--ink-muted);margin:12px 0 0}.dashboard-page .dashboard-filter-row{display:flex;align-items:center;gap:var(--dashboard-space-md);padding:0;margin:var(--dashboard-space-lg) 0 0;border:0;background:0 0}.dashboard-page .dashboard-filter-row .search-wrap{flex:1 1 240px;min-width:0}.dashboard-page .dashboard-filter-row .form-control{height:40px;padding:8px 12px;font-size:13px;background:var(--paper-card)}.dashboard-page .dashboard-filter-controls{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--dashboard-space-sm)}.dashboard-extra-filters{display:flex;gap:var(--dashboard-space-sm)}.dashboard-filters-toggle{display:none}.dashboard-page .dashboard-filter-row .btn-group .btn{border:0;background:0 0;border-radius:6px;height:36px;padding:6px 10px}.dashboard-page .dashboard-filter-row .btn-group .btn.btn-primary{background:var(--accent-soft);color:var(--accent)}.dashboard-page .dashboard-filter-row .btn-group .btn.btn-primary:active,.dashboard-page .dashboard-filter-row .btn-group .btn.btn-primary:hover{background:var(--accent-soft)!important;color:var(--accent)}.dashboard-page .dashboard-filter-row .dropdown-toggle{height:36px;padding:6px 10px}.dashboard-type-filter .project-type-svg{display:none}.sort-direction{width:14px;height:14px}.sort-direction.ascending{transform:rotate(180deg)}.dashboard-page .dashboard-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--dashboard-space-sm) var(--dashboard-space-md);margin:var(--dashboard-space-md) 0 0;padding:0}.dashboard-view-tabs{display:flex;align-items:center;gap:var(--dashboard-space-lg)}.dashboard-view-short{display:none}.dashboard-view-tabs button{min-height:36px;border:0;border-bottom:2px solid transparent;border-radius:0;background:0 0;font:inherit;font-size:13px;color:var(--ink-muted);padding:4px 0}.dashboard-view-tabs button[aria-pressed=true]{color:var(--color);border-bottom-color:var(--color);font-weight:600}.attention-count{padding:1px 5px;margin-left:4px;border-radius:4px;background:var(--paper-bg-alt);font-size:11px;font-variant-numeric:tabular-nums}.attention-count.has-attention{color:var(--status-error)}.dashboard-count{margin-left:auto;font-size:12px;color:var(--ink-muted)}.dashboard-active-filters{display:flex;align-items:center;flex-wrap:wrap;gap:var(--dashboard-space-sm);width:100%}.dashboard-page .filter-chip{display:inline-flex;font-family:var(--font-sans);font-size:11px;text-transform:none;letter-spacing:0;border-radius:6px}.dashboard-page .filter-chip .project-type-svg{width:12px;height:12px;margin-left:4px}.dashboard-page .filter-chip-close{min-width:24px;min-height:24px;display:inline-flex;align-items:center;justify-content:center;margin:-2px -4px -2px 2px}.dashboard-page .btn-link-inline{color:var(--ink-muted);font-size:12px}.dashboard-page .paper-table-dashboard{margin-top:var(--dashboard-space-md);border-left:0;border-right:0;border-radius:0}.dashboard-page .paper-table-dashboard .paper-table-head,.dashboard-page .paper-table-dashboard .paper-table-row{grid-template-columns:minmax(280px,3fr) 180px 72px 148px 64px;gap:var(--dashboard-space-lg);padding:8px 12px}.dashboard-page .paper-table-dashboard .paper-table-head{border-radius:0}.dashboard-page .paper-table .cell-anon{gap:var(--dashboard-space-sm)}.dashboard-page .paper-table .anon-text{flex:1}.dashboard-page .paper-table .repo-name{font-family:var(--font-sans);font-size:14px;font-weight:600}.dashboard-page .paper-table .anon-sub{display:flex;align-items:center;gap:var(--dashboard-space-sm);min-width:0}.anonymous-id{font-size:12px;font-family:var(--font-mono);color:var(--ink-muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-page .paper-table .type-badge{font-family:var(--font-sans);letter-spacing:0;font-size:11px;text-transform:none;border-radius:6px}.dashboard-page .paper-table .status-sub{font-size:12px}.dashboard-page .paper-table .cell-conf{font-family:var(--font-sans);letter-spacing:0;text-transform:none}.dashboard-page .conf-tag .project-type-svg{width:14px;height:14px}.dashboard-row-meta{display:contents}.dashboard-page .cell-actions{gap:0;align-items:center}.copy-link-inline,.dashboard-page .btn-icon-dots,.project-close{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:0 0;color:var(--ink-muted);padding:0;width:32px;height:32px;min-width:32px;cursor:pointer}.copy-link-inline:focus-visible,.copy-link-inline:hover,.dashboard-page .btn-icon-dots:hover,.project-close:hover{background:var(--accent-soft);color:var(--accent)}.copy-link-inline:disabled{opacity:.5;cursor:wait}.mobile-meta-icon{display:none}.project-attention-action{display:inline-block;color:var(--accent);border:0;background:0 0;padding:0;font:inherit;font-size:12px;cursor:pointer;text-decoration:underline;text-underline-offset:3px}.project-attention-action{text-align:left}.dashboard-page .cell-status .project-attention-action{flex-basis:100%}.project-details-row{width:100%;border-bottom:1px solid var(--border-color)}.project-details{padding:var(--dashboard-space-xl);background:var(--paper-bg-alt)}.project-details-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--dashboard-space-sm)}.project-details-heading h2{font:600 16px var(--font-sans);margin:0}.project-details-list{display:grid;grid-template-columns:1fr 1fr;gap:var(--dashboard-space-md) var(--dashboard-space-xl);margin:12px 0}.project-details-list dt{font-size:12px;color:var(--ink-muted);font-weight:500;margin-bottom:4px}.project-details-list dd{margin:0;font-size:13px;overflow-wrap:anywhere}.project-details-list code{color:var(--color);font-size:12px}.project-name-form{margin-top:var(--dashboard-space-lg);padding-top:var(--dashboard-space-lg);border-top:1px solid var(--border-color)}.project-name-form label{display:block;font-size:13px;font-weight:500;margin-bottom:4px}.project-name-form p,.project-progress-help{font-size:12px;color:var(--ink-muted);margin-bottom:8px}.project-name-controls{display:flex;gap:var(--dashboard-space-sm);max-width:560px}.project-name-controls .form-control{min-width:0;font-size:14px}.project-name-controls .btn{flex-shrink:0;min-height:40px}.project-name-form .project-name-error{color:var(--status-error)}.project-details-button{min-height:44px;padding:0 8px;border:0;border-radius:6px;background:0 0;font:inherit;font-size:12px;color:var(--ink-muted);cursor:pointer}.anonymize-page .anonymize-topbar-title{font-family:var(--font-sans);font-size:28px;font-weight:600}.anonymize-topbar{padding:16px 24px}.anonymize-form-col{background:var(--paper-bg-alt)}.anonymize-form-col .paper-settings-main{padding:20px 24px}.anonymize-form-col .paper-settings-section{padding:18px}.anonymize-form-col .paper-settings-section:first-child{padding-top:18px}.anonymize-form-col .anonymize-submit-bar{background:var(--paper-bg-alt);padding:12px 0}.anonymize-preview-head .paper-eyebrow{font-family:var(--font-sans);font-size:14px;font-weight:600;color:var(--color);text-transform:none;letter-spacing:0}.anonymize-preview-col{background:var(--canvas-bg-color);padding:24px}.anonymize-preview-head{flex-wrap:wrap;gap:6px 12px;margin-bottom:16px}.anonymize-preview-body{padding:24px}.anonymize-mobile-tabs,.anonymize-preview-empty,.mobile-preview-jump{display:none}.anonymize-page .repo-access-note{font-size:12px}@media (max-width:900px){.paper-settings-body{grid-template-columns:1fr;gap:18px}.paper-settings-toc{padding:0}.paper-settings-toc-head{display:none}.paper-table .paper-table-row{padding-left:14px;padding-right:14px}}@media (max-width:767px){.anonymize-page .paper-page-title,.paper-page .paper-page-title{font-size:24px}.paper-settings{padding:20px 16px 40px}.paper-settings-main .paper-settings-section{padding:16px}.anonymize-topbar{padding:12px 16px}.anonymize-topbar .paper-crumbs{display:none}.anonymize-mobile-tabs{display:flex;gap:4px;padding:8px 16px;border-bottom:1px solid var(--border-color);background:var(--paper-card)}.anonymize-mobile-tabs button{flex:1;font:inherit;font-size:13px;padding:10px;border:0;border-radius:6px;background:0 0;color:var(--ink-muted)}.anonymize-mobile-tabs button[aria-selected=true]{background:var(--accent-soft);color:var(--accent);font-weight:600}.anonymize-page:not(.mobile-preview-active) .anonymize-preview-col{display:none}.mobile-preview-active .anonymize-form-col{display:none}.mobile-preview-active .anonymize-preview-empty{display:block;padding:24px 16px;color:var(--ink-muted)}.anonymize-form-col .paper-settings-main{padding:16px}.anonymize-form-col .anonymize-submit-bar{background:var(--paper-bg-alt)}.mobile-preview-jump{display:block;width:100%;min-height:44px}.anonymize-preview-col{padding:16px}.anonymize-preview-body{padding:16px}}@media (max-width:575px){.paper-settings .quota-header{flex-direction:row;flex-wrap:wrap;align-items:baseline;gap:4px 8px}}@media (max-width:1100px) and (min-width:901px){.dashboard-page .dashboard-filter-row{flex-wrap:wrap}.dashboard-page .dashboard-filter-row .search-wrap{flex-basis:100%}.dashboard-page .dashboard-filter-controls{width:100%;justify-content:space-between}}@media (max-width:900px){.dashboard-page .paper-table.paper-table-dashboard .paper-table-row{gap:4px 8px;padding:8px 12px}.dashboard-page .paper-table .cell-anon{flex:1 1 calc(100% - 96px);min-width:0}.dashboard-page .paper-table .cell-actions{flex:0 0 88px}.dashboard-row-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;order:3;width:100%}.dashboard-page .dashboard-row-meta .cell-status{flex:1 1 80px;flex-wrap:wrap;gap:2px 8px}.dashboard-page .dashboard-row-meta .cell-expires,.dashboard-page .dashboard-row-meta .cell-views{flex-shrink:0;font-size:12px}.dashboard-page .cell-expires::before,.dashboard-page .cell-views::before{content:none}.dashboard-page .mobile-meta-icon{display:inline-block;width:14px;height:14px}.dashboard-page .dashboard-row-meta .status-sub-date{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.dashboard-page .dashboard-row-meta .status-sub-error,.dashboard-page .dashboard-row-meta .status-sub-warn{flex-basis:100%;white-space:normal;overflow-wrap:anywhere}.dashboard-page .dashboard-row-meta .status-sub::before{content:none}.dashboard-page .project-attention-action{min-height:44px;display:inline-flex;align-items:center}.dashboard-page .paper-table .anon-sub .commit-hash,.dashboard-page .paper-table .anon-sub .conf-tag{display:none}}@media (max-width:767px){.container.dashboard-page{padding-top:12px}.dashboard-heading .paper-page-title{font-size:24px}.dashboard-heading-actions .btn-ink{min-height:44px}.dashboard-new-label{display:none}.dashboard-new-mobile{display:inline}.dashboard-quota>summary{min-height:44px;gap:6px;padding:10px;font-size:12px;line-height:20px}.dashboard-quota .quota-panel{max-height:calc(100dvh - 184px);overflow-y:auto;overscroll-behavior:contain}.dashboard-page .dashboard-filter-row{flex-wrap:wrap;gap:8px;margin-top:12px}.dashboard-page .dashboard-filter-row .search-wrap{flex:1 1 0}.dashboard-page .dashboard-filter-row .form-control{height:44px}.dashboard-page .dashboard-filters-toggle{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:8px;min-height:44px;background:0 0;border:0}.dashboard-page .dashboard-filter-controls{display:none;width:100%}.dashboard-page .dashboard-filter-controls.expanded{display:flex;flex-wrap:wrap;gap:8px}.dashboard-page .dashboard-filter-controls .btn-group{width:100%;display:flex}.dashboard-page .dashboard-filter-controls .btn-group .btn{flex:1;min-height:44px}.dashboard-extra-filters{display:flex;width:100%}.dashboard-page .dashboard-extra-filters .dropdown{flex:1;min-width:0}.dashboard-page .dashboard-extra-filters .dropdown-toggle{width:100%;height:44px}.dashboard-type-filter .type-filter-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.dashboard-type-filter .project-type-svg{display:inline-block}.dashboard-page .dashboard-meta{margin-top:8px;gap:4px 8px}.dashboard-view-tabs{gap:16px}.dashboard-view-tabs button{min-width:44px;min-height:44px;font-size:12px}.dashboard-count{font-size:11px}.dashboard-count{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.dashboard-view-long{display:none}.dashboard-view-short{display:inline}.dashboard-active-filters{display:contents}.dashboard-page .filter-chip{font-size:11px;padding:0 8px;min-height:44px;gap:4px}.dashboard-page .filter-chip-close{min-width:44px;min-height:44px;margin:0}.dashboard-page .btn-link-inline{min-height:44px;font-size:12px}.dashboard-page .paper-table-dashboard{width:calc(100% + 36px);margin:8px -18px 0;border-left:0;border-right:0;border-radius:0}.dashboard-page .paper-table .repo-name{font-size:13px}.project-details{padding:16px 12px}.project-details-list{grid-template-columns:1fr;gap:12px}.project-name-controls{flex-wrap:wrap}.project-name-controls .form-control{flex-basis:100%}.project-name-controls .btn{min-height:44px}}@media (max-width:360px){.dashboard-attention-prefix{display:none}.dashboard-attention-prefix+span{text-transform:capitalize}}.ui-icon-definitions{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}.ui-icon{display:inline-block;width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0;vertical-align:-3px}.ui-icon.sort-direction{width:14px;height:14px}.pr-title-row{display:flex;align-items:flex-start;gap:16px}.pr-title-row .pr-title{flex:1;min-width:0}.pr-title-row>.btn{flex-shrink:0}.ui-icon.record-type-icon{color:var(--ink-muted)}.btn .ui-icon,.dropdown-item .ui-icon{width:16px;height:16px}.btn-icon-dots .ui-icon{width:18px;height:18px}.anonymize-page .paper-page-title,.paper-page .paper-page-title{font-size:28px}.paper-faq,.paper-page{padding-top:24px}.paper-page .paper-page-lede{margin-bottom:16px;overflow-wrap:anywhere}.paper-page-title{overflow-wrap:anywhere}.anonymize-page .form-control,.paper-page .form-control{min-height:40px;font-family:var(--font-sans);font-size:14px;border-radius:var(--radius-control)}.anonymize-page textarea.form-control,.paper-page textarea.form-control{height:auto}.anonymize-page .btn,.paper-page .btn,.status-bar-actions .btn{min-height:var(--button-height);padding:7px var(--button-padding-x);font:500 var(--button-font-size)/var(--button-line-height) var(--font-sans);border-radius:var(--radius-button);gap:6px}.anonymize-page .btn.btn-sm,.paper-page .btn.btn-sm,.status-bar-actions .btn{min-height:var(--button-compact-height);padding:5px 10px;font-size:13px;border-radius:6px}.anonymize-page .btn-ink,.paper-page .btn-ink{min-height:40px;padding:9px 15px}.btn-hero>i,.btn>.project-type-svg,.btn>.ui-icon,.btn>i{width:16px;height:16px;margin:0!important;flex-shrink:0}.btn.dropdown-toggle::after{margin-left:0}.btn.disabled,.btn:disabled{cursor:not-allowed}.btn.disabled:hover,.btn:disabled:hover{filter:none}.paper-page .btn.btn-link{background:0 0;border-color:transparent}.auth-continue.btn{min-height:44px;padding:11px 16px!important}.anonymize-page .btn.btn-icon,.paper-page .btn.btn-icon{width:32px;height:32px;min-width:32px;min-height:32px;padding:0}.paper-page .btn.btn-icon-dots{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;min-width:32px;min-height:32px;padding:0;border:0;background:0 0;color:var(--ink-muted)}.paper-page .btn-icon-dots:hover{background:var(--accent-soft);color:var(--accent)}.paper-page .btn-group .btn-primary:active,.paper-page .btn-group .btn-primary:hover{background:var(--accent-soft)!important;color:var(--accent)}.paper-page .paper-section-eyebrow{font-family:var(--font-sans);font-size:16px;font-weight:600;color:var(--color);text-transform:none;letter-spacing:0;margin-bottom:12px}.paper-page .paper-field-label{font-family:var(--font-sans);font-size:13px;letter-spacing:0}.paper-tabs .paper-tab{min-height:44px}.paper-pill,.status-pill{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none;border-radius:6px}.paper-meta-rule{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none;gap:12px 24px}.paper-meta-rule b:not(.commit-hash){font-family:var(--font-sans);font-weight:500}.connections-grid{gap:16px}.connections-grid>section{background:var(--paper-card);border:1px solid var(--border-color);border-radius:var(--radius-surface);padding:20px}.connections-heading{margin-bottom:24px}.claim-page .claim-form,.status-page>.paper-settings-section{padding:20px;margin-top:24px;border:1px solid var(--border-color);border-radius:var(--radius-surface);background:var(--paper-card)}.claim-page .claim-form{max-width:640px}.status-page .anonymize-submit-bar{background:0 0;gap:8px;flex-wrap:wrap}.anonymize-landing{padding-top:32px}.paper-settings .quota-usage{grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}.paper-settings .quota-usage .quota-item+.quota-item{padding-top:0;border-top:0;padding-left:16px;border-left:1px solid var(--border-color)}.paper-settings .quota-usage .quota-header{flex-direction:row;align-items:center;flex-wrap:wrap}.paper-settings .quota-usage .quota-value{white-space:normal;flex-wrap:wrap}.paper-faq-hero{padding-bottom:24px;margin-bottom:24px}.paper-faq-eyebrow,.paper-faq-toc-head{font-family:var(--font-sans);font-size:12px;text-transform:none;letter-spacing:0;margin-bottom:8px}.paper-faq-title{font:600 28px/1.2 var(--font-sans);letter-spacing:-.025em;max-width:720px;margin-bottom:12px}.paper-faq-title em{font-style:normal}.paper-faq-lede{font-size:14px}.paper-faq-body{grid-template-columns:180px minmax(0,1fr);gap:40px}.faq-section h4.faq-cat{font:600 18px/1.4 var(--font-sans);padding-bottom:12px}.faq-section h4.faq-cat .ui-icon{display:none}.faq-section .panel-group{margin-bottom:32px}.faq-section .panel-default .panel-title a{font:500 15px/1.5 var(--font-sans);padding:16px 0 16px 28px;min-height:44px}.faq-section .panel-default .panel-title a:after{top:16px}.paper-empty-title{font:600 32px/1.2 var(--font-sans);letter-spacing:-.025em}.paper-empty-title em{font-style:normal}.btn-hero{justify-content:center;gap:8px;min-height:48px;padding:13px 20px;font-size:15px;line-height:20px;background:var(--accent);border-color:var(--accent);color:#fff;border-radius:var(--radius-button)}.dark-mode .btn-hero{color:#1a1815}.btn-hero:hover{background:var(--accent);color:#fff;filter:brightness(.94)}.dark-mode .btn-hero:hover{color:#1a1815}.paper-table:not(.paper-table-dashboard){border-left:0;border-right:0;border-radius:0}.paper-table:not(.paper-table-dashboard) .paper-table-head{border-radius:0}.paper-table .cell-anon{gap:8px}.paper-table .cell-anon .anon-text{flex:1}.paper-table-conferences .cell-anon .repo-name{font-family:var(--font-sans);font-weight:600}.paper-table .anon-sub>a,.paper-table .anon-sub>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.paper-table .anon-sub .ui-icon{width:14px;height:14px}.paper-page .filter-chip{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none;border-radius:6px}.paper-page .filter-chip-close .ui-icon{width:12px;height:12px}.admin-nav{gap:4px;border:0;border-bottom:1px solid var(--border-color);border-radius:0;padding:0 0 8px;background:0 0}.admin-nav a{font-family:var(--font-sans);font-size:13px;letter-spacing:0;text-transform:none;border-radius:6px;min-height:40px;padding:8px 12px}.admin-nav a.active{background:var(--accent-soft);color:var(--accent)}.admin-nav .ui-icon{width:16px;height:16px}.admin-filter-toolbar{background:0 0;border:0;padding:0}.admin-filter-inline>label,.admin-filter-inline>span{font-family:var(--font-sans);text-transform:none;letter-spacing:0}.admin-summary .summary-total{font-family:var(--font-sans);font-size:18px;font-weight:600}.admin-summary .summary-pill{font:500 13px/20px var(--font-sans);min-height:32px;padding:5px 10px;border-radius:6px}.admin-summary .summary-pill.active{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.admin-summary .summary-pill .count{font-family:var(--font-sans)}.admin-active-chip{font-family:var(--font-sans);font-size:12px}.admin-active-chip button .ui-icon{width:12px;height:12px}.user-detail-card .user-header h2{font:600 20px/1.4 var(--font-sans)}.errors-page .errors-toolbar .select-wrap label,.errors-page .volume-head,.overview-page .ov-panel-meta,.paper-detail-grid .detail-label,.paper-progress .paper-progress-label,.status-page .paper-error-eyebrow,.user-detail-grid .detail-label{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none}.overview-page .ov-chart-title,.overview-page .ov-panel-title,.paper-error-title{font:600 16px/1.4 var(--font-sans)}.paper-error-head>.ui-icon,.paper-ratelimit-head>.ui-icon{margin-top:3px;color:var(--status-error)}.paper-ratelimit-head>.ui-icon{color:var(--status-progress)}.errors-page .seg-tabs{border-radius:var(--radius-control)}.errors-page .seg-tabs button{min-height:36px;padding:7px 12px;font:500 14px/20px var(--font-sans)}.errors-page .seg-tabs button.active{background:var(--accent-soft);color:var(--accent)}.errors-page .errors-list,.errors-page .kpi-card:hover,.errors-page .volume-chart,.overview-page .ov-chart-card,.overview-page .ov-panel-card{box-shadow:none}.errors-page .kpi-value,.overview-page .ov-daily-value,.overview-page .ov-kpi-value,.q-card-count,.user-hero-name{font-family:var(--font-sans);font-size:28px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.02em}.errors-page .kpi-label,.overview-page .ov-daily-label,.overview-page .ov-kpi-label,.q-card-name,.q-section-label,.user-hero-details .detail-label{font-family:var(--font-sans);font-size:12px;letter-spacing:0;text-transform:none}.overview-page .ov-daily-card{background:var(--paper-card);box-shadow:none;border-radius:var(--radius-surface)}.dark-mode .overview-page .ov-daily-value,.overview-page .ov-daily-value{color:var(--accent)}.errors-page .kpi-card,.overview-page .ov-kpi-card{box-shadow:none;border-radius:var(--radius-surface)}.q-card{border-radius:var(--radius-surface)}.q-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.q-range-btns{border-radius:var(--radius-control)}.q-job-detail-actions .btn,.q-range-btns .btn{font-family:var(--font-sans);font-size:13px}.q-range-btns .btn.active{background:var(--accent-soft);color:var(--accent)}.btn-dark{border-radius:var(--radius-control);font-family:var(--font-sans);font-size:12px}@media (max-width:900px){.paper-settings .quota-usage{grid-template-columns:1fr;gap:16px}.paper-settings .quota-usage .quota-item+.quota-item{padding-left:0;border-left:0;border-top:1px solid var(--border-color);padding-top:16px}.paper-table:not(.paper-table-dashboard) .paper-table-row{gap:4px 8px!important;padding:8px 12px}.paper-table:not(.paper-table-dashboard) .cell-anon{flex:1 1 calc(100% - 52px);order:1}.paper-table:not(.paper-table-dashboard) .cell-actions{order:2;flex:0 0 44px}.paper-table .admin-users-row>[role=cell]:first-child,.paper-table.paper-table-repos.has-bulk .paper-table-row>[role=cell]:first-child{flex:0 0 24px;order:0}.paper-table .admin-users-row .cell-anon,.paper-table.paper-table-repos.has-bulk .cell-anon{flex-basis:calc(100% - 84px)}.paper-table:not(.paper-table-dashboard) .cell-anon .anon-sub{font-size:12px;gap:6px}.paper-table:not(.paper-table-dashboard) .cell-status .status-sub{font-size:12px}.paper-table .cell-expires::before,.paper-table .cell-views::before{content:none}.paper-table .cell-expires .mobile-meta-icon,.paper-table .cell-views .mobile-meta-icon{display:inline-block;width:14px;height:14px}.paper-faq-body{grid-template-columns:1fr;gap:24px}}@media (max-width:767px){.paper-faq,.paper-page{padding-top:20px}.anonymize-page .paper-page-title,.paper-faq-title,.paper-page .paper-page-title,.paper-page.admin-page .paper-page-title{font-size:24px}.anonymize-page .form-control,.paper-page .form-control{min-height:44px}.anonymize-page .btn,.connection-link,.draft-discard,.paper-faq-toc a,.paper-page .btn,.paper-settings-toc nav a{min-height:44px}.anonymize-page .btn,.paper-page .btn,.status-bar-actions .btn{min-height:44px;padding:11px 14px;font-size:14px;line-height:20px;white-space:normal}.anonymize-page .btn.btn-sm,.paper-page .btn.btn-sm{min-height:44px;padding:11px 12px;font-size:14px}.anonymize-page .btn.btn-icon,.copy-link-inline,.paper-page .btn.btn-icon,.paper-page .btn.btn-icon-dots,.project-close{width:44px;height:44px;min-width:44px;min-height:44px;padding:0}.dashboard-page .dashboard-filter-row .btn-group .btn,.dashboard-page .dashboard-filter-row .dropdown-toggle{height:auto;min-height:44px;font-size:14px;padding:11px 10px}.dashboard-heading-actions .btn-ink{padding:11px 16px}.dashboard-page .dashboard-filters-toggle{padding:11px 10px}.errors-page .btn-icon,.pr-title-row .btn,.status-bar-actions .btn{min-width:44px;min-height:44px;padding:0}.status-bar-actions .btn{width:44px;height:44px}.errors-page .seg-tabs button,.paper-tab{min-height:44px}.errors-page .seg-tabs button{padding:11px 12px}.status-bar-actions{flex-wrap:wrap;max-width:100%}.leftCol-close,.tree-search-clear{min-width:44px;min-height:44px}.anonymize-landing{padding:20px 18px}.anonymize-landing .repo-access-switch button,.source-url-label-row .repo-access-switch button{min-height:44px;padding:11px 10px;font-size:13px}.paper-settings-body{margin-top:16px;padding-top:0;gap:16px}.paper-settings-toc nav{gap:0 12px}.paper-settings-toc nav a{display:inline-flex;align-items:center}.paper-faq{padding-left:18px;padding-right:18px}.paper-faq-toc nav{display:flex;flex-direction:row;flex-wrap:wrap;gap:0 16px}.paper-faq-toc a{display:inline-flex;align-items:center;padding:8px 0;border-left:0;border-bottom:2px solid transparent;margin-left:0}.paper-faq-toc nav a.active,.paper-faq-toc nav a:hover{border-bottom-color:var(--accent);color:var(--accent)}.claim-page .claim-form,.status-page>.paper-settings-section{padding:16px;margin-top:16px}.admin-nav{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;gap:4px;max-width:100%;margin:8px 0 16px}.admin-nav a{flex-shrink:0;min-height:44px}.admin-summary .summary-pill{min-height:44px;padding:11px 12px;font-size:14px}.admin-active-chip button{min-width:44px;min-height:44px}.admin-filter-row{gap:8px}.admin-filter-row .admin-filter-inline{gap:8px;flex-wrap:wrap}.errors-page .kpi-grid{grid-template-columns:1fr 1fr;gap:12px}.q-cards{flex-direction:row}.q-card{min-width:130px}.q-header-actions{flex-wrap:wrap;gap:8px}}.billing-plan{padding:1.5rem 0;border-bottom:1px solid var(--paper-border,#d8d4cd)}.billing-plan h3{display:flex;flex-wrap:wrap;gap:.5rem 1.5rem;justify-content:space-between}.billing-price{font-variant-numeric:tabular-nums;font-weight:400}.billing-actions{display:flex;flex-wrap:wrap;gap:.75rem;margin-top:1rem}#settings-billing p{max-width:72ch}.repository-hosting{border-top:1px solid var(--border-color);margin-top:24px}.repository-hosting h2{font-size:1.5rem}.hosting-choices{border:0;padding:0;margin:20px 0;min-width:0}.hosting-choices legend{font-size:1rem;font-weight:600}.hosting-choice{display:flex;align-items:flex-start;gap:12px;padding:16px;border:1px solid var(--border-color);background:var(--paper-card);cursor:pointer}.hosting-choice+.hosting-choice{border-top:0}.hosting-choice input{margin-top:5px;accent-color:var(--accent)}.hosting-choice small,.hosting-choice strong{display:block}.hosting-choice small{margin-top:6px;color:var(--ink-muted)}.hosting-actions{display:flex;flex-wrap:wrap;align-items:center;gap:16px;margin:20px 0}.repository-pass{margin:20px 0}.repository-pass summary{cursor:pointer;color:var(--link-color)}.repository-pass p{margin-top:12px}.task-review-active.anonymize-page{height:auto!important;min-height:100%;overflow:visible}.task-review-active .anonymize-workspace{flex:0 0 auto;overflow:visible}.repository-task{width:100%;max-width:1020px;margin:0 auto;padding:32px 24px 42px;color:var(--color);font-size:15px;line-height:1.55}.repository-task .paper-crumbs{margin-bottom:24px}.repository-task h1{font:normal 40px/1.15 'Iowan Old Style',Georgia,serif;margin:8px 0 10px}.repository-task h2{font:normal 27px/1.25 'Iowan Old Style',Georgia,serif;margin:0 0 12px}.repository-task h3{font:600 17px/1.5 var(--font-sans);margin:0 0 10px}.repository-task p{margin:0 0 16px}.task-lede,.task-muted{color:var(--ink-muted)}.task-trail{list-style:none;display:flex;flex-wrap:wrap;gap:24px;margin:30px 0;padding:18px 0;border-bottom:1px solid var(--border-color);color:var(--ink-muted);font-size:13px}.task-trail [aria-current]{color:var(--color);font-weight:600}.task-trail button{color:inherit;padding:0;border:0;background:0 0;font:inherit;cursor:pointer}.task-columns{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(245px,1fr);gap:34px;align-items:start}.task-section-title{display:flex;align-items:baseline;justify-content:space-between;gap:16px}.task-text-button{border:0;padding:7px 0;background:0 0;color:var(--link-color);cursor:pointer;font:inherit;text-align:left}.task-text-button:focus-visible,.task-trail button:focus-visible{outline:3px solid var(--accent);outline-offset:3px}.task-summary{background:var(--paper-bg-alt);padding:24px;border-radius:5px}.task-summary dt{margin-top:18px;font-size:12px;font-weight:400;color:var(--ink-muted)}.task-summary dd{margin:3px 0;overflow-wrap:anywhere}.task-redactions,.task-summary h3{overflow-wrap:anywhere}.task-summary dl{margin-bottom:0}.task-summary-foot{border-top:1px solid var(--border-color);margin-top:28px;padding-top:24px}.task-summary-foot p{color:var(--ink-muted);margin:0}.task-hosting{border-top:1px solid var(--border-color);margin-top:22px;padding-top:20px}.repository-task .hosting-choices{margin:18px 0}.repository-task .hosting-choice{padding:18px;gap:13px;font-weight:400;margin:0}.repository-task .hosting-choice:first-of-type{border-radius:6px 6px 0 0}.repository-task .hosting-choice:last-of-type{border-radius:0 0 6px 6px}.repository-task .hosting-choice small{margin-top:0;font-size:13px;line-height:1.55}.task-terms{font-size:13px;color:var(--ink-soft)}.task-actions{display:flex;flex-wrap:wrap;align-items:center;gap:18px;margin:24px 0 16px}.repository-task .btn{padding:10px 16px;border-radius:5px;font-size:15px}.task-status{background:var(--accent-soft);padding:16px 20px;margin:20px 0}.task-status p:last-child{margin:0}@media(max-width:650px){.repository-task{padding:24px 18px}.repository-task h1{font-size:32px}.task-columns{display:block}.task-summary{margin-top:28px}.task-trail{gap:15px;font-size:12px}}.repository-task{scroll-margin-top:70px}.task-columns{align-items:stretch}.repository-task .btn-ink{background:var(--color);border-color:var(--color);color:var(--canvas-bg-color);box-shadow:none}.repository-task .btn-ink:hover{background:var(--ink-soft);border-color:var(--ink-soft)}.task-field{margin-bottom:24px}.task-field>label{display:block;font-weight:600;margin-bottom:8px}.task-field input,.task-field select,.task-field textarea{width:100%;padding:12px;border:1px solid var(--border-color);border-radius:4px;background:var(--paper-card);color:var(--color);font:inherit}.task-field textarea{resize:vertical}.task-field small{display:block;margin-top:8px;font-size:13px;color:var(--ink-muted)}.task-field :is(input,select,textarea):focus-visible{outline:3px solid var(--accent);outline-offset:3px}.task-paybox{background:var(--paper-card);border:1px solid var(--border-color);border-radius:5px;padding:22px;margin-top:20px}.task-ready{border-left:3px solid var(--success,#2f7a44);padding:16px 20px;background:var(--paper-bg-alt);margin-bottom:22px}.repository-task.status-page .paper-progress{margin-top:24px}.task-date-options summary{cursor:pointer;color:var(--link-color);font-size:13px}.task-date-options[open] summary{margin-bottom:12px}.task-result{padding:18px;background:var(--paper-bg-alt);overflow-wrap:anywhere}.task-result .detail-label{font-size:12px;color:var(--ink-muted);margin-bottom:6px}.task-configure-columns{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start}.task-live-preview{min-width:0;border:1px solid var(--border-color);border-radius:5px;background:var(--paper-card)}.task-preview-head{padding:20px 24px;border-bottom:1px solid var(--border-color)}.task-preview-head h2{font-size:23px;margin-bottom:6px}.task-preview-head p{margin:0;font-size:13px}.task-preview-content,.task-preview-message{padding:24px}.task-preview-content{overflow:auto;max-height:650px;overflow-wrap:anywhere}.repository-task .task-preview-content h1{font:600 28px/1.3 var(--font-sans)}.repository-task .task-preview-content h2{font:600 22px/1.3 var(--font-sans)}@media(max-width:650px){.task-live-preview{margin-top:28px}.task-preview-content{max-height:none}}.anonymize-page .anonymize-topbar{padding:14px 22px;background:var(--canvas-bg-color)}.anonymize-page .anonymize-topbar-inner{max-width:none}.anonymize-page .anonymize-topbar-head{justify-content:space-between}.anonymize-page .anonymize-topbar-title{font:600 19px/1.25 var(--font-sans);margin:0}.anonymize-page .anonymize-split{display:grid;grid-template-columns:minmax(320px,42%) minmax(0,1fr);overflow:hidden}.anonymize-page .anonymize-form-col{width:auto;min-height:0;overflow:hidden!important;background:var(--paper-card)}.anonymize-page .anonymize-form-col .paper-settings-main{display:flex;flex-direction:column;height:100%;min-height:0;max-width:none;padding:0}.anonymize-fields{flex:1;min-height:0;overflow:auto;position:relative;scrollbar-width:thin}.anonymize-page .paper-settings-main .paper-settings-section{border:0;border-top:1px solid var(--border-color);border-radius:0;padding:18px 20px 20px;margin:0;box-shadow:none}.anonymize-page .paper-settings-main .paper-settings-section:first-child{border-top:0;padding-top:18px}.anonymize-page .paper-section-eyebrow{font:600 15px/1.4 var(--font-sans);margin:0 0 16px;letter-spacing:0}.anonymize-page .paper-field-label{font:500 13px/1.5 var(--font-sans);margin-bottom:8px}.anonymize-page .form-group{margin-bottom:16px}.anonymize-page .form-group:last-child{margin-bottom:0}.anonymize-page .form-control{font-size:14px;min-height:40px;padding:9px 10px;border-radius:4px}.anonymize-page textarea.form-control{line-height:1.6}.anonymize-page .form-grid-2{gap:12px}.anonymize-page .form-check{padding-top:10px;padding-bottom:10px;font-size:14px}.anonymize-page .form-check-label{font-size:14px;line-height:1.5}.anonymize-page .form-text{font-size:12px;line-height:1.6}.anonymize-page .repo-access-details{margin:12px 0 16px}.anonymize-page .repo-access-note{font-size:11px}.anonymize-page .anonymize-submit-bar{flex:none;position:static;margin:0;padding:16px 20px;background:var(--paper-card);border-top:1px solid var(--border-color)}.anonymize-page .anonymize-submit-bar .btn{width:100%;font-size:14px;padding:10px 12px;min-height:43px}.checkout-return-note{font-size:11px;line-height:1.5;color:var(--ink-muted);margin:8px 0 0;text-align:center}.anonymize-fields>.alert,.anonymize-fields>.anonymize-review-note,.anonymize-fields>.draft-status{margin:12px 20px}.anonymize-page .anonymize-preview-col{min-height:0;padding:20px;position:relative;background:var(--canvas-bg-color)}.anonymize-page .anonymize-preview-head{border:0;padding:0;min-height:32px;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between}.anonymize-preview-head button,.anonymize-preview-head strong{font-size:13px}.anonymize-page .anonymize-preview-body{padding:24px;border-radius:6px;min-height:480px;overflow-wrap:anywhere;font:14px/1.7 var(--font-sans)}.anonymize-page .anonymize-preview-body h1{font-size:27px;line-height:1.2;margin:0 0 20px;padding-bottom:14px}.anonymize-page .anonymize-preview-body h2{font-size:18px;margin:28px 0 12px}.anonymize-page .anonymize-preview-body pre{font-size:12px;padding:15px}.anonymize-page.preview-expanded .anonymize-split{grid-template-columns:1fr}.anonymize-page.preview-expanded .anonymize-form-col{display:none}.hosting-usage{font-size:12px;color:var(--ink-muted);margin:0 0 4px}.expiration-choices{border:0;padding:0;margin:0 0 16px;min-width:0}.expiration-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 0;margin:0;cursor:pointer;font-size:14px;font-weight:500;line-height:1.5}.expiration-choice input{width:16px;height:16px;margin:4px 0 0;flex:none;accent-color:var(--accent)}.expiration-choice small{display:block;font-size:12px;font-weight:400;color:var(--ink-muted);margin-top:2px}.dated-options{padding:2px 0 14px 26px}.hosting-date,.hosting-property{display:grid;grid-template-columns:48px minmax(0,1fr);gap:8px;align-items:center;margin-bottom:10px}.hosting-property{margin-bottom:0}.hosting-date .paper-field-label,.hosting-property label{font-size:12px;font-weight:400;margin:0}.hosting-date .invalid-feedback{grid-column:1/-1}.anonymize-page .conference-field{border-top:1px solid var(--border-color);padding:16px 0;margin:0}.subscription-choice{padding:16px;background:var(--paper-bg-alt);border-radius:6px;margin-top:4px}.subscription-choice h3{font-size:13px;font-weight:600;margin:0 0 10px}.billing-cycle{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;border:0;padding:0;margin:0 0 12px;min-width:0}.cycle-option{display:flex;align-items:center;gap:7px;padding:10px 8px;border:1px solid var(--border-color);border-radius:4px;background:var(--paper-card);font-size:12px;cursor:pointer;margin:0}.cycle-option.selected{border-color:var(--accent);background:var(--accent-soft)}.cycle-option input{accent-color:var(--accent);margin:0;flex:none}.subscription-choice p{font-size:12px;line-height:1.5;margin:0 0 8px}.subscription-choice p:last-child{margin:0}.hosting-terms{font-size:12px;line-height:1.5;color:var(--ink-muted)}.capacity-reason{font-size:13px}.capacity-options,.repository-pass{margin-top:12px;font-size:12px}.capacity-options summary,.repository-pass summary{cursor:pointer}.capacity-options p,.repository-pass p{margin:8px 0}.capacity-options .task-text-button{display:block}@media(max-width:767px){.anonymize-page .anonymize-split{display:block;overflow:visible}.anonymize-page .anonymize-form-col .paper-settings-main{height:auto}.anonymize-fields{overflow:visible}.anonymize-page .paper-settings-main .paper-settings-section{padding:18px 16px 20px}.anonymize-page .anonymize-topbar{padding:14px 16px}.anonymize-page .anonymize-preview-col{padding:16px}.anonymize-page .anonymize-preview-body{padding:20px}.anonymize-page .anonymize-submit-bar{padding:16px}.anonymize-page .preview-expand{display:none}.anonymize-page .anonymize-mobile-tabs{padding:0;gap:0;background:var(--paper-card)}.anonymize-mobile-tabs button{border-radius:0;padding:12px;min-height:44px}.anonymize-mobile-tabs button[aria-selected=true]{background:0 0;box-shadow:inset 0 -2px var(--accent)}.cycle-option{min-height:44px}}.anonymize-page{--font-sans:system-ui,-apple-system,sans-serif;font-family:var(--font-sans)}body:not(.dark-mode) .anonymize-page{--paper-card:#fff;--canvas-bg-color:#faf9f6;--paper-bg-alt:#f5f4f0;--border-color:#dedbd4;--color:#242320;--ink-muted:#68655e}.anonymize-page .repo-access-controls .btn{font-size:12px;padding:8px 12px;min-height:36px}.anonymize-page .form-check-label{font-weight:400}.anonymize-page .form-check{padding-left:26px}.anonymize-page .form-check input{width:16px;height:16px;margin-left:-26px;accent-color:var(--accent)}.anonymize-page .form-check small{margin-top:6px}.anonymize-page .btn.btn-icon.refresh-branches{display:inline-flex;align-items:center;justify-content:center;width:40px;min-width:40px;height:100%;min-height:40px;padding:0}@media (max-width:767px){.anonymize-page #branch,.anonymize-page #commit{min-height:44px}.anonymize-page .btn.btn-icon.refresh-branches{width:44px;min-width:44px;min-height:44px}}.anonymize-page .redaction-syntax{font-size:12px;margin-top:8px}.redaction-syntax summary{cursor:pointer;color:var(--link-color);min-height:28px}.anonymize-page .anonymize-preview-body h2{border:0;padding:0;font-weight:700}.anonymize-page .anonymize-preview-body h1{font-weight:700}.anonymize-page .anonymize-preview-body pre{background:var(--paper-bg-alt);line-height:1.7}.anonymize-page .anonymize-preview-body pre code{font:12px/1.7 ui-monospace,monospace;background:0 0;padding:0}.anonymize-page .anonymize-preview-body{--main-bg-color:var(--paper-card);background:var(--paper-card)}.anonymize-page .anonymize-submit-bar .btn{font-weight:600}.anonymize-page .form-grid-2 .form-group{margin-bottom:0}.anonymize-page .form-check small{margin-left:-26px}@media (min-width:992px){body:has([class*=floatingchat-container-wrap]) .anonymize-page .anonymize-submit-bar{padding-left:228px}}.user-settings{max-width:1060px;padding:28px 26px 40px}.user-settings .settings-title{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:22px}.user-settings .settings-title h1{font:650 26px/1.3 var(--font-sans);letter-spacing:-.025em;margin:0}.settings-title>span{color:var(--ink-muted);font-size:12px}.settings-nav{display:flex;gap:28px;border-bottom:1px solid var(--border-color)}.settings-nav button{border:0;border-radius:0;background:0 0;color:var(--ink-muted);padding:12px 0;min-height:44px;font:13px/1.4 var(--font-sans)}.settings-nav button[aria-current=page]{color:var(--color);font-weight:600;box-shadow:inset 0 -2px var(--accent)}.settings-nav button:hover{color:var(--accent)}.user-settings .settings-scope{color:var(--ink-muted);font-size:12px;margin:20px 0 4px}.user-settings .settings-row{display:grid;grid-template-columns:210px minmax(0,1fr);gap:32px;padding:22px 0;border-bottom:1px solid var(--border-color)}.user-settings .settings-label,.user-settings .settings-row>h2{font-size:13px;font-weight:600;line-height:1.5;margin:8px 0 0;display:block}.user-settings .settings-help{font-size:12px;color:var(--ink-muted);margin:7px 0 0;line-height:1.6}.user-settings .form-control{font-size:14px;min-height:40px;padding:9px 10px;border-radius:4px;background:var(--paper-card)}.user-settings textarea.form-control{line-height:1.6}.settings-syntax{font-size:12px;margin-top:8px}.settings-syntax summary{cursor:pointer;color:var(--link-color);min-height:26px}.settings-syntax p{margin:8px 0}.settings-checks{display:grid;grid-template-columns:1fr 1fr;gap:14px 18px;padding:4px 0;margin-bottom:12px}.user-settings .settings-check{display:flex;gap:9px;align-items:center;font-size:13px;font-weight:400;margin:0}.user-settings .settings-check .form-check-input{position:static;width:16px;height:16px;margin:0;flex:none;accent-color:var(--accent)}.settings-save{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:18px 0 22px}.settings-save-status{color:var(--ink-muted);font-size:12px}.settings-save #save{margin-left:auto;min-width:125px}.settings-save-error{color:var(--status-error);flex-basis:100%}.user-settings .settings-inline{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}.user-settings .btn{font-size:13px;min-height:40px;padding:9px 13px}.settings-inline .btn{flex-shrink:0}.user-settings #settings-quota{margin:22px 0 16px}.user-settings .quota-row{gap:20px}.user-settings .quota-item{padding:0;background:0 0;border:0}.user-settings .quota-label{font-size:12px}.user-settings .quota-value{font-size:13px;margin:6px 0}.user-settings .quota-value strong{font-size:14px}.user-settings .quota-percent,.user-settings .quota-remaining{font-size:11px}.user-settings .settings-plan{background:var(--paper-card);border:1px solid var(--border-color);border-radius:6px;padding:20px;margin:20px 0 0}.user-settings .settings-plan h3{font-size:15px;margin:0 0 10px}.user-settings .settings-plan>p{font-size:13px}.settings-cycles{display:flex;flex-wrap:wrap;gap:10px;border:0;padding:0;margin:16px 0}.settings-cycles label{display:flex;align-items:center;gap:8px;border:1px solid var(--border-color);background:var(--paper-card);border-radius:5px;padding:12px;font-size:13px;margin:0;cursor:pointer;flex:1}.settings-cycles label.selected{border-color:var(--accent);background:var(--accent-soft)}.settings-cycles input{accent-color:var(--accent)}.settings-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}.settings-notice{background:var(--paper-bg-alt);border:1px solid var(--border-color);border-radius:5px;padding:14px 16px;margin:16px 0;font-size:13px}.settings-notice p{margin:6px 0 12px}.settings-text-button{border:0;background:0 0;color:var(--link-color);padding:8px 0;font-size:12px}.settings-pass{margin-top:18px}.settings-pass label{display:block;font-size:13px;margin-bottom:8px}.settings-pass .btn{margin-top:12px}.settings-purchase{padding:12px 0;border-bottom:1px solid var(--border-color);font-size:13px;overflow-wrap:anywhere}.settings-purchase:last-child{border:0}.settings-purchase>span{display:block;color:var(--ink-muted);margin-top:4px}.user-settings .paper-account-card{padding:24px 0;border:0;background:0 0}.user-settings .paper-danger-zone{margin-top:24px}@media (max-width:767px){.user-settings{padding:22px 18px 90px}.user-settings .settings-row{grid-template-columns:1fr;gap:12px;padding:20px 0}.user-settings .settings-label,.user-settings .settings-row>h2{margin-top:0}.settings-nav{gap:18px;justify-content:space-between}.settings-nav button{text-align:left;font-size:12px;max-width:124px}.user-settings .settings-check{font-size:12px;min-height:28px}.settings-save{gap:8px}.settings-save-status{font-size:11px}.settings-save #save{min-width:120px}.user-settings .quota-row{grid-template-columns:1fr}.settings-cycles label{flex-basis:100%}}.user-settings .settings-save .draft-status{margin:0;padding:0}.settings-delete-confirm{max-width:480px;margin-top:18px}.settings-delete-confirm label{display:block;font-size:13px;margin-bottom:8px}.user-settings .quota-usage{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}.user-settings .quota-usage .quota-item+.quota-item{border:0;padding:0}.user-settings .quota-percent,.user-settings .quota-remaining{display:none}@media (max-width:767px){.user-settings .quota-usage{grid-template-columns:1fr}}.settings-header-actions{display:flex;align-items:center;gap:16px}.settings-header-actions>span{color:var(--ink-muted);font-size:12px}.user-settings .settings-upgrade{color:var(--accent);border-color:var(--accent);background:0 0}.user-settings .settings-comparison{width:100%;table-layout:fixed;margin:16px 0 20px;font-size:12px}.settings-comparison td,.settings-comparison th{padding:10px 8px;border-bottom:1px solid var(--border-color);text-align:left;overflow-wrap:anywhere;vertical-align:top}.settings-comparison th:first-child{width:42%;padding-left:0}.settings-comparison tbody th{font-weight:400}.settings-comparison thead th{font-weight:600}@media(max-width:580px){.settings-header-actions>span{display:none}.settings-header-actions{gap:8px}.user-settings .settings-comparison{font-size:11px}}.navbar .nav-link.nav-upgrade{border:1px solid var(--accent);border-radius:5px;color:var(--accent)!important;padding:7px 12px!important;margin-right:12px;font-size:12px;line-height:1.5}.navbar .nav-link.nav-upgrade:hover{background:var(--accent-soft)}@media(max-width:991px){.navbar .nav-link.nav-upgrade{display:inline-block;min-height:44px;padding:11px 14px!important;margin:8px 0}} \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css index d3c6da6..07bad0b 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -7773,3 +7773,299 @@ input[type="date"], select { color-scheme: light; } .q-card { min-width: 130px; } .q-header-actions { flex-wrap: wrap; gap: 8px; } } + +/* Billing follows the settings page's typography and section rules. */ +.billing-plan { padding: 1.5rem 0; border-bottom: 1px solid var(--paper-border, #d8d4cd); } +.billing-plan h3 { display: flex; flex-wrap: wrap; gap: .5rem 1.5rem; justify-content: space-between; } +.billing-price { font-variant-numeric: tabular-nums; font-weight: normal; } +.billing-actions { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: 1rem; } +#settings-billing p { max-width: 72ch; } + +/* Task-local hosting choices inherit the repository form's paper palette. */ +.repository-hosting { border-top: 1px solid var(--border-color); margin-top: 24px; } +.repository-hosting h2 { font-size: 1.5rem; } +.hosting-choices { border: 0; padding: 0; margin: 20px 0; min-width: 0; } +.hosting-choices legend { font-size: 1rem; font-weight: 600; } +.hosting-choice { display: flex; align-items: flex-start; gap: 12px; padding: 16px; border: 1px solid var(--border-color); background: var(--paper-card); cursor: pointer; } +.hosting-choice + .hosting-choice { border-top: 0; } +.hosting-choice input { margin-top: 5px; accent-color: var(--accent); } +.hosting-choice strong, .hosting-choice small { display: block; } +.hosting-choice small { margin-top: 6px; color: var(--ink-muted); } +.hosting-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; margin: 20px 0; } +.repository-pass { margin: 20px 0; } +.repository-pass summary { cursor: pointer; color: var(--link-color); } +.repository-pass p { margin-top: 12px; } + +/* Approved task-based payment flow: review content and a persistent summary. */ +.task-review-active.anonymize-page { height: auto !important; min-height: 100%; overflow: visible; } +.task-review-active .anonymize-workspace { flex: 0 0 auto; overflow: visible; } +.repository-task { width: 100%; max-width: 1020px; margin: 0 auto; padding: 32px 24px 42px; color: var(--color); font-size: 15px; line-height: 1.55; } +.repository-task .paper-crumbs { margin-bottom: 24px; } +.repository-task h1 { font: normal 40px/1.15 'Iowan Old Style', Georgia, serif; margin: 8px 0 10px; } +.repository-task h2 { font: normal 27px/1.25 'Iowan Old Style', Georgia, serif; margin: 0 0 12px; } +.repository-task h3 { font: 600 17px/1.5 var(--font-sans); margin: 0 0 10px; } +.repository-task p { margin: 0 0 16px; } +.task-lede, .task-muted { color: var(--ink-muted); } +.task-trail { list-style: none; display: flex; flex-wrap: wrap; gap: 24px; margin: 30px 0; padding: 18px 0; border-bottom: 1px solid var(--border-color); color: var(--ink-muted); font-size: 13px; } +.task-trail [aria-current] { color: var(--color); font-weight: 600; } +.task-trail button { color: inherit; padding: 0; border: 0; background: none; font: inherit; cursor: pointer; } +.task-columns { display: grid; grid-template-columns: minmax(0,1.6fr) minmax(245px,1fr); gap: 34px; align-items: start; } +.task-section-title { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; } +.task-text-button { border: 0; padding: 7px 0; background: transparent; color: var(--link-color); cursor: pointer; font: inherit; text-align: left; } +.task-text-button:focus-visible, .task-trail button:focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; } +.task-summary { background: var(--paper-bg-alt); padding: 24px; border-radius: 5px; } +.task-summary dt { margin-top: 18px; font-size: 12px; font-weight: 400; color: var(--ink-muted); } +.task-summary dd { margin: 3px 0; overflow-wrap: anywhere; } +.task-summary h3, .task-redactions { overflow-wrap: anywhere; } +.task-summary dl { margin-bottom: 0; } +.task-summary-foot { border-top: 1px solid var(--border-color); margin-top: 28px; padding-top: 24px; } +.task-summary-foot p { color: var(--ink-muted); margin: 0; } +.task-hosting { border-top: 1px solid var(--border-color); margin-top: 22px; padding-top: 20px; } +.repository-task .hosting-choices { margin: 18px 0; } +.repository-task .hosting-choice { padding: 18px; gap: 13px; font-weight: 400; margin: 0; } +.repository-task .hosting-choice:first-of-type { border-radius: 6px 6px 0 0; } +.repository-task .hosting-choice:last-of-type { border-radius: 0 0 6px 6px; } +.repository-task .hosting-choice small { margin-top: 0; font-size: 13px; line-height: 1.55; } +.task-terms { font-size: 13px; color: var(--ink-soft); } +.task-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 18px; margin: 24px 0 16px; } +.repository-task .btn { padding: 10px 16px; border-radius: 5px; font-size: 15px; } +.task-status { background: var(--accent-soft); padding: 16px 20px; margin: 20px 0; } +.task-status p:last-child { margin: 0; } +@media(max-width:650px) { + .repository-task { padding: 24px 18px; } + .repository-task h1 { font-size: 32px; } + .task-columns { display: block; } + .task-summary { margin-top: 28px; } + .task-trail { gap: 15px; font-size: 12px; } +} +.repository-task { scroll-margin-top: 70px; } +.task-columns { align-items: stretch; } +.repository-task .btn-ink { background: var(--color); border-color: var(--color); color: var(--canvas-bg-color); box-shadow: none; } +.repository-task .btn-ink:hover { background: var(--ink-soft); border-color: var(--ink-soft); } + +.task-field { margin-bottom: 24px; } +.task-field > label { display: block; font-weight: 600; margin-bottom: 8px; } +.task-field input, .task-field select, .task-field textarea { width: 100%; padding: 12px; border: 1px solid var(--border-color); border-radius: 4px; background: var(--paper-card); color: var(--color); font: inherit; } +.task-field textarea { resize: vertical; } +.task-field small { display: block; margin-top: 8px; font-size: 13px; color: var(--ink-muted); } +.task-field :is(input, select, textarea):focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; } + +.task-paybox { background: var(--paper-card); border: 1px solid var(--border-color); border-radius: 5px; padding: 22px; margin-top: 20px; } + +.task-ready { border-left: 3px solid var(--success, #2f7a44); padding: 16px 20px; background: var(--paper-bg-alt); margin-bottom: 22px; } +.repository-task.status-page .paper-progress { margin-top: 24px; } + +.task-date-options summary { cursor: pointer; color: var(--link-color); font-size: 13px; } +.task-date-options[open] summary { margin-bottom: 12px; } + +.task-result { padding: 18px; background: var(--paper-bg-alt); overflow-wrap: anywhere; } +.task-result .detail-label { font-size: 12px; color: var(--ink-muted); margin-bottom: 6px; } + +/* Step one keeps redaction feedback beside the fields being edited. */ +.task-configure-columns { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: start; } +.task-live-preview { min-width: 0; border: 1px solid var(--border-color); border-radius: 5px; background: var(--paper-card); } +.task-preview-head { padding: 20px 24px; border-bottom: 1px solid var(--border-color); } +.task-preview-head h2 { font-size: 23px; margin-bottom: 6px; } +.task-preview-head p { margin: 0; font-size: 13px; } +.task-preview-message, .task-preview-content { padding: 24px; } +.task-preview-content { overflow: auto; max-height: 650px; overflow-wrap: anywhere; } +.repository-task .task-preview-content h1 { font: 600 28px/1.3 var(--font-sans); } +.repository-task .task-preview-content h2 { font: 600 22px/1.3 var(--font-sans); } +@media(max-width:650px) { + .task-live-preview { margin-top: 28px; } + .task-preview-content { max-height: none; } +} + +/* Anonymization workspace: visible configuration and contextual hosting (mock v8). */ +.anonymize-page .anonymize-topbar { padding: 14px 22px; background: var(--canvas-bg-color); } +.anonymize-page .anonymize-topbar-inner { max-width: none; } +.anonymize-page .anonymize-topbar-head { justify-content: space-between; } +.anonymize-page .anonymize-topbar-title { font: 600 19px/1.25 var(--font-sans); margin: 0; } +.anonymize-page .anonymize-split { display: grid; grid-template-columns: minmax(320px,42%) minmax(0,1fr); overflow: hidden; } +.anonymize-page .anonymize-form-col { width: auto; min-height: 0; overflow: hidden !important; background: var(--paper-card); } +.anonymize-page .anonymize-form-col .paper-settings-main { display: flex; flex-direction: column; height: 100%; min-height: 0; max-width: none; padding: 0; } +.anonymize-fields { flex: 1; min-height: 0; overflow: auto; position: relative; scrollbar-width: thin; } +.anonymize-page .paper-settings-main .paper-settings-section { border: 0; border-top: 1px solid var(--border-color); border-radius: 0; padding: 18px 20px 20px; margin: 0; box-shadow: none; } +.anonymize-page .paper-settings-main .paper-settings-section:first-child { border-top: 0; padding-top: 18px; } +.anonymize-page .paper-section-eyebrow { font: 600 15px/1.4 var(--font-sans); margin: 0 0 16px; letter-spacing: 0; } +.anonymize-page .paper-field-label { font: 500 13px/1.5 var(--font-sans); margin-bottom: 8px; } +.anonymize-page .form-group { margin-bottom: 16px; } +.anonymize-page .form-group:last-child { margin-bottom: 0; } +.anonymize-page .form-control { font-size: 14px; min-height: 40px; padding: 9px 10px; border-radius: 4px; } +.anonymize-page textarea.form-control { line-height: 1.6; } +.anonymize-page .form-grid-2 { gap: 12px; } +.anonymize-page .form-check { padding-top: 10px; padding-bottom: 10px; font-size: 14px; } +.anonymize-page .form-check-label { font-size: 14px; line-height: 1.5; } +.anonymize-page .form-text { font-size: 12px; line-height: 1.6; } +.anonymize-page .repo-access-details { margin: 12px 0 16px; } +.anonymize-page .repo-access-note { font-size: 11px; } +.anonymize-page .anonymize-submit-bar { flex: none; position: static; margin: 0; padding: 16px 20px; background: var(--paper-card); border-top: 1px solid var(--border-color); } +.anonymize-page .anonymize-submit-bar .btn { width: 100%; font-size: 14px; padding: 10px 12px; min-height: 43px; } +.checkout-return-note { font-size: 11px; line-height: 1.5; color: var(--ink-muted); margin: 8px 0 0; text-align: center; } +.anonymize-fields > .alert, .anonymize-fields > .draft-status, .anonymize-fields > .anonymize-review-note { margin: 12px 20px; } +.anonymize-page .anonymize-preview-col { min-height: 0; padding: 20px; position: relative; background: var(--canvas-bg-color); } +.anonymize-page .anonymize-preview-head { border: 0; padding: 0; min-height: 32px; margin-bottom: 14px; display: flex; align-items: center; justify-content: space-between; } +.anonymize-preview-head strong, .anonymize-preview-head button { font-size: 13px; } +.anonymize-page .anonymize-preview-body { padding: 24px; border-radius: 6px; min-height: 480px; overflow-wrap: anywhere; font: 14px/1.7 var(--font-sans); } +.anonymize-page .anonymize-preview-body h1 { font-size: 27px; line-height: 1.2; margin: 0 0 20px; padding-bottom: 14px; } +.anonymize-page .anonymize-preview-body h2 { font-size: 18px; margin: 28px 0 12px; } +.anonymize-page .anonymize-preview-body pre { font-size: 12px; padding: 15px; } +.anonymize-page.preview-expanded .anonymize-split { grid-template-columns: 1fr; } +.anonymize-page.preview-expanded .anonymize-form-col { display: none; } +.hosting-usage { font-size: 12px; color: var(--ink-muted); margin: 0 0 4px; } +.expiration-choices { border: 0; padding: 0; margin: 0 0 16px; min-width: 0; } +.expiration-choice { display: flex; align-items: flex-start; gap: 10px; padding: 12px 0; margin: 0; cursor: pointer; font-size: 14px; font-weight: 500; line-height: 1.5; } +.expiration-choice input { width: 16px; height: 16px; margin: 4px 0 0; flex: none; accent-color: var(--accent); } +.expiration-choice small { display: block; font-size: 12px; font-weight: 400; color: var(--ink-muted); margin-top: 2px; } +.dated-options { padding: 2px 0 14px 26px; } +.hosting-property, .hosting-date { display: grid; grid-template-columns: 48px minmax(0,1fr); gap: 8px; align-items: center; margin-bottom: 10px; } +.hosting-property { margin-bottom: 0; } +.hosting-property label, .hosting-date .paper-field-label { font-size: 12px; font-weight: 400; margin: 0; } +.hosting-date .invalid-feedback { grid-column: 1/-1; } +.anonymize-page .conference-field { border-top: 1px solid var(--border-color); padding: 16px 0; margin: 0; } +.subscription-choice { padding: 16px; background: var(--paper-bg-alt); border-radius: 6px; margin-top: 4px; } +.subscription-choice h3 { font-size: 13px; font-weight: 600; margin: 0 0 10px; } +.billing-cycle { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 8px; border: 0; padding: 0; margin: 0 0 12px; min-width: 0; } +.cycle-option { display: flex; align-items: center; gap: 7px; padding: 10px 8px; border: 1px solid var(--border-color); border-radius: 4px; background: var(--paper-card); font-size: 12px; cursor: pointer; margin: 0; } +.cycle-option.selected { border-color: var(--accent); background: var(--accent-soft); } +.cycle-option input { accent-color: var(--accent); margin: 0; flex: none; } +.subscription-choice p { font-size: 12px; line-height: 1.5; margin: 0 0 8px; } +.subscription-choice p:last-child { margin: 0; } +.hosting-terms { font-size: 12px; line-height: 1.5; color: var(--ink-muted); } +.capacity-reason { font-size: 13px; } +.capacity-options, .repository-pass { margin-top: 12px; font-size: 12px; } +.capacity-options summary, .repository-pass summary { cursor: pointer; } +.capacity-options p, .repository-pass p { margin: 8px 0; } +.capacity-options .task-text-button { display: block; } +@media(max-width:767px) { + .anonymize-page .anonymize-split { display: block; overflow: visible; } + .anonymize-page .anonymize-form-col .paper-settings-main { height: auto; } + .anonymize-fields { overflow: visible; } + .anonymize-page .paper-settings-main .paper-settings-section { padding: 18px 16px 20px; } + .anonymize-page .anonymize-topbar { padding: 14px 16px; } + .anonymize-page .anonymize-preview-col { padding: 16px; } + .anonymize-page .anonymize-preview-body { padding: 20px; } + .anonymize-page .anonymize-submit-bar { padding: 16px; } + .anonymize-page .preview-expand { display: none; } + .anonymize-page .anonymize-mobile-tabs { padding: 0; gap: 0; background: var(--paper-card); } + .anonymize-mobile-tabs button { border-radius: 0; padding: 12px; min-height: 44px; } + .anonymize-mobile-tabs button[aria-selected=true] { background: none; box-shadow: inset 0 -2px var(--accent); } + .cycle-option { min-height: 44px; } +} +/* Match the mock's typography and document rendering without changing the app shell. */ +.anonymize-page { --font-sans: system-ui, -apple-system, sans-serif; font-family: var(--font-sans); } +body:not(.dark-mode) .anonymize-page { --paper-card: #fff; --canvas-bg-color: #faf9f6; --paper-bg-alt: #f5f4f0; --border-color: #dedbd4; --color: #242320; --ink-muted: #68655e; } +.anonymize-page .repo-access-controls .btn { font-size: 12px; padding: 8px 12px; min-height: 36px; } +.anonymize-page .form-check-label { font-weight: 400; } +.anonymize-page .form-check { padding-left: 26px; } +.anonymize-page .form-check input { width: 16px; height: 16px; margin-left: -26px; accent-color: var(--accent); } +.anonymize-page .form-check small { margin-top: 6px; } +.anonymize-page .btn.btn-icon.refresh-branches { display: inline-flex; align-items: center; justify-content: center; width: 40px; min-width: 40px; height: 100%; min-height: 40px; padding: 0; } +@media (max-width: 767px) { + .anonymize-page #branch, .anonymize-page #commit { min-height: 44px; } + .anonymize-page .btn.btn-icon.refresh-branches { width: 44px; min-width: 44px; min-height: 44px; } +} +.anonymize-page .redaction-syntax { font-size: 12px; margin-top: 8px; } +.redaction-syntax summary { cursor: pointer; color: var(--link-color); min-height: 28px; } +.anonymize-page .anonymize-preview-body h2 { border: 0; padding: 0; font-weight: 700; } +.anonymize-page .anonymize-preview-body h1 { font-weight: 700; } +.anonymize-page .anonymize-preview-body pre { background: var(--paper-bg-alt); line-height: 1.7; } +.anonymize-page .anonymize-preview-body pre code { font: 12px/1.7 ui-monospace, monospace; background: none; padding: 0; } + +.anonymize-page .anonymize-preview-body { --main-bg-color: var(--paper-card); background: var(--paper-card); } +.anonymize-page .anonymize-submit-bar .btn { font-weight: 600; } +.anonymize-page .form-grid-2 .form-group { margin-bottom: 0; } +.anonymize-page .form-check small { margin-left: -26px; } +/* Reserve the widget's bottom-left space without moving or hiding donations. */ +@media (min-width: 992px) { + body:has([class*="floatingchat-container-wrap"]) .anonymize-page .anonymize-submit-bar { + padding-left: 228px; + } +} + +/* User settings: one sheet, with labels aligned beside their controls. */ +.user-settings { max-width: 1060px; padding: 28px 26px 40px; } +.user-settings .settings-title { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 22px; } +.user-settings .settings-title h1 { font: 650 26px/1.3 var(--font-sans); letter-spacing: -.025em; margin: 0; } +.settings-title > span { color: var(--ink-muted); font-size: 12px; } +.settings-nav { display: flex; gap: 28px; border-bottom: 1px solid var(--border-color); } +.settings-nav button { border: 0; border-radius: 0; background: transparent; color: var(--ink-muted); padding: 12px 0; min-height: 44px; font: 13px/1.4 var(--font-sans); } +.settings-nav button[aria-current=page] { color: var(--color); font-weight: 600; box-shadow: inset 0 -2px var(--accent); } +.settings-nav button:hover { color: var(--accent); } +.user-settings .settings-scope { color: var(--ink-muted); font-size: 12px; margin: 20px 0 4px; } +.user-settings .settings-row { display: grid; grid-template-columns: 210px minmax(0,1fr); gap: 32px; padding: 22px 0; border-bottom: 1px solid var(--border-color); } +.user-settings .settings-row > h2, .user-settings .settings-label { font-size: 13px; font-weight: 600; line-height: 1.5; margin: 8px 0 0; display: block; } +.user-settings .settings-help { font-size: 12px; color: var(--ink-muted); margin: 7px 0 0; line-height: 1.6; } +.user-settings .form-control { font-size: 14px; min-height: 40px; padding: 9px 10px; border-radius: 4px; background: var(--paper-card); } +.user-settings textarea.form-control { line-height: 1.6; } +.settings-syntax { font-size: 12px; margin-top: 8px; } +.settings-syntax summary { cursor: pointer; color: var(--link-color); min-height: 26px; } +.settings-syntax p { margin: 8px 0; } +.settings-checks { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 18px; padding: 4px 0; margin-bottom: 12px; } +.user-settings .settings-check { display: flex; gap: 9px; align-items: center; font-size: 13px; font-weight: 400; margin: 0; } +.user-settings .settings-check .form-check-input { position: static; width: 16px; height: 16px; margin: 0; flex: none; accent-color: var(--accent); } +.settings-save { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; padding: 18px 0 22px; } +.settings-save-status { color: var(--ink-muted); font-size: 12px; } +.settings-save #save { margin-left: auto; min-width: 125px; } +.settings-save-error { color: var(--status-error); flex-basis: 100%; } +.user-settings .settings-inline { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; } +.user-settings .btn { font-size: 13px; min-height: 40px; padding: 9px 13px; } +.settings-inline .btn { flex-shrink: 0; } +.user-settings #settings-quota { margin: 22px 0 16px; } +.user-settings .quota-row { gap: 20px; } +.user-settings .quota-item { padding: 0; background: transparent; border: 0; } +.user-settings .quota-label { font-size: 12px; } +.user-settings .quota-value { font-size: 13px; margin: 6px 0; } +.user-settings .quota-value strong { font-size: 14px; } +.user-settings .quota-percent, .user-settings .quota-remaining { font-size: 11px; } +.user-settings .settings-plan { background: var(--paper-card); border: 1px solid var(--border-color); border-radius: 6px; padding: 20px; margin: 20px 0 0; } +.user-settings .settings-plan h3 { font-size: 15px; margin: 0 0 10px; } +.user-settings .settings-plan > p { font-size: 13px; } +.settings-cycles { display: flex; flex-wrap: wrap; gap: 10px; border: 0; padding: 0; margin: 16px 0; } +.settings-cycles label { display: flex; align-items: center; gap: 8px; border: 1px solid var(--border-color); background: var(--paper-card); border-radius: 5px; padding: 12px; font-size: 13px; margin: 0; cursor: pointer; flex: 1; } +.settings-cycles label.selected { border-color: var(--accent); background: var(--accent-soft); } +.settings-cycles input { accent-color: var(--accent); } +.settings-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px; } +.settings-notice { background: var(--paper-bg-alt); border: 1px solid var(--border-color); border-radius: 5px; padding: 14px 16px; margin: 16px 0; font-size: 13px; } +.settings-notice p { margin: 6px 0 12px; } +.settings-text-button { border: 0; background: transparent; color: var(--link-color); padding: 8px 0; font-size: 12px; } +.settings-pass { margin-top: 18px; } +.settings-pass label { display: block; font-size: 13px; margin-bottom: 8px; } +.settings-pass .btn { margin-top: 12px; } +.settings-purchase { padding: 12px 0; border-bottom: 1px solid var(--border-color); font-size: 13px; overflow-wrap: anywhere; } +.settings-purchase:last-child { border: 0; } +.settings-purchase > span { display: block; color: var(--ink-muted); margin-top: 4px; } +.user-settings .paper-account-card { padding: 24px 0; border: 0; background: none; } +.user-settings .paper-danger-zone { margin-top: 24px; } +@media (max-width: 767px) { + .user-settings { padding: 22px 18px 90px; } + .user-settings .settings-row { grid-template-columns: 1fr; gap: 12px; padding: 20px 0; } + .user-settings .settings-row > h2, .user-settings .settings-label { margin-top: 0; } + .settings-nav { gap: 18px; justify-content: space-between; } + .settings-nav button { text-align: left; font-size: 12px; max-width: 124px; } + .user-settings .settings-check { font-size: 12px; min-height: 28px; } + .settings-save { gap: 8px; } + .settings-save-status { font-size: 11px; } + .settings-save #save { min-width: 120px; } + .user-settings .quota-row { grid-template-columns: 1fr; } + .settings-cycles label { flex-basis: 100%; } +} +.user-settings .settings-save .draft-status { margin: 0; padding: 0; } +.settings-delete-confirm { max-width: 480px; margin-top: 18px; } +.settings-delete-confirm label { display: block; font-size: 13px; margin-bottom: 8px; } +.user-settings .quota-usage { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); } +.user-settings .quota-usage .quota-item + .quota-item { border: 0; padding: 0; } +.user-settings .quota-percent, .user-settings .quota-remaining { display: none; } +@media (max-width: 767px) { .user-settings .quota-usage { grid-template-columns: 1fr; } } +.settings-header-actions { display: flex; align-items: center; gap: 16px; } +.settings-header-actions > span { color: var(--ink-muted); font-size: 12px; } +.user-settings .settings-upgrade { color: var(--accent); border-color: var(--accent); background: transparent; } +.user-settings .settings-comparison { width: 100%; table-layout: fixed; margin: 16px 0 20px; font-size: 12px; } +.settings-comparison th, .settings-comparison td { padding: 10px 8px; border-bottom: 1px solid var(--border-color); text-align: left; overflow-wrap: anywhere; vertical-align: top; } +.settings-comparison th:first-child { width: 42%; padding-left: 0; } +.settings-comparison tbody th { font-weight: 400; } +.settings-comparison thead th { font-weight: 600; } +@media(max-width: 580px) { .settings-header-actions > span { display: none; } .settings-header-actions { gap: 8px; } .user-settings .settings-comparison { font-size: 11px; } } +.navbar .nav-link.nav-upgrade { border: 1px solid var(--accent); border-radius: 5px; color: var(--accent) !important; padding: 7px 12px !important; margin-right: 12px; font-size: 12px; line-height: 1.5; } +.navbar .nav-link.nav-upgrade:hover { background: var(--accent-soft); } +@media(max-width:991px) { .navbar .nav-link.nav-upgrade { display: inline-block; min-height: 44px; padding: 11px 14px !important; margin: 8px 0; } } diff --git a/public/i18n/locale-en.json b/public/i18n/locale-en.json index 85909c3..4956074 100644 --- a/public/i18n/locale-en.json +++ b/public/i18n/locale-en.json @@ -140,7 +140,15 @@ "github_grant_revocation_failed": "Unable to revoke the GitHub grant. Please retry.", "another_login_required": "Connect and verify another sign-in method before disconnecting OAuth.", "oauth_resources_remaining": "Some resources still require OAuth. Migrate or remove them before disconnecting.", - "invalid_github_path": "The GitHub repository path is invalid." + "invalid_github_path": "The GitHub repository path is invalid.", + "repository_tree_incomplete": "The repository file tree is incomplete. Reduce its size and refresh before downloading.", + "billing_unavailable": "Payments are not available. Please try again later.", + "invalid_billing_signature": "The payment notification could not be verified.", + "billing_webhook_failed": "The payment notification could not be processed.", + "billing_customer_not_found": "No billing account was found.", + "subscription_required_for_never_expiration": "Never-expiring repositories require the owner’s active monthly or annual author subscription. Choose a dated expiration or upgrade in Plans and billing.", + "invalid_billing_expiration": "Choose an expiration date within the next year, or select Never expire with an author subscription.", + "pending_payment": "Awaiting payment" }, "WARNINGS": { "page_not_enabled_on_repo": "GitHub Pages is not enabled on this repository. Enable it in the repository's Settings → Pages on GitHub, then refresh.", diff --git a/public/partials/anonymize.htm b/public/partials/anonymize.htm index 3322e2d..078575b 100644 --- a/public/partials/anonymize.htm +++ b/public/partials/anonymize.htm @@ -1,4 +1,4 @@ -
+
-
Select repositories on GitHub, then return here. Selected content will be published, including content from private repositories.
+
Anonymized content is public, even from private repositories.
@@ -43,14 +43,10 @@
-
- My work  /  - {{ isUpdate ? 'Edit anonymization' : 'New anonymization' }} -

- New anonymization - Edit anonymization + New anonymization + Edit anonymization

{{ detectedType === 'repo' ? 'Repo' : detectedType === 'pr' ? 'PR' : 'Gist' }} @@ -78,10 +74,10 @@
-
+
-
Source
+

Source & access

-
Select repositories on GitHub, then return here. Selected content will be published, including content from private repositories.
+
Anonymized content is public, even from private repositories.
-
Identity
+

Anonymization

- Your share link will be anonymous.4open.science/r/{{ repoId }}. + anonymous.4open.science/r/{{ repoId }}
ID can only contain letters and numbers.
{{ repoId }} is already used.
@@ -186,31 +183,20 @@
{{ gistId }} is already used.
-
- - - - {{ conference_data?.name }} expires {{ fmt?.date(conference_data?.endDate) }}. - -
The conference is not activated.
- Link to a conference to apply its shared defaults. -
- -
-
Anonymization
+
- - One term per line (regex allowed). Replaced by {{ site_options?.ANONYMIZATION_MASK }}-[N], or use term=>replacement to pick your own (e.g. Anonymous=>ABC). + + One term per line.
Regex & replacement syntax Regex is supported. Replaced by {{ site_options?.ANONYMIZATION_MASK }}-[N], or use term=>replacement to pick your own (e.g. Anonymous=>ABC).
Regex characters detected. Escape them if unintentional.
Terms are in an invalid format.
-
Display
+

Display

@@ -220,12 +206,12 @@
- Images are served unchanged and may contain names or affiliations. +
- PDF contents and metadata are served unchanged. About supported formats +
@@ -243,6 +229,7 @@
+

Images and PDFs are served unchanged. Review their contents and metadata before sharing. Supported formats

@@ -302,31 +289,64 @@
-
-
Expiration
- -
-
- - -
-
- +
+

Hosting & expiration

+

+ Uses the owner's hosting + Your author subscription is active. + Conference hosting is checked on submission. + {{ hostingQuota.repository.used }} of {{ hostingQuota.repository.total }} active repositories · Free +

+
+ Expiration + +
+
+
Pick a date in the future.
Pick a date on or before {{ fmt?.date(maxExpirationDate) }}.
Enter a valid expiration date.
+
+
+ +
+

Visitors will be redirected to the original GitHub source on this date, revealing its identity.

+
+ + + + {{ conference_data?.name }} expires {{ fmt?.date(conference_data?.endDate) }}. + +
The conference is not activated.
+ Link to a conference to apply its shared defaults. +
+
+ + +

Confirming your payment…

Your draft is saved. Please do not pay again.

+

{{ billingNotice }}

+ +

No scheduled expiration while subscribed. A 90-day grace period applies if paid access ends.

+
Hosting just this repository?

{{ billingPrice(plan) }} · {{ billingBytes(plan.storage) }} for 180 days. No renewal. Does not include Never expire.

- After {{ fmt?.date(options?.expirationDate) }}, the content will be removed. - After {{ fmt?.date(options?.expirationDate) }}, visitors will be redirected to GitHub.
+
-
Co-authors
+

Coauthors

Co-authors can view and edit these settings. They cannot delete the anonymization or manage co-authors.

@@ -364,15 +384,14 @@
Your unsaved draft was restored.
{{ draftSaved ? "Draft saved in this tab for 30 minutes." : "Unsaved changes. Keep this tab open until you save." }}
-

Review enabled images and PDFs before sharing. Their contents are not anonymized.

- + +
- - + @@ -392,8 +411,7 @@
- Live preview - {{ previewStatus === 'ready' ? 'README with redactions applied' : 'README preview' }} + README.md
Loading source…
Updating the anonymized preview…
@@ -407,8 +425,7 @@
- Live preview - {{ previewStatus === 'ready' ? 'Gist with redactions applied' : 'Gist preview' }} + Gist preview
Loading source…
Updating the anonymized preview…
@@ -460,8 +477,7 @@
- Live preview - {{ previewStatus === 'ready' ? 'Pull request with redactions applied' : 'Pull request preview' }} + Pull request preview
Loading source…
Updating the anonymized preview…
diff --git a/public/partials/conference.htm b/public/partials/conference.htm index 043574a..5765346 100644 --- a/public/partials/conference.htm +++ b/public/partials/conference.htm @@ -26,6 +26,22 @@ Cost so far {{ fmt?.number(conference?.price, 2) }} €
+
+

{{ billingNotice }}

+ +
+

{{ billingError }}

+
+

Activate your review package

+

This conference is waiting for payment. Authors can join after payment is confirmed. Checkout returns to this conference. Authors within the package do not pay separately.

+

Loading payment options…

+

{{ billingError }}

+
+

{{ billingPrice(plan) }} for up to {{ plan.repositories }} repositories and {{ billingBytes(plan.storage) }} of source files during the review window. Taxes, if applicable, appear at checkout.

+ +
+

Manage invoices

+
Repositories
diff --git a/public/partials/faq.htm b/public/partials/faq.htm index f24912f..9b18524 100644 --- a/public/partials/faq.htm +++ b/public/partials/faq.htm @@ -12,6 +12,7 @@
Contents
+
+
Your unsaved draft was restored.Unsaved changes{{ draftSaved ? ' · Draft saved in this tab' : '' }}{{ message ? 'Defaults saved' : 'All changes saved' }}
+ + + +
+ +
+
+

Your plan and usage. Reviewer access is always free.

+

Loading billing…

+ +

{{ billingNotice }}

+
Confirming your payment

Your allowance will update after confirmation. Please do not pay again.

+

Current plan

+
{{ profileAuthorGrant() ? 'Author subscription' : (billing?.enabled ? 'Free' : 'Account allowance') }}

{{ profileAuthorGrant().cancelAtPeriodEnd ? 'Renewal cancelled · Access until ' : 'Paid access through ' }}{{ billingDate(profileAuthorGrant().until) }}

+ +
+

{{ billing.allowance.repositories }} repositories · {{ billingBytes(billing.allowance.storage) }}

+

Loading usage…

+

Coauthored repositories use their owner's allowance. Conference hosting is separate.

+

Your repository allowance is full. Review your repositories to remove work you no longer need.

+

Your previous subscription is no longer active. Never-expiring repositories receive a 90-day grace period after paid access ends. Review repository expiration dates.

+

A subscription payment is overdue. Use Manage billing to update your payment details.

+

When paid access ends, never-expiring repositories enter a 90-day grace period. Dated repositories keep their expiration dates.

+
+

Compare plans

+ + + + + + +
Free and Author hosting
IncludedFreeAuthor
Active repositories{{ billing.allowance?.repositories }}{{ profileSelectedPlan()?.repositories }}
Source storage{{ billingBytes(billing.allowance?.storage) }}{{ billingBytes(profileSelectedPlan()?.storage) }}
ExpirationScheduledScheduled or never
CoauthorsIncludedIncluded
Reviewer accessFreeFree
+
Billing frequency
+

Renews {{ profileSelectedPlan()?.interval === 'year' ? 'annually' : 'monthly' }} until cancelled. Tax shown at checkout.

If paid access ends, never-expiring repositories expire after a 90-day grace period.

+
+
+

New purchases are not available. Existing billing can still be managed below.

+
+

Billing

Invoices, payment details, and renewal.

No billing account available.

+

Repository passes

One repository for 180 days.
No subscription or automatic renewal.

+

{{ billingPrice(profilePassPlan()) }} · {{ billingBytes(profilePassPlan().storage) }} · Never expire is not included.

+
+

Your purchases

{{ profileGrantName(grant) }}{{ grant.scope }}

{{ grant.status }}

+

Conference hosting

Shared hosting is managed per conference.

My conferences
+
+ -
-
+
diff --git a/public/partials/status.htm b/public/partials/status.htm index 2f3f28d..471aed1 100644 --- a/public/partials/status.htm +++ b/public/partials/status.htm @@ -1,21 +1,16 @@ -
-
Anonymization  /  Status
-
-
-

Status of {{ repoId }}

-

Track progress as your anonymization is prepared.

-
- - - - Rate limited - -
+
+
My work / Repository
+

Prepare your anonymous review link

+

{{ repo?.status === 'ready' ? 'Your repository is ready to share.' : 'Your settings are saved. Track preparation before sharing the link.' }}

+
  1. 1. Repository
  2. 2. Review and hosting
  3. 3. Review link
+
+
+
Your review link is ready
+

{{ repoId }}

+

Share the link with reviewers. They do not need to sign in.

+ -
-
Progress
- -

+

The repository will take a few minutes to get ready, depending on its size. Visit the FAQ for more information.

@@ -31,7 +26,7 @@

Anonymization will resume automatically in {{ rateLimitCountdown }}. No action needed — the job is queued and will continue where it left off.

-
+
 ·  @@ -49,6 +44,7 @@

{{ fmt?.translate('ERRORS.' + repo?.statusMessage) }}

No additional details were reported. The most common causes are private repositories, missing branches, and rate limits.

+

Review this repository’s hosting, then retry preparation.

  • Make sure the source URL points to a repository or pull request you can access.
  • Check that the chosen branch and commit still exist on GitHub.
  • @@ -61,10 +57,10 @@
-
+
Repository
GitHub Page
@@ -72,7 +68,7 @@
-
+
Go to anonymized repository @@ -82,33 +78,10 @@
-
-
Support Anonymous GitHub
-

- A small team keeps this running. If it helps you, please consider - contributing back — in code, ideas, or coffee. -

- - - -
- -
-
+ +
diff --git a/public/script/app.js b/public/script/app.js index b0d4e9f..558a72d 100644 --- a/public/script/app.js +++ b/public/script/app.js @@ -1,3 +1,4 @@ +import { setupBilling, readBilling } from "./billing.js"; import { reactive, nextTick } from "vue"; import { createTimers, createListeners } from "./state.js"; import { formDraft } from "./drafts.js"; @@ -16,6 +17,19 @@ function previewTabKeydown(event) { // Page setup functions run inside Vue effect scopes. export const mainController = function (state, http, location, timeout) { state.previewTabKeydown = previewTabKeydown; + state.headerCanUpgrade = false; + state.headerBillingPending = ["success", "portal"].includes(new URLSearchParams(window.location.search).get("billing")); + const updateHeaderBilling = billing => { + const subscribed = (billing?.grants || []).some(g => ["author_monthly", "author_annual"].includes(g.planId) && ["active", "paid", "past_due"].includes(g.status) && new Date(g.until).getTime() > Date.now()); + state.headerCanUpgrade = !!billing?.enabled && billing.checkoutEnabled !== false && !subscribed && (billing.plans || []).some(p => ["author_monthly", "author_annual"].includes(p.id)); + }; + state.on("billing:updated", (_, billing) => updateHeaderBilling(billing)); + state.on("billing:pending", (_, pending) => { state.headerBillingPending = pending; }); + state.openHeaderUpgrade = () => { + if (location.path() === "/profile") state.emit("settings:upgrade"); + else location.url("/profile?upgrade=1"); + }; + state.title = "Main"; state.user = { status: "connection" }; state.site_options; @@ -78,6 +92,7 @@ export const mainController = function (state, http, location, timeout) { http.get("/api/user").then( (res) => { if (res) state.user = res.data; + if (state.user?.username) readBilling(http).then(res => updateHeaderBilling(res.data)).catch(() => {}); }, () => { state.user = null; @@ -142,6 +157,26 @@ export const faqController = function (state, http) { }; export const profileController = function (state, http, translate, timeout, quotaService) { + state.settingsTab = /(?:billing|upgrade)=/.test(window.location.search) ? "billing" : "defaults"; + state.confirmDeleteAccount = false; + state.deleteUsername = ""; + state.profilePastSubscription = () => !state.profileAuthorGrant() && (state.billing?.grants || []).some(g => ["author_monthly", "author_annual"].includes(g.planId)); + state.showAuthorPlans = new URLSearchParams(window.location.search).get("upgrade") === "1"; + state.showRepositoryPass = false; + state.profilePlan = "author_monthly"; + state.openProfileUpgrade = () => { + state.settingsTab = "billing"; + state.showAuthorPlans = true; + nextTick(() => document.getElementById("settings-plan-comparison")?.focus()); + }; + state.on("settings:upgrade", () => state.openProfileUpgrade()); + state.profileAuthorPlans = () => (state.billing?.plans || []).filter(p => ["author_monthly", "author_annual"].includes(p.id)); + state.profileSelectedPlan = () => state.profileAuthorPlans().find(p => p.id === state.profilePlan) || state.profileAuthorPlans()[0]; + state.profilePassPlan = () => (state.billing?.plans || []).find(p => p.id === "author_pass"); + state.profileAuthorGrant = () => (state.billing?.grants || []).find(g => ["author_monthly", "author_annual"].includes(g.planId) && ["active", "paid", "past_due"].includes(g.status) && new Date(g.until).getTime() > Date.now()); + state.profileGrantName = grant => ({ author_monthly: "Author monthly", author_annual: "Author annual", author_pass: "Repository pass", conference: "Conference hosting" }[grant.planId] || grant.planId); + + setupBilling(state, http, () => quotaService.load().then(quota => { state.quota = quota; }, console.error)); state.terms = ""; state.options = { expirationMode: "remove", @@ -212,12 +247,7 @@ export const profileController = function (state, http, translate, timeout, quot }; state.deleteAccount = () => { - if ( - !confirm( - "Delete your account? All your anonymized repositories, gists, and pull requests will be removed, and your personal data will be erased. This cannot be undone." - ) - ) - return; + if (state.deletingAccount || !state.confirmDeleteAccount || state.deleteUsername !== state.user?.username) return; state.deletingAccount = true; http.delete("/api/user").then( () => { @@ -999,6 +1029,7 @@ export const prDashboardController = function (state, location) { export const statusController = function (state, http, params) { const timers = createTimers(); state.repoId = params.repoId; + state.reviewUrl = window.location.origin + "/r/" + encodeURIComponent(params.repoId) + "/"; state.repo = null; state.progress = 0; state.rateLimitResetAt = 0; @@ -1127,6 +1158,72 @@ export const anonymizeController = function (state, http, html, params, location ? "gist:" + parsed.gistId.toLowerCase() : (parsed.owner + "/" + parsed.repo).toLowerCase() + (parsed.pullRequestId ? "/pull/" + parsed.pullRequestId : ""); const draft = formDraft(state, ["sourceUrl", "terms", "repoId", "pullRequestId", "gistId", "source", "options", "conference", "githubConnection"], "anonymize:" + (location.path?.() || "")); + let checkoutDraftId = null; + let checkoutDraftSnapshot = null; + state.hostingReview = false; + state.previewExpanded = false; + state.taskValidationError = ""; + state.editRepository = () => { + state.mobilePane = "settings"; + state.previewExpanded = false; + nextTick(() => document.querySelector(".anonymize-fields .is-invalid")?.focus()); + }; + state.submitRepository = (event) => { + state.taskValidationError = ""; + if (state.sourceLoading || state.billingBusy || state.hostingSaving || state.billingPending) return; + if (expirationDateInvalid() || state.anonymize?.invalid || state.sourceUrlError) { + state.taskValidationError = "Check the highlighted fields before continuing."; + state.editRepository(); + return; + } + if (state.hostingNeedsPayment()) return state.checkoutRepository(); + return state.anonymizeRepo(event); + }; + state.hostingPayment = false; + state.hostingAlternatives = false; + state.hostingPrice = plan => { + if (plan.amount == null) return "Price shown at checkout"; + const amount = new Intl.NumberFormat(undefined, { style: "currency", currency: plan.currency, minimumFractionDigits: 0, maximumFractionDigits: 2 }).format(plan.amount / 100); + return amount + (plan.interval === "year" ? " billed annually" : " billed monthly"); + }; + state.hostingPlan = "author_monthly"; + state.hostingSaving = false; + state.selectedHostingPlan = () => state.authorPlans().find(p => p.id === state.hostingPlan) || state.authorPlans()[0]; + const loadHostingQuota = () => http.get("/api/user/quota").then(res => { state.hostingQuota = res.data; }); + setupBilling(state, http, async () => { + await loadHostingQuota(); + state.hostingQuotaBlocked = false; + }, { confirmedMessage: "Hosting status refreshed. Your draft is ready to continue." }); + loadHostingQuota().catch(() => {}); + state.authorPlans = () => (state.billing?.plans || []).filter(p => ["author_monthly", "author_annual"].includes(p.id)); + state.hasAuthorHosting = () => ["author_monthly", "author_annual"].includes(state.billing?.allowance?.plan); + state.hostingNeedsPayment = () => { + if (!state.billing?.enabled || state.detectedType !== "repo" || state.hasAuthorHosting() || + (state.isUpdate && state.role !== "owner")) return false; + const needsLifetime = state.options?.expirationMode === "never" && !state._existingNever; + const quota = state.hostingQuota?.repository; + const full = !state.isUpdate && !state.conference && quota && quota.used >= quota.total; + return !!(needsLifetime || (!state.conference && (full || state.hostingQuotaBlocked))); + }; + state.checkoutRepository = async (pass = false) => { + if (state.hostingSaving || state.billingBusy || !state.billing?.csrf || state.sourceLoading) return; + state.hostingSaving = true; + state.billingError = ""; + try { + const values = draft.checkpoint(); + const serialized = JSON.stringify(values); + if (!checkoutDraftId || serialized !== checkoutDraftSnapshot) { + const saved = await http.post("/api/billing/draft", { path: location.path(), values }, { headers: { "x-csrf-token": state.billing.csrf } }); + checkoutDraftId = saved.data.id; + checkoutDraftSnapshot = serialized; + } + const plan = state.authorPlans().find(p => p.id === state.hostingPlan) || state.authorPlans()[0]; + if (!pass && !plan) throw new Error("No author plan available"); + await state.checkout(pass ? "author_pass" : plan.id, pass ? state.repoId : "", { draftId: checkoutDraftId }); + } catch { state.billingError = "Your draft could not be saved for checkout. Your form is unchanged. Please try again."; } + finally { state.hostingSaving = false; } + }; + state.useDatedHosting = () => { state.options.expirationMode = "remove"; }; state.discardDraft = async () => { draft.discard(); state.workspaceOpen = !!state.sourceUrl; @@ -1292,6 +1389,26 @@ export const anonymizeController = function (state, http, html, params, location } async function restoreGitHubDraft() { + const billingDraft = new URLSearchParams(window.location.search).get("billingDraft"); + if (billingDraft) { + draft.restore(); + try { + const saved = (await http.get("/api/billing/draft/" + encodeURIComponent(billingDraft))).data; + if (saved.path !== location.path()) throw new Error("Wrong task"); + for (const key of ["sourceUrl", "terms", "repoId", "source", "options", "conference", "githubConnection"]) { + if (Object.prototype.hasOwnProperty.call(saved.values, key)) state[key] = saved.values[key]; + } + if (state.options?.expirationDate) state.options.expirationDate = new Date(state.options.expirationDate); + checkoutDraftId = saved.id; + checkoutDraftSnapshot = JSON.stringify(draft.checkpoint()); + state.draftRestored = true; + state.hostingReview = true; + if (state.sourceUrl) await refreshGitHubAccess(); + // Consume the return token so revisiting the form cannot overwrite newer edits. + location.replace?.(location.path()); + return true; + } catch { state.billingError = "The checkout draft could not be restored. Retry by reloading this page; any local draft is still available."; } + } let saved; try { saved = JSON.parse(sessionStorage.getItem("github-access-draft") || "null"); } catch (_) { return false; } @@ -1325,6 +1442,7 @@ export const anonymizeController = function (state, http, html, params, location state.terms = res.data.options.terms.filter((f) => f).join("\n"); state.source = res.data.source; state.role = res.data.role || "owner"; + state._existingNever = res.data.options.expirationMode === "never"; state.coauthors = res.data.coauthors || []; // Remember the saved branch so the source.branch watcher knows // not to bump source.commit to GitHub HEAD on edit-page load @@ -1925,6 +2043,7 @@ export const anonymizeController = function (state, http, html, params, location // When the picked date fails min/max validation AngularJS sets the model // to undefined, so we check both the field validity and the model value. function expirationDateInvalid() { + if (state.detectedType === "repo" && state.options.expirationMode === "never") return false; const field = state.anonymize && state.anonymize.expirationDate; if (!state.options.expirationDate || (field && field.invalid)) { if (field && field.setDirty) field.setDirty(); @@ -2023,11 +2142,18 @@ export const anonymizeController = function (state, http, html, params, location state.anonymizeRepo = (event) => { if (state.sourceLoading) { state.error = "Wait for the source to finish loading before saving."; return; } if (state.reconnectingSource && !state.reconnectRepositoryId) return; - if (expirationDateInvalid()) return; + if (expirationDateInvalid()) { state.editRepository(); return; } if (state.anonymize?.invalid || state.sourceUrlError) { + state.editRepository(); state.error = "Please correct the highlighted fields before saving."; return; } + // Capacity is enforced on the server, which can release removed reservations. + if (state.hostingNeedsPayment() && state.options.expirationMode === "never") { + state.hostingReview = true; + nextTick(() => document.getElementById("repository-hosting")?.scrollIntoView({ block: "center" })); + return; + } const button = event.currentTarget || event.target.closest?.("button") || event.target; button.disabled = true; const o = parseGithubUrl(state.sourceUrl); @@ -2051,6 +2177,12 @@ export const anonymizeController = function (state, http, html, params, location if (error.data) { translate("ERRORS." + error.data.error).then((t) => { state.error = t; }, console.error); displayErrorMessage(error.data.error); + if (["quota_exceeded", "subscription_required_for_never_expiration"].includes(error.data.error)) { + if (error.data.error === "subscription_required_for_never_expiration") state._existingNever = false; + state.hostingQuotaBlocked = true; + state.hostingReview = true; + nextTick(() => document.getElementById("repository-hosting")?.scrollIntoView({ block: "center" })); + } } } ).finally(() => { button.disabled = false; }); @@ -3003,7 +3135,7 @@ export const newConferenceController = function (state, http, location, params) state.error = ""; function getConference() { - http + return http .get("/api/conferences/" + params.conferenceId) .then((res) => { state.options = { ...state.options, ...res.data, billing: res.data.billing || {} }; @@ -3030,7 +3162,7 @@ export const newConferenceController = function (state, http, location, params) start.setDate(1); start.setMonth(start.getMonth() + 1); const end = new Date(start); - end.setMonth(start.getMonth() + 7, 0); + end.setTime(start.getTime() + 179 * 86400000); state.options = { billing: {}, startDate: start, @@ -3142,6 +3274,7 @@ export const newConferenceController = function (state, http, location, params) }; export const conferenceController = function (state, http, location, params) { + setupBilling(state, http, () => getConference(), { confirmedMessage: "Payment status checked. Your conference is ready for submissions once payment is confirmed." }); state.watch("user.status", () => { if (state.user == null) { location.url("/"); diff --git a/public/script/billing.js b/public/script/billing.js new file mode 100644 index 0000000..856313c --- /dev/null +++ b/public/script/billing.js @@ -0,0 +1,83 @@ +// Share concurrent catalog reads between the app header and the current page. +const billingReads = new WeakMap(); +export function readBilling(http) { + if (!billingReads.has(http)) { + const request = http.get("/api/billing/").finally(() => billingReads.delete(http)); + billingReads.set(http, request); + } + return billingReads.get(http); +} +export function setupBilling(state, http, onRefresh = () => {}, context = {}) { + const outcome = new URLSearchParams(window.location.search).get("billing"); + state.billing = null; + state.billingLoading = true; + state.billingBusy = false; + state.billingError = ""; + state.billingNotice = ""; + state.billingPending = outcome === "success" || outcome === "portal"; + state.billingRepository = ""; + const messages = { + billing_invalid_draft: "This draft could not be saved. Your form is unchanged. Try again.", + billing_draft_not_found: "This checkout draft is unavailable or expired. Your local form is unchanged.", + billing_recovery_required: "Your earlier payment needs verification. Please contact support before paying again.", + billing_checkout_disabled: "New purchases are temporarily unavailable. You can still manage existing billing.", + billing_unavailable: "Payments are not available yet. Please try again later.", + billing_subscription_exists: "You already have a subscription. Use Manage billing to change or cancel it.", + billing_checkout_in_progress: "You have another checkout open. Complete it or wait for it to expire before choosing a different plan.", + billing_busy: "Another billing request is processing. Please try again shortly.", + billing_already_paid: "This repository or conference already has an active paid package.", + billing_invalid_review_window: "Conference packages cover up to 180 days. Check the review dates.", + billing_invalid_conference: "Only a conference owner can pay for a conference awaiting payment.", + repo_not_found: "Enter the ID of an existing repository that you own.", + }; + state.billingPrice = plan => { + if (plan.amount == null) return "Price shown at checkout"; + const amount = new Intl.NumberFormat(undefined, { style: "currency", currency: plan.currency }).format(plan.amount / 100); + return amount + (plan.interval ? ` / ${plan.intervalCount > 1 ? plan.intervalCount + " " : ""}${plan.interval}` : " once"); + }; + state.billingBytes = value => { + const bytes = Number(value) || 0; + if (bytes < 1024) return `${bytes} B`; + const exponent = Math.min(4, Math.floor(Math.log2(bytes) / 10)); + return `${new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(bytes / 1024 ** exponent)} ${["B", "KiB", "MiB", "GiB", "TiB"][exponent]}`; + }; + state.billingDate = value => value ? new Date(value).toLocaleDateString() : ""; + state.loadBilling = () => { state.billingError = ""; state.billingLoading = true; return readBilling(http).then(res => { state.billing = res.data; state.emit?.("billing:updated", res.data); }) + .catch(() => { state.billingError = "Billing could not be loaded. Try again."; }) + .finally(() => { state.billingLoading = false; }); }; + async function action(path, body, redirect = true) { + if (state.billingBusy || !state.billing?.csrf) return; + state.billingBusy = true; + state.billingError = ""; + try { + const response = await http.post(`/api/billing/${path}`, body, { headers: { "x-csrf-token": state.billing.csrf } }); + if (redirect) window.location.assign(response.data.url); + else { + await state.loadBilling(); + await onRefresh(); + state.billingPending = !!response.data.pending; + state.emit?.("billing:pending", state.billingPending); + state.billingNotice = response.data.pending ? "Your payment is still pending. Please do not pay again." : (context.confirmedMessage || "Billing status refreshed. Your confirmed access appears below."); + return response.data; + } + } catch (error) { state.billingError = messages[error.data?.error] || "The billing request failed. Please try again."; } + finally { state.billingBusy = false; } + } + state.checkout = (planId, target = "", extra = {}) => action("checkout", { planId, target, ...extra }); + state.billingPortal = () => action("portal", {}); + state.refreshBilling = () => action("refresh", {}, false); + async function confirmPayment() { + for (let attempt = 0; attempt < 5; attempt++) { + const result = await state.refreshBilling(); + if (!result || !result.pending) return; + await new Promise(resolve => window.setTimeout(resolve, 3000)); + } + state.billingNotice = "Confirmation is taking longer than usual. You can refresh payment status later. Please do not pay again."; + } + state.loadBilling().then(() => { + if (outcome === "success" || outcome === "portal") { + state.billingNotice = "Checking your payment. Paid access starts after confirmation."; + confirmPayment(); + } else if (outcome === "cancelled") state.billingNotice = "Checkout was closed. No new paid access has been activated."; + }); +} diff --git a/public/script/components.js b/public/script/components.js index 8defeb7..5bdeebb 100644 --- a/public/script/components.js +++ b/public/script/components.js @@ -8,7 +8,7 @@ const QuotaUsage = { props: ["quota", "fmt"], setup(props) { return { formatAmount: (value, kind) => kind === "bytes" - ? props.fmt.humanFileSize(value).replace(/([a-zA-Z]+)$/, " $1") : props.fmt.number(value) }; + ? props.fmt.humanFileSize(props.quota?.storage?.unit === "bytes" ? value * 8 : value).replace(/([a-zA-Z]+)$/, " $1") : props.fmt.number(value) }; }, render: quotaUsageTemplate, }; diff --git a/public/script/drafts.js b/public/script/drafts.js index 4aad020..462d541 100644 --- a/public/script/drafts.js +++ b/public/script/drafts.js @@ -49,7 +49,12 @@ export function formDraft(state, fields, key) { state.unsavedChanges = serialize() !== baseline; return !!restored; }, - checkpoint() { return JSON.parse(serialize()); }, + checkpoint() { + document.querySelectorAll("input, select, textarea").forEach(el => { + if (el._field?.binding.state === state && el._field.timer) el._field.commit(); + }); + return JSON.parse(serialize()); + }, accept(saved) { baseline = JSON.stringify(saved); state.draftRestored = false; diff --git a/public/script/forms.js b/public/script/forms.js index 7276d8a..be7b525 100644 --- a/public/script/forms.js +++ b/public/script/forms.js @@ -92,7 +92,7 @@ export function submitForm(event, callback) { if (el._field) validate(el); }); if (form && !form.checkValidity()) { - const invalid = form.querySelector(":invalid"); + const invalid = form.querySelector("input:invalid, select:invalid, textarea:invalid"); invalid?.scrollIntoView?.({ block: "center" }); invalid?.focus(); form.reportValidity(); diff --git a/public/script/main.js b/public/script/main.js index f963f28..faff1f6 100644 --- a/public/script/main.js +++ b/public/script/main.js @@ -44,6 +44,7 @@ export function mountApplication(target = "#app", options = {}) { const timers = createTimers(); const location = { url(value) { if (value === undefined) return router.currentRoute.value.fullPath; router.push(value); return location; }, + replace(value) { return router.replace(value); }, path() { return router.currentRoute.value.path; }, search() { return router.currentRoute.value.query; }, }; diff --git a/public/script/vendor.min.js b/public/script/vendor.min.js index f3882a7..44b5db1 100644 --- a/public/script/vendor.min.js +++ b/public/script/vendor.min.js @@ -1,30 +1,30 @@ -"use strict";(()=>{var nd=Object.defineProperty;var rd=(e,t)=>{for(var n in t)nd(e,n,{get:t[n],enumerable:!0})};var he=["abap","abc","actionscript","ada","alda","apache_conf","apex","applescript","aql","asciidoc","asl","assembly_x86","autohotkey","batchfile","c9search","c_cpp","cirru","clojure","cobol","coffee","coldfusion","crystal","csharp","csound_document","csound_orchestra","csound_score","csp","css","curly","d","dart","diff","django","dockerfile","dot","drools","edifact","eiffel","ejs","elixir","elm","erlang","forth","fortran","fsharp","fsl","ftl","gcode","gherkin","gitignore","glsl","gobstones","golang","graphqlschema","groovy","haml","handlebars","haskell","haskell_cabal","haxe","hjson","html","html_elixir","html_ruby","ini","io","jack","jade","java","javascript","json","json5","jsoniq","jsp","jssm","jsx","julia","kotlin","latex","less","liquid","lisp","livescript","logiql","logtalk","lsl","lua","luapage","lucene","makefile","markdown","mask","matlab","maze","mediawiki","mel","mixal","mushcode","mysql","nginx","nim","nix","nsis","nunjucks","objectivec","ocaml","pascal","perl","perl6","pgsql","php","php_laravel_blade","pig","plain_text","powershell","praat","prisma","prolog","properties","protobuf","puppet","python","qml","r","razor","rdoc","red","redshift","rhtml","rst","ruby","rust","sass","scad","scala","scheme","scss","sh","sjs","slim","smarty","snippets","soy_template","space","sparql","sql","sqlserver","stylus","svg","swift","tcl","terraform","tex","text","textile","toml","tsx","turtle","twig","typescript","vala","vbscript","velocity","verilog","vhdl","visualforce","wollok","xml","xquery","yaml","zeek"];var ve={notebook:"/script/notebook.c3144c18ae.min.js",org:"/script/org.f61f262915.min.js",markdown:"/script/markdown.44f2e93820.min.js",pdf:"/script/pdf.4d9cc6ff49.min.js",editor:"/script/editor.4f142d3adc.min.js"};var cs=new Map,ld=ve;function xt(e){if(!cs.has(e)){let t=document.createElement("script");t.src=ld[e];let n=new Promise((r,s)=>{t.onload=r,t.onerror=()=>{cs.delete(e),t.remove(),s(new Error(`Unable to load ${e}. Please retry.`))}});cs.set(e,n),document.head.appendChild(t)}return cs.get(e)}async function ur(){await xt("editor"),ace.config.set("basePath","/script/external/ace/")}function ho(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return n=>n in t}var Ve={},Xt=[],at=()=>{},rn=()=>!1,vo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),go=e=>e.startsWith("onUpdate:"),Ge=Object.assign,Po=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},dd=Object.prototype.hasOwnProperty,De=(e,t)=>dd.call(e,t),ye=Array.isArray,Ut=e=>Vo(e)==="[object Map]",Ft=e=>Vo(e)==="[object Set]",cr=e=>Vo(e)==="[object Date]";var we=e=>typeof e=="function",ze=e=>typeof e=="string",mt=e=>typeof e=="symbol",Te=e=>e!==null&&typeof e=="object",an=e=>(Te(e)||we(e))&&we(e.then)&&we(e.catch),hr=Object.prototype.toString,Vo=e=>hr.call(e),ln=e=>Vo(e).slice(8,-1),ps=e=>Vo(e)==="[object Object]",fs=e=>ze(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yo=ho(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted");var ms=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ud=/-\w/g,Je=ms(e=>e.replace(ud,t=>t.slice(1).toUpperCase())),cd=/\B([A-Z])/g,St=ms(e=>e.replace(cd,"-$1").toLowerCase()),eo=ms(e=>e.charAt(0).toUpperCase()+e.slice(1)),qo=ms(e=>e?`on${eo(e)}`:""),yt=(e,t)=>!Object.is(e,t),bo=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},wo=e=>{let t=parseFloat(e);return isNaN(t)?e:t};var pr,Mo=()=>pr||(pr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Me(e){if(ye(e)){let t={};for(let n=0;nn.startsWith("/*")?"":n).split(pd).forEach(n=>{if(n){let r=n.split(fd);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function T(e){let t="";if(ze(e))t=e;else if(ye(e))for(let n=0;nNt(n,t))}var br=e=>!!(e&&e.__v_isRef===!0),c=e=>ze(e)?e:e==null?"":ye(e)||Te(e)&&(e.toString===hr||!we(e.toString))?br(e)?c(e.value):JSON.stringify(e,wr,2):String(e),wr=(e,t)=>br(t)?wr(e,t.value):Ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[nn(r,i)+" =>"]=s,n),{})}:Ft(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>nn(n))}:mt(t)?nn(t):Te(t)&&!ye(t)&&!ps(t)?String(t):t,nn=(e,t="")=>{var n;return mt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};function bd(e,...t){console.warn(`[Vue warn] ${e}`,...t)}var Qe,Fo=class{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Qe&&(Qe.active?(this.parent=Qe,this.index=(Qe.scopes||(Qe.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){let r=this.scopes.slice();for(t=0,n=r.length;t0&&--this._on===0){if(Qe===this)Qe=this.prevScope;else{let t=Qe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(Uo){let t=Uo;for(Uo=void 0;t;){let n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;$o;){let t=$o;for($o=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Nr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Dr(e){let t,n=e.depsTail,r=n;for(;r;){let s=r.prevDep;r.version===-1?(r===n&&(n=s),En(r),wd(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function pn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Rr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Rr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===zo)||(e.globalVersion=zo,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!pn(e))))return;e.flags|=2;let t=e.dep,n=Fe,r=Ct;Fe=e,Ct=!0;try{Nr(e);let s=e.fn(e._value);(t.version===0||yt(s,e._value))&&(e.flags|=128,e._value=s,t.version++)}catch(s){throw t.version++,s}finally{Fe=n,Ct=r,Dr(e),e.flags&=-3}}function En(e,t=!1){let{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)En(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function wd(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var Ct=!0,Tr=[];function Ot(){Tr.push(Ct),Ct=!1}function It(){let e=Tr.pop();Ct=e===void 0?!0:e}function kr(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let n=Fe;Fe=void 0;try{t()}finally{Fe=n}}}var zo=0,fn=class{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},Ho=class{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Fe||!Ct||Fe===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Fe)n=this.activeLink=new fn(Fe,this),Fe.deps?(n.prevDep=Fe.depsTail,Fe.depsTail.nextDep=n,Fe.depsTail=n):Fe.deps=Fe.depsTail=n,Ar(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){let r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Fe.depsTail,n.nextDep=void 0,Fe.depsTail.nextDep=n,Fe.depsTail=n,Fe.deps===n&&(Fe.deps=r)}return n}trigger(t){this.version++,zo++,this.notify(t)}notify(t){wn();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{kn()}}};function Ar(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Ar(r)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var mn=new WeakMap,oo=Symbol(""),hn=Symbol(""),Bo=Symbol("");function xe(e,t,n){if(Ct&&Fe){let r=mn.get(e);r||mn.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new Ho),s.map=r,s.key=n),s.track()}}function Rt(e,t,n,r,s,i){let a=mn.get(e);if(!a){zo++;return}let u=f=>{f&&f.trigger()};if(wn(),t==="clear")a.forEach(u);else{let f=ye(e),h=f&&fs(n);if(f&&n==="length"){let g=Number(r);a.forEach((k,m)=>{(m==="length"||m===Bo||!mt(m)&&m>=g)&&u(k)})}else switch((n!==void 0||a.has(void 0))&&u(a.get(n)),h&&u(a.get(Bo)),t){case"add":f?h&&u(a.get("length")):(u(a.get(oo)),Ut(e)&&u(a.get(hn)));break;case"delete":f||(u(a.get(oo)),Ut(e)&&u(a.get(hn)));break;case"set":Ut(e)&&u(a.get(oo));break}}kn()}function ko(e){let t=Re(e);return t===e||(xe(t,"iterate",Bo),lt(e))?t:bt(e)?At(e)?t.map(n=>Ht(ht(n))):t.map(Ht):t.map(ht)}function Go(e){return xe(e=Re(e),"iterate",Bo),e}function Dt(e,t){return bt(e)?Ht(At(e)?ht(t):t):ht(t)}var kd={__proto__:null,[Symbol.iterator](){return un(this,Symbol.iterator,e=>Dt(this,e))},concat(...e){return ko(this).concat(...e.map(t=>ye(t)?ko(t):t))},entries(){return un(this,"entries",e=>(e[1]=Dt(this,e[1]),e))},every(e,t){return zt(this,"every",e,t,void 0,arguments)},filter(e,t){return zt(this,"filter",e,t,n=>n.map(r=>Dt(this,r)),arguments)},find(e,t){return zt(this,"find",e,t,n=>Dt(this,n),arguments)},findIndex(e,t){return zt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return zt(this,"findLast",e,t,n=>Dt(this,n),arguments)},findLastIndex(e,t){return zt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return zt(this,"forEach",e,t,void 0,arguments)},includes(...e){return cn(this,"includes",e)},indexOf(...e){return cn(this,"indexOf",e)},join(e){return ko(this).join(e)},lastIndexOf(...e){return cn(this,"lastIndexOf",e)},map(e,t){return zt(this,"map",e,t,void 0,arguments)},pop(){return Lo(this,"pop")},push(...e){return Lo(this,"push",e)},reduce(e,...t){return Er(this,"reduce",e,t)},reduceRight(e,...t){return Er(this,"reduceRight",e,t)},shift(){return Lo(this,"shift")},some(e,t){return zt(this,"some",e,t,void 0,arguments)},splice(...e){return Lo(this,"splice",e)},toReversed(){return ko(this).toReversed()},toSorted(e){return ko(this).toSorted(e)},toSpliced(...e){return ko(this).toSpliced(...e)},unshift(...e){return Lo(this,"unshift",e)},values(){return un(this,"values",e=>Dt(this,e))}};function un(e,t,n){let r=Go(e),s=r[t]();return r!==e&&!lt(e)&&(s._next=s.next,s.next=()=>{let i=s._next();return i.done||(i.value=n(i.value)),i}),s}var Ed=Array.prototype;function zt(e,t,n,r,s,i){let a=Go(e),u=a!==e&&!lt(e),f=a[t];if(f!==Ed[t]){let k=f.apply(e,i);return u?ht(k):k}let h=n;a!==e&&(u?h=function(k,m){return n.call(this,Dt(e,k),m,e)}:n.length>2&&(h=function(k,m){return n.call(this,k,m,e)}));let g=f.call(a,h,r);return u&&s?s(g):g}function Er(e,t,n,r){let s=Go(e),i=s!==e&&!lt(e),a=n,u=!1;s!==e&&(i?(u=r.length===0,a=function(h,g,k){return u&&(u=!1,h=Dt(e,h)),n.call(this,h,Dt(e,g),k,e)}):n.length>3&&(a=function(h,g,k){return n.call(this,h,g,k,e)}));let f=s[t](a,...r);return u?Dt(e,f):f}function cn(e,t,n){let r=Re(e);xe(r,"iterate",Bo);let s=r[t](...n);return(s===-1||s===!1)&&Ko(n[0])?(n[0]=Re(n[0]),r[t](...n)):s}function Lo(e,t,n=[]){Ot(),wn();let r=Re(e)[t].apply(e,n);return kn(),It(),r}var Cd=ho("__proto__,__v_isRef,__isVue"),Or=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(mt));function _d(e){mt(e)||(e=String(e));let t=Re(this);return xe(t,"has",e),t.hasOwnProperty(e)}var ws=class{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;let s=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(s?i?Pd:Vr:i?Pr:Ir).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;let a=ye(t);if(!s){let f;if(a&&(f=kd[n]))return f;if(n==="hasOwnProperty")return _d}let u=Reflect.get(t,n,Ze(t)?t:r);if((mt(n)?Or.has(n):Cd(n))||(s||xe(t,"get",n),i))return u;if(Ze(u)){let f=a&&fs(n)?u:u.value;return s&&Te(f)?Es(f):f}return Te(u)?s?Es(u):He(u):u}},ks=class extends ws{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n],a=ye(t)&&fs(n);if(!this._isShallow){let h=bt(i);if(!lt(r)&&!bt(r)&&(i=Re(i),r=Re(r)),!a&&Ze(i)&&!Ze(r))return h||(i.value=r),!0}let u=a?Number(n)e,gs=e=>Reflect.getPrototypeOf(e);function Rd(e,t,n){return function(...r){let s=this.__v_raw,i=Re(s),a=Ut(i),u=e==="entries"||e===Symbol.iterator&&a,f=e==="keys"&&a,h=s[e](...r),g=n?gn:t?Ht:ht;return!t&&xe(i,"iterate",f?hn:oo),Ge(Object.create(h),{next(){let{value:k,done:m}=h.next();return m?{value:k,done:m}:{value:u?[g(k[0]),g(k[1])]:g(k),done:m}}})}}function ys(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Td(e,t){let n={get(s){let i=this.__v_raw,a=Re(i),u=Re(s);e||(yt(s,u)&&xe(a,"get",s),xe(a,"get",u));let{has:f}=gs(a),h=t?gn:e?Ht:ht;if(f.call(a,s))return h(i.get(s));if(f.call(a,u))return h(i.get(u));i!==a&&i.get(s)},get size(){let s=this.__v_raw;return!e&&xe(Re(s),"iterate",oo),s.size},has(s){let i=this.__v_raw,a=Re(i),u=Re(s);return e||(yt(s,u)&&xe(a,"has",s),xe(a,"has",u)),s===u?i.has(s):i.has(s)||i.has(u)},forEach(s,i){let a=this,u=a.__v_raw,f=Re(u),h=t?gn:e?Ht:ht;return!e&&xe(f,"iterate",oo),u.forEach((g,k)=>s.call(i,h(g),h(k),a))}};return Ge(n,e?{add:ys("add"),set:ys("set"),delete:ys("delete"),clear:ys("clear")}:{add(s){let i=Re(this),a=gs(i),u=Re(s),f=!t&&!lt(s)&&!bt(s)?u:s;return a.has.call(i,f)||yt(s,f)&&a.has.call(i,s)||yt(u,f)&&a.has.call(i,u)||(i.add(f),Rt(i,"add",f,f)),this},set(s,i){!t&&!lt(i)&&!bt(i)&&(i=Re(i));let a=Re(this),{has:u,get:f}=gs(a),h=u.call(a,s);h||(s=Re(s),h=u.call(a,s));let g=f.call(a,s);return a.set(s,i),h?yt(i,g)&&Rt(a,"set",s,i,g):Rt(a,"add",s,i),this},delete(s){let i=Re(this),{has:a,get:u}=gs(i),f=a.call(i,s);f||(s=Re(s),f=a.call(i,s));let h=u?u.call(i,s):void 0,g=i.delete(s);return f&&Rt(i,"delete",s,void 0,h),g},clear(){let s=Re(this),i=s.size!==0,a=void 0,u=s.clear();return i&&Rt(s,"clear",void 0,void 0,a),u}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=Rd(s,e,t)}),n}function Cn(e,t){let n=Td(e,t);return(r,s,i)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(De(n,s)&&s in r?n:r,s,i)}var Ad={get:Cn(!1,!1)},Od={get:Cn(!1,!0)},Id={get:Cn(!0,!1)};var Ir=new WeakMap,Pr=new WeakMap,Vr=new WeakMap,Pd=new WeakMap;function Vd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function He(e){return bt(e)?e:_n(e,!1,Sd,Ad,Ir)}function Wo(e){return _n(e,!1,Dd,Od,Pr)}function Es(e){return _n(e,!0,Nd,Id,Vr)}function _n(e,t,n,r,s){if(!Te(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let i=s.get(e);if(i)return i;let a=Vd(ln(e));if(a===0)return e;let u=new Proxy(e,a===2?r:n);return s.set(e,u),u}function At(e){return bt(e)?At(e.__v_raw):!!(e&&e.__v_isReactive)}function bt(e){return!!(e&&e.__v_isReadonly)}function lt(e){return!!(e&&e.__v_isShallow)}function Ko(e){return e?!!e.__v_raw:!1}function Re(e){let t=e&&e.__v_raw;return t?Re(t):e}function Sn(e){return!De(e,"__v_skip")&&Object.isExtensible(e)&&hs(e,"__v_skip",!0),e}var ht=e=>Te(e)?He(e):e,Ht=e=>Te(e)?Es(e):e;function Ze(e){return e?e.__v_isRef===!0:!1}function et(e){return qr(e,!1)}function _s(e){return qr(e,!0)}function qr(e,t){return Ze(e)?e:new yn(e,t)}var yn=class{constructor(t,n){this.dep=new Ho,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Re(t),this._value=n?t:ht(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){let n=this._rawValue,r=this.__v_isShallow||lt(t)||bt(t);t=r?t:Re(t),yt(t,n)&&(this._rawValue=t,this._value=r?t:ht(t),this.dep.trigger())}};function Bt(e){return Ze(e)?e.value:e}var qd={get:(e,t,n)=>t==="__v_raw"?e:Bt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let s=e[t];return Ze(s)&&!Ze(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Ss(e){return At(e)?e:new Proxy(e,qd)}var bn=class{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ho(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=zo-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&Fe!==this)return Sr(this,!0),!0}get value(){let t=this.dep.track();return Rr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}};function Mr(e,t,n=!1){let r,s;return we(e)?r=e:(r=e.get,s=e.set),new bn(r,s,n)}var bs={},Cs=new WeakMap,to;function Lr(e,t=!1,n=to){if(n){let r=Cs.get(n);r||Cs.set(n,r=[]),r.push(e)}}function $r(e,t,n=Ve){let{immediate:r,deep:s,once:i,scheduler:a,augmentJob:u,call:f}=n,h=q=>{(n.onWarn||bd)("Invalid watch source: ",q,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},g=q=>s?q:lt(q)||s===!1||s===0?Tt(q,1):Tt(q),k,m,y,E,w=!1,R=!1;if(Ze(e)?(m=()=>e.value,w=lt(e)):At(e)?(m=()=>g(e),w=!0):ye(e)?(R=!0,w=e.some(q=>At(q)||lt(q)),m=()=>e.map(q=>{if(Ze(q))return q.value;if(At(q))return g(q);if(we(q))return f?f(q,2):q()})):we(e)?t?m=f?()=>f(e,2):e:m=()=>{if(y){Ot();try{y()}finally{It()}}let q=to;to=k;try{return f?f(e,3,[E]):e(E)}finally{to=q}}:m=at,t&&s){let q=m,U=s===!0?1/0:s;m=()=>Tt(q(),U)}let D=Cr(),A=()=>{k.stop(),D&&D.active&&Po(D.effects,k)};if(i&&t){let q=t;t=(...U)=>{let ae=q(...U);return A(),ae}}let V=R?new Array(e.length).fill(bs):bs,H=q=>{if(!(!(k.flags&1)||!k.dirty&&!q))if(t){let U=k.run();if(q||s||w||(R?U.some((ae,ie)=>yt(ae,V[ie])):yt(U,V))){y&&y();let ae=to;to=k;try{let ie=[U,V===bs?void 0:R&&V[0]===bs?[]:V,E];V=U,f?f(t,3,ie):t(...ie)}finally{to=ae}}}else k.run()};return u&&u(H),k=new Eo(m),k.scheduler=a?()=>a(H,!1):H,E=q=>Lr(q,!1,k),y=k.onStop=()=>{let q=Cs.get(k);if(q){if(f)f(q,4);else for(let U of q)U();Cs.delete(k)}},t?r?H(!0):V=k.run():a?a(H.bind(null,!0),!0):k.run(),A.pause=k.pause.bind(k),A.resume=k.resume.bind(k),A.stop=A,A}function Tt(e,t=1/0,n){if(t<=0||!Te(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Ze(e))Tt(e.value,t,n);else if(ye(e))for(let r=0;r{Tt(r,t,n)});else if(ps(e)){for(let r in e)Tt(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Tt(e[r],t,n)}return e}function ss(e,t,n,r){try{return r?e(...r):e()}catch(s){ns(s,t,n)}}function wt(e,t,n,r){if(we(e)){let s=ss(e,t,n,r);return s&&an(s)&&s.catch(i=>{ns(i,t,n)}),s}if(ye(e)){let s=[];for(let i=0;i>>1,s=rt[r],i=es(s);i=es(n)?rt.push(e):rt.splice(Fd(t),0,e),e.flags|=1,oi()}}function oi(){Rs||(Rs=ti.then(ri))}function si(e){if(!ye(e))Zt&&e.id===-1?Zt.splice(Co+1,0,e):e.flags&1||(_o.push(e),e.flags|=1);else for(let t=0;tes(n)-es(r));if(_o.length=0,Zt){for(let n=0;ne.id==null?e.flags&2?-1:1/0:e.id;function ri(e){let t=at;try{for(Vt=0;Vt{r._d&&Is(-1);let i=Ts(t),a=ro.length,u;try{u=e(...s)}finally{for(let f=ro.length;f>a;f--)qi();Ts(i),r._d&&Is(1)}return u};return r._n=!0,r._c=!0,r._d=!0,r}function N(e,t){if(vt===null)return e;let n=Hs(vt),r=e.dirs||(e.dirs=[]);for(let s=0;s1)return n&&we(t)?t.call(r&&r.proxy):t}}var Hd=Symbol.for("v-scx"),Bd=()=>{{let e=ut(Hd);return e}};function Be(e,t,n){return ai(e,t,n)}function ai(e,t,n=Ve){let{immediate:r,deep:s,flush:i,once:a}=n,u=Ge({},n),f=t&&r||!t&&i!=="post",h;if(Do){if(i==="sync"){let y=Bd();h=y.__watcherHandles||(y.__watcherHandles=[])}else if(!f){let y=()=>{};return y.stop=at,y.resume=at,y.pause=at,y}}let g=tt;u.call=(y,E,w)=>wt(y,g,E,w);let k=!1;i==="post"?u.scheduler=y=>{dt(y,g&&g.suspense)}:i!=="sync"&&(k=!0,u.scheduler=(y,E)=>{E?y():Vn(y)}),u.augmentJob=y=>{t&&(y.flags|=4),k&&(y.flags|=2,g&&(y.id=g.uid,y.i=g))};let m=$r(e,t,u);return Do&&(h?h.push(m):f&&m()),m}function jd(e,t,n){let r=this.proxy,s=ze(e)?e.includes(".")?li(r,e):()=>r[e]:e.bind(r,r),i;we(t)?i=t:(i=t.handler,n=t);let a=as(this),u=ai(s,i.bind(r),n);return a(),u}function li(e,t){let n=t.split(".");return()=>{let r=e;for(let s=0;se.__isTeleport;var Nn=Symbol("_leaveCb");function Wd(e){let t=e[0];if(e.length>1){let n=!1;for(let r of e)if(r.type!==Gt){t=r,n=!0;break}}return t}function di(e){if(!$s(e))return Ms(e.type)&&e.children?Wd(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&we(n.default))return n.default()}}function Ls(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;Ls(Ms(n.type)&&di(n)||n,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function rs(e,t){return we(e)?Ge({name:e.name},t,{setup:e}):e}function qn(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Fr(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}var As=new WeakMap;function Qo(e,t,n,r,s=!1){if(ye(e)){e.forEach((w,R)=>Qo(w,t&&(ye(t)?t[R]:t),n,r,s));return}if(Xo(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Qo(e,t,n,r.component.subTree);return}let i=r.shapeFlag&4?Hs(r.component):r.el,a=s?null:i,{i:u,r:f}=e,h=t&&t.r,g=u.refs===Ve?u.refs={}:u.refs,k=u.setupState,m=Re(k),y=k===Ve?rn:w=>Fr(g,w)?!1:De(m,w),E=(w,R)=>!(R&&Fr(g,R));if(h!=null&&h!==f){if(zr(t),ze(h))g[h]=null,y(h)&&(k[h]=null);else if(Ze(h)){let w=t;E(h,w.k)&&(h.value=null),w.k&&(g[w.k]=null)}}if(we(f))ss(f,u,12,[a,g]);else{let w=ze(f),R=Ze(f);if(w||R){let D=()=>{if(e.f){let A=w?y(f)?k[f]:g[f]:E(f)||!e.k?f.value:g[e.k];if(s)ye(A)&&Po(A,i);else if(ye(A))A.includes(i)||A.push(i);else if(w)g[f]=[i],y(f)&&(k[f]=g[f]);else{let V=[i];E(f,e.k)&&(f.value=V),e.k&&(g[e.k]=V)}}else w?(g[f]=a,y(f)&&(k[f]=a)):R&&(E(f,e.k)&&(f.value=a),e.k&&(g[e.k]=a))};if(a){let A=()=>{D(),As.delete(e)};A.id=-1,As.set(e,A),dt(A,n)}else zr(e),D()}}}function zr(e){let t=As.get(e);t&&(t.flags|=8,As.delete(e))}var Hr=e=>e.nodeType===8;var j8=Mo().requestIdleCallback||(e=>setTimeout(e,1)),G8=Mo().cancelIdleCallback||(e=>clearTimeout(e));function Kd(e,t){if(Hr(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(Hr(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}var Xo=e=>!!e.type.__asyncLoader;function ui(e){we(e)&&(e={loader:e});let{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:i,timeout:a,suspensible:u=!0,onError:f}=e,h=null,g,k=0,m=()=>(k++,h=null,y()),y=()=>{let E;return h||(E=h=t().catch(w=>{if(w=w instanceof Error?w:new Error(String(w)),f)return new Promise((R,D)=>{f(w,()=>R(m()),()=>D(w),k+1)});throw w}).then(w=>E!==h&&h?h:(w&&(w.__esModule||w[Symbol.toStringTag]==="Module")&&(w=w.default),g=w,w)))};return rs({name:"AsyncComponentWrapper",__asyncLoader:y,__asyncHydrate(E,w,R){let D=E.isConnected,A=!1;(w.bu||(w.bu=[])).push(()=>A=!0);let V=()=>{A||!E.parentNode||D&&!E.isConnected||R()},H=i?()=>{let q=i(V,U=>Kd(E,U));q&&(w.bum||(w.bum=[])).push(q)}:V;g?H():y().then(()=>!w.isUnmounted&&H())},get __asyncResolved(){return g},setup(){let E=tt;if(qn(E),g)return()=>Ns(g,E);let w=q=>{h=null,ns(q,E,13,!r)};if(u&&E.suspense||Do)return y().then(q=>()=>Ns(q,E)).catch(q=>(w(q),()=>r?Ce(r,{error:q}):null));let R=et(!1),D=et(),A=et(!!s),V,H;return is(()=>{V!=null&&clearTimeout(V),H!=null&&clearTimeout(H)}),s&&(H=setTimeout(()=>{E.isUnmounted||(A.value=!1)},s)),a!=null&&(V=setTimeout(()=>{if(!E.isUnmounted&&!R.value&&!D.value){let q=new Error(`Async component timed out after ${a}ms.`);w(q),D.value=q}},a)),y().then(()=>{E.isUnmounted||(R.value=!0,E.parent&&$s(E.parent.vnode)&&E.parent.update())}).catch(q=>{if(E.isUnmounted){h=null;return}w(q),D.value=q}),()=>{if(R.value&&g)return Ns(g,E);if(D.value&&r)return Ce(r,{error:D.value});if(n&&!A.value)return Ns(n,E)}}})}function Ns(e,t){let{ref:n,props:r,children:s,ce:i}=t.vnode,a=Ce(e,r,s);return a.ref=n,a.ce=i,delete t.vnode.ce,a}var $s=e=>e.type.__isKeepAlive;function ci(e,t){fi(e,"a",t)}function pi(e,t){fi(e,"da",t)}function fi(e,t,n=tt){let r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Us(t,r,n),n){let s=n.parent;for(;s&&s.parent;)$s(s.parent.vnode)&&Yd(r,t,n,s),s=s.parent}}function Yd(e,t,n,r){let s=Us(t,e,r,!0);is(()=>{Po(r[t],s)},n)}function Us(e,t,n=tt,r=!1){if(n){let s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...a)=>{Ot();let u=as(n),f=wt(t,n,e,a);return u(),It(),f});return r?s.unshift(i):s.push(i),i}}var Wt=e=>(t,n=tt)=>{(!Do||e==="sp")&&Us(e,(...r)=>t(...r),n)},Jd=Wt("bm"),Mt=Wt("m"),mi=Wt("bu"),hi=Wt("u"),ao=Wt("bum"),is=Wt("um"),Qd=Wt("sp"),Xd=Wt("rtg"),Zd=Wt("rtc");function xd(e,t=tt){Us("ec",e,t)}var vi="components",eu="directives";function We(e,t){return gi(vi,e,!0,t)||e}var tu=Symbol.for("v-ndc");function be(e){return gi(eu,e)}function gi(e,t,n=!0,r=!1){let s=vt||tt;if(s){let i=s.type;if(e===vi){let u=$u(i,!1);if(u&&(u===t||u===Je(t)||u===eo(Je(t))))return i}let a=Br(s[e]||i[e],t)||Br(s.appContext[e],t);return!a&&r?i:a}}function Br(e,t){return e&&(e[t]||e[Je(t)]||e[eo(Je(t))])}function re(e,t,n,r){let s,i=n&&n[r],a=ye(e);if(a||ze(e)){let u=a&&At(e),f=!1,h=!1;u&&(f=!lt(e),h=bt(e),e=Go(e)),s=new Array(e.length);for(let g=0,k=e.length;gt(u,f,void 0,i&&i[f]));else{let u=Object.keys(e);s=new Array(u.length);for(let f=0,h=u.length;fe?$i(e)?Hs(e):An(e.parent):null;var Zo=Ge(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>An(e.parent),$root:e=>An(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Mn(e),$forceUpdate:e=>e.f||(e.f=()=>{Vn(e.update)}),$nextTick:e=>e.n||(e.n=st.bind(e.proxy)),$watch:e=>jd.bind(e)});var Dn=(e,t)=>e!==Ve&&!e.__isScriptSetup&&De(e,t),ou={get({_:e},t){if(t==="__v_skip")return!0;let{ctx:n,setupState:r,data:s,props:i,accessCache:a,type:u,appContext:f}=e;if(t[0]!=="$"){let m=a[t];if(m!==void 0)switch(m){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(Dn(r,t))return a[t]=1,r[t];if(s!==Ve&&De(s,t))return a[t]=2,s[t];if(De(i,t))return a[t]=3,i[t];if(n!==Ve&&De(n,t))return a[t]=4,n[t];On&&(a[t]=0)}}let h=Zo[t],g,k;if(h)return t==="$attrs"&&xe(e.attrs,"get",""),h(e);if((g=u.__cssModules)&&(g=g[t]))return g;if(n!==Ve&&De(n,t))return a[t]=4,n[t];if(k=f.config.globalProperties,De(k,t))return k[t]},set({_:e},t,n){let{data:r,setupState:s,ctx:i}=e;return Dn(s,t)?(s[t]=n,!0):r!==Ve&&De(r,t)?(r[t]=n,!0):De(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,props:i,type:a}},u){let f;return!!(n[u]||e!==Ve&&u[0]!=="$"&&De(e,u)||Dn(t,u)||De(i,u)||De(r,u)||De(Zo,u)||De(s.config.globalProperties,u)||(f=a.__cssModules)&&f[u])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:De(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function jr(e){return ye(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}var On=!0;function su(e){let t=Mn(e),n=e.proxy,r=e.ctx;On=!1,t.beforeCreate&&Gr(t.beforeCreate,e,"bc");let{data:s,computed:i,methods:a,watch:u,provide:f,inject:h,created:g,beforeMount:k,mounted:m,beforeUpdate:y,updated:E,activated:w,deactivated:R,beforeDestroy:D,beforeUnmount:A,destroyed:V,unmounted:H,render:q,renderTracked:U,renderTriggered:ae,errorCaptured:ie,serverPrefetch:_,expose:O,inheritAttrs:G,components:J,directives:ee,filters:Q}=t;if(h&&nu(h,r,null),a)for(let pe in a){let le=a[pe];we(le)&&(r[pe]=le.bind(n))}if(s){let pe=s.call(n,n);Te(pe)&&(e.data=He(pe))}if(On=!0,i)for(let pe in i){let le=i[pe],Ie=we(le)?le.bind(n,n):we(le.get)?le.get.bind(n,n):at,_e=!we(le)&&we(le.set)?le.set.bind(n):at,Ae=ot({get:Ie,set:_e});Object.defineProperty(r,pe,{enumerable:!0,configurable:!0,get:()=>Ae.value,set:Ee=>Ae.value=Ee})}if(u)for(let pe in u)yi(u[pe],r,n,pe);if(f){let pe=we(f)?f.call(n):f;Reflect.ownKeys(pe).forEach(le=>{io(le,pe[le])})}g&&Gr(g,e,"c");function ue(pe,le){ye(le)?le.forEach(Ie=>pe(Ie.bind(n))):le&&pe(le.bind(n))}if(ue(Jd,k),ue(Mt,m),ue(mi,y),ue(hi,E),ue(ci,w),ue(pi,R),ue(xd,ie),ue(Zd,U),ue(Xd,ae),ue(ao,A),ue(is,H),ue(Qd,_),ye(O))if(O.length){let pe=e.exposed||(e.exposed={});O.forEach(le=>{Object.defineProperty(pe,le,{get:()=>n[le],set:Ie=>n[le]=Ie,enumerable:!0})})}else e.exposed||(e.exposed={});q&&e.render===at&&(e.render=q),G!=null&&(e.inheritAttrs=G),J&&(e.components=J),ee&&(e.directives=ee),_&&qn(e)}function nu(e,t,n=at){ye(e)&&(e=In(e));for(let r in e){let s=e[r],i;Te(s)?"default"in s?i=ut(s.from||r,s.default,!0):i=ut(s.from||r):i=ut(s),Ze(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[r]=i}}function Gr(e,t,n){wt(ye(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function yi(e,t,n,r){let s=r.includes(".")?li(n,r):()=>n[r];if(ze(e)){let i=t[e];we(i)&&Be(s,i)}else if(we(e))Be(s,e.bind(n));else if(Te(e))if(ye(e))e.forEach(i=>yi(i,t,n,r));else{let i=we(e.handler)?e.handler.bind(n):t[e.handler];we(i)&&Be(s,i,e)}}function Mn(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,u=i.get(t),f;return u?f=u:!s.length&&!n&&!r?f=t:(f={},s.length&&s.forEach(h=>Os(f,h,a,!0)),Os(f,t,a)),Te(t)&&i.set(t,f),f}function Os(e,t,n,r=!1){let{mixins:s,extends:i}=t;i&&Os(e,i,n,!0),s&&s.forEach(a=>Os(e,a,n,!0));for(let a in t)if(!(r&&a==="expose")){let u=ru[a]||n&&n[a];e[a]=u?u(e[a],t[a]):t[a]}return e}var ru={data:Wr,props:Kr,emits:Kr,methods:Jo,computed:Jo,beforeCreate:nt,created:nt,beforeMount:nt,mounted:nt,beforeUpdate:nt,updated:nt,beforeDestroy:nt,beforeUnmount:nt,destroyed:nt,unmounted:nt,activated:nt,deactivated:nt,errorCaptured:nt,serverPrefetch:nt,components:Jo,directives:Jo,watch:au,provide:Wr,inject:iu};function Wr(e,t){return t?e?function(){return Ge(we(e)?e.call(this,this):e,we(t)?t.call(this,this):t)}:t:e}function iu(e,t){return Jo(In(e),In(t))}function In(e){if(ye(e)){let t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Je(t)}Modifiers`]||e[`${St(t)}Modifiers`];function cu(e,t,...n){if(e.isUnmounted)return;let r=e.vnode.props||Ve,s=n,i=t.startsWith("update:"),a=i&&uu(r,t.slice(7));a&&(a.trim&&(s=n.map(g=>ze(g)?g.trim():g)),a.number&&(s=s.map(wo)));let u,f=r[u=qo(t)]||r[u=qo(Je(t))];!f&&i&&(f=r[u=qo(St(t))]),f&&wt(f,e,6,s);let h=r[u+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[u])return;e.emitted[u]=!0,wt(h,e,6,s)}}var pu=new WeakMap;function wi(e,t,n=!1){let r=n?pu:t.emitsCache,s=r.get(e);if(s!==void 0)return s;let i=e.emits,a={},u=!1;if(!we(e)){let f=h=>{let g=wi(h,t,!0);g&&(u=!0,Ge(a,g))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!i&&!u?(Te(e)&&r.set(e,null),null):(ye(i)?i.forEach(f=>a[f]=null):Ge(a,i),Te(e)&&r.set(e,a),a)}function Fs(e,t){return!e||!vo(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),De(e,t[0].toLowerCase()+t.slice(1))||De(e,St(t))||De(e,t))}function Rn(e){let{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[i],slots:a,attrs:u,emit:f,render:h,renderCache:g,props:k,data:m,setupState:y,ctx:E,inheritAttrs:w}=e,R=Ts(e),D,A;try{if(n.shapeFlag&4){let q=s||r,U=q;D=qt(h.call(U,q,g,k,y,m,E)),A=u}else{let q=t;D=qt(q.length>1?q(k,{attrs:u,slots:a,emit:f}):q(k,null)),A=t.props?u:fu(u)}}catch(q){ro.length=0,ns(q,e,1),D=Ce(Gt)}let V=D,H;if(A&&w!==!1){let q=Object.keys(A),{shapeFlag:U}=V;q.length&&U&7&&(i&&q.some(go)&&(A=mu(A,i)),V=No(V,A,!1,!0))}if(n.dirs&&(V=No(V,null,!1,!0),V.dirs=V.dirs?V.dirs.concat(n.dirs):n.dirs),n.transition){let q=Ms(V.type)&&di(V)||V;Ls(q,n.transition)}return D=V,Ts(R),D}var fu=e=>{let t;for(let n in e)(n==="class"||n==="style"||vo(n))&&((t||(t={}))[n]=e[n]);return t},mu=(e,t)=>{let n={};for(let r in e)(!go(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function hu(e,t,n){let{props:r,children:s,component:i}=e,{props:a,children:u,patchFlag:f}=t,h=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return r?Yr(r,a,h):!!a;if(f&8){let g=t.dynamicProps;for(let k=0;kObject.create(Ei),_i=e=>Object.getPrototypeOf(e)===Ei;function gu(e,t,n,r=!1){let s={},i=Ci();e.propsDefaults=Object.create(null),Si(e,t,s,i);for(let a in e.propsOptions[0])a in s||(s[a]=void 0);n?e.props=r?s:Wo(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function yu(e,t,n,r){let{props:s,attrs:i,vnode:{patchFlag:a}}=e,u=Re(s),[f]=e.propsOptions,h=!1;if((r||a>0)&&!(a&16)){if(a&8){let g=e.vnode.dynamicProps;for(let k=0;k{f=!0;let[m,y]=Ni(k,t,!0);Ge(a,m),y&&u.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(g),e.extends&&g(e.extends),e.mixins&&e.mixins.forEach(g)}if(!i&&!f)return Te(e)&&r.set(e,Xt),Xt;if(ye(i))for(let g=0;ge==="_"||e==="_ctx"||e==="$stable",$n=e=>ye(e)?e.map(qt):[qt(e)],wu=(e,t,n)=>{if(t._n)return t;let r=zd((...s)=>$n(t(...s)),n);return r._c=!1,r},Di=(e,t,n)=>{let r=e._ctx;for(let s in e){if(Ln(s))continue;let i=e[s];if(we(i))t[s]=wu(s,i,r);else if(i!=null){let a=$n(i);t[s]=()=>a}}},Ri=(e,t)=>{let n=$n(t);e.slots.default=()=>n},Ti=(e,t,n)=>{for(let r in t)(n||!Ln(r))&&(e[r]=t[r])},ku=(e,t,n)=>{let r=e.slots=Ci();if(e.vnode.shapeFlag&32){let s=t._;s?(Ti(r,t,n),n&&hs(r,"_",s,!0)):Di(t,r)}else t&&Ri(e,t)},Eu=(e,t,n)=>{let{vnode:r,slots:s}=e,i=!0,a=Ve;if(r.shapeFlag&32){let u=t._;u?n&&u===1?i=!1:Ti(s,t,n):(i=!t.$stable,Di(t,s)),a=t}else t&&(Ri(e,t),a={default:1});if(i)for(let u in s)!Ln(u)&&a[u]==null&&delete s[u]};function Cu(){let e=[]}var dt=Du;function Ai(e){return _u(e)}function _u(e,t){Cu();let n=Mo();n.__VUE__=!0;let{insert:r,remove:s,patchProp:i,createElement:a,createText:u,createComment:f,setText:h,setElementText:g,parentNode:k,nextSibling:m,setScopeId:y=at,insertStaticContent:E}=e,w=(v,C,P,F=null,B=null,L=null,W=void 0,x=null,Z=!!C.dynamicChildren)=>{if(v===C)return;v&&!Yo(v,C)&&(F=ne(v),Pe(v,B,L,!0),v=null),C.patchFlag===-2&&(Z=!1,C.dynamicChildren=null),C.dynamicChildren&&v&&v.dynamicChildren&&v.dynamicChildren.hasOnce&&(C.dynamicChildren===Xt&&(C.dynamicChildren=[]),C.dynamicChildren.hasOnce=!0);let{type:K,ref:fe,shapeFlag:se}=C;switch(K){case zs:R(v,C,P,F);break;case Gt:D(v,C,P,F);break;case xo:v==null&&A(C,P,F,W);break;case X:ee(v,C,P,F,B,L,W,x,Z);break;default:se&1?U(v,C,P,F,B,L,W,x,Z):se&6?Q(v,C,P,F,B,L,W,x,Z):(se&64||se&128)&&K.process(v,C,P,F,B,L,W,x,Z,I)}fe!=null&&B?Qo(fe,v&&v.ref,L,C||v,!C):fe==null&&v&&v.ref!=null&&Qo(v.ref,null,L,v,!0)},R=(v,C,P,F)=>{if(v==null)r(C.el=u(C.children),P,F);else{let B=C.el=v.el;C.children!==v.children&&h(B,C.children)}},D=(v,C,P,F)=>{v==null?r(C.el=f(C.children||""),P,F):C.el=v.el},A=(v,C,P,F)=>{[v.el,v.anchor]=E(v.children,C,P,F,v.el,v.anchor)},V=(v,C,P,F)=>{if(C.children!==v.children){let B=m(v.anchor);q(v),[C.el,C.anchor]=E(C.children,P,B,F)}else C.el=v.el,C.anchor=v.anchor},H=({el:v,anchor:C},P,F)=>{let B;for(;v&&v!==C;)B=m(v),r(v,P,F),v=B;r(C,P,F)},q=({el:v,anchor:C})=>{let P;for(;v&&v!==C;)P=m(v),s(v),v=P;s(C)},U=(v,C,P,F,B,L,W,x,Z)=>{if(C.type==="svg"?W="svg":C.type==="math"&&(W="mathml"),v==null)ae(C,P,F,B,L,W,x,Z);else{let K=v.el&&v.el._isVueCE?v.el:null;try{K&&K._beginPatch(),O(v,C,B,L,W,x,Z)}finally{K&&K._endPatch()}}},ae=(v,C,P,F,B,L,W,x)=>{let Z,K,{props:fe,shapeFlag:se,transition:de,dirs:ge}=v;if(Z=v.el=a(v.type,L,fe&&fe.is,fe),se&8?g(Z,v.children):se&16&&_(v.children,Z,null,F,B,Tn(v,L),W,x),ge&&so(v,null,F,"created"),ie(Z,v,v.scopeId,W,F),fe){for(let Le in fe)Le!=="value"&&!yo(Le)&&i(Z,Le,null,fe[Le],L,F);"value"in fe&&i(Z,"value",null,fe.value,L),(K=fe.onVnodeBeforeMount)&&Pt(K,F,v)}ge&&so(v,null,F,"beforeMount");let Ne=Su(B,de);Ne&&de.beforeEnter(Z),r(Z,C,P),((K=fe&&fe.onVnodeMounted)||Ne||ge)&&dt(()=>{let qe;K&&Pt(K,F,v),Ne&&de.enter(Z),ge&&so(v,null,F,"mounted")},B)},ie=(v,C,P,F,B)=>{if(P&&y(v,P),F)for(let L=0;L{for(let K=Z;K{let x=C.el=v.el,{patchFlag:Z,dynamicChildren:K,dirs:fe}=C;Z|=v.patchFlag&16;let se=v.props||Ve,de=C.props||Ve,ge;if(P&&no(P,!1),(ge=de.onVnodeBeforeUpdate)&&Pt(ge,P,C,v),fe&&so(C,v,P,"beforeUpdate"),P&&no(P,!0),K&&(!v.dynamicChildren||v.dynamicChildren.length!==K.length)&&(Z=0,W=!1,K=null),(se.innerHTML&&de.innerHTML==null||se.textContent&&de.textContent==null)&&g(x,""),K?G(v.dynamicChildren,K,x,P,F,Tn(C,B),L):W||Ie(v,C,x,null,P,F,Tn(C,B),L,!1),Z>0){if(Z&16)J(x,se,de,P,B);else if(Z&2&&se.class!==de.class&&i(x,"class",null,de.class,B),Z&4&&i(x,"style",se.style,de.style,B),Z&8){let Ne=C.dynamicProps;for(let Le=0;Le{ge&&Pt(ge,P,C,v),fe&&so(C,v,P,"updated")},F)},G=(v,C,P,F,B,L,W)=>{for(let x=0;x{if(C!==P){if(C!==Ve)for(let L in C)!yo(L)&&!(L in P)&&i(v,L,C[L],null,B,F);for(let L in P){if(yo(L))continue;let W=P[L],x=C[L];W!==x&&L!=="value"&&i(v,L,x,W,B,F)}"value"in P&&i(v,"value",C.value,P.value,B)}},ee=(v,C,P,F,B,L,W,x,Z)=>{let K=C.el=v?v.el:u(""),fe=C.anchor=v?v.anchor:u(""),{patchFlag:se,dynamicChildren:de,slotScopeIds:ge}=C;ge&&(x=x?x.concat(ge):ge),v==null?(r(K,P,F),r(fe,P,F),_(C.children||[],P,fe,B,L,W,x,Z)):se>0&&se&64&&de&&v.dynamicChildren&&v.dynamicChildren.length===de.length?(G(v.dynamicChildren,de,P,B,L,W,x),(C.key!=null||B&&C===B.subTree)&&Oi(v,C,!0)):Ie(v,C,P,fe,B,L,W,x,Z)},Q=(v,C,P,F,B,L,W,x,Z)=>{C.slotScopeIds=x,v==null?C.shapeFlag&512?B.ctx.activate(C,P,F,W,Z):oe(C,P,F,B,L,W,Z):ue(v,C,Z)},oe=(v,C,P,F,B,L,W)=>{let x=v.component=Pu(v,F,B);if($s(v)&&(x.ctx.renderer=I),Vu(x,!1,W),x.asyncDep){if(B&&B.registerDep(x,pe,W),!v.el){let Z=x.subTree=Ce(Gt);D(null,Z,C,P),v.placeholder=Z.el}}else pe(x,v,C,P,B,L,W)},ue=(v,C,P)=>{let F=C.component=v.component;if(hu(v,C,P))if(F.asyncDep&&!F.asyncResolved){C.el=v.el,le(F,C,P);return}else F.next=C,F.update();else C.el=v.el,F.vnode=C},pe=(v,C,P,F,B,L,W)=>{let x=()=>{if(v.isMounted){let{next:se,bu:de,u:ge,parent:Ne,vnode:Le}=v;{let pt=Ii(v);if(pt){se&&(se.el=Le.el,le(v,se,W)),pt.asyncDep.then(()=>{dt(()=>{v.isUnmounted||K()},B)});return}}let qe=se,Ke;no(v,!1),se?(se.el=Le.el,le(v,se,W)):se=Le,de&&bo(de),(Ke=se.props&&se.props.onVnodeBeforeUpdate)&&Pt(Ke,Ne,se,Le),no(v,!0);let Ye=Rn(v),Et=v.subTree;v.subTree=Ye,w(Et,Ye,k(Et.el),ne(Et),v,B,L),se.el=Ye.el,qe===null&&vu(v,Ye.el),ge&&dt(ge,B),(Ke=se.props&&se.props.onVnodeUpdated)&&dt(()=>Pt(Ke,Ne,se,Le),B)}else{let se,{el:de,props:ge}=C,{bm:Ne,m:Le,parent:qe,root:Ke,type:Ye}=v,Et=Xo(C);if(no(v,!1),Ne&&bo(Ne),!Et&&(se=ge&&ge.onVnodeBeforeMount)&&Pt(se,qe,C),no(v,!0),de&&M){let pt=()=>{v.subTree=Rn(v),M(de,v.subTree,v,B,null)};Et&&Ye.__asyncHydrate?Ye.__asyncHydrate(de,v,pt):pt()}else{Ke.ce&&Ke.ce._hasShadowRoot()&&Ke.ce._injectChildStyle(Ye,v.parent?v.parent.type:void 0);let pt=v.subTree=Rn(v);w(null,pt,P,F,v,B,L),C.el=pt.el}if(Le&&dt(Le,B),!Et&&(se=ge&&ge.onVnodeMounted)){let pt=C;dt(()=>Pt(se,qe,pt),B)}(C.shapeFlag&256||qe&&Xo(qe.vnode)&&qe.vnode.shapeFlag&256)&&v.a&&dt(v.a,B),v.isMounted=!0,C=P=F=null}};v.scope.on();let Z=v.effect=new Eo(x);v.scope.off();let K=v.update=Z.run.bind(Z),fe=v.job=Z.runIfDirty.bind(Z);fe.i=v,fe.id=v.uid,Z.scheduler=()=>Vn(fe),no(v,!0),K()},le=(v,C,P)=>{C.component=v;let F=v.vnode.props;v.vnode=C,v.next=null,yu(v,C.props,F,P),Eu(v,C.children,P),Ot(),Ur(v),It()},Ie=(v,C,P,F,B,L,W,x,Z=!1)=>{let K=v&&v.children,fe=v?v.shapeFlag:0,se=C.children,{patchFlag:de,shapeFlag:ge}=C;if(de>0){if(de&128){Ae(K,se,P,F,B,L,W,x,Z);return}else if(de&256){_e(K,se,P,F,B,L,W,x,Z);return}}ge&8?(fe&16&&z(K,B,L),se!==K&&g(P,se)):fe&16?ge&16?Ae(K,se,P,F,B,L,W,x,Z):z(K,B,L,!0):(fe&8&&g(P,""),ge&16&&_(se,P,F,B,L,W,x,Z))},_e=(v,C,P,F,B,L,W,x,Z)=>{v=v||Xt,C=C||Xt;let K=v.length,fe=C.length,se=Math.min(K,fe),de;for(de=0;defe?z(v,B,L,!0,!1,se):_(C,P,F,B,L,W,x,Z,se)},Ae=(v,C,P,F,B,L,W,x,Z)=>{let K=0,fe=C.length,se=v.length-1,de=fe-1;for(;K<=se&&K<=de;){let ge=v[K],Ne=C[K]=Z?jt(C[K]):qt(C[K]);if(Yo(ge,Ne))w(ge,Ne,P,null,B,L,W,x,Z);else break;K++}for(;K<=se&&K<=de;){let ge=v[se],Ne=C[de]=Z?jt(C[de]):qt(C[de]);if(Yo(ge,Ne))w(ge,Ne,P,null,B,L,W,x,Z);else break;se--,de--}if(K>se){if(K<=de){let ge=de+1,Ne=gede)for(;K<=se;)Pe(v[K],B,L,!0),K++;else{let ge=K,Ne=K,Le=new Map;for(K=Ne;K<=de;K++){let ft=C[K]=Z?jt(C[K]):qt(C[K]);ft.key!=null&&Le.set(ft.key,K)}let qe,Ke=0,Ye=de-Ne+1,Et=!1,pt=0,Io=new Array(Ye);for(K=0;K=Ye){Pe(ft,B,L,!0);continue}let _t;if(ft.key!=null)_t=Le.get(ft.key);else for(qe=Ne;qe<=de;qe++)if(Io[qe-Ne]===0&&Yo(ft,C[qe])){_t=qe;break}_t===void 0?Pe(ft,B,L,!0):(Io[_t-Ne]=K+1,_t>=pt?pt=_t:Et=!0,w(ft,C[_t],P,null,B,L,W,x,Z),Ke++)}let ar=Et?Nu(Io):Xt;for(qe=ar.length-1,K=Ye-1;K>=0;K--){let ft=Ne+K,_t=C[ft],lr=C[ft+1],dr=ft+1{let{el:L,type:W,transition:x,children:Z,shapeFlag:K}=v;if(K&6){Ee(v.component.subTree,C,P,F);return}if(K&128){v.suspense.move(C,P,F);return}if(K&64){W.move(v,C,P,I);return}if(W===X){r(L,C,P);for(let se=0;sex.enter(L),B));else{let{leave:se,delayLeave:de,afterLeave:ge}=x,Ne=()=>{v.ctx.isUnmounted?s(L):r(L,C,P)},Le=()=>{let qe=L._isLeaving||!!L[Nn];L._isLeaving&&L[Nn](!0),x.persisted&&!qe?Ne():se(L,()=>{Ne(),ge&&ge()})};de?de(L,Ne,Le):Le()}else r(L,C,P)},Pe=(v,C,P,F=!1,B=!1)=>{let{type:L,props:W,ref:x,children:Z,dynamicChildren:K,shapeFlag:fe,patchFlag:se,dirs:de,cacheIndex:ge,memo:Ne}=v;if((se===-2||K&&K.hasOnce)&&(B=!1),x!=null&&(Ot(),Qo(x,null,P,v,!0),It()),ge!=null&&(!v.ctx||v.ctx===C)&&(C.renderCache[ge]=void 0),fe&256){C.ctx.deactivate(v);return}let Le=fe&1&&de,qe=!Xo(v),Ke;if(qe&&(Ke=W&&W.onVnodeBeforeUnmount)&&Pt(Ke,C,v),fe&6)Ue(v.component,P,F);else{if(fe&128){v.suspense.unmount(P,F);return}Le&&so(v,null,C,"beforeUnmount"),fe&64?v.type.remove(v,C,P,I,F):K&&!K.hasOnce&&(L!==X||se>0&&se&64)?z(K,C,P,!1,!0):(L===X&&se&384||!B&&fe&16)&&z(Z,C,P),F&&Se(v)}let Ye=Ne!=null&&ge==null;(qe&&(Ke=W&&W.onVnodeUnmounted)||Le||Ye)&&dt(()=>{Ke&&Pt(Ke,C,v),Le&&so(v,null,C,"unmounted"),Ye&&(v.el=null)},P)},Se=v=>{let{type:C,el:P,anchor:F,transition:B}=v;if(C===X){$e(P,F);return}if(C===xo){q(v),B&&!B.persisted&&B.afterLeave&&B.afterLeave();return}let L=()=>{s(P),B&&!B.persisted&&B.afterLeave&&B.afterLeave()};if(v.shapeFlag&1&&B&&!B.persisted){let{leave:W,delayLeave:x}=B,Z=()=>W(P,L);x?x(v.el,L,Z):Z()}else L()},$e=(v,C)=>{let P;for(;v!==C;)P=m(v),s(v),v=P;s(C)},Ue=(v,C,P)=>{let{bum:F,scope:B,job:L,subTree:W,um:x,m:Z,a:K}=v;Qr(Z),Qr(K),F&&bo(F),B.stop(),L?(L.flags|=8,Pe(W,v,C,P)):v.vnode.el&&W&&(W.transition=v.vnode.transition,Pe(W,v,C,P)),x&&dt(x,C),dt(()=>{v.isUnmounted=!0},C)},z=(v,C,P,F=!1,B=!1,L=0)=>{for(let W=L;W{if(v.shapeFlag&6)return ne(v.component.subTree);if(v.shapeFlag&128)return v.suspense.next();let C=m(v.anchor||v.el),P=C&&C[Gd];return P?m(P):C},te=!1,S=(v,C,P)=>{let F;v==null?C._vnode&&(Pe(C._vnode,null,null,!0),F=C._vnode.component):w(C._vnode||null,v,C,null,null,null,P),C._vnode=v,te||(te=!0,Ur(F),ni(),te=!1)},I={p:w,um:Pe,m:Ee,r:Se,mt:oe,mc:_,pc:Ie,pbc:G,n:ne,o:e},j,M;return t&&([j,M]=t(I)),{render:S,hydrate:j,createApp:du(S,j)}}function Tn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function no({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Su(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Oi(e,t,n=!1){let r=e.children,s=t.children;if(ye(r)&&ye(s))for(let i=0;i>1,e[n[u]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,a=n[i-1];i-- >0;)n[i]=a,a=t[a];return n}function Ii(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ii(t)}function Qr(e){if(e)for(let t=0;te.__isSuspense;function Du(e,t){t&&t.pendingBranch?ye(e)?t.effects.push(...e):t.effects.push(e):si(e)}var X=Symbol.for("v-fgt"),zs=Symbol.for("v-txt"),Gt=Symbol.for("v-cmt"),xo=Symbol.for("v-stc"),ro=[],gt=null;function l(e=!1){ro.push(gt=e?null:[])}function qi(){ro.pop(),gt=ro[ro.length-1]||null}var ts=1;function Is(e,t=!1){ts+=e,e<0&>&&t&&(gt.hasOnce=!0)}function Mi(e){return e.dynamicChildren=ts>0?gt||Xt:null,qi(),ts>0&>&>.push(e),e}function d(e,t,n,r,s,i){return Mi(o(e,t,n,r,s,i,!0))}function Lt(e,t,n,r,s){return Mi(Ce(e,t,n,r,s,!0))}function Ps(e){return e?e.__v_isVNode===!0:!1}function Yo(e,t){return e.type===t.type&&e.key===t.key}var Li=({key:e})=>e??null,Ds=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ze(e)||Ze(e)||we(e)?{i:vt,r:e,k:t,f:!!n}:e:null);function o(e,t=null,n=null,r=0,s=null,i=e===X?0:1,a=!1,u=!1){let f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Li(t),ref:t&&Ds(t),scopeId:ii,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:vt};return u?(Vs(f,n),i&128&&e.normalize(f)):n&&(f.shapeFlag|=ze(n)?8:16),ts>0&&!a&>&&(f.patchFlag>0||i&6)&&f.patchFlag!==32&>.push(f),f}var Ce=Ru;function Ru(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===tu)&&(e=Gt),Ps(e)){let u=No(e,t,!0);return n&&Vs(u,n),ts>0&&!i&>&&(u.shapeFlag&6?gt[gt.indexOf(e)]=u:gt.push(u)),u.patchFlag=-2,u}if(Uu(e)&&(e=e.__vccOpts),t){t=Tu(t);let{class:u,style:f}=t;u&&!ze(u)&&(t.class=T(u)),Te(f)&&(Ko(f)&&!ye(f)&&(f=Ge({},f)),t.style=Me(f))}let a=ze(e)?1:Vi(e)?128:Ms(e)?64:Te(e)?4:we(e)?2:0;return o(e,t,n,r,s,a,i,!0)}function Tu(e){return e?Ko(e)||_i(e)?Ge({},e):e:null}function No(e,t,n=!1,r=!1){let{props:s,ref:i,patchFlag:a,children:u,transition:f}=e,h=t?Au(s||{},t):s,g={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&Li(h),ref:t&&t.ref?n&&i?ye(i)?i.concat(Ds(t)):[i,Ds(t)]:Ds(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:u,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==X?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&No(e.ssContent),ssFallback:e.ssFallback&&No(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return f&&r&&Ls(g,f.clone(g)),g}function b(e=" ",t=0){return Ce(zs,null,e,t)}function ce(e,t){let n=Ce(xo,null,e);return n.staticCount=t,n}function p(e="",t=!1){return t?(l(),Lt(Gt,null,e)):Ce(Gt,null,e)}function qt(e){return e==null||typeof e=="boolean"?Ce(Gt):ye(e)?Ce(X,null,e.slice()):Ps(e)?jt(e):Ce(zs,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:No(e)}function Vs(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(ye(t))n=16;else if(typeof t=="object")if(r&65){let s=t.default;s&&(s._c&&(s._d=!1),Vs(e,s()),s._c&&(s._d=!0));return}else{n=32;let s=t._;!s&&!_i(t)?t._ctx=vt:s===3&&vt&&(vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(we(t)){if(r&65){Vs(e,{default:t});return}t={default:t,_ctx:vt},n=32}else t=String(t),r&64?(n=16,t=[b(t)]):n=8;e.children=t,e.shapeFlag|=n}function Au(...e){let t={};for(let n=0;ntt||vt,qs,os;{let e=Mo(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(a=>a(i)):s[0](i)}};qs=t("__VUE_INSTANCE_SETTERS__",n=>tt=n),os=t("__VUE_SSR_SETTERS__",n=>Do=n)}var as=e=>{let t=tt;return qs(e),e.scope.on(),()=>{e.scope.off(),qs(t)}},Xr=()=>{tt&&tt.scope.off(),qs(null)};function $i(e){return e.vnode.shapeFlag&4}var Do=!1;function Vu(e,t=!1,n=!1){t&&os(t);let{props:r,children:s}=e.vnode,i=$i(e);gu(e,r,i,t),ku(e,s,n||t);let a=i?qu(e,t):void 0;return t&&os(!1),a}function qu(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ou);let{setup:r}=n;if(r){Ot();let s=e.setupContext=r.length>1?Lu(e):null,i=as(e),a=ss(r,e,0,[e.props,s]),u=an(a);if(It(),i(),(u||e.sp)&&!Xo(e)&&qn(e),u){if(a.then(Xr,Xr),t)return a.then(f=>{os(!0);try{Zr(e,f,t)}finally{os(!1)}}).catch(f=>{ns(f,e,0)});e.asyncDep=a}else Zr(e,a,t)}else Ui(e,t)}function Zr(e,t,n){we(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Te(t)&&(e.setupState=Ss(t)),Ui(e,n)}var xr,ei;function Ui(e,t,n){let r=e.type;if(!e.render){if(!t&&xr&&!r.render){let s=r.template||Mn(e).template;if(s){let{isCustomElement:i,compilerOptions:a}=e.appContext.config,{delimiters:u,compilerOptions:f}=r,h=Ge(Ge({isCustomElement:i,delimiters:u},a),f);r.render=xr(s,h)}}e.render=r.render||at,ei&&ei(e)}{let s=as(e);Ot();try{su(e)}finally{It(),s()}}}var Mu={get(e,t){return xe(e,"get",""),e[t]}};function Lu(e){let t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Mu),slots:e.slots,emit:e.emit,expose:t}}function Hs(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ss(Sn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Zo)return Zo[n](e)},has(t,n){return n in t||n in Zo}})):e.proxy}function $u(e,t=!0){return we(e)?e.displayName||e.name:e.name||t&&e.__name}function Uu(e){return we(e)&&"__vccOpts"in e}var ot=(e,t)=>Mr(e,t,Do);function ke(e,t,n){try{Is(-1);let r=arguments.length;return r===2?Te(t)&&!ye(t)?Ps(t)?Ce(e,null,[t]):Ce(e,t):Ce(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Ps(n)&&(n=[n]),Ce(e,t,n))}finally{Is(1)}}var Fu="3.5.43";var Bn,Fi=typeof window<"u"&&window.trustedTypes;if(Fi)try{Bn=Fi.createPolicy("vue",{createHTML:e=>e})}catch{}var Xi=Bn?e=>Bn.createHTML(e):e=>e,zu="http://www.w3.org/2000/svg",Hu="http://www.w3.org/1998/Math/MathML",Kt=typeof document<"u"?document:null,zi=Kt&&Kt.createElement("template"),Bu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let s=t==="svg"?Kt.createElementNS(zu,e):t==="mathml"?Kt.createElementNS(Hu,e):n?Kt.createElement(e,{is:n}):Kt.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Kt.createTextNode(e),createComment:e=>Kt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Kt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){let a=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{zi.innerHTML=Xi(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);let u=zi.content;if(r==="svg"||r==="mathml"){let f=u.firstChild;for(;f.firstChild;)u.appendChild(f.firstChild);u.removeChild(f)}t.insertBefore(u,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};var ju=Symbol("_vtc");function Gu(e,t,n){let r=e[ju];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}var Gs=Symbol("_vod"),Zi=Symbol("_vsh"),Y={name:"show",beforeMount(e,{value:t},{transition:n}){e[Gs]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ls(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),ls(e,!0),r.enter(e)):r.leave(e,()=>{ls(e,!1)}):ls(e,t))},beforeUnmount(e,{value:t}){ls(e,t)}};function ls(e,t){e.style.display=t?e[Gs]:"none",e[Zi]=!t}var Wu=Symbol("");var Ku=/(?:^|;)\s*display\s*:/;function Yu(e,t,n){let r=e.style,s=ze(n),i=!1;if(n&&!s){if(t)if(ze(t))for(let a of t.split(";")){let u=a.slice(0,a.indexOf(":")).trim();n[u]==null&&ds(r,u,"")}else for(let a in t)n[a]==null&&ds(r,a,"");for(let a in n){a==="display"&&(i=!0);let u=n[a];u!=null?Qu(e,a,!ze(t)&&t?t[a]:void 0,u)||ds(r,a,u):ds(r,a,"")}}else if(s){if(t!==n){let a=r[Wu];a&&(n+=";"+a),r.cssText=n,i=Ku.test(n)}}else t&&e.removeAttribute("style");Gs in e&&(e[Gs]=i?r.display:"",e[Zi]&&(r.display="none"))}var Bs=/\s*!important$/;function ds(e,t,n){if(ye(n))n.forEach(r=>ds(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))Bs.test(n)?e.setProperty(t,n.replace(Bs,""),"important"):e.setProperty(t,n);else{let r=Ju(e,t);Bs.test(n)?e.setProperty(St(r),n.replace(Bs,""),"important"):e[r]=n}}var Hi=["Webkit","Moz","ms"],Fn={};function Ju(e,t){let n=Fn[t];if(n)return n;let r=Je(t);if(r!=="filter"&&r in e)return Fn[t]=r;r=eo(r);for(let s=0;szn||(oc.then(()=>zn=0),zn=Date.now());function nc(e,t){let n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;let s=n.value;if(ye(s)){let i=r.stopImmediatePropagation;r.stopImmediatePropagation=()=>{i.call(r),r._stopped=!0};let a=s.slice(),u=[r];for(let f=0;fe.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,rc=(e,t,n,r,s,i)=>{let a=s==="svg";t==="class"?Gu(e,r,a):t==="style"?Yu(e,n,r):vo(t)?go(t)||Zu(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ic(e,t,r,a))?(Gi(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ji(e,t,r,a,i,t!=="value")):e._isVueCE&&(ac(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ze(r)))?Gi(e,Je(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),ji(e,t,r,a))};function ic(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ki(t)&&we(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){let s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Ki(t)&&ze(n)?!1:t in e}function ac(e,t){let n=e._def.props;if(!n)return!1;let r=Je(t);return Array.isArray(n)?n.some(s=>Je(s)===r):Object.keys(n).some(s=>Je(s)===r)}var Ws=e=>{let t=e.props["onUpdate:modelValue"]||!1;return ye(t)?n=>bo(t,n):t};function lc(e){e.target.composing=!0}function Yi(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}var uo=Symbol("_assign"),js=Symbol("_initialValue");function Hn(e,t,n){return t&&(e=e.trim()),n&&(e=wo(e)),e}var xi={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e.parentNode&&(e.type==="text"?e[js]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[js]=e.defaultValue.replace(/\r\n?/g,` -`))),e[uo]=Ws(s);let i=r||s.props&&s.props.type==="number";lo(e,t?"change":"input",a=>{a.target.composing||e[uo](Hn(e.value,n,i))}),(n||i)&&lo(e,"change",()=>{e.value=Hn(e.value,n,i)}),t||(lo(e,"compositionstart",lc),lo(e,"compositionend",Yi),lo(e,"change",Yi))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let s=t??"",i=e[js];delete e[js],i!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==i?e[uo](Hn(e.value,n,r)):e.value=s},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:i}},a){if(e[uo]=Ws(a),e.composing)return;let u=(i||e.type==="number")&&!/^0\d/.test(e.value)?wo(e.value):e.value,f=t??"";if(u===f)return;let h=e.getRootNode();(h instanceof Document||h instanceof ShadowRoot)&&h.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===f)||(e.value=f)}};var ea={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,lo(e,"change",()=>{let s=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>n?wo(Ks(f)):Ks(f)),i=e.multiple,a=i?Ft(e._modelValue)?new Set(s):s:s[0],u=e._pendingValue=[i,i?ye(a)?s.slice():s:a];try{e[uo](a)}finally{st(()=>{e._pendingValue===u&&(e._pendingValue=void 0)})}}),e[uo]=Ws(r)},mounted(e,{value:t}){Ji(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[uo]=Ws(n)},updated(e,{value:t}){let n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!dc(t,n[1],n[0]))&&Ji(e,t)}};function dc(e,t,n){if(!n)return Nt(e,t);if(ye(e))return Nt(e,t);if(Ft(e)){if(e.size!==t.length)return!1;for(let r of t)if(!e.has(r))return!1;return!0}return!1}function Ji(e,t){let n=e.multiple,r=ye(t);if(!(n&&!r&&!Ft(t))){for(let s=0,i=e.options.length;sString(h)===String(u)):a.selected=yr(t,u)>-1}else a.selected=t.has(u);else if(Nt(Ks(a),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ks(e){return"_value"in e?e._value:e.value}var uc=["ctrl","shift","alt","meta"],cc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>uc.some(n=>e[`${n}Key`]&&!t.includes(n))},me=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=((s,...i)=>{for(let a=0;a{let n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=(s=>{if(!("key"in s))return;let i=St(s.key);if(t.some(a=>a===i||pc[a]===i))return e(s)}))},fc=Ge({patchProp:rc},Bu),Qi;function mc(){return Qi||(Qi=Ai(fc))}var ta=((...e)=>{let t=mc().createApp(...e),{mount:n}=t;return t.mount=r=>{let s=vc(r);if(!s)return;let i=t._component;!we(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.nodeType===1&&(s.textContent="");let a=n(s,!1,hc(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),a},t});function hc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function vc(e){return ze(e)?document.querySelector(e):e}var fo=typeof document<"u";function sa(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function gc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&sa(e.default)}var Oe=Object.assign;function Ys(e,t){let n={};for(let r in t){let s=t[r];n[r]=kt(s)?s.map(e):e(s)}return n}var Ao=()=>{},kt=Array.isArray;function Wn(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var na=/#/g,yc=/&/g,bc=/\//g,wc=/=/g,kc=/\?/g,ra=/\+/g,Ec=/%5B/g,Cc=/%5D/g,ia=/%5E/g,_c=/%60/g,aa=/%7B/g,Sc=/%7C/g,la=/%7D/g,Nc=/%20/g;function Kn(e){return e==null?"":encodeURI(""+e).replace(Sc,"|").replace(Ec,"[").replace(Cc,"]")}function da(e){return Kn(e).replace(aa,"{").replace(la,"}").replace(ia,"^")}function jn(e){return Kn(e).replace(ra,"%2B").replace(Nc,"+").replace(na,"%23").replace(yc,"%26").replace(_c,"`").replace(aa,"{").replace(la,"}").replace(ia,"^")}function Dc(e){return jn(e).replace(wc,"%3D")}function Rc(e){return Kn(e).replace(na,"%23").replace(kc,"%3F")}function ua(e){return Rc(e).replace(bc,"%2F")}function To(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}var Tc=/\/$/,Ac=e=>e.replace(Tc,"");function Js(e,t,n="/"){let r,s={},i="",a="",u=t.indexOf("#"),f=t.indexOf("?");return f=u>=0&&f>u?-1:f,f>=0&&(r=t.slice(0,f),i=t.slice(f,u>0?u:t.length),s=e(i.slice(1))),u>=0&&(r=r||t.slice(0,u),a=t.slice(u,t.length)),r=Ic(r??t,n),{fullPath:r+i+a,path:r,query:s,hash:To(a)}}function ca(e,t){let n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Yn(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function pa(e,t,n){let r=t.matched.length-1,s=n.matched.length-1;return r>-1&&r===s&&co(t.matched[r],n.matched[s])&&Jn(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function co(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Jn(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Oc(e[n],t[n]))return!1;return!0}function Oc(e,t){return kt(e)?oa(e,t):kt(t)?oa(t,e):e?.valueOf()===t?.valueOf()}function oa(e,t){return kt(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function Ic(e,t){if(e.startsWith("/"))return e;if(!e)return t;let n=t.split("/"),r=e.split("/"),s=r[r.length-1];(s===".."||s===".")&&r.push("");let i=n.length-1,a,u;for(a=0;a1&&i--;else break;return n.slice(0,i).join("/")+"/"+r.slice(a).join("/")}var Jt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Qs=(function(e){return e.pop="pop",e.push="push",e})({}),Xs=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function fa(e){if(!e)if(fo){let t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Ac(e)}var Pc=/^[^#]+#/;function ma(e,t){return e.replace(Pc,"#")+t}function Vc(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var us=()=>({left:window.scrollX,top:window.scrollY});function ha(e){let t;if("el"in e){let n=e.el,r=typeof n=="string"&&n.startsWith("#"),s=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!s)return;t=Vc(s,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Qn(e,t){return(history.state?history.state.position-t:-1)+e}var Gn=new Map;function va(e,t){Gn.set(e,t)}function ga(e){let t=Gn.get(e);return Gn.delete(e),t}function qc(e){return typeof e=="string"||e&&typeof e=="object"}function Xn(e){return typeof e=="string"||typeof e=="symbol"}var je=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({}),ya=Symbol("");var E6={[je.MATCHER_NOT_FOUND]({location:e,currentLocation:t}){return`No match for +"use strict";(()=>{var ad=Object.defineProperty;var ld=(e,t)=>{for(var s in t)ad(e,s,{get:t[s],enumerable:!0})};var fe=["abap","abc","actionscript","ada","alda","apache_conf","apex","applescript","aql","asciidoc","asl","assembly_x86","autohotkey","batchfile","c9search","c_cpp","cirru","clojure","cobol","coffee","coldfusion","crystal","csharp","csound_document","csound_orchestra","csound_score","csp","css","curly","d","dart","diff","django","dockerfile","dot","drools","edifact","eiffel","ejs","elixir","elm","erlang","forth","fortran","fsharp","fsl","ftl","gcode","gherkin","gitignore","glsl","gobstones","golang","graphqlschema","groovy","haml","handlebars","haskell","haskell_cabal","haxe","hjson","html","html_elixir","html_ruby","ini","io","jack","jade","java","javascript","json","json5","jsoniq","jsp","jssm","jsx","julia","kotlin","latex","less","liquid","lisp","livescript","logiql","logtalk","lsl","lua","luapage","lucene","makefile","markdown","mask","matlab","maze","mediawiki","mel","mixal","mushcode","mysql","nginx","nim","nix","nsis","nunjucks","objectivec","ocaml","pascal","perl","perl6","pgsql","php","php_laravel_blade","pig","plain_text","powershell","praat","prisma","prolog","properties","protobuf","puppet","python","qml","r","razor","rdoc","red","redshift","rhtml","rst","ruby","rust","sass","scad","scala","scheme","scss","sh","sjs","slim","smarty","snippets","soy_template","space","sparql","sql","sqlserver","stylus","svg","swift","tcl","terraform","tex","text","textile","toml","tsx","turtle","twig","typescript","vala","vbscript","velocity","verilog","vhdl","visualforce","wollok","xml","xquery","yaml","zeek"];var he={notebook:"/script/notebook.c3144c18ae.min.js",org:"/script/org.f61f262915.min.js",pdf:"/script/pdf.4d9cc6ff49.min.js",markdown:"/script/markdown.44f2e93820.min.js",editor:"/script/editor.4f142d3adc.min.js"};var fo=new Map,cd=he;function xt(e){if(!fo.has(e)){let t=document.createElement("script");t.src=cd[e];let s=new Promise((i,o)=>{t.onload=i,t.onerror=()=>{fo.delete(e),t.remove(),o(new Error(`Unable to load ${e}. Please retry.`))}});fo.set(e,s),document.head.appendChild(t)}return fo.get(e)}async function mi(){await xt("editor"),ace.config.set("basePath","/script/external/ace/")}function mn(e){let t=Object.create(null);for(let s of e.split(","))t[s]=1;return s=>s in t}var Pe={},Xt=[],at=()=>{},us=()=>!1,vn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),gn=e=>e.startsWith("onUpdate:"),Ge=Object.assign,In=(e,t)=>{let s=e.indexOf(t);s>-1&&e.splice(s,1)},pd=Object.prototype.hasOwnProperty,Re=(e,t)=>pd.call(e,t),ve=Array.isArray,Ut=e=>Vn(e)==="[object Map]",Ft=e=>Vn(e)==="[object Set]",vi=e=>Vn(e)==="[object Date]";var be=e=>typeof e=="function",Be=e=>typeof e=="string",ht=e=>typeof e=="symbol",Ae=e=>e!==null&&typeof e=="object",cs=e=>(Ae(e)||be(e))&&be(e.then)&&be(e.catch),wi=Object.prototype.toString,Vn=e=>wi.call(e),ps=e=>Vn(e).slice(8,-1),ho=e=>Vn(e)==="[object Object]",mo=e=>Be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yn=mn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted");var vo=e=>{let t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},fd=/-\w/g,Je=vo(e=>e.replace(fd,t=>t.slice(1).toUpperCase())),hd=/\B([A-Z])/g,St=vo(e=>e.replace(hd,"-$1").toLowerCase()),en=vo(e=>e.charAt(0).toUpperCase()+e.slice(1)),qn=vo(e=>e?`on${en(e)}`:""),yt=(e,t)=>!Object.is(e,t),bn=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:i,value:s})},wn=e=>{let t=parseFloat(e);return isNaN(t)?e:t};var gi,Mn=()=>gi||(gi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ve(e){if(ve(e)){let t={};for(let s=0;ss.startsWith("/*")?"":s).split(md).forEach(s=>{if(s){let i=s.split(vd);i.length>1&&(t[i[0].trim()]=i[1].trim())}}),t}function A(e){let t="";if(Be(e))t=e;else if(ve(e))for(let s=0;sNt(s,t))}var _i=e=>!!(e&&e.__v_isRef===!0),u=e=>Be(e)?e:e==null?"":ve(e)||Ae(e)&&(e.toString===wi||!be(e.toString))?_i(e)?u(e.value):JSON.stringify(e,Si,2):String(e),Si=(e,t)=>_i(t)?Si(e,t.value):Ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[i,o],r)=>(s[ds(i,r)+" =>"]=o,s),{})}:Ft(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>ds(s))}:ht(t)?ds(t):Ae(t)&&!ve(t)&&!ho(t)?String(t):t,ds=(e,t="")=>{var s;return ht(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};function Ed(e,...t){console.warn(`[Vue warn] ${e}`,...t)}var Xe,Fn=class{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Xe&&(Xe.active?(this.parent=Xe,this.index=(Xe.scopes||(Xe.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes){let i=this.scopes.slice();for(t=0,s=i.length;t0&&--this._on===0){if(Xe===this)Xe=this.prevScope;else{let t=Xe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let s,i;for(s=0,i=this.effects.length;s0)return;if(Un){let t=Un;for(Un=void 0;t;){let s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Ln;){let t=Ln;for(Ln=void 0;t;){let s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(i){e||(e=i)}t=s}}if(e)throw e}function Oi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Pi(e){let t,s=e.depsTail,i=s;for(;i;){let o=i.prevDep;i.version===-1?(i===s&&(s=o),Ns(i),Cd(i)):t=i,i.dep.activeLink=i.prevActiveLink,i.prevActiveLink=void 0,i=o}e.deps=t,e.depsTail=s}function vs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ii(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ii(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Bn)||(e.globalVersion=Bn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!vs(e))))return;e.flags|=2;let t=e.dep,s=Fe,i=Ct;Fe=e,Ct=!0;try{Oi(e);let o=e.fn(e._value);(t.version===0||yt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{Fe=s,Ct=i,Pi(e),e.flags&=-3}}function Ns(e,t=!1){let{dep:s,prevSub:i,nextSub:o}=e;if(i&&(i.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=i,e.nextSub=void 0),s.subs===e&&(s.subs=i,!i&&s.computed)){s.computed.flags&=-5;for(let r=s.computed.deps;r;r=r.nextDep)Ns(r,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Cd(e){let{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}var Ct=!0,Vi=[];function Ot(){Vi.push(Ct),Ct=!1}function Pt(){let e=Vi.pop();Ct=e===void 0?!0:e}function Ni(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let s=Fe;Fe=void 0;try{t()}finally{Fe=s}}}var Bn=0,gs=class{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},zn=class{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Fe||!Ct||Fe===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==Fe)s=this.activeLink=new gs(Fe,this),Fe.deps?(s.prevDep=Fe.depsTail,Fe.depsTail.nextDep=s,Fe.depsTail=s):Fe.deps=Fe.depsTail=s,qi(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){let i=s.nextDep;i.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=i),s.prevDep=Fe.depsTail,s.nextDep=void 0,Fe.depsTail.nextDep=s,Fe.depsTail=s,Fe.deps===s&&(Fe.deps=i)}return s}trigger(t){this.version++,Bn++,this.notify(t)}notify(t){_s();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Ss()}}};function qi(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let i=t.deps;i;i=i.nextDep)qi(i)}let s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}var ys=new WeakMap,nn=Symbol(""),bs=Symbol(""),Hn=Symbol("");function et(e,t,s){if(Ct&&Fe){let i=ys.get(e);i||ys.set(e,i=new Map);let o=i.get(s);o||(i.set(s,o=new zn),o.map=i,o.key=s),o.track()}}function Rt(e,t,s,i,o,r){let a=ys.get(e);if(!a){Bn++;return}let c=f=>{f&&f.trigger()};if(_s(),t==="clear")a.forEach(c);else{let f=ve(e),v=f&&mo(s);if(f&&s==="length"){let g=Number(i);a.forEach((k,m)=>{(m==="length"||m===Hn||!ht(m)&&m>=g)&&c(k)})}else switch((s!==void 0||a.has(void 0))&&c(a.get(s)),v&&c(a.get(Hn)),t){case"add":f?v&&c(a.get("length")):(c(a.get(nn)),Ut(e)&&c(a.get(bs)));break;case"delete":f||(c(a.get(nn)),Ut(e)&&c(a.get(bs)));break;case"set":Ut(e)&&c(a.get(nn));break}}Ss()}function kn(e){let t=Te(e);return t===e||(et(t,"iterate",Hn),lt(e))?t:bt(e)?At(e)?t.map(s=>zt(mt(s))):t.map(zt):t.map(mt)}function Gn(e){return et(e=Te(e),"iterate",Hn),e}function Dt(e,t){return bt(e)?zt(At(e)?mt(t):t):mt(t)}var _d={__proto__:null,[Symbol.iterator](){return hs(this,Symbol.iterator,e=>Dt(this,e))},concat(...e){return kn(this).concat(...e.map(t=>ve(t)?kn(t):t))},entries(){return hs(this,"entries",e=>(e[1]=Dt(this,e[1]),e))},every(e,t){return Bt(this,"every",e,t,void 0,arguments)},filter(e,t){return Bt(this,"filter",e,t,s=>s.map(i=>Dt(this,i)),arguments)},find(e,t){return Bt(this,"find",e,t,s=>Dt(this,s),arguments)},findIndex(e,t){return Bt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Bt(this,"findLast",e,t,s=>Dt(this,s),arguments)},findLastIndex(e,t){return Bt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Bt(this,"forEach",e,t,void 0,arguments)},includes(...e){return ms(this,"includes",e)},indexOf(...e){return ms(this,"indexOf",e)},join(e){return kn(this).join(e)},lastIndexOf(...e){return ms(this,"lastIndexOf",e)},map(e,t){return Bt(this,"map",e,t,void 0,arguments)},pop(){return $n(this,"pop")},push(...e){return $n(this,"push",e)},reduce(e,...t){return Di(this,"reduce",e,t)},reduceRight(e,...t){return Di(this,"reduceRight",e,t)},shift(){return $n(this,"shift")},some(e,t){return Bt(this,"some",e,t,void 0,arguments)},splice(...e){return $n(this,"splice",e)},toReversed(){return kn(this).toReversed()},toSorted(e){return kn(this).toSorted(e)},toSpliced(...e){return kn(this).toSpliced(...e)},unshift(...e){return $n(this,"unshift",e)},values(){return hs(this,"values",e=>Dt(this,e))}};function hs(e,t,s){let i=Gn(e),o=i[t]();return i!==e&&!lt(e)&&(o._next=o.next,o.next=()=>{let r=o._next();return r.done||(r.value=s(r.value)),r}),o}var Sd=Array.prototype;function Bt(e,t,s,i,o,r){let a=Gn(e),c=a!==e&&!lt(e),f=a[t];if(f!==Sd[t]){let k=f.apply(e,r);return c?mt(k):k}let v=s;a!==e&&(c?v=function(k,m){return s.call(this,Dt(e,k),m,e)}:s.length>2&&(v=function(k,m){return s.call(this,k,m,e)}));let g=f.call(a,v,i);return c&&o?o(g):g}function Di(e,t,s,i){let o=Gn(e),r=o!==e&&!lt(e),a=s,c=!1;o!==e&&(r?(c=i.length===0,a=function(v,g,k){return c&&(c=!1,v=Dt(e,v)),s.call(this,v,Dt(e,g),k,e)}):s.length>3&&(a=function(v,g,k){return s.call(this,v,g,k,e)}));let f=o[t](a,...i);return c?Dt(e,f):f}function ms(e,t,s){let i=Te(e);et(i,"iterate",Hn);let o=i[t](...s);return(o===-1||o===!1)&&Kn(s[0])?(s[0]=Te(s[0]),i[t](...s)):o}function $n(e,t,s=[]){Ot(),_s();let i=Te(e)[t].apply(e,s);return Ss(),Pt(),i}var Nd=mn("__proto__,__v_isRef,__isVue"),Mi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ht));function Dd(e){ht(e)||(e=String(e));let t=Te(this);return et(t,"has",e),t.hasOwnProperty(e)}var Eo=class{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,i){if(s==="__v_skip")return t.__v_skip;let o=this._isReadonly,r=this._isShallow;if(s==="__v_isReactive")return!o;if(s==="__v_isReadonly")return o;if(s==="__v_isShallow")return r;if(s==="__v_raw")return i===(o?r?Md:Ui:r?Li:$i).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(i)?t:void 0;let a=ve(t);if(!o){let f;if(a&&(f=_d[s]))return f;if(s==="hasOwnProperty")return Dd}let c=Reflect.get(t,s,xe(t)?t:i);if((ht(s)?Mi.has(s):Nd(s))||(o||et(t,"get",s),r))return c;if(xe(c)){let f=a&&mo(s)?c:c.value;return o&&Ae(f)?_o(f):f}return Ae(c)?o?_o(c):ze(c):c}},Co=class extends Eo{constructor(t=!1){super(!1,t)}set(t,s,i,o){let r=t[s],a=ve(t)&&mo(s);if(!this._isShallow){let v=bt(r);if(!lt(i)&&!bt(i)&&(r=Te(r),i=Te(i)),!a&&xe(r)&&!xe(i))return v||(r.value=i),!0}let c=a?Number(s)e,bo=e=>Reflect.getPrototypeOf(e);function Od(e,t,s){return function(...i){let o=this.__v_raw,r=Te(o),a=Ut(r),c=e==="entries"||e===Symbol.iterator&&a,f=e==="keys"&&a,v=o[e](...i),g=s?ks:t?zt:mt;return!t&&et(r,"iterate",f?bs:nn),Ge(Object.create(v),{next(){let{value:k,done:m}=v.next();return m?{value:k,done:m}:{value:c?[g(k[0]),g(k[1])]:g(k),done:m}}})}}function wo(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Pd(e,t){let s={get(o){let r=this.__v_raw,a=Te(r),c=Te(o);e||(yt(o,c)&&et(a,"get",o),et(a,"get",c));let{has:f}=bo(a),v=t?ks:e?zt:mt;if(f.call(a,o))return v(r.get(o));if(f.call(a,c))return v(r.get(c));r!==a&&r.get(o)},get size(){let o=this.__v_raw;return!e&&et(Te(o),"iterate",nn),o.size},has(o){let r=this.__v_raw,a=Te(r),c=Te(o);return e||(yt(o,c)&&et(a,"has",o),et(a,"has",c)),o===c?r.has(o):r.has(o)||r.has(c)},forEach(o,r){let a=this,c=a.__v_raw,f=Te(c),v=t?ks:e?zt:mt;return!e&&et(f,"iterate",nn),c.forEach((g,k)=>o.call(r,v(g),v(k),a))}};return Ge(s,e?{add:wo("add"),set:wo("set"),delete:wo("delete"),clear:wo("clear")}:{add(o){let r=Te(this),a=bo(r),c=Te(o),f=!t&&!lt(o)&&!bt(o)?c:o;return a.has.call(r,f)||yt(o,f)&&a.has.call(r,o)||yt(c,f)&&a.has.call(r,c)||(r.add(f),Rt(r,"add",f,f)),this},set(o,r){!t&&!lt(r)&&!bt(r)&&(r=Te(r));let a=Te(this),{has:c,get:f}=bo(a),v=c.call(a,o);v||(o=Te(o),v=c.call(a,o));let g=f.call(a,o);return a.set(o,r),v?yt(r,g)&&Rt(a,"set",o,r,g):Rt(a,"add",o,r),this},delete(o){let r=Te(this),{has:a,get:c}=bo(r),f=a.call(r,o);f||(o=Te(o),f=a.call(r,o));let v=c?c.call(r,o):void 0,g=r.delete(o);return f&&Rt(r,"delete",o,void 0,v),g},clear(){let o=Te(this),r=o.size!==0,a=void 0,c=o.clear();return r&&Rt(o,"clear",void 0,void 0,a),c}}),["keys","values","entries",Symbol.iterator].forEach(o=>{s[o]=Od(o,e,t)}),s}function Ds(e,t){let s=Pd(e,t);return(i,o,r)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?i:Reflect.get(Re(s,o)&&o in i?s:i,o,r)}var Id={get:Ds(!1,!1)},Vd={get:Ds(!1,!0)},qd={get:Ds(!0,!1)};var $i=new WeakMap,Li=new WeakMap,Ui=new WeakMap,Md=new WeakMap;function $d(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function ze(e){return bt(e)?e:Rs(e,!1,Rd,Id,$i)}function Wn(e){return Rs(e,!1,Ad,Vd,Li)}function _o(e){return Rs(e,!0,Td,qd,Ui)}function Rs(e,t,s,i,o){if(!Ae(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let r=o.get(e);if(r)return r;let a=$d(ps(e));if(a===0)return e;let c=new Proxy(e,a===2?i:s);return o.set(e,c),c}function At(e){return bt(e)?At(e.__v_raw):!!(e&&e.__v_isReactive)}function bt(e){return!!(e&&e.__v_isReadonly)}function lt(e){return!!(e&&e.__v_isShallow)}function Kn(e){return e?!!e.__v_raw:!1}function Te(e){let t=e&&e.__v_raw;return t?Te(t):e}function Ts(e){return!Re(e,"__v_skip")&&Object.isExtensible(e)&&go(e,"__v_skip",!0),e}var mt=e=>Ae(e)?ze(e):e,zt=e=>Ae(e)?_o(e):e;function xe(e){return e?e.__v_isRef===!0:!1}function tt(e){return Fi(e,!1)}function No(e){return Fi(e,!0)}function Fi(e,t){return xe(e)?e:new Es(e,t)}var Es=class{constructor(t,s){this.dep=new zn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:Te(t),this._value=s?t:mt(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){let s=this._rawValue,i=this.__v_isShallow||lt(t)||bt(t);t=i?t:Te(t),yt(t,s)&&(this._rawValue=t,this._value=i?t:mt(t),this.dep.trigger())}};function Ht(e){return xe(e)?e.value:e}var Ld={get:(e,t,s)=>t==="__v_raw"?e:Ht(Reflect.get(e,t,s)),set:(e,t,s,i)=>{let o=e[t];return xe(o)&&!xe(s)?(o.value=s,!0):Reflect.set(e,t,s,i)}};function Do(e){return At(e)?e:new Proxy(e,Ld)}var Cs=class{constructor(t,s,i){this.fn=t,this.setter=s,this._value=void 0,this.dep=new zn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Bn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=i}notify(){if(this.flags|=16,!(this.flags&8)&&Fe!==this)return Ai(this,!0),!0}get value(){let t=this.dep.track();return Ii(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}};function Bi(e,t,s=!1){let i,o;return be(e)?i=e:(i=e.get,o=e.set),new Cs(i,o,s)}var ko={},So=new WeakMap,tn;function zi(e,t=!1,s=tn){if(s){let i=So.get(s);i||So.set(s,i=[]),i.push(e)}}function Hi(e,t,s=Pe){let{immediate:i,deep:o,once:r,scheduler:a,augmentJob:c,call:f}=s,v=M=>{(s.onWarn||Ed)("Invalid watch source: ",M,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},g=M=>o?M:lt(M)||o===!1||o===0?Tt(M,1):Tt(M),k,m,b,C,E=!1,T=!1;if(xe(e)?(m=()=>e.value,E=lt(e)):At(e)?(m=()=>g(e),E=!0):ve(e)?(T=!0,E=e.some(M=>At(M)||lt(M)),m=()=>e.map(M=>{if(xe(M))return M.value;if(At(M))return g(M);if(be(M))return f?f(M,2):M()})):be(e)?t?m=f?()=>f(e,2):e:m=()=>{if(b){Ot();try{b()}finally{Pt()}}let M=tn;tn=k;try{return f?f(e,3,[C]):e(C)}finally{tn=M}}:m=at,t&&o){let M=m,z=o===!0?1/0:o;m=()=>Tt(M(),z)}let D=Ri(),O=()=>{k.stop(),D&&D.active&&In(D.effects,k)};if(r&&t){let M=t;t=(...z)=>{let se=M(...z);return O(),se}}let q=T?new Array(e.length).fill(ko):ko,F=M=>{if(!(!(k.flags&1)||!k.dirty&&!M))if(t){let z=k.run();if(M||o||E||(T?z.some((se,oe)=>yt(se,q[oe])):yt(z,q))){b&&b();let se=tn;tn=k;try{let oe=[z,q===ko?void 0:T&&q[0]===ko?[]:q,C];q=z,f?f(t,3,oe):t(...oe)}finally{tn=se}}}else k.run()};return c&&c(F),k=new En(m),k.scheduler=a?()=>a(F,!1):F,C=M=>zi(M,!1,k),b=k.onStop=()=>{let M=So.get(k);if(M){if(f)f(M,4);else for(let z of M)z();So.delete(k)}},t?i?F(!0):q=k.run():a?a(F.bind(null,!0),!0):k.run(),O.pause=k.pause.bind(k),O.resume=k.resume.bind(k),O.stop=O,O}function Tt(e,t=1/0,s){if(t<=0||!Ae(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,xe(e))Tt(e.value,t,s);else if(ve(e))for(let i=0;i{Tt(i,t,s)});else if(ho(e)){for(let i in e)Tt(e[i],t,s);for(let i of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,i)&&Tt(e[i],t,s)}return e}function oo(e,t,s,i){try{return i?e(...i):e()}catch(o){so(o,t,s)}}function wt(e,t,s,i){if(be(e)){let o=oo(e,t,s,i);return o&&cs(o)&&o.catch(r=>{so(r,t,s)}),o}if(ve(e)){let o=[];for(let r=0;r>>1,o=it[i],r=eo(o);r=eo(s)?it.push(e):it.splice(Hd(t),0,e),e.flags|=1,ar()}}function ar(){Ao||(Ao=rr.then(ur))}function lr(e){if(!ve(e))Zt&&e.id===-1?Zt.splice(Cn+1,0,e):e.flags&1||(_n.push(e),e.flags|=1);else for(let t=0;teo(s)-eo(i));if(_n.length=0,Zt){for(let s=0;se.id==null?e.flags&2?-1:1/0:e.id;function ur(e){let t=at;try{for(Vt=0;Vt{i._d&&Vo(-1);let r=Oo(t),a=rn.length,c;try{c=e(...o)}finally{for(let f=rn.length;f>a;f--)Fr();Oo(r),i._d&&Vo(1)}return c};return i._n=!0,i._c=!0,i._d=!0,i}function N(e,t){if(vt===null)return e;let s=jo(vt),i=e.dirs||(e.dirs=[]);for(let o=0;o1)return s&&be(t)?t.call(i&&i.proxy):t}}var Gd=Symbol.for("v-scx"),Wd=()=>{{let e=ut(Gd);return e}};function He(e,t,s){return pr(e,t,s)}function pr(e,t,s=Pe){let{immediate:i,deep:o,flush:r,once:a}=s,c=Ge({},s),f=t&&i||!t&&r!=="post",v;if(Dn){if(r==="sync"){let b=Wd();v=b.__watcherHandles||(b.__watcherHandles=[])}else if(!f){let b=()=>{};return b.stop=at,b.resume=at,b.pause=at,b}}let g=nt;c.call=(b,C,E)=>wt(b,g,C,E);let k=!1;r==="post"?c.scheduler=b=>{dt(b,g&&g.suspense)}:r!=="sync"&&(k=!0,c.scheduler=(b,C)=>{C?b():Ls(b)}),c.augmentJob=b=>{t&&(b.flags|=4),k&&(b.flags|=2,g&&(b.id=g.uid,b.i=g))};let m=Hi(e,t,c);return Dn&&(v?v.push(m):f&&m()),m}function Kd(e,t,s){let i=this.proxy,o=Be(e)?e.includes(".")?fr(i,e):()=>i[e]:e.bind(i,i),r;be(t)?r=t:(r=t.handler,s=t);let a=ao(this),c=pr(o,r.bind(i),s);return a(),c}function fr(e,t){let s=t.split(".");return()=>{let i=e;for(let o=0;oe.__isTeleport;var As=Symbol("_leaveCb");function Qd(e){let t=e[0];if(e.length>1){let s=!1;for(let i of e)if(i.type!==Gt){t=i,s=!0;break}}return t}function hr(e){if(!Fo(e))return Lo(e.type)&&e.children?Qd(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:s}=e;if(s){if(t&16)return s[0];if(t&32&&be(s.default))return s.default()}}function Uo(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let s=e.component.subTree;Uo(Lo(s.type)&&hr(s)||s,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function io(e,t){return be(e)?Ge({name:e.name},t,{setup:e}):e}function Us(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Gi(e,t){let s;return!!((s=Object.getOwnPropertyDescriptor(e,t))&&!s.configurable)}var Po=new WeakMap;function Jn(e,t,s,i,o=!1){if(ve(e)){e.forEach((E,T)=>Jn(E,t&&(ve(t)?t[T]:t),s,i,o));return}if(Xn(i)&&!o){i.shapeFlag&512&&i.type.__asyncResolved&&i.component.subTree.component&&Jn(e,t,s,i.component.subTree);return}let r=i.shapeFlag&4?jo(i.component):i.el,a=o?null:r,{i:c,r:f}=e,v=t&&t.r,g=c.refs===Pe?c.refs={}:c.refs,k=c.setupState,m=Te(k),b=k===Pe?us:E=>Gi(g,E)?!1:Re(m,E),C=(E,T)=>!(T&&Gi(g,T));if(v!=null&&v!==f){if(Wi(t),Be(v))g[v]=null,b(v)&&(k[v]=null);else if(xe(v)){let E=t;C(v,E.k)&&(v.value=null),E.k&&(g[E.k]=null)}}if(be(f))oo(f,c,12,[a,g]);else{let E=Be(f),T=xe(f);if(E||T){let D=()=>{if(e.f){let O=E?b(f)?k[f]:g[f]:C(f)||!e.k?f.value:g[e.k];if(o)ve(O)&&In(O,r);else if(ve(O))O.includes(r)||O.push(r);else if(E)g[f]=[r],b(f)&&(k[f]=g[f]);else{let q=[r];C(f,e.k)&&(f.value=q),e.k&&(g[e.k]=q)}}else E?(g[f]=a,b(f)&&(k[f]=a)):T&&(C(f,e.k)&&(f.value=a),e.k&&(g[e.k]=a))};if(a){let O=()=>{D(),Po.delete(e)};O.id=-1,Po.set(e,O),dt(O,s)}else Wi(e),D()}}}function Wi(e){let t=Po.get(e);t&&(t.flags|=8,Po.delete(e))}var Ki=e=>e.nodeType===8;var u$=Mn().requestIdleCallback||(e=>setTimeout(e,1)),c$=Mn().cancelIdleCallback||(e=>clearTimeout(e));function Jd(e,t){if(Ki(e)&&e.data==="["){let s=1,i=e.nextSibling;for(;i;){if(i.nodeType===1){if(t(i)===!1)break}else if(Ki(i))if(i.data==="]"){if(--s===0)break}else i.data==="["&&s++;i=i.nextSibling}}else t(e)}var Xn=e=>!!e.type.__asyncLoader;function mr(e){be(e)&&(e={loader:e});let{loader:t,loadingComponent:s,errorComponent:i,delay:o=200,hydrate:r,timeout:a,suspensible:c=!0,onError:f}=e,v=null,g,k=0,m=()=>(k++,v=null,b()),b=()=>{let C;return v||(C=v=t().catch(E=>{if(E=E instanceof Error?E:new Error(String(E)),f)return new Promise((T,D)=>{f(E,()=>T(m()),()=>D(E),k+1)});throw E}).then(E=>C!==v&&v?v:(E&&(E.__esModule||E[Symbol.toStringTag]==="Module")&&(E=E.default),g=E,E)))};return io({name:"AsyncComponentWrapper",__asyncLoader:b,__asyncHydrate(C,E,T){let D=C.isConnected,O=!1;(E.bu||(E.bu=[])).push(()=>O=!0);let q=()=>{O||!C.parentNode||D&&!C.isConnected||T()},F=r?()=>{let M=r(q,z=>Jd(C,z));M&&(E.bum||(E.bum=[])).push(M)}:q;g?F():b().then(()=>!E.isUnmounted&&F())},get __asyncResolved(){return g},setup(){let C=nt;if(Us(C),g)return()=>Ro(g,C);let E=M=>{v=null,so(M,C,13,!i)};if(c&&C.suspense||Dn)return b().then(M=>()=>Ro(M,C)).catch(M=>(E(M),()=>i?_e(i,{error:M}):null));let T=tt(!1),D=tt(),O=tt(!!o),q,F;return ro(()=>{q!=null&&clearTimeout(q),F!=null&&clearTimeout(F)}),o&&(F=setTimeout(()=>{C.isUnmounted||(O.value=!1)},o)),a!=null&&(q=setTimeout(()=>{if(!C.isUnmounted&&!T.value&&!D.value){let M=new Error(`Async component timed out after ${a}ms.`);E(M),D.value=M}},a)),b().then(()=>{C.isUnmounted||(T.value=!0,C.parent&&Fo(C.parent.vnode)&&C.parent.update())}).catch(M=>{if(C.isUnmounted){v=null;return}E(M),D.value=M}),()=>{if(T.value&&g)return Ro(g,C);if(D.value&&i)return _e(i,{error:D.value});if(s&&!O.value)return Ro(s,C)}}})}function Ro(e,t){let{ref:s,props:i,children:o,ce:r}=t.vnode,a=_e(e,i,o);return a.ref=s,a.ce=r,delete t.vnode.ce,a}var Fo=e=>e.type.__isKeepAlive;function vr(e,t){yr(e,"a",t)}function gr(e,t){yr(e,"da",t)}function yr(e,t,s=nt){let i=e.__wdc||(e.__wdc=()=>{let o=s;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Bo(t,i,s),s){let o=s.parent;for(;o&&o.parent;)Fo(o.parent.vnode)&&Xd(i,t,s,o),o=o.parent}}function Xd(e,t,s,i){let o=Bo(t,e,i,!0);ro(()=>{In(i[t],o)},s)}function Bo(e,t,s=nt,i=!1){if(s){let o=s[e]||(s[e]=[]),r=t.__weh||(t.__weh=(...a)=>{Ot();let c=ao(s),f=wt(t,s,e,a);return c(),Pt(),f});return i?o.unshift(r):o.push(r),r}}var Wt=e=>(t,s=nt)=>{(!Dn||e==="sp")&&Bo(e,(...i)=>t(...i),s)},Zd=Wt("bm"),Mt=Wt("m"),br=Wt("bu"),wr=Wt("u"),ln=Wt("bum"),ro=Wt("um"),xd=Wt("sp"),eu=Wt("rtg"),tu=Wt("rtc");function nu(e,t=nt){Bo("ec",e,t)}var kr="components",ou="directives";function We(e,t){return Er(kr,e,!0,t)||e}var su=Symbol.for("v-ndc");function ye(e){return Er(ou,e)}function Er(e,t,s=!0,i=!1){let o=vt||nt;if(o){let r=o.type;if(e===kr){let c=Bu(r,!1);if(c&&(c===t||c===Je(t)||c===en(Je(t))))return r}let a=Yi(o[e]||r[e],t)||Yi(o.appContext[e],t);return!a&&i?r:a}}function Yi(e,t){return e&&(e[t]||e[Je(t)]||e[en(Je(t))])}function Z(e,t,s,i){let o,r=s&&s[i],a=ve(e);if(a||Be(e)){let c=a&&At(e),f=!1,v=!1;c&&(f=!lt(e),v=bt(e),e=Gn(e)),o=new Array(e.length);for(let g=0,k=e.length;gt(c,f,void 0,r&&r[f]));else{let c=Object.keys(e);o=new Array(c.length);for(let f=0,v=c.length;fe?Hr(e)?jo(e):Vs(e.parent):null;var Zn=Ge(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Vs(e.parent),$root:e=>Vs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Fs(e),$forceUpdate:e=>e.f||(e.f=()=>{Ls(e.update)}),$nextTick:e=>e.n||(e.n=Ye.bind(e.proxy)),$watch:e=>Kd.bind(e)});var Os=(e,t)=>e!==Pe&&!e.__isScriptSetup&&Re(e,t),iu={get({_:e},t){if(t==="__v_skip")return!0;let{ctx:s,setupState:i,data:o,props:r,accessCache:a,type:c,appContext:f}=e;if(t[0]!=="$"){let m=a[t];if(m!==void 0)switch(m){case 1:return i[t];case 2:return o[t];case 4:return s[t];case 3:return r[t]}else{if(Os(i,t))return a[t]=1,i[t];if(o!==Pe&&Re(o,t))return a[t]=2,o[t];if(Re(r,t))return a[t]=3,r[t];if(s!==Pe&&Re(s,t))return a[t]=4,s[t];qs&&(a[t]=0)}}let v=Zn[t],g,k;if(v)return t==="$attrs"&&et(e.attrs,"get",""),v(e);if((g=c.__cssModules)&&(g=g[t]))return g;if(s!==Pe&&Re(s,t))return a[t]=4,s[t];if(k=f.config.globalProperties,Re(k,t))return k[t]},set({_:e},t,s){let{data:i,setupState:o,ctx:r}=e;return Os(o,t)?(o[t]=s,!0):i!==Pe&&Re(i,t)?(i[t]=s,!0):Re(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:i,appContext:o,props:r,type:a}},c){let f;return!!(s[c]||e!==Pe&&c[0]!=="$"&&Re(e,c)||Os(t,c)||Re(r,c)||Re(i,c)||Re(Zn,c)||Re(o.config.globalProperties,c)||(f=a.__cssModules)&&f[c])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:Re(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Qi(e){return ve(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}var qs=!0;function ru(e){let t=Fs(e),s=e.proxy,i=e.ctx;qs=!1,t.beforeCreate&&Ji(t.beforeCreate,e,"bc");let{data:o,computed:r,methods:a,watch:c,provide:f,inject:v,created:g,beforeMount:k,mounted:m,beforeUpdate:b,updated:C,activated:E,deactivated:T,beforeDestroy:D,beforeUnmount:O,destroyed:q,unmounted:F,render:M,renderTracked:z,renderTriggered:se,errorCaptured:oe,serverPrefetch:S,expose:I,inheritAttrs:H,components:K,directives:X,filters:Y}=t;if(v&&au(v,i,null),a)for(let le in a){let re=a[le];be(re)&&(i[le]=re.bind(s))}if(o){let le=o.call(s,s);Ae(le)&&(e.data=ze(le))}if(qs=!0,r)for(let le in r){let re=r[le],Se=be(re)?re.bind(s,s):be(re.get)?re.get.bind(s,s):at,$e=!be(re)&&be(re.set)?re.set.bind(s):at,Ne=ot({get:Se,set:$e});Object.defineProperty(i,le,{enumerable:!0,configurable:!0,get:()=>Ne.value,set:ke=>Ne.value=ke})}if(c)for(let le in c)Cr(c[le],i,s,le);if(f){let le=be(f)?f.call(s):f;Reflect.ownKeys(le).forEach(re=>{an(re,le[re])})}g&&Ji(g,e,"c");function ce(le,re){ve(re)?re.forEach(Se=>le(Se.bind(s))):re&&le(re.bind(s))}if(ce(Zd,k),ce(Mt,m),ce(br,b),ce(wr,C),ce(vr,E),ce(gr,T),ce(nu,oe),ce(tu,z),ce(eu,se),ce(ln,O),ce(ro,F),ce(xd,S),ve(I))if(I.length){let le=e.exposed||(e.exposed={});I.forEach(re=>{Object.defineProperty(le,re,{get:()=>s[re],set:Se=>s[re]=Se,enumerable:!0})})}else e.exposed||(e.exposed={});M&&e.render===at&&(e.render=M),H!=null&&(e.inheritAttrs=H),K&&(e.components=K),X&&(e.directives=X),S&&Us(e)}function au(e,t,s=at){ve(e)&&(e=Ms(e));for(let i in e){let o=e[i],r;Ae(o)?"default"in o?r=ut(o.from||i,o.default,!0):r=ut(o.from||i):r=ut(o),xe(r)?Object.defineProperty(t,i,{enumerable:!0,configurable:!0,get:()=>r.value,set:a=>r.value=a}):t[i]=r}}function Ji(e,t,s){wt(ve(e)?e.map(i=>i.bind(t.proxy)):e.bind(t.proxy),t,s)}function Cr(e,t,s,i){let o=i.includes(".")?fr(s,i):()=>s[i];if(Be(e)){let r=t[e];be(r)&&He(o,r)}else if(be(e))He(o,e.bind(s));else if(Ae(e))if(ve(e))e.forEach(r=>Cr(r,t,s,i));else{let r=be(e.handler)?e.handler.bind(s):t[e.handler];be(r)&&He(o,r,e)}}function Fs(e){let t=e.type,{mixins:s,extends:i}=t,{mixins:o,optionsCache:r,config:{optionMergeStrategies:a}}=e.appContext,c=r.get(t),f;return c?f=c:!o.length&&!s&&!i?f=t:(f={},o.length&&o.forEach(v=>Io(f,v,a,!0)),Io(f,t,a)),Ae(t)&&r.set(t,f),f}function Io(e,t,s,i=!1){let{mixins:o,extends:r}=t;r&&Io(e,r,s,!0),o&&o.forEach(a=>Io(e,a,s,!0));for(let a in t)if(!(i&&a==="expose")){let c=lu[a]||s&&s[a];e[a]=c?c(e[a],t[a]):t[a]}return e}var lu={data:Xi,props:Zi,emits:Zi,methods:Qn,computed:Qn,beforeCreate:st,created:st,beforeMount:st,mounted:st,beforeUpdate:st,updated:st,beforeDestroy:st,beforeUnmount:st,destroyed:st,unmounted:st,activated:st,deactivated:st,errorCaptured:st,serverPrefetch:st,components:Qn,directives:Qn,watch:uu,provide:Xi,inject:du};function Xi(e,t){return t?e?function(){return Ge(be(e)?e.call(this,this):e,be(t)?t.call(this,this):t)}:t:e}function du(e,t){return Qn(Ms(e),Ms(t))}function Ms(e){if(ve(e)){let t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Je(t)}Modifiers`]||e[`${St(t)}Modifiers`];function hu(e,t,...s){if(e.isUnmounted)return;let i=e.vnode.props||Pe,o=s,r=t.startsWith("update:"),a=r&&fu(i,t.slice(7));a&&(a.trim&&(o=s.map(g=>Be(g)?g.trim():g)),a.number&&(o=o.map(wn)));let c,f=i[c=qn(t)]||i[c=qn(Je(t))];!f&&r&&(f=i[c=qn(St(t))]),f&&wt(f,e,6,o);let v=i[c+"Once"];if(v){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,wt(v,e,6,o)}}var mu=new WeakMap;function Sr(e,t,s=!1){let i=s?mu:t.emitsCache,o=i.get(e);if(o!==void 0)return o;let r=e.emits,a={},c=!1;if(!be(e)){let f=v=>{let g=Sr(v,t,!0);g&&(c=!0,Ge(a,g))};!s&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!r&&!c?(Ae(e)&&i.set(e,null),null):(ve(r)?r.forEach(f=>a[f]=null):Ge(a,r),Ae(e)&&i.set(e,a),a)}function zo(e,t){return!e||!vn(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),Re(e,t[0].toLowerCase()+t.slice(1))||Re(e,St(t))||Re(e,t))}function Ps(e){let{type:t,vnode:s,proxy:i,withProxy:o,propsOptions:[r],slots:a,attrs:c,emit:f,render:v,renderCache:g,props:k,data:m,setupState:b,ctx:C,inheritAttrs:E}=e,T=Oo(e),D,O;try{if(s.shapeFlag&4){let M=o||i,z=M;D=qt(v.call(z,M,g,k,b,m,C)),O=c}else{let M=t;D=qt(M.length>1?M(k,{attrs:c,slots:a,emit:f}):M(k,null)),O=t.props?c:vu(c)}}catch(M){rn.length=0,so(M,e,1),D=_e(Gt)}let q=D,F;if(O&&E!==!1){let M=Object.keys(O),{shapeFlag:z}=q;M.length&&z&7&&(r&&M.some(gn)&&(O=gu(O,r)),q=Nn(q,O,!1,!0))}if(s.dirs&&(q=Nn(q,null,!1,!0),q.dirs=q.dirs?q.dirs.concat(s.dirs):s.dirs),s.transition){let M=Lo(q.type)&&hr(q)||q;Uo(M,s.transition)}return D=q,Oo(T),D}var vu=e=>{let t;for(let s in e)(s==="class"||s==="style"||vn(s))&&((t||(t={}))[s]=e[s]);return t},gu=(e,t)=>{let s={};for(let i in e)(!gn(i)||!(i.slice(9)in t))&&(s[i]=e[i]);return s};function yu(e,t,s){let{props:i,children:o,component:r}=e,{props:a,children:c,patchFlag:f}=t,v=r.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&f>=0){if(f&1024)return!0;if(f&16)return i?xi(i,a,v):!!a;if(f&8){let g=t.dynamicProps;for(let k=0;kObject.create(Dr),Tr=e=>Object.getPrototypeOf(e)===Dr;function wu(e,t,s,i=!1){let o={},r=Rr();e.propsDefaults=Object.create(null),Ar(e,t,o,r);for(let a in e.propsOptions[0])a in o||(o[a]=void 0);s?e.props=i?o:Wn(o):e.type.props?e.props=o:e.props=r,e.attrs=r}function ku(e,t,s,i){let{props:o,attrs:r,vnode:{patchFlag:a}}=e,c=Te(o),[f]=e.propsOptions,v=!1;if((i||a>0)&&!(a&16)){if(a&8){let g=e.vnode.dynamicProps;for(let k=0;k{f=!0;let[m,b]=Or(k,t,!0);Ge(a,m),b&&c.push(...b)};!s&&t.mixins.length&&t.mixins.forEach(g),e.extends&&g(e.extends),e.mixins&&e.mixins.forEach(g)}if(!r&&!f)return Ae(e)&&i.set(e,Xt),Xt;if(ve(r))for(let g=0;ge==="_"||e==="_ctx"||e==="$stable",zs=e=>ve(e)?e.map(qt):[qt(e)],Cu=(e,t,s)=>{if(t._n)return t;let i=jd((...o)=>zs(t(...o)),s);return i._c=!1,i},Pr=(e,t,s)=>{let i=e._ctx;for(let o in e){if(Bs(o))continue;let r=e[o];if(be(r))t[o]=Cu(o,r,i);else if(r!=null){let a=zs(r);t[o]=()=>a}}},Ir=(e,t)=>{let s=zs(t);e.slots.default=()=>s},Vr=(e,t,s)=>{for(let i in t)(s||!Bs(i))&&(e[i]=t[i])},_u=(e,t,s)=>{let i=e.slots=Rr();if(e.vnode.shapeFlag&32){let o=t._;o?(Vr(i,t,s),s&&go(i,"_",o,!0)):Pr(t,i)}else t&&Ir(e,t)},Su=(e,t,s)=>{let{vnode:i,slots:o}=e,r=!0,a=Pe;if(i.shapeFlag&32){let c=t._;c?s&&c===1?r=!1:Vr(o,t,s):(r=!t.$stable,Pr(t,o)),a=t}else t&&(Ir(e,t),a={default:1});if(r)for(let c in o)!Bs(c)&&a[c]==null&&delete o[c]};function Nu(){let e=[]}var dt=Au;function qr(e){return Du(e)}function Du(e,t){Nu();let s=Mn();s.__VUE__=!0;let{insert:i,remove:o,patchProp:r,createElement:a,createText:c,createComment:f,setText:v,setElementText:g,parentNode:k,nextSibling:m,setScopeId:b=at,insertStaticContent:C}=e,E=(h,w,R,P=null,L=null,V=null,B=void 0,Q=null,J=!!w.dynamicChildren)=>{if(h===w)return;h&&!Yn(h,w)&&(P=ne(h),Ee(h,L,V,!0),h=null),w.patchFlag===-2&&(J=!1,w.dynamicChildren=null),w.dynamicChildren&&h&&h.dynamicChildren&&h.dynamicChildren.hasOnce&&(w.dynamicChildren===Xt&&(w.dynamicChildren=[]),w.dynamicChildren.hasOnce=!0);let{type:j,ref:de,shapeFlag:te}=w;switch(j){case Ho:T(h,w,R,P);break;case Gt:D(h,w,R,P);break;case xn:h==null&&O(w,R,P,B);break;case W:X(h,w,R,P,L,V,B,Q,J);break;default:te&1?z(h,w,R,P,L,V,B,Q,J):te&6?Y(h,w,R,P,L,V,B,Q,J):(te&64||te&128)&&j.process(h,w,R,P,L,V,B,Q,J,ge)}de!=null&&L?Jn(de,h&&h.ref,V,w||h,!w):de==null&&h&&h.ref!=null&&Jn(h.ref,null,V,h,!0)},T=(h,w,R,P)=>{if(h==null)i(w.el=c(w.children),R,P);else{let L=w.el=h.el;w.children!==h.children&&v(L,w.children)}},D=(h,w,R,P)=>{h==null?i(w.el=f(w.children||""),R,P):w.el=h.el},O=(h,w,R,P)=>{[h.el,h.anchor]=C(h.children,w,R,P,h.el,h.anchor)},q=(h,w,R,P)=>{if(w.children!==h.children){let L=m(h.anchor);M(h),[w.el,w.anchor]=C(w.children,R,L,P)}else w.el=h.el,w.anchor=h.anchor},F=({el:h,anchor:w},R,P)=>{let L;for(;h&&h!==w;)L=m(h),i(h,R,P),h=L;i(w,R,P)},M=({el:h,anchor:w})=>{let R;for(;h&&h!==w;)R=m(h),o(h),h=R;o(w)},z=(h,w,R,P,L,V,B,Q,J)=>{if(w.type==="svg"?B="svg":w.type==="math"&&(B="mathml"),h==null)se(w,R,P,L,V,B,Q,J);else{let j=h.el&&h.el._isVueCE?h.el:null;try{j&&j._beginPatch(),I(h,w,L,V,B,Q,J)}finally{j&&j._endPatch()}}},se=(h,w,R,P,L,V,B,Q)=>{let J,j,{props:de,shapeFlag:te,transition:ae,dirs:me}=h;if(J=h.el=a(h.type,V,de&&de.is,de),te&8?g(J,h.children):te&16&&S(h.children,J,null,P,L,Is(h,V),B,Q),me&&on(h,null,P,"created"),oe(J,h,h.scopeId,B,P),de){for(let Me in de)Me!=="value"&&!yn(Me)&&r(J,Me,null,de[Me],V,P);"value"in de&&r(J,"value",null,de.value,V),(j=de.onVnodeBeforeMount)&&It(j,P,h)}me&&on(h,null,P,"beforeMount");let De=Ru(L,ae);De&&ae.beforeEnter(J),i(J,w,R),((j=de&&de.onVnodeMounted)||De||me)&&dt(()=>{let Ie;j&&It(j,P,h),De&&ae.enter(J),me&&on(h,null,P,"mounted")},L)},oe=(h,w,R,P,L)=>{if(R&&b(h,R),P)for(let V=0;V{for(let j=J;j{let Q=w.el=h.el,{patchFlag:J,dynamicChildren:j,dirs:de}=w;J|=h.patchFlag&16;let te=h.props||Pe,ae=w.props||Pe,me;if(R&&sn(R,!1),(me=ae.onVnodeBeforeUpdate)&&It(me,R,w,h),de&&on(w,h,R,"beforeUpdate"),R&&sn(R,!0),j&&(!h.dynamicChildren||h.dynamicChildren.length!==j.length)&&(J=0,B=!1,j=null),(te.innerHTML&&ae.innerHTML==null||te.textContent&&ae.textContent==null)&&g(Q,""),j?H(h.dynamicChildren,j,Q,R,P,Is(w,L),V):B||Se(h,w,Q,null,R,P,Is(w,L),V,!1),J>0){if(J&16)K(Q,te,ae,R,L);else if(J&2&&te.class!==ae.class&&r(Q,"class",null,ae.class,L),J&4&&r(Q,"style",te.style,ae.style,L),J&8){let De=w.dynamicProps;for(let Me=0;Me{me&&It(me,R,w,h),de&&on(w,h,R,"updated")},P)},H=(h,w,R,P,L,V,B)=>{for(let Q=0;Q{if(w!==R){if(w!==Pe)for(let V in w)!yn(V)&&!(V in R)&&r(h,V,w[V],null,L,P);for(let V in R){if(yn(V))continue;let B=R[V],Q=w[V];B!==Q&&V!=="value"&&r(h,V,Q,B,L,P)}"value"in R&&r(h,"value",w.value,R.value,L)}},X=(h,w,R,P,L,V,B,Q,J)=>{let j=w.el=h?h.el:c(""),de=w.anchor=h?h.anchor:c(""),{patchFlag:te,dynamicChildren:ae,slotScopeIds:me}=w;me&&(Q=Q?Q.concat(me):me),h==null?(i(j,R,P),i(de,R,P),S(w.children||[],R,de,L,V,B,Q,J)):te>0&&te&64&&ae&&h.dynamicChildren&&h.dynamicChildren.length===ae.length?(H(h.dynamicChildren,ae,R,L,V,B,Q),(w.key!=null||L&&w===L.subTree)&&Mr(h,w,!0)):Se(h,w,R,de,L,V,B,Q,J)},Y=(h,w,R,P,L,V,B,Q,J)=>{w.slotScopeIds=Q,h==null?w.shapeFlag&512?L.ctx.activate(w,R,P,B,J):ee(w,R,P,L,V,B,J):ce(h,w,J)},ee=(h,w,R,P,L,V,B)=>{let Q=h.component=Mu(h,P,L);if(Fo(h)&&(Q.ctx.renderer=ge),$u(Q,!1,B),Q.asyncDep){if(L&&L.registerDep(Q,le,B),!h.el){let J=Q.subTree=_e(Gt);D(null,J,w,R),h.placeholder=J.el}}else le(Q,h,w,R,L,V,B)},ce=(h,w,R)=>{let P=w.component=h.component;if(yu(h,w,R))if(P.asyncDep&&!P.asyncResolved){w.el=h.el,re(P,w,R);return}else P.next=w,P.update();else w.el=h.el,P.vnode=w},le=(h,w,R,P,L,V,B)=>{let Q=()=>{if(h.isMounted){let{next:te,bu:ae,u:me,parent:De,vnode:Me}=h;{let pt=$r(h);if(pt){te&&(te.el=Me.el,re(h,te,B)),pt.asyncDep.then(()=>{dt(()=>{h.isUnmounted||j()},L)});return}}let Ie=te,Ke;sn(h,!1),te?(te.el=Me.el,re(h,te,B)):te=Me,ae&&bn(ae),(Ke=te.props&&te.props.onVnodeBeforeUpdate)&&It(Ke,De,te,Me),sn(h,!0);let Qe=Ps(h),Et=h.subTree;h.subTree=Qe,E(Et,Qe,k(Et.el),ne(Et),h,L,V),te.el=Qe.el,Ie===null&&bu(h,Qe.el),me&&dt(me,L),(Ke=te.props&&te.props.onVnodeUpdated)&&dt(()=>It(Ke,De,te,Me),L)}else{let te,{el:ae,props:me}=w,{bm:De,m:Me,parent:Ie,root:Ke,type:Qe}=h,Et=Xn(w);if(sn(h,!1),De&&bn(De),!Et&&(te=me&&me.onVnodeBeforeMount)&&It(te,Ie,w),sn(h,!0),ae&&_){let pt=()=>{h.subTree=Ps(h),_(ae,h.subTree,h,L,null)};Et&&Qe.__asyncHydrate?Qe.__asyncHydrate(ae,h,pt):pt()}else{Ke.ce&&Ke.ce._hasShadowRoot()&&Ke.ce._injectChildStyle(Qe,h.parent?h.parent.type:void 0);let pt=h.subTree=Ps(h);E(null,pt,R,P,h,L,V),w.el=pt.el}if(Me&&dt(Me,L),!Et&&(te=me&&me.onVnodeMounted)){let pt=w;dt(()=>It(te,Ie,pt),L)}(w.shapeFlag&256||Ie&&Xn(Ie.vnode)&&Ie.vnode.shapeFlag&256)&&h.a&&dt(h.a,L),h.isMounted=!0,w=R=P=null}};h.scope.on();let J=h.effect=new En(Q);h.scope.off();let j=h.update=J.run.bind(J),de=h.job=J.runIfDirty.bind(J);de.i=h,de.id=h.uid,J.scheduler=()=>Ls(de),sn(h,!0),j()},re=(h,w,R)=>{w.component=h;let P=h.vnode.props;h.vnode=w,h.next=null,ku(h,w.props,P,R),Su(h,w.children,R),Ot(),ji(h),Pt()},Se=(h,w,R,P,L,V,B,Q,J=!1)=>{let j=h&&h.children,de=h?h.shapeFlag:0,te=w.children,{patchFlag:ae,shapeFlag:me}=w;if(ae>0){if(ae&128){Ne(j,te,R,P,L,V,B,Q,J);return}else if(ae&256){$e(j,te,R,P,L,V,B,Q,J);return}}me&8?(de&16&&U(j,L,V),te!==j&&g(R,te)):de&16?me&16?Ne(j,te,R,P,L,V,B,Q,J):U(j,L,V,!0):(de&8&&g(R,""),me&16&&S(te,R,P,L,V,B,Q,J))},$e=(h,w,R,P,L,V,B,Q,J)=>{h=h||Xt,w=w||Xt;let j=h.length,de=w.length,te=Math.min(j,de),ae;for(ae=0;aede?U(h,L,V,!0,!1,te):S(w,R,P,L,V,B,Q,J,te)},Ne=(h,w,R,P,L,V,B,Q,J)=>{let j=0,de=w.length,te=h.length-1,ae=de-1;for(;j<=te&&j<=ae;){let me=h[j],De=w[j]=J?jt(w[j]):qt(w[j]);if(Yn(me,De))E(me,De,R,null,L,V,B,Q,J);else break;j++}for(;j<=te&&j<=ae;){let me=h[te],De=w[ae]=J?jt(w[ae]):qt(w[ae]);if(Yn(me,De))E(me,De,R,null,L,V,B,Q,J);else break;te--,ae--}if(j>te){if(j<=ae){let me=ae+1,De=meae)for(;j<=te;)Ee(h[j],L,V,!0),j++;else{let me=j,De=j,Me=new Map;for(j=De;j<=ae;j++){let ft=w[j]=J?jt(w[j]):qt(w[j]);ft.key!=null&&Me.set(ft.key,j)}let Ie,Ke=0,Qe=ae-De+1,Et=!1,pt=0,Pn=new Array(Qe);for(j=0;j=Qe){Ee(ft,L,V,!0);continue}let _t;if(ft.key!=null)_t=Me.get(ft.key);else for(Ie=De;Ie<=ae;Ie++)if(Pn[Ie-De]===0&&Yn(ft,w[Ie])){_t=Ie;break}_t===void 0?Ee(ft,L,V,!0):(Pn[_t-De]=j+1,_t>=pt?pt=_t:Et=!0,E(ft,w[_t],R,null,L,V,B,Q,J),Ke++)}let pi=Et?Tu(Pn):Xt;for(Ie=pi.length-1,j=Qe-1;j>=0;j--){let ft=De+j,_t=w[ft],fi=w[ft+1],hi=ft+1{let{el:V,type:B,transition:Q,children:J,shapeFlag:j}=h;if(j&6){ke(h.component.subTree,w,R,P);return}if(j&128){h.suspense.move(w,R,P);return}if(j&64){B.move(h,w,R,ge);return}if(B===W){i(V,w,R);for(let te=0;teQ.enter(V),L));else{let{leave:te,delayLeave:ae,afterLeave:me}=Q,De=()=>{h.ctx.isUnmounted?o(V):i(V,w,R)},Me=()=>{let Ie=V._isLeaving||!!V[As];V._isLeaving&&V[As](!0),Q.persisted&&!Ie?De():te(V,()=>{De(),me&&me()})};ae?ae(V,De,Me):Me()}else i(V,w,R)},Ee=(h,w,R,P=!1,L=!1)=>{let{type:V,props:B,ref:Q,children:J,dynamicChildren:j,shapeFlag:de,patchFlag:te,dirs:ae,cacheIndex:me,memo:De}=h;if((te===-2||j&&j.hasOnce)&&(L=!1),Q!=null&&(Ot(),Jn(Q,null,R,h,!0),Pt()),me!=null&&(!h.ctx||h.ctx===w)&&(w.renderCache[me]=void 0),de&256){w.ctx.deactivate(h);return}let Me=de&1&&ae,Ie=!Xn(h),Ke;if(Ie&&(Ke=B&&B.onVnodeBeforeUnmount)&&It(Ke,w,h),de&6)Ue(h.component,R,P);else{if(de&128){h.suspense.unmount(R,P);return}Me&&on(h,null,w,"beforeUnmount"),de&64?h.type.remove(h,w,R,ge,P):j&&!j.hasOnce&&(V!==W||te>0&&te&64)?U(j,w,R,!1,!0):(V===W&&te&384||!L&&de&16)&&U(J,w,R),P&&Le(h)}let Qe=De!=null&&me==null;(Ie&&(Ke=B&&B.onVnodeUnmounted)||Me||Qe)&&dt(()=>{Ke&&It(Ke,w,h),Me&&on(h,null,w,"unmounted"),Qe&&(h.el=null)},R)},Le=h=>{let{type:w,el:R,anchor:P,transition:L}=h;if(w===W){qe(R,P);return}if(w===xn){M(h),L&&!L.persisted&&L.afterLeave&&L.afterLeave();return}let V=()=>{o(R),L&&!L.persisted&&L.afterLeave&&L.afterLeave()};if(h.shapeFlag&1&&L&&!L.persisted){let{leave:B,delayLeave:Q}=L,J=()=>B(R,V);Q?Q(h.el,V,J):J()}else V()},qe=(h,w)=>{let R;for(;h!==w;)R=m(h),o(h),h=R;o(w)},Ue=(h,w,R)=>{let{bum:P,scope:L,job:V,subTree:B,um:Q,m:J,a:j}=h;tr(J),tr(j),P&&bn(P),L.stop(),V?(V.flags|=8,Ee(B,h,w,R)):h.vnode.el&&B&&(B.transition=h.vnode.transition,Ee(B,h,w,R)),Q&&dt(Q,w),dt(()=>{h.isUnmounted=!0},w)},U=(h,w,R,P=!1,L=!1,V=0)=>{for(let B=V;B{if(h.shapeFlag&6)return ne(h.component.subTree);if(h.shapeFlag&128)return h.suspense.next();let w=m(h.anchor||h.el),R=w&&w[Yd];return R?m(R):w},x=!1,ie=(h,w,R)=>{let P;h==null?w._vnode&&(Ee(w._vnode,null,null,!0),P=w._vnode.component):E(w._vnode||null,h,w,null,null,null,R),w._vnode=h,x||(x=!0,ji(P),dr(),x=!1)},ge={p:E,um:Ee,m:ke,r:Le,mt:ee,mc:S,pc:Se,pbc:H,n:ne,o:e},Ce,_;return t&&([Ce,_]=t(ge)),{render:ie,hydrate:Ce,createApp:pu(ie,Ce)}}function Is({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function sn({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ru(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Mr(e,t,s=!1){let i=e.children,o=t.children;if(ve(i)&&ve(o))for(let r=0;r>1,e[s[c]]0&&(t[i]=s[r-1]),s[r]=i)}}for(r=s.length,a=s[r-1];r-- >0;)s[r]=a,a=t[a];return s}function $r(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:$r(t)}function tr(e){if(e)for(let t=0;te.__isSuspense;function Au(e,t){t&&t.pendingBranch?ve(e)?t.effects.push(...e):t.effects.push(e):lr(e)}var W=Symbol.for("v-fgt"),Ho=Symbol.for("v-txt"),Gt=Symbol.for("v-cmt"),xn=Symbol.for("v-stc"),rn=[],gt=null;function l(e=!1){rn.push(gt=e?null:[])}function Fr(){rn.pop(),gt=rn[rn.length-1]||null}var to=1;function Vo(e,t=!1){to+=e,e<0&>&&t&&(gt.hasOnce=!0)}function Br(e){return e.dynamicChildren=to>0?gt||Xt:null,Fr(),to>0&>&>.push(e),e}function d(e,t,s,i,o,r){return Br(n(e,t,s,i,o,r,!0))}function $t(e,t,s,i,o){return Br(_e(e,t,s,i,o,!0))}function qo(e){return e?e.__v_isVNode===!0:!1}function Yn(e,t){return e.type===t.type&&e.key===t.key}var zr=({key:e})=>e??null,To=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Be(e)||xe(e)||be(e)?{i:vt,r:e,k:t,f:!!s}:e:null);function n(e,t=null,s=null,i=0,o=null,r=e===W?0:1,a=!1,c=!1){let f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&zr(t),ref:t&&To(t),scopeId:cr,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:i,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:vt};return c?(Mo(f,s),r&128&&e.normalize(f)):s&&(f.shapeFlag|=Be(s)?8:16),to>0&&!a&>&&(f.patchFlag>0||r&6)&&f.patchFlag!==32&>.push(f),f}var _e=Ou;function Ou(e,t=null,s=null,i=0,o=null,r=!1){if((!e||e===su)&&(e=Gt),qo(e)){let c=Nn(e,t,!0);return s&&Mo(c,s),to>0&&!r&>&&(c.shapeFlag&6?gt[gt.indexOf(e)]=c:gt.push(c)),c.patchFlag=-2,c}if(zu(e)&&(e=e.__vccOpts),t){t=Pu(t);let{class:c,style:f}=t;c&&!Be(c)&&(t.class=A(c)),Ae(f)&&(Kn(f)&&!ve(f)&&(f=Ge({},f)),t.style=Ve(f))}let a=Be(e)?1:Ur(e)?128:Lo(e)?64:Ae(e)?4:be(e)?2:0;return n(e,t,s,i,o,a,r,!0)}function Pu(e){return e?Kn(e)||Tr(e)?Ge({},e):e:null}function Nn(e,t,s=!1,i=!1){let{props:o,ref:r,patchFlag:a,children:c,transition:f}=e,v=t?Iu(o||{},t):o,g={__v_isVNode:!0,__v_skip:!0,type:e.type,props:v,key:v&&zr(v),ref:t&&t.ref?s&&r?ve(r)?r.concat(To(t)):[r,To(t)]:To(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:c,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==W?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Nn(e.ssContent),ssFallback:e.ssFallback&&Nn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return f&&i&&Uo(g,f.clone(g)),g}function y(e=" ",t=0){return _e(Ho,null,e,t)}function pe(e,t){let s=_e(xn,null,e);return s.staticCount=t,s}function p(e="",t=!1){return t?(l(),$t(Gt,null,e)):_e(Gt,null,e)}function qt(e){return e==null||typeof e=="boolean"?_e(Gt):ve(e)?_e(W,null,e.slice()):qo(e)?jt(e):_e(Ho,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Nn(e)}function Mo(e,t){let s=0,{shapeFlag:i}=e;if(t==null)t=null;else if(ve(t))s=16;else if(typeof t=="object")if(i&65){let o=t.default;o&&(o._c&&(o._d=!1),Mo(e,o()),o._c&&(o._d=!0));return}else{s=32;let o=t._;!o&&!Tr(t)?t._ctx=vt:o===3&&vt&&(vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(be(t)){if(i&65){Mo(e,{default:t});return}t={default:t,_ctx:vt},s=32}else t=String(t),i&64?(s=16,t=[y(t)]):s=8;e.children=t,e.shapeFlag|=s}function Iu(...e){let t={};for(let s=0;snt||vt,$o,no;{let e=Mn(),t=(s,i)=>{let o;return(o=e[s])||(o=e[s]=[]),o.push(i),r=>{o.length>1?o.forEach(a=>a(r)):o[0](r)}};$o=t("__VUE_INSTANCE_SETTERS__",s=>nt=s),no=t("__VUE_SSR_SETTERS__",s=>Dn=s)}var ao=e=>{let t=nt;return $o(e),e.scope.on(),()=>{e.scope.off(),$o(t)}},nr=()=>{nt&&nt.scope.off(),$o(null)};function Hr(e){return e.vnode.shapeFlag&4}var Dn=!1;function $u(e,t=!1,s=!1){t&&no(t);let{props:i,children:o}=e.vnode,r=Hr(e);wu(e,i,r,t),_u(e,o,s||t);let a=r?Lu(e,t):void 0;return t&&no(!1),a}function Lu(e,t){let s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,iu);let{setup:i}=s;if(i){Ot();let o=e.setupContext=i.length>1?Fu(e):null,r=ao(e),a=oo(i,e,0,[e.props,o]),c=cs(a);if(Pt(),r(),(c||e.sp)&&!Xn(e)&&Us(e),c){if(a.then(nr,nr),t)return a.then(f=>{no(!0);try{or(e,f,t)}finally{no(!1)}}).catch(f=>{so(f,e,0)});e.asyncDep=a}else or(e,a,t)}else jr(e,t)}function or(e,t,s){be(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ae(t)&&(e.setupState=Do(t)),jr(e,s)}var sr,ir;function jr(e,t,s){let i=e.type;if(!e.render){if(!t&&sr&&!i.render){let o=i.template||Fs(e).template;if(o){let{isCustomElement:r,compilerOptions:a}=e.appContext.config,{delimiters:c,compilerOptions:f}=i,v=Ge(Ge({isCustomElement:r,delimiters:c},a),f);i.render=sr(o,v)}}e.render=i.render||at,ir&&ir(e)}{let o=ao(e);Ot();try{ru(e)}finally{Pt(),o()}}}var Uu={get(e,t){return et(e,"get",""),e[t]}};function Fu(e){let t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Uu),slots:e.slots,emit:e.emit,expose:t}}function jo(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Do(Ts(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in Zn)return Zn[s](e)},has(t,s){return s in t||s in Zn}})):e.proxy}function Bu(e,t=!0){return be(e)?e.displayName||e.name:e.name||t&&e.__name}function zu(e){return be(e)&&"__vccOpts"in e}var ot=(e,t)=>Bi(e,t,Dn);function we(e,t,s){try{Vo(-1);let i=arguments.length;return i===2?Ae(t)&&!ve(t)?qo(t)?_e(e,null,[t]):_e(e,t):_e(e,null,t):(i>3?s=Array.prototype.slice.call(arguments,2):i===3&&qo(s)&&(s=[s]),_e(e,t,s))}finally{Vo(1)}}var Hu="3.5.43";var Ks,Gr=typeof window<"u"&&window.trustedTypes;if(Gr)try{Ks=Gr.createPolicy("vue",{createHTML:e=>e})}catch{}var na=Ks?e=>Ks.createHTML(e):e=>e,ju="http://www.w3.org/2000/svg",Gu="http://www.w3.org/1998/Math/MathML",Kt=typeof document<"u"?document:null,Wr=Kt&&Kt.createElement("template"),Wu={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,i)=>{let o=t==="svg"?Kt.createElementNS(ju,e):t==="mathml"?Kt.createElementNS(Gu,e):s?Kt.createElement(e,{is:s}):Kt.createElement(e);return e==="select"&&i&&i.multiple!=null&&o.setAttribute("multiple",i.multiple),o},createText:e=>Kt.createTextNode(e),createComment:e=>Kt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Kt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,i,o,r){let a=s?s.previousSibling:t.lastChild;if(o&&(o===r||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),s),!(o===r||!(o=o.nextSibling)););else{Wr.innerHTML=na(i==="svg"?`${e}`:i==="mathml"?`${e}`:e);let c=Wr.content;if(i==="svg"||i==="mathml"){let f=c.firstChild;for(;f.firstChild;)c.appendChild(f.firstChild);c.removeChild(f)}t.insertBefore(c,s)}return[a?a.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}};var Ku=Symbol("_vtc");function Yu(e,t,s){let i=e[Ku];i&&(t=(t?[t,...i]:[...i]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}var Ko=Symbol("_vod"),oa=Symbol("_vsh"),G={name:"show",beforeMount(e,{value:t},{transition:s}){e[Ko]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):lo(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:i}){!t!=!s&&(i?t?(i.beforeEnter(e),lo(e,!0),i.enter(e)):i.leave(e,()=>{lo(e,!1)}):lo(e,t))},beforeUnmount(e,{value:t}){lo(e,t)}};function lo(e,t){e.style.display=t?e[Ko]:"none",e[oa]=!t}var Qu=Symbol("");var Ju=/(?:^|;)\s*display\s*:/;function Xu(e,t,s){let i=e.style,o=Be(s),r=!1;if(s&&!o){if(t)if(Be(t))for(let a of t.split(";")){let c=a.slice(0,a.indexOf(":")).trim();s[c]==null&&uo(i,c,"")}else for(let a in t)s[a]==null&&uo(i,a,"");for(let a in s){a==="display"&&(r=!0);let c=s[a];c!=null?xu(e,a,!Be(t)&&t?t[a]:void 0,c)||uo(i,a,c):uo(i,a,"")}}else if(o){if(t!==s){let a=i[Qu];a&&(s+=";"+a),i.cssText=s,r=Ju.test(s)}}else t&&e.removeAttribute("style");Ko in e&&(e[Ko]=r?i.display:"",e[oa]&&(i.display="none"))}var Go=/\s*!important$/;function uo(e,t,s){if(ve(s))s.forEach(i=>uo(e,t,i));else if(s==null&&(s=""),t.startsWith("--"))Go.test(s)?e.setProperty(t,s.replace(Go,""),"important"):e.setProperty(t,s);else{let i=Zu(e,t);Go.test(s)?e.setProperty(St(i),s.replace(Go,""),"important"):e[i]=s}}var Kr=["Webkit","Moz","ms"],js={};function Zu(e,t){let s=js[t];if(s)return s;let i=Je(t);if(i!=="filter"&&i in e)return js[t]=i;i=en(i);for(let o=0;oGs||(ic.then(()=>Gs=0),Gs=Date.now());function ac(e,t){let s=i=>{if(!i._vts)i._vts=Date.now();else if(i._vts<=s.attached)return;let o=s.value;if(ve(o)){let r=i.stopImmediatePropagation;i.stopImmediatePropagation=()=>{r.call(i),i._stopped=!0};let a=o.slice(),c=[i];for(let f=0;fe.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,lc=(e,t,s,i,o,r)=>{let a=o==="svg";t==="class"?Yu(e,i,a):t==="style"?Xu(e,s,i):vn(t)?gn(t)||tc(e,t,s,i,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):dc(e,t,i,a))?(Jr(e,t,i),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Qr(e,t,i,a,r,t!=="value")):e._isVueCE&&(uc(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!Be(i)))?Jr(e,Je(t),i,r,t):(t==="true-value"?e._trueValue=i:t==="false-value"&&(e._falseValue=i),Qr(e,t,i,a))};function dc(e,t,s,i){if(i)return!!(t==="innerHTML"||t==="textContent"||t in e&&Zr(t)&&be(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){let o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Zr(t)&&Be(s)?!1:t in e}function uc(e,t){let s=e._def.props;if(!s)return!1;let i=Je(t);return Array.isArray(s)?s.some(o=>Je(o)===i):Object.keys(s).some(o=>Je(o)===i)}var Yo=e=>{let t=e.props["onUpdate:modelValue"]||!1;return ve(t)?s=>bn(t,s):t};function cc(e){e.target.composing=!0}function xr(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}var un=Symbol("_assign"),Wo=Symbol("_initialValue");function Ws(e,t,s){return t&&(e=e.trim()),s&&(e=wn(e)),e}var co={created(e,{modifiers:{lazy:t,trim:s,number:i}},o){e.parentNode&&(e.type==="text"?e[Wo]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[Wo]=e.defaultValue.replace(/\r\n?/g,` +`))),e[un]=Yo(o);let r=i||o.props&&o.props.type==="number";dn(e,t?"change":"input",a=>{a.target.composing||e[un](Ws(e.value,s,r))}),(s||r)&&dn(e,"change",()=>{e.value=Ws(e.value,s,r)}),t||(dn(e,"compositionstart",cc),dn(e,"compositionend",xr),dn(e,"change",xr))},mounted(e,{value:t,modifiers:{trim:s,number:i}}){let o=t??"",r=e[Wo];delete e[Wo],r!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==r?e[un](Ws(e.value,s,i)):e.value=o},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:i,trim:o,number:r}},a){if(e[un]=Yo(a),e.composing)return;let c=(r||e.type==="number")&&!/^0\d/.test(e.value)?wn(e.value):e.value,f=t??"";if(c===f)return;let v=e.getRootNode();(v instanceof Document||v instanceof ShadowRoot)&&v.activeElement===e&&e.type!=="range"&&(i&&t===s||o&&e.value.trim()===f)||(e.value=f)}};var Jo={deep:!0,created(e,{value:t,modifiers:{number:s}},i){e._modelValue=t,dn(e,"change",()=>{let o=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>s?wn(Qo(f)):Qo(f)),r=e.multiple,a=r?Ft(e._modelValue)?new Set(o):o:o[0],c=e._pendingValue=[r,r?ve(a)?o.slice():o:a];try{e[un](a)}finally{Ye(()=>{e._pendingValue===c&&(e._pendingValue=void 0)})}}),e[un]=Yo(i)},mounted(e,{value:t}){ea(e,t)},beforeUpdate(e,{value:t},s){e._modelValue=t,e[un]=Yo(s)},updated(e,{value:t}){let s=e._pendingValue;e._pendingValue=void 0,(!s||s[0]!==e.multiple||!pc(t,s[1],s[0]))&&ea(e,t)}};function pc(e,t,s){if(!s)return Nt(e,t);if(ve(e))return Nt(e,t);if(Ft(e)){if(e.size!==t.length)return!1;for(let i of t)if(!e.has(i))return!1;return!0}return!1}function ea(e,t){let s=e.multiple,i=ve(t);if(!(s&&!i&&!Ft(t))){for(let o=0,r=e.options.length;oString(v)===String(c)):a.selected=Ci(t,c)>-1}else a.selected=t.has(c);else if(Nt(Qo(a),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Qo(e){return"_value"in e?e._value:e.value}var fc=["ctrl","shift","alt","meta"],hc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>fc.some(s=>e[`${s}Key`]&&!t.includes(s))},ue=(e,t)=>{if(!e)return e;let s=e._withMods||(e._withMods={}),i=t.join(".");return s[i]||(s[i]=((o,...r)=>{for(let a=0;a{let s=e._withKeys||(e._withKeys={}),i=t.join(".");return s[i]||(s[i]=(o=>{if(!("key"in o))return;let r=St(o.key);if(t.some(a=>a===r||mc[a]===r))return e(o)}))},vc=Ge({patchProp:lc},Wu),ta;function gc(){return ta||(ta=qr(vc))}var sa=((...e)=>{let t=gc().createApp(...e),{mount:s}=t;return t.mount=i=>{let o=bc(i);if(!o)return;let r=t._component;!be(r)&&!r.render&&!r.template&&(r.template=o.innerHTML),o.nodeType===1&&(o.textContent="");let a=s(o,!1,yc(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),a},t});function yc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function bc(e){return Be(e)?document.querySelector(e):e}var fn=typeof document<"u";function ra(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function wc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&ra(e.default)}var Oe=Object.assign;function Xo(e,t){let s={};for(let i in t){let o=t[i];s[i]=kt(o)?o.map(e):e(o)}return s}var An=()=>{},kt=Array.isArray;function Js(e,t){let s={};for(let i in e)s[i]=i in t?t[i]:e[i];return s}var aa=/#/g,kc=/&/g,Ec=/\//g,Cc=/=/g,_c=/\?/g,la=/\+/g,Sc=/%5B/g,Nc=/%5D/g,da=/%5E/g,Dc=/%60/g,ua=/%7B/g,Rc=/%7C/g,ca=/%7D/g,Tc=/%20/g;function Xs(e){return e==null?"":encodeURI(""+e).replace(Rc,"|").replace(Sc,"[").replace(Nc,"]")}function pa(e){return Xs(e).replace(ua,"{").replace(ca,"}").replace(da,"^")}function Ys(e){return Xs(e).replace(la,"%2B").replace(Tc,"+").replace(aa,"%23").replace(kc,"%26").replace(Dc,"`").replace(ua,"{").replace(ca,"}").replace(da,"^")}function Ac(e){return Ys(e).replace(Cc,"%3D")}function Oc(e){return Xs(e).replace(aa,"%23").replace(_c,"%3F")}function fa(e){return Oc(e).replace(Ec,"%2F")}function Tn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}var Pc=/\/$/,Ic=e=>e.replace(Pc,"");function Zo(e,t,s="/"){let i,o={},r="",a="",c=t.indexOf("#"),f=t.indexOf("?");return f=c>=0&&f>c?-1:f,f>=0&&(i=t.slice(0,f),r=t.slice(f,c>0?c:t.length),o=e(r.slice(1))),c>=0&&(i=i||t.slice(0,c),a=t.slice(c,t.length)),i=qc(i??t,s),{fullPath:i+r+a,path:i,query:o,hash:Tn(a)}}function ha(e,t){let s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function Zs(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function ma(e,t,s){let i=t.matched.length-1,o=s.matched.length-1;return i>-1&&i===o&&cn(t.matched[i],s.matched[o])&&xs(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function cn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function xs(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var s in e)if(!Vc(e[s],t[s]))return!1;return!0}function Vc(e,t){return kt(e)?ia(e,t):kt(t)?ia(t,e):e?.valueOf()===t?.valueOf()}function ia(e,t){return kt(t)?e.length===t.length&&e.every((s,i)=>s===t[i]):e.length===1&&e[0]===t}function qc(e,t){if(e.startsWith("/"))return e;if(!e)return t;let s=t.split("/"),i=e.split("/"),o=i[i.length-1];(o===".."||o===".")&&i.push("");let r=s.length-1,a,c;for(a=0;a1&&r--;else break;return s.slice(0,r).join("/")+"/"+i.slice(a).join("/")}var Qt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},xo=(function(e){return e.pop="pop",e.push="push",e})({}),es=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function va(e){if(!e)if(fn){let t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Ic(e)}var Mc=/^[^#]+#/;function ga(e,t){return e.replace(Mc,"#")+t}function $c(e,t){let s=document.documentElement.getBoundingClientRect(),i=e.getBoundingClientRect();return{behavior:t.behavior,left:i.left-s.left-(t.left||0),top:i.top-s.top-(t.top||0)}}var po=()=>({left:window.scrollX,top:window.scrollY});function ya(e){let t;if("el"in e){let s=e.el,i=typeof s=="string"&&s.startsWith("#"),o=typeof s=="string"?i?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!o)return;t=$c(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function ei(e,t){return(history.state?history.state.position-t:-1)+e}var Qs=new Map;function ba(e,t){Qs.set(e,t)}function wa(e){let t=Qs.get(e);return Qs.delete(e),t}function Lc(e){return typeof e=="string"||e&&typeof e=="object"}function ti(e){return typeof e=="string"||typeof e=="symbol"}var je=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({}),ka=Symbol("");var z$={[je.MATCHER_NOT_FOUND]({location:e,currentLocation:t}){return`No match for ${JSON.stringify(e)}${t?` while being at -`+JSON.stringify(t):""}`},[je.NAVIGATION_GUARD_REDIRECT]({from:e,to:t}){return`Redirected from "${e.fullPath}" to "${Lc(t)}" via a navigation guard.`},[je.NAVIGATION_ABORTED]({from:e,to:t}){return`Navigation aborted from "${e.fullPath}" to "${t.fullPath}" via a navigation guard.`},[je.NAVIGATION_CANCELLED]({from:e,to:t}){return`Navigation cancelled from "${e.fullPath}" to "${t.fullPath}" with a new navigation.`},[je.NAVIGATION_DUPLICATED]({from:e,to:t}){return`Avoided redundant navigation to current location: "${e.fullPath}".`}};function po(e,t){return Oe(new Error,{type:e,[ya]:!0},t)}function $t(e,t){return e instanceof Error&&ya in e&&(t==null||!!(e.type&t))}var Mc=["params","query","hash"];function Lc(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;let t={};for(let n of Mc)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function ba(e){let t={};if(e===""||e==="?")return t;let n=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;rs&&jn(s)):[r&&jn(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function wa(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=kt(r)?r.map(s=>s==null?null:""+s):r==null?r:""+r)}return t}var ka=Symbol(""),xn=Symbol(""),Zs=Symbol(""),xs=Symbol(""),en=Symbol("");function Oo(){let e=[];function t(r){return e.push(r),()=>{let s=e.indexOf(r);s>-1&&e.splice(s,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function Yt(e,t,n,r,s,i=a=>a()){let a=r&&(r.enterCallbacks[s]=r.enterCallbacks[s]||[]);return()=>new Promise((u,f)=>{let h=m=>{m===!1?f(po(je.NAVIGATION_ABORTED,{from:n,to:t})):m instanceof Error?f(m):qc(m)?f(po(je.NAVIGATION_GUARD_REDIRECT,{from:t,to:m})):(a&&r.enterCallbacks[s]===a&&typeof m=="function"&&a.push(m),u())},g=i(()=>e.call(r&&r.instances[s],t,n,h)),k=Promise.resolve(g);e.length<3&&(k=k.then(h)),k.catch(m=>f(m))})}function tn(e,t,n,r,s=i=>i()){let i=[];for(let a of e)for(let u in a.components){let f=a.components[u];if(!(t!=="beforeRouteEnter"&&!a.instances[u]))if(sa(f)){let h=(f.__vccOpts||f)[t];h&&i.push(Yt(h,n,r,a,u,s))}else{let h=f();i.push(()=>h.then(g=>{if(!g)throw new Error(`Couldn't resolve component "${u}" at "${a.path}"`);let k=gc(g)?g.default:g;a.mods[u]=g,a.components[u]=k;let m=(k.__vccOpts||k)[t];return m&&Yt(m,n,r,a,u,s)()}))}}return i}function Ea(e,t){let n=[],r=[],s=[],i=Math.max(t.matched.length,e.matched.length);for(let a=0;aco(h,u))?r.push(u):n.push(u));let f=e.matched[a];f&&(t.matched.find(h=>co(h,f))||s.push(f))}return[n,r,s]}var $c=()=>location.protocol+"//"+location.host;function Pa(e,t){let{pathname:n,search:r,hash:s}=t,i=e.indexOf("#");if(i>-1){let a=s.includes(e.slice(i))?e.slice(i).length:1,u=s.slice(a);return u[0]!=="/"&&(u="/"+u),Yn(u,"")}return Yn(n,e)+r+s}function Uc(e,t,n,r){let s=[],i=[],a=null,u=({state:m})=>{let y=Pa(e,location),E=n.value,w=t.value,R=0;if(m){if(n.value=y,t.value=m,a&&a===E){a=null;return}R=w?m.position-w.position:0}else r(y);s.forEach(D=>{D(n.value,E,{delta:R,type:Qs.pop,direction:R?R>0?Xs.forward:Xs.back:Xs.unknown})})};function f(){a=n.value}function h(m){s.push(m);let y=()=>{let E=s.indexOf(m);E>-1&&s.splice(E,1)};return i.push(y),y}function g(){if(document.visibilityState==="hidden"){let{history:m}=window;if(!m.state)return;m.replaceState(Oe({},m.state,{scroll:us()}),"")}}function k(){for(let m of i)m();i=[],window.removeEventListener("popstate",u),window.removeEventListener("pagehide",g),document.removeEventListener("visibilitychange",g)}return window.addEventListener("popstate",u),window.addEventListener("pagehide",g),document.addEventListener("visibilitychange",g),{pauseListeners:f,listen:h,destroy:k}}function Ca(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?us():null}}function Fc(e){let{history:t,location:n}=window,r={value:Pa(e,n)},s={value:t.state};s.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(f,h,g){let k=e.indexOf("#"),m=k>-1?(n.host&&document.querySelector("base")?e:e.slice(k))+f:$c()+e+f;try{t[g?"replaceState":"pushState"](h,"",m),s.value=h}catch(y){console.error(y),n[g?"replace":"assign"](m)}}function a(f,h){i(f,Oe({},t.state,Ca(s.value.back,f,s.value.forward,!0),h,{position:s.value.position}),!0),r.value=f}function u(f,h){let g=Oe({},s.value,t.state,{forward:f,scroll:us()});i(g.current,g,!0),i(f,Oe({},Ca(r.value,f,null),{position:g.position+1},h),!1),r.value=f}return{location:r,state:s,push:u,replace:a}}function Va(e){e=fa(e);let t=Fc(e),n=Uc(e,t.state,t.location,t.replace);function r(i,a=!0){a||n.pauseListeners(),history.go(i)}let s=Oe({location:"",base:e,go:r,createHref:ma.bind(null,e)},t,n);return Object.defineProperty(s,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(s,"state",{enumerable:!0,get:()=>t.state.value}),s}var mo=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({}),Xe=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Xe||{}),zc={type:mo.Static,value:""},Hc=/[a-zA-Z0-9_]/;function Bc(e){if(!e)return[[]];if(e==="/")return[[zc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(y){throw new Error(`ERR (${n})/"${h}": ${y}`)}let n=Xe.Static,r=n,s=[],i;function a(){i&&s.push(i),i=[]}let u=0,f,h="",g="";function k(){h&&(n===Xe.Static?i.push({type:mo.Static,value:h}):n===Xe.Param||n===Xe.ParamRegExp||n===Xe.ParamRegExpEnd?(i.length>1&&(f==="*"||f==="+")&&t(`A repeatable param (${h}) must be alone in its segment. eg: '/:ids+.`),i.push({type:mo.Param,value:h,regexp:g,repeatable:f==="*"||f==="+",optional:f==="*"||f==="?"})):t("Invalid state to consume buffer"),h="")}function m(){h+=f}for(;ut.length?t.length===1&&t[0]===it.Static+it.Segment?1:-1:0}function qa(e,t){let n=0,r=e.score,s=t.score;for(;n0&&t[t.length-1]<0}var Yc={strict:!1,end:!0,sensitive:!1};function Jc(e,t,n){let r=Wc(Bc(e.path),n),s=Oe(r,{record:e,parent:t,children:[],alias:[]});return t&&!s.record.aliasOf==!t.record.aliasOf&&t.children.push(s),s}function Qc(e,t){let n=[],r=new Map;t=Wn(Yc,t);function s(k){return r.get(k)}function i(k,m,y){let E=!y,w=Da(k);w.aliasOf=y&&y.record;let R=Wn(t,k),D=[w];if("alias"in k){let H=typeof k.alias=="string"?[k.alias]:k.alias;for(let q of H)D.push(Da(Oe({},w,{components:y?y.record.components:w.components,path:q,aliasOf:y?y.record:w})))}let A,V;for(let H of D){let{path:q}=H;if(m&&q[0]!=="/"){let U=m.record.path,ae=U[U.length-1]==="/"?"":"/";H.path=m.record.path+(q&&ae+q)}if(A=Jc(H,m,R),y?y.alias.push(A):(V=V||A,V!==A&&V.alias.push(A),E&&k.name&&!Ra(A)&&a(k.name)),Ma(A)&&f(A),w.children){let U=w.children;for(let ae=0;ae{a(V)}:Ao}function a(k){if(Xn(k)){let m=r.get(k);m&&(r.delete(k),n.splice(n.indexOf(m),1),m.children.forEach(a),m.alias.forEach(a))}else{let m=n.indexOf(k);m>-1&&(n.splice(m,1),k.record.name&&r.delete(k.record.name),k.children.forEach(a),k.alias.forEach(a))}}function u(){return n}function f(k){let m=xc(k,n);n.splice(m,0,k),k.record.name&&!Ra(k)&&r.set(k.record.name,k)}function h(k,m){let y,E={},w,R;if("name"in k&&k.name){if(y=r.get(k.name),!y)throw po(je.MATCHER_NOT_FOUND,{location:k});R=y.record.name,E=Oe(Na(m.params,y.keys.filter(V=>!V.optional).concat(y.parent?y.parent.keys.filter(V=>V.optional):[]).map(V=>V.name)),k.params&&Na(k.params,y.keys.map(V=>V.name))),w=y.stringify(E)}else if(k.path!=null)w=k.path,y=n.find(V=>V.re.test(w)),y&&(E=y.parse(w),R=y.record.name);else{if(y=m.name?r.get(m.name):n.find(V=>V.re.test(m.path)),!y)throw po(je.MATCHER_NOT_FOUND,{location:k,currentLocation:m});R=y.record.name,E=Oe({},m.params,k.params),w=y.stringify(E)}let D=[],A=y;for(;A;)D.unshift(A.record),A=A.parent;return{name:R,path:w,params:E,matched:D,meta:Zc(D)}}e.forEach(k=>i(k));function g(){n.length=0,r.clear()}return{addRoute:i,resolve:h,removeRoute:a,clearRoutes:g,getRoutes:u,getRecordMatcher:s}}function Na(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Da(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Xc(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Xc(e){let t={},n=e.props||!1;if("component"in e)t.default=n;else for(let r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Ra(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Zc(e){return e.reduce((t,n)=>Oe(t,n.meta),{})}function xc(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;qa(e,t[i])<0?r=i:n=i+1}let s=ep(e);return s&&(r=t.lastIndexOf(s,r-1)),r}function ep(e){let t=e;for(;t=t.parent;)if(Ma(t)&&qa(e,t)===0)return t}function Ma({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Ta(e){let t=ut(Zs),n=ut(xs),r=!1,s=null,i=ot(()=>{let g=Bt(e.to);return t.resolve(g)}),a=ot(()=>{let{matched:g}=i.value,{length:k}=g,m=g[k-1],y=n.matched;if(!m||!y.length)return-1;let E=y.findIndex(co.bind(null,m));if(E>-1)return E;let w=Aa(g[k-2]);return k>1&&Aa(m)===w&&y[y.length-1].path!==w?y.findIndex(co.bind(null,g[k-2])):E}),u=ot(()=>a.value>-1&&rp(n.params,i.value.params)),f=ot(()=>a.value>-1&&a.value===n.matched.length-1&&Jn(n.params,i.value.params));function h(g={}){if(np(g)){let k=t[Bt(e.replace)?"replace":"push"](Bt(e.to)).catch(Ao);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>k),k}return Promise.resolve()}return{route:i,href:ot(()=>i.value.href),isActive:u,isExactActive:f,navigate:h}}function tp(e){return e.length===1?e[0]:e}var op=rs({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Ta,setup(e,{slots:t}){let n=He(Ta(e)),{options:r}=ut(Zs),s=ot(()=>({[Oa(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Oa(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{let i=t.default&&tp(t.default(n));return e.custom?i:ke("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},i)}}}),sp=op;function np(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function rp(e,t){for(let n in t){let r=t[n],s=e[n];if(typeof r=="string"){if(r!==s)return!1}else if(!kt(s)||s.length!==r.length||r.some((i,a)=>i.valueOf()!==s[a].valueOf()))return!1}return!0}function Aa(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}var Oa=(e,t,n)=>e??t??n,ip=rs({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){let r=ut(en),s=ot(()=>e.route||r.value),i=ut(xn,0),a=ot(()=>{let h=Bt(i),{matched:g}=s.value,k;for(;(k=g[h])&&!k.components;)h++;return h}),u=ot(()=>s.value.matched[a.value]);io(xn,ot(()=>a.value+1)),io(ka,u),io(en,s);let f=et();return Be(()=>[f.value,u.value,e.name],([h,g,k],[m,y,E])=>{g&&(g.instances[k]=h,y&&y!==g&&h&&h===m&&(g.leaveGuards.size||(g.leaveGuards=y.leaveGuards),g.updateGuards.size||(g.updateGuards=y.updateGuards))),h&&g&&(!y||!co(g,y)||!m)&&(g.enterCallbacks[k]||[]).forEach(w=>w(h))},{flush:"post"}),()=>{let h=s.value,g=e.name,k=u.value,m=k&&k.components[g];if(!m)return Ia(n.default,{Component:m,route:h});let y=k.props[g],E=y?y===!0?h.params:typeof y=="function"?y(h):y:null,R=ke(m,Oe({},E,t,{onVnodeUnmounted:D=>{D.component.isUnmounted&&(k.instances[g]=null)},ref:f}));return Ia(n.default,{Component:R,route:h})||R}}});function Ia(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var er=ip;function La(e){let t=Qc(e.routes,e),n=e.parseQuery||ba,r=e.stringifyQuery||Zn,s=e.history,i=Oo(),a=Oo(),u=Oo(),f=_s(Jt),h=Jt;fo&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");let g=Ys.bind(null,z=>""+z),k=Ys.bind(null,ua),m=Ys.bind(null,To);function y(z,ne){let te,S;return Xn(z)?(te=t.getRecordMatcher(z),S=ne):S=z,t.addRoute(S,te)}function E(z){let ne=t.getRecordMatcher(z);ne&&t.removeRoute(ne)}function w(){return t.getRoutes().map(z=>z.record)}function R(z){return!!t.getRecordMatcher(z)}function D(z,ne){if(ne=Oe({},ne||f.value),typeof z=="string"){let v=Js(n,z,ne.path),C=t.resolve({path:v.path},ne),P=s.createHref(v.fullPath);return Oe(v,C,{params:m(C.params),hash:To(v.hash),redirectedFrom:void 0,href:P})}let te;if(z.path!=null)te=Oe({},z,{path:Js(n,z.path,ne.path).path});else{let v=Oe({},z.params);for(let C in v)v[C]==null&&delete v[C];te=Oe({},z,{params:k(v)}),ne.params=k(ne.params)}let S=t.resolve(te,ne),I=z.hash||"";S.params=g(m(S.params));let j=ca(r,Oe({},z,{hash:da(I),path:S.path})),M=s.createHref(j);return Oe({fullPath:j,hash:I,query:r===Zn?wa(z.query):z.query||{}},S,{redirectedFrom:void 0,href:M})}function A(z){return typeof z=="string"?Js(n,z,f.value.path):Oe({},z)}function V(z,ne){if(h!==z)return po(je.NAVIGATION_CANCELLED,{from:ne,to:z})}function H(z){return ae(z)}function q(z){return H(Oe(A(z),{replace:!0}))}function U(z,ne){let te=z.matched[z.matched.length-1];if(te&&te.redirect){let{redirect:S}=te,I=typeof S=="function"?S(z,ne):S;return typeof I=="string"&&(I=I.includes("?")||I.includes("#")?I=A(I):{path:I},I.params={}),Oe({query:z.query,hash:z.hash,params:I.path!=null?{}:z.params},I)}}function ae(z,ne){let te=h=D(z),S=f.value,I=z.state,j=z.force,M=z.replace===!0,v=U(te,S);if(v)return ae(Oe(A(v),{state:typeof v=="object"?Oe({},I,v.state):I,force:j,replace:M}),ne||te);let C=te;C.redirectedFrom=ne;let P;return!j&&pa(r,S,te)&&(P=po(je.NAVIGATION_DUPLICATED,{to:C,from:S}),Ae(S,S,!0,!1)),(P?Promise.resolve(P):O(C,S)).catch(F=>$t(F)?$t(F,je.NAVIGATION_GUARD_REDIRECT)?F:_e(F):le(F,C,S)).then(F=>{if(F){if($t(F,je.NAVIGATION_GUARD_REDIRECT))return ae(Oe({replace:M},A(F.to),{state:typeof F.to=="object"?Oe({},I,F.to.state):I,force:j}),ne||C)}else F=J(C,S,!0,M,I);return G(C,S,F),F})}function ie(z,ne){let te=V(z,ne);return te?Promise.reject(te):Promise.resolve()}function _(z){let ne=Se.values().next().value;return ne&&typeof ne.runWithContext=="function"?ne.runWithContext(z):z()}function O(z,ne){let te,[S,I,j]=Ea(z,ne);te=tn(S.reverse(),"beforeRouteLeave",z,ne);for(let v of S)v.leaveGuards.forEach(C=>{te.push(Yt(C,z,ne))});let M=ie.bind(null,z,ne);return te.push(M),Ue(te).then(()=>{te=[];for(let v of i.list())te.push(Yt(v,z,ne));return te.push(M),Ue(te)}).then(()=>{te=tn(I,"beforeRouteUpdate",z,ne);for(let v of I)v.updateGuards.forEach(C=>{te.push(Yt(C,z,ne))});return te.push(M),Ue(te)}).then(()=>{te=[];for(let v of j)if(v.beforeEnter)if(kt(v.beforeEnter))for(let C of v.beforeEnter)te.push(Yt(C,z,ne));else te.push(Yt(v.beforeEnter,z,ne));return te.push(M),Ue(te)}).then(()=>(z.matched.forEach(v=>v.enterCallbacks={}),te=tn(j,"beforeRouteEnter",z,ne,_),te.push(M),Ue(te))).then(()=>{te=[];for(let v of a.list())te.push(Yt(v,z,ne));return te.push(M),Ue(te)}).catch(v=>$t(v,je.NAVIGATION_CANCELLED)?v:Promise.reject(v))}function G(z,ne,te){u.list().forEach(S=>_(()=>S(z,ne,te)))}function J(z,ne,te,S,I){let j=V(z,ne);if(j)return j;let M=ne===Jt,v=fo?history.state:{};te&&(S||M?s.replace(z.fullPath,Oe({scroll:M&&v&&v.scroll},I)):s.push(z.fullPath,I)),f.value=z,Ae(z,ne,te,M),_e()}let ee;function Q(){ee||(ee=s.listen((z,ne,te)=>{if(!$e.listening)return;let S=D(z),I=U(S,$e.currentRoute.value);if(I){ae(Oe(I,{replace:!0,force:!0}),S).catch(Ao);return}h=S;let j=f.value;fo&&va(Qn(j.fullPath,te.delta),us()),O(S,j).catch(M=>$t(M,je.NAVIGATION_ABORTED|je.NAVIGATION_CANCELLED)?M:$t(M,je.NAVIGATION_GUARD_REDIRECT)?(ae(Oe(A(M.to),{force:!0}),S).then(v=>{$t(v,je.NAVIGATION_ABORTED|je.NAVIGATION_DUPLICATED)&&!te.delta&&te.type===Qs.pop&&s.go(-1,!1)}).catch(Ao),Promise.reject()):(te.delta&&s.go(-te.delta,!1),le(M,S,j))).then(M=>{M=M||J(S,j,!1),M&&(te.delta&&!$t(M,je.NAVIGATION_CANCELLED)?s.go(-te.delta,!1):te.type===Qs.pop&&$t(M,je.NAVIGATION_ABORTED|je.NAVIGATION_DUPLICATED)&&s.go(-1,!1)),G(S,j,M)}).catch(Ao)}))}let oe=Oo(),ue=Oo(),pe;function le(z,ne,te){_e(z);let S=ue.list();return S.length?S.forEach(I=>I(z,ne,te)):console.error(z),Promise.reject(z)}function Ie(){return pe&&f.value!==Jt?Promise.resolve():new Promise((z,ne)=>{oe.add([z,ne])})}function _e(z){return pe||(pe=!z,Q(),oe.list().forEach(([ne,te])=>z?te(z):ne()),oe.reset()),z}function Ae(z,ne,te,S){let{scrollBehavior:I}=e;if(!fo||!I)return Promise.resolve();let j=!te&&ga(Qn(z.fullPath,0))||(S||!te)&&history.state&&history.state.scroll||null;return st().then(()=>I(z,ne,j)).then(M=>M&&ha(M)).catch(M=>le(M,z,ne))}let Ee=z=>s.go(z),Pe,Se=new Set,$e={currentRoute:f,listening:!0,addRoute:y,removeRoute:E,clearRoutes:t.clearRoutes,hasRoute:R,getRoutes:w,resolve:D,options:e,push:H,replace:q,go:Ee,back:()=>Ee(-1),forward:()=>Ee(1),beforeEach:i.add,beforeResolve:a.add,afterEach:u.add,onError:ue.add,isReady:Ie,install(z){z.component("RouterLink",sp),z.component("RouterView",er),z.config.globalProperties.$router=$e,Object.defineProperty(z.config.globalProperties,"$route",{enumerable:!0,get:()=>Bt(f)}),fo&&!Pe&&f.value===Jt&&(Pe=!0,H(s.location).catch(S=>{}));let ne={};for(let S in Jt)Object.defineProperty(ne,S,{get:()=>f.value[S],enumerable:!0});z.provide(Zs,$e),z.provide(xs,Wo(ne)),z.provide(en,f);let te=z.unmount;Se.add(z),z.unmount=function(){Se.delete(z),Se.size<1&&(h=Jt,ee&&ee(),ee=null,f.value=Jt,Pe=!1,pe=!1),te()}}};function Ue(z){return z.reduce((ne,te)=>ne.then(()=>_(te)),Promise.resolve())}return $e}function $a(e){return ut(xs)}function Ua(e,t){return t?.split(".").reduce((n,r)=>n?.[r],e)}function tr(e=null,t=new Map){let n=He({}),r=[],s=!1,i=new Proxy(n,{get(a,u){return typeof u=="string"&&u.startsWith("__v_")||Reflect.has(a,u)?Reflect.get(a,u):e?.[u]}});return Object.defineProperty(n,"parent",{value:e,configurable:!0}),Object.defineProperty(n,"viewState",{get:()=>i}),i.watch=(a,u,f=!1,h=!0)=>{let g=typeof a=="function"?()=>a(i):()=>Ua(i,a),k=Be(g,u,{deep:f,flush:"post"});return r.push(k),h&&st(()=>{s||u(g(),g())}),k},i.watchGroup=(a,u,f=!0)=>i.watch(()=>a.map(h=>Ua(i,h)),u,!0,f),i.on=(a,u)=>{if(a==="dispose")return r.push(u),()=>{};t.has(a)||t.set(a,new Set),t.get(a).add(u);let f=()=>t.get(a)?.delete(u);return r.push(f),f},i.emit=(a,...u)=>{for(let f of[...t.get(a)||[]])f({},...u)},i.dispose=()=>{s=!0,r.splice(0).reverse().forEach(a=>a())},jo(i.dispose),i}function ct(){let e=new Set,t=new Set,n=!1,r=(i,a=0)=>{if(n)return;let u=setTimeout(()=>{e.delete(u),i()},a);return e.add(u),u};r.cancel=i=>{clearTimeout(i),e.delete(i)};let s=(i,a)=>{if(n)return;let u=setInterval(i,a);return t.add(u),u};return s.cancel=i=>{clearInterval(i),t.delete(i)},jo(()=>{n=!0,e.forEach(clearTimeout),t.forEach(clearInterval)}),{timeout:r,interval:s}}function Qt(){let e=new Set;return jo(()=>{e.forEach(t=>t()),e.clear()}),(t,n,r,s)=>{t.addEventListener(n,r,s);let i=()=>{t.removeEventListener(n,r,s),e.delete(i)};return e.add(i),i}}function or(e,t,n){let r,s=!1,i="form-draft:"+n,a=()=>Object.fromEntries(t.map(m=>[m,e[m]])),u=()=>JSON.stringify(a()),f=m=>{for(let y of t)Object.prototype.hasOwnProperty.call(m,y)&&(e[y]=m[y]);e.options?.expirationDate&&(e.options.expirationDate=new Date(e.options.expirationDate))},h=()=>{try{window.sessionStorage.removeItem(i)}catch{}},g=(m=!1)=>{if(r!==void 0){if(m&&document.querySelectorAll("input, select, textarea").forEach(y=>{y._field?.binding.state===e&&y._field.timer&&y._field.commit()}),e.unsavedChanges=u()!==r,e.draftSaved=!1,!e.unsavedChanges){h();return}try{window.sessionStorage.setItem(i,JSON.stringify({account:e.user?.username||null,savedAt:Date.now(),values:a()})),e.draftSaved=!0}catch{}}},k=()=>g(!0);return e.on("routeLeave",k),window.addEventListener("beforeunload",k),e.on("dispose",()=>window.removeEventListener("beforeunload",k)),{restore(){r=u();let m;try{m=JSON.parse(window.sessionStorage.getItem(i)||"null")}catch{}let y=m&&m.account===(e.user?.username||null)&&Date.now()-m.savedAt<30*6e4&&m.values;return y&&(f(m.values),e.draftRestored=!0),s||(s=!0,e.watch(()=>a(),()=>g(),!0)),e.unsavedChanges=u()!==r,!!y},checkpoint(){return JSON.parse(u())},accept(m){r=JSON.stringify(m),e.draftRestored=!1,g()},discard(){document.querySelectorAll("input, select, textarea").forEach(m=>{m._field?.binding.state!==e||!m._field.timer||(clearTimeout(m._field.timer),m._field.timer=null,m.value=m._field.binding.value??"")}),r!==void 0&&f(JSON.parse(r)),e.draftRestored=!1,g()},clear(){r=u(),e.unsavedChanges=!1,e.draftRestored=!1,e.draftSaved=!1,h()}}}function ap(e){if(!["ArrowLeft","ArrowRight","Home","End"].includes(e.key))return;let t=[...e.currentTarget.closest('[role="tablist"]').querySelectorAll('[role="tab"]')],n=t.indexOf(e.currentTarget),r=e.key==="Home"?0:e.key==="End"?t.length-1:(n+(e.key==="ArrowRight"?1:-1)+t.length)%t.length;e.preventDefault(),t[r]?.focus(),t[r]?.click()}var Fa=function(e,t,n,r){e.previewTabKeydown=ap,e.title="Main",e.user={status:"connection"},e.site_options,e.toasts=[],e.removeToast=function(f){let h=e.toasts.indexOf(f);h!==-1&&e.toasts.splice(h,1)},e.addToast=function(f){return e.toasts.push(f),r(function(){e.removeToast(f)},8e3),f},e.path=n.url(),e.paths=n.path().substring(1).split("/"),e.darkMode=function(f){localStorage.setItem("darkMode",f),e.isDarkMode=f;let h="/css/prism-okaidia.css",g="/css/prism.css";if(f){$("body").addClass("dark-mode");let m=document.createElement("link");m.href=h,m.rel="stylesheet",document.head.append(m),$(`link[href='${g}']`).remove()}else{$("body").removeClass("dark-mode");let m=document.createElement("link");m.href=g,m.rel="stylesheet",document.head.append(m),$(`link[href='${h}']`).remove()}let k=document.querySelector("[class*='floatingchat-container-wrap'] [class*='floating-chat-kofi-text-container-wrap']");k&&(k.style.backgroundColor=f?"#FAF9F6":"#1A1815",k.style.color=f?"#1A1815":"#FAF9F6"),e.emit("dark-mode",f)},e.darkMode(localStorage.getItem("darkMode")=="true");function s(){t.get("/api/user").then(f=>{f&&(e.user=f.data)},()=>{e.user=null})}s();function i(){t.get("/api/options").then(f=>{f&&(e.site_options=f.data)},()=>{e.site_options=null})}i();function a(){t.get("/api/message").then(f=>{f&&(e.generalMessage=f.data)},()=>{e.generalMessage=null})}a();function u(f,h){h&&(e.title=h.title),e.path=n.url(),e.paths=n.path().substring(1).split("/")}e.on("routeChange",u),e.on("routeUpdate",u)},za=function(e,t){let n=Qt(),r=ct(),s=()=>{let i=window.location.hash.slice(1),a=document.getElementById(i);if(!a?.classList.contains("panel-collapse"))return;$(a).collapse("show");let u=document.getElementById(a.getAttribute("aria-labelledby"));u?.setAttribute("tabindex","-1"),u?.focus({preventScroll:!0}),u?.scrollIntoView?.({block:"start"})};e.on("routeUpdate",()=>r.timeout(s,0)),n(window,"hashchange",s),r.timeout(s,0)},Ha=function(e,t,n,r,s){e.terms="",e.options={expirationMode:"remove",update:!1,image:!0,pdf:!0,notebook:!0,loc:!0,link:!0},e.saving=!1,e.message=null,e.error=null,s.load().then(f=>{e.quota=f},console.error);let i=or(e,["terms","options"],"profile");e.discardDraft=()=>i.discard();function a(){t.get("/api/user/default").then(f=>{let h=f.data||{};h.terms&&(e.terms=h.terms.join(` -`)),e.options=Object.assign({},e.options,h.options),i.restore()})}a();let u=null;e.saveDefault=f=>{if(f&&f.preventDefault&&f.preventDefault(),e.saving)return;let h=i.checkpoint(),g={terms:e.terms.split(` -`).map(k=>k.trim()).filter(k=>k.length>0),options:e.options};e.saving=!0,e.error=null,t.post("/api/user/default",g).then(()=>{i.accept(h),e.saving=!1,e.message=e.unsavedChanges?null:"Saved",u&&r.cancel(u),u=r(()=>{e.message=null},2500)},k=>{e.saving=!1;let y="ERRORS."+(k&&k.data&&k.data.error);n(y).then(E=>{e.error=E&&E!==y?E:"Unable to save your defaults. Please try again."},()=>{e.error="Unable to save your defaults. Please try again."})})},e.deleteAccount=()=>{confirm("Delete your account? All your anonymized repositories, gists, and pull requests will be removed, and your personal data will be erased. This cannot be undone.")&&(e.deletingAccount=!0,t.delete("/api/user").then(()=>{window.location.href="/"},()=>{e.deletingAccount=!1,e.deleteError="Unable to delete the account. Please try again."}))}},Ba=function(e,t,n){e.repoId=null,e.repoUrl=null,e.claim=()=>{t.post("/api/repo/claim",{repoId:e.repoId,repoUrl:e.repoUrl}).then(r=>{n.url("/dashboard")},r=>{e.error=r.data,e.claimForm.repoUrl.setValidity("not_found",!1),e.claimForm.repoId.setValidity("not_found",!1)})}},ja=function(e,t,n,r,s){e.user&&!e.user.status&&n.url("/dashboard"),e.watch("user.status",()=>{e.user&&!e.user.status&&n.url("/dashboard")}),e.features=[{key:"anonymize",num:"01",eyebrow:"Anonymize",title:"Double-anonymous,",accent:"your rules.",text:"Choose what reviewers may see: links, images, PDFs, notebooks, GitHub Pages. Add your own terms, with regex if you need it, and pick the expiration date.",cta:"Start an anonymization",href:"/anonymize",url:"anonymous.4open.science/anonymize",img:"/imgs/anonymize.png",alt:"The anonymize form: source repository, terms to redact, options and a live README preview"},{key:"review",num:"02",eyebrow:"Review",title:"Reviewers browse",accent:"the real thing.",text:"Highlighted source code, rendered PDFs, images, and notebooks, in a familiar file explorer. GitHub Pages is also supported.",cta:"Open the example",href:"https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/",target:"_self",url:"anonymous.4open.science/r/840c8c57-\u2026",img:"/imgs/explorer.png",alt:"The repository explorer with a file tree and a rendered README"},{key:"manage",num:"03",eyebrow:"Manage",title:"One dashboard,",accent:"until the decision.",text:"Monitor views, edit configuration, remove or update your repository. Program chairs can group submissions under a conference with one shared expiry.",cta:"Open the dashboard",href:"/dashboard",needsUser:!0,url:"anonymous.4open.science/dashboard",img:"/imgs/dashboard.png",alt:"The dashboard listing anonymized repositories with status, views and expiry"}],e.feature=e.features[0].key,e.selectFeature=function(u){e.feature=u},e.featureHref=function(u){return u.needsUser&&!e.user?"/signin":u.href},e.featureTarget=function(u){return u.needsUser&&!e.user?"_self":u.target||void 0},e.featureKeydown=function(u,f){let h={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1,Home:"first",End:"last"}[u.key];if(h===void 0)return;u.preventDefault();let g=e.features.length,k=h==="first"?0:h==="last"?g-1:(f+h+g)%g;e.feature=e.features[k].key,s(()=>{let m=r.document.getElementById("feature-tab-"+e.feature);m&&m.focus()})},e.cards=[{key:"repositories",total:0,label:"repositories anonymized"},{key:"users",total:0,label:"researchers"},{key:"pageViews",total:0,label:"page views"},{key:"pullRequests",total:0,label:"pull requests"}];function i(){t.get("/api/stat/").then(u=>{e.stat=u.data,e.cards[0].total=u.data.nbRepositories,e.cards[1].total=u.data.nbUsers,e.cards[2].total=u.data.nbPageViews,e.cards[3].total=u.data.nbPullRequests})}i();function a(u){let f={series:u,bars:[],viewW:100,deltaToday:0,pctChange:0,pctAbs:0,isUp:!0};if(!u||u.length<2)return f;let h=new Array(u.length-1);for(let w=1;w=2){let w=h[g-2];w&&(f.pctChange=(f.deltaToday-w)/w*100)}return f.pctAbs=Math.round(Math.abs(f.pctChange)),f.isUp=f.pctChange>=0,f}e.history={repositories:a([]),users:a([]),pageViews:a([]),pullRequests:a([])},t.get("/api/stat/history?days=60").then(u=>{let f=u.data||[];e.history={repositories:a(f.map(h=>h.nbRepositories||0)),users:a(f.map(h=>h.nbUsers||0)),pageViews:a(f.map(h=>h.nbPageViews||0)),pullRequests:a(f.map(h=>h.nbPullRequests||0))}})},Ga=function(e,t,n,r,s,i){let a=ct();e.on("routeLeave",function(){$('[data-toggle="tooltip"]').tooltip("dispose")}),e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),a.timeout(()=>{$('[data-toggle="tooltip"]').tooltip()},250),e.quotaExpanded=!1,e.closeQuota=()=>{e.quotaExpanded=!1,st(()=>document.querySelector(".dashboard-quota > summary")?.focus())},Qt()(document,"click",_=>{e.quotaExpanded&&!_.target.closest?.(".dashboard-quota")&&(e.quotaExpanded=!1)}),e.filtersExpanded=!1,e.projectView="all",e.selectedProject=null,e.projectName="",e.nameSaving=!1,e.nameError="",e.nameMessage="",e.needsAttention=_=>_.status==="error"||_._broken||f(_.status)==="progress"&&_._stale,e.attentionCount=()=>e.dashboardTotals?.attention??e.items.filter(e.needsAttention).length,e.hasProjects=()=>(e.dashboardTotals?.total??e.items.length)>0,e.setProjectView=_=>{e.projectView=_,_==="attention"&&(e.filters.status.error=!0,e.filters.status.progress=!0)},e.projectDetailsId=_=>"project-details-"+encodeURIComponent(_._type+":"+(_._id||_._source||"unknown")),e.showProjectDetails=async _=>{e.selectedProject=_,e.projectName=_.projectName||"",e.nameError="",e.nameMessage="",await st();let O=document.getElementById(e.projectDetailsId(_));O?.focus(),O?.scrollIntoView?.({block:"nearest"})},e.closeProjectDetails=_=>{e.selectedProject=null,st(()=>document.querySelector(`[data-project-actions="${encodeURIComponent(_._type+":"+_._id)}"]`)?.focus())},e.saveProjectName=async _=>{if(e.nameSaving||!_._id)return;let O=e.projectName.trim();if(O.length>100){e.nameError="Use 100 characters or fewer.";return}e.nameSaving=!0,e.nameError="",e.nameMessage="";try{let G=await t.post("/api/user/project-name",{type:_._type,id:_._id,name:O});_.projectName=G.data.name,_._label=_.projectName||_._fallbackLabel,e.selectedProject===_&&(e.nameMessage=O?"Project name saved.":"Default project name restored."),A||(e.dashboardCursor=null,await H(),e.selectedProject===_&&(e.selectedProject=e.items.find(J=>J._type===_._type&&J._id===_._id)||null))}catch{e.selectedProject===_&&(e.nameError="The project name could not be saved. Try again.")}finally{e.nameSaving=!1}},e.copyingId=null,e.copyLink=async _=>{if(!_._viewUrl||e.copyingId)return;let O=new URL(_._viewUrl,s.location.origin).href;e.copyingId=_._type+":"+_._id;try{if(s.navigator.clipboard?.writeText)await s.navigator.clipboard.writeText(O);else{let G=document.createElement("textarea");G.value=O,G.setAttribute("readonly",""),G.style.position="fixed",G.style.opacity="0";let J=document.activeElement;document.body.appendChild(G);try{if(G.select(),!document.execCommand?.("copy"))throw Error("Copy unavailable")}finally{G.remove(),J?.focus()}}e.addToast({title:"Link copied",body:"The anonymous link is ready to share."})}catch{e.addToast({title:"Copy this anonymous link",body:O})}finally{e.copyingId=null}},e.items=[],e.search="",e.loading=!0,e.statusKeyLabels={ready:"Ready",progress:"In progress",error:"Error",expired:"Expired",removed:"Removed"};let u=["queue","download","downloaded","preparing","anonymizing"];function f(_){return _==="ready"||_==="error"?_:_==="expired"||_==="expiring"?"expired":_==="removed"||_==="removing"?"removed":(u.indexOf(_)>-1,"progress")}let h=7200*1e3,g="dashboard.filterPrefs",k={typeFilter:"all",filters:{status:{ready:!0,progress:!0,error:!0,expired:!0,removed:!1}},orderBy:"-anonymizeDate"},m=loadFilterPrefs(g)||{};e.typeFilter=m.typeFilter||k.typeFilter,e.filters={status:Object.assign({},k.filters.status,m.filters&&m.filters.status||{})},e.orderBy=m.orderBy||k.orderBy;let y={_name:{label:"Anonymous ID",defaultDesc:!1},_label:{label:"Project",defaultDesc:!1},anonymizeDate:{label:"Anonymize date",defaultDesc:!0},status:{label:"Status",defaultDesc:!1},lastView:{label:"Last view",defaultDesc:!0},pageView:{label:"Views",defaultDesc:!0},"options.expirationDate":{label:"Expiration",defaultDesc:!1}};e.sortFields=y,e.sortField=()=>e.orderBy.replace(/^-/,""),e.sortDesc=()=>e.orderBy.charAt(0)==="-",e.sortLabel=()=>{let _=y[e.sortField()];return _?_.label:"Custom"},e.isSortedBy=_=>e.sortField()===_,e.setSort=(_,O)=>{typeof O!="boolean"&&(O=e.isSortedBy(_)?!e.sortDesc():!!(y[_]&&y[_].defaultDesc)),e.orderBy=(O?"-":"")+_},e.toggleSortDirection=()=>{e.setSort(e.sortField(),!e.sortDesc())},e.watchGroup(["typeFilter","orderBy"],()=>{saveFilterPrefs(g,{typeFilter:e.typeFilter,filters:e.filters,orderBy:e.orderBy})}),e.watch("filters",()=>{saveFilterPrefs(g,{typeFilter:e.typeFilter,filters:e.filters,orderBy:e.orderBy})},!0),i.load().then(_=>{e.quota=_},console.error);function E(_,O,G,J,ee,Q){_.pageView||(_.pageView=0),_.lastView||(_.lastView=""),_.options=_.options||{},_.options.terms=(_.options.terms||[]).filter(ue=>ue),_._id=O||"",_._source=J,_._broken=!O,_._name=O||J||"(unnamed)",_._fallbackLabel=_._type==="gist"?"Gist "+(O||J||"without an ID"):J||G||_._name,_._label=_.projectName||_._fallbackLabel,_._editUrl=O?ee:null,_._viewUrl=O?Q:null,_._broken&&(_.status="error",_.statusMessage="incomplete_record"),_._statusKey=f(_.status);let oe=_.anonymizeDate||_.lastView;return _._stale=_._statusKey==="progress"&&!!oe&&Date.now()-new Date(oe).getTime()>h,_.status==="expired"||_.status==="expiring"?_._expiry={kind:"expired",date:_.options.expirationDate}:_.status!=="ready"?_._expiry={kind:"none"}:_.options.expirationMode==="never"||!_.options.expirationDate?_._expiry={kind:"never"}:_._expiry={kind:"date",date:_.options.expirationDate},_}function w(_){return t.get(_).then(O=>O.data||[],O=>(console.error(O),[]))}function R(){return e.loading=!0,r.all([w("/api/user/anonymized_repositories"),w("/api/user/anonymized_pull_requests"),w("/api/user/anonymized_gists")]).then(_=>{let O=_[0],G=_[1],J=_[2],ee=[];O.forEach(Q=>{Q._type="repo";let oe=Q.source||{};ee.push(E(Q,Q.repoId,Q.repoId,oe.fullName,"/anonymize/"+Q.repoId,"/r/"+Q.repoId+"/"))}),G.forEach(Q=>{Q._type="pr";let oe=Q.source||{};ee.push(E(Q,Q.pullRequestId,Q.pullRequestId,oe.repositoryFullName?oe.repositoryFullName+"#"+oe.pullRequestId:void 0,"/pull-request-anonymize/"+Q.pullRequestId,"/pr/"+Q.pullRequestId+"/"))}),J.forEach(Q=>{Q._type="gist";let oe=Q.source||{};ee.push(E(Q,Q.gistId,Q.gistId,oe.gistId,"/gist-anonymize/"+Q.gistId,"/gist/"+Q.gistId+"/"))}),e.items=ee,e.loading=!1})}let D=0,A=!1;e.dashboardCursor=null,e.dashboardError="";function V(_){let O=_.source||{};return _._type==="repo"?E(_,_.repoId,_.repoId,O.fullName,"/anonymize/"+_.repoId,"/r/"+_.repoId+"/"):_._type==="pr"?E(_,_.pullRequestId,_.pullRequestId,O.repositoryFullName?O.repositoryFullName+"#"+O.pullRequestId:void 0,"/pull-request-anonymize/"+_.pullRequestId,"/pr/"+_.pullRequestId+"/"):E(_,_.gistId,_.gistId,O.gistId,"/gist-anonymize/"+_.gistId,"/gist/"+_.gistId+"/")}function H(_=!1){if(A)return R();let O=++D;return e.loading=!_,e.loadingMore=_,e.dashboardError="",t.get("/api/user/dashboard",{params:{q:e.search,type:e.typeFilter,sort:e.orderBy,statuses:Object.keys(e.filters.status).filter(G=>e.filters.status[G]!==!1).join(",")||"none",attention:String(e.projectView==="attention"),cursor:_?e.dashboardCursor:void 0}}).then(G=>{if(O===D){if(!Array.isArray(G.data?.items))return A=!0,R();e.items=(_?e.items:[]).concat(G.data.items.map(V)),e.dashboardCursor=G.data.cursor,e.dashboardTotals=G.data}},G=>{if(O===D){if(G.status===404)return A=!0,R();e.dashboardError="Projects could not be loaded. Please try again."}}).finally(()=>{O===D&&(e.loading=!1,e.loadingMore=!1)})}e.loadMoreProjects=()=>H(!0);let q;e.watchGroup(["search","typeFilter","orderBy","projectView"],()=>{A||(q&&a.timeout.cancel(q),q=a.timeout(()=>H(),150))},!1),e.watch("filters",()=>{A||H()},!0,!1),e.on("dispose",()=>{D++}),H(),e.openItem=(_,O)=>{if(!_._viewUrl)return;let G=O&&O.target;G&&G.closest&&G.closest("a, button, .dropdown, input")||(s.location.href=_._viewUrl)},e.hiddenStatusCount=()=>Object.keys(e.filters.status).filter(_=>e.filters.status[_]===!1).length,e.hasHiddenStatus=()=>e.hiddenStatusCount()>0,e.hasActiveFilters=()=>e.projectView!=="all"||e.typeFilter!=="all"||e.search.trim().length>0||Object.keys(e.filters.status).some(_=>e.filters.status[_]===!1),e.showClearFilters=()=>e.search.trim().length>0||e.typeFilter!=="all"||e.hiddenStatusCount()>1,e.clearFilters=()=>{e.projectView="all",e.typeFilter="all",e.search="",Object.keys(e.filters.status).forEach(_=>{e.filters.status[_]=!0})};function U(_,O,G,J){t.get("/api/repo/"+_).then(async ee=>{let Q=J!==void 0&&J!==ee.data.status;for(let oe of e.items)if(oe._type==="repo"&&oe.repoId==_){Q=Q||oe.status!==ee.data.status;let ue=e.needsAttention(oe);oe.status=ee.data.status,oe.statusMessage=ee.data.statusMessage,oe._statusKey=f(oe.status),oe._statusKey!=="progress"&&(oe._stale=!1);let pe=e.needsAttention(oe);e.dashboardTotals&&ue!==pe&&(e.dashboardTotals.attention=Math.max(0,e.dashboardTotals.attention+(pe?1:-1)));break}if(Q&&!A){e.dashboardCursor=null;let oe=e.selectedProject;await H(),oe&&e.selectedProject===oe&&(e.selectedProject=e.items.find(ue=>ue._type===oe._type&&ue._id===oe._id)||null)}if(ee.data.status=="ready"||ee.data.status=="error"||ee.data.status=="removed"||ee.data.status=="expired"){O(ee.data);return}a.timeout(()=>U(_,O,G,ee.data.status),2500)},G)}let ae=_=>_==="repo"?"repository":_==="gist"?"gist":"pull request",ie=_=>_==="repo"?"/api/repo":_==="gist"?"/api/gist":"/api/pr";e.removeItem=_=>{let O=ae(_._type);if(confirm(`Are you sure that you want to remove the ${O} ${_._id}?`)){let G=He({title:`Removing ${_._id}...`,date:new Date,body:`The ${O} ${_._id} is going to be removed.`});e.addToast(G);let J=`${ie(_._type)}/${_._id}`;t.delete(J).then(()=>{_._type==="repo"?U(_._id,()=>{G.title=`${_._id} is removed.`,G.body=`The ${O} ${_._id} is removed.`},void 0,_.status):(G.title=`${_._id} is removed.`,G.body=`The ${O} ${_._id} is removed.`,H())},ee=>{G.title=`Error during the removal of ${_._id}.`,G.body=ee.body,H()})}},e.refreshItem=_=>{let O=ae(_._type),G=He({title:`Refreshing ${_._id}...`,date:new Date,body:`The ${O} ${_._id} is going to be refreshed.`});e.addToast(G);let J=Q=>{G.title=`Error during the refresh of ${_._id}.`,G.body=Q.data?.error||Q.body||"The refresh could not be completed. Please try again.",H()},ee=`${ie(_._type)}/${_._id}/refresh`;t.post(ee).then(()=>{_._type==="repo"?U(_._id,Q=>{if(Q.status!=="ready"){J({body:Q.statusMessage||`The repository is ${Q.status}.`});return}G.title=`${_._id} is refreshed.`,G.body=`The ${O} ${_._id} is refreshed.`},J,_.status):(G.title=`${_._id} is refreshed.`,G.body=`The ${O} ${_._id} is refreshed.`,H())},J)},e.extendItem=_=>{let O=ae(_._type),G=He({title:`Extending ${_._id}...`,date:new Date,body:`The expiration of ${O} ${_._id} is going to be extended by 6 months.`});e.addToast(G);let J=`${ie(_._type)}/${_._id}/extend`;t.post(J).then(()=>{_._type==="repo"?U(_._id,()=>{G.title=`${_._id} is extended.`,G.body=`The expiration of ${O} ${_._id} is extended by 6 months.`},void 0,_.status):(G.title=`${_._id} is extended.`,G.body=`The expiration of ${O} ${_._id} is extended by 6 months.`,H())},ee=>{G.title=`Error during the extension of ${_._id}.`,G.body=ee.data&&ee.data.error||ee.body,H()})},e.itemFilter=_=>{if(e.projectView==="attention"&&!e.needsAttention(_)||e.typeFilter!=="all"&&_._type!==e.typeFilter||e.filters.status[_._statusKey]===!1)return!1;let O=e.search.trim().toLowerCase();return!!(O.length==0||_._label&&String(_._label).toLowerCase().indexOf(O)>-1||_._source&&String(_._source).toLowerCase().indexOf(O)>-1||_._id&&String(_._id).toLowerCase().indexOf(O)>-1||_.conference&&String(_.conference).toLowerCase().indexOf(O)>-1)}};var Wa=function(e,t,n){let r=ct();e.repoId=n.repoId,e.repo=null,e.progress=0,e.rateLimitResetAt=0,e.rateLimitCountdown="";var s=null;let i=null,a=!1;function u(h){e.rateLimitResetAt=h,s&&r.interval.cancel(s);function g(){var k=Math.max(0,Math.ceil((h-Date.now())/1e3));if(k<=0)e.rateLimitCountdown="",e.rateLimitResetAt=0,r.interval.cancel(s),s=null;else{var m=Math.floor(k/60),y=k%60;e.rateLimitCountdown=m>0?m+"m "+y+"s":y+"s"}}g(),s=r.interval(g,1e3)}e.on("dispose",function(){a=!0,s&&r.interval.cancel(s),i&&r.timeout.cancel(i)});function f(h){if(!h)return h;var g=h.match(/^rate_limited:(\d+)$/);return g?(u(parseInt(g[1],10)),null):(e.rateLimitResetAt=0,h)}e.getStatus=()=>{a||t.get("/api/repo/"+e.repoId,{repoId:e.repoId,repoUrl:e.repoUrl}).then(h=>{if(!a){e.repo=h.data,h.data.rateLimitResetAt?u(h.data.rateLimitResetAt):e.repo.statusMessage=f(e.repo.statusMessage),e.repo.status=="ready"?e.progress=100:e.repo.status=="queue"?e.progress=10:e.repo.status=="downloaded"?e.progress=50:e.repo.status=="download"||e.repo.status=="preparing"?e.progress=25:e.repo.status=="anonymizing"&&(e.progress=75);var g=!["ready","removed","expired"].includes(e.repo.status);e.repo.status=="error"&&!e.rateLimitResetAt&&(g=!1),g&&(i=r.timeout(e.getStatus,2e3))}},h=>{e.error=h.data.error})},e.getStatus()},on=function(e,t,n,r,s,i,a){e.sourceUrl="",e.workspaceOpen=!1,e.sourceUrlError="",e.previewStatus="idle",e.sourceLoading=!1,e.mobilePane="settings";let u=window.matchMedia?.("(max-width: 767px)");e.mobileWorkspace=!!u?.matches,u?.addEventListener&&Qt()(u,"change",S=>{e.mobileWorkspace=S.matches}),e.selectMobilePane=S=>{e.mobilePane=S};let f=0,h=!1,g=new Set,k=(S,I=!1)=>!h&&S.generation===f&&S.url===e.sourceUrl.trim()&&S.connection===e.githubConnection&&(!I||S.branch===e.source.branch),m=()=>{let S={generation:f,url:e.sourceUrl.trim(),connection:e.githubConnection,branch:e.source.branch};return g.add(S),e.sourceLoading=!0,S},y=S=>{g.delete(S),h||(e.sourceLoading=[...g].some(I=>k(I)))};e.on("dispose",()=>{h=!0,f++});let E=null,w=S=>S.gistId&&!S.repo?"gist:"+S.gistId.toLowerCase():(S.owner+"/"+S.repo).toLowerCase()+(S.pullRequestId?"/pull/"+S.pullRequestId:""),R=or(e,["sourceUrl","terms","repoId","pullRequestId","gistId","source","options","conference","githubConnection"],"anonymize:"+(s.path?.()||""));e.discardDraft=async()=>{R.discard(),e.workspaceOpen=!!e.sourceUrl,e.error=null,e.sourceUrl?await e.urlSelected(!0):(f++,e.sourceLoading=!1,e.detectedType=null,e.details=null,e.sourceUrlError="",oe.cancel(),_e.cancel(),Se.cancel(),e.previewStatus="idle")},e.githubConnection=void 0,e.githubConnections=null,e.gistOAuthRequired=!1,e.gistAppRequired=!1;let D=()=>{let S={};for(let I of["sourceUrl","terms","repoId","pullRequestId","gistId","source","options","conference","githubConnection"])S[I]=e[I];sessionStorage.setItem("github-access-draft",JSON.stringify({path:s.path(),savedAt:Date.now(),draft:S}))};e.connectGistApp=()=>{D(),window.location.href="/github/app/login?returnTo="+encodeURIComponent(s.path())},e.connectGistOAuth=()=>{D(),window.location.href="/github/login?returnTo="+encodeURIComponent(s.path())},e.grantGitHubAccess=()=>{D();let S=s.path(),I=ae(e.sourceUrl)||"",j=e.githubConnections?.appConnected?"/github/app/install":"/github/app/login";window.location.href=j+"?returnTo="+encodeURIComponent(S)+"&repository="+encodeURIComponent(I)+"&install=1"},e.chooseGitHubConnection=async S=>{e.githubConnection=S,e.readme="",e.sourceUrl&&await _()},e.detectedType=null,e.repoId="",e.pullRequestId="",e.gistId="",e.terms="",e.defaultTerms="",e.branches=[],e.source={branch:"",commit:""},e.options={expirationMode:"remove",expirationDate:new Date,update:!1,image:!0,pdf:!0,notebook:!0,link:!0,body:!0,title:!0,origin:!1,diff:!0,content:!0,comments:!0,username:!0,date:!0};function A(){let S=new Date;return S.setMonth(S.getMonth()+6),S}e.options.expirationDate=A();function V(S){let I=S.getFullYear(),j=String(S.getMonth()+1).padStart(2,"0"),M=String(S.getDate()).padStart(2,"0");return`${I}-${j}-${M}`}e.minExpirationDate=V(new Date);let H=new Date;H.setFullYear(H.getFullYear()+1),e.maxExpirationDate=V(H),e.anonymize_readme="",e.readme="",e.html_readme="",e.isUpdate=!1;function q(S){t.get("/api/user/default").then(I=>{let j=I.data;j.terms&&(e.defaultTerms=j.terms.join(` -`)),e.options=Object.assign({},e.options,j.options),e.options.expirationDate=j.options&&j.options.expirationDate?new Date(j.options.expirationDate):A(),!r.repoId&&!r.pullRequestId&&!r.gistId&&!e.anonymize?.terms?.dirty&&(e.terms=e.defaultTerms),S&&S()})}function U(S,I,j){e.anonymize&&e.anonymize[S]&&e.anonymize[S].setValidity(I,j)}function ae(S){try{let I=parseGithubUrl(S);if(I&&I.owner&&I.repo)return I.owner+"/"+I.repo}catch{}return null}e.reconnectingSource=!1,e.reconnectRepositoryId=void 0,e.reconnectSource=async()=>{if(confirm("Reconnect to the repository currently at this GitHub URL? Review its branch and commit before saving. Saving will replace the published snapshot.")){e.reconnectingSource=!0,e.reconnectRepositoryId=void 0,e.source.commit="",e.source.branch="",e.readme="",e.branches=[];try{await G()}catch{}}};function ie(){return e.reconnectingSource||!e.isUpdate||!e._originalRepositoryID?void 0:ae(e.sourceUrl)===e._originalFullName?e._originalRepositoryID:void 0}async function _(){e._preservingDraft=!0;try{await e.urlSelected(!0)}finally{e._preservingDraft=!1}}async function O(){let S;try{S=JSON.parse(sessionStorage.getItem("github-access-draft")||"null")}catch{return!1}if(!S||S.path!==s.path()||Date.now()-S.savedAt>=30*6e4)return R.restore()?(e.sourceUrl&&await _(),!0):!1;R.restore();for(let I of["sourceUrl","terms","repoId","pullRequestId","gistId","source","options","conference","githubConnection"])Object.prototype.hasOwnProperty.call(S.draft,I)&&(e[I]=S.draft[I]);return e.options.expirationDate&&(e.options.expirationDate=new Date(e.options.expirationDate)),await _(),sessionStorage.removeItem("github-access-draft"),!0}q(()=>{!r.repoId&&!r.pullRequestId&&!r.gistId&&a(O,0),r.repoId&&r.repoId!=""&&(e.isUpdate=!0,e.detectedType="repo",e.repoId=r.repoId,t.get("/api/repo/"+e.repoId).then(async S=>{e.githubConnection=S.data.connection||"oauth",e.sourceUrl="https://github.com/"+S.data.source.fullName,e._originalFullName=S.data.source.fullName,e.terms=S.data.options.terms.filter(I=>I).join(` -`),e.source=S.data.source,e.role=S.data.role||"owner",e.coauthors=S.data.coauthors||[],e._originalBranch=S.data.source.branch,e.options=Object.assign({},e.options,S.data.options),e.conference=S.data.conference,e._originalConference=S.data.conference,e.repositoryID=S.data.source.repositoryID,e._originalRepositoryID=S.data.source.repositoryID,S.data.options.expirationDate&&(e.options.expirationDate=new Date(S.data.options.expirationDate)),E=w(parseGithubUrl(e.sourceUrl)),!await O()&&(await Promise.all([G(),J()]),ue())},()=>{s.url("/404")})),r.pullRequestId&&r.pullRequestId!=""&&(e.isUpdate=!0,e.detectedType="pr",e.pullRequestId=r.pullRequestId,t.get("/api/pr/"+e.pullRequestId).then(async S=>{if(e.githubConnection=S.data.connection||"oauth",e.sourceUrl="https://github.com/"+S.data.source.repositoryFullName+"/pull/"+S.data.source.pullRequestId,e.terms=S.data.options.terms.filter(I=>I).join(` -`),e.source=S.data.source,e.options=Object.assign({},e.options,S.data.options),e.conference=S.data.conference,e._originalConference=S.data.conference,S.data.options.expirationDate&&(e.options.expirationDate=new Date(S.data.options.expirationDate)),E=w(parseGithubUrl(e.sourceUrl)),!await O())try{await pe()}catch{}},()=>{s.url("/404")})),r.gistId&&r.gistId!=""&&(e.isUpdate=!0,e.detectedType="gist",e.gistId=r.gistId,t.get("/api/gist/"+e.gistId).then(async S=>{e.sourceUrl="https://gist.github.com/"+S.data.source.gistId,e.terms=S.data.options.terms.filter(I=>I).join(` -`),e.source=S.data.source,e.options=Object.assign({},e.options,S.data.options),e.conference=S.data.conference,e._originalConference=S.data.conference,S.data.options.expirationDate&&(e.options.expirationDate=new Date(S.data.options.expirationDate)),E=w(parseGithubUrl(e.sourceUrl)),!await O()&&await Ae()},()=>{s.url("/404")}))}),t.get("/github/connections").then(S=>{e.githubConnections=S.data,!r.repoId&&!r.pullRequestId&&!r.gistId&&e.githubConnection===void 0&&S.data.appEnabled&&S.data.appConnected&&(e.githubConnection="github-app",e.sourceUrl&&e.workspaceOpen&&_())}).catch(()=>{}),e.urlSelected=async(S=!1)=>{let I=++f,j;try{j=parseGithubUrl(e.sourceUrl.trim())}catch{e.sourceLoading=!1,oe.cancel(),_e.cancel(),Se.cancel(),e.previewStatus="idle",e.sourceUrlError=e.sourceUrl?"Please provide a valid GitHub URL.":"",U("sourceUrl","github",!1);return}let M=w(j),v=S||E===M;E=M,e.sourceUrlError="",U("sourceUrl","github",!0);let C=document.activeElement?.id==="sourceUrl-landing";e.workspaceOpen=!0,C&&a(()=>document.getElementById("sourceUrl")?.focus(),0),e.reconnectingSource=!1,e.reconnectRepositoryId=void 0,!v&&!e.isUpdate&&(e.repoId="",e.pullRequestId="",e.gistId=""),e.details=null,e.branches=[],v||(e.source={type:"GitHubStream",branch:"",commit:""}),oe.cancel(),_e.cancel(),Se.cancel(),le.clear(),Ee.clear(),e.previewStatus="idle",e.anonymize_readme="",e.readme="",e.html_readme="",e.detectedType=null,e.gistOAuthRequired=!1,e.gistAppRequired=!1,e._preservingDraft=v;try{j.gistId&&!j.repo?(e.detectedType="gist",e.source={gistId:j.gistId},await Ae()):j.pullRequestId?(e.detectedType="pr",e.source={repositoryFullName:j.owner+"/"+j.repo,pullRequestId:j.pullRequestId},await pe()):(e.detectedType="repo",await Promise.all([G(),J()]),ue())}catch{}finally{I===f&&(e._preservingDraft=!1)}$('[data-toggle="tooltip"]').tooltip()},$('[data-toggle="tooltip"]').tooltip(),e.watch("source.branch",async()=>{if(e.detectedType!=="repo")return;let S=e.branches.filter(j=>j.name==e.source.branch)[0];if(!S)return;!(!e.reconnectingSource&&e.isUpdate&&e._originalBranch===e.source.branch&&e.source.commit)&&!(e._preservingDraft&&e.source.commit)&&(e.source.commit=S.commit),e.readme=S.readme,await J(),ue()}),e.getBranches=async S=>{let I=parseGithubUrl(e.sourceUrl),j=m();try{let M=await t.get(`/api/repo/${I.owner}/${I.repo}/branches`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&r.repoId&&ae(e.sourceUrl)===e._originalFullName?r.repoId:void 0,connection:e.githubConnection,force:S===!0||e.reconnectingSource?"1":"0",repositoryID:ie()}});if(!k(j))return;e.branches=M.data,e.sourceUnreachable=!1,e.source.branch||(e.source.branch=e.details.defaultBranch);let v=e.branches.filter(C=>C.name==e.source.branch);v.length>0&&(!(!e.reconnectingSource&&!S&&e.isUpdate&&!e.options.update&&e._originalBranch===e.source.branch&&e.source.commit)&&!(e._preservingDraft&&e.source.commit)&&(e.source.commit=v[0].commit),e.readme=v[0].readme,await J(S))}catch(M){if(!k(j))return;e.branches=[],e.sourceUnreachable=M&&(M.status===404||M.data&&M.data.error==="repo_not_found");let v=M&&M.data&&M.data.error||(M&&M.status===404?"repo_not_found":"unknown_error");i("ERRORS."+v).then(C=>{e.toasts=e.toasts||[],e.addToast({title:"Error",date:new Date,body:C}),e.error=C},console.error),typeof U=="function"&&U("sourceUrl","missing",!1)}finally{y(j)}};async function G(){let S=parseGithubUrl(e.sourceUrl),I=m();try{z();let j=await t.get(`/api/repo/${S.owner}/${S.repo}/`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&r.repoId&&ae(e.sourceUrl)===e._originalFullName?r.repoId:void 0,connection:e.githubConnection,repositoryID:ie(),force:"1"}});if(!k(I))return;e.details=j.data,e.reconnectingSource&&(e.reconnectRepositoryId=e.details.externalId),e.details&&e.details.id&&(e.repositoryID=e.details.id),e.repoId||(e.repoId=e.details.repo+"-"+generateRandomId(4)),await e.getBranches(e.reconnectingSource)}catch(j){if(!k(I))return;throw j.data&&(i("ERRORS."+j.data.error).then(M=>{e.addToast({title:"Error",date:new Date,body:M}),e.error=M},console.error),te(j.data.error)),U("sourceUrl","missing",!1),j}finally{y(I)}}async function J(S){if(e.readme&&!S)return e.readme;let I=parseGithubUrl(e.sourceUrl),j=m();try{let M=await t.get(`/api/repo/${I.owner}/${I.repo}/readme`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&r.repoId&&ae(e.sourceUrl)===e._originalFullName?r.repoId:void 0,connection:e.githubConnection,force:S===!0?"1":"0",branch:e.source.branch,repositoryID:ie()}});k(j,!0)&&(e.readme=M.data)}catch{k(j,!0)&&(e.readme="")}finally{y(j)}}function ee(){let S={terms:e.terms?e.terms.split(` -`):[],image:!!e.options.image,link:!!e.options.link,repoId:e.repoId};e.source&&e.source.branch&&(S.branchName=e.source.branch);try{let I=parseGithubUrl(e.sourceUrl);S.repoName=`${I.owner}/${I.repo}`}catch{}return S}function Q(S,I,j){let M=null,v=0,C=()=>{if(e.detectedType!==S)return;M&&a.cancel(M);let P=++v;e.previewStatus="loading",M=a(()=>{M=null;let F=I();if(!F){e.previewStatus="idle";return}t.post("/api/anonymize-preview",F).then(B=>{P===v&&(j(B.data,F),e.previewStatus="ready")}).catch(()=>{P===v&&(e.previewStatus="error")})},200)};return C.cancel=()=>{v++,M&&a.cancel(M),M=null},e.on("dispose",C.cancel),C}e.retryPreview=()=>{e.detectedType==="repo"&&oe(),e.detectedType==="pr"&&_e(),e.detectedType==="gist"&&Se()};let oe=Q("repo",()=>e.readme?{content:e.readme,options:ee()}:null,S=>{if(typeof S?.content!="string")throw Error("Invalid preview response");e.anonymize_readme=S.content;let I="";try{let M=parseGithubUrl(e.sourceUrl),v=e.source.branch||e.details&&e.details.defaultBranch||"main";I=`https://github.com/${M.owner}/${M.repo}/raw/${v}/`}catch{}let j=renderMD(e.anonymize_readme,I);e.html_readme=j,a(Prism.highlightAll,150)});function ue(){!e.anonymize||!e.anonymize.terms||(e.termsRegexWarning=!!e.terms&&!!e.terms.match(/[-[\]{}()*+?.,\\^$|#]/g),oe())}async function pe(){let S=parseGithubUrl(e.sourceUrl),I=m();try{z();let j=await t.get(`/api/pr/${S.owner}/${S.repo}/${S.pullRequestId}`,{params:{connection:e.githubConnection}});if(!k(I))return;e.details=j.data,e.pullRequestId||(e.pullRequestId=S.repo+"-PR"+S.pullRequestId+"-"+generateRandomId(4))}catch(j){if(!k(I))return;throw j.data&&(i("ERRORS."+j.data.error).then(M=>{e.addToast({title:"Error",date:new Date,body:M}),e.error=M},console.error),te(j.data.error)),U("sourceUrl","missing",!1),j}finally{y(I)}}let le=He(new Map);function Ie(){let S=new Set,I=e.details&&e.details.pullRequest;if(!I)return S;typeof I.title=="string"&&S.add(I.title),typeof I.body=="string"&&S.add(I.body),typeof I.diff=="string"&&S.add(I.diff);let j=I.comments||[];for(let M of j)typeof M.author=="string"&&S.add(M.author),typeof M.body=="string"&&S.add(M.body);return S}let _e=Q("pr",()=>{let S=Ie(),I=Array.from(S);return I.length===0?null:{contents:I,options:ee()}},(S,I)=>{if(!Array.isArray(S?.contents)||S.contents.length!==I.contents.length||S.contents.some(v=>typeof v!="string"))throw Error("Invalid preview response");let j=I.contents,M=new Map;for(let v=0;vle.set(C,v))});e.anonymizePrContent=function(S){return S&&(le.has(S)?le.get(S):"")};async function Ae(){let S=parseGithubUrl(e.sourceUrl),I=m();try{z(),e.gistOAuthRequired=!1,e.gistAppRequired=!1;let j=await t.get(`/api/gist/source/${S.gistId}`);if(!k(I))return;e.details=j.data,e.gistId||(e.gistId="gist-"+S.gistId.substring(0,6)+"-"+generateRandomId(4))}catch(j){if(!k(I))return;if(j.data?.error==="github_app_reconnect_required"){e.gistAppRequired=!0,U("sourceUrl","missing",!1);return}if(j.data?.error==="github_oauth_required"){e.gistOAuthRequired=!0,U("sourceUrl","missing",!1);return}throw j.data&&(i("ERRORS."+j.data.error).then(M=>{e.addToast({title:"Error",date:new Date,body:M}),e.error=M},console.error),te(j.data.error)),U("sourceUrl","missing",!1),j}finally{y(I)}}let Ee=He(new Map);function Pe(){let S=new Set,I=e.details&&e.details.gist;if(!I)return S;typeof I.description=="string"&&S.add(I.description),typeof I.ownerLogin=="string"&&S.add(I.ownerLogin);let j=I.files||[];for(let v of j)typeof v.filename=="string"&&S.add(v.filename),typeof v.content=="string"&&S.add(v.content);let M=I.comments||[];for(let v of M)typeof v.author=="string"&&S.add(v.author),typeof v.body=="string"&&S.add(v.body);return S}let Se=Q("gist",()=>{let S=Pe(),I=Array.from(S);return I.length===0?null:{contents:I,options:ee()}},(S,I)=>{if(!Array.isArray(S?.contents)||S.contents.length!==I.contents.length||S.contents.some(v=>typeof v!="string"))throw Error("Invalid preview response");let j=I.contents,M=new Map;for(let v=0;vEe.set(C,v)),$e()});e.anonymizeGistContent=function(S){return S&&(Ee.has(S)?Ee.get(S):"")},e.previewGistFiles=[];function $e(){let S=e.details&&e.details.gist&&e.details.gist.files||[];e.previewGistFiles=S.map(I=>({filename:e.anonymizeGistContent(I.filename),content:e.anonymizeGistContent(I.content),language:I.language}))}e.watch("details.gist.files",$e,!0),e.watch("terms",$e);function Ue(){let S=e.conference;if(e.conference_data=null,!S)return;let I=e.isUpdate&&S===e._originalConference;t.get("/api/conferences/"+S).then(j=>{e.conference===S&&(e.conference_data=j.data,e.conference_data.startDate=new Date(e.conference_data.startDate),e.conference_data.endDate=new Date(e.conference_data.endDate),!I&&(e.options.expirationDate=new Date(e.conference_data.endDate),e.options.expirationMode="remove",e.options.update=e.conference_data.options.update,e.options.image=e.conference_data.options.image,e.options.pdf=e.conference_data.options.pdf,e.options.notebook=e.conference_data.options.notebook,e.options.link=e.conference_data.options.link))},()=>{e.conference===S&&(e.conference_data=null)})}function z(){U("repoId","used",!0),U("repoId","format",!0),U("pullRequestId","used",!0),U("pullRequestId","format",!0),U("gistId","used",!0),U("gistId","format",!0),U("sourceUrl","used",!0),U("sourceUrl","missing",!0),U("sourceUrl","access",!0),U("sourceUrl","github",!0),U("commit","exists",!0),U("conference","activated",!0),U("terms","format",!0),e.termsRegexWarning=!1}function ne(){let S=e.anonymize&&e.anonymize.expirationDate;return!e.options.expirationDate||S&&S.invalid?(S&&S.setDirty&&S.setDirty(),e.error="Please choose a valid expiration date.",!0):!1}function te(S){let I=e.detectedType==="pr"?"pullRequestId":e.detectedType==="gist"?"gistId":"repoId";switch(S){case"repoId_already_used":U(I,"used",!1);break;case"invalid_repoId":U(I,"format",!1);break;case"options_not_provided":U(I,"format",!1);break;case"repo_already_anonymized":U("sourceUrl","used",!1);break;case"invalid_terms_format":U("terms","format",!1);break;case"repo_not_found":U("sourceUrl","missing",!1);break;case"repo_not_accessible":U("sourceUrl","access",!1);break;case"commit_not_found":U("commit","exists",!1);break;case"conf_not_activated":U("conference","activated",!1);break}}e.coauthors=e.coauthors||[],e.coauthorResults=[],e.coauthorError="",e.searchCoauthors=()=>{let S=(e.coauthorSearch||"").trim();if(e.coauthorError="",S.length<2){e.coauthorResults=[];return}t.get("/api/user/search/github-users",{params:{q:S}}).then(I=>{let j=new Set((e.coauthors||[]).map(M=>(M.username||"").toLowerCase()));e.coauthorResults=(I.data||[]).filter(M=>!j.has((M.username||"").toLowerCase()))},()=>{e.coauthorResults=[]})},e.addCoauthor=(S,I)=>{I&&I.preventDefault(),!(!S||!S.username)&&t.post("/api/repo/"+e.repoId+"/coauthors",{username:S.username}).then(j=>{e.coauthors=j.data||[],e.coauthorResults=[],e.coauthorSearch="",e.coauthorError=""},j=>{let M=j&&j.data&&j.data.error||"unknown_error";e.coauthorError=M})},e.removeCoauthor=S=>{!S||!S.username||confirm("Remove co-author "+S.username+"?")&&t.delete("/api/repo/"+e.repoId+"/coauthors/"+encodeURIComponent(S.username)).then(I=>{e.coauthors=I.data||[]},I=>{let j=I&&I.data&&I.data.error||"unknown_error";e.coauthorError=j})},e.anonymizeRepo=S=>{if(e.sourceLoading){e.error="Wait for the source to finish loading before saving.";return}if(e.reconnectingSource&&!e.reconnectRepositoryId||ne())return;if(e.anonymize?.invalid||e.sourceUrlError){e.error="Please correct the highlighted fields before saving.";return}let I=S.currentTarget||S.target.closest?.("button")||S.target;I.disabled=!0;let j=parseGithubUrl(e.sourceUrl),M={repoId:e.repoId,terms:e.terms.trim().split(` -`).filter(C=>C),connection:e.githubConnection,fullName:`${j.owner}/${j.repo}`,repository:e.sourceUrl,reconnectRepositoryId:e.reconnectRepositoryId,options:e.options,source:e.source,conference:e.conference};e.details&&(M.options.pageSource=e.details.pageSource),z();let v=e.isUpdate?"/api/repo/"+e.repoId:"/api/repo/";t.post(v,M,{headers:{"Content-Type":"application/json"}}).then(()=>{R.clear(),window.location.href="/status/"+e.repoId},C=>{C.data&&(i("ERRORS."+C.data.error).then(P=>{e.error=P},console.error),te(C.data.error))}).finally(()=>{I.disabled=!1})},e.anonymizeGist=S=>{if(e.sourceLoading){e.error="Wait for the source to finish loading before saving.";return}if(ne())return;if(e.anonymize?.invalid||e.sourceUrlError){e.error="Please correct the highlighted fields before saving.";return}let I=S.currentTarget||S.target.closest?.("button")||S.target;I.disabled=!0;let j=parseGithubUrl(e.sourceUrl),M={gistId:e.gistId,terms:e.terms.trim().split(` -`).filter(C=>C),source:{gistId:j.gistId},options:e.options,conference:e.conference};z();let v=e.isUpdate?"/api/gist/"+e.gistId:"/api/gist/";t.post(v,M,{headers:{"Content-Type":"application/json"}}).then(()=>{R.clear(),window.location.href="/gist/"+e.gistId},C=>{C.data&&(i("ERRORS."+C.data.error).then(P=>{e.error=P},console.error),te(C.data.error))}).finally(()=>{I.disabled=!1})},e.anonymizePullRequest=S=>{if(e.sourceLoading){e.error="Wait for the source to finish loading before saving.";return}if(ne())return;if(e.anonymize?.invalid||e.sourceUrlError){e.error="Please correct the highlighted fields before saving.";return}let I=S.currentTarget||S.target.closest?.("button")||S.target;I.disabled=!0;let j=parseGithubUrl(e.sourceUrl),M={pullRequestId:e.pullRequestId,connection:e.githubConnection,terms:e.terms.trim().split(` -`).filter(C=>C),source:{repositoryFullName:`${j.owner}/${j.repo}`,pullRequestId:j.pullRequestId},options:e.options,conference:e.conference};z();let v=e.isUpdate?"/api/pr/"+e.pullRequestId:"/api/pr/";t.post(v,M,{headers:{"Content-Type":"application/json"}}).then(()=>{R.clear(),window.location.href="/pr/"+e.pullRequestId},C=>{C.data&&(i("ERRORS."+C.data.error).then(P=>{e.error=P},console.error),te(C.data.error))}).finally(()=>{I.disabled=!1})},e.watch("conference",()=>{Ue()}),e.watch("terms",()=>{e.detectedType==="repo"&&ue(),e.detectedType==="pr"&&_e(),e.detectedType==="gist"&&Se()}),e.watch("options.image",()=>{e.detectedType==="repo"&&ue(),e.detectedType==="pr"&&_e(),e.detectedType==="gist"&&Se()}),e.watch("options.link",()=>{e.detectedType==="repo"&&ue(),e.detectedType==="pr"&&_e(),e.detectedType==="gist"&&Se()}),e.watch("details",()=>{e.detectedType==="pr"&&_e(),e.detectedType==="gist"&&Se()},!0)},sr=function(e,t,n,r,s,i){let a=ct(),u=Qt();e.on("dark-mode",(O,G)=>{e.aceOption&&(G?e.aceOption.theme="nord_dark":e.aceOption.theme="chrome")});let f=0,h=!1;e.on("dispose",()=>{h=!0,f++,g&&g.resolve()}),e.files=[],e.isMac=/Mac|iPhone|iPad|iPod/.test(navigator.platform||navigator.userAgent),e.fileSearchQuery="",e.fileSearchResults=null,e.fileSearchLoading=!1,u(document,"keydown",function(O){if((O.metaKey||O.ctrlKey)&&O.key==="k"){O.preventDefault();var G=document.querySelector(".tree-search-input");G&&(G.focus(),G.select())}});var g=null;e.onFileSearchChange=function(){g&&(g.resolve(),g=null);let O=e.fileSearchQuery;if(!O||O.length<2){e.fileSearchResults=null,e.fileSearchLoading=!1;return}e.fileSearchLoading=!0;let G=i.defer();g=G,t.get(`/api/repo/${e.repoId}/files/search?q=${encodeURIComponent(O)}`,{timeout:G.promise}).then(function(J){if(!(h||g!==G)){g=null,e.fileSearchLoading=!1;var ee={};e.files.forEach(function(z){ee[(z.path||"")+"/"+z.name]=!0});for(var Q=[],oe={},ue=0;ue0&&e.files.push.apply(e.files,Q);for(var Pe=[],Se=0;Se0&&e.files.push.apply(e.files,Pe),e.fileSearchResults=J.data}},function(){!h&&g===G&&(g=null,e.fileSearchLoading=!1,e.fileSearchResults=[])})};let k={yml:"yaml",txt:"text",py:"python",js:"javascript",ts:"typescript"},m=["license","txt"],y=["png","jpg","jpeg","gif","svg","ico","bmp","tiff","tif","webp","avif","heif","heic"],E=["wav","mp3","ogg","wma","flac","aac","m4a"],w=["mp4","avi","webm","mov","mpg","mpeg","mkv","flv","wmv","3gp","3g2","m4v","f4v","f4p","f4a","f4b"];e.on("routeUpdate",function(O,G){if(e.repoId!=r.repoId)return _();if((r.path||"")!=e.filePath){e.filePath=r.path||"",e.paths=e.filePath.split("/").filter(J=>J&&J.trim().length>0),ie();for(let J=0;J0?e.paths.slice(0,J).join("/"):"";e.files.some(oe=>oe.path===ee)||e.getFiles(ee)}}});function R(){if(e.paths[0]!="")return;let O=["readme.md","readme.txt","readme.org","readme.1st","readme"],G={};for(let ee of e.files)ee.name.toLowerCase().indexOf("readme")>-1&&(G[ee.name.toLowerCase()]=ee.name);let J=null;for(let ee of O)if(G[ee]){J=ee;break}if(!J&&Object.keys(G).length>0&&(J=Object.keys(G)[0]),J){let ee=n.url();ee[ee.length-1]!="/"&&(ee+="/"),n.url(ee+encodePathForUrl(G[J]))}}e.fileCounts=null,e.getFiles=function(O){let G=e.repoId;return t.get(`/api/repo/${e.repoId}/files/?path=${encodeURIComponent(O)}&v=${e.options.lastUpdateDate}`).then(function(J){if(h||G!==e.repoId)return[];let ee=O||"";return e.files=e.files.filter(Q=>Q.path!==ee),e.files.push(...J.data),J.data},function(J){if(h||G!==e.repoId)return[];e.type="error",e.content=J&&J.data&&J.data.error||"unknown_error",e.files=[]})};function D(){let O=e.repoId;t.get(`/api/repo/${e.repoId}/files/counts`).then(function(G){h||O!==e.repoId||(e.fileCounts=G.data)},function(){e.fileCounts={}})}function A(){return e.files.filter(O=>O.name==e.paths[e.paths.length-1]&&O.path==e.paths.slice(0,e.paths.length-1).join("/"))[0]}var V=null;e.on("dispose",function(){V&&a.interval.cancel(V)});function H(O){if(h)return;let G=e.repoId;t.get(`/api/repo/${e.repoId}/options`).then(J=>{if(!(h||G!==e.repoId)){if(e.options=J.data,e.options.url){window.location=e.options.url;return}O&&O(J.data)}},J=>{if(!(h||G!==e.repoId)){var ee=J.data||{};if(ee.error==="rate_limited"&&ee.resetAt){let oe=function(){var ue=Math.max(0,Math.ceil((e.rateLimitResetAt-Date.now())/1e3));if(ue<=0)e.rateLimitCountdown="",e.rateLimitResetAt=0,V&&(a.interval.cancel(V),V=null),H(O);else{var pe=Math.floor(ue/60),le=ue%60;e.rateLimitCountdown=pe>0?pe+"m "+le+"s":le+"s"}};var Q=oe;e.type="rate_limited",e.rateLimitResetAt=ee.resetAt,V&&a.interval.cancel(V),oe(),V=a.interval(oe,1e3)}else ee.error==="repository_not_ready"?(e.type="loading",a.timeout(function(){H(O)},3e3)):(e.type="error",e.content=ee.error)}})}e.toggleSource=function(){e.showSource=!e.showSource},e.toggleAllowScripts=function(){e.allowScripts=!e.allowScripts};function q(O){return k[O]?k[O]:O}function U(O){return O=="pdf"?"pdf":O=="html"||O=="htm"?"html-doc":O=="md"?"md":O=="org"?"org":O=="ipynb"?"IPython":m.indexOf(O)>-1?"text":y.indexOf(O)>-1?"image":w.indexOf(O)>-1?"media":E.indexOf(O)>-1?"audio":"code"}function ae(O,G){let J=f;if(!O){e.type="error",e.content="no_file_selected";return}let ee=e.type;e.type="loading",e.content="loading";let Q=G&&G.sha||"0";t.get(`/api/repo/${e.repoId}/file/${encodePathForUrl(O)}?v=`+Q,{transformResponse:oe=>oe}).then(oe=>{if(!(h||J!==f)){if(e.type=ee,e.content=oe.data,e.content==""&&(e.content=null),e.type=="md"&&(e.content=renderMD(oe.data,n.url()+"/../"),e.type="html"),e.type=="org"){let pe=contentAbs2Relative(oe.data);var ue=new Org.Parser().parse(pe).convert(Org.ConverterHTML,{headerOffset:1,exportFromLineNumber:!1,suppressSubScriptHandling:!0,suppressAutoLink:!1});e.content=DOMPurify.sanitize(ue.toString()),e.type="html"}e.type=="code"&&oe.headers("content-type")=="application/octet-stream"&&(e.type="binary",e.content="binary"),a.timeout(()=>{Prism.highlightAll()},50)}},oe=>{if(!(h||J!==f)){e.type="error",e.content="unknown_error";try{oe.data=JSON.parse(oe.data),oe.data.error?e.content=oe.data.error:e.content=oe.data}catch{console.log(oe),oe.status==-1?e.content="request_error":oe.status==502&&(e.content="unreachable")}}})}function ie(){f++,e.content="",e.file=A();let O="0";e.file&&e.file.sha&&(O=e.file.sha),e.url=`/api/repo/${e.repoId}/file/${encodePathForUrl(e.filePath)}?v=${O}`;let G=e.filePath.substring(0,e.filePath.lastIndexOf("/")+1);e.fileBaseUrl=`/api/repo/${e.repoId}/file/${G?encodePathForUrl(G):""}`,e.showSource=!1,e.allowScripts=!1;let J=e.filePath.toLowerCase(),ee=J.lastIndexOf(".");if(ee>-1&&(J=J.substring(ee+1)),e.aceOption={readOnly:!0,useWrapMode:!0,showGutter:!0,theme:"chrome",useSoftTab:!0,tabSize:2,fontSize:15,keyBinding:"vscode",fullLineSelection:!0,highlightActiveLine:!1,highlightGutterLine:!1,cursor:"hide",showInvisibles:!1,showIndentGuides:!0,showPrintMargin:!1,highlightSelectedWord:!1,enableBehaviours:!0,fadeFoldWidgets:!1,mode:q(J),onLoad:function(Q){let oe=ace.require("ace/range").Range,ue=null;function pe(Ae,Ee){ue!==null&&(Q.session.removeMarker(ue),ue=null),Ae!=null&&(ue=Q.session.addMarker(new oe(Ae,0,Ee,1),"highlighted-line","fullLine"))}function le(Ae){let Ee=window.location.hash.match(/^#L(\d+)(?:-L(\d+))?/);if(!Ee){pe(null);return}let Pe=parseInt(Ee[1])-1,Se=Ee[2]?parseInt(Ee[2])-1:Pe;pe(Pe,Se),Ae&&a.timeout(()=>{Q.scrollToLine(Pe,!0,!0,function(){})},100)}le(!0);let Ie=null;Q.on("guttermousedown",function(Ae){let Ee=Ae.getDocumentPosition().row,Pe=Ae.domEvent&&Ae.domEvent.shiftKey,Se=Ee,$e=Ee;Pe&&Ie!==null?(Se=Math.min(Ie,Ee),$e=Math.max(Ie,Ee)):Ie=Ee;let Ue=Se===$e?`#L${Se+1}`:`#L${Se+1}-L${$e+1}`,z=window.location.pathname+window.location.search+Ue;window.history.replaceState(null,"",z),pe(Se,$e),Ae.stop()});let _e=u(window,"hashchange",()=>le(!1));return Q.setFontSize(e.aceOption.fontSize),Q.setReadOnly(e.aceOption.readOnly),Q.setKeyboardHandler(e.aceOption.keyBinding),Q.setSelectionStyle(e.aceOption.fullLineSelection?"line":"text"),Q.setOption("displayIndentGuides",!0),Q.setHighlightActiveLine(e.aceOption.highlightActiveLine),e.aceOption.cursor=="hide"&&(Q.renderer.$cursorLayer.element.style.display="none"),Q.setHighlightGutterLine(e.aceOption.highlightGutterLine),Q.setShowInvisibles(e.aceOption.showInvisibles),Q.setDisplayIndentGuides(e.aceOption.showIndentGuides),Q.renderer.setShowPrintMargin(e.aceOption.showPrintMargin),Q.setHighlightSelectedWord(e.aceOption.highlightSelectedWord),Q.session.setUseSoftTabs(e.aceOption.useSoftTab),Q.session.setTabSize(e.aceOption.tabSize),Q.setBehavioursEnabled(e.aceOption.enableBehaviours),Q.setFadeFoldWidgets(e.aceOption.fadeFoldWidgets),_e}},e.isDarkMode&&(e.aceOption.theme="nord_dark"),e.type=U(J),e.type=="pdf"){e.content="pdf";return}ae(e.filePath,e.file)}function _(){f++,e.files=[],e.content=null,e.fileCounts=null,e.fileSearchQuery="",e.onFileSearchChange(),e.repoId=r.repoId,e.type="loading",e.filePath=r.path||"",e.paths=e.filePath.split("/");let O=e.repoId;H(function(G){D();var J=i.resolve();for(let ee=0;ee0?e.paths.slice(0,ee).join("/"):"";J=J.then(function(){return e.getFiles(Q)}).then(function(){if(e.type==="error")return i.reject("error")})}J.then(function(){h||O!==e.repoId||(e.files.length==1&&e.files[0].name==""?(e.files=[],e.type="empty"):(R(),ie()))})})}_()},Ka=function(e,t,n,r,s){async function i(f){t.get(`/api/pr/${e.pullRequestId}/options`).then(h=>{if(e.options=h.data,e.options.url){window.location=e.options.url;return}f&&f(h.data)},h=>{e.type="error",e.content=h.data.error})}async function a(f){t.get(`/api/pr/${e.pullRequestId}/content`).then(h=>{e.details=h.data,e.tabState={active:h.data.diff?"diff":"comments"},f&&f(h.data)},h=>{e.type="error",e.content=h.data.error})}function u(){e.pullRequestId=r.pullRequestId,e.type="loading",i(f=>{a()})}u()},Ya=function(e,t,n,r,s){async function i(f){t.get(`/api/gist/${e.gistId}/options`).then(h=>{if(e.options=h.data,e.options.url){window.location=e.options.url;return}f&&f(h.data)},h=>{e.type="error",e.content=h.data.error})}async function a(f){t.get(`/api/gist/${e.gistId}/content`).then(h=>{e.details=h.data;let g=h.data&&h.data.files&&h.data.files.length;e.tabState={active:g?"files":"comments"},f&&f(h.data)},h=>{e.type="error",e.content=h.data.error})}function u(){e.gistId=r.gistId,e.type="loading",i(()=>{a()})}u()},Ja=function(e,t,n){e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.conferences=[],e.loading=!0,e.error="",e.search="";let r="conferences.filterPrefs",s={filters:{status:{ready:!0,expired:!1,removed:!1}},orderBy:"name"},i=loadFilterPrefs(r)||{};e.filters={status:Object.assign({},s.filters.status,i.filters&&i.filters.status||{})},e.orderBy=i.orderBy||s.orderBy,e.watch("orderBy",()=>{saveFilterPrefs(r,{filters:e.filters,orderBy:e.orderBy})}),e.watch("filters",()=>{saveFilterPrefs(r,{filters:e.filters,orderBy:e.orderBy})},!0),e.removeConference=function(a){if(!a.removing&&confirm(`Are you sure that you want to remove the conference ${a.name}? All the repositories linked to this conference will expire.`)){a.removing=!0;let u=He({title:`Removing ${a.name}...`,date:new Date,body:`The conference ${a.name} is going to be removed.`});e.addToast(u),t.delete(`/api/conferences/${a.conferenceID}`).then(()=>{u.title=`${a.name} is removed.`,u.body=`The conference ${a.name} is removed.`,e.loadConferences()}).catch(()=>{u.title="Unable to remove conference",u.body="Please try again. The conference has not been removed."}).finally(()=>{a.removing=!1})}},e.loadConferences=()=>(e.loading=!0,e.error="",t.get("/api/conferences/").then(a=>{e.conferences=a.data||[]},a=>{e.error="Unable to load your conferences. Please try again."}).finally(()=>{e.loading=!1})),e.loadConferences(),e.conferenceFilter=a=>{if(e.filters.status[a.status]==!1)return!1;let u=e.search.trim().toLowerCase();return!!(!u||(a.name||"").toLowerCase().includes(u)||(a.conferenceID||"").toLowerCase().includes(u))}},nr=function(e,t,n,r){e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.plans=[],e.editionMode=!1,e.saving=!1,e.error="";function s(){t.get("/api/conferences/"+r.conferenceId).then(g=>{e.options={...e.options,...g.data,billing:g.data.billing||{}},e.options.startDate=new Date(e.options.startDate),e.options.endDate=new Date(e.options.endDate)})}r.conferenceId&&(e.editionMode=!0,s());function i(){t.get("/api/conferences/plans").then(g=>{e.plans=g.data,e.plan=e.plans.filter(k=>k.id==e.options.plan.planID)[0]})}i();let a=new Date;a.setDate(1),a.setMonth(a.getMonth()+1);let u=new Date(a);u.setMonth(a.getMonth()+7,0),e.options={billing:{},startDate:a,endDate:u,plan:{planID:"free_conference"},options:{link:!0,image:!0,pdf:!0,notebook:!0,update:!0,page:!0}},e.plan=null,e.watch("options.plan.planID",()=>{e.plan=e.plans.filter(g=>g.id==e.options.plan.planID)[0]});function f(){e.conference.name.setValidity("required",!0),e.conference.conferenceID.setValidity("pattern",!0),e.conference.conferenceID.setValidity("required",!0),e.conference.conferenceID.setValidity("used",!0),e.conference.startDate.setValidity("required",!0),e.conference.startDate.setValidity("invalid",!0),e.conference.endDate.setValidity("required",!0),e.conference.endDate.setValidity("invalid",!0),e.conference.setValidity("error",!0)}function h(g){switch(g){case"conf_name_missing":e.conference.name.setValidity("required",!1);break;case"conf_id_missing":e.conference.conferenceID.setValidity("required",!1);break;case"conf_id_format":e.conference.conferenceID.setValidity("pattern",!1);break;case"conf_id_used":e.conference.conferenceID.setValidity("used",!1);break;case"conf_start_date_missing":e.conference.startDate.setValidity("required",!1);break;case"conf_end_date_missing":e.conference.endDate.setValidity("required",!1);break;case"conf_start_date_invalid":e.conference.startDate.setValidity("invalid",!1);break;case"conf_end_date_invalid":e.conference.endDate.setValidity("invalid",!1);break;default:e.conference.setValidity("error",!1);break}}e.submit=function(){if(e.saving)return;e.saving=!0,e.error="";let g=JSON.parse(JSON.stringify(e.options)),k=He({title:`Creating ${g.name}...`,date:new Date,body:`The conference ${g.conferenceID} is in creation.`});e.editionMode&&(k.title=`Updating ${g.name}...`,k.body=`The conference '${g.conferenceID}' is updating.`),e.addToast(k),f(),t.post("/api/conferences/"+(e.editionMode?g.conferenceID:""),g).then(()=>{e.editionMode?(k.title=`${g.name} updated`,k.body=`The conference '${g.conferenceID}' is updated.`):(k.title=`${g.name} created`,k.body=`The conference '${g.conferenceID}' is created.`),n.url("/conference/"+g.conferenceID)},m=>{h(m.data?.error),e.error="Unable to save the conference. Please correct any highlighted fields and try again.",e.removeToast(k)}).finally(()=>{e.saving=!1})}},Qa=function(e,t,n,r){e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.conference=null,e.search="",e.filters={status:{ready:!0,expired:!1,removed:!1}},e.orderBy="-anonymizeDate",e.repoFiler=i=>{if(e.filters.status[i.status]==!1)return!1;let a=e.search.trim().toLowerCase();return!!(!a||(i.source?.fullName||"").toLowerCase().includes(a)||(i.repoId||"").toLowerCase().includes(a))};function s(){t.get("/api/conferences/"+r.conferenceId).then(i=>{e.conference=i.data})}s()},Xa=function(e,t){e.connections=null,e.connectionError="",e.busy=!1,e.loadConnections=()=>t.get("/github/connections").then(n=>{e.connections=n.data}).catch(n=>{e.connectionError=n.data?.error||"Unable to load connections."}),e.changeConnection=async(n,r,s)=>{e.busy=!0,e.connectionError="";try{let i=await t.post("/github/connections/migrate",{type:n.type,id:n.id,connection:r,preview:s},{headers:{"X-CSRF-Token":e.connections.csrf}});s?n.eligible=i.data.eligible:await e.loadConnections()}catch(i){e.connectionError=i.data?.error||"Unable to change connection."}finally{e.busy=!1}},e.disconnectOAuth=async()=>{e.busy=!0;try{await t.post("/github/connections/disconnect-oauth",{},{headers:{"X-CSRF-Token":e.connections.csrf}}),await e.loadConnections()}catch(n){e.connectionError=n.data?.error||"Unable to disconnect OAuth."}finally{e.busy=!1}},e.loadConnections()},Za=function(e,t){e.accountRecovery=!1,t.get("/github/account-recovery").then(n=>{e.accountRecovery=n.data.required}).catch(()=>{})};var xa=function(e,t,n){let r=ct(),s=Qt();e.Math=Math,e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.repositories=[],e.total=-1,e.totalPage=0,e.statusCounts=[],e.totalSize=0,e.selected={},e.allSelected=!1;let i=E=>{if(E.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){E.preventDefault();let w=document.querySelector('.admin-filter-toolbar input[type="search"]');w&&w.focus()}};s(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=E=>{E==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[E]="",e.query.page=1},e.chips=[];let a=()=>{let E=[];e.query.owner&&E.push({key:"owner",label:"Owner",value:e.query.owner}),e.query.conference&&E.push({key:"conference",label:"Conference",value:e.query.conference}),e.chips=E};e.showStatusMessage=E=>{let w=E.statusMessage||"(no message)";window.prompt(`Status message for ${E.repoId} (${E.status}):`,w)},e.fetchGithubInfo=E=>{let w=window.open("","_blank");w&&w.document.write("
Loading GitHub info for "+E.repoId+"...
"),t.get("/api/admin/repos/"+E.repoId+"/github").then(R=>{w&&(w.document.open(),w.document.write('
'+JSON.stringify(R.data,null,2).replace(/[<>]/g,D=>D==="<"?"<":">")+"
"),w.document.close())},R=>{let D=R&&R.data?JSON.stringify(R.data,null,2):String(R);w&&(w.document.body.innerHTML='
'+D+"
")})},e.statusCountFor=E=>{let w=(e.statusCounts||[]).find(R=>R._id===E);return w?w.count:0},e.statusStorageFor=E=>{let w=(e.statusCounts||[]).find(R=>R._id===E);return w?w.storage:0},e.isErrorsOnly=()=>e.query&&e.query.error&&!e.query.ready&&!e.query.preparing&&!e.query.expired&&!e.query.removed,e.toggleErrorsOnly=()=>{e.isErrorsOnly()?Object.assign(e.query,{ready:!1,preparing:!0,expired:!1,removed:!1,error:!0}):Object.assign(e.query,{ready:!1,preparing:!1,expired:!1,removed:!1,error:!0}),e.query.page=1},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=E=>{e.query.sort===E?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=E,e.query.direction="desc"),e.query.page=1},e.sortIcon=E=>e.query.sort===E?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.repos.filterPrefs",f={page:1,limit:25,sort:"lastView",direction:"desc",search:"",owner:"",conference:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},h=loadFilterPrefs(u)||{};e.query=Object.assign({},f,h,{page:1,search:""});let g=n.search();g.owner&&(e.query.owner=g.owner),g.conference&&(e.query.conference=g.conference),g.search&&(e.query.search=g.search);let k="admin.repos.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let E=window.prompt("Preset name:");if(!E)return;let w=Object.assign({},e.query);delete w.page,e.presets=(e.presets||[]).filter(R=>R.name!==E),e.presets.push({name:E,query:w}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=E=>{Object.assign(e.query,E.query,{page:1})},e.deletePreset=E=>{e.presets=(e.presets||[]).filter(w=>w.name!==E.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.repositories.forEach(E=>{e.selected[E.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(E=>e.selected[E.repoId]),e.bulkRefresh=()=>{let E=e.selectedRepos();E.length&&confirm(`Force refresh ${E.length} repositories?`)&&E.forEach(w=>e.updateRepository(w))},e.bulkRemoveCache=()=>{let E=e.selectedRepos();E.length&&confirm(`Purge cache for ${E.length} repositories?`)&&E.forEach(w=>e.removeCache(w))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let E=new URLSearchParams(Object.entries(e.query).filter(([,w])=>w!==""&&w!==!1&&w!=null));E.set("format","csv"),E.set("limit","10000"),window.open("/api/admin/repos?"+E.toString(),"_blank")},e.removeCache=E=>{confirm("Remove cached files for "+E.repoId+"?")&&t.delete("/api/admin/repos/"+E.repoId).then(()=>m(),w=>console.error(w))},e.removeRepository=E=>{confirm("Remove repository "+E.repoId+"?")&&t.delete("/api/repo/"+E.repoId+"/").then(()=>m(),w=>console.error(w))},e.updateRepository=E=>{let w=He({title:`Refreshing ${E.repoId}...`,date:new Date,body:`The repository ${E.repoId} is going to be refreshed.`});e.toasts.push(w),t.post(`/api/repo/${E.repoId}/refresh`).then(R=>{R.data.status=="ready"?w.title=`${E.repoId} is refreshed.`:w.title=`Refreshing of ${E.repoId}.`},R=>{w.title=`Error during the refresh of ${E.repoId}.`,w.body=R.body})},e.fetchError=null;function m(){e.fetchError=null,t.get("/api/admin/repos",{params:e.query}).then(E=>{e.total=E.data.total,e.totalPage=Math.ceil(E.data.total/e.query.limit),e.repositories=E.data.results,e.statusCounts=E.data.statusCounts||[],e.totalSize=E.data.totalSize||0,e.allSelected=!1},E=>{e.fetchError=E&&E.data&&E.data.error||"Failed to load repositories",console.error(E)})}m();let y=null;e.watch("query",()=>{r.timeout.cancel(y),y=r.timeout(m,500);let{page:E,search:w,...R}=e.query;saveFilterPrefs(u,R),a()},!0),a()},el=function(e,t,n){let r=ct(),s=Qt();e.Math=Math,e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.users=[],e.total=-1,e.totalPage=0,e.statusCounts=[],e.selected={},e.allSelected=!1;let i=m=>{if(m.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){m.preventDefault();let y=document.querySelector('.admin-filter-toolbar input[type="search"]');y&&y.focus()}};s(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=m=>{m==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[m]="",e.query.page=1},e.chips=[];let a=()=>{let m=[];e.query.role&&m.push({key:"role",label:"Role",value:e.query.role}),e.chips=m};e.statusCountFor=m=>{let y=(e.statusCounts||[]).find(E=>E._id===m);return y?y.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=m=>{e.query.sort===m?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=m,e.query.direction="desc"),e.query.page=1},e.sortIcon=m=>e.query.sort===m?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.users.filterPrefs",f={page:1,limit:25,sort:"username",direction:"asc",search:"",status:"",role:"",dateFrom:"",dateTo:""},h=loadFilterPrefs(u)||{};e.query=Object.assign({},f,h,{page:1,search:""}),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.users.forEach(m=>{e.selected[m.username]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedUsers=()=>e.users.filter(m=>e.selected[m.username]),e.banUser=m=>{confirm(`Ban user ${m.username}?`)&&t.post(`/api/admin/users/${m.username}/ban`).then(g,y=>console.error(y))},e.activateUser=m=>{t.post(`/api/admin/users/${m.username}/activate`).then(g,y=>console.error(y))},e.bulkBan=()=>{let m=e.selectedUsers();m.length&&confirm(`Ban ${m.length} users?`)&&m.forEach(y=>e.banUser(y))},e.exportCsv=()=>{let m=new URLSearchParams(Object.entries(e.query).filter(([,y])=>y!==""&&y!==!1&&y!=null));m.set("format","csv"),m.set("limit","10000"),window.open("/api/admin/users?"+m.toString(),"_blank")},e.fetchError=null;function g(){e.fetchError=null,t.get("/api/admin/users",{params:e.query}).then(m=>{e.total=m.data.total,e.totalPage=Math.ceil(m.data.total/e.query.limit),e.users=m.data.results,e.statusCounts=m.data.statusCounts||[],e.allSelected=!1},m=>{e.fetchError=m&&m.data&&m.data.error||"Failed to load users",console.error(m)})}g();let k=null;e.watch("query",()=>{r.timeout.cancel(k),k=r.timeout(g,500);let{page:m,search:y,...E}=e.query;saveFilterPrefs(u,E),a()},!0),a()},tl=function(e,t,n,r){let s=ct();e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.userInfo,e.repositories=[],e.search="",e.selected={},e.allSelected=!1;let i="admin.user.filterPrefs",a={filters:{status:{ready:!0,expired:!0,removed:!0,error:!0,preparing:!0}},sort:"anonymizeDate",direction:"desc"},u=loadFilterPrefs(i)||{};e.filters={status:Object.assign({},a.filters.status,u.filters&&u.filters.status||{})},e.query={sort:u.sort||a.sort,direction:u.direction||a.direction},e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort,e.sortBy=m=>{e.query.sort===m?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=m,e.query.direction="desc"),e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort},e.sortIcon=m=>e.query.sort===m?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"",e.watch("query",()=>{saveFilterPrefs(i,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.watch("filters",()=>{saveFilterPrefs(i,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.statusCountFor=m=>(e.repositories||[]).filter(y=>y.status===m).length,e.repoFiler=m=>e.filters.status[m.status]==!1?!1:!!(e.search.trim().length==0||m.source.fullName.indexOf(e.search)>-1||m.repoId.indexOf(e.search)>-1||m.statusMessage&&m.statusMessage.indexOf(e.search)>-1||m.conference&&m.conference.indexOf(e.search)>-1),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,(e.filteredRepositories||e.repositories).forEach(m=>{e.selected[m.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(m=>e.selected[m.repoId]),e.bulkRefresh=()=>{let m=e.selectedRepos();m.length&&confirm(`Force refresh ${m.length} repositories?`)&&m.forEach(y=>e.updateRepository(y))},e.bulkRemoveCache=()=>{let m=e.selectedRepos();m.length&&confirm(`Purge cache for ${m.length} repositories?`)&&m.forEach(y=>e.removeCache(y))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let m=e.filteredRepositories||e.repositories,E=["repoId","status","statusMessage","pageView","anonymizeDate","source.fullName","conference","size.storage"].join(","),w=m.map(A=>[A.repoId,A.status,A.statusMessage||"",A.pageView||0,A.anonymizeDate||"",A.source&&A.source.fullName||"",A.conference||"",A.size&&A.size.storage||0].map(V=>{let H=String(V??"");return/[",\n\r]/.test(H)?'"'+H.replace(/"/g,'""')+'"':H}).join(",")),R=new Blob([E+` -`+w.join(` -`)],{type:"text/csv"}),D=document.createElement("a");D.href=URL.createObjectURL(R),D.download=r.username+"-repositories.csv",D.click()},e.showStatusMessage=m=>{let y=m.statusMessage||"(no message)";window.prompt(`Status message for ${m.repoId} (${m.status}):`,y)},e.fetchGithubInfo=m=>{let y=window.open("","_blank");y&&y.document.write("
Loading GitHub info for "+m.repoId+"...
"),t.get("/api/admin/repos/"+m.repoId+"/github").then(E=>{y&&(y.document.open(),y.document.write('
'+JSON.stringify(E.data,null,2).replace(/[<>]/g,w=>w==="<"?"<":">")+"
"),y.document.close())},E=>{let w=E&&E.data?JSON.stringify(E.data,null,2):String(E);y&&(y.document.body.innerHTML='
'+w+"
")})};function f(m){t.get("/api/admin/users/"+m+"/repos",{}).then(y=>{e.repositories=y.data},y=>{console.error(y)})}function h(m){t.get("/api/admin/users/"+m,{}).then(y=>{e.userInfo=y.data},y=>{console.error(y)})}h(r.username),f(r.username),e.banUser=()=>{confirm(`Ban user ${r.username}?`)&&t.post(`/api/admin/users/${r.username}/ban`).then(()=>h(r.username),m=>console.error(m))},e.activateUser=()=>{t.post(`/api/admin/users/${r.username}/activate`).then(()=>h(r.username),m=>console.error(m))},e.promoteUser=()=>{confirm(`Promote ${r.username} to admin?`)&&t.post(`/api/admin/users/${r.username}/promote`).then(()=>h(r.username),m=>console.error(m))},e.demoteUser=()=>{confirm(`Remove admin privileges from ${r.username}?`)&&t.post(`/api/admin/users/${r.username}/demote`).then(()=>h(r.username),m=>console.error(m))},e.tokens=[],e.tokenForm={name:"",plaintext:null};function g(){t.get("/api/admin/tokens").then(m=>{e.tokens=m.data||[]},m=>{m.status!==401&&m.status!==403&&console.error(m)})}g(),e.createToken=()=>{e.tokenForm.name&&t.post("/api/admin/tokens",{name:e.tokenForm.name}).then(m=>{e.tokenForm.plaintext=m.data.token,e.tokenForm.name="",g()},m=>console.error(m))},e.revokeToken=m=>{confirm(`Revoke token "${m.name}"?`)&&t.delete("/api/admin/tokens/"+m.id).then(()=>g(),y=>console.error(y))},e.removeCache=m=>{confirm("Remove cached files for "+m.repoId+"?")&&t.delete("/api/admin/repos/"+m.repoId).then(()=>f(r.username),y=>console.error(y))},e.removeRepository=m=>{confirm("Remove repository "+m.repoId+"?")&&t.delete("/api/repo/"+m.repoId+"/").then(()=>f(r.username),y=>console.error(y))},e.updateRepository=m=>{let y=He({title:`Refreshing ${m.repoId}...`,date:new Date,body:`The repository ${m.repoId} is going to be refreshed.`});e.toasts.push(y),t.post(`/api/repo/${m.repoId}/refresh`).then(E=>{E.data.status=="ready"?y.title=`${m.repoId} is refreshed.`:y.title=`Refreshing of ${m.repoId}.`},E=>{y.title=`Error during the refresh of ${m.repoId}.`,y.body=E.body})},e.getGitHubRepositories=m=>{t.get(`/api/user/${e.userInfo.username}/all_repositories`,{params:{force:"1"}}).then(y=>{e.userInfo.repositories=y.data})};let k=null;e.watch("query",()=>{s.timeout.cancel(k),k=s.timeout(()=>{f(r.username)},500)},!0)},ol=function(e,t,n){let r=ct(),s=Qt();e.Math=Math,e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.conferences=[],e.total=-1,e.totalPage=0,e.statusCounts=[];let i=E=>{if(E.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){E.preventDefault();let w=document.querySelector('.admin-filter-toolbar input[type="search"]');w&&w.focus()}};s(document,"keydown",i),e.on("dispose",()=>document.removeEventListener("keydown",i)),e.clearFilter=E=>{E==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[E]="",e.query.page=1},e.chips=[];let a=()=>{let E=[];(e.query.dateFrom||e.query.dateTo)&&E.push({key:"dateRange",label:"Date",value:(e.query.dateFrom||"\u2026")+" \u2013 "+(e.query.dateTo||"\u2026")}),e.chips=E};e.statusCountFor=E=>{let w=(e.statusCounts||[]).find(R=>R._id===E);return w?w.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=E=>{e.query.sort===E?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=E,e.query.direction="desc"),e.query.page=1},e.sortIcon=E=>e.query.sort===E?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let u="admin.conferences.filterPrefs",f={page:1,limit:25,sort:"name",direction:"asc",search:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},h=loadFilterPrefs(u)||{};e.query=Object.assign({},f,h,{page:1,search:""});let g=n.search();g.search&&(e.query.search=g.search);let k="admin.conferences.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let E=window.prompt("Preset name:");if(!E)return;let w=Object.assign({},e.query);delete w.page,e.presets=(e.presets||[]).filter(R=>R.name!==E),e.presets.push({name:E,query:w}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=E=>{Object.assign(e.query,E.query,{page:1})},e.deletePreset=E=>{e.presets=(e.presets||[]).filter(w=>w.name!==E.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.removeConference=E=>{confirm("Remove conference "+E.conferenceID+"?")&&t.delete("/api/admin/conferences/"+E.conferenceID).then(()=>m(),w=>console.error(w))},e.exportCsv=()=>{let E=new URLSearchParams(Object.entries(e.query).filter(([,w])=>w!==""&&w!==!1&&w!=null));E.set("format","csv"),E.set("limit","10000"),window.open("/api/admin/conferences?"+E.toString(),"_blank")},e.fetchError=null;function m(){e.fetchError=null,t.get("/api/admin/conferences",{params:e.query}).then(E=>{e.total=E.data.total,e.totalPage=Math.ceil(E.data.total/e.query.limit),e.conferences=E.data.results,e.statusCounts=E.data.statusCounts||[]},E=>{e.fetchError=E&&E.data&&E.data.error||"Failed to load conferences",console.error(E)})}m();let y=null;e.watch("query",()=>{r.timeout.cancel(y),y=r.timeout(m,500);let{page:E,search:w,...R}=e.query;saveFilterPrefs(u,R),a()},!0),a()},sl=function(e,t,n,r,s){let i=ct();e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.queueList=[],e.jobs=[],e.selectedQueue="download",e.selectedStats=null,e.range="1h",e.allStates=["active","waiting","delayed","failed","completed"],e.stateFilter={active:!0,waiting:!0,delayed:!0,failed:!0,completed:!0},e.query={search:"",autoRefresh:!0},e.filteredJobs=()=>(e.jobs||[]).filter(w=>e.stateFilter[w._state]),e.jobProgressPct=w=>w&&w.progress&&typeof w.progress=="object"&&typeof w.progress.percent=="number"?Math.max(0,Math.min(100,Math.round(w.progress.percent))):typeof w.progress=="number"?Math.max(0,Math.min(100,Math.round(w.progress))):null,e.jobDuration=w=>{if(!w.processedOn)return"-";let D=(w.finishedOn||Date.now())-w.processedOn;return D<1e3?D+"ms":(D/1e3).toFixed(1)+"s"},e.metricsPoints=[],e.selectQueue=w=>{e.selectedQueue=w,a(),u()},e.setRange=w=>{e.range=w,u()};function a(){let w={queue:e.selectedQueue,search:e.query.search};t.get("/api/admin/queues",{params:w}).then(R=>{e.queueList=R.data.queues||[],e.jobs=R.data.jobs||[],e.selectedStats=e.queueList.find(D=>D.key===e.selectedQueue)||e.queueList[0]||null},R=>console.error(R))}function u(){t.get("/api/admin/queues/metrics",{params:{queue:e.selectedQueue,range:e.range}}).then(w=>{e.metricsPoints=w.data.points||[],s(m,0)},w=>console.error(w))}a(),u();let f=r(()=>{e.query.autoRefresh&&(a(),u())},15e3);e.on("dispose",()=>r.cancel(f)),e.refreshNow=function(){a(),u()};function h(w){let R=w&&w.data&&(w.data.message||w.data.error)||"Request failed";e.actionError=R,s(()=>{e.actionError=null},5e3),console.error(w)}e.actionError=null,e.removeJob=w=>{t.delete(`/api/admin/queue/${e.selectedQueue}/${w.id}`).then(a,h)},e.retryJob=w=>{t.post(`/api/admin/queue/${e.selectedQueue}/${w.id}`).then(a,h)},e.retryFailed=()=>{confirm(`Retry all failed jobs in ${e.selectedQueue}?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/retry-failed`).then(a,w=>console.error(w))},e.drainSelected=()=>{confirm(`Drain the ${e.selectedQueue} queue?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/drain`).then(a,w=>console.error(w))},e.togglePause=()=>{let w=e.selectedStats&&e.selectedStats.paused?"resume":"pause";t.post(`/api/admin/queue/${e.selectedQueue}/${w}`).then(a,R=>console.error(R))},e.emptyQueue=()=>{confirm(`Empty the ${e.selectedQueue} queue? This removes ALL jobs.`)&&t.post(`/api/admin/queue/${e.selectedQueue}/empty`).then(a,w=>console.error(w))},e.pauseAll=()=>{confirm("Pause all queues?")&&t.post("/api/admin/queues/pause-all").then(a,w=>console.error(w))};let g=null;e.watch("query.search",()=>{i.timeout.cancel(g),g=i.timeout(a,350)}),e.expanded={},e.toggleJob=w=>{e.expanded[w.id]=!e.expanded[w.id]},e.humanTime=w=>{if(!w)return"";let R=new Date(w);return R.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})+" "+R.toLocaleDateString([],{month:"short",day:"numeric"})},e.delayCountdown=w=>{if(!w)return"";var R=Math.max(0,Math.ceil((w-Date.now())/1e3));if(R<=0)return"resuming soon";var D=Math.floor(R/60),A=R%60;return"in "+(D>0?D+"m "+A+"s":A+"s")};function k(w){if(w<=0)return{ticks:[0],niceMax:1};let R=Math.pow(10,Math.floor(Math.log10(w))),D=R;w/D<2?D=R/2:w/D>5&&(D=R*2);let A=Math.ceil(w/D)*D,V=[];for(let H=0;H<=A;H+=D)V.push(H);return{ticks:V,niceMax:A}}function m(){var w=document.getElementById("q-throughput-chart");if(!w)return;var R=w.getContext("2d"),D=window.devicePixelRatio||1,A=w.parentElement.getBoundingClientRect(),V=44,H=50,q=20,U=A.width-40,ae=180,ie=U-V-H,_=ae-q;w.width=U*D,w.height=ae*D,w.style.width=U+"px",w.style.height=ae+"px",R.setTransform(D,0,0,D,0,0);var O=document.body.classList.contains("dark-mode"),G="#8A857C",J=O?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",ee=O?"#A7B2FF":"#3B4AD6",Q=O?"rgba(167,178,255,0.12)":"rgba(59,74,214,0.08)",oe=O?"#F08A82":"#B42318",ue=O?"rgba(240,138,130,0.08)":"rgba(180,35,24,0.06)",pe=O?"#F5C842":"#B8860B",le=e.metricsPoints||[];if(le.length===0){R.fillStyle=G,R.font="12px monospace",R.textAlign="center",R.fillText("No metrics data yet",U/2,ae/2),y=null;return}var Ie=le.map(function(L){return L.completed}),_e=le.map(function(L){return L.failed}),Ae=le.map(function(L){return L.avgMs}),Ee=le.length,Pe=ie/(Ee-1||1),Se=Math.max(1,Math.max.apply(null,Ie),Math.max.apply(null,_e)),$e=k(Se),Ue=Math.max.apply(null,Ae),z=Ue>0?k(Ue):{ticks:[0],niceMax:1},ne=function(L){return _-L/$e.niceMax*(_-10)},te=function(L){return _-L/z.niceMax*(_-10)},S=function(L){return V+L*Pe};R.textAlign="right",R.textBaseline="middle",R.font="10px monospace",$e.ticks.forEach(function(L){var W=ne(L);R.strokeStyle=J,R.lineWidth=1,R.beginPath(),R.moveTo(V,W),R.lineTo(U-H,W),R.stroke(),R.fillStyle=G,R.fillText(L>=1e3?(L/1e3).toFixed(1)+"k":String(L),V-6,W)}),Ue>0&&(R.textAlign="left",z.ticks.forEach(function(L){var W=te(L);R.fillStyle=pe,R.fillText(L>=1e3?(L/1e3).toFixed(1)+"s":L+"ms",U-H+6,W)}));var I=Date.now(),j=Math.min(6,Ee);R.textAlign="center",R.textBaseline="top";for(var M=0;M0&&(R.beginPath(),Ae.forEach(function(L,W){var x=S(W),Z=te(L);if(W===0)R.moveTo(x,Z);else{var K=(S(W-1)+x)/2;R.bezierCurveTo(K,te(Ae[W-1]),K,Z,x,Z)}}),R.strokeStyle=pe,R.lineWidth=1,R.setLineDash([4,3]),R.stroke(),R.setLineDash([])),y={pts:le,maxLen:Ee,marginLeft:V,step:Pe,totalW:U,toX:S}}var y=null;function E(){var w=document.getElementById("q-throughput-chart");if(!(!w||w._tipBound)){w._tipBound=!0;var R=document.getElementById("q-chart-tooltip"),D=document.getElementById("q-chart-crosshair");w.addEventListener("mousemove",function(A){if(!(!y||!R||!D)){var V=y,H=w.getBoundingClientRect(),q=A.clientX-H.left,U=Math.round((q-V.marginLeft)/V.step);if(U<0||U>=V.maxLen){R.style.display="none",D.style.display="none";return}var ae=V.pts[U],ie=Date.now(),_=Math.round((ie-ae.ts)/6e4),O;if(_<=0)O="now";else if(_<60)O=_+"m ago";else if(_<1440){var G=Math.floor(_/60),J=_%60;O=G+"h"+(J?" "+J+"m":"")+" ago"}else O=Math.round(_/1440)+"d ago";var ee='
'+O+'
● completed: '+ae.completed+'/min
● failed: '+ae.failed+"/min
";if(ae.avgMs>0){var Q=ae.avgMs>=1e3?(ae.avgMs/1e3).toFixed(1)+"s":ae.avgMs+"ms";ee+='
● avg time: '+Q+"
"}R.innerHTML=ee;var oe=V.toX(U),ue=R.offsetWidth,pe=oe+10;pe+ue>V.totalW&&(pe=oe-ue-10),R.style.display="block",R.style.left=pe+"px",R.style.top="8px",D.style.display="block",D.style.left=oe+"px"}}),w.addEventListener("mouseleave",function(){R&&(R.style.display="none"),D&&(D.style.display="none")})}}e.watch("metricsPoints",function(){s(E,50)})},nl=function(e,t,n,r){let s=ct();e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null&&n.url("/"),e.entries=[],e.visible=[],e.available=!0,e.cap=1e3,e.total=0,e.pageSize=250,e.expanded={},e.detailTab={},e.copyHint="",e.parsedFilterCount=0,e.stats={last24h:0,prev24h:0,delta:0,severity:{error:0,warn:0,info:0},unique:{error:0,warn:0,info:0},buckets:[],dropped:0},e.query={search:"",bucket:"",sort:"recent",group:"code",autoRefresh:!0},e.relTime=D=>{if(!D)return"";let A=new Date(D).getTime();if(isNaN(A))return D;let V=Math.max(0,Date.now()-A),H=Math.floor(V/1e3);if(H<5)return"just now";if(H<60)return`${H}s ago`;let q=Math.floor(H/60);if(q<60)return`${q}m ago`;let U=Math.floor(q/60);if(U<24)return`${U}h ago`;let ae=Math.floor(U/24);return ae<7?`${ae}d ago`:new Date(D).toLocaleDateString()},e.absTime=D=>{if(!D)return"";let A=new Date(D);return isNaN(A.getTime())?D:A.toLocaleString()},e.absTimeShort=D=>{if(!D)return"";let A=new Date(D);return isNaN(A.getTime())?D:A.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})};let i=/^[a-zA-Z][a-zA-Z0-9]*(?:_[a-zA-Z0-9]+)+$/;function a(D,A){let V=D&&(D.httpStatus||D.status)||null;if(typeof V=="number"){if(V>=500)return"error";if(V===401||V===403||V===404)return"info";if(V>=400)return"warn"}return A==="error"?"error":A==="warn"?"warn":"info"}function u(D){let A=(D.raw||[]).find(U=>U&&typeof U=="object"&&!Array.isArray(U));if(A){A.message&&i.test(A.message)?(D.displayMessage=A.message,D.displayContext=D.message):A.code&&i.test(String(A.code))?(D.displayMessage=String(A.code),D.displayContext=D.message):A.name&&A.name!=="AnonymousError"&&A.name!=="Error"?(D.displayMessage=A.name,D.displayContext=A.message||D.message):D.displayMessage=D.message,D._status=A.httpStatus||A.status||null,D._url=A.url||null,D._method=A.method||null,D._repoId=A.repoId||A.detail||null,D._detail=A.detail&&A.detail!==D._repoId?A.detail:null;let U=typeof A.stack=="string"?A.stack:null;for(var V=[A.cause,A.err].filter(Boolean),H=0;!U&&H{_==null||_===""||V.push([ie,_])};H("name",A&&A.name),H("code",D.displayMessage||A&&A.message),D._bucket&&H("kind",D._bucket),H("httpStatus",A&&A.httpStatus),A&&A.status&&!A.httpStatus&&H("status",A.status),H("module",D.module);let q=A&&A.detail;if(typeof q=="string"){let ie=q.trim();if(ie[0]==="{"||ie[0]==="[")try{q=JSON.parse(q)}catch{}}if(H("detail",q),H("repoId",A&&A.repoId),H("filePath",A&&A.filePath),H("upstreamStatus",A&&A.upstreamStatus),H("upstreamBody",A&&A.upstreamBody),H("url",D._url),H("err",A&&A.err),H("cause",A&&!A.err&&A.cause),H("ts",D.ts),!V.length)return JSON.stringify(D,null,2);let U=V.reduce((ie,_)=>Math.max(ie,_[0].length),0),ae=["{"];return V.forEach(([ie,_],O)=>{let J=` ${`"${ie}":`.padEnd(U+3," ")} `,ee=Ope===0?ue:oe+ue).join(` -`)}else typeof _=="number"||typeof _=="boolean"?Q=String(_):Q=JSON.stringify(_);ae.push(`${J}${Q}${ee}`)}),ae.push("}"),ae.join(` -`)}function h(D){let A=[],V="",H=/(\w+):(>=|<=|!=|>|<|=)?([^\s]+)/g,q=0,U;for(;U=H.exec(D);)V+=D.slice(q,U.index),q=H.lastIndex,A.push({key:U[1],op:U[2]||"=",val:U[3]});return V+=D.slice(q),{filters:A,free:V.trim().toLowerCase()}}function g(D,A){for(let V of A.filters){let H=(U,ae,ie)=>{let _=parseFloat(U),O=parseFloat(ae);return ie==="="?String(U)===String(ae):ie==="!="?String(U)!==String(ae):ie===">="?_>=O:ie==="<="?_<=O:ie===">"?_>O:ie==="<"?_A&&q._bucket!==A?!1:g(q,D)),H=e.query.group;if(H){let q=ie=>H==="module"?ie.module:ie.displayMessage||ie.message||"_",U=new Map;for(let ie of V){let _=q(ie);if(U.has(_)){let O=U.get(_);O.count++,O._related.push(ie),new Date(ie.ts)>new Date(O.ts)&&(O.ts=ie.ts,O._url=ie._url,O._status=ie._status),new Date(ie.ts)new Date(_.ts).getTime()>=ae).length;V=Array.from(U.values())}else V=V.map((q,U)=>(q._key="row:"+U+":"+q.ts,q._related=[q],q._firstSeen=q.ts,q._lastHourCount=0,q.count=1,q));e.query.sort==="count"?V.sort((q,U)=>U.count-q.count||new Date(U.ts)-new Date(q.ts)):V.sort((q,U)=>new Date(U.ts)-new Date(q.ts)),e.visible=V}function m(D){let A=D?e.entries.length:0,V=D?e.pageSize:Math.max(e.pageSize,e.entries.length||e.pageSize);t.get("/api/admin/errors",{params:{offset:A,limit:V}}).then(H=>{let q=(H.data.entries||[]).map(u);e.entries=D?e.entries.concat(q):q,e.available=!!H.data.available,e.cap=H.data.max||e.cap,e.total=H.data.total||e.entries.length,k()},H=>console.error(H))}e.loadMore=()=>m(!0),e.canLoadMore=()=>e.entries.length{let A=D.data||{},V=A.prev24h?Math.round((A.last24h-A.prev24h)/A.prev24h*100):0;e.stats={last24h:A.last24h||0,prev24h:A.prev24h||0,delta:V,severity:A.severity||{error:0,warn:0,info:0},unique:A.unique||{error:0,warn:0,info:0},buckets:A.buckets||[],dropped:A.dropped||0}},D=>console.error(D))}function E(){m(),y()}e.barPx=(D,A)=>{let V=e.stats.buckets||[],H=0;for(let ie of V)H=Math.max(H,(ie.error||0)+(ie.warn||0)+(ie.info||0));if(!H)return 0;let q=(D.error||0)+(D.warn||0)+(D.info||0);if(!q)return 0;let U=Math.round(q/H*60),ae=D[A]||0;return Math.round(ae/q*U)},e.bucketTitle=D=>`${new Date(D.hour).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})} \xB7 ${D.error||0} err \xB7 ${D.warn||0} warn \xB7 ${D.info||0} info`,e.toggle=D=>{e.expanded[D._key]=!e.expanded[D._key]},e.setBucket=D=>{e.query.bucket=D},e.refreshNow=E,e.clearAll=()=>{confirm("Clear all captured errors?")&&t.delete("/api/admin/errors").then(E,D=>console.error(D))},e.exportCsv=()=>{let D=["ts","level","module","displayMessage","_status","_url","_repoId"],A=[D.join(",")];for(let U of e.visible)A.push(D.map(ae=>{let ie=U[ae]==null?"":String(U[ae]);return/[",\n]/.test(ie)?`"${ie.replace(/"/g,'""')}"`:ie}).join(","));let V=new Blob([A.join(` -`)],{type:"text/csv;charset=utf-8"}),H=URL.createObjectURL(V),q=document.createElement("a");q.href=H,q.download=`errors-${new Date().toISOString().slice(0,19)}.csv`,document.body.appendChild(q),q.click(),document.body.removeChild(q),URL.revokeObjectURL(H)};function w(D){e.copyHint=`${D} copied`,s.timeout(()=>{e.copyHint=""},1500)}e.copyJson=D=>{navigator.clipboard.writeText(D._detailJson).then(()=>w("JSON"))},e.copyCurl=D=>{if(!D._url)return;let V=`curl -X ${D._method||"GET"} '${window.location.origin}${D._url}'`;navigator.clipboard.writeText(V).then(()=>w("curl"))},E();let R=r(()=>{e.query.autoRefresh&&E()},15e3);e.on("dispose",()=>r.cancel(R)),e.watch("query.search",k),e.watch("query.bucket",k),e.watch("query.sort",k),e.watch("query.group",k)},rl=function(e,t,n,r){if(e.Math=Math,e.watch("user.status",()=>{e.user==null&&n.url("/")}),e.user==null){n.url("/");return}e.data=null,e.loading=!0,e.error=null,e.performance=null,e.performanceMinutes=15,e.performanceTab="routes",e.performanceError=null,e.latencyBound=function(y,E){return y.count?y[E]==null?"> 60 s":"\u2264 "+y[E]+" ms":"No samples"},e.firstByteBound=function(y){return e.latencyBound({count:y.firstByteCount,p95UpperMs:y.firstByteP95UpperMs},"p95UpperMs")},e.sampleAge=function(y){return Math.max(0,Math.round((Date.now()-y.sampledAt)/1e3))},e.peakRss=function(y){return(e.performance.runtimeSeries||[]).filter(function(E){return E.instance===y.instance}).reduce(function(E,w){return Math.max(E,w.rss)},y.memory.rss)},e.performanceWarning=function(y){return e.sampleAge(y)>45||y.droppedBatches||y.droppedMetrics||y.sockets?.closeWait>0||y.eventLoop.p95Ms>100||y.memoryLimitBytes&&y.memory.rss>y.memoryLimitBytes*.8};var s=!1;e.loadPerformance=function(){var y=e.performanceMinutes;e.performance?.windowMinutes&&e.performance.windowMinutes!==y&&(e.performance=null),!s&&(s=!0,t.get("/api/admin/performance",{params:{minutes:y}}).then(function(E){y===e.performanceMinutes&&(e.performance=E.data,e.performanceError=E.data.available?null:"Performance monitoring is unavailable. Request history may be incomplete.")},function(){y===e.performanceMinutes&&(e.performanceError="Could not refresh performance monitoring. Displayed samples may be stale.")}).finally(function(){s=!1,y!==e.performanceMinutes&&e.loadPerformance()}))};function i(y){if(y==null)return"\u2014";for(var E=["B","KB","MB","GB","TB"],w=0,R=y;R>=1024&&w0?1:0)+" "+E[w]}e.humanBytes=i;function a(y){if(!y)return"\u2014";var E=Math.floor(y/86400),w=Math.floor(y%86400/3600),R=Math.floor(y%3600/60);return E>0?E+"d "+(w<10?"0":"")+w+"h":w>0?w+"h "+(R<10?"0":"")+R+"m":R+"m"}e.humanDuration=a;function u(y){return y==null?"\u2014":y>=1e6?(y/1e6).toFixed(1)+"M":y>=1e3?(y/1e3).toFixed(1)+"K":String(y)}e.humanNum=u,e.queueTotal=function(y){return y?(y.waiting||0)+(y.active||0)+(y.delayed||0)+(y.failed||0):0},e.statusCount=function(y){if(!e.data||!e.data.repos)return 0;for(var E=e.data.repos.statusBreakdown||[],w=0;wg[w])&&(g[w]=E[w])})})},function(y){e.loading=!1,e.error=y.data&&y.data.error||"Failed to load overview"})}k();var m=r(k,3e4);e.on("dispose",function(){r.cancel(m)})};var il=[{path:"/connections",template:"partials/connections.htm",title:"GitHub connections \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Xa(e,t.http)},{path:"/signin",template:"partials/signin.htm",title:"Sign in \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Za(e,t.http)},{path:"/",template:"partials/home.htm",title:"Anonymous GitHub \u2013 Share the code, not the author",preserveExplorer:!1,setup:(e,t)=>ja(e,t.http,t.location,t.window,t.timeout)},{path:"/dashboard",template:"partials/dashboard.htm",title:"Your anonymizations \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ga(e,t.http,t.location,t.promises,t.window,t.quotaService)},{path:"/pr-dashboard",redirect:"/dashboard"},{path:"/anonymize/:repoId?",template:"partials/anonymize.htm",title:"New anonymization \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>on(e,t.http,t.html,t.params,t.location,t.translate,t.timeout)},{path:"/pull-request-anonymize/:pullRequestId?",template:"partials/anonymize.htm",title:"Anonymize a pull request \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>on(e,t.http,t.html,t.params,t.location,t.translate,t.timeout)},{path:"/gist-anonymize/:gistId?",template:"partials/anonymize.htm",title:"Anonymize a gist \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>on(e,t.http,t.html,t.params,t.location,t.translate,t.timeout)},{path:"/status/:repoId",template:"partials/status.htm",title:"Repository status \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Wa(e,t.http,t.params)},{path:"/conferences",template:"partials/conferences.htm",title:"Your conferences \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ja(e,t.http,t.location)},{path:"/conference/new",template:"partials/newConference.htm",title:"New conference \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>nr(e,t.http,t.location,t.params)},{path:"/conference/:conferenceId/edit",template:"partials/newConference.htm",title:"Edit conference \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>nr(e,t.http,t.location,t.params)},{path:"/conference/:conferenceId",template:"partials/conference.htm",title:"Conference \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Qa(e,t.http,t.location,t.params)},{path:"/faq",template:"partials/faq.htm",title:"FAQ \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>za(e,t.http)},{path:"/profile",template:"partials/profile.htm",title:"Your settings \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ha(e,t.http,t.translate,t.timeout,t.quotaService)},{path:"/claim",template:"partials/claim.htm",title:"Claim an anonymization \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ba(e,t.http,t.location)},{path:"/pr/:pullRequestId/:path(.*)*",template:"partials/pullRequest.htm",title:"Anonymous pull request \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ka(e,t.http,t.location,t.params,t.html)},{path:"/gist/:gistId/:path(.*)*",template:"partials/gist.htm",title:"Anonymous gist \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ya(e,t.http,t.location,t.params,t.html)},{path:"/r/:repoId/:path(.*)*",template:"partials/explorer.htm",title:"Anonymous repository \u2013 Anonymous GitHub",preserveExplorer:!0,setup:(e,t)=>sr(e,t.http,t.location,t.params,t.html,t.promises)},{path:"/repository/:repoId/:path(.*)*",template:"partials/explorer.htm",title:"Anonymous repository \u2013 Anonymous GitHub",preserveExplorer:!0,setup:(e,t)=>sr(e,t.http,t.location,t.params,t.html,t.promises)},{path:"/admin/",template:"partials/admin/overview.htm",title:"Admin \xB7 Overview \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>rl(e,t.http,t.location,t.interval)},{path:"/admin/repositories",template:"partials/admin/repositories.htm",title:"Admin \xB7 Repositories \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>xa(e,t.http,t.location)},{path:"/admin/users",template:"partials/admin/users.htm",title:"Admin \xB7 Users \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>el(e,t.http,t.location)},{path:"/admin/users/:username",template:"partials/admin/user.htm",title:"Admin \xB7 User details \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>tl(e,t.http,t.location,t.params)},{path:"/admin/conferences",template:"partials/admin/conferences.htm",title:"Admin \xB7 Conferences \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>ol(e,t.http,t.location)},{path:"/admin/queues",template:"partials/admin/queues.htm",title:"Admin \xB7 Queues \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>sl(e,t.http,t.location,t.interval,t.timeout)},{path:"/admin/errors",template:"partials/admin/errors.htm",title:"Admin \xB7 Errors \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>nl(e,t.http,t.location,t.interval)},{path:"/404",template:"partials/404.htm",title:"Page not found \u2013 Anonymous GitHub",preserveExplorer:!1,setup:()=>{}},{path:"/:pathMatch(.*)*",template:"partials/404.htm",title:"Page not found \u2013 Anonymous GitHub",setup:()=>{}}];var up={class:"container paper-page connections-page"},cp={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},pp={key:1,role:"status"},fp=["disabled"],mp={key:3},hp={class:"connections-grid"},vp={key:0},gp={class:"connection-title"},yp={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},bp={class:"connection-actions"},wp={key:0,class:"btn btn-ink",target:"_self",href:"/github/app/install"},kp={key:1,class:"connection-installations"},Ep={key:0},Cp=["href"],_p={class:"sr-only"},Sp=["disabled"],Np={class:"connection-title"},Dp={key:0,target:"_self",href:"/github/login",class:"btn btn-outline-ink"},Rp={key:1,class:"connection-revoke"},Tp={key:0},Ap=["disabled"],Op={class:"connection-resources"},Ip={class:"connection-title"},Pp={class:"connection-count"},Vp={key:0,class:"connection-empty"},qp={class:"connection-resource-name"},Mp={key:0,class:"connection-resource-actions"},Lp=["disabled","onClick"],$p=["disabled","onClick"],Up={key:1,class:"connection-help",role:"status"},Fp=["disabled","onClick"];function al(e,t){return l(),d("div",up,[t[20]||(t[20]=ce('
My work / GitHub connections

GitHub connections

Manage how GitHub shares your code. Your anonymizations and URLs stay the same.

',2)),e.connectionError?(l(),d("p",cp,c(e.connectionError),1)):p("v-if",!0),!e.connections&&!e.connectionError?(l(),d("p",pp,"Loading your connections\u2026")):p("v-if",!0),!e.connections&&e.connectionError?(l(),d("button",{key:2,class:"btn btn-outline-ink",disabled:e.busy,onClick:t[0]||(t[0]=n=>e.loadConnections())},"Try again",8,fp)):p("v-if",!0),e.connections?(l(),d("div",mp,[o("div",hp,[e.connections.appEnabled?(l(),d("section",vp,[t[8]||(t[8]=o("div",{class:"connection-top"},[o("i",{class:"fab fa-github","aria-hidden":"true"}),o("span",{class:"connection-badge"},"Recommended")],-1)),o("div",gp,[t[3]||(t[3]=o("h2",null,"GitHub App",-1)),o("span",{class:T(["connection-status",{"is-connected":e.connections.appConnected&&!e.connections.appError}])},c(e.connections.appError?"Needs attention":e.connections.appConnected?"Connected":"Not connected"),3)]),t[9]||(t[9]=o("p",null,"Read-only access to gists and the repositories you choose.",-1)),e.connections.appError?(l(),d("p",yp,c(e.connections.appError)+". Reconnect to restore access.",1)):p("v-if",!0),o("div",bp,[e.connections.appConnected&&!e.connections.appError?(l(),d("a",wp,[...t[4]||(t[4]=[b("Manage repository access ",-1),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-external-link"})],-1)])])):p("v-if",!0),o("a",{class:T(e.connections.appConnected&&!e.connections.appError?"connection-link":"btn btn-ink"),target:"_self",href:"/github/app/login"},c(e.connections.appConnected?"Reconnect account":"Connect GitHub account"),3)]),t[10]||(t[10]=o("p",{class:"connection-help"},"Choose repositories on GitHub. Organization access may need an administrator's approval.",-1)),e.connections.installations?.length?(l(),d("ul",kp,[(l(!0),d(X,null,re(e.connections.installations,n=>(l(),d("li",{key:n.id},[o("div",null,[o("strong",null,c(n.account),1),n.suspended?(l(),d("span",Ep," \xB7 Suspended")):p("v-if",!0)]),o("a",{target:"_self",href:"/github/app/install?installationId="+n.id},[t[5]||(t[5]=b("Manage access ",-1)),o("span",_p,"for "+c(n.account),1),t[6]||(t[6]=b(" \u2192",-1))],8,Cp)]))),128))])):p("v-if",!0),o("button",{class:"connection-link",disabled:e.busy,onClick:t[1]||(t[1]=n=>e.loadConnections())},[...t[7]||(t[7]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Refresh access",-1)])],8,Sp)])):p("v-if",!0),o("section",null,[t[13]||(t[13]=o("div",{class:"connection-top"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-key"})]),o("span",{class:"connection-badge connection-badge-muted"},"Legacy")],-1)),o("div",Np,[t[11]||(t[11]=o("h2",null,"GitHub OAuth",-1)),o("span",{class:T(["connection-status",{"is-connected":e.connections.oauthConnected}])},c(e.connections.oauthConnected?"Connected":"Not connected"),3)]),t[14]||(t[14]=o("p",null,"For existing OAuth anonymizations.",-1)),t[15]||(t[15]=o("p",{class:"connection-help"},"This connection uses GitHub's broader repository permissions. Existing work keeps using it until you switch below.",-1)),e.connections.oauthEnabled?(l(),d("a",Dp,c(e.connections.oauthConnected?"Reconnect OAuth":"Connect legacy OAuth"),1)):p("v-if",!0),e.connections.oauthConnected?(l(),d("div",Rp,[e.connections.gistCount?(l(),d("p",Tp,c(e.connections.gistCount)+" gist(s) use your GitHub App connection when available.",1)):p("v-if",!0),t[12]||(t[12]=o("p",null,"Switch all dependent repositories before revoking access. Gists can use your GitHub App connection.",-1)),e.connections.appConnected?(l(),d("button",{key:1,class:"connection-link connection-danger",disabled:e.busy||e.connections.resources.some(n=>n.connection==="oauth"),onClick:t[2]||(t[2]=n=>e.disconnectOAuth())},"Revoke OAuth access",8,Ap)):p("v-if",!0)])):p("v-if",!0)])]),o("section",Op,[o("div",Ip,[t[16]||(t[16]=o("h2",null,"Repository connections",-1)),o("span",Pp,c(e.connections.resources?.length||0)+" resources",1)]),t[18]||(t[18]=o("p",null,"Check access, then switch each resource to the GitHub App. After reinstalling the App, reconnect existing resources here to keep their anonymous URLs and published snapshots.",-1)),e.connections.resources?.length?p("v-if",!0):(l(),d("div",Vp,[...t[17]||(t[17]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1),o("div",null,[o("h3",null,"No repository connections yet"),o("p",null,"Your repositories and pull requests will appear here once you anonymize them.")],-1),o("a",{class:"connection-link",href:"/anonymize"},"New anonymization \u2192",-1)])])),(l(!0),d(X,null,re(e.connections.resources,n=>(l(),d("div",{class:"connection-resource",key:n.type+n.id},[o("div",qp,[o("strong",null,c(n.name||n.id),1),o("small",null,c(n.type)+" \xB7 "+c(n.id),1)]),o("span",{class:T(["connection-badge",{"connection-badge-muted":n.connection==="oauth"}])},c(n.connection==="github-app"?"Read-only App":"Legacy OAuth"),3),!["archived","removed","preparing","queue","removing","expiring"].includes(n.status)&&(n.status!=="download"||n.type==="pull-request"&&(!n.statusDate||new Date(n.statusDate).getTime()<=Date.now()-3e5))&&e.connections.appEnabled&&e.connections.appConnected?(l(),d("div",Mp,[o("button",{class:"btn btn-outline-ink",disabled:e.busy,onClick:r=>e.changeConnection(n,"github-app",!0)},"Check read-only access",8,Lp),n.eligible?(l(),d("button",{key:0,class:"btn btn-ink",disabled:e.busy,onClick:r=>e.changeConnection(n,"github-app",!1)},c(n.connection==="github-app"?"Reconnect read-only access":"Switch to read-only access"),9,$p)):p("v-if",!0),n.eligible===!1?(l(),d("span",Up,"Access unavailable. Allow this repository on GitHub, then check again.")):p("v-if",!0)])):p("v-if",!0),!["archived","removed","preparing","queue","removing","expiring"].includes(n.status)&&(n.status!=="download"||n.type==="pull-request"&&(!n.statusDate||new Date(n.statusDate).getTime()<=Date.now()-3e5))&&n.connection==="github-app"&&e.connections.oauthConnected?(l(),d("button",{key:1,class:"connection-link",disabled:e.busy,onClick:r=>e.changeConnection(n,"oauth",!1)},"Use OAuth",8,Fp)):p("v-if",!0)]))),128)),t[19]||(t[19]=o("p",{class:"connection-footnote"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})]),b(" Removing access stops new fetches from GitHub. Published content keeps its current expiration and removal settings.")],-1))])])):p("v-if",!0)])}var zp={class:"container paper-page auth-page"},Hp={class:"auth-layout"},Bp={class:"auth-options"},jp={key:0},Gp={key:0,class:"btn btn-ink auth-continue",target:"_self",href:"/github/login?recover=1"},Wp={key:1},Kp={key:1},Yp={key:2,class:"auth-legacy"},Jp={key:3,role:"status"};function ll(e,t){return l(),d("div",zp,[t[5]||(t[5]=o("a",{class:"auth-back",href:"/"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-arrow-left"})]),b(" Anonymous GitHub")],-1)),o("div",Hp,[t[4]||(t[4]=ce('
Your research, ready for review

Your code.
Your identity,
protected.
Sign in to GitHub

Sign in to create and manage your anonymizations.

',1)),o("div",Bp,[e.accountRecovery?(l(),d("section",jp,[t[0]||(t[0]=o("h2",null,"Verify your existing account",-1)),t[1]||(t[1]=o("p",null,"We found an existing account. Verify it with your previous GitHub connection to keep your anonymizations. Future sign-ins will use the GitHub App.",-1)),e.site_options?.GITHUB_OAUTH_ENABLED?(l(),d("a",Gp,"Verify with previous GitHub connection")):(l(),d("p",Wp,"Account verification is currently unavailable. Please try again later."))])):p("v-if",!0),e.site_options?.GITHUB_APP_ENABLED&&!e.accountRecovery?(l(),d("section",Kp,[...t[2]||(t[2]=[ce('
Read-only access

Continue with GitHub

Connect through the GitHub App with read-only repository access.

  • You choose which repositories to share
  • No permission to write to your code
Sign in with GitHub Your existing anonymizations and connections stay with your account.',6)])])):p("v-if",!0),!e.site_options?.GITHUB_APP_ENABLED&&e.site_options?.GITHUB_OAUTH_ENABLED&&!e.accountRecovery?(l(),d("section",Yp,[...t[3]||(t[3]=[o("div",{class:"connection-title"},[o("h2",null,"Continue with GitHub")],-1),o("p",null,"Sign in to access your account. GitHub OAuth includes write access to private repositories.",-1),o("a",{class:"connection-link",target:"_self",href:"/github/login"},[b("Sign in with GitHub "),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-arrow-right"})])],-1)])])):p("v-if",!0),e.site_options&&!e.site_options.GITHUB_APP_ENABLED&&!e.site_options.GITHUB_OAUTH_ENABLED?(l(),d("p",Jp,"GitHub sign-in is currently unavailable. Please try again later.")):p("v-if",!0)])])])}var Qp={class:"paper-empty"};function dl(e,t){return l(),d("div",Qp,[...t[0]||(t[0]=[ce('
Error \xB7 404

This link
isn\u2019t here.

The anonymous mirror you\u2019re looking for has expired, been removed by its owner, or never existed. If you received this URL from an author, ask them to re-issue it.

',1)])])}var Xp={class:"container paper-page admin-page"},Zp={class:"admin-summary"},xp={class:"summary-total"},ef=["aria-pressed"],tf={class:"count"},of=["aria-pressed"],sf={class:"count"},nf=["aria-pressed"],rf={class:"count"},af=["aria-pressed"],lf={class:"count"},df=["aria-pressed"],uf={class:"count"},cf={key:0,class:"alert alert-danger",style:{margin:"8px 0"}},pf={class:"w-100 admin-filter-toolbar","aria-label":"Conferences","accept-charset":"UTF-8"},ff={class:"admin-filter-row"},mf={class:"search-wrap"},hf={type:"search",class:"form-control",placeholder:"Search conferences\u2026",autocomplete:"off"},vf={key:0,class:"admin-search-hint"},gf={class:"admin-filter-inline","aria-label":"Pagination"},yf=["disabled"],bf={style:{"font-family":"var(--font-mono)","font-size":"12px",color:"var(--ink-muted)"}},wf=["disabled"],kf={key:0,class:"admin-filter-row"},Ef={class:"admin-active-chips"},Cf={class:"key"},_f=["onClick"],Sf={class:"paper-table paper-table-conferences w-100",role:"table","aria-label":"Conferences"},Nf={class:"paper-table-head",role:"row"},Df={role:"columnheader"},Rf={role:"columnheader"},Tf={role:"columnheader"},Af={class:"paper-table-row",role:"row"},Of={class:"cell-anon",role:"cell"},If={class:"anon-text"},Pf=["textContent","href"],Vf={class:"anon-sub"},qf={class:"cell-status",role:"cell"},Mf=["textContent"],Lf={class:"cell-views num",role:"cell"},$f=["textContent","href"],Uf={class:"cell-expires",role:"cell"},Ff={class:"cell-actions",role:"cell"},zf={class:"dropdown"},Hf={class:"dropdown-menu dropdown-menu-right"},Bf=["href"],jf=["href"],Gf=["href"],Wf=["onClick"],Kf={key:0,class:"paper-table-empty"},Yf={class:"admin-toolbar",style:{"justify-content":"space-between","border-bottom":"none"}},Jf={style:{"font-size":"12px",color:"var(--ink-muted)"}},Qf={key:0,class:"pagination-compact"},Xf=["disabled"],Zf=["max"],xf=["disabled"],em={class:"admin-filter-inline"},tm={class:"form-control form-control-sm"};function ul(e,t){let n=be("field"),r=be("form");return l(),d("div",Xp,[t[47]||(t[47]=ce('
Admin \xA0/\xA0 Conferences

Conferences

',3)),o("div",Zp,[o("span",xp,c(e.total>=0?e.fmt.number(e.total):"\u2026"),1),o("button",{type:"button",class:T(["summary-pill ok",{active:e.query?.ready}]),title:"Toggle ready filter",onClick:t[0]||(t[0]=s=>{e.query.ready=!e.query.ready,e.query.page=1}),"aria-pressed":!!e.query?.ready},[t[13]||(t[13]=b("Ready ",-1)),o("span",tf,c(e.fmt?.number(e.statusCountFor("ready"))),1)],10,ef),o("button",{type:"button",class:T(["summary-pill warn",{active:e.query?.preparing}]),title:"Toggle preparing filter",onClick:t[1]||(t[1]=s=>{e.query.preparing=!e.query.preparing,e.query.page=1}),"aria-pressed":!!e.query?.preparing},[t[14]||(t[14]=b("Preparing ",-1)),o("span",sf,c(e.fmt?.number(e.statusCountFor("preparing"))),1)],10,of),o("button",{type:"button",class:T(["summary-pill error",{active:e.query?.error}]),title:"Toggle errored filter",onClick:t[2]||(t[2]=s=>{e.query.error=!e.query.error,e.query.page=1}),"aria-pressed":!!e.query?.error},[t[15]||(t[15]=b("Errored ",-1)),o("span",rf,c(e.fmt?.number(e.statusCountFor("error"))),1)],10,nf),o("button",{type:"button",class:T(["summary-pill",{active:e.query?.expired}]),title:"Toggle expired filter",onClick:t[3]||(t[3]=s=>{e.query.expired=!e.query.expired,e.query.page=1}),"aria-pressed":!!e.query?.expired},[t[16]||(t[16]=b("Expired ",-1)),o("span",lf,c(e.fmt?.number(e.statusCountFor("expired"))),1)],10,af),o("button",{type:"button",class:T(["summary-pill",{active:e.query?.removed}]),title:"Toggle removed filter",onClick:t[4]||(t[4]=s=>{e.query.removed=!e.query.removed,e.query.page=1}),"aria-pressed":!!e.query?.removed},[t[17]||(t[17]=b("Removed ",-1)),o("span",uf,c(e.fmt?.number(e.statusCountFor("removed"))),1)],10,df)]),e.fetchError?(l(),d("div",cf,[t[18]||(t[18]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),b(" "+c(e.fetchError),1)])):p("v-if",!0),N((l(),d("form",pf,[o("div",ff,[o("div",mf,[N(o("input",hf,null,512),[[n,{state:e.viewState,set:s=>{e.query.search=s},value:e.query?.search,form:null,options:{}}]]),e.query?.search?p("v-if",!0):(l(),d("span",vf,"/"))]),t[22]||(t[22]=o("span",{class:"admin-filter-spacer"},null,-1)),o("button",{class:"btn btn-sm",type:"button",onClick:t[5]||(t[5]=s=>e.exportCsv())},[...t[19]||(t[19]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-export"})],-1),b(" Export",-1)])]),o("span",gf,[o("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[6]||(t[6]=s=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1,"aria-label":"Previous page"},[...t[20]||(t[20]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-left"})],-1)])],8,yf),o("span",bf,c(e.query?.page)+"/"+c(e.totalPage||1),1),o("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[7]||(t[7]=s=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage,"aria-label":"Next page"},[...t[21]||(t[21]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-right"})],-1)])],8,wf)])]),e.chips?.length?(l(),d("div",kf,[o("div",Ef,[(l(!0),d(X,null,re(e.chips,(s,i)=>(l(),d("span",{class:"admin-active-chip",key:s?.key},[o("span",Cf,c(s?.label),1),o("span",null,c(s?.value),1),o("button",{type:"button",onClick:a=>e.clearFilter(s.key),"aria-label":"Clear filter"},[...t[23]||(t[23]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])],8,_f)]))),128))])])):p("v-if",!0)])),[[r,e.viewState]]),o("div",Sf,[o("div",Nf,[o("div",Df,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="name"}]),onClick:t[8]||(t[8]=s=>e.sortBy("name"))},[t[25]||(t[25]=b("Conference ",-1)),e.sortIcon("name")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("name")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[24]||(t[24]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",Rf,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="status"}]),onClick:t[9]||(t[9]=s=>e.sortBy("status"))},[t[27]||(t[27]=b("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[26]||(t[26]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[30]||(t[30]=o("div",{role:"columnheader",class:"num"},"Repos",-1)),o("div",Tf,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="startDate"}]),onClick:t[10]||(t[10]=s=>e.sortBy("startDate"))},[t[29]||(t[29]=b("Window ",-1)),e.sortIcon("startDate")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("startDate")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[28]||(t[28]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[31]||(t[31]=o("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(X,null,re(e.filteredConferences,(s,i)=>(l(),d("div",Af,[o("div",Of,[t[33]||(t[33]=o("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Conference"},[o("use",{href:"#project-icon-conference"})],-1)),o("div",If,[o("a",{class:"repo-name",textContent:c(s?.name),href:e.safeUrl("/conference/"+s?.conferenceID)},null,8,Pf),o("div",Vf,[o("span",null,c(s?.conferenceID),1),t[32]||(t[32]=b("\xA0\xB7\xA0",-1)),o("span",null,c(e.fmt?.number(s?.price||0))+" \u20AC",1)])])]),o("div",qf,[o("span",{class:T(["status-dot",{"status-removed":s?.status=="removed"||s?.status=="expired","status-ready":s?.status=="ready","status-error":s?.status=="error","status-preparing":s?.status=="preparing"}])},null,2),o("span",{textContent:c(e.fmt?.title(s?.status))},null,8,Mf)]),o("div",Lf,[t[34]||(t[34]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1)),o("a",{title:"Show repositories in this conference",textContent:c(e.fmt?.number(s?.repositories?.length||0)),href:e.safeUrl("/admin/?conference="+s?.conferenceID)},null,8,$f)]),o("div",Uf,[t[35]||(t[35]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),b(" "+c(e.fmt?.date(s?.startDate))+" \u2013 "+c(e.fmt?.date(s?.endDate)),1)]),o("div",Ff,[o("div",zf,[t[41]||(t[41]=o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})])],-1)),o("div",Hf,[o("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+s?.conferenceID+"/edit")},[...t[36]||(t[36]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit",-1)])],8,Bf),o("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+s?.conferenceID+"/")},[...t[37]||(t[37]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View",-1)])],8,jf),o("a",{class:"dropdown-item",href:e.safeUrl("/admin/?conference="+s?.conferenceID)},[...t[38]||(t[38]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1),b(" View repositories",-1)])],8,Gf),t[40]||(t[40]=o("div",{class:"dropdown-divider"},null,-1)),N(o("a",{class:"dropdown-item text-danger",href:"#",onClick:me(a=>e.removeConference(s),["prevent"])},[...t[39]||(t[39]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Remove",-1)])],8,Wf),[[Y,s?.status!="removed"]])])])])]))),256)),e.filteredConferences?.length==0?(l(),d("div",Kf,[...t[42]||(t[42]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1),o("span",null,"No conferences match the current filters.",-1)])])):p("v-if",!0)]),o("div",Yf,[o("span",Jf,c(e.fmt?.number(e.total))+" results",1),e.totalPage>1?(l(),d("div",Qf,[o("button",{class:"btn btn-sm",onClick:t[11]||(t[11]=s=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1},[...t[43]||(t[43]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-left"})],-1),b(" Previous",-1)])],8,Xf),N(o("input",{type:"number",class:"form-control form-control-sm",min:"1",style:{width:"56px"},max:e.totalPage},null,8,Zf),[[n,{state:e.viewState,set:s=>{e.query.page=s},value:e.query?.page,form:null,options:{}}]]),o("span",null,"of "+c(e.totalPage),1),o("button",{class:"btn btn-sm",onClick:t[12]||(t[12]=s=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage},[...t[44]||(t[44]=[b("Next ",-1),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-right"})],-1)])],8,xf)])):p("v-if",!0),o("span",em,[t[46]||(t[46]=o("label",null,"Per page",-1)),N((l(),d("select",tm,[...t[45]||(t[45]=[ce('',5)])])),[[n,{state:e.viewState,set:s=>{e.query.limit=s},value:e.query?.limit,form:null,options:{}}]])])])])}var om={class:"container paper-page admin-page errors-page"},sm={class:"errors-header"},nm={class:"errors-actions"},rm={class:"kpi-grid"},im={class:"kpi-card"},am={class:"kpi-value"},lm={key:0},dm={key:1},um={class:"kpi-card kpi-error"},cm={class:"kpi-value"},pm={class:"kpi-sub"},fm={class:"kpi-card kpi-warn"},mm={class:"kpi-value"},hm={class:"kpi-sub"},vm={class:"kpi-card kpi-info"},gm={class:"kpi-value"},ym={class:"kpi-sub"},bm={class:"kpi-value"},wm={class:"kpi-sub"},km={key:0,class:"dropped-warn"},Em={class:"volume-chart"},Cm={class:"volume-bars"},_m=["title"],Sm={class:"errors-toolbar","aria-label":"Error filters"},Nm={class:"seg-tabs"},Dm={class:"search-wrap"},Rm={type:"search",class:"form-control",placeholder:"code:repo_not_found module:route status:>=400",autocomplete:"off"},Tm={key:0,class:"filter-count"},Am={class:"select-wrap"},Om={class:"form-control form-control-sm"},Im={class:"select-wrap"},Pm={class:"form-control form-control-sm"},Vm={class:"autoref"},qm={type:"checkbox"},Mm={key:0,class:"admin-empty"},Lm={key:1,class:"errors-pager"},$m={key:2,class:"errors-list"},Um=["onClick"],Fm={class:"col-when"},zm={class:"when-rel"},Hm={class:"when-abs"},Bm={class:"col-sev"},jm={class:"sev-label"},Gm={class:"col-mod"},Wm={class:"pill pill-module"},Km={class:"col-msg"},Ym={class:"msg-code"},Jm={key:0,class:"msg-context"},Qm={key:1,class:"msg-detail"},Xm={key:2,class:"msg-url"},Zm={class:"col-count"},xm={key:0,class:"count-pill"},eh={key:1,class:"count-pill count-pill-muted"},th={class:"col-status"},oh={key:0,class:"errors-row-detail"},sh={class:"detail-tabs"},nh=["onClick"],rh=["onClick"],ih=["onClick"],ah={class:"detail-body"},lh={class:"detail-main"},dh={key:0},uh={key:1,class:"stack-pre"},ch={key:2,class:"related-list"},ph={class:"when-abs"},fh={class:"msg-url"},mh={class:"detail-actions"},hh=["onClick"],vh=["onClick"],gh={key:0,class:"copy-hint"},yh={class:"detail-aside"},bh={class:"aside-block"},wh=["title"],kh={class:"aside-block"},Eh=["title"],Ch={class:"aside-block"},_h={class:"aside-value"},Sh={key:0,class:"aside-sub"},Nh={key:0,class:"aside-block"},Dh=["href"],Rh={key:1,class:"aside-block"},Th={class:"aside-value mono"};function cl(e,t){let n=be("field"),r=be("form");return l(),d("div",om,[t[32]||(t[32]=o("div",{class:"paper-crumbs"},[b("Admin \xA0/\xA0 "),o("span",{class:"here"},"Errors")],-1)),o("header",sm,[t[10]||(t[10]=o("h1",{class:"paper-page-title"},"Errors",-1)),o("div",nm,[o("button",{class:"btn btn-sm",type:"button",onClick:t[0]||(t[0]=s=>e.exportCsv())},[...t[8]||(t[8]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-export"})],-1),b(" Export CSV",-1)])]),o("button",{class:"btn btn-sm btn-danger",type:"button",onClick:t[1]||(t[1]=s=>e.clearAll())},[...t[9]||(t[9]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Clear all",-1)])])])]),t[33]||(t[33]=ce('',1)),o("section",rm,[o("div",im,[t[11]||(t[11]=o("div",{class:"kpi-label"},"Last 24h",-1)),o("div",am,c(e.stats?.last24h),1),o("div",{class:T(["kpi-sub",{up:e.stats?.delta>0,down:e.stats?.delta<0}])},[e.stats?.prev24h?(l(),d("span",lm,c(e.stats?.delta>0?"+":"")+c(e.stats?.delta)+"% vs yesterday",1)):p("v-if",!0),e.stats?.prev24h?p("v-if",!0):(l(),d("span",dm,"no prior baseline"))],2)]),o("div",um,[t[12]||(t[12]=o("div",{class:"kpi-label"},"Errors (5xx)",-1)),o("div",cm,c(e.stats?.severity?.error),1),o("div",pm,c(e.stats?.unique?.error)+" unique",1)]),o("div",fm,[t[13]||(t[13]=o("div",{class:"kpi-label"},"Warnings (4xx)",-1)),o("div",mm,c(e.stats?.severity?.warn),1),o("div",hm,c(e.stats?.unique?.warn)+" unique",1)]),o("div",vm,[t[14]||(t[14]=o("div",{class:"kpi-label"},"Info (auth, 404)",-1)),o("div",gm,c(e.stats?.severity?.info),1),o("div",ym,c(e.stats?.unique?.info)+" unique",1)]),o("div",{class:T(["kpi-card",{"kpi-error":e.stats?.dropped>0}])},[t[15]||(t[15]=o("div",{class:"kpi-label"},"Captured",-1)),o("div",bm,c(e.total),1),o("div",wm,[b(" cap "+c(e.cap)+" \xB7 "+c(e.available?"live":"redis off")+" ",1),e.stats?.dropped>0?(l(),d("span",km," \xB7 "+c(e.stats?.dropped)+" dropped",1)):p("v-if",!0)])],2)]),o("section",Em,[t[16]||(t[16]=ce('
Volume \xB7 24h \xB7 1h bucketserror warn info
',1)),o("div",Cm,[(l(!0),d(X,null,re(e.stats?.buckets,(s,i)=>(l(),d("div",{class:"volume-bar",key:i,title:e.bucketTitle(s)},[o("span",{class:"seg seg-error",style:Me({height:e.barPx(s,"error")+"px"})},null,4),o("span",{class:"seg seg-warn",style:Me({height:e.barPx(s,"warn")+"px"})},null,4),o("span",{class:"seg seg-info",style:Me({height:e.barPx(s,"info")+"px"})},null,4)],8,_m))),128))])]),N((l(),d("form",Sm,[o("div",Nm,[o("button",{type:"button",class:T({active:e.query?.bucket===""}),onClick:t[2]||(t[2]=s=>e.setBucket(""))},"All",2),o("button",{type:"button",class:T({active:e.query?.bucket==="error"}),onClick:t[3]||(t[3]=s=>e.setBucket("error"))},"5xx",2),o("button",{type:"button",class:T({active:e.query?.bucket==="warn"}),onClick:t[4]||(t[4]=s=>e.setBucket("warn"))},"4xx",2),o("button",{type:"button",class:T({active:e.query?.bucket==="info"}),onClick:t[5]||(t[5]=s=>e.setBucket("info"))},"Info",2)]),o("div",Dm,[t[17]||(t[17]=o("svg",{class:"ui-icon search-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-search"})],-1)),N(o("input",Rm,null,512),[[n,{state:e.viewState,set:s=>{e.query.search=s},value:e.query?.search,form:null,options:{}}]]),e.parsedFilterCount?(l(),d("span",Tm,c(e.parsedFilterCount)+" filter"+c(e.parsedFilterCount>1?"s":""),1)):p("v-if",!0)]),o("div",Am,[t[19]||(t[19]=o("label",null,"Sort",-1)),N((l(),d("select",Om,[...t[18]||(t[18]=[o("option",{value:"recent"},"Most recent",-1),o("option",{value:"count"},"Most frequent",-1)])])),[[n,{state:e.viewState,set:s=>{e.query.sort=s},value:e.query?.sort,form:null,options:{}}]])]),o("div",Im,[t[21]||(t[21]=o("label",null,"Group",-1)),N((l(),d("select",Pm,[...t[20]||(t[20]=[o("option",{value:""},"Off",-1),o("option",{value:"code"},"By code",-1),o("option",{value:"module"},"By module",-1)])])),[[n,{state:e.viewState,set:s=>{e.query.group=s},value:e.query?.group,form:null,options:{}}]])]),o("label",Vm,[N(o("input",qm,null,512),[[n,{state:e.viewState,set:s=>{e.query.autoRefresh=s},value:e.query?.autoRefresh,form:null,options:{}}]]),t[22]||(t[22]=b(" Auto-refresh ",-1))]),o("button",{class:"btn btn-sm btn-icon",type:"button",title:"Refresh now",onClick:t[6]||(t[6]=s=>e.refreshNow()),"aria-label":"Refresh"},[...t[23]||(t[23]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1)])])])),[[r,e.viewState]]),e.visible?.length?p("v-if",!0):(l(),d("div",Mm,"No errors captured.")),e.canLoadMore()&&e.visible?.length?(l(),d("div",Lm,[o("span",null,"Showing "+c(e.entries?.length)+" of "+c(e.total)+" captured",1),o("button",{class:"btn btn-sm",type:"button",onClick:t[7]||(t[7]=s=>e.loadMore())},"Load older")])):p("v-if",!0),e.visible?.length?(l(),d("div",$m,[t[31]||(t[31]=ce('
WhenSeverityModuleMessageCountStatus
',1)),(l(!0),d(X,null,re(e.visible,(s,i)=>(l(),d("div",{class:T(["errors-row",{open:e.expanded[s?._key]}]),key:s?._key},[o("div",{class:"errors-row-main",onClick:a=>e.toggle(s)},[o("div",Fm,[o("div",zm,c(e.relTime(s?.ts)),1),o("div",Hm,c(e.absTimeShort(s?.ts)),1)]),o("div",Bm,[o("span",{class:T(["sev-dot","sev-"+s?._bucket])},null,2),o("span",jm,c(e.fmt?.uppercase(s?._bucket)),1)]),o("div",Gm,[o("span",Wm,c(s?.module),1)]),o("div",Km,[o("strong",Ym,c(s?.displayMessage),1),s?.displayContext&&s?.displayContext!==s?.displayMessage?(l(),d("span",Jm,c(s?.displayContext),1)):p("v-if",!0),s?._detail?(l(),d("span",Qm,c(s?._detail),1)):p("v-if",!0),s?._url?(l(),d("div",Xm,c(s?._url),1)):p("v-if",!0)]),o("div",Zm,[s?.count>1?(l(),d("span",xm,"\xD7"+c(s?.count),1)):p("v-if",!0),s?.count===1?(l(),d("span",eh,"\xD71")):p("v-if",!0)]),o("div",th,[s?._status?(l(),d("span",{key:0,class:T(["status-pill","status-"+s?._bucket])},c(s?._status),3)):p("v-if",!0)])],8,Um),e.expanded[s?._key]?(l(),d("div",oh,[o("div",sh,[o("button",{type:"button",class:T({active:e.detailTab[s?._key]==="raw"||!e.detailTab[s?._key]}),onClick:a=>e.detailTab[s._key]="raw"},"Raw",10,nh),s?._stack?(l(),d("button",{key:0,type:"button",class:T({active:e.detailTab[s?._key]==="stack"}),onClick:a=>e.detailTab[s._key]="stack"},"Stack",10,rh)):p("v-if",!0),s?.count>1?(l(),d("button",{key:1,type:"button",class:T({active:e.detailTab[s?._key]==="related"}),onClick:a=>e.detailTab[s._key]="related"},"Related ("+c(s?.count)+")",11,ih)):p("v-if",!0)]),o("div",ah,[o("div",lh,[(e.detailTab[s?._key]||"raw")==="raw"?(l(),d("pre",dh,c(s?._detailJson),1)):p("v-if",!0),e.detailTab[s?._key]==="stack"?(l(),d("pre",uh,c(s?._stack),1)):p("v-if",!0),e.detailTab[s?._key]==="related"?(l(),d("div",ch,[(l(!0),d(X,null,re(s?._related,(a,u)=>(l(),d("div",{class:"related-row",key:u},[o("span",ph,c(e.absTimeShort(a?.ts)),1),o("span",fh,c(a?._url),1),a?._status?(l(),d("span",{key:0,class:T(["status-pill","status-"+a?._bucket])},c(a?._status),3)):p("v-if",!0)]))),128))])):p("v-if",!0),o("div",mh,[o("button",{class:"btn btn-sm",type:"button",title:"Copy a curl that reproduces the request",onClick:a=>e.copyCurl(s)},[...t[24]||(t[24]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-code"})],-1),b(" Copy curl",-1)])],8,hh),o("button",{class:"btn btn-sm",type:"button",onClick:a=>e.copyJson(s)},[...t[25]||(t[25]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-clipboard"})],-1),b(" Copy JSON",-1)])],8,vh),e.copyHint?(l(),d("span",gh,c(e.copyHint),1)):p("v-if",!0)])]),o("aside",yh,[o("div",bh,[t[26]||(t[26]=o("div",{class:"aside-label"},"First seen",-1)),o("div",{class:"aside-value",title:e.absTime(s?._firstSeen)},c(e.relTime(s?._firstSeen)),9,wh)]),o("div",kh,[t[27]||(t[27]=o("div",{class:"aside-label"},"Last seen",-1)),o("div",{class:"aside-value",title:e.absTime(s?.ts)},c(e.relTime(s?.ts)),9,Eh)]),o("div",Ch,[t[28]||(t[28]=o("div",{class:"aside-label"},"Occurrences",-1)),o("div",_h,[b(c(s?.count),1),s?._lastHourCount?(l(),d("span",Sh," \xB7 "+c(s?._lastHourCount)+" this hour",1)):p("v-if",!0)])]),s?._repoId?(l(),d("div",Nh,[t[29]||(t[29]=o("div",{class:"aside-label"},"Repository",-1)),o("a",{class:"aside-value",href:e.safeUrl("/r/"+s?._repoId)},c(s?._repoId),9,Dh)])):p("v-if",!0),s?._url?(l(),d("div",Rh,[t[30]||(t[30]=o("div",{class:"aside-label"},"URL",-1)),o("div",Th,c(s?._url),1)])):p("v-if",!0)])])])):p("v-if",!0)],2))),128))])):p("v-if",!0)])}var Ah={class:"container paper-page admin-page overview-page"},Oh={key:0,class:"admin-empty"},Ih={key:1,class:"alert alert-danger",style:{margin:"12px 0"}},Ph={key:2},Vh={class:"ov-kpi-row"},qh={class:"ov-kpi-card"},Mh={class:"ov-kpi-value"},Lh={class:"ov-kpi-sub"},$h={class:"ov-kpi-card"},Uh={class:"ov-kpi-sub"},Fh={class:"ov-kpi-card"},zh={class:"ov-kpi-sub"},Hh={class:"ov-kpi-card"},Bh={class:"ov-kpi-sub"},jh={class:"ov-kpi-card"},Gh={class:"ov-kpi-value"},Wh={class:"ov-kpi-sub"},Kh={class:"ov-daily-row"},Yh={class:"ov-daily-card"},Jh={class:"ov-daily-value"},Qh={class:"ov-daily-card"},Xh={class:"ov-daily-value"},Zh={class:"ov-daily-sub"},xh={class:"ov-daily-card"},ev={class:"ov-daily-value"},tv={class:"ov-chart-row"},ov={class:"ov-chart-card"},sv={key:0,class:"ov-spark-bars"},nv=["data-tip","aria-label"],rv={key:1,class:"ov-spark-x"},iv={class:"ov-chart-card"},av={key:0,class:"ov-spark-bars"},lv=["data-tip","aria-label"],dv={key:1,class:"ov-spark-x"},uv={class:"ov-chart-card"},cv={key:0,class:"ov-spark-bars"},pv=["data-tip","aria-label"],fv={key:1,class:"ov-spark-x"},mv={class:"ov-chart-card"},hv={key:0,class:"ov-spark-bars"},vv=["data-tip","aria-label"],gv={key:1,class:"ov-spark-x"},yv={class:"ov-triple-row"},bv={class:"ov-panel-card"},wv={class:"ov-panel-head"},kv={class:"ov-panel-meta"},Ev={class:"ov-stacked-bar"},Cv={class:"ov-bar-legend"},_v={href:"/admin/repositories",class:"ov-legend-item"},Sv={class:"ov-legend-n"},Nv={href:"/admin/repositories",class:"ov-legend-item"},Dv={class:"ov-legend-n"},Rv={href:"/admin/repositories",class:"ov-legend-item"},Tv={class:"ov-legend-n"},Av={href:"/admin/repositories",class:"ov-legend-item"},Ov={class:"ov-legend-n"},Iv={href:"/admin/repositories",class:"ov-legend-item"},Pv={class:"ov-legend-n"},Vv={class:"ov-panel-card"},qv={class:"ov-panel-head"},Mv={class:"ov-panel-meta"},Lv={class:"ov-error-bars"},$v={class:"ov-ebar-row"},Uv={class:"ov-ebar-track"},Fv={class:"ov-ebar-n"},zv={class:"ov-ebar-row"},Hv={class:"ov-ebar-track"},Bv={class:"ov-ebar-n"},jv={class:"ov-ebar-row"},Gv={class:"ov-ebar-track"},Wv={class:"ov-ebar-n"},Kv={key:0,class:"ov-panel-foot"},Yv={href:"/admin/errors"},Jv={class:"ov-panel-card"},Qv={class:"ov-routes-table"},Xv={class:"ov-route-row",href:"/admin/queues"},Zv={class:"ov-route-n"},xv={class:"ov-route-n"},eg={class:"ov-route-row",href:"/admin/queues"},tg={class:"ov-route-n"},og={class:"ov-route-n"},sg={class:"ov-route-row",href:"/admin/queues"},ng={class:"ov-route-n"},rg={class:"ov-route-n"},ig={class:"ov-services-card"},ag={class:"ov-services-head"},lg={class:"ov-panel-meta"},dg={class:"ov-services-grid"},ug={class:"ov-svc"},cg={class:"ov-svc-info"},pg={class:"ov-svc-meta"},fg={class:"ov-svc-detail"},mg={class:"ov-svc"},hg={class:"ov-svc-info"},vg={key:0,class:"ov-svc-meta"},gg={key:1,class:"ov-svc-meta"},yg={class:"ov-svc"},bg={class:"ov-svc-info"},wg={key:0,class:"ov-svc-meta"},kg={key:1,class:"ov-svc-meta"},Eg={class:"ov-svc"},Cg={class:"ov-svc-info"},_g={key:0,class:"ov-svc-meta"},Sg={key:1,class:"ov-svc-meta"},Ng={class:"ov-svc"},Dg={class:"ov-svc-info"},Rg={class:"ov-svc-meta"},Tg={class:"ov-panel-card ov-performance","aria-labelledby":"performance-heading"},Ag={class:"ov-panel-head ov-performance-head"},Og={class:"ov-performance-window"},Ig={key:0,class:"ov-performance-message ov-performance-warning",role:"alert"},Pg={key:1,class:"ov-performance-empty",role:"status"},Vg={key:2},qg={class:"paper-tabs ov-performance-tabs",role:"tablist","aria-label":"Performance metrics"},Mg=["aria-selected","tabindex"],Lg=["aria-selected","tabindex"],$g=["aria-selected","tabindex"],Ug={id:"performance-routes",role:"tabpanel","aria-labelledby":"performance-routes-tab"},Fg={key:0,class:"ov-metrics-scroll",tabindex:"0",role:"region","aria-label":"Route latency metrics, scroll for more columns"},zg={class:"ov-metrics-table"},Hg={scope:"row",class:"ov-metric-name"},Bg={class:"num"},jg={class:"num"},Gg={class:"num"},Wg={class:"num"},Kg={class:"num"},Yg={key:1,class:"ov-performance-empty"},Jg={id:"performance-processes",role:"tabpanel","aria-labelledby":"performance-processes-tab"},Qg={key:0,class:"ov-performance-message ov-performance-warning",role:"status"},Xg={key:1,class:"ov-metrics-scroll",tabindex:"0",role:"region","aria-label":"Process resource metrics, scroll for more columns"},Zg={class:"ov-metrics-table"},xg={scope:"row",class:"ov-metric-name"},ey={key:0,class:"ov-metric-warn"},ty={class:"num"},oy={class:"num"},sy={class:"num"},ny={class:"num"},ry={class:"num"},iy={class:"num"},ay={class:"num"},ly={class:"num"},dy={id:"performance-stages",role:"tabpanel","aria-labelledby":"performance-stages-tab"},uy={key:0,class:"ov-metrics-scroll",tabindex:"0",role:"region","aria-label":"Work stage metrics, scroll for more columns"},cy={class:"ov-metrics-table"},py={scope:"row",class:"ov-metric-name"},fy={class:"num"},my={class:"num"},hy={class:"num"},vy={key:1,class:"ov-performance-empty"};function pl(e,t){return l(),d("div",Ah,[t[64]||(t[64]=ce('
Admin \xB7 System Health

Overview

',3)),e.loading?(l(),d("div",Oh,"Loading overview\u2026")):p("v-if",!0),e.error?(l(),d("div",Ih,[t[9]||(t[9]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),b(" "+c(e.error),1)])):p("v-if",!0),e.data?(l(),d("div",Ph,[p(" \u2500\u2500 Top KPI row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),o("section",Vh,[o("div",qh,[t[10]||(t[10]=o("div",{class:"ov-kpi-label"},[b("Repositories "),o("span",{class:"ov-dot ov-dot-ok"})],-1)),o("div",Mh,c(e.humanNum(e.data?.repos?.total)),1),o("div",Lh,"+"+c(e.data?.repos?.newRepos24h)+" \xB7 last 24h",1)]),o("div",$h,[t[11]||(t[11]=o("div",{class:"ov-kpi-label"},"CPU",-1)),o("div",{class:T(["ov-kpi-value",{"ov-val-warn":e.data?.system?.cpuPercent>80}])},c(e.data?.system?.cpuPercent)+"%",3),o("div",Uh,c(e.data?.system?.cpuCount)+" cores \xB7 load "+c(e.data?.system?.loadAvg?.[0]?.toFixed(1)),1)]),o("div",Fh,[t[12]||(t[12]=o("div",{class:"ov-kpi-label"},"Memory",-1)),o("div",{class:T(["ov-kpi-value",{"ov-val-warn":e.data?.system?.memPercent>85}])},c(e.data?.system?.memPercent)+"%",3),o("div",zh,c(e.humanBytes(e.data?.system?.memUsed))+" / "+c(e.humanBytes(e.data?.system?.memTotal)),1)]),o("div",Hh,[t[13]||(t[13]=o("div",{class:"ov-kpi-label"},"Disk",-1)),o("div",{class:T(["ov-kpi-value",{"ov-val-warn":e.data?.system?.diskPercent>85}])},c(e.data?.system?.diskPercent)+"%",3),o("div",Bh,c(e.humanBytes(e.data?.system?.diskUsed))+" / "+c(e.humanBytes(e.data?.system?.diskTotal))+" \xB7 "+c(e.data?.system?.diskMount),1)]),o("div",jh,[t[14]||(t[14]=o("div",{class:"ov-kpi-label"},"Uptime",-1)),o("div",Gh,c(e.humanDuration(e.data?.system?.uptime)),1),o("div",Wh,c(e.data?.system?.nodeVersion)+" \xB7 "+c(e.data?.system?.platform),1)])]),p(" \u2500\u2500 Daily activity highlights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),o("section",Kh,[o("div",Yh,[t[15]||(t[15]=o("div",{class:"ov-daily-label"},"New repos today",-1)),o("div",Jh,"+"+c(e.fmt?.number(e.data?.daily?.today?.repositories)),1),t[16]||(t[16]=o("div",{class:"ov-daily-sub"},"since yesterday",-1))]),o("div",Qh,[t[17]||(t[17]=o("div",{class:"ov-daily-label"},"New users today",-1)),o("div",Xh,"+"+c(e.fmt?.number(e.data?.daily?.today?.users)),1),o("div",Zh,c(e.fmt?.number(e.data?.users?.total))+" total users",1)]),o("div",xh,[t[18]||(t[18]=o("div",{class:"ov-daily-label"},"Page views today",-1)),o("div",ev,"+"+c(e.fmt?.number(e.data?.daily?.today?.pageViews)),1),t[19]||(t[19]=o("div",{class:"ov-daily-sub"},"since yesterday",-1))])]),p(" \u2500\u2500 Daily charts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),o("section",tv,[o("div",ov,[t[20]||(t[20]=o("div",{class:"ov-chart-head"},[o("span",{class:"ov-chart-title"},"Daily page views \xB7 30d"),o("span",{class:"ov-chart-legend"},[o("span",{class:"ov-dot-legend ov-dot-accent"}),b("views/day")])],-1)),e.data?.history?.length?(l(),d("div",sv,[(l(!0),d(X,null,re(e.data?.history,(n,r)=>(l(),d("div",{class:"ov-spark-col has-tip",key:r,"data-tip":e.historyLabel(n)+": +"+e.fmt?.number(n?.dailyPageViews)+" views","aria-label":e.historyLabel(n)+": +"+e.fmt?.number(n?.dailyPageViews)+" views"},[o("span",{class:"ov-spark-fill",style:Me({height:e.historyBarH(n,"dailyPageViews")+"px"})},null,4)],8,nv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",rv,[o("span",null,c(e.historyLabel(e.data?.history[0])),1),o("span",null,c(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),o("span",null,c(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)]),o("div",iv,[t[21]||(t[21]=o("div",{class:"ov-chart-head"},[o("span",{class:"ov-chart-title"},"New repos \xB7 30d"),o("span",{class:"ov-chart-legend"},[o("span",{class:"ov-dot-legend ov-dot-ok-fill"}),b("repos/day")])],-1)),e.data?.history?.length?(l(),d("div",av,[(l(!0),d(X,null,re(e.data?.history,(n,r)=>(l(),d("div",{class:"ov-spark-col has-tip",key:r,"data-tip":e.historyLabel(n)+": +"+e.fmt?.number(n?.dailyRepositories)+" repos","aria-label":e.historyLabel(n)+": +"+e.fmt?.number(n?.dailyRepositories)+" repos"},[o("span",{class:"ov-spark-fill ov-spark-fill-alt",style:Me({height:e.historyBarH(n,"dailyRepositories")+"px"})},null,4)],8,lv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",dv,[o("span",null,c(e.historyLabel(e.data?.history[0])),1),o("span",null,c(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),o("span",null,c(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)]),o("div",uv,[t[22]||(t[22]=o("div",{class:"ov-chart-head"},[o("span",{class:"ov-chart-title"},"Users \xB7 30d"),o("span",{class:"ov-chart-legend"},[o("span",{class:"ov-dot-legend ov-dot-user-fill"}),b("total users")])],-1)),e.data?.history?.length?(l(),d("div",cv,[(l(!0),d(X,null,re(e.data?.history,(n,r)=>(l(),d("div",{class:"ov-spark-col has-tip",key:r,"data-tip":e.historyLabel(n)+": "+e.fmt?.number(n?.nbUsers)+" users","aria-label":e.historyLabel(n)+": "+e.fmt?.number(n?.nbUsers)+" users"},[o("span",{class:"ov-spark-fill ov-spark-fill-user",style:Me({height:e.historyBarH(n,"nbUsers")+"px"})},null,4)],8,pv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",fv,[o("span",null,c(e.historyLabel(e.data?.history[0])),1),o("span",null,c(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),o("span",null,c(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)]),o("div",mv,[t[23]||(t[23]=o("div",{class:"ov-chart-head"},[o("span",{class:"ov-chart-title"},"New users \xB7 30d"),o("span",{class:"ov-chart-legend"},[o("span",{class:"ov-dot-legend ov-dot-new-user-fill"}),b("users/day")])],-1)),e.data?.history?.length?(l(),d("div",hv,[(l(!0),d(X,null,re(e.data?.history,(n,r)=>(l(),d("div",{class:"ov-spark-col has-tip",key:r,"data-tip":e.historyLabel(n)+": +"+e.fmt?.number(n?.dailyUsers)+" users","aria-label":e.historyLabel(n)+": +"+e.fmt?.number(n?.dailyUsers)+" users"},[o("span",{class:"ov-spark-fill ov-spark-fill-new-user",style:Me({height:e.historyBarH(n,"dailyUsers")+"px"})},null,4)],8,vv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",gv,[o("span",null,c(e.historyLabel(e.data?.history[0])),1),o("span",null,c(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),o("span",null,c(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)])]),p(" \u2500\u2500 Three-panel row: Status / Errors / Queues \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),o("section",yv,[p(" Repo status breakdown "),o("div",bv,[o("div",wv,[t[24]||(t[24]=o("span",{class:"ov-panel-title"},"Repo status",-1)),o("span",kv,c(e.fmt?.number(e.data?.repos?.total))+" total",1)]),o("div",Ev,[o("span",{class:"ov-bar-seg ov-bar-ready",title:"Ready",style:Me({width:e.barPct("ready")+"%"})},null,4),o("span",{class:"ov-bar-seg ov-bar-preparing",title:"Preparing",style:Me({width:e.barPct("preparing")+"%"})},null,4),o("span",{class:"ov-bar-seg ov-bar-error",title:"Error",style:Me({width:e.barPct("error")+"%"})},null,4),o("span",{class:"ov-bar-seg ov-bar-expired",title:"Expired",style:Me({width:e.barPct("expired")+"%"})},null,4),o("span",{class:"ov-bar-seg ov-bar-removed",title:"Removed",style:Me({width:e.barPct("removed")+"%"})},null,4)]),o("div",Cv,[o("a",_v,[t[25]||(t[25]=o("span",{class:"ov-swatch ov-bar-ready"},null,-1)),t[26]||(t[26]=b(" ready ",-1)),o("span",Sv,c(e.fmt?.number(e.statusCount("ready"))),1)]),o("a",Nv,[t[27]||(t[27]=o("span",{class:"ov-swatch ov-bar-preparing"},null,-1)),t[28]||(t[28]=b(" preparing ",-1)),o("span",Dv,c(e.fmt?.number(e.statusCount("preparing")+e.statusCount("download"))),1)]),o("a",Rv,[t[29]||(t[29]=o("span",{class:"ov-swatch ov-bar-error"},null,-1)),t[30]||(t[30]=b(" error ",-1)),o("span",Tv,c(e.fmt?.number(e.statusCount("error"))),1)]),o("a",Av,[t[31]||(t[31]=o("span",{class:"ov-swatch ov-bar-expired"},null,-1)),t[32]||(t[32]=b(" expired ",-1)),o("span",Ov,c(e.fmt?.number(e.statusCount("expired")+e.statusCount("expiring"))),1)]),o("a",Iv,[t[33]||(t[33]=o("span",{class:"ov-swatch ov-bar-removed"},null,-1)),t[34]||(t[34]=b(" removed ",-1)),o("span",Pv,c(e.fmt?.number(e.statusCount("removed")+e.statusCount("removing"))),1)])])]),p(" Error breakdown "),o("div",Vv,[o("div",qv,[t[35]||(t[35]=o("span",{class:"ov-panel-title"},"Errors \xB7 24h",-1)),o("span",Mv,c(e.data?.errors?.last24h)+" total",1)]),o("div",Lv,[o("div",$v,[t[36]||(t[36]=o("span",{class:"ov-ebar-label"},"5xx",-1)),o("span",Uv,[o("span",{class:"ov-ebar-fill ov-ebar-error",style:Me({width:e.errPct("error")+"%"})},null,4)]),o("span",Fv,c(e.data?.errors?.severity?.error),1)]),o("div",zv,[t[37]||(t[37]=o("span",{class:"ov-ebar-label"},"4xx",-1)),o("span",Hv,[o("span",{class:"ov-ebar-fill ov-ebar-warn",style:Me({width:e.errPct("warn")+"%"})},null,4)]),o("span",Bv,c(e.data?.errors?.severity?.warn),1)]),o("div",jv,[t[38]||(t[38]=o("span",{class:"ov-ebar-label"},"Info",-1)),o("span",Gv,[o("span",{class:"ov-ebar-fill ov-ebar-info",style:Me({width:e.errPct("info")+"%"})},null,4)]),o("span",Wv,c(e.data?.errors?.severity?.info),1)])]),e.data?.repos?.recentErrors24h?(l(),d("div",Kv,[o("a",Yv,c(e.data?.repos?.recentErrors24h)+" repos in error state \u2192",1)])):p("v-if",!0)]),p(" Top routes / queues "),o("div",Jv,[t[43]||(t[43]=o("div",{class:"ov-panel-head"},[o("span",{class:"ov-panel-title"},"Queues"),o("span",{class:"ov-panel-meta"},"by state")],-1)),o("div",Qv,[t[42]||(t[42]=ce('
QueueActiveWaitFailed
',1)),o("a",Xv,[t[39]||(t[39]=o("span",{class:"ov-route-name"},"download",-1)),o("span",Zv,c(e.data?.queues?.download?.active),1),o("span",xv,c(e.data?.queues?.download?.waiting),1),o("span",{class:T(["ov-route-n ov-route-lat",{"ov-n-bad":e.data?.queues?.download?.failed>0}])},c(e.data?.queues?.download?.failed),3)]),o("a",eg,[t[40]||(t[40]=o("span",{class:"ov-route-name"},"remove",-1)),o("span",tg,c(e.data?.queues?.remove?.active),1),o("span",og,c(e.data?.queues?.remove?.waiting),1),o("span",{class:T(["ov-route-n ov-route-lat",{"ov-n-bad":e.data?.queues?.remove?.failed>0}])},c(e.data?.queues?.remove?.failed),3)]),o("a",sg,[t[41]||(t[41]=o("span",{class:"ov-route-name"},"cache",-1)),o("span",ng,c(e.data?.queues?.cache?.active),1),o("span",rg,c(e.data?.queues?.cache?.waiting),1),o("span",{class:T(["ov-route-n ov-route-lat",{"ov-n-bad":e.data?.queues?.cache?.failed>0}])},c(e.data?.queues?.cache?.failed),3)])])])]),p(" \u2500\u2500 Services bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),o("section",ig,[o("div",ag,[t[44]||(t[44]=o("span",{class:"ov-panel-title"},"Services",-1)),o("span",lg,c(e.fmt?.number(e.data?.users?.total))+" users \xB7 "+c(e.data?.conferences?.total)+" conferences",1)]),o("div",dg,[o("div",ug,[t[46]||(t[46]=o("span",{class:"ov-svc-dot ov-dot-ok"},null,-1)),o("div",cg,[t[45]||(t[45]=o("span",{class:"ov-svc-name"},"web",-1)),o("span",pg,c(e.data?.system?.nodeVersion),1)]),o("span",fg,"uptime "+c(e.humanDuration(e.data?.system?.uptime)),1)]),o("div",mg,[o("span",{class:T(["ov-svc-dot",e.queueTotal(e.data?.queues?.download)>0?"ov-dot-ok":"ov-dot-idle"])},null,2),o("div",hg,[t[47]||(t[47]=o("span",{class:"ov-svc-name"},"download",-1)),e.queueTotal(e.data?.queues?.download)?(l(),d("span",vg,c(e.queueTotal(e.data?.queues?.download))+" jobs",1)):p("v-if",!0),e.queueTotal(e.data?.queues?.download)?p("v-if",!0):(l(),d("span",gg,"idle"))])]),o("div",yg,[o("span",{class:T(["ov-svc-dot",e.queueTotal(e.data?.queues?.cache)>0?"ov-dot-ok":"ov-dot-idle"])},null,2),o("div",bg,[t[48]||(t[48]=o("span",{class:"ov-svc-name"},"cache",-1)),e.queueTotal(e.data?.queues?.cache)?(l(),d("span",wg,c(e.queueTotal(e.data?.queues?.cache))+" jobs",1)):p("v-if",!0),e.queueTotal(e.data?.queues?.cache)?p("v-if",!0):(l(),d("span",kg,"idle"))])]),o("div",Eg,[o("span",{class:T(["ov-svc-dot",e.queueTotal(e.data?.queues?.remove)>0?"ov-dot-ok":"ov-dot-idle"])},null,2),o("div",Cg,[t[49]||(t[49]=o("span",{class:"ov-svc-name"},"remove",-1)),e.queueTotal(e.data?.queues?.remove)?(l(),d("span",_g,c(e.queueTotal(e.data?.queues?.remove))+" jobs",1)):p("v-if",!0),e.queueTotal(e.data?.queues?.remove)?p("v-if",!0):(l(),d("span",Sg,"idle"))])]),o("div",Ng,[o("span",{class:T(["ov-svc-dot",e.data?.repos?.recentErrors24h>10?"ov-dot-warn":"ov-dot-ok"])},null,2),o("div",Dg,[t[50]||(t[50]=o("span",{class:"ov-svc-name"},"errors",-1)),o("span",Rg,c(e.data?.errors?.last24h)+" / 24h",1)])])])])])):p("v-if",!0),o("section",Tg,[o("div",Ag,[t[53]||(t[53]=o("div",null,[o("h2",{class:"ov-panel-title",id:"performance-heading"},"Request performance"),o("p",{class:"ov-performance-note"},"Request latency and process health \xB7 refreshes every 30 seconds")],-1)),o("div",Og,[t[52]||(t[52]=o("label",{for:"performance-window"},"Time range",-1)),N(o("select",{id:"performance-window",class:"form-control form-control-sm","onUpdate:modelValue":t[0]||(t[0]=n=>e.performanceMinutes=n),onChange:t[1]||(t[1]=n=>e.loadPerformance()),"aria-label":"Performance time range"},[...t[51]||(t[51]=[o("option",{value:15},"Last 15 minutes",-1),o("option",{value:60},"Last hour",-1)])],544),[[ea,e.performanceMinutes,void 0,{number:!0}]])])]),e.performanceError?(l(),d("div",Ig,[t[54]||(t[54]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),o("span",null,c(e.performanceError),1),o("button",{type:"button",class:"btn btn-sm",onClick:t[2]||(t[2]=n=>e.loadPerformance())},"Retry")])):p("v-if",!0),!e.performance&&!e.performanceError?(l(),d("p",Pg,"Loading performance monitoring\u2026")):p("v-if",!0),e.performance?.available?(l(),d("div",Vg,[o("div",qg,[o("button",{id:"performance-routes-tab",type:"button",class:T(["paper-tab",{active:e.performanceTab==="routes"}]),role:"tab","aria-selected":e.performanceTab==="routes",tabindex:e.performanceTab==="routes"?0:-1,"aria-controls":"performance-routes",onClick:t[3]||(t[3]=n=>e.performanceTab="routes"),onKeydown:t[4]||(t[4]=n=>e.previewTabKeydown(n))},"Routes",42,Mg),o("button",{id:"performance-processes-tab",type:"button",class:T(["paper-tab",{active:e.performanceTab==="processes"}]),role:"tab","aria-selected":e.performanceTab==="processes",tabindex:e.performanceTab==="processes"?0:-1,"aria-controls":"performance-processes",onClick:t[5]||(t[5]=n=>e.performanceTab="processes"),onKeydown:t[6]||(t[6]=n=>e.previewTabKeydown(n))},"Processes",42,Lg),o("button",{id:"performance-stages-tab",type:"button",class:T(["paper-tab",{active:e.performanceTab==="stages"}]),role:"tab","aria-selected":e.performanceTab==="stages",tabindex:e.performanceTab==="stages"?0:-1,"aria-controls":"performance-stages",onClick:t[7]||(t[7]=n=>e.performanceTab="stages"),onKeydown:t[8]||(t[8]=n=>e.previewTabKeydown(n))},"Work stages",42,$g)]),N(o("div",Ug,[e.performance.routes?.length?(l(),d("div",Fg,[o("table",zg,[t[55]||(t[55]=o("caption",{class:"sr-only"},"Route latency for the selected time range",-1)),t[56]||(t[56]=o("thead",null,[o("tr",null,[o("th",{scope:"col"},"Route"),o("th",{scope:"col",class:"num"},"Requests"),o("th",{scope:"col",class:"num"},"Average"),o("th",{scope:"col",class:"num"},"First byte p95"),o("th",{scope:"col",class:"num"},"p95"),o("th",{scope:"col",class:"num"},"p99"),o("th",{scope:"col",class:"num"},"Interrupted"),o("th",{scope:"col",class:"num"},"5xx"),o("th",{scope:"col",class:"num"},"Slow")])],-1)),o("tbody",null,[(l(!0),d(X,null,re(e.performance.routes,n=>(l(),d("tr",{key:n.service+n.method+n.route},[o("th",Hg,[o("span",null,c(n.route),1),o("small",null,c(n.service)+" \xB7 "+c(n.method),1)]),o("td",Bg,c(e.fmt.number(n.count)),1),o("td",jg,c(n.avgMs)+" ms",1),o("td",Gg,c(e.firstByteBound(n)),1),o("td",Wg,c(e.latencyBound(n,"p95UpperMs")),1),o("td",Kg,c(e.latencyBound(n,"p99UpperMs")),1),o("td",{class:T(["num",{"ov-metric-warn":n.aborted>0}])},c(e.fmt.number(n.aborted)),3),o("td",{class:T(["num",{"ov-metric-warn":n.errors>0}])},c(e.fmt.number(n.errors)),3),o("td",{class:T(["num",{"ov-metric-warn":n.slow>0}])},c(e.fmt.number(n.slow)),3)]))),128))])])])):(l(),d("p",Yg,"No recorded requests in this time range yet."))],512),[[Y,e.performanceTab==="routes"]]),N(o("div",Jg,[t[60]||(t[60]=o("p",{class:"ov-performance-note"},"API and streamer processes \xB7 latest sample per instance",-1)),e.performance.instances?.length?(l(),d("div",Xg,[o("table",Zg,[t[58]||(t[58]=o("caption",{class:"sr-only"},"API and streamer process resource usage",-1)),t[59]||(t[59]=o("thead",null,[o("tr",null,[o("th",{scope:"col"},"Process"),o("th",{scope:"col",class:"num"},"RSS / limit"),o("th",{scope:"col",class:"num"},"CPU"),o("th",{scope:"col",class:"num"},"Event loop p95"),o("th",{scope:"col",class:"num"},"Active requests"),o("th",{scope:"col",class:"num"},"Sockets / CLOSE_WAIT"),o("th",{scope:"col",class:"num"},"Workers / waiting"),o("th",{scope:"col",class:"num"},"Sample age"),o("th",{scope:"col",class:"num"},"Dropped batches / metrics")])],-1)),o("tbody",null,[(l(!0),d(X,null,re(e.performance.instances,n=>(l(),d("tr",{key:n.instance,class:T({"ov-metric-warning-row":e.performanceWarning(n)})},[o("th",xg,[o("span",null,c(n.instance),1),e.performanceWarning(n)?(l(),d("small",ey,[...t[57]||(t[57]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1),b(" Needs attention",-1)])])):p("v-if",!0)]),o("td",ty,[b(c(e.humanBytes(n.memory.rss))+" / "+c(e.humanBytes(n.memoryLimitBytes)),1),o("small",null,"Peak "+c(e.humanBytes(e.peakRss(n))),1)]),o("td",oy,c(n.cpuPercent.toFixed(1))+"%",1),o("td",sy,c(n.eventLoop.p95Ms.toFixed(1))+" ms",1),o("td",ny,c(n.activeRequests),1),o("td",ry,c(n.sockets?.descriptors??"Unavailable")+" / "+c(n.sockets?.closeWait??"Unavailable"),1),o("td",iy,c(n.workers?.running??0)+" / "+c(n.workers?.waiting??0),1),o("td",ay,c(e.sampleAge(n))+" s",1),o("td",ly,c(n.droppedBatches)+" / "+c(n.droppedMetrics),1)],2))),128))])])])):(l(),d("div",Qg,"No recent process samples. Monitoring coverage is incomplete."))],512),[[Y,e.performanceTab==="processes"]]),N(o("div",dy,[e.performance.stages?.some(n=>n.metric!=="first_byte")?(l(),d("div",uy,[o("table",cy,[t[61]||(t[61]=o("caption",{class:"sr-only"},"Work stages and cache results",-1)),t[62]||(t[62]=o("thead",null,[o("tr",null,[o("th",{scope:"col"},"Work stage"),o("th",{scope:"col",class:"num"},"Samples"),o("th",{scope:"col",class:"num"},"Average"),o("th",{scope:"col",class:"num"},"p95")])],-1)),o("tbody",null,[(l(!0),d(X,null,re(e.performance.stages.filter(n=>n.metric!=="first_byte"),n=>(l(),d("tr",{key:n.service+n.metric},[o("th",py,[o("span",null,c(n.metric),1),o("small",null,c(n.service),1)]),o("td",fy,c(e.fmt.number(n.count)),1),o("td",my,c(n.avgMs)+" ms",1),o("td",hy,c(e.latencyBound(n,"p95UpperMs")),1)]))),128))])])])):(l(),d("p",vy,"No recorded work stages or cache results in this time range yet."))],512),[[Y,e.performanceTab==="stages"]]),t[63]||(t[63]=o("details",{class:"ov-performance-help"},[o("summary",null,"How to read these metrics"),o("p",null,"Latency includes upstream waits and response transfer. Percentiles show histogram bucket upper bounds, not exact timings. Process rows marked \u201CNeeds attention\u201D have stale samples, dropped monitoring data, CLOSE_WAIT sockets, high event loop delay, or high memory usage.")],-1))])):p("v-if",!0)])])}var gy={class:"container paper-page admin-page"},yy={class:"q-header"},by={class:"q-header-actions"},wy={class:"q-range-btns"},ky={class:"q-cards"},Ey=["aria-pressed","onKeydown","onClick"],Cy={class:"q-card-head"},_y=["textContent"],Sy=["textContent"],Ny={class:"q-card-sub"},Dy={key:0,class:"q-card-bar"},Ry={key:0,class:"q-detail"},Ty={class:"q-throughput"},Ay={class:"q-section-label"},Oy={class:"q-section-right"},Iy={class:"q-stats-panel"},Py={class:"q-section-label"},Vy={class:"q-stats-grid"},qy={class:"q-stat"},My=["textContent"],Ly={class:"q-stat"},$y=["textContent"],Uy={class:"q-stat"},Fy=["textContent"],zy={class:"q-stat"},Hy=["textContent"],By={class:"q-stat"},jy=["textContent"],Gy={class:"q-stat"},Wy=["textContent"],Ky={class:"q-stats-actions"},Yy=["disabled"],Jy={class:"q-jobs"},Qy={class:"q-jobs-header"},Xy={class:"q-section-label"},Zy={class:"q-state-filters"},xy={class:"q-state-toggle"},eb={type:"checkbox"},tb={class:"q-search-row"},ob={type:"search",class:"form-control",placeholder:"Search by job/repo id\u2026",autocomplete:"off"},sb={class:"q-auto-refresh"},rb={type:"checkbox"},ib={key:0,class:"q-table"},ab=["onClick"],lb={class:"q-cell-state"},db=["textContent"],ub=["textContent"],cb={class:"q-cell-id"},pb=["textContent","href"],fb={class:"q-cell-payload"},mb=["textContent"],hb={key:0,class:"q-payload-detail"},vb=["textContent"],gb=["textContent"],yb={class:"q-cell-progress"},bb={key:0,class:"q-progress-wrap"},wb=["textContent"],kb={class:"q-cell-actions"},Eb=["onClick"],Cb=["onClick"],_b={key:0,class:"q-detail-row"},Sb={colspan:"7"},Nb={class:"q-job-detail"},Db={class:"q-job-detail-grid"},Rb={class:"q-job-detail-item"},Tb={class:"q-job-detail-value"},Ab=["textContent","href"],Ob={class:"q-job-detail-item"},Ib={class:"q-job-detail-value"},Pb=["textContent"],Vb={key:0,class:"q-job-detail-item"},qb=["textContent"],Mb={key:1,class:"q-job-detail-item"},Lb=["textContent"],$b={key:2,class:"q-job-detail-item"},Ub={class:"q-job-detail-value"},Fb={key:3,class:"q-job-detail-item"},zb=["textContent"],Hb={key:4,class:"q-job-detail-item"},Bb=["textContent"],jb={key:5,class:"q-job-detail-item"},Gb=["textContent"],Wb={key:6,class:"q-job-detail-item"},Kb=["textContent"],Yb={key:7,class:"q-job-detail-item"},Jb=["textContent"],Qb={key:0,class:"q-job-detail-error"},Xb=["textContent"],Zb={key:1},xb=["textContent"],e1={class:"q-job-detail-actions"},t1=["onClick"],o1=["onClick"],s1=["href"],n1={key:1,class:"paper-table-empty",style:{border:"1px solid var(--border-color)","border-radius":"10px",background:"var(--paper-card)"}},r1={key:0},i1={key:1};function fl(e,t){let n=be("field");return l(),d("div",gy,[t[48]||(t[48]=o("div",{class:"paper-crumbs"},[b("Admin \xA0/\xA0 "),o("span",{class:"here"},"Queues")],-1)),o("div",yy,[t[12]||(t[12]=o("h1",{class:"paper-page-title"},"Queues",-1)),o("div",by,[o("div",wy,[o("button",{class:T(["btn btn-sm",{active:e.range=="1h"}]),onClick:t[0]||(t[0]=r=>e.setRange("1h"))},"1h",2),o("button",{class:T(["btn btn-sm",{active:e.range=="6h"}]),onClick:t[1]||(t[1]=r=>e.setRange("6h"))},"6h",2),o("button",{class:T(["btn btn-sm",{active:e.range=="24h"}]),onClick:t[2]||(t[2]=r=>e.setRange("24h"))},"24h",2),o("button",{class:T(["btn btn-sm",{active:e.range=="7d"}]),onClick:t[3]||(t[3]=r=>e.setRange("7d"))},"7d",2)]),o("button",{class:"btn btn-sm",onClick:t[4]||(t[4]=r=>e.pauseAll())},"Pause all"),o("button",{class:"btn btn-sm btn-dark",onClick:t[5]||(t[5]=r=>e.drainSelected())},"Drain "+c(e.selectedQueue),1)])]),t[49]||(t[49]=ce('',1)),p(" Queue overview cards "),o("div",ky,[(l(!0),d(X,null,re(e.queueList,(r,s)=>(l(),d("div",{class:T(["q-card",{selected:e.selectedQueue==r?.key,paused:r?.paused}]),role:"button",tabindex:"0","aria-pressed":e.selectedQueue===r.key,onKeydown:[Ro(me(i=>e.selectQueue(r.key),["prevent"]),["enter"]),Ro(me(i=>e.selectQueue(r.key),["prevent"]),["space"])],onClick:i=>e.selectQueue(r.key)},[o("div",Cy,[o("span",{class:T(["q-dot",{"q-dot-red":r?.paused||r?.counts?.failed>0}])},null,2),o("span",{class:"q-card-name",textContent:c(r?.label)},null,8,_y)]),o("div",{class:"q-card-count",textContent:c((r?.counts?.waiting||0)+(r?.counts?.active||0)+(r?.counts?.delayed||0))},null,8,Sy),o("div",Ny,[o("span",null,"waiting \xB7 "+c(r?.counts?.active||0)+" active",1),r?.counts?.active?(l(),d("div",Dy,[o("div",{class:"q-card-bar-fill",style:Me({width:r?.counts?.active/((r?.counts?.waiting||0)+(r?.counts?.active||0)+(r?.counts?.delayed||0)||1)*100+"%"})},null,4)])):p("v-if",!0)])],42,Ey))),256))]),p(" Detail: throughput chart + stats panel "),e.selectedStats?(l(),d("div",Ry,[o("div",Ty,[o("div",Ay,[b(c(e.selectedQueue)+"\xB7throughput ",1),o("span",Oy,[t[13]||(t[13]=o("span",{class:"q-legend-completed"},"\u25CF",-1)),t[14]||(t[14]=b(" completed ",-1)),t[15]||(t[15]=o("span",{class:"q-legend-failed"},"\u25CF",-1)),t[16]||(t[16]=b(" failed ",-1)),t[17]||(t[17]=o("span",{class:"q-legend-exec"},"- -",-1)),b(" avg time \xB7 "+c(e.fmt?.uppercase(e.range)),1)])]),t[18]||(t[18]=o("div",{class:"q-chart-wrap"},[o("canvas",{id:"q-throughput-chart",height:"180"}),o("div",{id:"q-chart-tooltip",class:"q-chart-tooltip",style:{display:"none"}}),o("div",{id:"q-chart-crosshair",class:"q-chart-crosshair",style:{display:"none"}})],-1))]),o("div",Iy,[o("div",Py,c(e.selectedQueue)+"\xB7stats",1),o("div",Vy,[o("div",qy,[t[19]||(t[19]=o("div",{class:"q-stat-label"},"WAITING",-1)),o("div",{class:"q-stat-value",textContent:c(e.selectedStats?.counts?.waiting||0)},null,8,My)]),o("div",Ly,[t[20]||(t[20]=o("div",{class:"q-stat-label"},"ACTIVE",-1)),o("div",{class:"q-stat-value",textContent:c(e.selectedStats?.counts?.active||0)},null,8,$y)]),o("div",Uy,[t[21]||(t[21]=o("div",{class:"q-stat-label"},"COMPLETED (24H)",-1)),o("div",{class:"q-stat-value",textContent:c(e.fmt?.number(e.selectedStats?.completed24h))},null,8,Fy)]),o("div",zy,[t[22]||(t[22]=o("div",{class:"q-stat-label"},"FAILED (24H)",-1)),o("div",{class:"q-stat-value",textContent:c(e.selectedStats?.failed24h||0)},null,8,Hy)]),o("div",By,[t[23]||(t[23]=o("div",{class:"q-stat-label"},"DELAYED",-1)),o("div",{class:"q-stat-value",textContent:c(e.selectedStats?.counts?.delayed||0)},null,8,jy)]),o("div",Gy,[t[24]||(t[24]=o("div",{class:"q-stat-label"},"WORKERS",-1)),o("div",{class:"q-stat-value",textContent:c(e.selectedStats?.workers||0)},null,8,Wy)])]),o("div",Ky,[o("button",{class:"btn btn-sm",onClick:t[6]||(t[6]=r=>e.togglePause())},c(e.selectedStats?.paused?"Resume":"Pause"),1),o("button",{class:"btn btn-sm",onClick:t[7]||(t[7]=r=>e.retryFailed()),disabled:!e.selectedStats?.counts?.failed},"Retry failed",8,Yy),o("button",{class:"btn btn-sm",onClick:t[8]||(t[8]=r=>e.emptyQueue())},"Empty")])])])):p("v-if",!0),e.actionError?(l(),d("div",{key:1,class:"q-toast-error",onClick:t[9]||(t[9]=r=>e.actionError=null)},[t[25]||(t[25]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})],-1)),b(" "+c(e.actionError),1)])):p("v-if",!0),p(" Jobs table "),o("div",Jy,[o("div",Qy,[o("div",Xy,"ALL JOBS \xB7 "+c(e.fmt?.uppercase(e.selectedQueue)),1),o("div",Zy,[(l(!0),d(X,null,re(e.allStates,(r,s)=>(l(),d("label",xy,[N(o("input",eb,null,512),[[n,{state:e.viewState,set:i=>{e.stateFilter[r]=i},value:e.stateFilter[r],form:null,options:{}}]]),o("span",{class:T("q-state-chip q-state-"+r)},c(r),3)]))),256))])]),o("div",tb,[N(o("input",ob,null,512),[[n,{state:e.viewState,set:r=>{e.query.search=r},value:e.query?.search,form:null,options:{}}]]),o("label",sb,[N(o("input",rb,null,512),[[n,{state:e.viewState,set:r=>{e.query.autoRefresh=r},value:e.query?.autoRefresh,form:null,options:{}}]]),t[26]||(t[26]=b(" Auto-refresh ",-1))]),o("button",{class:"btn btn-sm btn-icon",type:"button",title:"Refresh now",onClick:t[10]||(t[10]=r=>e.refreshNow()),"aria-label":"Refresh"},[...t[27]||(t[27]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1)])])]),e.filteredJobs().length>0?(l(),d("table",ib,[t[46]||(t[46]=o("thead",null,[o("tr",null,[o("th",null,"STATE"),o("th",null,"JOB ID"),o("th",null,"PAYLOAD"),o("th",null,"ATTEMPTS"),o("th",null,"DURATION"),o("th",null,"PROGRESS"),o("th")])],-1)),(l(!0),d(X,null,re(e.filteredJobs(),(r,s)=>(l(),d("tbody",null,[o("tr",{style:{cursor:"pointer"},class:T({"q-row-failed":r?._state=="failed","q-row-expanded":e.expanded[r?.id]}),onClick:i=>e.toggleJob(r)},[o("td",lb,[o("span",{textContent:c(r?._state),class:T("q-state-badge q-state-"+r?._state)},null,10,db),r?._state=="delayed"&&r?.delayUntil?(l(),d("span",{key:0,class:"q-delay-hint",textContent:c(e.delayCountdown(r?.delayUntil))},null,8,ub)):p("v-if",!0)]),o("td",cb,[(l(),d("svg",{class:T(["ui-icon q-chevron",{"q-chevron-open":e.expanded[r?.id]}]),"aria-hidden":"true"},[...t[28]||(t[28]=[o("use",{href:"#ui-icon-chevron-right"},null,-1)])],2)),o("a",{target:"_blank",textContent:c("job:"+e.fmt.limitTo(r?.id,6)),onClick:t[11]||(t[11]=i=>i.stopPropagation()),href:e.safeUrl("/r/"+r?.id)},null,8,pb)]),o("td",fb,[o("span",{textContent:c(r?.name||"anonymize")},null,8,mb),r?.data?.repoId&&r?.data?.repoId!==r?.name?(l(),d("span",hb," \xB7 "+c(r?.data?.repoId),1)):p("v-if",!0)]),o("td",{class:"q-cell-num",textContent:c(r?.attemptsMade||1)},null,8,vb),o("td",{class:"q-cell-num",textContent:c(e.jobDuration(r))},null,8,gb),o("td",yb,[e.jobProgressPct(r)!==null?(l(),d("div",bb,[o("div",{class:"q-progress-bar",style:Me({"--pct":e.jobProgressPct(r)+"%"})},null,4),o("span",{class:"q-progress-label",textContent:c(e.jobProgressPct(r)+"%")},null,8,wb)])):p("v-if",!0)]),o("td",kb,[r?._state=="failed"?(l(),d("button",{key:0,class:"btn btn-sm btn-icon",title:"Retry",onClick:i=>{e.retryJob(r),i.stopPropagation()},"aria-label":"Retry job"},[...t[29]||(t[29]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1)])],8,Eb)):p("v-if",!0),o("button",{class:"btn btn-sm btn-icon",title:"Remove","aria-label":"Remove job",onClick:i=>{e.removeJob(r),i.stopPropagation()}},[...t[30]||(t[30]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1)])],8,Cb)])],10,ab),e.expanded[r?.id]?(l(),d("tr",_b,[o("td",Sb,[o("div",Nb,[o("div",Db,[o("div",Rb,[t[31]||(t[31]=o("span",{class:"q-job-detail-label"},"JOB ID",-1)),o("span",Tb,[o("a",{target:"_blank",textContent:c(r?.id),href:e.safeUrl("/r/"+r?.id)},null,8,Ab)])]),o("div",Ob,[t[32]||(t[32]=o("span",{class:"q-job-detail-label"},"STATE",-1)),o("span",Ib,[o("span",{textContent:c(r?._state),class:T("q-state-badge q-state-"+r?._state)},null,10,Pb)])]),r?.data?.repoId?(l(),d("div",Vb,[t[33]||(t[33]=o("span",{class:"q-job-detail-label"},"REPO ID",-1)),o("span",{class:"q-job-detail-value",textContent:c(r?.data?.repoId)},null,8,qb)])):p("v-if",!0),r?.timestamp?(l(),d("div",Mb,[t[34]||(t[34]=o("span",{class:"q-job-detail-label"},"CREATED",-1)),o("span",{class:"q-job-detail-value",textContent:c(e.humanTime(r?.timestamp))},null,8,Lb)])):p("v-if",!0),r?._state=="delayed"&&r?.delayUntil?(l(),d("div",$b,[t[35]||(t[35]=o("span",{class:"q-job-detail-label"},"RETRY AT",-1)),o("span",Ub,c(e.humanTime(r?.delayUntil))+" ("+c(e.delayCountdown(r?.delayUntil))+")",1)])):p("v-if",!0),r?.processedOn?(l(),d("div",Fb,[t[36]||(t[36]=o("span",{class:"q-job-detail-label"},"PROCESSED",-1)),o("span",{class:"q-job-detail-value",textContent:c(e.humanTime(r?.processedOn))},null,8,zb)])):p("v-if",!0),r?.finishedOn?(l(),d("div",Hb,[t[37]||(t[37]=o("span",{class:"q-job-detail-label"},"FINISHED",-1)),o("span",{class:"q-job-detail-value",textContent:c(e.humanTime(r?.finishedOn))},null,8,Bb)])):p("v-if",!0),r?.attemptsMade?(l(),d("div",jb,[t[38]||(t[38]=o("span",{class:"q-job-detail-label"},"ATTEMPTS",-1)),o("span",{class:"q-job-detail-value",textContent:c(r?.attemptsMade)},null,8,Gb)])):p("v-if",!0),r?.progress&&r?.progress?.status?(l(),d("div",Wb,[t[39]||(t[39]=o("span",{class:"q-job-detail-label"},"STATUS",-1)),o("span",{class:"q-job-detail-value",textContent:c(r?.progress?.status)},null,8,Kb)])):p("v-if",!0),e.jobProgressPct(r)!==null?(l(),d("div",Yb,[t[40]||(t[40]=o("span",{class:"q-job-detail-label"},"PROGRESS",-1)),o("span",{class:"q-job-detail-value",textContent:c(e.jobProgressPct(r)+"%")},null,8,Jb)])):p("v-if",!0)]),r?.failedReason?(l(),d("div",Qb,[t[41]||(t[41]=o("span",{class:"q-job-detail-label"},"ERROR",-1)),o("div",{class:"q-error-reason",textContent:c(r?.failedReason)},null,8,Xb)])):p("v-if",!0),r?.stacktrace?.length?(l(),d("div",Zb,[t[42]||(t[42]=o("span",{class:"q-job-detail-label"},"STACKTRACE",-1)),(l(!0),d(X,null,re(r?.stacktrace,(i,a)=>(l(),d("pre",{class:"q-error-stack",key:a},[o("code",{textContent:c(i)},null,8,xb)]))),128))])):p("v-if",!0),o("div",e1,[r?._state=="failed"?(l(),d("button",{key:0,class:"btn btn-sm",onClick:i=>e.retryJob(r)},[...t[43]||(t[43]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Retry",-1)])],8,t1)):p("v-if",!0),o("button",{class:"btn btn-sm",onClick:i=>e.removeJob(r)},[...t[44]||(t[44]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Remove",-1)])],8,o1),o("a",{class:"btn btn-sm",target:"_blank",href:e.safeUrl("/r/"+r?.id)},[...t[45]||(t[45]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-external-link"})],-1),b(" View repo",-1)])],8,s1)])])])])):p("v-if",!0)]))),256))])):p("v-if",!0),e.filteredJobs().length==0?(l(),d("div",n1,[t[47]||(t[47]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-check-circle"})],-1)),e.query?.search?p("v-if",!0):(l(),d("span",r1,"No jobs in the "+c(e.selectedQueue)+" queue.",1)),e.query?.search?(l(),d("span",i1,"No jobs match the current filters.")):p("v-if",!0)])):p("v-if",!0)])])}var a1={class:"container paper-page admin-page"},l1={class:"admin-summary"},d1={class:"summary-total"},u1={class:"summary-meta"},c1=["aria-pressed"],p1={class:"count"},f1=["aria-pressed"],m1={class:"count"},h1=["aria-pressed"],v1={class:"count"},g1=["aria-pressed"],y1={class:"count"},b1=["aria-pressed"],w1={class:"count"},k1={key:0,class:"alert alert-danger",style:{margin:"8px 0"}},E1={class:"w-100 admin-filter-toolbar","aria-label":"Repositories","accept-charset":"UTF-8"},C1={class:"admin-filter-row"},_1={class:"search-wrap"},S1={type:"search",class:"form-control","aria-label":"Search repositories",placeholder:"Search repoId, source repo, error message\u2026",autocomplete:"off"},N1={key:0,class:"admin-search-hint"},D1={class:"admin-filter-inline"},R1={type:"text",class:"form-control form-control-sm",placeholder:"username"},T1={class:"admin-filter-inline"},A1={type:"text",class:"form-control form-control-sm",placeholder:"ID"},O1={class:"admin-filter-inline","aria-label":"Pagination"},I1=["disabled"],P1={style:{"font-family":"var(--font-mono)","font-size":"12px",color:"var(--ink-muted)"}},V1=["disabled"],q1={key:0,class:"admin-filter-row"},M1={class:"admin-active-chips"},L1={class:"key"},$1=["onClick"],U1={key:1,class:"bulk-bar"},F1={class:"paper-table paper-table-repos has-bulk w-100",role:"table","aria-label":"Repositories"},z1={class:"paper-table-head",role:"row"},H1={role:"columnheader",style:{width:"28px"}},B1=["checked"],j1={role:"columnheader"},G1={role:"columnheader"},W1={role:"columnheader",class:"num"},K1={role:"columnheader"},Y1={role:"cell",style:{width:"28px"}},J1={type:"checkbox","aria-label":"Select repository"},Q1={class:"cell-anon",role:"cell"},X1={class:"anon-text"},Z1=["textContent","href"],x1={class:"anon-sub"},ew=["textContent","href"],tw={key:0},ow=["textContent","href"],sw={key:1},nw=["textContent","href"],rw={key:2},iw={class:"cell-status",role:"cell"},aw={class:"status-line"},lw=["textContent"],dw=["textContent","title"],uw={class:"cell-views num",role:"cell"},cw=["textContent"],pw={class:"cell-expires",role:"cell"},fw=["textContent"],mw={class:"cell-actions",role:"cell"},hw={class:"dropdown"},vw={class:"dropdown-menu dropdown-menu-right"},gw=["href"],yw=["href"],bw=["href"],ww=["onClick"],kw=["onClick"],Ew=["onClick"],Cw=["onClick"],_w=["onClick"],Sw=["onClick"],Nw={key:0,class:"paper-table-empty"},Dw={class:"admin-toolbar",style:{"justify-content":"space-between","border-bottom":"none"}},Rw={style:{"font-size":"12px",color:"var(--ink-muted)"}},Tw={key:0,class:"pagination-compact"},Aw=["disabled"],Ow=["max"],Iw=["disabled"],Pw={class:"admin-filter-inline"},Vw={class:"form-control form-control-sm"};function ml(e,t){let n=be("field"),r=be("form");return l(),d("div",a1,[t[69]||(t[69]=ce('
Admin \xA0/\xA0 Repositories

Repositories

',3)),o("div",l1,[o("span",d1,c(e.total>=0?e.fmt.number(e.total):"\u2026"),1),o("span",u1,c(e.fmt?.humanFileSize(e.totalSize))+" on disk",1),o("button",{type:"button",class:T(["summary-pill ok",{active:e.query?.ready}]),title:"Toggle ready filter",onClick:t[0]||(t[0]=s=>{e.query.ready=!e.query.ready,e.query.page=1}),"aria-pressed":!!e.query?.ready},[t[18]||(t[18]=b("Ready ",-1)),o("span",p1,c(e.fmt?.number(e.statusCountFor("ready"))),1)],10,c1),o("button",{type:"button",class:T(["summary-pill warn",{active:e.query?.preparing}]),title:"Toggle preparing filter",onClick:t[1]||(t[1]=s=>{e.query.preparing=!e.query.preparing,e.query.page=1}),"aria-pressed":!!e.query?.preparing},[t[19]||(t[19]=b("Preparing ",-1)),o("span",m1,c(e.fmt?.number(e.statusCountFor("preparing")+e.statusCountFor("download"))),1)],10,f1),o("button",{type:"button",class:T(["summary-pill error",{active:e.query?.error}]),title:"Toggle errored filter",onClick:t[2]||(t[2]=s=>{e.query.error=!e.query.error,e.query.page=1}),"aria-pressed":!!e.query?.error},[t[20]||(t[20]=b("Errored ",-1)),o("span",v1,c(e.fmt?.number(e.statusCountFor("error"))),1)],10,h1),o("button",{type:"button",class:T(["summary-pill",{active:e.query?.expired}]),title:"Toggle expired filter",onClick:t[3]||(t[3]=s=>{e.query.expired=!e.query.expired,e.query.page=1}),"aria-pressed":!!e.query?.expired},[t[21]||(t[21]=b("Expired ",-1)),o("span",y1,c(e.fmt?.number(e.statusCountFor("expired")+e.statusCountFor("expiring"))),1)],10,g1),o("button",{type:"button",class:T(["summary-pill",{active:e.query?.removed}]),title:"Toggle removed filter",onClick:t[4]||(t[4]=s=>{e.query.removed=!e.query.removed,e.query.page=1}),"aria-pressed":!!e.query?.removed},[t[22]||(t[22]=b("Removed ",-1)),o("span",w1,c(e.fmt?.number(e.statusCountFor("removed")+e.statusCountFor("removing"))),1)],10,b1)]),e.fetchError?(l(),d("div",k1,[t[23]||(t[23]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),b(" "+c(e.fetchError),1)])):p("v-if",!0),N((l(),d("form",E1,[p(" Row 1: search + scoped inputs + headline actions "),o("div",C1,[o("div",_1,[N(o("input",S1,null,512),[[n,{state:e.viewState,set:s=>{e.query.search=s},value:e.query?.search,form:null,options:{}}]]),e.query?.search?p("v-if",!0):(l(),d("span",N1,"/"))]),o("span",D1,[t[24]||(t[24]=o("label",null,"Owner",-1)),N(o("input",R1,null,512),[[n,{state:e.viewState,set:s=>{e.query.owner=s},value:e.query?.owner,form:null,options:{}}]])]),o("span",T1,[t[25]||(t[25]=o("label",null,"Conference",-1)),N(o("input",A1,null,512),[[n,{state:e.viewState,set:s=>{e.query.conference=s},value:e.query?.conference,form:null,options:{}}]])]),t[29]||(t[29]=o("span",{class:"admin-filter-spacer"},null,-1)),o("button",{class:"btn btn-sm",type:"button",title:"Export current view to CSV",onClick:t[5]||(t[5]=s=>e.exportCsv())},[...t[26]||(t[26]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-export"})],-1),b(" Export",-1)])]),o("span",O1,[o("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[6]||(t[6]=s=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1,"aria-label":"Previous page"},[...t[27]||(t[27]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-left"})],-1)])],8,I1),o("span",P1,c(e.query?.page)+"/"+c(e.totalPage||1),1),o("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[7]||(t[7]=s=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage,"aria-label":"Next page"},[...t[28]||(t[28]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-right"})],-1)])],8,V1)])]),p(" Row 2: appears only when there are active filter chips "),e.chips?.length?(l(),d("div",q1,[o("div",M1,[(l(!0),d(X,null,re(e.chips,(s,i)=>(l(),d("span",{class:"admin-active-chip",key:s?.key},[o("span",L1,c(s?.label),1),o("span",null,c(s?.value),1),o("button",{type:"button","aria-label":"Remove filter",onClick:a=>e.clearFilter(s.key)},[...t[30]||(t[30]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])],8,$1)]))),128))])])):p("v-if",!0)])),[[r,e.viewState]]),e.selectedCount()>0?(l(),d("div",U1,[o("span",null,[o("strong",null,c(e.selectedCount()),1),t[31]||(t[31]=b(" selected",-1))]),o("button",{class:"btn btn-sm",type:"button",onClick:t[8]||(t[8]=s=>e.bulkRefresh())},[...t[32]||(t[32]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Force refresh",-1)])]),o("button",{class:"btn btn-sm text-danger",type:"button",onClick:t[9]||(t[9]=s=>e.bulkRemoveCache())},[...t[33]||(t[33]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-broom"})],-1),b(" Remove cache",-1)])]),o("button",{class:"btn btn-sm",type:"button",onClick:t[10]||(t[10]=s=>e.clearSelection())},"Clear")])):p("v-if",!0),o("div",F1,[o("div",z1,[o("div",H1,[o("input",{type:"checkbox","aria-label":"Select all on page",onClick:t[11]||(t[11]=s=>e.selectAllOnPage()),checked:e.allSelected},null,8,B1)]),o("div",j1,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="source.repositoryName"}]),onClick:t[12]||(t[12]=s=>e.sortBy("source.repositoryName"))},[t[35]||(t[35]=b("Repository ",-1)),e.sortIcon("source.repositoryName")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("source.repositoryName")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[34]||(t[34]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",G1,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="status"}]),onClick:t[13]||(t[13]=s=>e.sortBy("status"))},[t[37]||(t[37]=b("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[36]||(t[36]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",W1,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="pageView"}]),onClick:t[14]||(t[14]=s=>e.sortBy("pageView"))},[t[39]||(t[39]=b("Views ",-1)),e.sortIcon("pageView")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("pageView")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[38]||(t[38]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",K1,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="anonymizeDate"}]),onClick:t[15]||(t[15]=s=>e.sortBy("anonymizeDate"))},[t[41]||(t[41]=b("Anonymized ",-1)),e.sortIcon("anonymizeDate")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("anonymizeDate")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[40]||(t[40]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[42]||(t[42]=o("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(X,null,re(e.filteredRepositories,(s,i)=>(l(),d("div",{class:T(["paper-table-row",{"repo-inactive":s?.status=="expired"||s?.status=="removed","repo-error":s?.status=="error","row-selected":e.selected[s?.repoId]}]),role:"row"},[o("div",Y1,[N(o("input",J1,null,512),[[n,{state:e.viewState,set:a=>{e.selected[s.repoId]=a},value:e.selected[s?.repoId],form:null,options:{}}]])]),o("div",Q1,[t[47]||(t[47]=o("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[o("use",{href:"#project-type-repo"})],-1)),o("div",X1,[o("a",{class:"repo-name",target:"_blank",textContent:c(s?.repoId),href:e.safeUrl("/r/"+s?.repoId)},null,8,Z1),o("div",x1,[o("a",{textContent:c(s?.source?.repositoryName),href:e.safeUrl("https://github.com/"+s?.source?.repositoryName+"/")},null,8,ew),s?.options?.update?(l(),d("span",tw,[t[43]||(t[43]=b("\xA0\xB7\xA0",-1)),o("a",{textContent:c(s?.source?.branch),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/tree/"+s?.source?.branch)},null,8,ow)])):p("v-if",!0),s?.options?.update?p("v-if",!0):(l(),d("span",sw,[t[44]||(t[44]=b("\xA0\xB7\xA0@",-1)),o("a",{textContent:c(s?.source?.commit?.substring(0,8)),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/tree/"+s?.source?.commit)},null,8,nw)])),s?.conference?(l(),d("span",rw,[t[45]||(t[45]=b("\xA0\xB7\xA0",-1)),t[46]||(t[46]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-conference"})],-1)),b(" "+c(s?.conference),1)])):p("v-if",!0),o("span",null,"\xA0\xB7\xA0"+c(e.fmt?.humanFileSize(s?.size?.storage)),1),o("span",null,"\xA0\xB7\xA0"+c(e.fmt?.number(s?.options?.terms?.length))+" terms",1)])])]),o("div",iw,[o("span",aw,[o("span",{class:T(["status-dot",{"status-removed":s?.status=="removed"||s?.status=="expired","status-ready":s?.status=="ready","status-error":s?.status=="error","status-preparing":s?.status=="preparing"}])},null,2),o("span",{textContent:c(e.fmt?.title(s?.status))},null,8,lw)]),s?.statusMessage?(l(),d("span",{key:0,class:"status-sub",textContent:c(e.fmt?.statusMsg(s?.statusMessage)),title:s?.statusMessage},null,8,dw)):p("v-if",!0)]),o("div",uw,[t[48]||(t[48]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1)),t[49]||(t[49]=b()),o("span",{textContent:c(e.fmt?.number(s?.pageView||0))},null,8,cw)]),o("div",pw,[t[50]||(t[50]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),t[51]||(t[51]=b()),o("span",{textContent:c(e.fmt?.humanTime(s?.anonymizeDate))},null,8,fw)]),o("div",mw,[o("div",hw,[t[63]||(t[63]=o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})])],-1)),o("div",vw,[o("a",{class:"dropdown-item",href:e.safeUrl("/anonymize/"+s?.repoId)},[...t[52]||(t[52]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit",-1)])],8,gw),o("a",{class:"dropdown-item",href:e.safeUrl("/r/"+s?.repoId+"/")},[...t[53]||(t[53]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View repo",-1)])],8,yw),s?.options?.page&&s?.status=="ready"?(l(),d("a",{key:0,class:"dropdown-item",target:"_self",href:e.safeUrl("/w/"+s?.repoId+"/")},[...t[54]||(t[54]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-globe"})],-1),b(" View page",-1)])],8,bw)):p("v-if",!0),o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.fetchGithubInfo(s),["prevent"])},[...t[55]||(t[55]=[o("i",{class:"fab fa-github"},null,-1),b(" Live GitHub info",-1)])],8,ww),t[61]||(t[61]=o("div",{class:"dropdown-divider"},null,-1)),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.updateRepository(s),["prevent"])},[...t[56]||(t[56]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Force update",-1)])],8,kw),[[Y,s?.status=="ready"||s?.status=="error"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.updateRepository(s),["prevent"])},[...t[57]||(t[57]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-check-circle"})],-1),b(" Enable",-1)])],8,Ew),[[Y,s?.status=="removed"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.showStatusMessage(s),["prevent"])},[...t[58]||(t[58]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1),b(" View status message",-1)])],8,Cw),[[Y,s?.statusMessage]]),t[62]||(t[62]=o("div",{class:"dropdown-divider"},null,-1)),o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.removeCache(s),["prevent"])},[...t[59]||(t[59]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-broom"})],-1),b(" Remove cache",-1)])],8,_w),N(o("a",{class:"dropdown-item text-danger",href:"#",onClick:me(a=>e.removeRepository(s),["prevent"])},[...t[60]||(t[60]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Remove",-1)])],8,Sw),[[Y,s?.status=="ready"]])])])])],2))),256)),e.filteredRepositories?.length==0?(l(),d("div",Nw,[...t[64]||(t[64]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1),o("span",null,"No repositories match the current filters.",-1)])])):p("v-if",!0)]),o("div",Dw,[o("span",Rw,c(e.fmt?.number(e.total))+" results",1),e.totalPage>1?(l(),d("div",Tw,[o("button",{class:"btn btn-sm",onClick:t[16]||(t[16]=s=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1},[...t[65]||(t[65]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-left"})],-1),b(" Previous ",-1)])],8,Aw),N(o("input",{type:"number",class:"form-control form-control-sm",min:"1",style:{width:"56px"},"aria-label":"Page",max:e.totalPage},null,8,Ow),[[n,{state:e.viewState,set:s=>{e.query.page=s},value:e.query?.page,form:null,options:{}}]]),o("span",null,"of "+c(e.totalPage),1),o("button",{class:"btn btn-sm",onClick:t[17]||(t[17]=s=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage},[...t[66]||(t[66]=[b(" Next ",-1),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-right"})],-1)])],8,Iw)])):p("v-if",!0),o("span",Pw,[t[68]||(t[68]=o("label",null,"Per page",-1)),N((l(),d("select",Vw,[...t[67]||(t[67]=[ce('',5)])])),[[n,{state:e.viewState,set:s=>{e.query.limit=s},value:e.query?.limit,form:null,options:{}}]])])])])}var qw={class:"container paper-page admin-page"},Mw={class:"paper-crumbs"},Lw={class:"here"},$w={class:"paper-page-title"},Uw={key:0,class:"user-detail-card"},Fw={class:"user-header"},zw=["src"],Hw={class:"status-dot-wrap"},Bw=["textContent"],jw={key:0,class:"type-badge type-repo"},Gw={class:"user-actions",style:{"margin-top":"4px"}},Ww={class:"user-detail-grid"},Kw={class:"detail-value"},Yw={class:"detail-value"},Jw={class:"detail-value",style:{"font-family":"var(--font-mono)","font-size":"0.85rem"}},Qw={class:"detail-value"},Xw=["href"],Zw={class:"detail-value"},xw={class:"detail-value"},ek={key:0},tk={key:1,class:"text-muted"},ok={class:"detail-value"},sk={key:0,style:{"margin-top":"20px"}},nk={class:"paper-table w-100",style:{"margin-top":"10px"}},rk={class:"paper-table-row",style:{"grid-template-columns":"1fr 160px"}},ik={class:"cell-anon",role:"cell"},ak={class:"anon-text"},lk=["textContent"],dk={class:"cell-expires",role:"cell"},uk={key:1,class:"admin-section-header"},ck={class:"section-count"},pk={key:2,class:"user-detail-card"},fk={type:"text",class:"form-control",placeholder:"Token name (e.g. dev-laptop)",required:""},mk={key:0,class:"alert alert-warning",role:"alert"},hk={style:{"white-space":"pre-wrap","word-break":"break-all",margin:"8px 0 0","font-family":"var(--font-mono)","font-size":"0.85rem"}},vk={key:1,class:"paper-table w-100"},gk={class:"paper-table-row",role:"row",style:{"grid-template-columns":"1fr 200px 200px 80px"}},yk=["textContent"],bk=["textContent"],wk={role:"cell"},kk={key:0},Ek={key:1,class:"text-muted"},Ck={role:"cell"},_k=["onClick"],Sk={key:2,class:"paper-table-empty"},Nk={class:"admin-section-header"},Dk={class:"section-count"},Rk={class:"admin-summary"},Tk={class:"summary-total"},Ak=["aria-pressed"],Ok={class:"count"},Ik=["aria-pressed"],Pk={class:"count"},Vk=["aria-pressed"],qk={class:"count"},Mk=["aria-pressed"],Lk={class:"count"},$k=["aria-pressed"],Uk={class:"count"},Fk={class:"w-100 admin-filter-toolbar","aria-label":"Repositories","accept-charset":"UTF-8"},zk={class:"admin-filter-row"},Hk={class:"search-wrap"},Bk={type:"search",class:"form-control","aria-label":"Search repositories",placeholder:"Search repoId, source repo, error message\u2026",autocomplete:"off"},jk={key:3,class:"bulk-bar"},Gk={class:"paper-table paper-table-repos has-bulk w-100",role:"table","aria-label":"Repositories"},Wk={class:"paper-table-head",role:"row"},Kk={role:"columnheader",style:{width:"28px"}},Yk=["checked"],Jk={role:"columnheader"},Qk={role:"columnheader"},Xk={role:"columnheader",class:"num"},Zk={role:"columnheader"},xk={role:"cell",style:{width:"28px"}},e0={type:"checkbox","aria-label":"Select repository"},t0={class:"cell-anon",role:"cell"},o0={class:"anon-text"},s0=["textContent","href"],n0={class:"anon-sub"},r0=["textContent","href"],i0={key:0},a0=["textContent","href"],l0={key:1},d0=["textContent","href"],u0={key:2},c0={class:"cell-status",role:"cell"},p0={class:"status-line"},f0=["textContent"],m0=["textContent","title"],h0=["textContent"],v0=["textContent"],g0={class:"cell-actions",role:"cell"},y0={class:"dropdown"},b0={class:"dropdown-menu dropdown-menu-right"},w0=["href"],k0=["href"],E0=["href"],C0=["onClick"],_0=["onClick"],S0=["onClick"],N0=["onClick"],D0=["onClick"],R0=["onClick"],T0={key:0,class:"paper-table-empty"};function hl(e,t){let n=be("field"),r=be("form");return l(),d("div",qw,[o("div",Mw,[t[22]||(t[22]=o("a",{href:"/admin/users"},"Users",-1)),t[23]||(t[23]=b(" \xA0/\xA0 ",-1)),o("span",Lw,c(e.userInfo?.username||"Profile"),1)]),o("h1",$w,c(e.userInfo?.username||"User"),1),t[85]||(t[85]=ce('',1)),e.userInfo?(l(),d("div",Uw,[o("div",Fw,[e.userInfo?.photo?(l(),d("img",{key:0,width:"56",height:"56",src:e.safeUrl(e.userInfo?.photo)},null,8,zw)):p("v-if",!0),o("div",null,[o("h2",null,[b(c(e.userInfo?.username)+" ",1),o("span",Hw,[o("span",{class:T(["status-dot",{"status-ready":e.userInfo?.status=="active","status-removed":e.userInfo?.status!="active"}])},null,2),o("span",{textContent:c(e.fmt?.title(e.userInfo?.status))},null,8,Bw)]),e.userInfo?.isAdmin?(l(),d("span",jw,"Admin")):p("v-if",!0)]),o("div",Gw,[e.userInfo?.status!=="banned"?(l(),d("button",{key:0,class:"btn btn-sm text-danger",onClick:t[0]||(t[0]=s=>e.banUser())},[...t[24]||(t[24]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-ban"})],-1),b(" Ban",-1)])])):p("v-if",!0),e.userInfo?.status==="banned"||e.userInfo?.status==="removed"?(l(),d("button",{key:1,class:"btn btn-sm",onClick:t[1]||(t[1]=s=>e.activateUser())},[...t[25]||(t[25]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-check-circle"})],-1),b(" Activate",-1)])])):p("v-if",!0),e.userInfo?.isAdmin?p("v-if",!0):(l(),d("button",{key:2,class:"btn btn-sm",onClick:t[2]||(t[2]=s=>e.promoteUser())},[...t[26]||(t[26]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user-shield"})],-1),b(" Promote to admin",-1)])])),e.userInfo?.isAdmin?(l(),d("button",{key:3,class:"btn btn-sm text-danger",onClick:t[3]||(t[3]=s=>e.demoteUser())},[...t[27]||(t[27]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user-minus"})],-1),b(" Remove admin",-1)])])):p("v-if",!0)])])]),o("div",Ww,[t[30]||(t[30]=o("div",{class:"detail-label"},"ID",-1)),o("div",Kw,c(e.userInfo?._id),1),t[31]||(t[31]=o("div",{class:"detail-label"},"Email",-1)),o("div",Yw,c(e.userInfo?.emails?.[0]?.email),1),t[32]||(t[32]=o("div",{class:"detail-label"},"Access token",-1)),o("div",Jw,c(e.userInfo?.accessTokens?.github),1),t[33]||(t[33]=o("div",{class:"detail-label"},"GitHub",-1)),o("div",Qw,[o("a",{target:"_blank",href:e.safeUrl("https://github.com/"+e.userInfo?.username)},[t[28]||(t[28]=o("i",{class:"fab fa-github"},null,-1)),b(" "+c(e.userInfo?.username),1)],8,Xw)]),t[34]||(t[34]=o("div",{class:"detail-label"},"Created",-1)),o("div",Zw,c(e.fmt?.humanTime(e.userInfo?.dateOfEntry)),1),t[35]||(t[35]=o("div",{class:"detail-label"},"Last connection",-1)),o("div",xw,[e.userInfo?.accessTokenDates?.github?(l(),d("span",ek,c(e.fmt?.humanTime(e.userInfo?.accessTokenDates?.github)),1)):p("v-if",!0),e.userInfo?.accessTokenDates?.github?p("v-if",!0):(l(),d("span",tk,"never"))]),t[36]||(t[36]=o("div",{class:"detail-label"},"GitHub repos",-1)),o("div",ok,[b(c(e.userInfo?.repositories?.length)+" repositories ",1),o("button",{class:"btn btn-sm ml-2",onClick:t[4]||(t[4]=s=>e.showRepos=!e.showRepos)},c(e.showRepos?"Hide":"Show"),1),o("button",{class:"btn btn-sm ml-1",onClick:t[5]||(t[5]=s=>e.getGitHubRepositories())},[...t[29]||(t[29]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Refresh ",-1)])])])]),e.showRepos?(l(),d("div",sk,[t[39]||(t[39]=o("div",{class:"paper-section-eyebrow"},"GitHub repositories",-1)),o("div",nk,[(l(!0),d(X,null,re(e.userInfo?.repositories,(s,i)=>(l(),d("div",rk,[o("div",ik,[t[37]||(t[37]=o("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[o("use",{href:"#project-type-repo"})],-1)),o("div",ak,[o("span",{class:"repo-name",textContent:c(s?.name)},null,8,lk)])]),o("div",dk,[t[38]||(t[38]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-database"})],-1)),b(" "+c(e.fmt?.humanFileSize(s?.size)),1)])]))),256))])])):p("v-if",!0)])):p("v-if",!0),e.userInfo&&e.userInfo?.isAdmin&&e.user&&e.user?.username==e.userInfo?.username?(l(),d("div",uk,[t[40]||(t[40]=o("h2",null,[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-key"})]),b(" API tokens")],-1)),o("span",ck,c(e.tokens?.length),1)])):p("v-if",!0),e.userInfo&&e.userInfo?.isAdmin&&e.user&&e.user?.username==e.userInfo?.username?(l(),d("div",pk,[t[46]||(t[46]=o("p",{class:"paper-page-lede"},[b("Personal API tokens for this admin account. Send as "),o("code",null,"Authorization: Bearer "),b(" to authenticate without GitHub OAuth (useful for development).")],-1)),N((l(),d("form",{class:"d-flex",style:{gap:"8px","margin-bottom":"12px"},onSubmit:t[6]||(t[6]=me(s=>e.submitForm(s,()=>{e.createToken()}),["prevent"]))},[N(o("input",fk,null,512),[[n,{state:e.viewState,set:s=>{e.tokenForm.name=s},value:e.tokenForm?.name,form:null,options:{}}]]),t[41]||(t[41]=o("button",{type:"submit",class:"btn btn-primary"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-plus"})]),b(" Generate")],-1))],32)),[[r,e.viewState]]),e.tokenForm?.plaintext?(l(),d("div",mk,[t[42]||(t[42]=o("strong",null,"Copy this token now \u2014 it will not be shown again:",-1)),o("pre",hk,c(e.tokenForm?.plaintext),1),o("button",{class:"btn btn-sm",onClick:t[7]||(t[7]=s=>e.tokenForm.plaintext=null)},"Dismiss")])):p("v-if",!0),e.tokens?.length?(l(),d("div",vk,[t[44]||(t[44]=o("div",{class:"paper-table-head",role:"row",style:{"grid-template-columns":"1fr 200px 200px 80px"}},[o("div",{role:"columnheader"},"Name"),o("div",{role:"columnheader"},"Created"),o("div",{role:"columnheader"},"Last used"),o("div",{role:"columnheader","aria-label":"Actions"})],-1)),(l(!0),d(X,null,re(e.tokens,(s,i)=>(l(),d("div",gk,[o("div",{role:"cell",textContent:c(s?.name)},null,8,yk),o("div",{role:"cell",textContent:c(e.fmt?.humanTime(s?.createdAt))},null,8,bk),o("div",wk,[s?.lastUsedAt?(l(),d("span",kk,c(e.fmt?.humanTime(s?.lastUsedAt)),1)):p("v-if",!0),s?.lastUsedAt?p("v-if",!0):(l(),d("span",Ek,"never"))]),o("div",Ck,[o("button",{class:"btn btn-sm text-danger btn-icon",title:"Revoke","aria-label":"Revoke token",onClick:a=>e.revokeToken(s)},[...t[43]||(t[43]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1)])],8,_k)])]))),256))])):p("v-if",!0),e.tokens?.length?p("v-if",!0):(l(),d("div",Sk,[...t[45]||(t[45]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1),o("span",null,"No tokens yet.",-1)])]))])):p("v-if",!0),o("div",Nk,[t[47]||(t[47]=o("h2",null,[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})]),b(" Anonymized repositories")],-1)),o("span",Dk,c(e.repositories?.length),1)]),o("div",Rk,[o("span",Tk,c(e.fmt?.number(e.repositories?.length)),1),o("button",{type:"button",class:T(["summary-pill ok",{active:e.filters?.status?.ready===!1}]),title:"Toggle ready filter",onClick:t[8]||(t[8]=s=>e.filters.status.ready=!e.filters.status.ready),"aria-pressed":e.filters?.status?.ready===!1},[t[48]||(t[48]=b("Ready ",-1)),o("span",Ok,c(e.fmt?.number(e.statusCountFor("ready"))),1)],10,Ak),o("button",{type:"button",class:T(["summary-pill warn",{active:e.filters?.status?.preparing===!1}]),title:"Toggle preparing filter",onClick:t[9]||(t[9]=s=>e.filters.status.preparing=!e.filters.status.preparing),"aria-pressed":e.filters?.status?.preparing===!1},[t[49]||(t[49]=b("Preparing ",-1)),o("span",Pk,c(e.fmt?.number(e.statusCountFor("preparing"))),1)],10,Ik),o("button",{type:"button",class:T(["summary-pill error",{active:e.filters?.status?.error===!1}]),title:"Toggle errored filter",onClick:t[10]||(t[10]=s=>e.filters.status.error=!e.filters.status.error),"aria-pressed":e.filters?.status?.error===!1},[t[50]||(t[50]=b("Errored ",-1)),o("span",qk,c(e.fmt?.number(e.statusCountFor("error"))),1)],10,Vk),o("button",{type:"button",class:T(["summary-pill",{active:e.filters?.status?.expired===!1}]),title:"Toggle expired filter",onClick:t[11]||(t[11]=s=>e.filters.status.expired=!e.filters.status.expired),"aria-pressed":e.filters?.status?.expired===!1},[t[51]||(t[51]=b("Expired ",-1)),o("span",Lk,c(e.fmt?.number(e.statusCountFor("expired"))),1)],10,Mk),o("button",{type:"button",class:T(["summary-pill",{active:e.filters?.status?.removed===!1}]),title:"Toggle removed filter",onClick:t[12]||(t[12]=s=>e.filters.status.removed=!e.filters.status.removed),"aria-pressed":e.filters?.status?.removed===!1},[t[52]||(t[52]=b("Removed ",-1)),o("span",Uk,c(e.fmt?.number(e.statusCountFor("removed"))),1)],10,$k)]),N((l(),d("form",Fk,[o("div",zk,[o("div",Hk,[N(o("input",Bk,null,512),[[n,{state:e.viewState,set:s=>{e.search=s},value:e.search,form:null,options:{}}]])]),t[54]||(t[54]=o("span",{class:"admin-filter-spacer"},null,-1)),o("button",{class:"btn btn-sm",type:"button",title:"Export current view to CSV",onClick:t[13]||(t[13]=s=>e.exportCsv())},[...t[53]||(t[53]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-export"})],-1),b(" Export",-1)])])])])),[[r,e.viewState]]),e.selectedCount()>0?(l(),d("div",jk,[o("span",null,[o("strong",null,c(e.selectedCount()),1),t[55]||(t[55]=b(" selected",-1))]),o("button",{class:"btn btn-sm",type:"button",onClick:t[14]||(t[14]=s=>e.bulkRefresh())},[...t[56]||(t[56]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Force refresh",-1)])]),o("button",{class:"btn btn-sm text-danger",type:"button",onClick:t[15]||(t[15]=s=>e.bulkRemoveCache())},[...t[57]||(t[57]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-broom"})],-1),b(" Remove cache",-1)])]),o("button",{class:"btn btn-sm",type:"button",onClick:t[16]||(t[16]=s=>e.clearSelection())},"Clear")])):p("v-if",!0),o("div",Gk,[o("div",Wk,[o("div",Kk,[o("input",{type:"checkbox","aria-label":"Select all on page",onClick:t[17]||(t[17]=s=>e.selectAllOnPage()),checked:e.allSelected},null,8,Yk)]),o("div",Jk,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="source.repositoryName"}]),onClick:t[18]||(t[18]=s=>e.sortBy("source.repositoryName"))},[t[59]||(t[59]=b("Repository ",-1)),e.sortIcon("source.repositoryName")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("source.repositoryName")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[58]||(t[58]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",Qk,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="status"}]),onClick:t[19]||(t[19]=s=>e.sortBy("status"))},[t[61]||(t[61]=b("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[60]||(t[60]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",Xk,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="pageView"}]),onClick:t[20]||(t[20]=s=>e.sortBy("pageView"))},[t[63]||(t[63]=b("Views ",-1)),e.sortIcon("pageView")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("pageView")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[62]||(t[62]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),o("div",Zk,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="anonymizeDate"}]),onClick:t[21]||(t[21]=s=>e.sortBy("anonymizeDate"))},[t[65]||(t[65]=b("Anonymized ",-1)),e.sortIcon("anonymizeDate")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("anonymizeDate")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[64]||(t[64]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[66]||(t[66]=o("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(X,null,re(e.filteredRepositories,(s,i)=>(l(),d("div",{class:T(["paper-table-row",{"repo-inactive":s?.status=="expired"||s?.status=="removed","repo-error":s?.status=="error","row-selected":e.selected[s?.repoId]}]),role:"row"},[o("div",xk,[N(o("input",e0,null,512),[[n,{state:e.viewState,set:a=>{e.selected[s.repoId]=a},value:e.selected[s?.repoId],form:null,options:{}}]])]),o("div",t0,[t[71]||(t[71]=o("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[o("use",{href:"#project-type-repo"})],-1)),o("div",o0,[o("a",{class:"repo-name",target:"_blank",textContent:c(s?.repoId),href:e.safeUrl("/r/"+s?.repoId)},null,8,s0),o("div",n0,[o("a",{textContent:c(s?.source?.fullName),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/")},null,8,r0),s?.options?.update?(l(),d("span",i0,[t[67]||(t[67]=b("\xA0\xB7\xA0",-1)),o("a",{textContent:c(s?.source?.branch),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/tree/"+s?.source?.branch)},null,8,a0)])):p("v-if",!0),s?.options?.update?p("v-if",!0):(l(),d("span",l0,[t[68]||(t[68]=b("\xA0\xB7\xA0@",-1)),o("a",{textContent:c(s?.source?.commit?.substring(0,8)),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/tree/"+s?.source?.commit)},null,8,d0)])),s?.conference?(l(),d("span",u0,[t[69]||(t[69]=b("\xA0\xB7\xA0",-1)),t[70]||(t[70]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-conference"})],-1)),b(" "+c(s?.conference),1)])):p("v-if",!0),o("span",null,"\xA0\xB7\xA0"+c(e.fmt?.humanFileSize(s?.size?.storage)),1),o("span",null,"\xA0\xB7\xA0"+c(e.fmt?.number(s?.options?.terms?.length))+" terms",1)])])]),o("div",c0,[o("span",p0,[o("span",{class:T(["status-dot",{"status-removed":s?.status=="removed"||s?.status=="expired","status-ready":s?.status=="ready","status-error":s?.status=="error","status-preparing":s?.status=="preparing"}])},null,2),o("span",{textContent:c(e.fmt?.title(s?.status))},null,8,f0)]),s?.statusMessage?(l(),d("span",{key:0,class:"status-sub",textContent:c(e.fmt?.statusMsg(s?.statusMessage)),title:s?.statusMessage},null,8,m0)):p("v-if",!0)]),o("div",{class:"cell-views num",role:"cell",textContent:c(e.fmt?.number(s?.pageView||0))},null,8,h0),o("div",{class:"cell-expires",role:"cell",textContent:c(e.fmt?.humanTime(s?.anonymizeDate))},null,8,v0),o("div",g0,[o("div",y0,[t[83]||(t[83]=o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})])],-1)),o("div",b0,[o("a",{class:"dropdown-item",href:e.safeUrl("/anonymize/"+s?.repoId)},[...t[72]||(t[72]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit",-1)])],8,w0),o("a",{class:"dropdown-item",href:e.safeUrl("/r/"+s?.repoId+"/")},[...t[73]||(t[73]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View repo",-1)])],8,k0),s?.options?.page&&s?.status=="ready"?(l(),d("a",{key:0,class:"dropdown-item",target:"_self",href:e.safeUrl("/w/"+s?.repoId+"/")},[...t[74]||(t[74]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-globe"})],-1),b(" View page",-1)])],8,E0)):p("v-if",!0),o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.fetchGithubInfo(s),["prevent"])},[...t[75]||(t[75]=[o("i",{class:"fab fa-github"},null,-1),b(" Live GitHub info",-1)])],8,C0),t[81]||(t[81]=o("div",{class:"dropdown-divider"},null,-1)),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.updateRepository(s),["prevent"])},[...t[76]||(t[76]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Force update",-1)])],8,_0),[[Y,s?.status=="ready"||s?.status=="error"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.updateRepository(s),["prevent"])},[...t[77]||(t[77]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-check-circle"})],-1),b(" Enable",-1)])],8,S0),[[Y,s?.status=="removed"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.showStatusMessage(s),["prevent"])},[...t[78]||(t[78]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1),b(" View status message",-1)])],8,N0),[[Y,s?.statusMessage]]),t[82]||(t[82]=o("div",{class:"dropdown-divider"},null,-1)),o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.removeCache(s),["prevent"])},[...t[79]||(t[79]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-broom"})],-1),b(" Remove cache",-1)])],8,D0),N(o("a",{class:"dropdown-item text-danger",href:"#",onClick:me(a=>e.removeRepository(s),["prevent"])},[...t[80]||(t[80]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Remove",-1)])],8,R0),[[Y,s?.status=="ready"]])])])])],2))),256)),e.filteredRepositories?.length==0?(l(),d("div",T0,[...t[84]||(t[84]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1),o("span",null,"No repositories match the current filters.",-1)])])):p("v-if",!0)])])}var A0={class:"container paper-page admin-page"},O0={class:"admin-summary"},I0={class:"summary-total"},P0=["aria-pressed"],V0={class:"count"},q0=["aria-pressed"],M0={class:"count"},L0=["aria-pressed"],$0={class:"count"},U0={key:0,class:"alert alert-danger",style:{margin:"8px 0"}},F0={class:"w-100 admin-filter-toolbar","aria-label":"Users","accept-charset":"UTF-8"},z0={class:"admin-filter-row"},H0={class:"search-wrap"},B0={type:"search",class:"form-control","aria-label":"Search users",placeholder:"Search username or email\u2026",autocomplete:"off"},j0={key:0,class:"admin-search-hint"},G0={class:"admin-filter-inline"},W0={class:"form-control form-control-sm"},K0={class:"admin-filter-inline","aria-label":"Pagination"},Y0=["disabled"],J0={style:{"font-family":"var(--font-mono)","font-size":"12px",color:"var(--ink-muted)"}},Q0=["disabled"],X0={key:0,class:"admin-filter-row"},Z0={class:"admin-active-chips"},x0={class:"key"},eE=["onClick"],tE={key:1,class:"bulk-bar"},oE={class:"paper-table w-100",role:"table","aria-label":"Users",style:{"--cols":"28px minmax(280px, 2.4fr) 100px 140px 140px 52px"}},sE={class:"paper-table-head admin-users-row",role:"row"},nE={role:"columnheader",style:{width:"28px"}},rE=["checked"],iE={role:"columnheader"},aE={role:"columnheader"},lE={role:"cell",style:{width:"28px"}},dE={type:"checkbox","aria-label":"Select user"},uE={class:"cell-anon",role:"cell"},cE=["src"],pE={class:"anon-text"},fE=["textContent","href"],mE={class:"anon-sub"},hE={key:0},vE=["href"],gE={key:1},yE={class:"cell-views num",role:"cell"},bE=["textContent","href"],wE={class:"cell-status",role:"cell"},kE=["textContent"],EE={class:"cell-status",role:"cell"},CE={key:0,class:"type-badge type-repo"},_E={key:1,class:"empty-dash"},SE={class:"cell-actions",role:"cell"},NE={class:"dropdown"},DE={class:"dropdown-menu dropdown-menu-right"},RE=["href"],TE=["href"],AE=["onClick"],OE=["onClick"],IE={key:0,class:"paper-table-empty"},PE={class:"admin-toolbar",style:{"justify-content":"space-between","border-bottom":"none"}},VE={style:{"font-size":"12px",color:"var(--ink-muted)"}},qE={key:0,class:"pagination-compact"},ME=["disabled"],LE=["max"],$E=["disabled"],UE={class:"admin-filter-inline"},FE={class:"form-control form-control-sm"};function vl(e,t){let n=be("field"),r=be("form");return l(),d("div",A0,[t[46]||(t[46]=ce('
Admin \xA0/\xA0 Users

Users

',3)),o("div",O0,[o("span",I0,c(e.total>=0?e.fmt.number(e.total):"\u2026"),1),o("button",{type:"button",class:T(["summary-pill ok",{active:e.query?.status=="active"}]),onClick:t[0]||(t[0]=s=>{e.query.status=e.query.status=="active"?"":"active",e.query.page=1}),"aria-pressed":e.query?.status=="active"},[t[13]||(t[13]=b("Active ",-1)),o("span",V0,c(e.fmt?.number(e.statusCountFor("active"))),1)],10,P0),o("button",{type:"button",class:T(["summary-pill error",{active:e.query?.status=="banned"}]),onClick:t[1]||(t[1]=s=>{e.query.status=e.query.status=="banned"?"":"banned",e.query.page=1}),"aria-pressed":e.query?.status=="banned"},[t[14]||(t[14]=b("Banned ",-1)),o("span",M0,c(e.fmt?.number(e.statusCountFor("banned"))),1)],10,q0),o("button",{type:"button",class:T(["summary-pill",{active:e.query?.status=="removed"}]),onClick:t[2]||(t[2]=s=>{e.query.status=e.query.status=="removed"?"":"removed",e.query.page=1}),"aria-pressed":e.query?.status=="removed"},[t[15]||(t[15]=b("Removed ",-1)),o("span",$0,c(e.fmt?.number(e.statusCountFor("removed"))),1)],10,L0)]),e.fetchError?(l(),d("div",U0,[t[16]||(t[16]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),b(" "+c(e.fetchError),1)])):p("v-if",!0),N((l(),d("form",F0,[o("div",z0,[o("div",H0,[N(o("input",B0,null,512),[[n,{state:e.viewState,set:s=>{e.query.search=s},value:e.query?.search,form:null,options:{}}]]),e.query?.search?p("v-if",!0):(l(),d("span",j0,"/"))]),o("span",G0,[t[18]||(t[18]=o("label",null,"Role",-1)),N((l(),d("select",W0,[...t[17]||(t[17]=[o("option",{value:""},"Any",-1),o("option",{value:"admin"},"Admin",-1)])])),[[n,{state:e.viewState,set:s=>{e.query.role=s},value:e.query?.role,form:null,options:{}}]])]),t[22]||(t[22]=o("span",{class:"admin-filter-spacer"},null,-1)),o("button",{class:"btn btn-sm",type:"button",onClick:t[3]||(t[3]=s=>e.exportCsv())},[...t[19]||(t[19]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-export"})],-1),b(" Export",-1)])]),o("span",K0,[o("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[4]||(t[4]=s=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1,"aria-label":"Previous page"},[...t[20]||(t[20]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-left"})],-1)])],8,Y0),o("span",J0,c(e.query?.page)+"/"+c(e.totalPage||1),1),o("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[5]||(t[5]=s=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage,"aria-label":"Next page"},[...t[21]||(t[21]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-right"})],-1)])],8,Q0)])]),e.chips?.length?(l(),d("div",X0,[o("div",Z0,[(l(!0),d(X,null,re(e.chips,(s,i)=>(l(),d("span",{class:"admin-active-chip",key:s?.key},[o("span",x0,c(s?.label),1),o("span",null,c(s?.value),1),o("button",{type:"button",onClick:a=>e.clearFilter(s.key),"aria-label":"Clear filter"},[...t[23]||(t[23]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])],8,eE)]))),128))])])):p("v-if",!0)])),[[r,e.viewState]]),e.selectedCount()>0?(l(),d("div",tE,[o("span",null,[o("strong",null,c(e.selectedCount()),1),t[24]||(t[24]=b(" selected",-1))]),o("button",{class:"btn btn-sm text-danger",type:"button",onClick:t[6]||(t[6]=s=>e.bulkBan())},[...t[25]||(t[25]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-ban"})],-1),b(" Ban",-1)])]),o("button",{class:"btn btn-sm",type:"button",onClick:t[7]||(t[7]=s=>{e.selected={},e.allSelected=!1})},"Clear")])):p("v-if",!0),o("div",oE,[o("div",sE,[o("div",nE,[o("input",{type:"checkbox","aria-label":"Select all on page",onClick:t[8]||(t[8]=s=>e.selectAllOnPage()),checked:e.allSelected},null,8,rE)]),o("div",iE,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="username"}]),onClick:t[9]||(t[9]=s=>e.sortBy("username"))},[t[27]||(t[27]=b("User ",-1)),e.sortIcon("username")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("username")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[26]||(t[26]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[30]||(t[30]=o("div",{role:"columnheader",class:"num"},"Repos",-1)),o("div",aE,[o("button",{type:"button",class:T(["sortable",{active:e.query?.sort=="status"}]),onClick:t[10]||(t[10]=s=>e.sortBy("status"))},[t[29]||(t[29]=b("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:T(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[28]||(t[28]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[31]||(t[31]=o("div",{role:"columnheader"},"Role",-1)),t[32]||(t[32]=o("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(X,null,re(e.filteredUsers,(s,i)=>(l(),d("div",{class:T(["paper-table-row admin-users-row",{"row-selected":e.selected[s?.username]}]),role:"row"},[o("div",lE,[N(o("input",dE,null,512),[[n,{state:e.viewState,set:a=>{e.selected[s.username]=a},value:e.selected[s?.username],form:null,options:{}}]])]),o("div",uE,[s?.photo?(l(),d("img",{key:0,width:"28",height:"28",class:"rounded-circle",style:{"flex-shrink":"0"},src:e.safeUrl(s?.photo)},null,8,cE)):p("v-if",!0),o("div",pE,[o("a",{class:"repo-name",textContent:c(s?.username),href:e.safeUrl("/admin/users/"+s?.username)},null,8,fE),o("div",mE,[s?.emails?.[0]?.email?(l(),d("span",hE,c(s?.emails?.[0]?.email)+" \xB7 ",1)):p("v-if",!0),o("a",{target:"_blank",href:e.safeUrl("https://github.com/"+s?.username)},[t[33]||(t[33]=o("i",{class:"fab fa-github"},null,-1)),b(" "+c(s?.username),1)],8,vE),s?.dateOfEntry?(l(),d("span",gE,"\xA0\xB7\xA0Joined "+c(e.fmt?.humanTime(s?.dateOfEntry)),1)):p("v-if",!0)])])]),o("div",yE,[t[34]||(t[34]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1)),o("a",{title:"Show this user's repositories",textContent:c(e.fmt?.number(s?.repoCount||0)),href:e.safeUrl("/admin/repositories?owner="+s?.username)},null,8,bE)]),o("div",wE,[o("span",{class:T(["status-dot",{"status-ready":s?.status=="active","status-removed":s?.status=="removed"||s?.status=="banned"}])},null,2),o("span",{textContent:c(e.fmt?.title(s?.status))},null,8,kE)]),o("div",EE,[s?.isAdmin?(l(),d("span",CE,"Admin")):p("v-if",!0),s?.isAdmin?p("v-if",!0):(l(),d("span",_E,"\u2014"))]),o("div",SE,[o("div",NE,[t[40]||(t[40]=o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})])],-1)),o("div",DE,[o("a",{class:"dropdown-item",href:e.safeUrl("/admin/users/"+s?.username)},[...t[35]||(t[35]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View details",-1)])],8,RE),o("a",{class:"dropdown-item",href:e.safeUrl("/admin/repositories?owner="+s?.username)},[...t[36]||(t[36]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1),b(" View repositories",-1)])],8,TE),t[39]||(t[39]=o("div",{class:"dropdown-divider"},null,-1)),N(o("a",{class:"dropdown-item text-danger",href:"#",onClick:me(a=>e.banUser(s),["prevent"])},[...t[37]||(t[37]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-ban"})],-1),b(" Ban",-1)])],8,AE),[[Y,s?.status=="active"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.activateUser(s),["prevent"])},[...t[38]||(t[38]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-check-circle"})],-1),b(" Activate",-1)])],8,OE),[[Y,s?.status=="removed"||s?.status=="banned"]])])])])],2))),256)),e.filteredUsers?.length==0?(l(),d("div",IE,[...t[41]||(t[41]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1),o("span",null,"No users match the current filters.",-1)])])):p("v-if",!0)]),o("div",PE,[o("span",VE,c(e.fmt?.number(e.total))+" results",1),e.totalPage>1?(l(),d("div",qE,[o("button",{class:"btn btn-sm",onClick:t[11]||(t[11]=s=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1},[...t[42]||(t[42]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-left"})],-1),b(" Previous",-1)])],8,ME),N(o("input",{type:"number",class:"form-control form-control-sm",min:"1",style:{width:"56px"},max:e.totalPage},null,8,LE),[[n,{state:e.viewState,set:s=>{e.query.page=s},value:e.query?.page,form:null,options:{}}]]),o("span",null,"of "+c(e.totalPage),1),o("button",{class:"btn btn-sm",onClick:t[12]||(t[12]=s=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage},[...t[43]||(t[43]=[b("Next ",-1),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-chevron-right"})],-1)])],8,$E)])):p("v-if",!0),o("span",UE,[t[45]||(t[45]=o("label",null,"Per page",-1)),N((l(),d("select",FE,[...t[44]||(t[44]=[o("option",{value:"10"},"10",-1),o("option",{value:"25"},"25",-1),o("option",{value:"50"},"50",-1),o("option",{value:"100"},"100",-1)])])),[[n,{state:e.viewState,set:s=>{e.query.limit=s},value:e.query?.limit,form:null,options:{}}]])])])])}var zE={class:"anonymize-landing"},HE={class:"anonymize-landing-inner"},BE={class:"form-group mt-4 mb-2"},jE={class:"source-url-label-row"},GE={key:0,class:"repo-access","aria-label":"GitHub access"},WE={key:0,class:"repo-access-switch",role:"group","aria-label":"Repository connection"},KE=["aria-pressed","disabled"],YE=["aria-pressed","disabled"],JE={key:1,class:"connection-badge"},QE={id:"sourceUrl-landing",type:"text",class:"form-control form-control-lg",placeholder:"https://github.com/owner/repository"},XE={key:0,class:"draft-status",role:"status"},ZE={key:1,class:"text-danger",role:"alert"},xE={key:2,class:"repo-access-details","aria-label":"GitHub access"},eC={class:"repo-access-main"},tC={class:"repo-access-controls"},oC={key:1,class:"connection-link",href:"/connections"},sC={class:"repo-access-note"},nC={key:0},rC={class:"anonymize-workspace"},iC={class:"anonymize-topbar"},aC={class:"anonymize-topbar-inner"},lC={class:"paper-crumbs"},dC={class:"here"},uC={class:"anonymize-topbar-head"},cC={class:"paper-page-title anonymize-topbar-title"},pC={key:0},fC={key:1},mC={key:0,class:"alert alert-info",role:"status"},hC={key:1,class:"alert alert-info",role:"status"},vC={key:1},gC={class:"anonymize-mobile-tabs",role:"tablist","aria-label":"Anonymization workspace"},yC=["aria-selected","tabindex"],bC=["aria-selected","tabindex"],wC={key:2,class:"anonymize-preview-empty",id:"workspace-preview",role:"status"},kC={class:"anonymize-split"},EC=["role","aria-labelledby"],CC={class:"form needs-validation paper-settings-main",name:"anonymize",novalidate:""},_C={class:"paper-settings-section"},SC={class:"form-group"},NC={class:"source-url-label-row"},DC={key:0,class:"repo-access","aria-label":"GitHub access"},RC={key:0,class:"repo-access-switch",role:"group","aria-label":"Repository connection"},TC=["aria-pressed","disabled"],AC=["aria-pressed","disabled"],OC={key:1,class:"connection-badge"},IC=["disabled"],PC={class:"invalid-feedback"},VC={class:"invalid-feedback"},qC={class:"invalid-feedback"},MC={class:"invalid-feedback"},LC={key:0,class:"repo-access-details","aria-label":"GitHub access"},$C={class:"repo-access-main"},UC={class:"repo-access-controls"},FC={key:1,class:"connection-link",href:"/connections"},zC={class:"repo-access-note"},HC={key:0},BC={key:1,class:"repo-access-details"},jC={key:0,role:"status"},GC={key:2,class:"form-grid-2"},WC={class:"form-group"},KC={class:"input-group"},YC={class:"form-control",id:"branch",name:"branch"},JC=["textContent","value"],QC={class:"input-group-append"},XC={class:"form-group"},ZC=["disabled"],xC={class:"invalid-feedback"},e_={class:"invalid-feedback"},t_={class:"form-check"},o_={class:"form-check-input",type:"checkbox",id:"update",name:"update"},s_={class:"paper-settings-section"},n_={class:"form-group"},r_=["disabled"],i_={class:"form-text text-muted"},a_={class:"invalid-feedback"},l_={class:"form-group"},d_=["disabled"],u_={class:"form-text text-muted"},c_={class:"invalid-feedback"},p_={class:"form-group"},f_=["disabled"],m_={class:"form-text text-muted"},h_={class:"invalid-feedback"},v_={class:"form-group"},g_={class:"form-text text-muted"},y_=["href"],b_={class:"invalid-feedback"},w_={class:"form-text text-muted"},k_={class:"paper-settings-section"},E_={class:"form-group"},C_={class:"form-text text-muted"},__={class:"warning-feedback"},S_={class:"invalid-feedback"},N_={class:"paper-settings-section"},D_={class:"form-check"},R_={class:"form-check-input",type:"checkbox",id:"link",name:"link"},T_={class:"form-check"},A_={class:"form-check-input",type:"checkbox",id:"image",name:"image"},O_={class:"form-check"},I_={class:"form-check-input",type:"checkbox",id:"pdf",name:"pdf"},P_={class:"form-check"},V_={class:"form-check-input",type:"checkbox",id:"notebook",name:"notebook"},q_={class:"form-check"},M_=["disabled"],L_={key:0,class:"form-text text-muted"},$_={key:1,class:"form-text text-muted"},U_={class:"form-check"},F_={class:"form-check-input",type:"checkbox",id:"title-gist",name:"title-gist"},z_={class:"form-check"},H_={class:"form-check-input",type:"checkbox",id:"content-gist",name:"content-gist"},B_={class:"form-check"},j_={class:"form-check-input",type:"checkbox",id:"comments-gist",name:"comments-gist"},G_={class:"form-check"},W_={class:"form-check-input",type:"checkbox",id:"username-gist",name:"username-gist"},K_={class:"form-check"},Y_={class:"form-check-input",type:"checkbox",id:"date-gist",name:"date-gist"},J_={class:"form-check"},Q_={class:"form-check-input",type:"checkbox",id:"origin-gist",name:"origin-gist"},X_={class:"form-check"},Z_={class:"form-check-input",type:"checkbox",id:"title",name:"title"},x_={class:"form-check"},e2={class:"form-check-input",type:"checkbox",id:"body",name:"body"},t2={class:"form-check"},o2={class:"form-check-input",type:"checkbox",id:"diff",name:"diff"},s2={class:"form-check"},n2={class:"form-check-input",type:"checkbox",id:"comments",name:"comments"},r2={class:"form-check"},i2={class:"form-check-input",type:"checkbox",id:"username",name:"username"},a2={class:"form-check"},l2={class:"form-check-input",type:"checkbox",id:"date",name:"date"},d2={class:"form-check"},u2={class:"form-check-input",type:"checkbox",id:"origin",name:"origin"},c2={class:"paper-settings-section"},p2={class:"form-grid-2"},f2={class:"form-group"},m2={class:"form-control",id:"expiration",name:"expiration"},h2={class:"form-group"},v2=["min","max"],g2={class:"invalid-feedback"},y2={class:"invalid-feedback"},b2={class:"paper-settings-section"},w2={class:"form-group"},k2={style:{position:"relative"}},E2={type:"text",id:"coauthorSearch",class:"form-control",placeholder:"Search GitHub username\u2026",autocomplete:"off"},C2={class:"dropdown-menu show",style:{display:"block","max-height":"220px","overflow-y":"auto",width:"100%"}},_2=["onClick"],S2=["src"],N2=["textContent"],D2=["textContent"],R2={class:"coauthor-list"},T2={class:"coauthor-row d-flex align-items-center",style:{padding:"6px 0",gap:"8px"}},A2=["src"],O2=["textContent","href"],I2=["onClick"],P2={class:"form-text text-muted"},V2=["textContent"],q2={key:1,class:"draft-status",role:"status"},M2={key:2,class:"draft-status"},L2={key:3,class:"anonymize-review-note"},$2={class:"anonymize-submit-bar"},U2=["disabled"],F2=["disabled"],z2=["disabled"],H2=["disabled"],B2=["disabled"],j2=["disabled"],G2=["role","aria-labelledby"],W2={class:"anonymize-preview-head"},K2={class:"anonymize-preview-sub"},Y2={key:0,class:"anonymize-preview-status",role:"status"},J2={key:1,class:"anonymize-preview-status",role:"status"},Q2={key:2,class:"anonymize-preview-status",role:"alert"},X2={key:3,class:"anonymize-preview-status"},Z2=["innerHTML"],x2=["role","aria-labelledby"],eS={class:"anonymize-preview-head"},tS={class:"anonymize-preview-sub"},oS={key:0,class:"anonymize-preview-status",role:"status"},sS={key:1,class:"anonymize-preview-status",role:"status"},nS={key:2,class:"anonymize-preview-status",role:"alert"},rS={key:3,class:"anonymize-preview-body"},iS={class:"d-flex w-100 justify-content-between align-items-center flex-wrap"},aS={class:"pr-title mb-1"},lS={key:0},dS=["textContent"],uS={key:0},cS={key:1},pS={key:2},fS={class:"pr-comments mt-3"},mS={class:"pr-comment"},hS={class:"pr-comment-head"},vS=["textContent"],gS={key:0,class:"pr-comment-date"},yS={key:3},bS={class:"pr-comments"},wS={class:"pr-comment"},kS={class:"pr-comment-head"},ES={key:0,class:"pr-comment-author"},CS=["textContent"],_S=["textContent"],SS={key:0,class:"pr-comment-body"},NS=["role","aria-labelledby"],DS={class:"anonymize-preview-head"},RS={class:"anonymize-preview-sub"},TS={key:0,class:"anonymize-preview-status",role:"status"},AS={key:1,class:"anonymize-preview-status",role:"status"},OS={key:2,class:"anonymize-preview-status",role:"alert"},IS={key:3,class:"anonymize-preview-body"},PS={class:"d-flex w-100 justify-content-between align-items-center flex-wrap"},VS={class:"pr-title mb-1"},qS={key:0},MS=["textContent"],LS={key:0},$S={key:1,class:"pr-body shadow-sm p-3 mb-4 rounded",style:{background:"var(--paper-bg-alt)"}},US={key:2,class:"paper-tabs",role:"tablist"},FS=["aria-selected","tabindex"],zS=["aria-selected","tabindex"],HS=["textContent"],BS={key:3,class:"anonymize-preview-status"},jS={class:"paper-tab-content"},GS={key:0,role:"tabpanel",id:"preview-pr-diff-panel","aria-labelledby":"preview-pr-diff-tab"},WS=["innerHTML"],KS={key:1,role:"tabpanel",id:"preview-pr-comments-panel","aria-labelledby":"preview-pr-comments-tab"},YS={class:"pr-comments"},JS={class:"pr-comment"},QS={class:"pr-comment-head"},XS={key:0,class:"pr-comment-author"},ZS=["textContent"],xS=["textContent"],eN={key:0,class:"pr-comment-body"};function gl(e,t){let n=We("gist-file"),r=We("markdown"),s=be("field"),i=be("form");return l(),d("div",{class:T(["anonymize-page h-100",{"mobile-preview-active":e.mobilePane==="preview"}])},[p(" ===== STATE 1: No URL \u2014 centered input ===== "),N(o("div",zE,[o("div",HE,[t[36]||(t[36]=o("div",{class:"paper-crumbs"},[b("My work \xA0/\xA0 "),o("span",{class:"here"},"New anonymization")],-1)),t[37]||(t[37]=o("h1",{class:"paper-page-title"},[b("New "),o("em",null,"anonymization")],-1)),t[38]||(t[38]=o("p",{class:"paper-page-lede"}," Paste a GitHub repository, pull-request, or gist URL. We\u2019ll fetch it, redact the terms you choose in text files, and give you a share link. Images and PDFs are served unchanged when enabled. Review them before sharing. ",-1)),o("div",BE,[o("div",jE,[t[32]||(t[32]=o("label",{class:"paper-field-label",for:"sourceUrl-landing"},"Source URL",-1)),!e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",GE,[!e.isUpdate&&e.detectedType!=="gist"?(l(),d("div",WE,[o("button",{type:"button","aria-pressed":e.githubConnection==="github-app",disabled:e.githubConnection==="github-app",onClick:t[0]||(t[0]=a=>e.chooseGitHubConnection("github-app"))},[...t[31]||(t[31]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(),o("span",{class:"sr-only"},"Read-only ",-1),b("GitHub App",-1)])],8,KE),o("button",{type:"button","aria-pressed":e.githubConnection==="oauth",disabled:e.githubConnection==="oauth",onClick:t[1]||(t[1]=a=>e.chooseGitHubConnection("oauth"))},"Legacy OAuth",8,YE)])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"?(l(),d("span",JE,c((e.detectedType==="gist"?e.githubConnections?.gistConnection==="github-app":e.githubConnection==="github-app")?"Read-only GitHub App":"Legacy OAuth"),1)):p("v-if",!0)])):p("v-if",!0)]),N(o("input",QE,null,512),[[s,{state:e.viewState,set:a=>{e.sourceUrl=a},value:e.sourceUrl,form:null,options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"},change:()=>{e.urlSelected()}}]])]),e.draftRestored?(l(),d("div",XE,[t[33]||(t[33]=b("Your unsaved draft was restored. ",-1)),o("button",{type:"button",class:"draft-discard",onClick:t[2]||(t[2]=a=>e.discardDraft())},"Discard draft")])):p("v-if",!0),e.sourceUrlError?(l(),d("p",ZE,c(e.sourceUrlError),1)):p("v-if",!0),t[39]||(t[39]=o("small",{class:"form-text",style:{color:"var(--ink-muted)"}}," Repository, pull request (\u2026/pull/42) and gist (gist.github.com/\u2026) URLs are all accepted. ",-1)),!e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",xE,[o("div",eC,[o("div",tC,[e.detectedType!=="gist"&&e.githubConnection!=="oauth"?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[3]||(t[3]=a=>e.grantGitHubAccess())},[...t[34]||(t[34]=[b("Manage access ",-1),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-external-link"})],-1)])])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"||e.githubConnection==="oauth"?(l(),d("a",oC,c(e.isUpdate?"Change connection":"Manage connections")+" \u2192",1)):p("v-if",!0)])]),o("div",sC,[e.detectedType!=="gist"&&e.githubConnection!=="oauth"?(l(),d("span",nC,"Select repositories on GitHub, then return here.")):p("v-if",!0),t[35]||(t[35]=o("span",null,[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})]),b(" Selected content will be published, including content from private repositories.")],-1))])])):p("v-if",!0)])],512),[[Y,!e.workspaceOpen&&!e.isUpdate]]),p(" ===== STATE 2: URL provided \u2014 form (left) + preview (right) ===== "),N(o("div",rC,[o("header",iC,[o("div",aC,[o("div",lC,[t[40]||(t[40]=o("a",{href:"/dashboard"},"My work",-1)),t[41]||(t[41]=b(" \xA0/\xA0 ",-1)),o("span",dC,c(e.isUpdate?"Edit anonymization":"New anonymization"),1)]),o("div",uC,[o("h1",cC,[e.isUpdate?p("v-if",!0):(l(),d("span",pC,[...t[42]||(t[42]=[b("New ",-1),o("em",null,"anonymization",-1)])])),e.isUpdate?(l(),d("span",fC,[...t[43]||(t[43]=[b("Edit ",-1),o("em",null,"anonymization",-1)])])):p("v-if",!0)]),N(o("span",{class:T(["type-badge",{"type-repo":e.detectedType==="repo","type-pr":e.detectedType==="pr","type-gist":e.detectedType==="gist"}])},c(e.detectedType==="repo"?"Repo":e.detectedType==="pr"?"PR":"Gist"),3),[[Y,e.detectedType]])])])]),e.detectedType==="gist"&&e.gistAppRequired?(l(),d("aside",mC,[t[44]||(t[44]=o("p",null,"Reconnect your GitHub account to read this gist. Your draft will be restored when you return.",-1)),o("button",{type:"button",class:"btn btn-ink",onClick:t[4]||(t[4]=a=>e.connectGistApp())},"Connect GitHub App to access gists")])):p("v-if",!0),e.detectedType==="gist"&&e.gistOAuthRequired?(l(),d("aside",hC,[t[45]||(t[45]=o("p",null,"Connect GitHub OAuth to access gists. Your account and existing anonymizations stay the same, and your draft will be restored when you return.",-1)),t[46]||(t[46]=o("p",null,"GitHub's legacy OAuth connection includes write access to private repositories.",-1)),e.githubConnections?.oauthEnabled?(l(),d("button",{key:0,type:"button",class:"btn btn-ink",onClick:t[5]||(t[5]=a=>e.connectGistOAuth())},"Connect GitHub OAuth to access gists")):(l(),d("p",vC,"GitHub OAuth is currently unavailable. Please try again later."))])):p("v-if",!0),o("nav",gC,[o("button",{id:"workspace-settings-tab",role:"tab",type:"button","aria-selected":e.mobilePane==="settings","aria-controls":"workspace-settings",tabindex:e.mobilePane==="settings"?0:-1,onKeydown:t[6]||(t[6]=a=>e.previewTabKeydown(a)),onClick:t[7]||(t[7]=a=>e.selectMobilePane("settings"))},"Settings",40,yC),o("button",{id:"workspace-preview-tab",role:"tab",type:"button","aria-selected":e.mobilePane==="preview","aria-controls":"workspace-preview",tabindex:e.mobilePane==="preview"?0:-1,onKeydown:t[8]||(t[8]=a=>e.previewTabKeydown(a)),onClick:t[9]||(t[9]=a=>e.selectMobilePane("preview"))},"Reviewer preview",40,bC)]),e.detectedType!=="repo"&&!e.details?(l(),d("div",wC,c(e.sourceLoading?"Loading source\u2026":"Choose an accessible source to see its preview."),1)):p("v-if",!0),o("div",kC,[p(" Form column (left) "),o("div",{id:"workspace-settings",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-settings-tab":null,class:"anonymize-form-col overflow-auto"},[N((l(),d("form",CC,[o("section",_C,[t[57]||(t[57]=o("div",{class:"paper-section-eyebrow"},"Source",-1)),o("div",SC,[o("div",NC,[t[48]||(t[48]=o("label",{class:"paper-field-label",for:"sourceUrl"},"GitHub URL",-1)),e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",DC,[!e.isUpdate&&e.detectedType!=="gist"?(l(),d("div",RC,[o("button",{type:"button","aria-pressed":e.githubConnection==="github-app",disabled:e.githubConnection==="github-app",onClick:t[10]||(t[10]=a=>e.chooseGitHubConnection("github-app"))},[...t[47]||(t[47]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(),o("span",{class:"sr-only"},"Read-only ",-1),b("GitHub App",-1)])],8,TC),o("button",{type:"button","aria-pressed":e.githubConnection==="oauth",disabled:e.githubConnection==="oauth",onClick:t[11]||(t[11]=a=>e.chooseGitHubConnection("oauth"))},"Legacy OAuth",8,AC)])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"?(l(),d("span",OC,c((e.detectedType==="gist"?e.githubConnections?.gistConnection==="github-app":e.githubConnection==="github-app")?"Read-only GitHub App":"Legacy OAuth"),1)):p("v-if",!0)])):p("v-if",!0)]),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.anonymize?.sourceUrl?.invalid}]),name:"sourceUrl",id:"sourceUrl",disabled:e.isUpdate&&e.detectedType!=="repo",placeholder:"Paste a GitHub repo or pull request URL"},null,10,IC),[[s,{state:e.viewState,set:a=>{e.sourceUrl=a},value:e.sourceUrl,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"},change:()=>{e.urlSelected()}}]]),N(o("div",PC," Please provide a valid GitHub URL. ",512),[[Y,e.anonymize?.sourceUrl?.errors?.github]]),N(o("div",VC," Not accessible. The organization may restrict access. ",512),[[Y,e.anonymize?.sourceUrl?.errors?.access]]),N(o("div",qC," Does not exist or is not accessible. ",512),[[Y,e.anonymize?.sourceUrl?.errors?.missing]]),N(o("div",MC," Already anonymized. ",512),[[Y,e.anonymize?.sourceUrl?.errors?.used]])]),e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",LC,[o("div",$C,[o("div",UC,[e.detectedType!=="gist"&&e.githubConnection!=="oauth"?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[12]||(t[12]=a=>e.grantGitHubAccess())},[...t[49]||(t[49]=[b("Manage access ",-1),o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-external-link"})],-1)])])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"||e.githubConnection==="oauth"?(l(),d("a",FC,c(e.isUpdate?"Change connection":"Manage connections")+" \u2192",1)):p("v-if",!0)])]),o("div",zC,[e.detectedType!=="gist"&&e.githubConnection!=="oauth"?(l(),d("span",HC,"Select repositories on GitHub, then return here.")):p("v-if",!0),t[50]||(t[50]=o("span",null,[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})]),b(" Selected content will be published, including content from private repositories.")],-1))])])):p("v-if",!0),e.isUpdate&&e.detectedType==="repo"&&e.role==="owner"&&e.sourceUrl==="https://github.com/"+e._originalFullName?(l(),d("aside",BC,[t[51]||(t[51]=o("p",null,"If you deleted and recreated this repository, reconnect it before choosing a branch.",-1)),o("button",{type:"button",class:"btn btn-outline-ink",onClick:t[13]||(t[13]=a=>e.reconnectSource())},"Reconnect source repository"),e.reconnectRepositoryId?(l(),d("p",jC,"Source reloaded. Review the branch, commit, and anonymization preview, then save to replace the published snapshot.")):p("v-if",!0)])):p("v-if",!0),e.detectedType==="repo"?(l(),d("div",GC,[o("div",WC,[t[53]||(t[53]=o("label",{class:"paper-field-label",for:"branch"},"Branch",-1)),o("div",KC,[N((l(),d("select",YC,[(l(!0),d(X,null,re(e.branches,(a,u)=>(l(),d("option",{textContent:c(a?.name),value:a?.name},null,8,JC))),256))])),[[s,{state:e.viewState,set:a=>{e.source.branch=a},value:e.source?.branch,form:"anonymize",options:{}}]]),o("div",QC,[o("button",{class:"btn btn-icon",type:"button",title:"Refresh","data-toggle":"tooltip","data-placement":"bottom",onClick:t[14]||(t[14]=a=>e.getBranches(!0)),"aria-label":"Refresh"},[...t[52]||(t[52]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1)])])])])]),o("div",XC,[t[54]||(t[54]=o("label",{class:"paper-field-label",for:"commit"},"Commit",-1)),N(o("input",{class:T(["form-control",{"is-invalid":e.anonymize?.commit?.invalid}]),id:"commit",disabled:e.options.update,name:"commit",pattern:"[a-fA-Z0-9]{6,}",required:""},null,10,ZC),[[s,{state:e.viewState,set:a=>{e.source.commit=a},value:e.source?.commit,form:"anonymize",options:{}}]]),N(o("div",xC," The commit SHA is not valid. ",512),[[Y,e.anonymize?.commit?.errors?.pattern||e.anonymize?.commit?.errors?.required]]),N(o("div",e_," This commit no longer exists in the repository. Click refresh to get the latest. ",512),[[Y,e.anonymize?.commit?.errors?.exists]])])])):p("v-if",!0),N(o("div",t_,[N(o("input",o_,null,512),[[s,{state:e.viewState,set:a=>{e.options.update=a},value:e.options?.update,form:"anonymize",options:{}}]]),t[55]||(t[55]=o("label",{class:"form-check-label",for:"update"},"Auto-update from GitHub",-1)),t[56]||(t[56]=o("small",{class:"form-text text-muted"},"Follow the branch and pull the latest commit automatically, at most once an hour.",-1))],512),[[Y,e.detectedType]])]),N(o("section",s_,[t[68]||(t[68]=o("div",{class:"paper-section-eyebrow"},"Identity",-1)),N(o("div",n_,[t[60]||(t[60]=o("label",{class:"paper-field-label",for:"repoId"},"Anonymized repository ID",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.anonymize?.repoId?.invalid}]),name:"repoId",id:"repoId",disabled:e.isUpdate},null,10,r_),[[s,{state:e.viewState,set:a=>{e.repoId=a},value:e.repoId,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),o("small",i_,[t[58]||(t[58]=b("Your share link will be ",-1)),o("code",null,"anonymous.4open.science/r/"+c(e.repoId),1),t[59]||(t[59]=b(".",-1))]),N(o("div",a_,"ID can only contain letters and numbers.",512),[[Y,e.anonymize?.repoId?.errors?.format]]),N(o("div",{class:"invalid-feedback"},c(e.repoId)+" is already used.",513),[[Y,e.anonymize?.repoId?.errors?.used]])],512),[[Y,e.detectedType==="repo"]]),N(o("div",l_,[t[63]||(t[63]=o("label",{class:"paper-field-label",for:"pullRequestId"},"Anonymized pull request ID",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.anonymize?.pullRequestId?.invalid}]),name:"pullRequestId",id:"pullRequestId",disabled:e.isUpdate},null,10,d_),[[s,{state:e.viewState,set:a=>{e.pullRequestId=a},value:e.pullRequestId,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),o("small",u_,[t[61]||(t[61]=b("Your share link will be ",-1)),o("code",null,"anonymous.4open.science/pr/"+c(e.pullRequestId),1),t[62]||(t[62]=b(".",-1))]),N(o("div",c_,"ID can only contain letters and numbers.",512),[[Y,e.anonymize?.pullRequestId?.errors?.format]]),N(o("div",{class:"invalid-feedback"},c(e.pullRequestId)+" is already used.",513),[[Y,e.anonymize?.pullRequestId?.errors?.used]])],512),[[Y,e.detectedType==="pr"]]),N(o("div",p_,[t[66]||(t[66]=o("label",{class:"paper-field-label",for:"gistId"},"Anonymized gist ID",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.anonymize?.gistId?.invalid}]),name:"gistId",id:"gistId",disabled:e.isUpdate},null,10,f_),[[s,{state:e.viewState,set:a=>{e.gistId=a},value:e.gistId,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),o("small",m_,[t[64]||(t[64]=b("Your share link will be ",-1)),o("code",null,"anonymous.4open.science/gist/"+c(e.gistId),1),t[65]||(t[65]=b(".",-1))]),N(o("div",h_,"ID can only contain letters and numbers.",512),[[Y,e.anonymize?.gistId?.errors?.format]]),N(o("div",{class:"invalid-feedback"},c(e.gistId)+" is already used.",513),[[Y,e.anonymize?.gistId?.errors?.used]])],512),[[Y,e.detectedType==="gist"]]),o("div",v_,[t[67]||(t[67]=o("label",{class:"paper-field-label",for:"conference"},[b("Conference "),o("span",{class:"paper-optional"},"(optional)")],-1)),N(o("input",{class:T(["form-control",{"is-invalid":e.anonymize?.conference?.invalid}]),id:"conference",name:"conference"},null,2),[[s,{state:e.viewState,set:a=>{e.conference=a},value:e.conference,form:"anonymize",options:{debounce:{default:800,blur:0},updateOn:"default blur"}}]]),N(o("small",g_,[o("a",{target:"_blank",href:e.safeUrl(e.conference_data?.url)},c(e.conference_data?.name),9,y_),b(" expires "+c(e.fmt?.date(e.conference_data?.endDate))+". ",1)],512),[[Y,e.conference_data]]),N(o("div",b_,"The conference is not activated.",512),[[Y,e.anonymize?.conference?.errors?.activated]]),N(o("small",w_,"Link to a conference to apply its shared defaults.",512),[[Y,!e.conference_data]])])],512),[[Y,e.detectedType]]),N(o("section",k_,[t[76]||(t[76]=o("div",{class:"paper-section-eyebrow"},"Anonymization",-1)),o("div",E_,[t[75]||(t[75]=o("label",{class:"paper-field-label",for:"terms"},"Terms to redact",-1)),N(o("textarea",{class:T(["form-control",{"is-invalid":e.anonymize?.terms?.invalid}]),id:"terms",name:"terms",rows:"4"},null,2),[[s,{state:e.viewState,set:a=>{e.terms=a},value:e.terms,form:"anonymize",options:{debounce:250}}]]),o("small",C_,[t[69]||(t[69]=b("One term per line (regex allowed). Replaced by ",-1)),o("code",null,c(e.site_options?.ANONYMIZATION_MASK)+"-[N]",1),t[70]||(t[70]=b(", or use ",-1)),t[71]||(t[71]=o("code",null,"term=>replacement",-1)),t[72]||(t[72]=b(" to pick your own (e.g. ",-1)),t[73]||(t[73]=o("code",null,"Anonymous=>ABC",-1)),t[74]||(t[74]=b(").",-1))]),N(o("div",__,"Regex characters detected. Escape them if unintentional.",512),[[Y,e.termsRegexWarning]]),N(o("div",S_,"Terms are in an invalid format.",512),[[Y,e.anonymize?.terms?.errors?.format]])])],512),[[Y,e.detectedType]]),N(o("section",N_,[t[97]||(t[97]=o("div",{class:"paper-section-eyebrow"},"Display",-1)),N(o("div",null,[o("div",D_,[N(o("input",R_,null,512),[[s,{state:e.viewState,set:a=>{e.options.link=a},value:e.options?.link,form:"anonymize",options:{}}]]),t[77]||(t[77]=o("label",{class:"form-check-label",for:"link"},"Keep links",-1))]),o("div",T_,[N(o("input",A_,null,512),[[s,{state:e.viewState,set:a=>{e.options.image=a},value:e.options?.image,form:"anonymize",options:{}}]]),t[78]||(t[78]=o("label",{class:"form-check-label",for:"image"},"Display images",-1)),t[79]||(t[79]=o("small",{class:"form-text text-muted"},"Images are served unchanged and may contain names or affiliations.",-1))]),o("div",O_,[N(o("input",I_,null,512),[[s,{state:e.viewState,set:a=>{e.options.pdf=a},value:e.options?.pdf,form:"anonymize",options:{}}]]),t[80]||(t[80]=o("label",{class:"form-check-label",for:"pdf"},"Display PDFs",-1)),t[81]||(t[81]=o("small",{class:"form-text text-muted"},[b("PDF contents and metadata are served unchanged. "),o("a",{href:"/faq#formats"},"About supported formats")],-1))]),o("div",P_,[N(o("input",V_,null,512),[[s,{state:e.viewState,set:a=>{e.options.notebook=a},value:e.options?.notebook,form:"anonymize",options:{}}]]),t[82]||(t[82]=o("label",{class:"form-check-label",for:"notebook"},"Display Notebooks",-1))]),o("div",q_,[N(o("input",{class:"form-check-input",type:"checkbox",id:"page",name:"page",disabled:!e.details?.hasPage||e.details?.pageSource&&e.details?.pageSource?.branch!==e.source?.branch},null,8,M_),[[s,{state:e.viewState,set:a=>{e.options.page=a},value:e.options?.page,form:"anonymize",options:{}}]]),t[83]||(t[83]=o("label",{class:"form-check-label",for:"page"},"GitHub Pages",-1)),e.details?.hasPage?p("v-if",!0):(l(),d("small",L_,c(e.fmt?.translate("WARNINGS.page_not_enabled_on_repo")),1)),e.details?.hasPage&&e.details?.pageSource?.branch&&e.source?.branch&&e.details.pageSource.branch!==e.source.branch?(l(),d("small",$_,c(e.fmt?.translate("WARNINGS.page_branch_mismatch",{pageBranch:e.details?.pageSource?.branch,selectedBranch:e.source?.branch})),1)):p("v-if",!0)])],512),[[Y,e.detectedType==="repo"]]),N(o("div",null,[o("div",U_,[N(o("input",F_,null,512),[[s,{state:e.viewState,set:a=>{e.options.title=a},value:e.options?.title,form:"anonymize",options:{}}]]),t[84]||(t[84]=o("label",{class:"form-check-label",for:"title-gist"},"Gist description",-1))]),o("div",z_,[N(o("input",H_,null,512),[[s,{state:e.viewState,set:a=>{e.options.content=a},value:e.options?.content,form:"anonymize",options:{}}]]),t[85]||(t[85]=o("label",{class:"form-check-label",for:"content-gist"},"File contents",-1))]),o("div",B_,[N(o("input",j_,null,512),[[s,{state:e.viewState,set:a=>{e.options.comments=a},value:e.options?.comments,form:"anonymize",options:{}}]]),t[86]||(t[86]=o("label",{class:"form-check-label",for:"comments-gist"},"Comments",-1))]),o("div",G_,[N(o("input",W_,null,512),[[s,{state:e.viewState,set:a=>{e.options.username=a},value:e.options?.username,form:"anonymize",options:{}}]]),t[87]||(t[87]=o("label",{class:"form-check-label",for:"username-gist"},"Usernames",-1))]),o("div",K_,[N(o("input",Y_,null,512),[[s,{state:e.viewState,set:a=>{e.options.date=a},value:e.options?.date,form:"anonymize",options:{}}]]),t[88]||(t[88]=o("label",{class:"form-check-label",for:"date-gist"},"Dates",-1))]),o("div",J_,[N(o("input",Q_,null,512),[[s,{state:e.viewState,set:a=>{e.options.origin=a},value:e.options?.origin,form:"anonymize",options:{}}]]),t[89]||(t[89]=o("label",{class:"form-check-label",for:"origin-gist"},"Source gist ID",-1))])],512),[[Y,e.detectedType==="gist"]]),N(o("div",null,[o("div",X_,[N(o("input",Z_,null,512),[[s,{state:e.viewState,set:a=>{e.options.title=a},value:e.options?.title,form:"anonymize",options:{}}]]),t[90]||(t[90]=o("label",{class:"form-check-label",for:"title"},"PR title",-1))]),o("div",x_,[N(o("input",e2,null,512),[[s,{state:e.viewState,set:a=>{e.options.body=a},value:e.options?.body,form:"anonymize",options:{}}]]),t[91]||(t[91]=o("label",{class:"form-check-label",for:"body"},"PR body",-1))]),o("div",t2,[N(o("input",o2,null,512),[[s,{state:e.viewState,set:a=>{e.options.diff=a},value:e.options?.diff,form:"anonymize",options:{}}]]),t[92]||(t[92]=o("label",{class:"form-check-label",for:"diff"},"Diff",-1))]),o("div",s2,[N(o("input",n2,null,512),[[s,{state:e.viewState,set:a=>{e.options.comments=a},value:e.options?.comments,form:"anonymize",options:{}}]]),t[93]||(t[93]=o("label",{class:"form-check-label",for:"comments"},"Comments",-1))]),o("div",r2,[N(o("input",i2,null,512),[[s,{state:e.viewState,set:a=>{e.options.username=a},value:e.options?.username,form:"anonymize",options:{}}]]),t[94]||(t[94]=o("label",{class:"form-check-label",for:"username"},"Usernames",-1))]),o("div",a2,[N(o("input",l2,null,512),[[s,{state:e.viewState,set:a=>{e.options.date=a},value:e.options?.date,form:"anonymize",options:{}}]]),t[95]||(t[95]=o("label",{class:"form-check-label",for:"date"},"Dates",-1))]),o("div",d2,[N(o("input",u2,null,512),[[s,{state:e.viewState,set:a=>{e.options.origin=a},value:e.options?.origin,form:"anonymize",options:{}}]]),t[96]||(t[96]=o("label",{class:"form-check-label",for:"origin"},"Project name",-1))])],512),[[Y,e.detectedType==="pr"]])],512),[[Y,e.detectedType]]),N(o("section",c2,[t[101]||(t[101]=o("div",{class:"paper-section-eyebrow"},"Expiration",-1)),o("div",p2,[o("div",f2,[t[99]||(t[99]=o("label",{class:"paper-field-label",for:"expiration"},"Strategy",-1)),N((l(),d("select",m2,[...t[98]||(t[98]=[o("option",{value:"redirect"},"Redirect to GitHub when expired",-1),o("option",{value:"remove",selected:""},"Remove when expired",-1)])])),[[s,{state:e.viewState,set:a=>{e.options.expirationMode=a},value:e.options?.expirationMode,form:"anonymize",options:{}}]])]),o("div",h2,[t[100]||(t[100]=o("label",{class:"paper-field-label",for:"expirationDate"},"Expiration date",-1)),N(o("input",{class:T(["form-control",{"is-invalid":e.anonymize?.expirationDate?.invalid}]),type:"date",name:"expirationDate",id:"expirationDate",required:"",min:e.minExpirationDate,max:e.maxExpirationDate},null,10,v2),[[s,{state:e.viewState,set:a=>{e.options.expirationDate=a},value:e.options?.expirationDate,form:"anonymize",options:{}}]]),N(o("div",g2,"Pick a date in the future.",512),[[Y,e.anonymize?.expirationDate?.errors?.min]]),N(o("div",{class:"invalid-feedback"},"Pick a date on or before "+c(e.fmt?.date(e.maxExpirationDate))+".",513),[[Y,e.anonymize?.expirationDate?.errors?.max]]),N(o("div",y2,"Enter a valid expiration date.",512),[[Y,e.anonymize?.expirationDate?.errors?.required||e.anonymize?.expirationDate?.errors?.date]])])]),N(o("small",{class:"form-text text-muted"},"After "+c(e.fmt?.date(e.options?.expirationDate))+", the content will be removed.",513),[[Y,e.options?.expirationMode=="remove"&&e.options?.expirationDate]]),N(o("small",{class:"form-text text-muted"},"After "+c(e.fmt?.date(e.options?.expirationDate))+", visitors will be redirected to GitHub.",513),[[Y,e.options?.expirationMode=="redirect"&&e.options?.expirationDate]])],512),[[Y,e.detectedType]]),N(o("section",b2,[t[105]||(t[105]=o("div",{class:"paper-section-eyebrow"},"Co-authors",-1)),t[106]||(t[106]=o("p",{class:"form-text text-muted",style:{"margin-bottom":"8px"}}," Co-authors can view and edit these settings. They cannot delete the anonymization or manage co-authors. ",-1)),N(o("div",w2,[t[102]||(t[102]=o("label",{class:"paper-field-label",for:"coauthorSearch"},"Add a GitHub user",-1)),o("div",k2,[N(o("input",E2,null,512),[[s,{state:e.viewState,set:a=>{e.coauthorSearch=a},value:e.coauthorSearch,form:"anonymize",options:{debounce:300},change:()=>{e.searchCoauthors()}}]]),N(o("div",C2,[(l(!0),d(X,null,re(e.coauthorResults,(a,u)=>(l(),d("a",{href:"#",class:"dropdown-item d-flex align-items-center",onClick:me(f=>e.addCoauthor(a,f),["prevent"])},[o("img",{alt:"",style:{width:"22px",height:"22px","border-radius":"50%","margin-right":"8px"},src:e.safeUrl(a?.photo)},null,8,S2),o("span",{textContent:c(a?.username)},null,8,N2)],8,_2))),256))],512),[[Y,e.coauthorResults?.length>0]])]),N(o("small",{class:"form-text text-muted",textContent:c(e.coauthorError)},null,8,D2),[[Y,e.coauthorError]])],512),[[Y,e.role==="owner"||e.role==="admin"]]),o("div",R2,[(l(!0),d(X,null,re(e.coauthors,(a,u)=>(l(),d("div",T2,[a?.photo?(l(),d("img",{key:0,alt:"",style:{width:"24px",height:"24px","border-radius":"50%"},src:e.safeUrl(a?.photo)},null,8,A2)):p("v-if",!0),o("a",{target:"_blank",textContent:c(a?.username),href:e.safeUrl("https://github.com/"+a?.username)},null,8,O2),t[104]||(t[104]=o("span",{class:"type-badge type-coauthor"},"Co-author",-1)),N(o("button",{type:"button",class:"btn btn-sm btn-icon",style:{"margin-left":"auto"},title:"Remove co-author",onClick:f=>e.removeCoauthor(a),"aria-label":"Remove co-author"},[...t[103]||(t[103]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])],8,I2),[[Y,e.role==="owner"||e.role==="admin"]])]))),256)),N(o("div",P2," No co-authors yet. ",512),[[Y,!e.coauthors||e.coauthors?.length===0]])])],512),[[Y,e.isUpdate&&e.detectedType==="repo"]]),e.error?(l(),d("div",{key:0,class:"alert alert-danger",role:"alert",textContent:c(e.error)},null,8,V2)):p("v-if",!0),e.draftRestored?(l(),d("div",q2,[t[107]||(t[107]=b("Your unsaved draft was restored. ",-1)),o("button",{type:"button",class:"draft-discard",onClick:t[15]||(t[15]=a=>e.discardDraft())},"Discard draft")])):e.unsavedChanges?(l(),d("div",M2,[b(c(e.draftSaved?"Draft saved in this tab for 30 minutes.":"Unsaved changes. Keep this tab open until you save.")+" ",1),o("button",{type:"button",class:"draft-discard",onClick:t[16]||(t[16]=a=>e.discardDraft())},c(e.isUpdate?"Restore saved settings":"Discard changes"),1)])):p("v-if",!0),e.detectedType==="repo"&&(e.options.image||e.options.pdf)?(l(),d("p",L2,"Review enabled images and PDFs before sharing. Their contents are not anonymized.")):p("v-if",!0),o("button",{type:"button",class:"btn btn-outline-ink mobile-preview-jump",onClick:t[17]||(t[17]=a=>e.selectMobilePane("preview"))},[...t[108]||(t[108]=[b("Review preview ",-1),o("span",{"aria-hidden":"true"},"\u2192",-1)])]),N(o("div",$2,[e.detectedType==="repo"&&!e.isUpdate?(l(),d("button",{key:0,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[18]||(t[18]=me(a=>e.submitForm(a,()=>{e.anonymizeRepo(a)}),["prevent"]))},[...t[109]||(t[109]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(" Anonymize Repository ",-1)])],8,U2)):p("v-if",!0),e.detectedType==="repo"&&e.isUpdate?(l(),d("button",{key:1,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[19]||(t[19]=me(a=>e.submitForm(a,()=>{e.anonymizeRepo(a)}),["prevent"]))},[...t[110]||(t[110]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-save"})],-1),b(" Update Repository ",-1)])],8,F2)):p("v-if",!0),e.detectedType==="pr"&&!e.isUpdate?(l(),d("button",{key:2,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[20]||(t[20]=me(a=>e.submitForm(a,()=>{e.anonymizePullRequest(a)}),["prevent"]))},[...t[111]||(t[111]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(" Anonymize Pull Request ",-1)])],8,z2)):p("v-if",!0),e.detectedType==="pr"&&e.isUpdate?(l(),d("button",{key:3,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[21]||(t[21]=me(a=>e.submitForm(a,()=>{e.anonymizePullRequest(a)}),["prevent"]))},[...t[112]||(t[112]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-save"})],-1),b(" Update Pull Request ",-1)])],8,H2)):p("v-if",!0),e.detectedType==="gist"&&!e.isUpdate?(l(),d("button",{key:4,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[22]||(t[22]=me(a=>e.submitForm(a,()=>{e.anonymizeGist(a)}),["prevent"]))},[...t[113]||(t[113]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(" Anonymize Gist ",-1)])],8,B2)):p("v-if",!0),e.detectedType==="gist"&&e.isUpdate?(l(),d("button",{key:5,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[23]||(t[23]=me(a=>e.submitForm(a,()=>{e.anonymizeGist(a)}),["prevent"]))},[...t[114]||(t[114]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-save"})],-1),b(" Update Gist ",-1)])],8,j2)):p("v-if",!0)],512),[[Y,e.detectedType]])])),[[i,e.viewState]])],8,EC),p(" Preview column (right) "),e.detectedType==="repo"?(l(),d("div",{key:0,id:"workspace-preview",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-preview-tab":null,class:"anonymize-preview-col"},[o("div",W2,[t[115]||(t[115]=o("span",{class:"paper-eyebrow"},"Live preview",-1)),o("span",K2,c(e.previewStatus==="ready"?"README with redactions applied":"README preview"),1)]),e.sourceLoading&&e.previewStatus==="idle"?(l(),d("div",Y2,"Loading source\u2026")):p("v-if",!0),e.previewStatus==="loading"?(l(),d("div",J2,"Updating the anonymized preview\u2026")):p("v-if",!0),e.previewStatus==="error"?(l(),d("div",Q2,[t[116]||(t[116]=o("p",null,"Unable to generate the anonymized preview. The latest redactions have not been verified.",-1)),o("button",{class:"btn btn-outline-ink",type:"button",onClick:t[24]||(t[24]=a=>e.retryPreview())},"Retry preview")])):p("v-if",!0),!e.sourceLoading&&!e.readme&&e.previewStatus==="idle"?(l(),d("div",X2,"No README is available to preview. Review the published files before sharing.")):p("v-if",!0),e.previewStatus==="ready"?(l(),d("div",{key:4,class:"anonymize-preview-body markdown-body body",innerHTML:e.sanitize(e.html_readme)},null,8,Z2)):p("v-if",!0)],8,G2)):p("v-if",!0),e.detectedType==="gist"&&e.details?(l(),d("div",{key:1,id:"workspace-preview",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-preview-tab":null,class:"anonymize-preview-col"},[o("div",eS,[t[117]||(t[117]=o("span",{class:"paper-eyebrow"},"Live preview",-1)),o("span",tS,c(e.previewStatus==="ready"?"Gist with redactions applied":"Gist preview"),1)]),e.sourceLoading&&e.previewStatus==="idle"?(l(),d("div",oS,"Loading source\u2026")):p("v-if",!0),e.previewStatus==="loading"?(l(),d("div",sS,"Updating the anonymized preview\u2026")):p("v-if",!0),e.previewStatus==="error"?(l(),d("div",nS,[t[118]||(t[118]=o("p",null,"Unable to generate the anonymized preview. The latest redactions have not been verified.",-1)),o("button",{class:"btn btn-outline-ink",type:"button",onClick:t[25]||(t[25]=a=>e.retryPreview())},"Retry preview")])):p("v-if",!0),e.previewStatus==="ready"?(l(),d("div",rS,[o("div",iS,[o("h2",aS,[e.options?.title?(l(),d("span",lS,c(e.anonymizeGistContent(e.details?.gist?.description)||"Untitled gist"),1)):p("v-if",!0),o("span",{class:T(["badge",{"badge-success":e.details?.gist?.isPublic,"badge-secondary":!e.details?.gist?.isPublic}])},c(e.details?.gist?.isPublic?"public":"secret"),3)]),e.options?.date?(l(),d("small",{key:0,textContent:c(e.fmt?.date(e.details?.gist?.updatedDate))},null,8,dS)):p("v-if",!0)]),e.options?.origin?(l(),d("small",uS,"Gist ID: "+c(e.details?.source?.gistId),1)):p("v-if",!0),e.options?.username&&e.details?.gist?.ownerLogin?(l(),d("small",cS,"By @"+c(e.anonymizeGistContent(e.details?.gist?.ownerLogin)),1)):p("v-if",!0),e.options?.content&&e.previewGistFiles?.length?(l(),d("div",pS,[o("ul",fS,[(l(!0),d(X,null,re(e.previewGistFiles,(a,u)=>(l(),d("li",mS,[o("div",hS,[o("strong",{textContent:c(a?.filename)},null,8,vS),a?.language?(l(),d("span",gS,c(a?.language),1)):p("v-if",!0)]),Ce(n,{file:a,terms:e.terms,options:e.options},null,8,["file","terms","options"])]))),256))])])):p("v-if",!0),e.options?.comments&&e.details?.gist?.comments&&e.details?.gist?.comments?.length?(l(),d("div",yS,[t[121]||(t[121]=o("h3",{class:"paper-section-eyebrow mt-3"},"Comments",-1)),o("ul",bS,[(l(!0),d(X,null,re(e.details?.gist?.comments,(a,u)=>(l(),d("li",wS,[o("div",kS,[e.options?.username?(l(),d("span",ES,[t[119]||(t[119]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user"})],-1)),t[120]||(t[120]=b(" @",-1)),o("span",{textContent:c(e.anonymizeGistContent(a?.author))},null,8,CS)])):p("v-if",!0),e.options?.date?(l(),d("span",{key:1,class:"pr-comment-date",textContent:c(e.fmt?.date(a?.updatedDate))},null,8,_S)):p("v-if",!0)]),e.options?.body?(l(),d("div",SS,[Ce(r,{content:e.anonymizeGistContent(a?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0)]))),256))])])):p("v-if",!0)])):p("v-if",!0)],8,x2)):p("v-if",!0),e.detectedType==="pr"&&e.details?(l(),d("div",{key:2,id:"workspace-preview",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-preview-tab":null,class:"anonymize-preview-col"},[o("div",DS,[t[122]||(t[122]=o("span",{class:"paper-eyebrow"},"Live preview",-1)),o("span",RS,c(e.previewStatus==="ready"?"Pull request with redactions applied":"Pull request preview"),1)]),e.sourceLoading&&e.previewStatus==="idle"?(l(),d("div",TS,"Loading source\u2026")):p("v-if",!0),e.previewStatus==="loading"?(l(),d("div",AS,"Updating the anonymized preview\u2026")):p("v-if",!0),e.previewStatus==="error"?(l(),d("div",OS,[t[123]||(t[123]=o("p",null,"Unable to generate the anonymized preview. The latest redactions have not been verified.",-1)),o("button",{class:"btn btn-outline-ink",type:"button",onClick:t[26]||(t[26]=a=>e.retryPreview())},"Retry preview")])):p("v-if",!0),e.previewStatus==="ready"?(l(),d("div",IS,[o("div",PS,[o("h2",VS,[e.options?.title?(l(),d("span",qS,c(e.anonymizePrContent(e.details?.pullRequest?.title)),1)):p("v-if",!0),o("span",{class:T(["badge",{"badge-success":e.details?.pullRequest?.merged,"badge-warning":e.details?.pullRequest?.state=="open","badge-danger":e.details?.pullRequest?.state=="closed"&&!e.details?.pullRequest?.merged}])},c(e.fmt?.title(e.details?.pullRequest?.merged?"merged":e.details?.pullRequest?.state)),3)]),e.options?.date?(l(),d("small",{key:0,textContent:c(e.fmt?.date(e.details?.pullRequest?.updatedDate))},null,8,MS)):p("v-if",!0)]),e.options?.origin?(l(),d("small",LS,"Pull Request on "+c(e.details?.pullRequest?.baseRepositoryFullName),1)):p("v-if",!0),e.options?.body?(l(),d("div",$S,[Ce(r,{content:e.anonymizePrContent(e.details?.pullRequest?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0),e.options?.diff||e.options?.comments?(l(),d("nav",US,[e.options?.diff?(l(),d("button",{key:0,class:T(["paper-tab",{active:e.prTabState?.active=="diff"}]),type:"button",role:"tab",id:"preview-pr-diff-tab","aria-selected":e.prTabState?.active==="diff","aria-controls":"preview-pr-diff-panel",tabindex:e.prTabState?.active==="diff"?0:-1,onKeydown:t[27]||(t[27]=a=>e.previewTabKeydown(a)),onClick:t[28]||(t[28]=a=>e.prTabState.active="diff")},[...t[124]||(t[124]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-code"})],-1),b(" Diff ",-1)])],42,FS)):p("v-if",!0),e.options?.comments?(l(),d("button",{key:1,class:T(["paper-tab",{active:e.prTabState?.active=="comments"}]),type:"button",role:"tab",id:"preview-pr-comments-tab","aria-selected":e.prTabState?.active==="comments","aria-controls":"preview-pr-comments-panel",tabindex:e.prTabState?.active==="comments"?0:-1,onKeydown:t[29]||(t[29]=a=>e.previewTabKeydown(a)),onClick:t[30]||(t[30]=a=>e.prTabState.active="comments")},[t[125]||(t[125]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-comment"})],-1)),o("span",{textContent:c(e.fmt.plural(e.details?.pullRequest?.comments?.length,{0:"No comments",one:"1 comment",other:"{} comments"}))},null,8,HS)],42,zS)):p("v-if",!0)])):p("v-if",!0),!e.options?.diff&&!e.options?.comments?(l(),d("div",BS,"Diff and comments are hidden by your display settings.")):p("v-if",!0),o("div",jS,[e.options?.diff&&e.prTabState?.active=="diff"?(l(),d("div",GS,[o("div",{class:"pr-diff",innerHTML:e.sanitize(e.fmt?.diff(e.anonymizePrContent(e.details?.pullRequest?.diff)))},null,8,WS)])):p("v-if",!0),e.options?.comments&&e.prTabState?.active=="comments"?(l(),d("div",KS,[o("ul",YS,[(l(!0),d(X,null,re(e.details?.pullRequest?.comments,(a,u)=>(l(),d("li",JS,[o("div",QS,[e.options?.username?(l(),d("span",XS,[t[126]||(t[126]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user"})],-1)),t[127]||(t[127]=b(" @",-1)),o("span",{textContent:c(e.anonymizePrContent(a?.author))},null,8,ZS)])):p("v-if",!0),e.options?.date?(l(),d("span",{key:1,class:"pr-comment-date",textContent:c(e.fmt?.date(a?.updatedDate))},null,8,xS)):p("v-if",!0)]),e.options?.body?(l(),d("div",eN,[Ce(r,{content:e.anonymizePrContent(a?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0)]))),256))])])):p("v-if",!0)])])):p("v-if",!0)],8,NS)):p("v-if",!0)])],512),[[Y,e.workspaceOpen||e.isUpdate]])],2)}var tN={class:"container-fluid h-100 anonymize-page"},oN={class:"row h-100 flex-column flex-md-row"},sN={class:"col-md sidePanel shadow overflow-auto anonymize-form-col"},nN={class:"form-group"},rN={class:"form-group"},iN={class:"form-check"},aN={class:"form-check-input",type:"checkbox",id:"update",name:"update"},lN={class:"form-group"},dN={class:"form-text text-muted"},uN=["href"],cN={class:"invalid-feedback"},pN={class:"form-text text-muted"},fN={class:"form-group"},mN={id:"idHelp",class:"form-text text-muted"},hN={class:"invalid-feedback"},vN={class:"form-group"},gN={class:"invalid-feedback"},yN={class:"form-group"},bN={class:"form-control",id:"expiration",name:"expiration"},wN={class:"form-group",id:"expiration-date-form"},kN={class:"form-control",type:"date",name:"expirationDate",id:"expirationDate"},EN={class:"accordion mb-3",id:"options"},CN={class:"card"},_N={id:"collapseOne",class:"collapse show","aria-labelledby":"headingOne","data-parent":"#options"},SN={class:"card-body"},NN={class:"form-group mb-0"},DN={class:"form-check"},RN={class:"form-check-input",type:"checkbox",id:"link",name:"link"},TN={class:"form-check"},AN={class:"form-check-input",type:"checkbox",id:"image",name:"image"},ON={class:"form-check"},IN={class:"form-check-input",type:"checkbox",id:"date",name:"date"},PN={class:"form-check"},VN={class:"form-check-input",type:"checkbox",id:"username",name:"username"},qN={class:"form-check"},MN={class:"form-check-input",type:"checkbox",id:"comments",name:"comments"},LN={class:"form-check"},$N={class:"form-check-input",type:"checkbox",id:"diff",name:"diff"},UN={class:"form-check"},FN={class:"form-check-input",type:"checkbox",id:"origin",name:"origin"},zN={class:"form-check"},HN={class:"form-check-input",type:"checkbox",id:"title",name:"title"},BN={class:"form-check"},jN={class:"form-check-input",type:"checkbox",id:"body",name:"body"},GN=["textContent"],WN={class:"anonymize-submit-bar"},KN={key:0,class:"col-md-8 p-2 overflow-auto anonymize-preview-col"},YN={class:"d-flex w-100 justify-content-between align-items-center flex-wrap"},JN={class:"pr-title mb-1"},QN={key:0},XN=["textContent"],ZN={key:0},xN={key:1,class:"pr-body shadow-sm p-3 mb-4 rounded",style:{background:"var(--sidebar-bg-color)"}},eD={class:"nav nav-tabs",id:"myTab",role:"tablist"},tD={key:0,class:"nav-item",role:"presentation"},oD={key:1,class:"nav-item",role:"presentation"},sD=["textContent"],nD={class:"tab-content",id:"pills-tabContent"},rD={class:"tab-pane show active",id:"pills-diff",role:"tabpanel","aria-labelledby":"pills-diff-tab"},iD={key:0,class:"pr-diff shadow-sm p-3 mb-4 rounded",style:{background:"var(--sidebar-bg-color)"}},aD={style:{"overflow-x":"auto"}},lD=["innerHTML"],dD={key:0,class:"pr-comments list-group"},uD={class:"pr-comment list-group-item"},cD={class:"d-flex w-100 justify-content-between flex-wrap"},pD={key:0,class:"mb-1"},fD=["textContent"],mD={class:"mb-1"};function yl(e,t){let n=We("markdown"),r=be("field"),s=be("form");return l(),d("div",tN,[o("div",oN,[o("div",sN,[o("div",{class:T(["p-0 py-2 m-auto",{card:!e.pullRequestUrl,container:e.pullRequestUrl}])},[N((l(),d("form",{class:T(["form needs-validation",{"card-body":!e.pullRequestUrl}]),name:"anonymizeForm",novalidate:""},[t[30]||(t[30]=ce('
Anonymize \xA0/\xA0 Pull request

Anonymize a pull request

Fill in the details \u2014 it only takes a minute.

Source
',4)),p(" pullRequestUrl "),o("div",nN,[t[2]||(t[2]=o("label",{for:"pullRequestUrl"},"URL of your pull request",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.anonymize?.pullRequestUrl?.invalid}]),name:"pullRequestUrl",id:"pullRequestUrl",placeholder:"https://github.com/owner/repo/pull/123"},null,2),[[r,{state:e.viewState,set:i=>{e.pullRequestUrl=i},value:e.pullRequestUrl,form:"anonymizeForm",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"},change:()=>{e.pullRequestSelected()}}]]),N(o("div",{class:"invalid-feedback"},c(e.pullRequestUrl)+" is not accessible. Some organizations are restricting the access to the repositories. ",513),[[Y,e.anonymize?.pullRequestUrl?.errors?.access]]),N(o("div",{class:"invalid-feedback"},c(e.pullRequestUrl)+" does not exist or is not accessible ",513),[[Y,e.anonymize?.pullRequestUrl?.errors?.missing]]),N(o("div",{class:"invalid-feedback"},c(e.pullRequestUrl)+" is already anonymized ",513),[[Y,e.anonymize?.pullRequestUrl?.errors?.used]])]),N(o("div",null,[o("div",rN,[o("div",iN,[N(o("input",aN,null,512),[[r,{state:e.viewState,set:i=>{e.options.update=i},value:e.options?.update,form:"anonymizeForm",options:{}}]]),t[3]||(t[3]=o("label",{class:"form-check-label",for:"update"},"Auto update",-1)),t[4]||(t[4]=o("small",{id:"updateHelp",class:"form-text text-muted"},"Automatically update the anonymized pull request with the latest updates. The pull request is updated once per day maximum.",-1))])]),t[26]||(t[26]=o("div",{class:"paper-section-eyebrow anonymize-section-title"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-conference"})]),b(" Conference ID ")],-1)),p(" Conference "),o("div",lN,[t[5]||(t[5]=o("label",{for:"conference"},[b("Conference ID "),o("span",{class:"text-muted"},"(Optional)")],-1)),N(o("input",{class:T(["form-control",{"is-invalid":e.anonymize?.conference?.invalid}]),id:"conference",name:"conference"},null,2),[[r,{state:e.viewState,set:i=>{e.conference=i},value:e.conference,form:"anonymizeForm",options:{debounce:{default:800,blur:0},updateOn:"default blur"}}]]),N(o("small",dN,[o("a",{target:"_target",href:e.safeUrl(e.conference_data?.url)},c(e.conference_data?.name),9,uN),b(" will expire on "+c(e.fmt?.date(e.conference_data?.endDate))+".",1)],512),[[Y,e.conference_data]]),N(o("div",cN," The conference is not activated. ",512),[[Y,e.anonymize?.conference?.errors?.activated]]),N(o("small",pN," Use the Conference ID that your conference provided you. This will update automatically the anonymization options based on the conference preferences. ",512),[[Y,!e.conference_data]])]),t[27]||(t[27]=o("div",{class:"paper-section-eyebrow anonymize-section-title"},[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})]),b(" Anonymization Options ")],-1)),p(" Pull Request ID "),o("div",fN,[t[6]||(t[6]=o("label",{for:"pullRequestId"},"Anonymized pull request id",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.anonymize?.pullRequestId?.invalid}]),name:"pullRequestId",id:"pullRequestId"},null,2),[[r,{state:e.viewState,set:i=>{e.pullRequestId=i},value:e.pullRequestId,form:"anonymizeForm",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),o("small",mN,"Id used in the url: https://anonymous.4open.science/r/"+c(e.pullRequestId),1),N(o("div",hN," Repository id can only contain letters and numbers ",512),[[Y,e.anonymize?.pullRequestId?.errors?.format]]),N(o("div",{class:"invalid-feedback"},c(e.pullRequestId)+" is already used ",513),[[Y,e.anonymize?.pullRequestId?.errors?.used]])]),p(" Terms "),o("div",vN,[t[7]||(t[7]=o("label",{for:"terms"},"Terms to anonymize",-1)),N(o("textarea",{class:T(["form-control",{"is-invalid":e.anonymize?.terms?.invalid}]),id:"terms",name:"terms",rows:"3"},null,2),[[r,{state:e.viewState,set:i=>{e.terms=i},value:e.terms,form:"anonymizeForm",options:{debounce:250}}]]),t[8]||(t[8]=o("small",{id:"termsHelp",class:"form-text text-muted"},"One term per line. Each term will be replaced by XXX.",-1)),N(o("div",gN," Terms are in an invalid format ",512),[[Y,e.anonymize?.terms?.errors?.format]])]),o("div",yN,[t[10]||(t[10]=o("label",{for:"expiration"},"Expiration strategy",-1)),N((l(),d("select",bN,[...t[9]||(t[9]=[o("option",{value:"never",selected:""},"Never expire",-1),o("option",{value:"redirect"}," Redirect to GitHub when expired ",-1),o("option",{value:"remove"},"Remove when expired",-1)])])),[[r,{state:e.viewState,set:i=>{e.options.expirationMode=i},value:e.options?.expirationMode,form:"anonymizeForm",options:{}}]]),t[11]||(t[11]=o("small",{class:"form-text text-muted"},"Define the expiration strategy for the anonymized repository.",-1))]),N(o("div",wN,[t[12]||(t[12]=o("label",{for:"expirationDate"},"Expiration date of the anonymized repository",-1)),N(o("input",kN,null,512),[[r,{state:e.viewState,set:i=>{e.options.expirationDate=i},value:e.options?.expirationDate,form:"anonymizeForm",options:{}}]]),N(o("small",{class:"form-text text-muted"},"After "+c(e.fmt?.date(e.options?.expirationDate))+", the repository will be removed and the visitor will not be able to see the content of the repository.",513),[[Y,e.options?.expirationMode=="remove"]]),N(o("small",{class:"form-text text-muted"},"After "+c(e.fmt?.date(e.options?.expirationDate))+", the visitors of the anonymized repository will be redirected to "+c(e.pullRequestUrl)+".",513),[[Y,e.options?.expirationMode=="redirect"]])],512),[[Y,e.options?.expirationMode!="never"]]),o("div",EN,[o("div",CN,[t[25]||(t[25]=ce('

',1)),o("div",_N,[o("div",SN,[o("div",NN,[o("div",DN,[N(o("input",RN,null,512),[[r,{state:e.viewState,set:i=>{e.options.link=i},value:e.options?.link,form:"anonymizeForm",options:{}}]]),t[13]||(t[13]=o("label",{class:"form-check-label",for:"link"},"Keep links",-1)),t[14]||(t[14]=o("small",{class:"form-text text-muted"},"Keep or remove all the links.",-1))]),o("div",TN,[N(o("input",AN,null,512),[[r,{state:e.viewState,set:i=>{e.options.image=i},value:e.options?.image,form:"anonymizeForm",options:{}}]]),t[15]||(t[15]=o("label",{class:"form-check-label",for:"image"},"Display images",-1)),t[16]||(t[16]=o("small",{class:"form-text text-muted"},"Images are not anonymized",-1))]),o("div",ON,[N(o("input",IN,null,512),[[r,{state:e.viewState,set:i=>{e.options.date=i},value:e.options?.date,form:"anonymizeForm",options:{}}]]),t[17]||(t[17]=o("label",{class:"form-check-label",for:"date"},"Display dates",-1)),t[18]||(t[18]=o("small",{class:"form-text text-muted"},"Display the date of the Pull Request and the date of the comments.",-1))]),o("div",PN,[N(o("input",VN,null,512),[[r,{state:e.viewState,set:i=>{e.options.username=i},value:e.options?.username,form:"anonymizeForm",options:{}}]]),t[19]||(t[19]=o("label",{class:"form-check-label",for:"username"},"Display username",-1))]),o("div",qN,[N(o("input",MN,null,512),[[r,{state:e.viewState,set:i=>{e.options.comments=i},value:e.options?.comments,form:"anonymizeForm",options:{}}]]),t[20]||(t[20]=o("label",{class:"form-check-label",for:"comments"},"Display comments",-1))]),o("div",LN,[N(o("input",$N,null,512),[[r,{state:e.viewState,set:i=>{e.options.diff=i},value:e.options?.diff,form:"anonymizeForm",options:{}}]]),t[21]||(t[21]=o("label",{class:"form-check-label",for:"diff"},"Display diff",-1))]),o("div",UN,[N(o("input",FN,null,512),[[r,{state:e.viewState,set:i=>{e.options.origin=i},value:e.options?.origin,form:"anonymizeForm",options:{}}]]),t[22]||(t[22]=o("label",{class:"form-check-label",for:"origin"},"Display the project name",-1))]),o("div",zN,[N(o("input",HN,null,512),[[r,{state:e.viewState,set:i=>{e.options.title=i},value:e.options?.title,form:"anonymizeForm",options:{}}]]),t[23]||(t[23]=o("label",{class:"form-check-label",for:"title"},"Display the PR title",-1))]),o("div",BN,[N(o("input",jN,null,512),[[r,{state:e.viewState,set:i=>{e.options.body=i},value:e.options?.body,form:"anonymizeForm",options:{}}]]),t[24]||(t[24]=o("label",{class:"form-check-label",for:"body"},"Display the PR body and comment bodies",-1))])])])])])])],512),[[Y,e.pullRequestUrl]]),e.error?(l(),d("div",{key:0,class:"alert alert-danger",role:"alert",textContent:c(e.error)},null,8,GN)):p("v-if",!0),N(o("div",WN,[e.isUpdate?p("v-if",!0):(l(),d("button",{key:0,id:"submit",type:"submit",class:"btn btn-ink btn-block",onClick:t[0]||(t[0]=me(i=>e.submitForm(i,()=>{e.anonymizePullRequest(i)}),["prevent"]))},[...t[28]||(t[28]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(" Anonymize ",-1)])])),e.isUpdate?(l(),d("button",{key:1,id:"submit",type:"submit",class:"btn btn-ink btn-block",onClick:t[1]||(t[1]=me(i=>e.submitForm(i,()=>{e.updatePullRequest(i)}),["prevent"]))},[...t[29]||(t[29]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-save"})],-1),b(" Update ",-1)])])):p("v-if",!0)],512),[[Y,e.pullRequestUrl]])],2)),[[s,e.viewState]])],2)]),e.details?(l(),d("div",KN,[o("div",YN,[o("h2",JN,[e.options?.title?(l(),d("span",QN,c(e.anonymize(e.details?.pullRequest?.title)),1)):p("v-if",!0),o("span",{class:T(["badge",{"badge-success":e.details?.pullRequest?.merged,"badge-warning":e.details?.pullRequest?.state=="open","badge-danger":e.details?.pullRequest?.state=="closed"&&!e.details?.pullRequest?.merged}])},c(e.fmt?.title(e.details?.pullRequest?.merged?"merged":e.details?.pullRequest?.state)),3)]),e.options?.date?(l(),d("small",{key:0,textContent:c(e.fmt?.date(e.details?.pullRequest?.updatedDate))},null,8,XN)):p("v-if",!0)]),e.options?.origin?(l(),d("small",ZN,"Pull Request on "+c(e.details?.pullRequest?.baseRepositoryFullName),1)):p("v-if",!0),e.options?.body?(l(),d("div",xN,[Ce(n,{content:e.anonymize(e.details?.pullRequest?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0),o("ul",eD,[e.options?.diff?(l(),d("li",tD,[...t[31]||(t[31]=[o("button",{class:"nav-link active",id:"pills-diff-tab","data-toggle":"pill","data-target":"#pills-diff",type:"button",role:"tab","aria-controls":"pills-diff","aria-selected":"true"}," Diff ",-1)])])):p("v-if",!0),e.options?.comments?(l(),d("li",oD,[o("button",{class:T(["nav-link",{active:!e.options?.diff}]),id:"pills-comments-tab","data-toggle":"pill","data-target":"#pills-comments",type:"button",role:"tab","aria-controls":"pills-comments","aria-selected":"false"},[o("span",{textContent:c(e.fmt.plural(e.details?.pullRequest?.comments?.length,{0:"No comment",one:"One Comment",other:"{} Comments"}))},null,8,sD)],2)])):p("v-if",!0)]),o("div",nD,[o("div",rD,[e.options?.diff?(l(),d("div",iD,[o("pre",aD,[o("code",{innerHTML:e.sanitize(e.fmt?.diff(e.anonymize(e.details?.pullRequest?.diff)))},null,8,lD)])])):p("v-if",!0)]),o("div",{class:T(["tab-pane",{"show active":!e.options?.diff}]),id:"pills-comments",role:"tabpanel","aria-labelledby":"pills-comments-tab"},[e.options?.comments?(l(),d("ul",dD,[(l(!0),d(X,null,re(e.details?.pullRequest?.comments,(i,a)=>(l(),d("li",uD,[o("div",cD,[e.options?.username?(l(),d("h5",pD," @"+c(e.anonymize(i?.author)),1)):p("v-if",!0),e.options?.date?(l(),d("small",{key:1,textContent:c(e.fmt?.date(i?.updatedDate))},null,8,fD)):p("v-if",!0)]),o("p",mD,[e.options?.body?(l(),Lt(n,{key:0,class:"pr-comment-body",content:e.anonymize(i?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])):p("v-if",!0)])]))),256))])):p("v-if",!0)],2)])])):p("v-if",!0)])])}var hD={class:"container paper-page claim-page"},vD={class:"paper-settings-main claim-form"},gD={class:"form-group"},yD={class:"invalid-feedback"},bD={class:"form-group"};function bl(e,t){let n=be("field"),r=be("form");return l(),d("div",hD,[t[6]||(t[6]=ce('
My work \xA0/\xA0 Claim

Claim an anonymization

Take ownership of an existing anonymized repository so it appears on your dashboard.

',3)),o("div",vD,[t[5]||(t[5]=o("p",{class:"paper-section-copy"},"Use this when an anonymization was created by a co-author or from another account. You must have access to the GitHub repository it was made from.",-1)),N((l(),d("form",{class:"form needs-validation",name:"claimForm",novalidate:"",onSubmit:t[0]||(t[0]=me(s=>e.submitForm(s,()=>{e.claim()}),["prevent"]))},[o("div",gD,[t[1]||(t[1]=o("label",{class:"paper-field-label",for:"repoUrl"},"GitHub repository URL",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.claimForm?.repoUrl?.invalid&&(e.claimForm?.repoUrl?.touched||e.claimForm?.submitted)}]),name:"repoUrl",id:"repoUrl",required:""},null,2),[[n,{state:e.viewState,set:s=>{e.repoUrl=s},value:e.repoUrl,form:"claimForm",options:{}}]]),N(o("div",yD," No anonymization matches this repository and ID. Check both values and that you can access the repository on GitHub. ",512),[[Y,e.claimForm?.repoUrl?.errors?.not_found]])]),o("div",bD,[t[2]||(t[2]=o("label",{class:"paper-field-label",for:"repoId"},"Anonymized repository ID",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.claimForm?.repoId?.invalid&&(e.claimForm?.repoId?.touched||e.claimForm?.submitted)}]),name:"repoId",id:"repoId",required:""},null,2),[[n,{state:e.viewState,set:s=>{e.repoId=s},value:e.repoId,form:"claimForm",options:{}}]]),t[3]||(t[3]=o("small",{id:"idHelp",class:"form-text text-muted"},[b("The ID is the last part of the anonymized URL: "),o("code",null,"anonymous.4open.science/r/"),b(".")],-1))]),t[4]||(t[4]=o("button",{id:"submit",type:"submit",class:"btn btn-ink"}," Claim anonymization ",-1))],32)),[[r,e.viewState]])])])}var wD={class:"container page paper-page conference-page"},kD={class:"paper-crumbs"},ED={class:"here"},CD={class:"d-flex align-items-end flex-wrap",style:{gap:"12px","justify-content":"space-between"}},_D=["textContent"],SD={key:0,class:"paper-page-lede"},ND=["textContent","href"],DD={class:"d-flex align-items-center flex-wrap",style:{gap:"10px"}},RD=["textContent"],TD=["href"],AD={class:"paper-meta-rule"},OD=["textContent"],ID=["textContent"],PD={key:0},VD={class:"search-wrap"},qD={type:"search",id:"search",class:"form-control","aria-label":"Search repositories",placeholder:"Search by ID or source repository\u2026",autocomplete:"off"},MD={class:"dashboard-filter-controls"},LD={class:"dropdown"},$D={class:"btn dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},UD={class:"filter-btn-value"},FD={class:"dropdown-menu","aria-labelledby":"dropdownSort"},zD={class:"form-check dropdown-item"},HD={class:"form-check-input",type:"radio",name:"sort",id:"anonymizeDate",value:"-anonymizeDate"},BD={class:"form-check dropdown-item"},jD={class:"form-check-input",type:"radio",name:"sort",id:"sortID",value:"repoId"},GD={class:"form-check dropdown-item"},WD={class:"form-check-input",type:"radio",name:"sort",id:"sortStatus",value:"-status"},KD={class:"form-check dropdown-item"},YD={class:"form-check-input",type:"radio",name:"sort",id:"sortViews",value:"-pageView"},JD={class:"dropdown"},QD={class:"btn dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},XD={key:0,class:"filter-btn-value"},ZD={key:1,class:"filter-btn-value"},xD={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},eR={class:"form-check dropdown-item"},tR=["id"],oR=["for"],sR={class:"dashboard-meta"},nR={class:"dashboard-count"},rR={key:0},iR={key:0},aR={key:1},lR={key:1},dR={key:0,class:"filter-chip"},uR=["onClick","aria-label"],cR={class:"paper-table paper-table-repos w-100",role:"table","aria-label":"Repositories"},pR={class:"cell-anon",role:"cell"},fR={class:"anon-text"},mR=["textContent","href"],hR={class:"anon-sub"},vR={class:"anon-source"},gR=["textContent","href"],yR={key:0},bR=["textContent","href"],wR={key:1},kR=["href"],ER={class:"cell-status",role:"cell"},CR={class:"status-line"},_R=["textContent"],SR={key:0,class:"status-sub"},NR={class:"cell-views num",role:"cell"},DR=["textContent"],RR={class:"cell-expires",role:"cell"},TR={key:0,class:"expires-never"},AR=["textContent"],OR={key:2,class:"expires-past"},IR={key:0},PR={key:3,class:"empty-dash","aria-label":"Not applicable"},VR={class:"cell-actions",role:"cell"},qR={class:"dropdown"},MR=["aria-label"],LR={class:"dropdown-menu dropdown-menu-right"},$R=["href"],UR=["href"],FR={key:0,class:"paper-table-empty"},zR={key:0},HR={key:1},BR={key:2,class:"paper-table-empty-actions"};function wl(e,t){let n=be("field"),r=be("form");return l(),d("div",wD,[o("div",null,[o("div",kD,[t[2]||(t[2]=o("a",{href:"/dashboard"},"My work",-1)),t[3]||(t[3]=b(" \xA0/\xA0 ",-1)),t[4]||(t[4]=o("a",{href:"/conferences"},"Conferences",-1)),t[5]||(t[5]=b(" \xA0/\xA0 ",-1)),o("span",ED,c(e.conference?.conferenceID),1)]),o("div",CD,[o("div",null,[o("h1",{class:"paper-page-title",textContent:c(e.conference?.name)},null,8,_D),e.conference?.url?(l(),d("p",SD,[o("a",{target:"_blank",rel:"noopener",textContent:c(e.conference?.url),href:e.safeUrl(e.conference?.url)},null,8,ND)])):p("v-if",!0)]),o("div",DD,[o("span",{class:T(["status-pill",{"status-pill-ready":e.conference?.status=="ready","status-pill-removed":e.conference?.status=="removed"||e.conference?.status=="expired"}])},[o("span",{class:T(["status-dot","status-"+e.conference?.status]),"aria-hidden":"true"},null,2),o("span",{textContent:c(e.fmt?.statusLabel(e.conference?.status))},null,8,RD)],2),o("a",{class:"btn btn-outline-ink",href:e.safeUrl("/conference/"+e.conference?.conferenceID+"/edit")},[...t[6]||(t[6]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit conference",-1)])],8,TD)])]),o("div",AD,[o("span",null,[t[7]||(t[7]=b("ID ",-1)),o("b",{class:"commit-hash",textContent:c(e.conference?.conferenceID)},null,8,OD)]),o("span",null,[t[8]||(t[8]=b("Review window ",-1)),o("b",null,c(e.fmt?.date(e.conference?.startDate,"mediumDate"))+" \u2013 "+c(e.fmt?.date(e.conference?.endDate,"mediumDate")),1)]),o("span",null,[t[9]||(t[9]=b("Repositories ",-1)),o("b",null,c(e.fmt?.number(e.conference?.repositories?.length)),1)]),o("span",null,[t[10]||(t[10]=b("Plan ",-1)),o("b",{textContent:c(e.conference?.plan?.name||e.conference?.plan?.planID||"Free")},null,8,ID)]),e.conference?.price?(l(),d("span",PD,[t[11]||(t[11]=b("Cost so far ",-1)),o("b",null,c(e.fmt?.number(e.conference?.price,2))+" \u20AC",1)])):p("v-if",!0)]),t[32]||(t[32]=o("div",{class:"paper-section-eyebrow"},"Repositories",-1)),N((l(),d("form",{class:"w-100 dashboard-filter-row","aria-label":"Filter repositories","accept-charset":"UTF-8",onSubmit:t[0]||(t[0]=me(s=>e.submitForm(s,()=>{s.preventDefault()}),["prevent"]))},[o("div",VD,[N(o("input",qD,null,512),[[n,{state:e.viewState,set:s=>{e.search=s},value:e.search,form:null,options:{}}]])]),o("div",MD,[o("div",LD,[o("button",$D,[t[12]||(t[12]=o("span",{class:"filter-btn-label"},"Sort",-1)),o("span",UD,c({"-anonymizeDate":"Anonymize date",repoId:"ID","-status":"Status","-pageView":"Views"}[e.orderBy]||"Custom"),1)]),o("div",FD,[t[17]||(t[17]=o("h6",{class:"dropdown-header"},"Order by",-1)),o("div",zD,[N(o("input",HD,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[13]||(t[13]=o("label",{class:"form-check-label",for:"anonymizeDate"},"Anonymize date",-1))]),o("div",BD,[N(o("input",jD,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[14]||(t[14]=o("label",{class:"form-check-label",for:"sortID"},"ID",-1))]),o("div",GD,[N(o("input",WD,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[15]||(t[15]=o("label",{class:"form-check-label",for:"sortStatus"},"Status",-1))]),o("div",KD,[N(o("input",YD,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[16]||(t[16]=o("label",{class:"form-check-label",for:"sortViews"},"Views",-1))])])]),o("div",JD,[o("button",QD,[t[18]||(t[18]=o("span",{class:"filter-btn-label"},"Status",-1)),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?(l(),d("span",XD,"All")):p("v-if",!0),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?p("v-if",!0):(l(),d("span",ZD,c((e.filters?.status?.ready?0:1)+(e.filters?.status?.expired?0:1)+(e.filters?.status?.removed?0:1))+" hidden ",1))]),o("div",xD,[t[19]||(t[19]=o("h6",{class:"dropdown-header"},"Show statuses",-1)),(l(!0),d(X,null,re(e.statusLabels,(s,i,a)=>(l(),d("div",eR,[N(o("input",{class:"form-check-input",type:"checkbox",id:"status-"+i},null,8,tR),[[n,{state:e.viewState,set:u=>{e.filters.status[i]=u},value:e.filters?.status[i],form:null,options:{}}]]),o("label",{class:"form-check-label",for:"status-"+i},c(s),9,oR)]))),256))])])])],32)),[[r,e.viewState]]),o("div",sR,[o("span",nR,[e.filteredRepositories?.length===e.conference?.repositories?.length?(l(),d("span",rR,[b(c(e.fmt?.number(e.conference?.repositories?.length))+" repositor",1),e.conference?.repositories?.length===1?(l(),d("span",iR,"y")):p("v-if",!0),e.conference?.repositories?.length!==1?(l(),d("span",aR,"ies")):p("v-if",!0)])):p("v-if",!0),e.filteredRepositories?.length!==e.conference?.repositories?.length?(l(),d("span",lR,c(e.fmt?.number(e.filteredRepositories?.length))+" of "+c(e.fmt?.number(e.conference?.repositories?.length))+" shown",1)):p("v-if",!0)]),(l(!0),d(X,null,re(e.filters?.status,(s,i,a)=>(l(),d(X,null,[s===!1?(l(),d("span",dR,[b(" Hiding "+c(e.statusLabels[i])+" ",1),o("button",{type:"button",class:"filter-chip-close",onClick:u=>{e.filters.status[i]=!0},"aria-label":"Show "+e.statusLabels[i]+" again"},"\xD7",8,uR)])):p("v-if",!0)],64))),256))]),o("div",cR,[t[31]||(t[31]=o("div",{class:"paper-table-head",role:"row"},[o("div",{role:"columnheader"},"Repository"),o("div",{role:"columnheader"},"Status"),o("div",{role:"columnheader",class:"num"},"Views"),o("div",{role:"columnheader"},"Expires"),o("div",{role:"columnheader"},[o("span",{class:"sr-only"},"Actions")])],-1)),(l(!0),d(X,null,re(e.filteredRepositories,(s,i)=>(l(),d("div",{class:T(["paper-table-row",{"repo-inactive":s?.status=="expired"||s?.status=="removed","repo-error":s?.status=="error"}]),role:"row",key:s?.repoId},[o("div",pR,[t[22]||(t[22]=o("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[o("use",{href:"#project-type-repo"})],-1)),o("div",fR,[o("a",{class:"repo-name",textContent:c(s?.repoId),href:e.safeUrl("/r/"+s?.repoId+"/")},null,8,mR),o("div",hR,[o("span",vR,[o("a",{target:"_blank",rel:"noopener",textContent:c(s?.source?.fullName),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/")},null,8,gR),s?.options?.update&&s?.source?.branch?(l(),d("span",yR,[t[20]||(t[20]=b(" \xB7 ",-1)),o("a",{target:"_blank",rel:"noopener",textContent:c(s?.source?.branch),href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/tree/"+s?.source?.branch)},null,8,bR)])):p("v-if",!0),s?.source?.commit?(l(),d("span",wR,[t[21]||(t[21]=b(" \xB7 ",-1)),o("a",{class:"commit-hash",target:"_blank",rel:"noopener",href:e.safeUrl("https://github.com/"+s?.source?.fullName+"/tree/"+s?.source?.commit)},"@"+c(s?.source?.commit?.substring(0,8)),9,kR)])):p("v-if",!0)])])])]),o("div",ER,[o("div",CR,[o("span",{class:T(["status-dot","status-"+(s?.status=="error"?"error":s?.status=="ready"?"ready":s?.status=="expired"||s?.status=="removed"?s?.status:"progress")]),"aria-hidden":"true"},null,2),o("span",{class:"status-word",textContent:c(e.fmt?.statusLabel(s?.status))},null,8,_R)]),s?.anonymizeDate?(l(),d("div",SR,"anonymized "+c(e.fmt?.humanTime(s?.anonymizeDate)),1)):p("v-if",!0)]),o("div",NR,[t[23]||(t[23]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1)),t[24]||(t[24]=b()),o("span",{textContent:c(e.fmt?.number(s?.pageView))},null,8,DR)]),o("div",RR,[t[26]||(t[26]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),s?.status=="ready"&&(s?.options?.expirationMode==="never"||!s?.options?.expirationDate)?(l(),d("span",TR,"Never")):p("v-if",!0),s?.status=="ready"&&s?.options?.expirationMode!=="never"&&s?.options?.expirationDate?(l(),d("span",{key:1,textContent:c(e.fmt?.humanTime(s?.options?.expirationDate))},null,8,AR)):p("v-if",!0),s?.status=="expired"?(l(),d("span",OR,[t[25]||(t[25]=b("Expired",-1)),s?.options?.expirationDate?(l(),d("span",IR,c(e.fmt?.humanTime(s?.options?.expirationDate)),1)):p("v-if",!0)])):p("v-if",!0),s?.status!="ready"&&s?.status!="expired"?(l(),d("span",PR,"\u2014")):p("v-if",!0)]),o("div",VR,[o("div",qR,[o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions for "+s?.repoId},[...t[27]||(t[27]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})],-1)])],8,MR),o("div",LR,[o("a",{class:"dropdown-item",href:e.safeUrl("/r/"+s?.repoId+"/")},[...t[28]||(t[28]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View ",-1)])],8,$R),o("a",{class:"dropdown-item",href:e.safeUrl("/anonymize/"+s?.repoId)},[...t[29]||(t[29]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit ",-1)])],8,UR)])])])],2))),128)),e.filteredRepositories?.length==0?(l(),d("div",FR,[t[30]||(t[30]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1)),e.conference?.repositories?.length?p("v-if",!0):(l(),d("span",zR,"No repository has been submitted to this conference yet.")),e.conference?.repositories?.length?(l(),d("span",HR,"Nothing matches the current filters.")):p("v-if",!0),e.conference?.repositories?.length?(l(),d("div",BR,[o("button",{type:"button",class:"btn btn-outline-ink",onClick:t[1]||(t[1]=s=>{e.search="",e.filters.status.ready=!0,e.filters.status.expired=!0,e.filters.status.removed=!0})},"Clear filters")])):p("v-if",!0)])):p("v-if",!0)])])])}var jR={class:"container page paper-page conferences-page"},GR={class:"row"},WR={class:"w-100"},KR={class:"search-wrap"},YR={type:"search",id:"search",class:"form-control","aria-label":"Search conferences",placeholder:"Search by name or ID\u2026",autocomplete:"off"},JR={class:"dashboard-filter-controls"},QR={class:"dropdown"},XR={class:"btn dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},ZR={class:"filter-btn-value"},xR={class:"dropdown-menu","aria-labelledby":"dropdownSort"},eT={class:"form-check dropdown-item"},tT={class:"form-check-input",type:"radio",name:"sort",id:"sortName",value:"name"},oT={class:"form-check dropdown-item"},sT={class:"form-check-input",type:"radio",name:"sort",id:"sortID",value:"conferenceID"},nT={class:"form-check dropdown-item"},rT={class:"form-check-input",type:"radio",name:"sort",id:"sortStatus",value:"-status"},iT={class:"dropdown"},aT={class:"btn dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},lT={key:0,class:"filter-btn-value"},dT={key:1,class:"filter-btn-value"},uT={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},cT={class:"form-check dropdown-item"},pT=["id"],fT=["for"],mT={class:"dashboard-meta"},hT={class:"dashboard-count"},vT={key:0},gT={key:0},yT={key:1},bT={key:0,class:"filter-chip"},wT=["onClick","aria-label"],kT={key:0,class:"conference-feedback",role:"alert"},ET={key:1,class:"conference-feedback",role:"status"},CT={class:"paper-table paper-table-conferences w-100",role:"table","aria-label":"Conferences"},_T={class:"cell-anon",role:"cell"},ST={class:"anon-text"},NT=["textContent","href"],DT={class:"anon-sub"},RT={class:"anon-source"},TT=["textContent"],AT={key:0},OT=["textContent","href"],IT={class:"cell-status",role:"cell"},PT={class:"status-line"},VT=["textContent"],qT={class:"cell-views num",role:"cell"},MT=["textContent"],LT={class:"cell-expires",role:"cell"},$T={key:0},UT={key:1,class:"empty-dash","aria-label":"No review window"},FT={class:"cell-actions",role:"cell"},zT={class:"dropdown"},HT=["disabled","aria-label"],BT={class:"dropdown-menu dropdown-menu-right"},jT=["href"],GT=["href"],WT={key:0},KT=["onClick"],YT={key:0,class:"paper-table-empty"},JT={key:0},QT={key:1},XT={class:"paper-table-empty-actions"},ZT={key:1,href:"/conference/new",class:"btn btn-ink"};function kl(e,t){let n=be("field"),r=be("form");return l(),d("div",jR,[o("div",GR,[o("div",WR,[t[10]||(t[10]=ce('
My work \xA0/\xA0 Conferences

Your conferences

Group anonymizations by venue, give chairs a shared dashboard, and set one expiry for every submission.

New conference
',2)),N((l(),d("form",{class:"w-100 dashboard-filter-row","aria-label":"Filter conferences","accept-charset":"UTF-8",onSubmit:t[0]||(t[0]=me(s=>e.submitForm(s,()=>{s.preventDefault()}),["prevent"]))},[o("div",KR,[N(o("input",YR,null,512),[[n,{state:e.viewState,set:s=>{e.search=s},value:e.search,form:null,options:{}}]])]),o("div",JR,[o("div",QR,[o("button",XR,[t[3]||(t[3]=o("span",{class:"filter-btn-label"},"Sort",-1)),o("span",ZR,c({name:"Name",conferenceID:"ID","-status":"Status"}[e.orderBy]||"Custom"),1)]),o("div",xR,[t[7]||(t[7]=o("h6",{class:"dropdown-header"},"Order by",-1)),o("div",eT,[N(o("input",tT,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[4]||(t[4]=o("label",{class:"form-check-label",for:"sortName"},"Name",-1))]),o("div",oT,[N(o("input",sT,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[5]||(t[5]=o("label",{class:"form-check-label",for:"sortID"},"ID",-1))]),o("div",nT,[N(o("input",rT,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[6]||(t[6]=o("label",{class:"form-check-label",for:"sortStatus"},"Status",-1))])])]),o("div",iT,[o("button",aT,[t[8]||(t[8]=o("span",{class:"filter-btn-label"},"Status",-1)),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?(l(),d("span",lT,"All")):p("v-if",!0),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?p("v-if",!0):(l(),d("span",dT,c((e.filters?.status?.ready?0:1)+(e.filters?.status?.expired?0:1)+(e.filters?.status?.removed?0:1))+" hidden ",1))]),o("div",uT,[t[9]||(t[9]=o("h6",{class:"dropdown-header"},"Show statuses",-1)),(l(!0),d(X,null,re(e.statusLabels,(s,i,a)=>(l(),d("div",cT,[N(o("input",{class:"form-check-input",type:"checkbox",id:"status-"+i},null,8,pT),[[n,{state:e.viewState,set:u=>{e.filters.status[i]=u},value:e.filters?.status[i],form:null,options:{}}]]),o("label",{class:"form-check-label",for:"status-"+i},c(s),9,fT)]))),256))])])])],32)),[[r,e.viewState]]),o("div",mT,[o("span",hT,[e.filteredConferences?.length===e.conferences?.length?(l(),d("span",vT,[b(c(e.fmt?.number(e.conferences?.length))+" conference",1),e.conferences?.length!==1?(l(),d("span",gT,"s")):p("v-if",!0)])):p("v-if",!0),e.filteredConferences?.length!==e.conferences?.length?(l(),d("span",yT,c(e.fmt?.number(e.filteredConferences?.length))+" of "+c(e.fmt?.number(e.conferences?.length))+" shown",1)):p("v-if",!0)]),(l(!0),d(X,null,re(e.filters?.status,(s,i,a)=>(l(),d(X,null,[s===!1?(l(),d("span",bT,[b(" Hiding "+c(e.statusLabels[i])+" ",1),o("button",{type:"button",class:"filter-chip-close",onClick:u=>{e.filters.status[i]=!0},"aria-label":"Show "+e.statusLabels[i]+" again"},"\xD7",8,wT)])):p("v-if",!0)],64))),256))])]),e.error?(l(),d("div",kT,[o("span",null,c(e.error),1),o("button",{type:"button",class:"btn btn-outline-ink",onClick:t[1]||(t[1]=s=>e.loadConferences())},"Retry")])):p("v-if",!0),e.loading?(l(),d("div",ET,"Loading conferences\u2026")):p("v-if",!0),o("div",CT,[t[24]||(t[24]=o("div",{class:"paper-table-head",role:"row"},[o("div",{role:"columnheader"},"Conference"),o("div",{role:"columnheader"},"Status"),o("div",{role:"columnheader",class:"num"},"Repos"),o("div",{role:"columnheader"},"Review window"),o("div",{role:"columnheader"},[o("span",{class:"sr-only"},"Actions")])],-1)),(l(!0),d(X,null,re(e.filteredConferences,(s,i)=>(l(),d("div",{class:T(["paper-table-row row-clickable",{"repo-inactive":s?.status=="expired"||s?.status=="removed"}]),role:"row",key:s?.conferenceID},[o("div",_T,[t[13]||(t[13]=o("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Conference"},[o("use",{href:"#project-icon-conference"})],-1)),o("div",ST,[o("a",{class:"repo-name",textContent:c(s?.name),href:e.safeUrl("/conference/"+s?.conferenceID)},null,8,NT),o("div",DT,[o("span",RT,[t[12]||(t[12]=b("ID ",-1)),o("span",{class:"commit-hash",textContent:c(s?.conferenceID)},null,8,TT),s?.url?(l(),d("span",AT,[t[11]||(t[11]=b(" \xB7 ",-1)),o("a",{target:"_blank",rel:"noopener",textContent:c(e.fmt?.limitTo(s?.url,60)),href:e.safeUrl(s?.url)},null,8,OT)])):p("v-if",!0)])])])]),o("div",IT,[o("div",PT,[o("span",{class:T(["status-dot","status-"+s?.status]),"aria-hidden":"true"},null,2),o("span",{class:"status-word",textContent:c(e.fmt?.statusLabel(s?.status))},null,8,VT)])]),o("div",qT,[t[14]||(t[14]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1)),t[15]||(t[15]=b()),o("span",{textContent:c(e.fmt?.number(s?.nbRepositories||0))},null,8,MT)]),o("div",LT,[t[16]||(t[16]=o("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),s?.startDate?(l(),d("span",$T,c(e.fmt?.date(s?.startDate,"mediumDate"))+" \u2013 "+c(e.fmt?.date(s?.endDate,"mediumDate")),1)):p("v-if",!0),s?.startDate?p("v-if",!0):(l(),d("span",UT,"\u2014"))]),o("div",FT,[o("div",zT,[o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:s?.removing,"aria-label":"Actions for "+s?.name},[...t[17]||(t[17]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})],-1)])],8,HT),o("div",BT,[o("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+s?.conferenceID+"/")},[...t[18]||(t[18]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View ",-1)])],8,jT),o("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+s?.conferenceID+"/edit")},[...t[19]||(t[19]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit ",-1)])],8,GT),s?.status!="removed"?(l(),d("div",WT,[t[21]||(t[21]=o("div",{class:"dropdown-divider"},null,-1)),o("button",{type:"button",class:"dropdown-item dropdown-item-danger",onClick:a=>e.removeConference(s)},[...t[20]||(t[20]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Remove ",-1)])],8,KT)])):p("v-if",!0)])])])],2))),128)),!e.loading&&!e.error&&e.filteredConferences?.length==0?(l(),d("div",YT,[t[23]||(t[23]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1)),e.conferences?.length==0?(l(),d("span",JT,"You have not created a conference yet.")):p("v-if",!0),e.conferences?.length>0?(l(),d("span",QT,"Nothing matches the current filters.")):p("v-if",!0),o("div",XT,[e.conferences?.length>0?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[2]||(t[2]=s=>{e.search="",e.filters.status.ready=!0,e.filters.status.expired=!0,e.filters.status.removed=!0})},"Clear filters")):p("v-if",!0),e.conferences?.length==0?(l(),d("a",ZT,[...t[22]||(t[22]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#project-icon-plus"})],-1),b(" New conference",-1)])])):p("v-if",!0)])])):p("v-if",!0)])])])}var xT={class:"container page dashboard-page paper-page"},eA={class:"row"},tA={class:"w-100"},oA={class:"dashboard-heading"},sA=["open"],nA=["aria-expanded"],rA=["stroke-dasharray"],iA={key:1,d:"M7 12c0-4 4-4 5 0s5 4 5 0-4-4-5 0-5 4-5 0",class:"quota-ring-unlimited"},aA={key:0,class:"quota-summary-value"},lA={key:0},dA={class:"quota-panel",id:"dashboard-usage"},uA={class:"quota-panel-heading"},cA={key:1,class:"quota-loading",role:"status"},pA={class:"search-wrap"},fA={type:"search",id:"search",class:"form-control","aria-label":"Search anonymizations",placeholder:"Search projects, IDs, or conferences\u2026",autocomplete:"off"},mA=["aria-expanded"],hA={class:"btn-group",role:"group","aria-label":"Type"},vA=["aria-pressed"],gA=["aria-pressed"],yA=["aria-pressed"],bA=["aria-pressed"],wA={class:"dropdown"},kA={class:"btn dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},EA={class:"filter-btn-value"},CA={class:"sr-only"},_A={class:"dropdown-menu","aria-labelledby":"dropdownSort"},SA={class:"form-check dropdown-item"},NA=["onClick","checked","id"],DA=["for"],RA={class:"dropdown"},TA={class:"btn dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},AA={key:0,class:"filter-btn-value"},OA={key:1,class:"filter-btn-value"},IA={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},PA={class:"form-check dropdown-item"},VA=["id"],qA=["for"],MA={key:0,class:"dashboard-meta"},LA={class:"dashboard-view-tabs",role:"group","aria-label":"Project view"},$A=["aria-pressed"],UA=["aria-pressed","aria-label"],FA={class:"dashboard-count"},zA={key:0},HA={key:0},BA={key:1},jA={class:"dashboard-active-filters"},GA=["onClick","aria-label","title"],WA=["aria-busy"],KA={class:"paper-table-head",role:"row"},YA=["aria-sort"],JA=["aria-sort"],QA=["aria-sort"],XA=["aria-sort"],ZA={key:0,class:"paper-table-row paper-table-skeleton",role:"row","aria-hidden":"true"},xA=["onClick"],eO={class:"cell-anon",role:"cell"},tO=["aria-label","title"],oO={class:"project-type-svg","aria-hidden":"true"},sO=["href"],nO={class:"anon-text"},rO={class:"anon-title"},iO=["title","textContent","href"],aO=["textContent"],lO={key:2,class:"type-badge type-coauthor",title:"You are a co-author on this anonymization"},dO={class:"anon-sub"},uO=["title"],cO=["title"],pO=["title"],fO=["textContent"],mO={class:"dashboard-row-meta",role:"presentation"},hO={class:"cell-status",role:"cell"},vO={class:"status-line"},gO=["textContent"],yO=["textContent","title"],bO=["title"],wO=["href"],kO=["onClick"],EO={key:4,class:"status-sub status-sub-date"},CO=["aria-label"],_O={class:"cell-expires",role:"cell"},SO={key:0,class:"expires-never"},NO=["textContent"],DO={key:2,class:"expires-past"},RO={key:3,class:"expires-past"},TO={key:4,class:"empty-dash","aria-label":"Not applicable"},AO={class:"cell-actions",role:"cell"},OO=["onClick","disabled","title","aria-label"],IO=["onClick","data-project-actions","aria-controls","aria-expanded"],PO={key:2,class:"dropdown"},VO=["data-project-actions","aria-label"],qO={class:"dropdown-menu dropdown-menu-right"},MO=["onClick","aria-controls","aria-expanded"],LO=["href"],$O=["href"],UO=["onClick","disabled"],FO=["href"],zO=["onClick"],HO=["onClick"],BO=["onClick"],jO={key:5},GO=["onClick"],WO={key:1,class:"project-details-row",role:"row"},KO=["id","onKeydown"],YO={class:"project-details-heading"},JO=["onClick"],QO={class:"project-details-list"},XO={key:0},ZO={key:1},xO={key:0},eI={key:2},tI={key:0,class:"project-progress-help"},oI=["href"],sI=["onSubmit"],nI=["for"],rI=["id"],iI={class:"project-name-controls"},aI=["id","aria-describedby","disabled"],lI=["disabled"],dI={key:0,class:"project-name-error",role:"alert"},uI={key:1,role:"status"},cI={key:0,class:"paper-table-empty"},pI={key:0},fI={key:1},mI={class:"paper-table-empty-actions"},hI={key:1,href:"/anonymize",class:"btn btn-ink"},vI={key:0,class:"dashboard-pagination"},gI={key:0,role:"alert"},yI=["disabled"];function El(e,t){let n=We("quota-usage"),r=be("field"),s=be("form");return l(),d("div",xT,[o("div",eA,[o("div",tA,[o("div",oA,[o("div",null,[t[27]||(t[27]=o("h1",{class:"paper-page-title"},"Projects",-1)),t[28]||(t[28]=o("p",{class:"paper-page-lede"},"Manage your anonymous links.",-1)),o("details",{class:"dashboard-quota",open:e.quotaExpanded,onToggle:t[1]||(t[1]=i=>e.quotaExpanded=i.target.open),onKeydown:t[2]||(t[2]=Ro(me(i=>e.closeQuota(),["prevent","stop"]),["esc"]))},[o("summary",{"aria-controls":"dashboard-usage","aria-expanded":e.quotaExpanded},[(l(),d("svg",{class:T(["quota-summary-ring",e.quota?"quota-"+e.quota.repository.level:""]),viewBox:"0 0 24 24","aria-hidden":"true"},[t[21]||(t[21]=o("circle",{class:"quota-ring-track",cx:"12",cy:"12",r:"9"},null,-1)),e.quota&&!e.quota.repository.unlimited?(l(),d("circle",{key:0,class:"quota-ring-fill",cx:"12",cy:"12",r:"9",pathLength:"100","stroke-dasharray":e.quota.repository.percent+" 100"},null,8,rA)):p("v-if",!0),e.quota?.repository.unlimited?(l(),d("path",iA)):p("v-if",!0)],2)),t[23]||(t[23]=o("span",{class:"quota-summary-label"},"Usage",-1)),e.quota?(l(),d("span",aA,[b(c(e.fmt.number(e.quota.repository.used)),1),e.quota.repository.unlimited?p("v-if",!0):(l(),d("span",lA," / "+c(e.fmt.number(e.quota.repository.total)),1)),t[22]||(t[22]=b(" repos",-1))])):p("v-if",!0),t[24]||(t[24]=o("svg",{class:"project-type-svg quota-summary-chevron","aria-hidden":"true"},[o("use",{href:"#project-icon-chevron"})],-1))],8,nA),o("div",dA,[o("div",uA,[t[26]||(t[26]=o("h2",null,"Account usage",-1)),o("button",{type:"button",class:"project-close","aria-label":"Close usage",onClick:t[0]||(t[0]=i=>e.closeQuota())},[...t[25]||(t[25]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])])]),e.quota?(l(),Lt(n,{key:0,quota:e.quota,fmt:e.fmt},null,8,["quota","fmt"])):(l(),d("p",cA,"Loading usage\u2026"))])],40,sA)]),t[29]||(t[29]=ce('',1))]),p(" Search + filters "),N((l(),d("form",{class:"w-100 dashboard-filter-row","aria-label":"Filter anonymizations","accept-charset":"UTF-8",onSubmit:t[9]||(t[9]=me(i=>e.submitForm(i,()=>{i.preventDefault()}),["prevent"]))},[o("div",pA,[N(o("input",fA,null,512),[[r,{state:e.viewState,set:i=>{e.search=i},value:e.search,form:null,options:{}}]])]),o("button",{class:"btn dashboard-filters-toggle",type:"button","aria-expanded":e.filtersExpanded,"aria-controls":"dashboard-filter-controls",onClick:t[3]||(t[3]=i=>e.filtersExpanded=!e.filtersExpanded)},[...t[30]||(t[30]=[b("Filters",-1),o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-filter"})],-1)])],8,mA),o("div",{id:"dashboard-filter-controls",class:T(["dashboard-filter-controls",{expanded:e.filtersExpanded}])},[o("div",hA,[o("button",{type:"button",class:T(["btn",{"btn-primary":e.typeFilter==="all"}]),onClick:t[4]||(t[4]=i=>e.typeFilter="all"),"aria-pressed":e.typeFilter==="all"},"All",10,vA),o("button",{type:"button",class:T(["btn dashboard-type-filter",{"btn-primary":e.typeFilter==="repo"}]),title:"Repositories",onClick:t[5]||(t[5]=i=>e.typeFilter="repo"),"aria-pressed":e.typeFilter==="repo"},[...t[31]||(t[31]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-type-repo"})],-1),o("span",{class:"type-filter-label"},"Repos",-1)])],10,gA),o("button",{type:"button",class:T(["btn dashboard-type-filter",{"btn-primary":e.typeFilter==="pr"}]),title:"Pull requests",onClick:t[6]||(t[6]=i=>e.typeFilter="pr"),"aria-pressed":e.typeFilter==="pr"},[...t[32]||(t[32]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-type-pr"})],-1),o("span",{class:"type-filter-label"},"PRs",-1)])],10,yA),o("button",{type:"button",class:T(["btn dashboard-type-filter",{"btn-primary":e.typeFilter==="gist"}]),title:"Gists",onClick:t[7]||(t[7]=i=>e.typeFilter="gist"),"aria-pressed":e.typeFilter==="gist"},[...t[33]||(t[33]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-type-gist"})],-1),o("span",{class:"type-filter-label"},"Gists",-1)])],10,bA)]),o("div",{id:"dashboard-extra-filters",class:T(["dashboard-extra-filters",{expanded:e.filtersExpanded}])},[o("div",wA,[o("button",kA,[t[35]||(t[35]=o("span",{class:"filter-btn-label"},"Sort",-1)),o("span",EA,c(e.sortLabel()),1),(l(),d("svg",{class:T(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[34]||(t[34]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)),o("span",CA,c(e.sortDesc()?"descending":"ascending"),1)]),o("div",_A,[t[36]||(t[36]=o("h6",{class:"dropdown-header"},"Order by",-1)),(l(!0),d(X,null,re(e.sortFields,(i,a,u)=>(l(),d("div",SA,[o("input",{class:"form-check-input",type:"radio",name:"sort",onClick:f=>e.setSort(a,i.defaultDesc),checked:e.isSortedBy(a),id:"sort-"+u},null,8,NA),o("label",{class:"form-check-label",for:"sort-"+u},c(i?.label),9,DA)]))),256)),t[37]||(t[37]=o("div",{class:"dropdown-divider"},null,-1)),o("button",{type:"button",class:"dropdown-item",onClick:t[8]||(t[8]=i=>e.toggleSortDirection())},c(e.sortDesc()?"Switch to ascending":"Switch to descending"),1)])]),o("div",RA,[o("button",TA,[t[38]||(t[38]=o("span",{class:"filter-btn-label"},"Status",-1)),e.hasHiddenStatus()?p("v-if",!0):(l(),d("span",AA,"All")),e.hasHiddenStatus()?(l(),d("span",OA,c(e.hiddenStatusCount())+" hidden",1)):p("v-if",!0)]),o("div",IA,[t[39]||(t[39]=o("h6",{class:"dropdown-header"},"Show statuses",-1)),(l(!0),d(X,null,re(e.statusKeyLabels,(i,a,u)=>(l(),d("div",PA,[N(o("input",{class:"form-check-input",type:"checkbox",id:"status-"+a},null,8,VA),[[r,{state:e.viewState,set:f=>{e.filters.status[a]=f},value:e.filters?.status[a],form:null,options:{}}]]),o("label",{class:"form-check-label",for:"status-"+a},c(i),9,qA)]))),256))])])],2)],2)],32)),[[s,e.viewState]]),p(" Result count + active filter chips "),e.loading?p("v-if",!0):(l(),d("div",MA,[o("div",LA,[o("button",{type:"button","aria-pressed":e.projectView==="all",onClick:t[10]||(t[10]=i=>e.setProjectView("all")),"aria-label":"All projects"},[...t[40]||(t[40]=[o("span",{class:"dashboard-view-long"},"All projects",-1),o("span",{class:"dashboard-view-short","aria-hidden":"true"},"All",-1)])],8,$A),o("button",{type:"button","aria-pressed":e.projectView==="attention",onClick:t[11]||(t[11]=i=>e.setProjectView("attention")),"aria-label":"Needs attention "+e.attentionCount()},[t[41]||(t[41]=o("span",{class:"dashboard-attention-prefix"},"Needs ",-1)),t[42]||(t[42]=o("span",null,"attention",-1)),t[43]||(t[43]=b()),o("span",{class:T(["attention-count",{"has-attention":e.attentionCount()>0}])},c(e.attentionCount()),3)],8,UA)]),o("span",FA,[(e.dashboardTotals?.filtered??e.filteredItems?.length)===(e.dashboardTotals?.total??e.items?.length)?(l(),d("span",zA,[b(c(e.fmt?.number(e.dashboardTotals?.total??e.items?.length))+" project",1),(e.dashboardTotals?.total??e.items?.length)!==1?(l(),d("span",HA,"s")):p("v-if",!0)])):(l(),d("span",BA,c(e.fmt?.number(e.dashboardTotals?.filtered??e.filteredItems?.length))+" of "+c(e.fmt?.number(e.dashboardTotals?.total??e.items?.length))+" shown",1))]),o("div",jA,[(l(!0),d(X,null,re(e.filters?.status,(i,a,u)=>(l(),d(X,null,[i===!1?(l(),d("button",{key:0,type:"button",class:"filter-chip",onClick:f=>e.filters.status[a]=!0,"aria-label":"Show "+e.statusKeyLabels[a]+" again",title:"Show "+e.statusKeyLabels[a]+" again"},[b(c(e.statusKeyLabels[a])+" hidden",1),t[44]||(t[44]=o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1))],8,GA)):p("v-if",!0)],64))),256)),e.typeFilter!=="all"?(l(),d("button",{key:0,type:"button",class:"filter-chip",onClick:t[12]||(t[12]=i=>e.typeFilter="all"),"aria-label":"Show all project types"},[b(c(e.typeFilter==="repo"?"Repositories":e.typeFilter==="pr"?"Pull requests":"Gists"),1),t[45]||(t[45]=o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1))])):p("v-if",!0),e.showClearFilters()?(l(),d("button",{key:1,type:"button",class:"btn-link-inline",onClick:t[13]||(t[13]=i=>e.clearFilters())},"Clear filters")):p("v-if",!0)])]))]),p(" Table "),o("div",{class:"paper-table paper-table-dashboard",role:"table","aria-label":"Anonymizations","aria-busy":e.loading},[o("div",KA,[o("div",{role:"columnheader","aria-sort":e.isSortedBy("_label")?e.sortDesc()?"descending":"ascending":"none"},[o("button",{type:"button",class:T(["sortable",{active:e.isSortedBy("_label")}]),onClick:t[14]||(t[14]=i=>e.setSort("_label"))},[t[47]||(t[47]=b(" Project ",-1)),e.isSortedBy("_label")?(l(),d("svg",{key:0,class:T(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[46]||(t[46]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,YA),o("div",{role:"columnheader","aria-sort":e.isSortedBy("status")?e.sortDesc()?"descending":"ascending":"none"},[o("button",{type:"button",class:T(["sortable",{active:e.isSortedBy("status")}]),onClick:t[15]||(t[15]=i=>e.setSort("status"))},[t[49]||(t[49]=b(" Status ",-1)),e.isSortedBy("status")?(l(),d("svg",{key:0,class:T(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[48]||(t[48]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,JA),o("div",{role:"columnheader",class:"num","aria-sort":e.isSortedBy("pageView")?e.sortDesc()?"descending":"ascending":"none"},[o("button",{type:"button",class:T(["sortable",{active:e.isSortedBy("pageView")}]),onClick:t[16]||(t[16]=i=>e.setSort("pageView"))},[t[51]||(t[51]=b(" Views ",-1)),e.isSortedBy("pageView")?(l(),d("svg",{key:0,class:T(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[50]||(t[50]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,QA),o("div",{role:"columnheader","aria-sort":e.isSortedBy("options.expirationDate")?e.sortDesc()?"descending":"ascending":"none"},[o("button",{type:"button",class:T(["sortable",{active:e.isSortedBy("options.expirationDate")}]),onClick:t[17]||(t[17]=i=>e.setSort("options.expirationDate"))},[t[53]||(t[53]=b(" Expires ",-1)),e.isSortedBy("options.expirationDate")?(l(),d("svg",{key:0,class:T(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[52]||(t[52]=[o("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,XA),t[54]||(t[54]=o("div",{role:"columnheader"},[o("span",{class:"sr-only"},"Actions")],-1))]),p(" Loading skeleton: keeps the layout stable while the three lists load "),(l(),d(X,null,re([1,2,3,4],(i,a)=>(l(),d(X,null,[e.loading?(l(),d("div",ZA,[...t[55]||(t[55]=[o("div",{class:"cell-anon",role:"cell"},[o("span",{class:"skeleton skeleton-badge"}),o("div",{class:"anon-text"},[o("span",{class:"skeleton skeleton-line",style:{width:"38%"}}),o("span",{class:"skeleton skeleton-line skeleton-line-sm",style:{width:"56%"}})])],-1),o("div",{class:"cell-status",role:"cell"},[o("span",{class:"skeleton skeleton-line",style:{width:"60%"}})],-1),o("div",{class:"cell-views num",role:"cell"},[o("span",{class:"skeleton skeleton-line",style:{width:"40%"}})],-1),o("div",{class:"cell-expires",role:"cell"},[o("span",{class:"skeleton skeleton-line",style:{width:"55%"}})],-1),o("div",{class:"cell-actions",role:"cell"},null,-1)])])):p("v-if",!0)],64))),64)),(l(!0),d(X,null,re(e.filteredItems,(i,a)=>(l(),d(X,{key:i?._type+":"+(i?._id||a)},[e.loading?p("v-if",!0):(l(),d("div",{key:0,class:T(["paper-table-row",{"repo-inactive":i?._statusKey=="expired"||i?._statusKey=="removed","repo-error":i?.status=="error","row-clickable":!!i?._viewUrl}]),role:"row",onClick:u=>e.openItem(i,u)},[o("div",eO,[o("span",{class:"project-type-icon",role:"img","aria-label":i?._type==="repo"?"Repository":i?._type==="pr"?"Pull request":"Gist",title:i?._type==="repo"?"Repository":i?._type==="pr"?"Pull request":"Gist"},[(l(),d("svg",oO,[o("use",{href:"#project-type-"+i._type},null,8,sO)]))],8,tO),o("div",nO,[o("div",rO,[i?._viewUrl?(l(),d("a",{key:0,class:"repo-name",title:i._label,textContent:c(i?._label),href:e.safeUrl(i?._viewUrl)},null,8,iO)):p("v-if",!0),i?._viewUrl?p("v-if",!0):(l(),d("span",{key:1,class:"repo-name repo-name-static",textContent:c(i?._label)},null,8,aO)),i?.role==="coauthor"?(l(),d("span",lO,"Co-author")):p("v-if",!0)]),o("div",dO,[i?._id?(l(),d("code",{key:0,class:"anonymous-id",title:i._id},c(i._id),9,uO)):p("v-if",!0),i?._type==="repo"&&i?.source?.commit?(l(),d("span",{key:1,class:"commit-hash",title:i.source.commit},c(i.source.commit.substring(0,8)),9,cO)):p("v-if",!0),i?.conference?(l(),d("span",{key:2,class:"cell-conf conf-tag",title:i?.conference},[t[56]||(t[56]=o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-conference"})],-1)),t[57]||(t[57]=b()),o("span",{textContent:c(i?.conference)},null,8,fO)],8,pO)):p("v-if",!0)])])]),o("div",mO,[o("div",hO,[o("div",vO,[o("span",{class:T(["status-dot","status-"+i?._statusKey]),"aria-hidden":"true"},null,2),o("span",{class:"status-word",textContent:c(e.fmt?.statusLabel(i?.status))},null,8,gO)]),i?.status=="error"&&i?.statusMessage?(l(),d("div",{key:0,class:"status-sub status-sub-error",textContent:c(e.fmt?.statusMsg(i?.statusMessage)),title:i?.statusMessage},null,8,yO)):p("v-if",!0),i?._stale?(l(),d("div",{key:1,class:"status-sub status-sub-warn",title:"Last activity "+e.fmt?.humanTime(i?.anonymizeDate||i?.lastView)}," Last activity "+c(e.fmt?.humanTime(i?.anonymizeDate||i?.lastView))+" \xB7 may be stuck ",9,bO)):p("v-if",!0),i.status==="error"&&i._editUrl?(l(),d("a",{key:2,class:"project-attention-action",href:e.safeUrl(i._editUrl)},"Fix source",8,wO)):p("v-if",!0),i._stale||i._broken?(l(),d("button",{key:3,type:"button",class:"project-attention-action",onClick:me(u=>e.showProjectDetails(i),["stop"])},c(i._broken?"Review details":"Check progress"),9,kO)):p("v-if",!0),i?.status!="error"&&!i?._stale&&i?.anonymizeDate?(l(),d("div",EO," anonymized "+c(e.fmt?.humanTime(i?.anonymizeDate)),1)):p("v-if",!0)]),o("div",{class:"cell-views num",role:"cell","aria-label":e.fmt.number(i.pageView)+" views"},[t[58]||(t[58]=o("svg",{class:"project-type-svg mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1)),o("span",null,c(e.fmt.number(i.pageView)),1)],8,CO),o("div",_O,[t[59]||(t[59]=o("svg",{class:"project-type-svg mobile-meta-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),i?._expiry?.kind==="never"?(l(),d("span",SO,"Never")):p("v-if",!0),i?._expiry?.kind==="date"?(l(),d("span",{key:1,textContent:c(e.fmt?.humanTime(i?._expiry?.date))},null,8,NO)):p("v-if",!0),i?._expiry?.kind==="expired"&&i?._expiry?.date?(l(),d("span",DO,"Expired "+c(e.fmt?.humanTime(i?._expiry?.date)),1)):p("v-if",!0),i?._expiry?.kind==="expired"&&!i?._expiry?.date?(l(),d("span",RO,"Expired")):p("v-if",!0),i?._expiry?.kind==="none"?(l(),d("span",TO,"\u2014")):p("v-if",!0)])]),o("div",AO,[i._viewUrl?(l(),d("button",{key:0,type:"button",class:"copy-link-inline",onClick:me(u=>e.copyLink(i),["stop"]),disabled:!!e.copyingId,title:"Copy anonymous link for "+i._label,"aria-label":"Copy anonymous link for "+i._label},[...t[60]||(t[60]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-copy"})],-1)])],8,OO)):p("v-if",!0),i._broken?(l(),d("button",{key:1,type:"button",class:"project-details-button",onClick:me(u=>e.showProjectDetails(i),["stop"]),"data-project-actions":encodeURIComponent(i._type+":"+i._id),"aria-controls":e.projectDetailsId(i),"aria-expanded":e.selectedProject===i},"Details",8,IO)):p("v-if",!0),i?._broken?p("v-if",!0):(l(),d("div",PO,[o("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","data-project-actions":encodeURIComponent(i._type+":"+i._id),"aria-label":"Actions for "+i?._name},[...t[61]||(t[61]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-more"})],-1)])],8,VO),o("div",qO,[o("button",{type:"button",class:"dropdown-item",onClick:u=>e.showProjectDetails(i),"aria-controls":e.projectDetailsId(i),"aria-expanded":e.selectedProject===i},"Project details & name",8,MO),o("a",{class:"dropdown-item",href:e.safeUrl(i?._viewUrl)}," View ",8,LO),i?._type==="repo"&&i?.options?.page&&i?.status=="ready"?(l(),d("a",{key:0,class:"dropdown-item",target:"_self",href:e.safeUrl("/w/"+i?.repoId+"/")}," View page ",8,$O)):p("v-if",!0),i?._viewUrl?(l(),d("button",{key:1,type:"button",class:"dropdown-item",onClick:u=>e.copyLink(i),disabled:!!e.copyingId}," Copy anonymous link ",8,UO)):p("v-if",!0),o("a",{class:"dropdown-item",href:e.safeUrl(i?._editUrl)}," Edit ",8,FO),i?.status=="ready"||i?.status=="error"?(l(),d("button",{key:2,type:"button",class:"dropdown-item",onClick:u=>e.refreshItem(i)}," Force update ",8,zO)):p("v-if",!0),i?.status=="removed"?(l(),d("button",{key:3,type:"button",class:"dropdown-item",onClick:u=>e.refreshItem(i)}," Enable ",8,HO)):p("v-if",!0),i?.status=="expired"?(l(),d("button",{key:4,type:"button",class:"dropdown-item",onClick:u=>e.extendItem(i)}," Extend 6 months ",8,BO)):p("v-if",!0),(i?.status=="ready"||i?.status=="expired"||i?.status=="error")&&i?.role!=="coauthor"?(l(),d("div",jO,[t[62]||(t[62]=o("div",{class:"dropdown-divider"},null,-1)),o("button",{type:"button",class:"dropdown-item dropdown-item-danger",onClick:u=>e.removeItem(i)}," Remove ",8,GO)])):p("v-if",!0)])]))])],10,xA)),!e.loading&&e.selectedProject===i?(l(),d("div",WO,[o("div",{class:"project-details",role:"cell","aria-colspan":"5",id:e.projectDetailsId(i),tabindex:"-1",onKeydown:Ro(me(u=>e.closeProjectDetails(i),["stop"]),["esc"])},[o("div",YO,[t[64]||(t[64]=o("h2",null,"Project details",-1)),o("button",{type:"button",class:"project-close",onClick:u=>e.closeProjectDetails(i),"aria-label":"Close project details"},[...t[63]||(t[63]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])],8,JO)]),o("dl",QO,[o("div",null,[t[65]||(t[65]=o("dt",null,"Source",-1)),o("dd",null,c(i._source||"Not available"),1)]),o("div",null,[t[66]||(t[66]=o("dt",null,"Anonymous ID",-1)),o("dd",null,[o("code",null,c(i._id||"Missing identifier"),1)])]),i.source?.commit?(l(),d("div",XO,[t[67]||(t[67]=o("dt",null,"Commit",-1)),o("dd",null,[o("code",null,c(i.source.commit),1)])])):p("v-if",!0),i.conference?(l(),d("div",ZO,[t[68]||(t[68]=o("dt",null,"Conference",-1)),o("dd",null,c(i.conference),1)])):p("v-if",!0),o("div",null,[t[69]||(t[69]=o("dt",null,"Status",-1)),o("dd",null,[b(c(e.fmt.statusLabel(i.status)),1),i.statusMessage?(l(),d("span",xO," \xB7 "+c(e.fmt.statusMsg(i.statusMessage)),1)):p("v-if",!0)])]),i.anonymizeDate?(l(),d("div",eI,[t[70]||(t[70]=o("dt",null,"Last anonymized",-1)),o("dd",null,c(e.fmt.humanTime(i.anonymizeDate)),1)])):p("v-if",!0)]),i._stale?(l(),d("p",tI,"This download has not progressed recently. Check the source access and selected branch before retrying.")):p("v-if",!0),i._editUrl?(l(),d("a",{key:1,class:"project-attention-action",href:e.safeUrl(i._editUrl)},c(e.needsAttention(i)?"Check source settings":"Edit anonymization settings"),9,oI)):p("v-if",!0),i._id?(l(),d("form",{key:2,class:"project-name-form",onSubmit:me(u=>e.saveProjectName(i),["prevent"])},[o("label",{for:"project-name-"+i._type+"-"+i._id},"Project name",8,nI),o("p",{id:"project-name-help-"+i._type+"-"+i._id},"Only you see this name. Leave it blank to use the default.",8,rI),o("div",iI,[N(o("input",{class:"form-control",type:"text",id:"project-name-"+i._type+"-"+i._id,"aria-describedby":"project-name-help-"+i._type+"-"+i._id,maxlength:"100","onUpdate:modelValue":t[18]||(t[18]=u=>e.projectName=u),disabled:e.nameSaving},null,8,aI),[[xi,e.projectName]]),o("button",{class:"btn btn-ink",type:"submit",disabled:e.nameSaving},c(e.nameSaving?"Saving\u2026":"Save name"),9,lI)]),e.nameError?(l(),d("p",dI,c(e.nameError),1)):p("v-if",!0),e.nameMessage?(l(),d("p",uI,c(e.nameMessage),1)):p("v-if",!0)],40,sI)):p("v-if",!0)],40,KO)])):p("v-if",!0)],64))),128)),!e.loading&&e.filteredItems?.length==0?(l(),d("div",cI,[t[72]||(t[72]=o("svg",{class:"project-type-svg project-empty-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1)),e.hasProjects()?p("v-if",!0):(l(),d("span",pI,"You have no anonymizations yet.")),e.hasProjects()?(l(),d("span",fI,"Nothing matches the current filters.")):p("v-if",!0),o("div",mI,[e.hasActiveFilters()?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[19]||(t[19]=i=>e.clearFilters())},"Clear filters")):p("v-if",!0),e.hasProjects()?p("v-if",!0):(l(),d("a",hI,[...t[71]||(t[71]=[o("svg",{class:"project-type-svg","aria-hidden":"true"},[o("use",{href:"#project-icon-plus"})],-1),b(" New anonymization",-1)])]))])])):p("v-if",!0)],8,WA)]),e.dashboardCursor||e.dashboardError?(l(),d("div",vI,[e.dashboardError?(l(),d("p",gI,c(e.dashboardError),1)):p("v-if",!0),e.dashboardCursor?(l(),d("button",{key:1,type:"button",class:"btn",onClick:t[20]||(t[20]=i=>e.loadMoreProjects()),disabled:e.loadingMore},c(e.loadingMore?"Loading\u2026":"Load more projects"),9,yI)):p("v-if",!0)])):p("v-if",!0)])}var bI={class:"explorer-page"},wI=["aria-label"],kI={class:"ui-icon","aria-hidden":"true"},EI=["href"],CI=["textContent"],_I={class:"leftCol-head"},SI={class:"leftCol-search"},NI={class:"tree-search-box"},DI=["href"],RI={type:"text",class:"tree-search-input",placeholder:"Search files","aria-label":"Search files"},TI={class:"leftCol-project-header"},AI=["textContent"],OI={class:"project-file-count"},II={class:"leftCol-body"},PI={key:0,class:"paper-inline-warning",role:"alert"},VI={key:1,class:"paper-inline-warning",role:"alert"},qI={class:"leftCol-foot"},MI=["title"],LI=["title"],$I=["title"],UI={key:2,class:"last-update",title:"Older repositories have no recorded publication date. The source commit date does not establish when files became available here."},FI={class:"explorer-main"},zI={class:"status-bar"},HI={class:"breadcrumb paths","aria-label":"Path"},BI=["textContent"],jI={class:"status-bar-actions"},GI=["href"],WI={class:"d-none d-md-inline"},KI={class:"ui-icon","aria-hidden":"true"},YI=["href"],JI={class:"d-none d-md-inline"},QI=["href"],XI=["href"],ZI=["href"],xI=["href"],e4={class:"explorer-content"};function Cl(e,t){let n=We("tree"),r=We("partial-view"),s=be("field");return l(),d("div",bI,[N(o("button",{class:"sidebar-toggle",onClick:t[0]||(t[0]=i=>e.sidebarCollapsed=!e.sidebarCollapsed),"aria-label":e.sidebarCollapsed?"Show files":"Hide files"},[(l(),d("svg",kI,[o("use",{href:e.sidebarCollapsed?"#ui-icon-folder":"#project-icon-close"},null,8,EI)])),o("span",{textContent:c(e.sidebarCollapsed?"Files":"Close")},null,8,CI)],8,wI),[[Y,e.files?.length]]),N(o("div",{class:T(["leftCol",{collapsed:e.sidebarCollapsed}])},[o("div",_I,[t[7]||(t[7]=o("span",{class:"leftCol-eyebrow"},"Files",-1)),o("button",{class:"leftCol-close","aria-label":"Close files",onClick:t[1]||(t[1]=i=>e.sidebarCollapsed=!0)},[...t[6]||(t[6]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-close"})],-1)])])]),o("div",SI,[o("div",NI,[(l(),d("svg",{class:T(["ui-icon tree-search-icon",{"fa-spin":e.fileSearchLoading}]),"aria-hidden":"true"},[o("use",{href:e.fileSearchLoading?"#ui-icon-spinner":"#ui-icon-search"},null,8,DI)],2)),N(o("input",RI,null,512),[[s,{state:e.viewState,set:i=>{e.fileSearchQuery=i},value:e.fileSearchQuery,form:null,options:{debounce:300},change:()=>{e.onFileSearchChange()}}]]),N(o("kbd",{class:"tree-search-kbd"},c(e.isMac?"\u2318":"Ctrl+")+"K",513),[[Y,!e.fileSearchQuery]]),N(o("button",{class:"tree-search-clear","aria-label":"Clear search",onClick:t[2]||(t[2]=i=>{e.fileSearchQuery="",e.onFileSearchChange()})},"\xD7",512),[[Y,e.fileSearchQuery]])])]),o("div",TI,[o("span",{class:"project-name",textContent:c(e.repoId)},null,8,AI),o("span",OI,c(e.fileCounts?.[""]||e.files?.length)+" files",1)]),o("div",II,[e.options?.truncatedFolders?.length>0?(l(),d("div",PI,[t[8]||(t[8]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),b(" "+c(e.fmt?.translate("WARNINGS.repo_truncated")),1)])):p("v-if",!0),e.options?.hasSubmodules?(l(),d("div",VI,[t[9]||(t[9]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})],-1)),b(" "+c(e.fmt?.translate("WARNINGS.submodules_not_included")),1)])):p("v-if",!0),Ce(n,{class:"files",file:e.files,"search-query":e.fileSearchQuery,"search-results":e.fileSearchResults,page:e.viewState},null,8,["file","search-query","search-results","page"])]),o("div",qI,[o("span",{class:"last-update",title:e.options?.sourceCommitDate||e.options?.anonymizedAt||e.options?.lastUpdateDate},c(e.options?.sourceCommitDate?"Source commit":e.options?.anonymizedAt?"Anonymized":"Updated")+" "+c(e.fmt?.date(e.options?.sourceCommitDate||e.options?.anonymizedAt||e.options?.lastUpdateDate)),9,MI),e.options?.settingsSavedAt?(l(),d("span",{key:0,class:"last-update",title:e.options.settingsSavedAt}," Settings saved "+c(e.fmt?.date(e.options.settingsSavedAt)),9,LI)):p("v-if",!0),e.options?.publishedAt?(l(),d("span",{key:1,class:"last-update",title:e.options.publishedAt}," Snapshot ready "+c(e.fmt?.date(e.options.publishedAt)),9,$I)):p("v-if",!0),e.options?.anonymizedAt&&!e.options?.publishedAt?(l(),d("span",UI," Snapshot ready date not recorded ")):p("v-if",!0)])],2),[[Y,e.files?.length]]),N(o("div",{class:"leftCol-backdrop",onClick:t[3]||(t[3]=i=>e.sidebarCollapsed=!0)},null,512),[[Y,e.files?.length&&!e.sidebarCollapsed]]),o("div",FI,[o("div",zI,[o("ol",HI,[(l(!0),d(X,null,re(e.paths,(i,a)=>(l(),d("li",{class:"breadcrumb-item",textContent:c(i)},null,8,BI))),256))]),o("div",jI,[e.options?.isAdmin||e.options?.isOwner?(l(),d("a",{key:0,class:"btn btn-sm","aria-label":"Edit",href:e.safeUrl("/anonymize/"+e.repoId)},[...t[10]||(t[10]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),o("span",{class:"d-none d-md-inline"}," Edit",-1)])],8,GI)):p("v-if",!0),e.type=="html-doc"&&!e.showSource?(l(),d("button",{key:1,class:T(["btn btn-sm",{"btn-active":e.allowScripts}]),"aria-label":"Allow this document to run JavaScript",title:"Scripts in this file are blocked by default. Enable them only if you trust the repository \u2014 the document stays isolated from your session either way.",onClick:t[4]||(t[4]=i=>e.toggleAllowScripts())},[t[11]||(t[11]=o("i",{class:"fab fa-js"},null,-1)),o("span",WI,c(e.allowScripts?"JS on":"JS off"),1)],2)):p("v-if",!0),e.type=="html-doc"?(l(),d("button",{key:2,class:"btn btn-sm","aria-label":"Toggle between the rendered document and its source",title:"Toggle between the rendered document and its source",onClick:t[5]||(t[5]=i=>e.toggleSource())},[(l(),d("svg",KI,[o("use",{href:e.showSource?"#project-icon-eye":"#ui-icon-code"},null,8,YI)])),o("span",JI,c(e.showSource?"Rendered":"Source"),1)])):p("v-if",!0),N(o("a",{target:"_self",class:"btn btn-sm","aria-label":"View raw current file",title:"View the raw content of the current file",href:e.safeUrl(e.url)},[...t[12]||(t[12]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-file"})],-1),o("span",{class:"d-none d-md-inline"}," Raw",-1)])],8,QI),[[Y,e.content!=null]]),N(o("a",{target:"_self",class:"btn btn-sm","aria-label":"Download current file",title:"Download the current file",href:e.safeUrl(e.url+"&download=true")},[...t[13]||(t[13]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-download"})],-1),o("span",{class:"d-none d-md-inline"}," Download",-1)])],8,XI),[[Y,e.content!=null]]),e.options?.download?(l(),d("a",{key:3,target:"_self",class:"btn btn-sm","aria-label":"Download full repository as ZIP",title:"Download the full repository as a ZIP archive",href:e.safeUrl("/api/repo/"+e.repoId+"/zip")},[...t[14]||(t[14]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-archive"})],-1),o("span",{class:"d-none d-md-inline"}," Full repo ZIP",-1)])],8,ZI)):p("v-if",!0),e.options?.hasWebsite?(l(),d("a",{key:4,target:"_self",class:"btn btn-sm","aria-label":"Website",href:e.safeUrl("/w/"+e.repoId+"/")},[...t[15]||(t[15]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-globe"})],-1),o("span",{class:"d-none d-md-inline"}," Website",-1)])],8,xI)):p("v-if",!0)])]),o("div",e4,[Ce(r,{name:"partials/pageView.htm",state:e.viewState},null,8,["state"])])])])}var t4={class:"paper-faq"};function _l(e,t){return l(),d("div",t4,[...t[0]||(t[0]=[ce('
Help

Answers to the questions that come up most.

If something's missing, write to us \u2014 report a bug on GitHub.

',1),o("div",{class:"paper-faq-body"},[o("aside",{class:"paper-faq-toc"},[o("div",{class:"paper-faq-toc-head"},"Contents"),o("nav",null,[o("a",{href:"#faq-general"},"General"),o("a",{href:"#faq-features"},"Features"),o("a",{href:"#faq-limitations"},"Limitations"),o("a",{href:"#faq-privacy"},"Privacy & Security"),o("a",{href:"#faq-hosting"},"Self-Hosting")])]),o("section",{class:"faq-section","aria-label":"FAQs"},[o("div",null,[p(" General "),o("h4",{class:"faq-cat"},[o("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})]),b("General ")]),o("div",{class:"panel-group",id:"faq-general",role:"tablist","aria-multiselectable":"true"},[o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingWhatIs"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#whatIs","aria-expanded":"false","aria-controls":"whatIs"}," What is Anonymous GitHub? ")])]),o("div",{id:"whatIs",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingWhatIs"},[o("div",{class:"panel-body p-3"},[o("p",null," Anonymous GitHub is a free, open-source tool that anonymizes GitHub repositories and pull requests for double-anonymous (double-blind) peer review. It replaces identifying information \u2014 such as the repository owner, organization name, and custom terms \u2014 so that reviewers cannot determine the identity of the authors through the code repository. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingHowWork"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#howWork","aria-expanded":"false","aria-controls":"howWork"}," How does Anonymous GitHub work? ")])]),o("div",{id:"howWork",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingHowWork"},[o("div",{class:"panel-body p-3"},[o("p",null," Anonymous GitHub either downloads the complete repository and anonymizes the content, or proxies requests to GitHub on the fly. In both cases, the original and anonymized versions of files are cached on the server. The system automatically detects and replaces the repository owner, organization name, and repository name. You can also specify additional custom terms to anonymize using one-per-line regex patterns. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingScope"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#scope","aria-expanded":"false","aria-controls":"scope"}," What is the scope of anonymization? ")])]),o("div",{id:"scope",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingScope"},[o("div",{class:"panel-body p-3"},[o("p",null," In double-anonymous peer review, the boundary of anonymization is the paper plus its online appendix \u2014 not the entire internet. Searching for any part of the paper or the online appendix can be considered a deliberate attempt to break anonymity. Anonymous GitHub anonymizes the repository owner, organization, repository name, file and directory names, and file contents across all text-based file types. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingCost"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#cost","aria-expanded":"false","aria-controls":"cost"}," How much does it cost? ")])]),o("div",{id:"cost",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingCost"},[o("div",{class:"panel-body p-3"},[o("p",null,[b(" Anonymous GitHub is completely free to use. However, the server costs hundreds of dollars per year to maintain. If you find the service useful, a small donation would be greatly appreciated. You can support the project by "),o("a",{href:"https://github.com/sponsors/tdurieux/",target:"_blank"},"sponsoring on GitHub"),b(", donating through "),o("a",{href:"https://ko-fi.com/tdurieux",target:"_blank"},"Ko-fi"),b(', or by clicking the "Support me" button on the site. ')])])])])]),p(" Features "),o("h4",{class:"faq-cat"},[o("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[o("use",{href:"#project-icon-filter"})]),b("Features ")]),o("div",{class:"panel-group",id:"faq-features",role:"tablist","aria-multiselectable":"true"},[o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingFormats"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#formats","aria-expanded":"false","aria-controls":"formats"}," Which file formats are supported? ")])]),o("div",{id:"formats",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingFormats"},[o("div",{class:"panel-body p-3"},[o("p",null," Anonymous GitHub can display and render a wide variety of file types: "),o("ul",null,[o("li",null,[o("strong",null,"Text and source code"),b(" \u2014 displayed with syntax highlighting")]),o("li",null,[o("strong",null,"Markdown"),b(" \u2014 rendered as formatted HTML")]),o("li",null,[o("strong",null,"Images"),b(" (PNG, JPG, SVG, etc.) \u2014 displayed inline")]),o("li",null,[o("strong",null,"PDFs"),b(" \u2014 rendered directly in the browser")]),o("li",null,[o("strong",null,"Jupyter Notebooks"),b(" \u2014 rendered with code cells and outputs")])]),o("p",null," Only text-based files are anonymized. Anonymous GitHub analyzes the content of each file to determine whether it is textual or binary. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingPR"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#pullRequests","aria-expanded":"false","aria-controls":"pullRequests"}," Can I anonymize pull requests? ")])]),o("div",{id:"pullRequests",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingPR"},[o("div",{class:"panel-body p-3"},[o("p",null," Yes. In addition to full repositories, Anonymous GitHub supports anonymizing individual pull requests. Simply paste the URL of a GitHub pull request when creating a new anonymized repository, and the system will automatically detect that it is a pull request and anonymize it accordingly. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingConference"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#conference","aria-expanded":"false","aria-controls":"conference"}," What is the Conference ID feature? ")])]),o("div",{id:"conference",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingConference"},[o("div",{class:"panel-body p-3"},[o("p",null," When creating an anonymized repository, you can associate it with a Conference ID. This allows conferences to define default anonymization settings (such as expiration dates) that are automatically applied to repositories submitted under that conference. If your conference provides a Conference ID, enter it during the anonymization setup. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingExpiration"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#expiration","aria-expanded":"false","aria-controls":"expiration"}," What happens when an anonymized repository expires? ")])]),o("div",{id:"expiration",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingExpiration"},[o("div",{class:"panel-body p-3"},[o("p",null," You can configure one of three expiration strategies when creating your anonymized repository: "),o("ul",null,[o("li",null,[o("strong",null,"Never expire"),b(" \u2014 the anonymized repository remains accessible indefinitely.")]),o("li",null,[o("strong",null,"Redirect to GitHub"),b(" \u2014 after expiration, visitors are redirected to the original GitHub repository.")]),o("li",null,[o("strong",null,"Remove content"),b(" \u2014 after expiration, the anonymized content is deleted from the server.")])])])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingDownload"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#download","aria-expanded":"false","aria-controls":"download"}," Can I download an anonymized repository? ")])]),o("div",{id:"download",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingDownload"},[o("div",{class:"panel-body p-3"},[o("p",null," Yes. Anonymized repositories can be downloaded as a ZIP file. This is useful if reviewers want to build or test the code locally. The downloaded archive contains the fully anonymized version of the repository. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingUpdates"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#updates","aria-expanded":"false","aria-controls":"updates"}," Are updates to the original repository reflected in the anonymized version? ")])]),o("div",{id:"updates",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingUpdates"},[o("div",{class:"panel-body p-3"},[o("p",null," Yes. The anonymized repository tracks the source on GitHub: when you push new commits to the original repository, the anonymized view picks up those changes (cached files are refreshed against GitHub). This means you can keep iterating on the code while reviewers have the link, and you do not need to recreate the anonymized repository every time you update the source. "),o("p",null," A few practical implications worth keeping in mind: "),o("ul",null,[o("li",null," You can safely create the anonymized repository early in the writing process \u2014 later commits will be visible to reviewers without any additional action. "),o("li",null," If you rename files, add new identifiers, or introduce new contributor names after creation, revisit the anonymization options (custom terms, file filters) to make sure the new content is still properly anonymized. "),o("li",null," If the original repository is made private or deleted, the anonymized repository will no longer be able to fetch updated content. ")])])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingCLI"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#cli","aria-expanded":"false","aria-controls":"cli"}," Is there a command-line tool? ")])]),o("div",{id:"cli",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingCLI"},[o("div",{class:"panel-body p-3"},[o("p",null," Yes. Anonymous GitHub provides a CLI tool that lets you anonymize repositories locally, generating an anonymized ZIP file on your machine. Install it via npm: "),o("pre",{style:{"background-color":"var(--hover-bg-color)",padding:"12px","border-radius":"4px","margin-top":"8px",color:"var(--color)"}},[o("code",null,`npm install -g @tdurieux/anonymous_github -anonymous_github`)])])])])]),p(" Limitations "),o("h4",{class:"faq-cat"},[o("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[o("use",{href:"#ui-icon-warning"})]),b("Limitations ")]),o("div",{class:"panel-group",id:"faq-limitations",role:"tablist","aria-multiselectable":"true"},[o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingLimitation"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-limitations",href:"#limitation","aria-expanded":"false","aria-controls":"limitation"}," What are the limitations of Anonymous GitHub? ")])]),o("div",{id:"limitation",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingLimitation"},[o("div",{class:"panel-body p-3"},[o("ul",null,[o("li",null," Anonymous GitHub only anonymizes text-based files. Binary files (compiled executables, archives, etc.) are served as-is without anonymization. "),o("li",null," Files larger than 8 MB are not supported. "),o("li",null," Static site generators (such as Jekyll) used with GitHub Pages are not fully supported, although Markdown files are converted to HTML. "),o("li",null," The anonymization of terms within source code may change the behavior of the program (e.g., if a replaced term appears in a string literal or identifier). ")])])])])]),p(" Privacy & Security "),o("h4",{class:"faq-cat"},[o("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})]),b("Privacy & Security ")]),o("div",{class:"panel-group",id:"faq-privacy",role:"tablist","aria-multiselectable":"true"},[o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingData"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-privacy",href:"#data","aria-expanded":"false","aria-controls":"data"}," How is my data handled? ")])]),o("div",{id:"data",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingData"},[o("div",{class:"panel-body p-3"},[o("p",null," Data stored on Anonymous GitHub is never shared or used for any purpose beyond providing the anonymization service. When a repository is removed or expires, only its configuration is retained \u2014 this makes it easy to restore the repository if needed and ensures that no future repository reuses the same ID. ")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingPermissions"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-privacy",href:"#permissions","aria-expanded":"false","aria-controls":"permissions"}," Why does GitHub say Anonymous GitHub asks for write access? ")])]),o("div",{id:"permissions",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingPermissions"},[o("div",{class:"panel-body p-3"},[o("p",null,[b("The GitHub App has read-only access to the repositories you choose. You can change repository access on your "),o("a",{href:"/connections"},"GitHub connections"),b(" page.")]),o("p",null,"Legacy GitHub OAuth includes write access to private repositories because GitHub's OAuth scopes do not offer a read-only option for them. Existing OAuth anonymizations and gists can still use this connection."),o("p",null,"Anonymous GitHub reads repository content. It never pushes, modifies, or deletes files on GitHub.")])])]),o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingViewer"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-privacy",href:"#viewer","aria-expanded":"false","aria-controls":"viewer"}," Can repository owners see who viewed their anonymized repository? ")])]),o("div",{id:"viewer",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingViewer"},[o("div",{class:"panel-body p-3"},[o("p",null," No. Only the total number of views is tracked as an incremental counter. It is not possible for the repository owner or for Anonymous GitHub to identify individual viewers. Reviewer anonymity is fully preserved. ")])])])]),p(" Self-Hosting "),o("h4",{class:"faq-cat"},[o("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[o("use",{href:"#project-icon-storage"})]),b("Self-Hosting ")]),o("div",{class:"panel-group",id:"faq-hosting",role:"tablist","aria-multiselectable":"true"},[o("div",{class:"panel panel-default mb-3"},[o("div",{class:"panel-heading p-3",role:"tab",id:"headingDeploy"},[o("h3",{class:"panel-title"},[o("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-hosting",href:"#deploy","aria-expanded":"false","aria-controls":"deploy"}," Can I deploy my own instance? ")])]),o("div",{id:"deploy",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingDeploy"},[o("div",{class:"panel-body p-3"},[o("p",null,[b(" Yes. Anonymous GitHub is fully open source (GPL-3.0) and supports Docker-based deployment. You will need to configure a GitHub OAuth app and provide a GitHub token. Detailed setup instructions are available on the "),o("a",{href:"https://github.com/tdurieux/anonymous_github/",target:"_blank"},"GitHub repository"),b(". ")]),o("p",null," The basic steps are: "),o("ol",null,[o("li",null,"Clone the repository and install dependencies"),o("li",null,[b("Create a "),o("code",null,".env"),b(" file with your GitHub token, OAuth client ID, and client secret")]),o("li",null,[b("Run "),o("code",null,"docker-compose up -d")])])])])])]),o("div",{class:"text-center mt-5 mb-5 p-4",style:{"background-color":"var(--hover-bg-color)","border-radius":"8px"}},[o("p",{class:"mb-2",style:{"font-size":"1.1rem"}}," Still have questions? "),o("p",{class:"text-muted mb-0"},[b(" Open an issue on the "),o("a",{href:"https://github.com/tdurieux/anonymous_github/issues",target:"_blank"},"GitHub repository"),b(" and we'll be happy to help. ")])])])])],-1)])])}var o4={class:"pr-page"},s4={class:"container paper-page pr-page-inner"},n4={class:"pr-header"},r4={class:"pr-title-row"},i4={class:"paper-page-title pr-title"},a4=["textContent"],l4={key:1,class:"text-muted"},d4=["href"],u4={class:"pr-header-meta"},c4={key:0,class:"pr-meta-item"},p4=["textContent"],f4={key:1,class:"pr-meta-item"},m4=["textContent"],h4={key:2,class:"pr-meta-item"},v4=["textContent"],g4={key:0,class:"paper-tabs",role:"tablist"},y4=["aria-selected","tabindex"],b4=["textContent"],w4=["aria-selected","tabindex"],k4=["textContent"],E4={class:"paper-tab-content"},C4={key:0,role:"tabpanel",id:"gist-files-panel","aria-labelledby":"gist-files-tab"},_4={class:"pr-comments"},S4={class:"pr-comment"},N4={class:"pr-comment-head"},D4=["textContent"],R4={key:0,class:"pr-comment-date"},T4={key:0,class:"paper-table-empty"},A4={key:1,role:"tabpanel",id:"gist-comments-panel","aria-labelledby":"gist-comments-tab"},O4={class:"pr-comments"},I4={class:"pr-comment"},P4={class:"pr-comment-head"},V4={key:0,class:"pr-comment-author"},q4=["textContent"],M4=["textContent"],L4={key:0,class:"pr-comment-body"},$4={key:0,class:"paper-table-empty"};function Sl(e,t){let n=We("gist-file"),r=We("markdown");return l(),d("div",o4,[o("div",s4,[t[17]||(t[17]=o("div",{class:"paper-crumbs"},[o("a",{href:"/dashboard"},"Reviewer"),b(" \xA0/\xA0 "),o("span",{class:"here"},"Gist")],-1)),o("header",n4,[o("div",r4,[o("h1",i4,[e.details?.description?(l(),d("span",{key:0,textContent:c(e.details?.description)},null,8,a4)):p("v-if",!0),e.details?.description?p("v-if",!0):(l(),d("span",l4,"Untitled gist"))]),e.options?.isAdmin||e.options?.isOwner?(l(),d("a",{key:0,class:"btn btn-sm","aria-label":"Edit",href:e.safeUrl("/gist-anonymize/"+e.gistId)},[...t[4]||(t[4]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),o("span",{class:"d-none d-md-inline"}," Edit",-1)])],8,d4)):p("v-if",!0)]),o("div",u4,[o("span",{class:T(["paper-pill",{good:e.details?.isPublic,warn:!e.details?.isPublic}])},c(e.details?.isPublic?"Public":"Secret"),3),e.details?.ownerLogin?(l(),d("span",c4,[t[5]||(t[5]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user"})],-1)),t[6]||(t[6]=b(" @",-1)),o("span",{textContent:c(e.details?.ownerLogin)},null,8,p4)])):p("v-if",!0),e.details?.updatedDate?(l(),d("span",f4,[t[7]||(t[7]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),t[8]||(t[8]=b()),o("span",{textContent:c(e.fmt?.date(e.details?.updatedDate))},null,8,m4)])):p("v-if",!0),e.details?.anonymizeDate?(l(),d("span",h4,[t[9]||(t[9]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1)),t[10]||(t[10]=b(" Anonymized ",-1)),o("span",{textContent:c(e.fmt?.date(e.details?.anonymizeDate))},null,8,v4)])):p("v-if",!0)])]),e.details?.files&&e.details?.files?.length||e.details?.comments&&e.details?.comments?.length?(l(),d("nav",g4,[e.details?.files?(l(),d("button",{key:0,class:T(["paper-tab",{active:e.tabState?.active=="files"}]),type:"button",role:"tab",id:"gist-files-tab","aria-selected":e.tabState?.active==="files","aria-controls":"gist-files-panel",tabindex:e.tabState?.active==="files"?0:-1,onKeydown:t[0]||(t[0]=s=>e.previewTabKeydown(s)),onClick:t[1]||(t[1]=s=>e.tabState.active="files")},[t[11]||(t[11]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-type-gist"})],-1)),o("span",{textContent:c(e.fmt.plural(e.details?.files?.length,{0:"No files",one:"1 file",other:"{} files"}))},null,8,b4)],42,y4)):p("v-if",!0),e.details?.comments?(l(),d("button",{key:1,class:T(["paper-tab",{active:e.tabState?.active=="comments"}]),type:"button",role:"tab",id:"gist-comments-tab","aria-selected":e.tabState?.active==="comments","aria-controls":"gist-comments-panel",tabindex:e.tabState?.active==="comments"?0:-1,onKeydown:t[2]||(t[2]=s=>e.previewTabKeydown(s)),onClick:t[3]||(t[3]=s=>e.tabState.active="comments")},[t[12]||(t[12]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-comment"})],-1)),o("span",{textContent:c(e.fmt.plural(e.details?.comments?.length,{0:"No comments",one:"1 comment",other:"{} comments"}))},null,8,k4)],42,w4)):p("v-if",!0)])):p("v-if",!0),o("div",E4,[e.details?.files&&e.tabState?.active=="files"?(l(),d("div",C4,[o("ul",_4,[(l(!0),d(X,null,re(e.details?.files,(s,i)=>(l(),d("li",S4,[o("div",N4,[o("strong",{textContent:c(s?.filename)},null,8,D4),s?.language?(l(),d("span",R4,c(s?.language),1)):p("v-if",!0)]),Ce(n,{file:s},null,8,["file"])]))),256)),e.details?.files?.length?p("v-if",!0):(l(),d("li",T4,[...t[13]||(t[13]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-file"})],-1),o("span",null,"No files in this gist.",-1)])]))])])):p("v-if",!0),e.details?.comments&&e.tabState?.active=="comments"?(l(),d("div",A4,[o("ul",O4,[(l(!0),d(X,null,re(e.details?.comments,(s,i)=>(l(),d("li",I4,[o("div",P4,[s?.author?(l(),d("span",V4,[t[14]||(t[14]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user"})],-1)),t[15]||(t[15]=b(" @",-1)),o("span",{textContent:c(s?.author)},null,8,q4)])):p("v-if",!0),s?.updatedDate?(l(),d("span",{key:1,class:"pr-comment-date",textContent:c(e.fmt?.date(s?.updatedDate))},null,8,M4)):p("v-if",!0)]),s?.body?(l(),d("div",L4,[Ce(r,{content:s?.body},null,8,["content"])])):p("v-if",!0)]))),256)),e.details?.comments?.length?p("v-if",!0):(l(),d("li",$4,[...t[16]||(t[16]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-comment"})],-1),o("span",null,"No comments on this gist.",-1)])]))])])):p("v-if",!0)])])])}var U4={class:"collapse navbar-collapse",id:"navbarSupportedContent"},F4={class:"navbar-nav mr-auto smooth-scroll"},z4={key:0,class:"nav-item"},H4={key:1,class:"nav-item"},B4={key:2,class:"nav-item"},j4={key:3,class:"nav-item"},G4={class:"nav-item"},W4={key:4,class:"nav-item"},K4={class:"navbar-nav"},Y4={key:0,class:"nav-item"},J4={key:1,class:"nav-item"},Q4={key:2,class:"nav-item"},X4={key:3,class:"nav-item dropdown user-chip-wrap"},Z4={class:"nav-link user-chip dropdown-toggle",href:"#",id:"navbarDropdownMenuLink",role:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},x4=["src"],e3={class:"user-chip-name"},t3={class:"dropdown-menu dropdown-menu-right user-menu","aria-labelledby":"navbarDropdownMenuLink"},o3={class:"dropdown-header"},s3=["innerHTML"];function Nl(e,t){return l(),d(X,null,[o("nav",{class:T(["navbar navbar-expand-lg",{"navbar-dark":e.isDarkMode}])},[t[13]||(t[13]=ce('Anonymous GitHubSupport',3)),o("div",U4,[o("ul",F4,[e.user?p("v-if",!0):(l(),d("li",z4,[o("a",{class:T(["nav-link",{active:e.path=="/"}]),href:"/"}," Home ",2)])),e.user?(l(),d("li",H4,[o("a",{class:T(["nav-link",{active:e.path=="/dashboard"}]),href:"/dashboard"},[...t[2]||(t[2]=[o("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-grid"})],-1),b(" My work ",-1)])],2)])):p("v-if",!0),e.user?(l(),d("li",B4,[o("a",{class:T(["nav-link",{active:e.path=="/anonymize"||e.path=="/pull-request-anonymize"}]),href:"/anonymize"},[...t[3]||(t[3]=[o("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1),b(" Anonymize ",-1)])],2)])):p("v-if",!0),e.user?(l(),d("li",j4,[o("a",{class:T(["nav-link",{active:e.path=="/conferences"}]),href:"/conferences"},[...t[4]||(t[4]=[o("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[o("use",{href:"#project-icon-conference"})],-1),b(" Conferences ",-1)])],2)])):p("v-if",!0),o("li",G4,[o("a",{class:T(["nav-link",{active:e.path=="/faq"}]),href:"/faq"},[...t[5]||(t[5]=[o("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-help"})],-1),b("FAQ",-1)])],2)]),e.user&&e.user?.isAdmin?(l(),d("li",W4,[o("a",{class:T(["nav-link",{active:e.path?.indexOf("/admin")===0}]),href:"/admin/"},[...t[6]||(t[6]=[o("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[o("use",{href:"#project-icon-filter"})],-1),b(" Admin ",-1)])],2)])):p("v-if",!0)]),o("ul",K4,[t[11]||(t[11]=o("li",{class:"nav-item"},[o("a",{class:"nav-link nav-icon",target:"_blank",href:"https://github.com/tdurieux/anonymous_github/",title:"Anonymous GitHub source code","aria-label":"Anonymous GitHub source code on GitHub",rel:"noopener","data-offset":"30"},[o("i",{class:"fab fa-github","aria-hidden":"true"})])],-1)),p(` "Report a bug" is about this service. Reviewers who land on an +`+JSON.stringify(t):""}`},[je.NAVIGATION_GUARD_REDIRECT]({from:e,to:t}){return`Redirected from "${e.fullPath}" to "${Fc(t)}" via a navigation guard.`},[je.NAVIGATION_ABORTED]({from:e,to:t}){return`Navigation aborted from "${e.fullPath}" to "${t.fullPath}" via a navigation guard.`},[je.NAVIGATION_CANCELLED]({from:e,to:t}){return`Navigation cancelled from "${e.fullPath}" to "${t.fullPath}" with a new navigation.`},[je.NAVIGATION_DUPLICATED]({from:e,to:t}){return`Avoided redundant navigation to current location: "${e.fullPath}".`}};function pn(e,t){return Oe(new Error,{type:e,[ka]:!0},t)}function Lt(e,t){return e instanceof Error&&ka in e&&(t==null||!!(e.type&t))}var Uc=["params","query","hash"];function Fc(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;let t={};for(let s of Uc)s in e&&(t[s]=e[s]);return JSON.stringify(t,null,2)}function Ea(e){let t={};if(e===""||e==="?")return t;let s=(e[0]==="?"?e.slice(1):e).split("&");for(let i=0;io&&Ys(o)):[i&&Ys(i)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function Ca(e){let t={};for(let s in e){let i=e[s];i!==void 0&&(t[s]=kt(i)?i.map(o=>o==null?null:""+o):i==null?i:""+i)}return t}var _a=Symbol(""),oi=Symbol(""),ts=Symbol(""),ns=Symbol(""),os=Symbol("");function On(){let e=[];function t(i){return e.push(i),()=>{let o=e.indexOf(i);o>-1&&e.splice(o,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function Yt(e,t,s,i,o,r=a=>a()){let a=i&&(i.enterCallbacks[o]=i.enterCallbacks[o]||[]);return()=>new Promise((c,f)=>{let v=m=>{m===!1?f(pn(je.NAVIGATION_ABORTED,{from:s,to:t})):m instanceof Error?f(m):Lc(m)?f(pn(je.NAVIGATION_GUARD_REDIRECT,{from:t,to:m})):(a&&i.enterCallbacks[o]===a&&typeof m=="function"&&a.push(m),c())},g=r(()=>e.call(i&&i.instances[o],t,s,v)),k=Promise.resolve(g);e.length<3&&(k=k.then(v)),k.catch(m=>f(m))})}function ss(e,t,s,i,o=r=>r()){let r=[];for(let a of e)for(let c in a.components){let f=a.components[c];if(!(t!=="beforeRouteEnter"&&!a.instances[c]))if(ra(f)){let v=(f.__vccOpts||f)[t];v&&r.push(Yt(v,s,i,a,c,o))}else{let v=f();r.push(()=>v.then(g=>{if(!g)throw new Error(`Couldn't resolve component "${c}" at "${a.path}"`);let k=wc(g)?g.default:g;a.mods[c]=g,a.components[c]=k;let m=(k.__vccOpts||k)[t];return m&&Yt(m,s,i,a,c,o)()}))}}return r}function Sa(e,t){let s=[],i=[],o=[],r=Math.max(t.matched.length,e.matched.length);for(let a=0;acn(v,c))?i.push(c):s.push(c));let f=e.matched[a];f&&(t.matched.find(v=>cn(v,f))||o.push(f))}return[s,i,o]}var Bc=()=>location.protocol+"//"+location.host;function Ma(e,t){let{pathname:s,search:i,hash:o}=t,r=e.indexOf("#");if(r>-1){let a=o.includes(e.slice(r))?e.slice(r).length:1,c=o.slice(a);return c[0]!=="/"&&(c="/"+c),Zs(c,"")}return Zs(s,e)+i+o}function zc(e,t,s,i){let o=[],r=[],a=null,c=({state:m})=>{let b=Ma(e,location),C=s.value,E=t.value,T=0;if(m){if(s.value=b,t.value=m,a&&a===C){a=null;return}T=E?m.position-E.position:0}else i(b);o.forEach(D=>{D(s.value,C,{delta:T,type:xo.pop,direction:T?T>0?es.forward:es.back:es.unknown})})};function f(){a=s.value}function v(m){o.push(m);let b=()=>{let C=o.indexOf(m);C>-1&&o.splice(C,1)};return r.push(b),b}function g(){if(document.visibilityState==="hidden"){let{history:m}=window;if(!m.state)return;m.replaceState(Oe({},m.state,{scroll:po()}),"")}}function k(){for(let m of r)m();r=[],window.removeEventListener("popstate",c),window.removeEventListener("pagehide",g),document.removeEventListener("visibilitychange",g)}return window.addEventListener("popstate",c),window.addEventListener("pagehide",g),document.addEventListener("visibilitychange",g),{pauseListeners:f,listen:v,destroy:k}}function Na(e,t,s,i=!1,o=!1){return{back:e,current:t,forward:s,replaced:i,position:window.history.length,scroll:o?po():null}}function Hc(e){let{history:t,location:s}=window,i={value:Ma(e,s)},o={value:t.state};o.value||r(i.value,{back:null,current:i.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function r(f,v,g){let k=e.indexOf("#"),m=k>-1?(s.host&&document.querySelector("base")?e:e.slice(k))+f:Bc()+e+f;try{t[g?"replaceState":"pushState"](v,"",m),o.value=v}catch(b){console.error(b),s[g?"replace":"assign"](m)}}function a(f,v){r(f,Oe({},t.state,Na(o.value.back,f,o.value.forward,!0),v,{position:o.value.position}),!0),i.value=f}function c(f,v){let g=Oe({},o.value,t.state,{forward:f,scroll:po()});r(g.current,g,!0),r(f,Oe({},Na(i.value,f,null),{position:g.position+1},v),!1),i.value=f}return{location:i,state:o,push:c,replace:a}}function $a(e){e=va(e);let t=Hc(e),s=zc(e,t.state,t.location,t.replace);function i(r,a=!0){a||s.pauseListeners(),history.go(r)}let o=Oe({location:"",base:e,go:i,createHref:ga.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}var hn=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({}),Ze=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Ze||{}),jc={type:hn.Static,value:""},Gc=/[a-zA-Z0-9_]/;function Wc(e){if(!e)return[[]];if(e==="/")return[[jc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(b){throw new Error(`ERR (${s})/"${v}": ${b}`)}let s=Ze.Static,i=s,o=[],r;function a(){r&&o.push(r),r=[]}let c=0,f,v="",g="";function k(){v&&(s===Ze.Static?r.push({type:hn.Static,value:v}):s===Ze.Param||s===Ze.ParamRegExp||s===Ze.ParamRegExpEnd?(r.length>1&&(f==="*"||f==="+")&&t(`A repeatable param (${v}) must be alone in its segment. eg: '/:ids+.`),r.push({type:hn.Param,value:v,regexp:g,repeatable:f==="*"||f==="+",optional:f==="*"||f==="?"})):t("Invalid state to consume buffer"),v="")}function m(){v+=f}for(;ct.length?t.length===1&&t[0]===rt.Static+rt.Segment?1:-1:0}function La(e,t){let s=0,i=e.score,o=t.score;for(;s0&&t[t.length-1]<0}var Xc={strict:!1,end:!0,sensitive:!1};function Zc(e,t,s){let i=Qc(Wc(e.path),s),o=Oe(i,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function xc(e,t){let s=[],i=new Map;t=Js(Xc,t);function o(k){return i.get(k)}function r(k,m,b){let C=!b,E=Aa(k);E.aliasOf=b&&b.record;let T=Js(t,k),D=[E];if("alias"in k){let F=typeof k.alias=="string"?[k.alias]:k.alias;for(let M of F)D.push(Aa(Oe({},E,{components:b?b.record.components:E.components,path:M,aliasOf:b?b.record:E})))}let O,q;for(let F of D){let{path:M}=F;if(m&&M[0]!=="/"){let z=m.record.path,se=z[z.length-1]==="/"?"":"/";F.path=m.record.path+(M&&se+M)}if(O=Zc(F,m,T),b?b.alias.push(O):(q=q||O,q!==O&&q.alias.push(O),C&&k.name&&!Oa(O)&&a(k.name)),Ua(O)&&f(O),E.children){let z=E.children;for(let se=0;se{a(q)}:An}function a(k){if(ti(k)){let m=i.get(k);m&&(i.delete(k),s.splice(s.indexOf(m),1),m.children.forEach(a),m.alias.forEach(a))}else{let m=s.indexOf(k);m>-1&&(s.splice(m,1),k.record.name&&i.delete(k.record.name),k.children.forEach(a),k.alias.forEach(a))}}function c(){return s}function f(k){let m=np(k,s);s.splice(m,0,k),k.record.name&&!Oa(k)&&i.set(k.record.name,k)}function v(k,m){let b,C={},E,T;if("name"in k&&k.name){if(b=i.get(k.name),!b)throw pn(je.MATCHER_NOT_FOUND,{location:k});T=b.record.name,C=Oe(Ta(m.params,b.keys.filter(q=>!q.optional).concat(b.parent?b.parent.keys.filter(q=>q.optional):[]).map(q=>q.name)),k.params&&Ta(k.params,b.keys.map(q=>q.name))),E=b.stringify(C)}else if(k.path!=null)E=k.path,b=s.find(q=>q.re.test(E)),b&&(C=b.parse(E),T=b.record.name);else{if(b=m.name?i.get(m.name):s.find(q=>q.re.test(m.path)),!b)throw pn(je.MATCHER_NOT_FOUND,{location:k,currentLocation:m});T=b.record.name,C=Oe({},m.params,k.params),E=b.stringify(C)}let D=[],O=b;for(;O;)D.unshift(O.record),O=O.parent;return{name:T,path:E,params:C,matched:D,meta:tp(D)}}e.forEach(k=>r(k));function g(){s.length=0,i.clear()}return{addRoute:r,resolve:v,removeRoute:a,clearRoutes:g,getRoutes:c,getRecordMatcher:o}}function Ta(e,t){let s={};for(let i of t)i in e&&(s[i]=e[i]);return s}function Aa(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:ep(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function ep(e){let t={},s=e.props||!1;if("component"in e)t.default=s;else for(let i in e.components)t[i]=typeof s=="object"?s[i]:s;return t}function Oa(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function tp(e){return e.reduce((t,s)=>Oe(t,s.meta),{})}function np(e,t){let s=0,i=t.length;for(;s!==i;){let r=s+i>>1;La(e,t[r])<0?i=r:s=r+1}let o=op(e);return o&&(i=t.lastIndexOf(o,i-1)),i}function op(e){let t=e;for(;t=t.parent;)if(Ua(t)&&La(e,t)===0)return t}function Ua({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Pa(e){let t=ut(ts),s=ut(ns),i=!1,o=null,r=ot(()=>{let g=Ht(e.to);return t.resolve(g)}),a=ot(()=>{let{matched:g}=r.value,{length:k}=g,m=g[k-1],b=s.matched;if(!m||!b.length)return-1;let C=b.findIndex(cn.bind(null,m));if(C>-1)return C;let E=Ia(g[k-2]);return k>1&&Ia(m)===E&&b[b.length-1].path!==E?b.findIndex(cn.bind(null,g[k-2])):C}),c=ot(()=>a.value>-1&&lp(s.params,r.value.params)),f=ot(()=>a.value>-1&&a.value===s.matched.length-1&&xs(s.params,r.value.params));function v(g={}){if(ap(g)){let k=t[Ht(e.replace)?"replace":"push"](Ht(e.to)).catch(An);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>k),k}return Promise.resolve()}return{route:r,href:ot(()=>r.value.href),isActive:c,isExactActive:f,navigate:v}}function sp(e){return e.length===1?e[0]:e}var ip=io({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Pa,setup(e,{slots:t}){let s=ze(Pa(e)),{options:i}=ut(ts),o=ot(()=>({[Va(e.activeClass,i.linkActiveClass,"router-link-active")]:s.isActive,[Va(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{let r=t.default&&sp(t.default(s));return e.custom?r:we("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},r)}}}),rp=ip;function ap(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function lp(e,t){for(let s in t){let i=t[s],o=e[s];if(typeof i=="string"){if(i!==o)return!1}else if(!kt(o)||o.length!==i.length||i.some((r,a)=>r.valueOf()!==o[a].valueOf()))return!1}return!0}function Ia(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}var Va=(e,t,s)=>e??t??s,dp=io({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){let i=ut(os),o=ot(()=>e.route||i.value),r=ut(oi,0),a=ot(()=>{let v=Ht(r),{matched:g}=o.value,k;for(;(k=g[v])&&!k.components;)v++;return v}),c=ot(()=>o.value.matched[a.value]);an(oi,ot(()=>a.value+1)),an(_a,c),an(os,o);let f=tt();return He(()=>[f.value,c.value,e.name],([v,g,k],[m,b,C])=>{g&&(g.instances[k]=v,b&&b!==g&&v&&v===m&&(g.leaveGuards.size||(g.leaveGuards=b.leaveGuards),g.updateGuards.size||(g.updateGuards=b.updateGuards))),v&&g&&(!b||!cn(g,b)||!m)&&(g.enterCallbacks[k]||[]).forEach(E=>E(v))},{flush:"post"}),()=>{let v=o.value,g=e.name,k=c.value,m=k&&k.components[g];if(!m)return qa(s.default,{Component:m,route:v});let b=k.props[g],C=b?b===!0?v.params:typeof b=="function"?b(v):b:null,T=we(m,Oe({},C,t,{onVnodeUnmounted:D=>{D.component.isUnmounted&&(k.instances[g]=null)},ref:f}));return qa(s.default,{Component:T,route:v})||T}}});function qa(e,t){if(!e)return null;let s=e(t);return s.length===1?s[0]:s}var si=dp;function Fa(e){let t=xc(e.routes,e),s=e.parseQuery||Ea,i=e.stringifyQuery||ni,o=e.history,r=On(),a=On(),c=On(),f=No(Qt),v=Qt;fn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");let g=Xo.bind(null,U=>""+U),k=Xo.bind(null,fa),m=Xo.bind(null,Tn);function b(U,ne){let x,ie;return ti(U)?(x=t.getRecordMatcher(U),ie=ne):ie=U,t.addRoute(ie,x)}function C(U){let ne=t.getRecordMatcher(U);ne&&t.removeRoute(ne)}function E(){return t.getRoutes().map(U=>U.record)}function T(U){return!!t.getRecordMatcher(U)}function D(U,ne){if(ne=Oe({},ne||f.value),typeof U=="string"){let h=Zo(s,U,ne.path),w=t.resolve({path:h.path},ne),R=o.createHref(h.fullPath);return Oe(h,w,{params:m(w.params),hash:Tn(h.hash),redirectedFrom:void 0,href:R})}let x;if(U.path!=null)x=Oe({},U,{path:Zo(s,U.path,ne.path).path});else{let h=Oe({},U.params);for(let w in h)h[w]==null&&delete h[w];x=Oe({},U,{params:k(h)}),ne.params=k(ne.params)}let ie=t.resolve(x,ne),ge=U.hash||"";ie.params=g(m(ie.params));let Ce=ha(i,Oe({},U,{hash:pa(ge),path:ie.path})),_=o.createHref(Ce);return Oe({fullPath:Ce,hash:ge,query:i===ni?Ca(U.query):U.query||{}},ie,{redirectedFrom:void 0,href:_})}function O(U){return typeof U=="string"?Zo(s,U,f.value.path):Oe({},U)}function q(U,ne){if(v!==U)return pn(je.NAVIGATION_CANCELLED,{from:ne,to:U})}function F(U){return se(U)}function M(U){return F(Oe(O(U),{replace:!0}))}function z(U,ne){let x=U.matched[U.matched.length-1];if(x&&x.redirect){let{redirect:ie}=x,ge=typeof ie=="function"?ie(U,ne):ie;return typeof ge=="string"&&(ge=ge.includes("?")||ge.includes("#")?ge=O(ge):{path:ge},ge.params={}),Oe({query:U.query,hash:U.hash,params:ge.path!=null?{}:U.params},ge)}}function se(U,ne){let x=v=D(U),ie=f.value,ge=U.state,Ce=U.force,_=U.replace===!0,h=z(x,ie);if(h)return se(Oe(O(h),{state:typeof h=="object"?Oe({},ge,h.state):ge,force:Ce,replace:_}),ne||x);let w=x;w.redirectedFrom=ne;let R;return!Ce&&ma(i,ie,x)&&(R=pn(je.NAVIGATION_DUPLICATED,{to:w,from:ie}),Ne(ie,ie,!0,!1)),(R?Promise.resolve(R):I(w,ie)).catch(P=>Lt(P)?Lt(P,je.NAVIGATION_GUARD_REDIRECT)?P:$e(P):re(P,w,ie)).then(P=>{if(P){if(Lt(P,je.NAVIGATION_GUARD_REDIRECT))return se(Oe({replace:_},O(P.to),{state:typeof P.to=="object"?Oe({},ge,P.to.state):ge,force:Ce}),ne||w)}else P=K(w,ie,!0,_,ge);return H(w,ie,P),P})}function oe(U,ne){let x=q(U,ne);return x?Promise.reject(x):Promise.resolve()}function S(U){let ne=Le.values().next().value;return ne&&typeof ne.runWithContext=="function"?ne.runWithContext(U):U()}function I(U,ne){let x,[ie,ge,Ce]=Sa(U,ne);x=ss(ie.reverse(),"beforeRouteLeave",U,ne);for(let h of ie)h.leaveGuards.forEach(w=>{x.push(Yt(w,U,ne))});let _=oe.bind(null,U,ne);return x.push(_),Ue(x).then(()=>{x=[];for(let h of r.list())x.push(Yt(h,U,ne));return x.push(_),Ue(x)}).then(()=>{x=ss(ge,"beforeRouteUpdate",U,ne);for(let h of ge)h.updateGuards.forEach(w=>{x.push(Yt(w,U,ne))});return x.push(_),Ue(x)}).then(()=>{x=[];for(let h of Ce)if(h.beforeEnter)if(kt(h.beforeEnter))for(let w of h.beforeEnter)x.push(Yt(w,U,ne));else x.push(Yt(h.beforeEnter,U,ne));return x.push(_),Ue(x)}).then(()=>(U.matched.forEach(h=>h.enterCallbacks={}),x=ss(Ce,"beforeRouteEnter",U,ne,S),x.push(_),Ue(x))).then(()=>{x=[];for(let h of a.list())x.push(Yt(h,U,ne));return x.push(_),Ue(x)}).catch(h=>Lt(h,je.NAVIGATION_CANCELLED)?h:Promise.reject(h))}function H(U,ne,x){c.list().forEach(ie=>S(()=>ie(U,ne,x)))}function K(U,ne,x,ie,ge){let Ce=q(U,ne);if(Ce)return Ce;let _=ne===Qt,h=fn?history.state:{};x&&(ie||_?o.replace(U.fullPath,Oe({scroll:_&&h&&h.scroll},ge)):o.push(U.fullPath,ge)),f.value=U,Ne(U,ne,x,_),$e()}let X;function Y(){X||(X=o.listen((U,ne,x)=>{if(!qe.listening)return;let ie=D(U),ge=z(ie,qe.currentRoute.value);if(ge){se(Oe(ge,{replace:!0,force:!0}),ie).catch(An);return}v=ie;let Ce=f.value;fn&&ba(ei(Ce.fullPath,x.delta),po()),I(ie,Ce).catch(_=>Lt(_,je.NAVIGATION_ABORTED|je.NAVIGATION_CANCELLED)?_:Lt(_,je.NAVIGATION_GUARD_REDIRECT)?(se(Oe(O(_.to),{force:!0}),ie).then(h=>{Lt(h,je.NAVIGATION_ABORTED|je.NAVIGATION_DUPLICATED)&&!x.delta&&x.type===xo.pop&&o.go(-1,!1)}).catch(An),Promise.reject()):(x.delta&&o.go(-x.delta,!1),re(_,ie,Ce))).then(_=>{_=_||K(ie,Ce,!1),_&&(x.delta&&!Lt(_,je.NAVIGATION_CANCELLED)?o.go(-x.delta,!1):x.type===xo.pop&&Lt(_,je.NAVIGATION_ABORTED|je.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),H(ie,Ce,_)}).catch(An)}))}let ee=On(),ce=On(),le;function re(U,ne,x){$e(U);let ie=ce.list();return ie.length?ie.forEach(ge=>ge(U,ne,x)):console.error(U),Promise.reject(U)}function Se(){return le&&f.value!==Qt?Promise.resolve():new Promise((U,ne)=>{ee.add([U,ne])})}function $e(U){return le||(le=!U,Y(),ee.list().forEach(([ne,x])=>U?x(U):ne()),ee.reset()),U}function Ne(U,ne,x,ie){let{scrollBehavior:ge}=e;if(!fn||!ge)return Promise.resolve();let Ce=!x&&wa(ei(U.fullPath,0))||(ie||!x)&&history.state&&history.state.scroll||null;return Ye().then(()=>ge(U,ne,Ce)).then(_=>_&&ya(_)).catch(_=>re(_,U,ne))}let ke=U=>o.go(U),Ee,Le=new Set,qe={currentRoute:f,listening:!0,addRoute:b,removeRoute:C,clearRoutes:t.clearRoutes,hasRoute:T,getRoutes:E,resolve:D,options:e,push:F,replace:M,go:ke,back:()=>ke(-1),forward:()=>ke(1),beforeEach:r.add,beforeResolve:a.add,afterEach:c.add,onError:ce.add,isReady:Se,install(U){U.component("RouterLink",rp),U.component("RouterView",si),U.config.globalProperties.$router=qe,Object.defineProperty(U.config.globalProperties,"$route",{enumerable:!0,get:()=>Ht(f)}),fn&&!Ee&&f.value===Qt&&(Ee=!0,F(o.location).catch(ie=>{}));let ne={};for(let ie in Qt)Object.defineProperty(ne,ie,{get:()=>f.value[ie],enumerable:!0});U.provide(ts,qe),U.provide(ns,Wn(ne)),U.provide(os,f);let x=U.unmount;Le.add(U),U.unmount=function(){Le.delete(U),Le.size<1&&(v=Qt,X&&X(),X=null,f.value=Qt,Ee=!1,le=!1),x()}}};function Ue(U){return U.reduce((ne,x)=>ne.then(()=>S(x)),Promise.resolve())}return qe}function Ba(e){return ut(ns)}var is=new WeakMap;function ii(e){if(!is.has(e)){let t=e.get("/api/billing/").finally(()=>is.delete(e));is.set(e,t)}return is.get(e)}function rs(e,t,s=()=>{},i={}){let o=new URLSearchParams(window.location.search).get("billing");e.billing=null,e.billingLoading=!0,e.billingBusy=!1,e.billingError="",e.billingNotice="",e.billingPending=o==="success"||o==="portal",e.billingRepository="";let r={billing_invalid_draft:"This draft could not be saved. Your form is unchanged. Try again.",billing_draft_not_found:"This checkout draft is unavailable or expired. Your local form is unchanged.",billing_recovery_required:"Your earlier payment needs verification. Please contact support before paying again.",billing_checkout_disabled:"New purchases are temporarily unavailable. You can still manage existing billing.",billing_unavailable:"Payments are not available yet. Please try again later.",billing_subscription_exists:"You already have a subscription. Use Manage billing to change or cancel it.",billing_checkout_in_progress:"You have another checkout open. Complete it or wait for it to expire before choosing a different plan.",billing_busy:"Another billing request is processing. Please try again shortly.",billing_already_paid:"This repository or conference already has an active paid package.",billing_invalid_review_window:"Conference packages cover up to 180 days. Check the review dates.",billing_invalid_conference:"Only a conference owner can pay for a conference awaiting payment.",repo_not_found:"Enter the ID of an existing repository that you own."};e.billingPrice=f=>f.amount==null?"Price shown at checkout":new Intl.NumberFormat(void 0,{style:"currency",currency:f.currency}).format(f.amount/100)+(f.interval?` / ${f.intervalCount>1?f.intervalCount+" ":""}${f.interval}`:" once"),e.billingBytes=f=>{let v=Number(f)||0;if(v<1024)return`${v} B`;let g=Math.min(4,Math.floor(Math.log2(v)/10));return`${new Intl.NumberFormat(void 0,{maximumFractionDigits:1}).format(v/1024**g)} ${["B","KiB","MiB","GiB","TiB"][g]}`},e.billingDate=f=>f?new Date(f).toLocaleDateString():"",e.loadBilling=()=>(e.billingError="",e.billingLoading=!0,ii(t).then(f=>{e.billing=f.data,e.emit?.("billing:updated",f.data)}).catch(()=>{e.billingError="Billing could not be loaded. Try again."}).finally(()=>{e.billingLoading=!1}));async function a(f,v,g=!0){if(!(e.billingBusy||!e.billing?.csrf)){e.billingBusy=!0,e.billingError="";try{let k=await t.post(`/api/billing/${f}`,v,{headers:{"x-csrf-token":e.billing.csrf}});if(g)window.location.assign(k.data.url);else return await e.loadBilling(),await s(),e.billingPending=!!k.data.pending,e.emit?.("billing:pending",e.billingPending),e.billingNotice=k.data.pending?"Your payment is still pending. Please do not pay again.":i.confirmedMessage||"Billing status refreshed. Your confirmed access appears below.",k.data}catch(k){e.billingError=r[k.data?.error]||"The billing request failed. Please try again."}finally{e.billingBusy=!1}}}e.checkout=(f,v="",g={})=>a("checkout",{planId:f,target:v,...g}),e.billingPortal=()=>a("portal",{}),e.refreshBilling=()=>a("refresh",{},!1);async function c(){for(let f=0;f<5;f++){let v=await e.refreshBilling();if(!v||!v.pending)return;await new Promise(g=>window.setTimeout(g,3e3))}e.billingNotice="Confirmation is taking longer than usual. You can refresh payment status later. Please do not pay again."}e.loadBilling().then(()=>{o==="success"||o==="portal"?(e.billingNotice="Checking your payment. Paid access starts after confirmation.",c()):o==="cancelled"&&(e.billingNotice="Checkout was closed. No new paid access has been activated.")})}function za(e,t){return t?.split(".").reduce((s,i)=>s?.[i],e)}function ri(e=null,t=new Map){let s=ze({}),i=[],o=!1,r=new Proxy(s,{get(a,c){return typeof c=="string"&&c.startsWith("__v_")||Reflect.has(a,c)?Reflect.get(a,c):e?.[c]}});return Object.defineProperty(s,"parent",{value:e,configurable:!0}),Object.defineProperty(s,"viewState",{get:()=>r}),r.watch=(a,c,f=!1,v=!0)=>{let g=typeof a=="function"?()=>a(r):()=>za(r,a),k=He(g,c,{deep:f,flush:"post"});return i.push(k),v&&Ye(()=>{o||c(g(),g())}),k},r.watchGroup=(a,c,f=!0)=>r.watch(()=>a.map(v=>za(r,v)),c,!0,f),r.on=(a,c)=>{if(a==="dispose")return i.push(c),()=>{};t.has(a)||t.set(a,new Set),t.get(a).add(c);let f=()=>t.get(a)?.delete(c);return i.push(f),f},r.emit=(a,...c)=>{for(let f of[...t.get(a)||[]])f({},...c)},r.dispose=()=>{o=!0,i.splice(0).reverse().forEach(a=>a())},jn(r.dispose),r}function ct(){let e=new Set,t=new Set,s=!1,i=(r,a=0)=>{if(s)return;let c=setTimeout(()=>{e.delete(c),r()},a);return e.add(c),c};i.cancel=r=>{clearTimeout(r),e.delete(r)};let o=(r,a)=>{if(s)return;let c=setInterval(r,a);return t.add(c),c};return o.cancel=r=>{clearInterval(r),t.delete(r)},jn(()=>{s=!0,e.forEach(clearTimeout),t.forEach(clearInterval)}),{timeout:i,interval:o}}function Jt(){let e=new Set;return jn(()=>{e.forEach(t=>t()),e.clear()}),(t,s,i,o)=>{t.addEventListener(s,i,o);let r=()=>{t.removeEventListener(s,i,o),e.delete(r)};return e.add(r),r}}function ai(e,t,s){let i,o=!1,r="form-draft:"+s,a=()=>Object.fromEntries(t.map(m=>[m,e[m]])),c=()=>JSON.stringify(a()),f=m=>{for(let b of t)Object.prototype.hasOwnProperty.call(m,b)&&(e[b]=m[b]);e.options?.expirationDate&&(e.options.expirationDate=new Date(e.options.expirationDate))},v=()=>{try{window.sessionStorage.removeItem(r)}catch{}},g=(m=!1)=>{if(i!==void 0){if(m&&document.querySelectorAll("input, select, textarea").forEach(b=>{b._field?.binding.state===e&&b._field.timer&&b._field.commit()}),e.unsavedChanges=c()!==i,e.draftSaved=!1,!e.unsavedChanges){v();return}try{window.sessionStorage.setItem(r,JSON.stringify({account:e.user?.username||null,savedAt:Date.now(),values:a()})),e.draftSaved=!0}catch{}}},k=()=>g(!0);return e.on("routeLeave",k),window.addEventListener("beforeunload",k),e.on("dispose",()=>window.removeEventListener("beforeunload",k)),{restore(){i=c();let m;try{m=JSON.parse(window.sessionStorage.getItem(r)||"null")}catch{}let b=m&&m.account===(e.user?.username||null)&&Date.now()-m.savedAt<30*6e4&&m.values;return b&&(f(m.values),e.draftRestored=!0),o||(o=!0,e.watch(()=>a(),()=>g(),!0)),e.unsavedChanges=c()!==i,!!b},checkpoint(){return document.querySelectorAll("input, select, textarea").forEach(m=>{m._field?.binding.state===e&&m._field.timer&&m._field.commit()}),JSON.parse(c())},accept(m){i=JSON.stringify(m),e.draftRestored=!1,g()},discard(){document.querySelectorAll("input, select, textarea").forEach(m=>{m._field?.binding.state!==e||!m._field.timer||(clearTimeout(m._field.timer),m._field.timer=null,m.value=m._field.binding.value??"")}),i!==void 0&&f(JSON.parse(i)),e.draftRestored=!1,g()},clear(){i=c(),e.unsavedChanges=!1,e.draftRestored=!1,e.draftSaved=!1,v()}}}function up(e){if(!["ArrowLeft","ArrowRight","Home","End"].includes(e.key))return;let t=[...e.currentTarget.closest('[role="tablist"]').querySelectorAll('[role="tab"]')],s=t.indexOf(e.currentTarget),i=e.key==="Home"?0:e.key==="End"?t.length-1:(s+(e.key==="ArrowRight"?1:-1)+t.length)%t.length;e.preventDefault(),t[i]?.focus(),t[i]?.click()}var Ha=function(e,t,s,i){e.previewTabKeydown=up,e.headerCanUpgrade=!1,e.headerBillingPending=["success","portal"].includes(new URLSearchParams(window.location.search).get("billing"));let o=v=>{let g=(v?.grants||[]).some(k=>["author_monthly","author_annual"].includes(k.planId)&&["active","paid","past_due"].includes(k.status)&&new Date(k.until).getTime()>Date.now());e.headerCanUpgrade=!!v?.enabled&&v.checkoutEnabled!==!1&&!g&&(v.plans||[]).some(k=>["author_monthly","author_annual"].includes(k.id))};e.on("billing:updated",(v,g)=>o(g)),e.on("billing:pending",(v,g)=>{e.headerBillingPending=g}),e.openHeaderUpgrade=()=>{s.path()==="/profile"?e.emit("settings:upgrade"):s.url("/profile?upgrade=1")},e.title="Main",e.user={status:"connection"},e.site_options,e.toasts=[],e.removeToast=function(v){let g=e.toasts.indexOf(v);g!==-1&&e.toasts.splice(g,1)},e.addToast=function(v){return e.toasts.push(v),i(function(){e.removeToast(v)},8e3),v},e.path=s.url(),e.paths=s.path().substring(1).split("/"),e.darkMode=function(v){localStorage.setItem("darkMode",v),e.isDarkMode=v;let g="/css/prism-okaidia.css",k="/css/prism.css";if(v){$("body").addClass("dark-mode");let b=document.createElement("link");b.href=g,b.rel="stylesheet",document.head.append(b),$(`link[href='${k}']`).remove()}else{$("body").removeClass("dark-mode");let b=document.createElement("link");b.href=k,b.rel="stylesheet",document.head.append(b),$(`link[href='${g}']`).remove()}let m=document.querySelector("[class*='floatingchat-container-wrap'] [class*='floating-chat-kofi-text-container-wrap']");m&&(m.style.backgroundColor=v?"#FAF9F6":"#1A1815",m.style.color=v?"#1A1815":"#FAF9F6"),e.emit("dark-mode",v)},e.darkMode(localStorage.getItem("darkMode")=="true");function r(){t.get("/api/user").then(v=>{v&&(e.user=v.data),e.user?.username&&ii(t).then(g=>o(g.data)).catch(()=>{})},()=>{e.user=null})}r();function a(){t.get("/api/options").then(v=>{v&&(e.site_options=v.data)},()=>{e.site_options=null})}a();function c(){t.get("/api/message").then(v=>{v&&(e.generalMessage=v.data)},()=>{e.generalMessage=null})}c();function f(v,g){g&&(e.title=g.title),e.path=s.url(),e.paths=s.path().substring(1).split("/")}e.on("routeChange",f),e.on("routeUpdate",f)},ja=function(e,t){let s=Jt(),i=ct(),o=()=>{let r=window.location.hash.slice(1),a=document.getElementById(r);if(!a?.classList.contains("panel-collapse"))return;$(a).collapse("show");let c=document.getElementById(a.getAttribute("aria-labelledby"));c?.setAttribute("tabindex","-1"),c?.focus({preventScroll:!0}),c?.scrollIntoView?.({block:"start"})};e.on("routeUpdate",()=>i.timeout(o,0)),s(window,"hashchange",o),i.timeout(o,0)},Ga=function(e,t,s,i,o){e.settingsTab=/(?:billing|upgrade)=/.test(window.location.search)?"billing":"defaults",e.confirmDeleteAccount=!1,e.deleteUsername="",e.profilePastSubscription=()=>!e.profileAuthorGrant()&&(e.billing?.grants||[]).some(f=>["author_monthly","author_annual"].includes(f.planId)),e.showAuthorPlans=new URLSearchParams(window.location.search).get("upgrade")==="1",e.showRepositoryPass=!1,e.profilePlan="author_monthly",e.openProfileUpgrade=()=>{e.settingsTab="billing",e.showAuthorPlans=!0,Ye(()=>document.getElementById("settings-plan-comparison")?.focus())},e.on("settings:upgrade",()=>e.openProfileUpgrade()),e.profileAuthorPlans=()=>(e.billing?.plans||[]).filter(f=>["author_monthly","author_annual"].includes(f.id)),e.profileSelectedPlan=()=>e.profileAuthorPlans().find(f=>f.id===e.profilePlan)||e.profileAuthorPlans()[0],e.profilePassPlan=()=>(e.billing?.plans||[]).find(f=>f.id==="author_pass"),e.profileAuthorGrant=()=>(e.billing?.grants||[]).find(f=>["author_monthly","author_annual"].includes(f.planId)&&["active","paid","past_due"].includes(f.status)&&new Date(f.until).getTime()>Date.now()),e.profileGrantName=f=>({author_monthly:"Author monthly",author_annual:"Author annual",author_pass:"Repository pass",conference:"Conference hosting"})[f.planId]||f.planId,rs(e,t,()=>o.load().then(f=>{e.quota=f},console.error)),e.terms="",e.options={expirationMode:"remove",update:!1,image:!0,pdf:!0,notebook:!0,loc:!0,link:!0},e.saving=!1,e.message=null,e.error=null,o.load().then(f=>{e.quota=f},console.error);let r=ai(e,["terms","options"],"profile");e.discardDraft=()=>r.discard();function a(){t.get("/api/user/default").then(f=>{let v=f.data||{};v.terms&&(e.terms=v.terms.join(` +`)),e.options=Object.assign({},e.options,v.options),r.restore()})}a();let c=null;e.saveDefault=f=>{if(f&&f.preventDefault&&f.preventDefault(),e.saving)return;let v=r.checkpoint(),g={terms:e.terms.split(` +`).map(k=>k.trim()).filter(k=>k.length>0),options:e.options};e.saving=!0,e.error=null,t.post("/api/user/default",g).then(()=>{r.accept(v),e.saving=!1,e.message=e.unsavedChanges?null:"Saved",c&&i.cancel(c),c=i(()=>{e.message=null},2500)},k=>{e.saving=!1;let b="ERRORS."+(k&&k.data&&k.data.error);s(b).then(C=>{e.error=C&&C!==b?C:"Unable to save your defaults. Please try again."},()=>{e.error="Unable to save your defaults. Please try again."})})},e.deleteAccount=()=>{e.deletingAccount||!e.confirmDeleteAccount||e.deleteUsername!==e.user?.username||(e.deletingAccount=!0,t.delete("/api/user").then(()=>{window.location.href="/"},()=>{e.deletingAccount=!1,e.deleteError="Unable to delete the account. Please try again."}))}},Wa=function(e,t,s){e.repoId=null,e.repoUrl=null,e.claim=()=>{t.post("/api/repo/claim",{repoId:e.repoId,repoUrl:e.repoUrl}).then(i=>{s.url("/dashboard")},i=>{e.error=i.data,e.claimForm.repoUrl.setValidity("not_found",!1),e.claimForm.repoId.setValidity("not_found",!1)})}},Ka=function(e,t,s,i,o){e.user&&!e.user.status&&s.url("/dashboard"),e.watch("user.status",()=>{e.user&&!e.user.status&&s.url("/dashboard")}),e.features=[{key:"anonymize",num:"01",eyebrow:"Anonymize",title:"Double-anonymous,",accent:"your rules.",text:"Choose what reviewers may see: links, images, PDFs, notebooks, GitHub Pages. Add your own terms, with regex if you need it, and pick the expiration date.",cta:"Start an anonymization",href:"/anonymize",url:"anonymous.4open.science/anonymize",img:"/imgs/anonymize.png",alt:"The anonymize form: source repository, terms to redact, options and a live README preview"},{key:"review",num:"02",eyebrow:"Review",title:"Reviewers browse",accent:"the real thing.",text:"Highlighted source code, rendered PDFs, images, and notebooks, in a familiar file explorer. GitHub Pages is also supported.",cta:"Open the example",href:"https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/",target:"_self",url:"anonymous.4open.science/r/840c8c57-\u2026",img:"/imgs/explorer.png",alt:"The repository explorer with a file tree and a rendered README"},{key:"manage",num:"03",eyebrow:"Manage",title:"One dashboard,",accent:"until the decision.",text:"Monitor views, edit configuration, remove or update your repository. Program chairs can group submissions under a conference with one shared expiry.",cta:"Open the dashboard",href:"/dashboard",needsUser:!0,url:"anonymous.4open.science/dashboard",img:"/imgs/dashboard.png",alt:"The dashboard listing anonymized repositories with status, views and expiry"}],e.feature=e.features[0].key,e.selectFeature=function(c){e.feature=c},e.featureHref=function(c){return c.needsUser&&!e.user?"/signin":c.href},e.featureTarget=function(c){return c.needsUser&&!e.user?"_self":c.target||void 0},e.featureKeydown=function(c,f){let v={ArrowDown:1,ArrowRight:1,ArrowUp:-1,ArrowLeft:-1,Home:"first",End:"last"}[c.key];if(v===void 0)return;c.preventDefault();let g=e.features.length,k=v==="first"?0:v==="last"?g-1:(f+v+g)%g;e.feature=e.features[k].key,o(()=>{let m=i.document.getElementById("feature-tab-"+e.feature);m&&m.focus()})},e.cards=[{key:"repositories",total:0,label:"repositories anonymized"},{key:"users",total:0,label:"researchers"},{key:"pageViews",total:0,label:"page views"},{key:"pullRequests",total:0,label:"pull requests"}];function r(){t.get("/api/stat/").then(c=>{e.stat=c.data,e.cards[0].total=c.data.nbRepositories,e.cards[1].total=c.data.nbUsers,e.cards[2].total=c.data.nbPageViews,e.cards[3].total=c.data.nbPullRequests})}r();function a(c){let f={series:c,bars:[],viewW:100,deltaToday:0,pctChange:0,pctAbs:0,isUp:!0};if(!c||c.length<2)return f;let v=new Array(c.length-1);for(let E=1;E=2){let E=v[g-2];E&&(f.pctChange=(f.deltaToday-E)/E*100)}return f.pctAbs=Math.round(Math.abs(f.pctChange)),f.isUp=f.pctChange>=0,f}e.history={repositories:a([]),users:a([]),pageViews:a([]),pullRequests:a([])},t.get("/api/stat/history?days=60").then(c=>{let f=c.data||[];e.history={repositories:a(f.map(v=>v.nbRepositories||0)),users:a(f.map(v=>v.nbUsers||0)),pageViews:a(f.map(v=>v.nbPageViews||0)),pullRequests:a(f.map(v=>v.nbPullRequests||0))}})},Ya=function(e,t,s,i,o,r){let a=ct();e.on("routeLeave",function(){$('[data-toggle="tooltip"]').tooltip("dispose")}),e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),a.timeout(()=>{$('[data-toggle="tooltip"]').tooltip()},250),e.quotaExpanded=!1,e.closeQuota=()=>{e.quotaExpanded=!1,Ye(()=>document.querySelector(".dashboard-quota > summary")?.focus())},Jt()(document,"click",S=>{e.quotaExpanded&&!S.target.closest?.(".dashboard-quota")&&(e.quotaExpanded=!1)}),e.filtersExpanded=!1,e.projectView="all",e.selectedProject=null,e.projectName="",e.nameSaving=!1,e.nameError="",e.nameMessage="",e.needsAttention=S=>S.status==="error"||S._broken||f(S.status)==="progress"&&S._stale,e.attentionCount=()=>e.dashboardTotals?.attention??e.items.filter(e.needsAttention).length,e.hasProjects=()=>(e.dashboardTotals?.total??e.items.length)>0,e.setProjectView=S=>{e.projectView=S,S==="attention"&&(e.filters.status.error=!0,e.filters.status.progress=!0)},e.projectDetailsId=S=>"project-details-"+encodeURIComponent(S._type+":"+(S._id||S._source||"unknown")),e.showProjectDetails=async S=>{e.selectedProject=S,e.projectName=S.projectName||"",e.nameError="",e.nameMessage="",await Ye();let I=document.getElementById(e.projectDetailsId(S));I?.focus(),I?.scrollIntoView?.({block:"nearest"})},e.closeProjectDetails=S=>{e.selectedProject=null,Ye(()=>document.querySelector(`[data-project-actions="${encodeURIComponent(S._type+":"+S._id)}"]`)?.focus())},e.saveProjectName=async S=>{if(e.nameSaving||!S._id)return;let I=e.projectName.trim();if(I.length>100){e.nameError="Use 100 characters or fewer.";return}e.nameSaving=!0,e.nameError="",e.nameMessage="";try{let H=await t.post("/api/user/project-name",{type:S._type,id:S._id,name:I});S.projectName=H.data.name,S._label=S.projectName||S._fallbackLabel,e.selectedProject===S&&(e.nameMessage=I?"Project name saved.":"Default project name restored."),O||(e.dashboardCursor=null,await F(),e.selectedProject===S&&(e.selectedProject=e.items.find(K=>K._type===S._type&&K._id===S._id)||null))}catch{e.selectedProject===S&&(e.nameError="The project name could not be saved. Try again.")}finally{e.nameSaving=!1}},e.copyingId=null,e.copyLink=async S=>{if(!S._viewUrl||e.copyingId)return;let I=new URL(S._viewUrl,o.location.origin).href;e.copyingId=S._type+":"+S._id;try{if(o.navigator.clipboard?.writeText)await o.navigator.clipboard.writeText(I);else{let H=document.createElement("textarea");H.value=I,H.setAttribute("readonly",""),H.style.position="fixed",H.style.opacity="0";let K=document.activeElement;document.body.appendChild(H);try{if(H.select(),!document.execCommand?.("copy"))throw Error("Copy unavailable")}finally{H.remove(),K?.focus()}}e.addToast({title:"Link copied",body:"The anonymous link is ready to share."})}catch{e.addToast({title:"Copy this anonymous link",body:I})}finally{e.copyingId=null}},e.items=[],e.search="",e.loading=!0,e.statusKeyLabels={ready:"Ready",progress:"In progress",error:"Error",expired:"Expired",removed:"Removed"};let c=["queue","download","downloaded","preparing","anonymizing"];function f(S){return S==="ready"||S==="error"?S:S==="expired"||S==="expiring"?"expired":S==="removed"||S==="removing"?"removed":(c.indexOf(S)>-1,"progress")}let v=7200*1e3,g="dashboard.filterPrefs",k={typeFilter:"all",filters:{status:{ready:!0,progress:!0,error:!0,expired:!0,removed:!1}},orderBy:"-anonymizeDate"},m=loadFilterPrefs(g)||{};e.typeFilter=m.typeFilter||k.typeFilter,e.filters={status:Object.assign({},k.filters.status,m.filters&&m.filters.status||{})},e.orderBy=m.orderBy||k.orderBy;let b={_name:{label:"Anonymous ID",defaultDesc:!1},_label:{label:"Project",defaultDesc:!1},anonymizeDate:{label:"Anonymize date",defaultDesc:!0},status:{label:"Status",defaultDesc:!1},lastView:{label:"Last view",defaultDesc:!0},pageView:{label:"Views",defaultDesc:!0},"options.expirationDate":{label:"Expiration",defaultDesc:!1}};e.sortFields=b,e.sortField=()=>e.orderBy.replace(/^-/,""),e.sortDesc=()=>e.orderBy.charAt(0)==="-",e.sortLabel=()=>{let S=b[e.sortField()];return S?S.label:"Custom"},e.isSortedBy=S=>e.sortField()===S,e.setSort=(S,I)=>{typeof I!="boolean"&&(I=e.isSortedBy(S)?!e.sortDesc():!!(b[S]&&b[S].defaultDesc)),e.orderBy=(I?"-":"")+S},e.toggleSortDirection=()=>{e.setSort(e.sortField(),!e.sortDesc())},e.watchGroup(["typeFilter","orderBy"],()=>{saveFilterPrefs(g,{typeFilter:e.typeFilter,filters:e.filters,orderBy:e.orderBy})}),e.watch("filters",()=>{saveFilterPrefs(g,{typeFilter:e.typeFilter,filters:e.filters,orderBy:e.orderBy})},!0),r.load().then(S=>{e.quota=S},console.error);function C(S,I,H,K,X,Y){S.pageView||(S.pageView=0),S.lastView||(S.lastView=""),S.options=S.options||{},S.options.terms=(S.options.terms||[]).filter(ce=>ce),S._id=I||"",S._source=K,S._broken=!I,S._name=I||K||"(unnamed)",S._fallbackLabel=S._type==="gist"?"Gist "+(I||K||"without an ID"):K||H||S._name,S._label=S.projectName||S._fallbackLabel,S._editUrl=I?X:null,S._viewUrl=I?Y:null,S._broken&&(S.status="error",S.statusMessage="incomplete_record"),S._statusKey=f(S.status);let ee=S.anonymizeDate||S.lastView;return S._stale=S._statusKey==="progress"&&!!ee&&Date.now()-new Date(ee).getTime()>v,S.status==="expired"||S.status==="expiring"?S._expiry={kind:"expired",date:S.options.expirationDate}:S.status!=="ready"?S._expiry={kind:"none"}:S.options.expirationMode==="never"||!S.options.expirationDate?S._expiry={kind:"never"}:S._expiry={kind:"date",date:S.options.expirationDate},S}function E(S){return t.get(S).then(I=>I.data||[],I=>(console.error(I),[]))}function T(){return e.loading=!0,i.all([E("/api/user/anonymized_repositories"),E("/api/user/anonymized_pull_requests"),E("/api/user/anonymized_gists")]).then(S=>{let I=S[0],H=S[1],K=S[2],X=[];I.forEach(Y=>{Y._type="repo";let ee=Y.source||{};X.push(C(Y,Y.repoId,Y.repoId,ee.fullName,"/anonymize/"+Y.repoId,"/r/"+Y.repoId+"/"))}),H.forEach(Y=>{Y._type="pr";let ee=Y.source||{};X.push(C(Y,Y.pullRequestId,Y.pullRequestId,ee.repositoryFullName?ee.repositoryFullName+"#"+ee.pullRequestId:void 0,"/pull-request-anonymize/"+Y.pullRequestId,"/pr/"+Y.pullRequestId+"/"))}),K.forEach(Y=>{Y._type="gist";let ee=Y.source||{};X.push(C(Y,Y.gistId,Y.gistId,ee.gistId,"/gist-anonymize/"+Y.gistId,"/gist/"+Y.gistId+"/"))}),e.items=X,e.loading=!1})}let D=0,O=!1;e.dashboardCursor=null,e.dashboardError="";function q(S){let I=S.source||{};return S._type==="repo"?C(S,S.repoId,S.repoId,I.fullName,"/anonymize/"+S.repoId,"/r/"+S.repoId+"/"):S._type==="pr"?C(S,S.pullRequestId,S.pullRequestId,I.repositoryFullName?I.repositoryFullName+"#"+I.pullRequestId:void 0,"/pull-request-anonymize/"+S.pullRequestId,"/pr/"+S.pullRequestId+"/"):C(S,S.gistId,S.gistId,I.gistId,"/gist-anonymize/"+S.gistId,"/gist/"+S.gistId+"/")}function F(S=!1){if(O)return T();let I=++D;return e.loading=!S,e.loadingMore=S,e.dashboardError="",t.get("/api/user/dashboard",{params:{q:e.search,type:e.typeFilter,sort:e.orderBy,statuses:Object.keys(e.filters.status).filter(H=>e.filters.status[H]!==!1).join(",")||"none",attention:String(e.projectView==="attention"),cursor:S?e.dashboardCursor:void 0}}).then(H=>{if(I===D){if(!Array.isArray(H.data?.items))return O=!0,T();e.items=(S?e.items:[]).concat(H.data.items.map(q)),e.dashboardCursor=H.data.cursor,e.dashboardTotals=H.data}},H=>{if(I===D){if(H.status===404)return O=!0,T();e.dashboardError="Projects could not be loaded. Please try again."}}).finally(()=>{I===D&&(e.loading=!1,e.loadingMore=!1)})}e.loadMoreProjects=()=>F(!0);let M;e.watchGroup(["search","typeFilter","orderBy","projectView"],()=>{O||(M&&a.timeout.cancel(M),M=a.timeout(()=>F(),150))},!1),e.watch("filters",()=>{O||F()},!0,!1),e.on("dispose",()=>{D++}),F(),e.openItem=(S,I)=>{if(!S._viewUrl)return;let H=I&&I.target;H&&H.closest&&H.closest("a, button, .dropdown, input")||(o.location.href=S._viewUrl)},e.hiddenStatusCount=()=>Object.keys(e.filters.status).filter(S=>e.filters.status[S]===!1).length,e.hasHiddenStatus=()=>e.hiddenStatusCount()>0,e.hasActiveFilters=()=>e.projectView!=="all"||e.typeFilter!=="all"||e.search.trim().length>0||Object.keys(e.filters.status).some(S=>e.filters.status[S]===!1),e.showClearFilters=()=>e.search.trim().length>0||e.typeFilter!=="all"||e.hiddenStatusCount()>1,e.clearFilters=()=>{e.projectView="all",e.typeFilter="all",e.search="",Object.keys(e.filters.status).forEach(S=>{e.filters.status[S]=!0})};function z(S,I,H,K){t.get("/api/repo/"+S).then(async X=>{let Y=K!==void 0&&K!==X.data.status;for(let ee of e.items)if(ee._type==="repo"&&ee.repoId==S){Y=Y||ee.status!==X.data.status;let ce=e.needsAttention(ee);ee.status=X.data.status,ee.statusMessage=X.data.statusMessage,ee._statusKey=f(ee.status),ee._statusKey!=="progress"&&(ee._stale=!1);let le=e.needsAttention(ee);e.dashboardTotals&&ce!==le&&(e.dashboardTotals.attention=Math.max(0,e.dashboardTotals.attention+(le?1:-1)));break}if(Y&&!O){e.dashboardCursor=null;let ee=e.selectedProject;await F(),ee&&e.selectedProject===ee&&(e.selectedProject=e.items.find(ce=>ce._type===ee._type&&ce._id===ee._id)||null)}if(X.data.status=="ready"||X.data.status=="error"||X.data.status=="removed"||X.data.status=="expired"){I(X.data);return}a.timeout(()=>z(S,I,H,X.data.status),2500)},H)}let se=S=>S==="repo"?"repository":S==="gist"?"gist":"pull request",oe=S=>S==="repo"?"/api/repo":S==="gist"?"/api/gist":"/api/pr";e.removeItem=S=>{let I=se(S._type);if(confirm(`Are you sure that you want to remove the ${I} ${S._id}?`)){let H=ze({title:`Removing ${S._id}...`,date:new Date,body:`The ${I} ${S._id} is going to be removed.`});e.addToast(H);let K=`${oe(S._type)}/${S._id}`;t.delete(K).then(()=>{S._type==="repo"?z(S._id,()=>{H.title=`${S._id} is removed.`,H.body=`The ${I} ${S._id} is removed.`},void 0,S.status):(H.title=`${S._id} is removed.`,H.body=`The ${I} ${S._id} is removed.`,F())},X=>{H.title=`Error during the removal of ${S._id}.`,H.body=X.body,F()})}},e.refreshItem=S=>{let I=se(S._type),H=ze({title:`Refreshing ${S._id}...`,date:new Date,body:`The ${I} ${S._id} is going to be refreshed.`});e.addToast(H);let K=Y=>{H.title=`Error during the refresh of ${S._id}.`,H.body=Y.data?.error||Y.body||"The refresh could not be completed. Please try again.",F()},X=`${oe(S._type)}/${S._id}/refresh`;t.post(X).then(()=>{S._type==="repo"?z(S._id,Y=>{if(Y.status!=="ready"){K({body:Y.statusMessage||`The repository is ${Y.status}.`});return}H.title=`${S._id} is refreshed.`,H.body=`The ${I} ${S._id} is refreshed.`},K,S.status):(H.title=`${S._id} is refreshed.`,H.body=`The ${I} ${S._id} is refreshed.`,F())},K)},e.extendItem=S=>{let I=se(S._type),H=ze({title:`Extending ${S._id}...`,date:new Date,body:`The expiration of ${I} ${S._id} is going to be extended by 6 months.`});e.addToast(H);let K=`${oe(S._type)}/${S._id}/extend`;t.post(K).then(()=>{S._type==="repo"?z(S._id,()=>{H.title=`${S._id} is extended.`,H.body=`The expiration of ${I} ${S._id} is extended by 6 months.`},void 0,S.status):(H.title=`${S._id} is extended.`,H.body=`The expiration of ${I} ${S._id} is extended by 6 months.`,F())},X=>{H.title=`Error during the extension of ${S._id}.`,H.body=X.data&&X.data.error||X.body,F()})},e.itemFilter=S=>{if(e.projectView==="attention"&&!e.needsAttention(S)||e.typeFilter!=="all"&&S._type!==e.typeFilter||e.filters.status[S._statusKey]===!1)return!1;let I=e.search.trim().toLowerCase();return!!(I.length==0||S._label&&String(S._label).toLowerCase().indexOf(I)>-1||S._source&&String(S._source).toLowerCase().indexOf(I)>-1||S._id&&String(S._id).toLowerCase().indexOf(I)>-1||S.conference&&String(S.conference).toLowerCase().indexOf(I)>-1)}};var Qa=function(e,t,s){let i=ct();e.repoId=s.repoId,e.reviewUrl=window.location.origin+"/r/"+encodeURIComponent(s.repoId)+"/",e.repo=null,e.progress=0,e.rateLimitResetAt=0,e.rateLimitCountdown="";var o=null;let r=null,a=!1;function c(v){e.rateLimitResetAt=v,o&&i.interval.cancel(o);function g(){var k=Math.max(0,Math.ceil((v-Date.now())/1e3));if(k<=0)e.rateLimitCountdown="",e.rateLimitResetAt=0,i.interval.cancel(o),o=null;else{var m=Math.floor(k/60),b=k%60;e.rateLimitCountdown=m>0?m+"m "+b+"s":b+"s"}}g(),o=i.interval(g,1e3)}e.on("dispose",function(){a=!0,o&&i.interval.cancel(o),r&&i.timeout.cancel(r)});function f(v){if(!v)return v;var g=v.match(/^rate_limited:(\d+)$/);return g?(c(parseInt(g[1],10)),null):(e.rateLimitResetAt=0,v)}e.getStatus=()=>{a||t.get("/api/repo/"+e.repoId,{repoId:e.repoId,repoUrl:e.repoUrl}).then(v=>{if(!a){e.repo=v.data,v.data.rateLimitResetAt?c(v.data.rateLimitResetAt):e.repo.statusMessage=f(e.repo.statusMessage),e.repo.status=="ready"?e.progress=100:e.repo.status=="queue"?e.progress=10:e.repo.status=="downloaded"?e.progress=50:e.repo.status=="download"||e.repo.status=="preparing"?e.progress=25:e.repo.status=="anonymizing"&&(e.progress=75);var g=!["ready","removed","expired"].includes(e.repo.status);e.repo.status=="error"&&!e.rateLimitResetAt&&(g=!1),g&&(r=i.timeout(e.getStatus,2e3))}},v=>{e.error=v.data.error})},e.getStatus()},as=function(e,t,s,i,o,r,a){e.sourceUrl="",e.workspaceOpen=!1,e.sourceUrlError="",e.previewStatus="idle",e.sourceLoading=!1,e.mobilePane="settings";let c=window.matchMedia?.("(max-width: 767px)");e.mobileWorkspace=!!c?.matches,c?.addEventListener&&Jt()(c,"change",_=>{e.mobileWorkspace=_.matches}),e.selectMobilePane=_=>{e.mobilePane=_};let f=0,v=!1,g=new Set,k=(_,h=!1)=>!v&&_.generation===f&&_.url===e.sourceUrl.trim()&&_.connection===e.githubConnection&&(!h||_.branch===e.source.branch),m=()=>{let _={generation:f,url:e.sourceUrl.trim(),connection:e.githubConnection,branch:e.source.branch};return g.add(_),e.sourceLoading=!0,_},b=_=>{g.delete(_),v||(e.sourceLoading=[...g].some(h=>k(h)))};e.on("dispose",()=>{v=!0,f++});let C=null,E=_=>_.gistId&&!_.repo?"gist:"+_.gistId.toLowerCase():(_.owner+"/"+_.repo).toLowerCase()+(_.pullRequestId?"/pull/"+_.pullRequestId:""),T=ai(e,["sourceUrl","terms","repoId","pullRequestId","gistId","source","options","conference","githubConnection"],"anonymize:"+(o.path?.()||"")),D=null,O=null;e.hostingReview=!1,e.previewExpanded=!1,e.taskValidationError="",e.editRepository=()=>{e.mobilePane="settings",e.previewExpanded=!1,Ye(()=>document.querySelector(".anonymize-fields .is-invalid")?.focus())},e.submitRepository=_=>{if(e.taskValidationError="",!(e.sourceLoading||e.billingBusy||e.hostingSaving||e.billingPending)){if(ge()||e.anonymize?.invalid||e.sourceUrlError){e.taskValidationError="Check the highlighted fields before continuing.",e.editRepository();return}return e.hostingNeedsPayment()?e.checkoutRepository():e.anonymizeRepo(_)}},e.hostingPayment=!1,e.hostingAlternatives=!1,e.hostingPrice=_=>_.amount==null?"Price shown at checkout":new Intl.NumberFormat(void 0,{style:"currency",currency:_.currency,minimumFractionDigits:0,maximumFractionDigits:2}).format(_.amount/100)+(_.interval==="year"?" billed annually":" billed monthly"),e.hostingPlan="author_monthly",e.hostingSaving=!1,e.selectedHostingPlan=()=>e.authorPlans().find(_=>_.id===e.hostingPlan)||e.authorPlans()[0];let q=()=>t.get("/api/user/quota").then(_=>{e.hostingQuota=_.data});rs(e,t,async()=>{await q(),e.hostingQuotaBlocked=!1},{confirmedMessage:"Hosting status refreshed. Your draft is ready to continue."}),q().catch(()=>{}),e.authorPlans=()=>(e.billing?.plans||[]).filter(_=>["author_monthly","author_annual"].includes(_.id)),e.hasAuthorHosting=()=>["author_monthly","author_annual"].includes(e.billing?.allowance?.plan),e.hostingNeedsPayment=()=>{if(!e.billing?.enabled||e.detectedType!=="repo"||e.hasAuthorHosting()||e.isUpdate&&e.role!=="owner")return!1;let _=e.options?.expirationMode==="never"&&!e._existingNever,h=e.hostingQuota?.repository,w=!e.isUpdate&&!e.conference&&h&&h.used>=h.total;return!!(_||!e.conference&&(w||e.hostingQuotaBlocked))},e.checkoutRepository=async(_=!1)=>{if(!(e.hostingSaving||e.billingBusy||!e.billing?.csrf||e.sourceLoading)){e.hostingSaving=!0,e.billingError="";try{let h=T.checkpoint(),w=JSON.stringify(h);(!D||w!==O)&&(D=(await t.post("/api/billing/draft",{path:o.path(),values:h},{headers:{"x-csrf-token":e.billing.csrf}})).data.id,O=w);let R=e.authorPlans().find(P=>P.id===e.hostingPlan)||e.authorPlans()[0];if(!_&&!R)throw new Error("No author plan available");await e.checkout(_?"author_pass":R.id,_?e.repoId:"",{draftId:D})}catch{e.billingError="Your draft could not be saved for checkout. Your form is unchanged. Please try again."}finally{e.hostingSaving=!1}}},e.useDatedHosting=()=>{e.options.expirationMode="remove"},e.discardDraft=async()=>{T.discard(),e.workspaceOpen=!!e.sourceUrl,e.error=null,e.sourceUrl?await e.urlSelected(!0):(f++,e.sourceLoading=!1,e.detectedType=null,e.details=null,e.sourceUrlError="",re.cancel(),Ee.cancel(),U.cancel(),e.previewStatus="idle")},e.githubConnection=void 0,e.githubConnections=null,e.gistOAuthRequired=!1,e.gistAppRequired=!1;let F=()=>{let _={};for(let h of["sourceUrl","terms","repoId","pullRequestId","gistId","source","options","conference","githubConnection"])_[h]=e[h];sessionStorage.setItem("github-access-draft",JSON.stringify({path:o.path(),savedAt:Date.now(),draft:_}))};e.connectGistApp=()=>{F(),window.location.href="/github/app/login?returnTo="+encodeURIComponent(o.path())},e.connectGistOAuth=()=>{F(),window.location.href="/github/login?returnTo="+encodeURIComponent(o.path())},e.grantGitHubAccess=()=>{F();let _=o.path(),h=I(e.sourceUrl)||"",w=e.githubConnections?.appConnected?"/github/app/install":"/github/app/login";window.location.href=w+"?returnTo="+encodeURIComponent(_)+"&repository="+encodeURIComponent(h)+"&install=1"},e.chooseGitHubConnection=async _=>{e.githubConnection=_,e.readme="",e.sourceUrl&&await K()},e.detectedType=null,e.repoId="",e.pullRequestId="",e.gistId="",e.terms="",e.defaultTerms="",e.branches=[],e.source={branch:"",commit:""},e.options={expirationMode:"remove",expirationDate:new Date,update:!1,image:!0,pdf:!0,notebook:!0,link:!0,body:!0,title:!0,origin:!1,diff:!0,content:!0,comments:!0,username:!0,date:!0};function M(){let _=new Date;return _.setMonth(_.getMonth()+6),_}e.options.expirationDate=M();function z(_){let h=_.getFullYear(),w=String(_.getMonth()+1).padStart(2,"0"),R=String(_.getDate()).padStart(2,"0");return`${h}-${w}-${R}`}e.minExpirationDate=z(new Date);let se=new Date;se.setFullYear(se.getFullYear()+1),e.maxExpirationDate=z(se),e.anonymize_readme="",e.readme="",e.html_readme="",e.isUpdate=!1;function oe(_){t.get("/api/user/default").then(h=>{let w=h.data;w.terms&&(e.defaultTerms=w.terms.join(` +`)),e.options=Object.assign({},e.options,w.options),e.options.expirationDate=w.options&&w.options.expirationDate?new Date(w.options.expirationDate):M(),!i.repoId&&!i.pullRequestId&&!i.gistId&&!e.anonymize?.terms?.dirty&&(e.terms=e.defaultTerms),_&&_()})}function S(_,h,w){e.anonymize&&e.anonymize[_]&&e.anonymize[_].setValidity(h,w)}function I(_){try{let h=parseGithubUrl(_);if(h&&h.owner&&h.repo)return h.owner+"/"+h.repo}catch{}return null}e.reconnectingSource=!1,e.reconnectRepositoryId=void 0,e.reconnectSource=async()=>{if(confirm("Reconnect to the repository currently at this GitHub URL? Review its branch and commit before saving. Saving will replace the published snapshot.")){e.reconnectingSource=!0,e.reconnectRepositoryId=void 0,e.source.commit="",e.source.branch="",e.readme="",e.branches=[];try{await Y()}catch{}}};function H(){return e.reconnectingSource||!e.isUpdate||!e._originalRepositoryID?void 0:I(e.sourceUrl)===e._originalFullName?e._originalRepositoryID:void 0}async function K(){e._preservingDraft=!0;try{await e.urlSelected(!0)}finally{e._preservingDraft=!1}}async function X(){let _=new URLSearchParams(window.location.search).get("billingDraft");if(_){T.restore();try{let w=(await t.get("/api/billing/draft/"+encodeURIComponent(_))).data;if(w.path!==o.path())throw new Error("Wrong task");for(let R of["sourceUrl","terms","repoId","source","options","conference","githubConnection"])Object.prototype.hasOwnProperty.call(w.values,R)&&(e[R]=w.values[R]);return e.options?.expirationDate&&(e.options.expirationDate=new Date(e.options.expirationDate)),D=w.id,O=JSON.stringify(T.checkpoint()),e.draftRestored=!0,e.hostingReview=!0,e.sourceUrl&&await K(),o.replace?.(o.path()),!0}catch{e.billingError="The checkout draft could not be restored. Retry by reloading this page; any local draft is still available."}}let h;try{h=JSON.parse(sessionStorage.getItem("github-access-draft")||"null")}catch{return!1}if(!h||h.path!==o.path()||Date.now()-h.savedAt>=30*6e4)return T.restore()?(e.sourceUrl&&await K(),!0):!1;T.restore();for(let w of["sourceUrl","terms","repoId","pullRequestId","gistId","source","options","conference","githubConnection"])Object.prototype.hasOwnProperty.call(h.draft,w)&&(e[w]=h.draft[w]);return e.options.expirationDate&&(e.options.expirationDate=new Date(e.options.expirationDate)),await K(),sessionStorage.removeItem("github-access-draft"),!0}oe(()=>{!i.repoId&&!i.pullRequestId&&!i.gistId&&a(X,0),i.repoId&&i.repoId!=""&&(e.isUpdate=!0,e.detectedType="repo",e.repoId=i.repoId,t.get("/api/repo/"+e.repoId).then(async _=>{e.githubConnection=_.data.connection||"oauth",e.sourceUrl="https://github.com/"+_.data.source.fullName,e._originalFullName=_.data.source.fullName,e.terms=_.data.options.terms.filter(h=>h).join(` +`),e.source=_.data.source,e.role=_.data.role||"owner",e._existingNever=_.data.options.expirationMode==="never",e.coauthors=_.data.coauthors||[],e._originalBranch=_.data.source.branch,e.options=Object.assign({},e.options,_.data.options),e.conference=_.data.conference,e._originalConference=_.data.conference,e.repositoryID=_.data.source.repositoryID,e._originalRepositoryID=_.data.source.repositoryID,_.data.options.expirationDate&&(e.options.expirationDate=new Date(_.data.options.expirationDate)),C=E(parseGithubUrl(e.sourceUrl)),!await X()&&(await Promise.all([Y(),ee()]),Se())},()=>{o.url("/404")})),i.pullRequestId&&i.pullRequestId!=""&&(e.isUpdate=!0,e.detectedType="pr",e.pullRequestId=i.pullRequestId,t.get("/api/pr/"+e.pullRequestId).then(async _=>{if(e.githubConnection=_.data.connection||"oauth",e.sourceUrl="https://github.com/"+_.data.source.repositoryFullName+"/pull/"+_.data.source.pullRequestId,e.terms=_.data.options.terms.filter(h=>h).join(` +`),e.source=_.data.source,e.options=Object.assign({},e.options,_.data.options),e.conference=_.data.conference,e._originalConference=_.data.conference,_.data.options.expirationDate&&(e.options.expirationDate=new Date(_.data.options.expirationDate)),C=E(parseGithubUrl(e.sourceUrl)),!await X())try{await $e()}catch{}},()=>{o.url("/404")})),i.gistId&&i.gistId!=""&&(e.isUpdate=!0,e.detectedType="gist",e.gistId=i.gistId,t.get("/api/gist/"+e.gistId).then(async _=>{e.sourceUrl="https://gist.github.com/"+_.data.source.gistId,e.terms=_.data.options.terms.filter(h=>h).join(` +`),e.source=_.data.source,e.options=Object.assign({},e.options,_.data.options),e.conference=_.data.conference,e._originalConference=_.data.conference,_.data.options.expirationDate&&(e.options.expirationDate=new Date(_.data.options.expirationDate)),C=E(parseGithubUrl(e.sourceUrl)),!await X()&&await Le()},()=>{o.url("/404")}))}),t.get("/github/connections").then(_=>{e.githubConnections=_.data,!i.repoId&&!i.pullRequestId&&!i.gistId&&e.githubConnection===void 0&&_.data.appEnabled&&_.data.appConnected&&(e.githubConnection="github-app",e.sourceUrl&&e.workspaceOpen&&K())}).catch(()=>{}),e.urlSelected=async(_=!1)=>{let h=++f,w;try{w=parseGithubUrl(e.sourceUrl.trim())}catch{e.sourceLoading=!1,re.cancel(),Ee.cancel(),U.cancel(),e.previewStatus="idle",e.sourceUrlError=e.sourceUrl?"Please provide a valid GitHub URL.":"",S("sourceUrl","github",!1);return}let R=E(w),P=_||C===R;C=R,e.sourceUrlError="",S("sourceUrl","github",!0);let L=document.activeElement?.id==="sourceUrl-landing";e.workspaceOpen=!0,L&&a(()=>document.getElementById("sourceUrl")?.focus(),0),e.reconnectingSource=!1,e.reconnectRepositoryId=void 0,!P&&!e.isUpdate&&(e.repoId="",e.pullRequestId="",e.gistId=""),e.details=null,e.branches=[],P||(e.source={type:"GitHubStream",branch:"",commit:""}),re.cancel(),Ee.cancel(),U.cancel(),Ne.clear(),qe.clear(),e.previewStatus="idle",e.anonymize_readme="",e.readme="",e.html_readme="",e.detectedType=null,e.gistOAuthRequired=!1,e.gistAppRequired=!1,e._preservingDraft=P;try{w.gistId&&!w.repo?(e.detectedType="gist",e.source={gistId:w.gistId},await Le()):w.pullRequestId?(e.detectedType="pr",e.source={repositoryFullName:w.owner+"/"+w.repo,pullRequestId:w.pullRequestId},await $e()):(e.detectedType="repo",await Promise.all([Y(),ee()]),Se())}catch{}finally{h===f&&(e._preservingDraft=!1)}$('[data-toggle="tooltip"]').tooltip()},$('[data-toggle="tooltip"]').tooltip(),e.watch("source.branch",async()=>{if(e.detectedType!=="repo")return;let _=e.branches.filter(w=>w.name==e.source.branch)[0];if(!_)return;!(!e.reconnectingSource&&e.isUpdate&&e._originalBranch===e.source.branch&&e.source.commit)&&!(e._preservingDraft&&e.source.commit)&&(e.source.commit=_.commit),e.readme=_.readme,await ee(),Se()}),e.getBranches=async _=>{let h=parseGithubUrl(e.sourceUrl),w=m();try{let R=await t.get(`/api/repo/${h.owner}/${h.repo}/branches`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&i.repoId&&I(e.sourceUrl)===e._originalFullName?i.repoId:void 0,connection:e.githubConnection,force:_===!0||e.reconnectingSource?"1":"0",repositoryID:H()}});if(!k(w))return;e.branches=R.data,e.sourceUnreachable=!1,e.source.branch||(e.source.branch=e.details.defaultBranch);let P=e.branches.filter(L=>L.name==e.source.branch);P.length>0&&(!(!e.reconnectingSource&&!_&&e.isUpdate&&!e.options.update&&e._originalBranch===e.source.branch&&e.source.commit)&&!(e._preservingDraft&&e.source.commit)&&(e.source.commit=P[0].commit),e.readme=P[0].readme,await ee(_))}catch(R){if(!k(w))return;e.branches=[],e.sourceUnreachable=R&&(R.status===404||R.data&&R.data.error==="repo_not_found");let P=R&&R.data&&R.data.error||(R&&R.status===404?"repo_not_found":"unknown_error");r("ERRORS."+P).then(L=>{e.toasts=e.toasts||[],e.addToast({title:"Error",date:new Date,body:L}),e.error=L},console.error),typeof S=="function"&&S("sourceUrl","missing",!1)}finally{b(w)}};async function Y(){let _=parseGithubUrl(e.sourceUrl),h=m();try{ie();let w=await t.get(`/api/repo/${_.owner}/${_.repo}/`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&i.repoId&&I(e.sourceUrl)===e._originalFullName?i.repoId:void 0,connection:e.githubConnection,repositoryID:H(),force:"1"}});if(!k(h))return;e.details=w.data,e.reconnectingSource&&(e.reconnectRepositoryId=e.details.externalId),e.details&&e.details.id&&(e.repositoryID=e.details.id),e.repoId||(e.repoId=e.details.repo+"-"+generateRandomId(4)),await e.getBranches(e.reconnectingSource)}catch(w){if(!k(h))return;throw w.data&&(r("ERRORS."+w.data.error).then(R=>{e.addToast({title:"Error",date:new Date,body:R}),e.error=R},console.error),Ce(w.data.error)),S("sourceUrl","missing",!1),w}finally{b(h)}}async function ee(_){if(e.readme&&!_)return e.readme;let h=parseGithubUrl(e.sourceUrl),w=m();try{let R=await t.get(`/api/repo/${h.owner}/${h.repo}/readme`,{params:{reconnect:e.reconnectingSource?"1":void 0,anonymizedRepoId:e.isUpdate&&i.repoId&&I(e.sourceUrl)===e._originalFullName?i.repoId:void 0,connection:e.githubConnection,force:_===!0?"1":"0",branch:e.source.branch,repositoryID:H()}});k(w,!0)&&(e.readme=R.data)}catch{k(w,!0)&&(e.readme="")}finally{b(w)}}function ce(){let _={terms:e.terms?e.terms.split(` +`):[],image:!!e.options.image,link:!!e.options.link,repoId:e.repoId};e.source&&e.source.branch&&(_.branchName=e.source.branch);try{let h=parseGithubUrl(e.sourceUrl);_.repoName=`${h.owner}/${h.repo}`}catch{}return _}function le(_,h,w){let R=null,P=0,L=()=>{if(e.detectedType!==_)return;R&&a.cancel(R);let V=++P;e.previewStatus="loading",R=a(()=>{R=null;let B=h();if(!B){e.previewStatus="idle";return}t.post("/api/anonymize-preview",B).then(Q=>{V===P&&(w(Q.data,B),e.previewStatus="ready")}).catch(()=>{V===P&&(e.previewStatus="error")})},200)};return L.cancel=()=>{P++,R&&a.cancel(R),R=null},e.on("dispose",L.cancel),L}e.retryPreview=()=>{e.detectedType==="repo"&&re(),e.detectedType==="pr"&&Ee(),e.detectedType==="gist"&&U()};let re=le("repo",()=>e.readme?{content:e.readme,options:ce()}:null,_=>{if(typeof _?.content!="string")throw Error("Invalid preview response");e.anonymize_readme=_.content;let h="";try{let R=parseGithubUrl(e.sourceUrl),P=e.source.branch||e.details&&e.details.defaultBranch||"main";h=`https://github.com/${R.owner}/${R.repo}/raw/${P}/`}catch{}let w=renderMD(e.anonymize_readme,h);e.html_readme=w,a(Prism.highlightAll,150)});function Se(){!e.anonymize||!e.anonymize.terms||(e.termsRegexWarning=!!e.terms&&!!e.terms.match(/[-[\]{}()*+?.,\\^$|#]/g),re())}async function $e(){let _=parseGithubUrl(e.sourceUrl),h=m();try{ie();let w=await t.get(`/api/pr/${_.owner}/${_.repo}/${_.pullRequestId}`,{params:{connection:e.githubConnection}});if(!k(h))return;e.details=w.data,e.pullRequestId||(e.pullRequestId=_.repo+"-PR"+_.pullRequestId+"-"+generateRandomId(4))}catch(w){if(!k(h))return;throw w.data&&(r("ERRORS."+w.data.error).then(R=>{e.addToast({title:"Error",date:new Date,body:R}),e.error=R},console.error),Ce(w.data.error)),S("sourceUrl","missing",!1),w}finally{b(h)}}let Ne=ze(new Map);function ke(){let _=new Set,h=e.details&&e.details.pullRequest;if(!h)return _;typeof h.title=="string"&&_.add(h.title),typeof h.body=="string"&&_.add(h.body),typeof h.diff=="string"&&_.add(h.diff);let w=h.comments||[];for(let R of w)typeof R.author=="string"&&_.add(R.author),typeof R.body=="string"&&_.add(R.body);return _}let Ee=le("pr",()=>{let _=ke(),h=Array.from(_);return h.length===0?null:{contents:h,options:ce()}},(_,h)=>{if(!Array.isArray(_?.contents)||_.contents.length!==h.contents.length||_.contents.some(P=>typeof P!="string"))throw Error("Invalid preview response");let w=h.contents,R=new Map;for(let P=0;PNe.set(L,P))});e.anonymizePrContent=function(_){return _&&(Ne.has(_)?Ne.get(_):"")};async function Le(){let _=parseGithubUrl(e.sourceUrl),h=m();try{ie(),e.gistOAuthRequired=!1,e.gistAppRequired=!1;let w=await t.get(`/api/gist/source/${_.gistId}`);if(!k(h))return;e.details=w.data,e.gistId||(e.gistId="gist-"+_.gistId.substring(0,6)+"-"+generateRandomId(4))}catch(w){if(!k(h))return;if(w.data?.error==="github_app_reconnect_required"){e.gistAppRequired=!0,S("sourceUrl","missing",!1);return}if(w.data?.error==="github_oauth_required"){e.gistOAuthRequired=!0,S("sourceUrl","missing",!1);return}throw w.data&&(r("ERRORS."+w.data.error).then(R=>{e.addToast({title:"Error",date:new Date,body:R}),e.error=R},console.error),Ce(w.data.error)),S("sourceUrl","missing",!1),w}finally{b(h)}}let qe=ze(new Map);function Ue(){let _=new Set,h=e.details&&e.details.gist;if(!h)return _;typeof h.description=="string"&&_.add(h.description),typeof h.ownerLogin=="string"&&_.add(h.ownerLogin);let w=h.files||[];for(let P of w)typeof P.filename=="string"&&_.add(P.filename),typeof P.content=="string"&&_.add(P.content);let R=h.comments||[];for(let P of R)typeof P.author=="string"&&_.add(P.author),typeof P.body=="string"&&_.add(P.body);return _}let U=le("gist",()=>{let _=Ue(),h=Array.from(_);return h.length===0?null:{contents:h,options:ce()}},(_,h)=>{if(!Array.isArray(_?.contents)||_.contents.length!==h.contents.length||_.contents.some(P=>typeof P!="string"))throw Error("Invalid preview response");let w=h.contents,R=new Map;for(let P=0;Pqe.set(L,P)),ne()});e.anonymizeGistContent=function(_){return _&&(qe.has(_)?qe.get(_):"")},e.previewGistFiles=[];function ne(){let _=e.details&&e.details.gist&&e.details.gist.files||[];e.previewGistFiles=_.map(h=>({filename:e.anonymizeGistContent(h.filename),content:e.anonymizeGistContent(h.content),language:h.language}))}e.watch("details.gist.files",ne,!0),e.watch("terms",ne);function x(){let _=e.conference;if(e.conference_data=null,!_)return;let h=e.isUpdate&&_===e._originalConference;t.get("/api/conferences/"+_).then(w=>{e.conference===_&&(e.conference_data=w.data,e.conference_data.startDate=new Date(e.conference_data.startDate),e.conference_data.endDate=new Date(e.conference_data.endDate),!h&&(e.options.expirationDate=new Date(e.conference_data.endDate),e.options.expirationMode="remove",e.options.update=e.conference_data.options.update,e.options.image=e.conference_data.options.image,e.options.pdf=e.conference_data.options.pdf,e.options.notebook=e.conference_data.options.notebook,e.options.link=e.conference_data.options.link))},()=>{e.conference===_&&(e.conference_data=null)})}function ie(){S("repoId","used",!0),S("repoId","format",!0),S("pullRequestId","used",!0),S("pullRequestId","format",!0),S("gistId","used",!0),S("gistId","format",!0),S("sourceUrl","used",!0),S("sourceUrl","missing",!0),S("sourceUrl","access",!0),S("sourceUrl","github",!0),S("commit","exists",!0),S("conference","activated",!0),S("terms","format",!0),e.termsRegexWarning=!1}function ge(){if(e.detectedType==="repo"&&e.options.expirationMode==="never")return!1;let _=e.anonymize&&e.anonymize.expirationDate;return!e.options.expirationDate||_&&_.invalid?(_&&_.setDirty&&_.setDirty(),e.error="Please choose a valid expiration date.",!0):!1}function Ce(_){let h=e.detectedType==="pr"?"pullRequestId":e.detectedType==="gist"?"gistId":"repoId";switch(_){case"repoId_already_used":S(h,"used",!1);break;case"invalid_repoId":S(h,"format",!1);break;case"options_not_provided":S(h,"format",!1);break;case"repo_already_anonymized":S("sourceUrl","used",!1);break;case"invalid_terms_format":S("terms","format",!1);break;case"repo_not_found":S("sourceUrl","missing",!1);break;case"repo_not_accessible":S("sourceUrl","access",!1);break;case"commit_not_found":S("commit","exists",!1);break;case"conf_not_activated":S("conference","activated",!1);break}}e.coauthors=e.coauthors||[],e.coauthorResults=[],e.coauthorError="",e.searchCoauthors=()=>{let _=(e.coauthorSearch||"").trim();if(e.coauthorError="",_.length<2){e.coauthorResults=[];return}t.get("/api/user/search/github-users",{params:{q:_}}).then(h=>{let w=new Set((e.coauthors||[]).map(R=>(R.username||"").toLowerCase()));e.coauthorResults=(h.data||[]).filter(R=>!w.has((R.username||"").toLowerCase()))},()=>{e.coauthorResults=[]})},e.addCoauthor=(_,h)=>{h&&h.preventDefault(),!(!_||!_.username)&&t.post("/api/repo/"+e.repoId+"/coauthors",{username:_.username}).then(w=>{e.coauthors=w.data||[],e.coauthorResults=[],e.coauthorSearch="",e.coauthorError=""},w=>{let R=w&&w.data&&w.data.error||"unknown_error";e.coauthorError=R})},e.removeCoauthor=_=>{!_||!_.username||confirm("Remove co-author "+_.username+"?")&&t.delete("/api/repo/"+e.repoId+"/coauthors/"+encodeURIComponent(_.username)).then(h=>{e.coauthors=h.data||[]},h=>{let w=h&&h.data&&h.data.error||"unknown_error";e.coauthorError=w})},e.anonymizeRepo=_=>{if(e.sourceLoading){e.error="Wait for the source to finish loading before saving.";return}if(e.reconnectingSource&&!e.reconnectRepositoryId)return;if(ge()){e.editRepository();return}if(e.anonymize?.invalid||e.sourceUrlError){e.editRepository(),e.error="Please correct the highlighted fields before saving.";return}if(e.hostingNeedsPayment()&&e.options.expirationMode==="never"){e.hostingReview=!0,Ye(()=>document.getElementById("repository-hosting")?.scrollIntoView({block:"center"}));return}let h=_.currentTarget||_.target.closest?.("button")||_.target;h.disabled=!0;let w=parseGithubUrl(e.sourceUrl),R={repoId:e.repoId,terms:e.terms.trim().split(` +`).filter(L=>L),connection:e.githubConnection,fullName:`${w.owner}/${w.repo}`,repository:e.sourceUrl,reconnectRepositoryId:e.reconnectRepositoryId,options:e.options,source:e.source,conference:e.conference};e.details&&(R.options.pageSource=e.details.pageSource),ie();let P=e.isUpdate?"/api/repo/"+e.repoId:"/api/repo/";t.post(P,R,{headers:{"Content-Type":"application/json"}}).then(()=>{T.clear(),window.location.href="/status/"+e.repoId},L=>{L.data&&(r("ERRORS."+L.data.error).then(V=>{e.error=V},console.error),Ce(L.data.error),["quota_exceeded","subscription_required_for_never_expiration"].includes(L.data.error)&&(L.data.error==="subscription_required_for_never_expiration"&&(e._existingNever=!1),e.hostingQuotaBlocked=!0,e.hostingReview=!0,Ye(()=>document.getElementById("repository-hosting")?.scrollIntoView({block:"center"}))))}).finally(()=>{h.disabled=!1})},e.anonymizeGist=_=>{if(e.sourceLoading){e.error="Wait for the source to finish loading before saving.";return}if(ge())return;if(e.anonymize?.invalid||e.sourceUrlError){e.error="Please correct the highlighted fields before saving.";return}let h=_.currentTarget||_.target.closest?.("button")||_.target;h.disabled=!0;let w=parseGithubUrl(e.sourceUrl),R={gistId:e.gistId,terms:e.terms.trim().split(` +`).filter(L=>L),source:{gistId:w.gistId},options:e.options,conference:e.conference};ie();let P=e.isUpdate?"/api/gist/"+e.gistId:"/api/gist/";t.post(P,R,{headers:{"Content-Type":"application/json"}}).then(()=>{T.clear(),window.location.href="/gist/"+e.gistId},L=>{L.data&&(r("ERRORS."+L.data.error).then(V=>{e.error=V},console.error),Ce(L.data.error))}).finally(()=>{h.disabled=!1})},e.anonymizePullRequest=_=>{if(e.sourceLoading){e.error="Wait for the source to finish loading before saving.";return}if(ge())return;if(e.anonymize?.invalid||e.sourceUrlError){e.error="Please correct the highlighted fields before saving.";return}let h=_.currentTarget||_.target.closest?.("button")||_.target;h.disabled=!0;let w=parseGithubUrl(e.sourceUrl),R={pullRequestId:e.pullRequestId,connection:e.githubConnection,terms:e.terms.trim().split(` +`).filter(L=>L),source:{repositoryFullName:`${w.owner}/${w.repo}`,pullRequestId:w.pullRequestId},options:e.options,conference:e.conference};ie();let P=e.isUpdate?"/api/pr/"+e.pullRequestId:"/api/pr/";t.post(P,R,{headers:{"Content-Type":"application/json"}}).then(()=>{T.clear(),window.location.href="/pr/"+e.pullRequestId},L=>{L.data&&(r("ERRORS."+L.data.error).then(V=>{e.error=V},console.error),Ce(L.data.error))}).finally(()=>{h.disabled=!1})},e.watch("conference",()=>{x()}),e.watch("terms",()=>{e.detectedType==="repo"&&Se(),e.detectedType==="pr"&&Ee(),e.detectedType==="gist"&&U()}),e.watch("options.image",()=>{e.detectedType==="repo"&&Se(),e.detectedType==="pr"&&Ee(),e.detectedType==="gist"&&U()}),e.watch("options.link",()=>{e.detectedType==="repo"&&Se(),e.detectedType==="pr"&&Ee(),e.detectedType==="gist"&&U()}),e.watch("details",()=>{e.detectedType==="pr"&&Ee(),e.detectedType==="gist"&&U()},!0)},li=function(e,t,s,i,o,r){let a=ct(),c=Jt();e.on("dark-mode",(I,H)=>{e.aceOption&&(H?e.aceOption.theme="nord_dark":e.aceOption.theme="chrome")});let f=0,v=!1;e.on("dispose",()=>{v=!0,f++,g&&g.resolve()}),e.files=[],e.isMac=/Mac|iPhone|iPad|iPod/.test(navigator.platform||navigator.userAgent),e.fileSearchQuery="",e.fileSearchResults=null,e.fileSearchLoading=!1,c(document,"keydown",function(I){if((I.metaKey||I.ctrlKey)&&I.key==="k"){I.preventDefault();var H=document.querySelector(".tree-search-input");H&&(H.focus(),H.select())}});var g=null;e.onFileSearchChange=function(){g&&(g.resolve(),g=null);let I=e.fileSearchQuery;if(!I||I.length<2){e.fileSearchResults=null,e.fileSearchLoading=!1;return}e.fileSearchLoading=!0;let H=r.defer();g=H,t.get(`/api/repo/${e.repoId}/files/search?q=${encodeURIComponent(I)}`,{timeout:H.promise}).then(function(K){if(!(v||g!==H)){g=null,e.fileSearchLoading=!1;var X={};e.files.forEach(function(U){X[(U.path||"")+"/"+U.name]=!0});for(var Y=[],ee={},ce=0;ce0&&e.files.push.apply(e.files,Y);for(var Ee=[],Le=0;Le0&&e.files.push.apply(e.files,Ee),e.fileSearchResults=K.data}},function(){!v&&g===H&&(g=null,e.fileSearchLoading=!1,e.fileSearchResults=[])})};let k={yml:"yaml",txt:"text",py:"python",js:"javascript",ts:"typescript"},m=["license","txt"],b=["png","jpg","jpeg","gif","svg","ico","bmp","tiff","tif","webp","avif","heif","heic"],C=["wav","mp3","ogg","wma","flac","aac","m4a"],E=["mp4","avi","webm","mov","mpg","mpeg","mkv","flv","wmv","3gp","3g2","m4v","f4v","f4p","f4a","f4b"];e.on("routeUpdate",function(I,H){if(e.repoId!=i.repoId)return S();if((i.path||"")!=e.filePath){e.filePath=i.path||"",e.paths=e.filePath.split("/").filter(K=>K&&K.trim().length>0),oe();for(let K=0;K0?e.paths.slice(0,K).join("/"):"";e.files.some(ee=>ee.path===X)||e.getFiles(X)}}});function T(){if(e.paths[0]!="")return;let I=["readme.md","readme.txt","readme.org","readme.1st","readme"],H={};for(let X of e.files)X.name.toLowerCase().indexOf("readme")>-1&&(H[X.name.toLowerCase()]=X.name);let K=null;for(let X of I)if(H[X]){K=X;break}if(!K&&Object.keys(H).length>0&&(K=Object.keys(H)[0]),K){let X=s.url();X[X.length-1]!="/"&&(X+="/"),s.url(X+encodePathForUrl(H[K]))}}e.fileCounts=null,e.getFiles=function(I){let H=e.repoId;return t.get(`/api/repo/${e.repoId}/files/?path=${encodeURIComponent(I)}&v=${e.options.lastUpdateDate}`).then(function(K){if(v||H!==e.repoId)return[];let X=I||"";return e.files=e.files.filter(Y=>Y.path!==X),e.files.push(...K.data),K.data},function(K){if(v||H!==e.repoId)return[];e.type="error",e.content=K&&K.data&&K.data.error||"unknown_error",e.files=[]})};function D(){let I=e.repoId;t.get(`/api/repo/${e.repoId}/files/counts`).then(function(H){v||I!==e.repoId||(e.fileCounts=H.data)},function(){e.fileCounts={}})}function O(){return e.files.filter(I=>I.name==e.paths[e.paths.length-1]&&I.path==e.paths.slice(0,e.paths.length-1).join("/"))[0]}var q=null;e.on("dispose",function(){q&&a.interval.cancel(q)});function F(I){if(v)return;let H=e.repoId;t.get(`/api/repo/${e.repoId}/options`).then(K=>{if(!(v||H!==e.repoId)){if(e.options=K.data,e.options.url){window.location=e.options.url;return}I&&I(K.data)}},K=>{if(!(v||H!==e.repoId)){var X=K.data||{};if(X.error==="rate_limited"&&X.resetAt){let ee=function(){var ce=Math.max(0,Math.ceil((e.rateLimitResetAt-Date.now())/1e3));if(ce<=0)e.rateLimitCountdown="",e.rateLimitResetAt=0,q&&(a.interval.cancel(q),q=null),F(I);else{var le=Math.floor(ce/60),re=ce%60;e.rateLimitCountdown=le>0?le+"m "+re+"s":re+"s"}};var Y=ee;e.type="rate_limited",e.rateLimitResetAt=X.resetAt,q&&a.interval.cancel(q),ee(),q=a.interval(ee,1e3)}else X.error==="repository_not_ready"?(e.type="loading",a.timeout(function(){F(I)},3e3)):(e.type="error",e.content=X.error)}})}e.toggleSource=function(){e.showSource=!e.showSource},e.toggleAllowScripts=function(){e.allowScripts=!e.allowScripts};function M(I){return k[I]?k[I]:I}function z(I){return I=="pdf"?"pdf":I=="html"||I=="htm"?"html-doc":I=="md"?"md":I=="org"?"org":I=="ipynb"?"IPython":m.indexOf(I)>-1?"text":b.indexOf(I)>-1?"image":E.indexOf(I)>-1?"media":C.indexOf(I)>-1?"audio":"code"}function se(I,H){let K=f;if(!I){e.type="error",e.content="no_file_selected";return}let X=e.type;e.type="loading",e.content="loading";let Y=H&&H.sha||"0";t.get(`/api/repo/${e.repoId}/file/${encodePathForUrl(I)}?v=`+Y,{transformResponse:ee=>ee}).then(ee=>{if(!(v||K!==f)){if(e.type=X,e.content=ee.data,e.content==""&&(e.content=null),e.type=="md"&&(e.content=renderMD(ee.data,s.url()+"/../"),e.type="html"),e.type=="org"){let le=contentAbs2Relative(ee.data);var ce=new Org.Parser().parse(le).convert(Org.ConverterHTML,{headerOffset:1,exportFromLineNumber:!1,suppressSubScriptHandling:!0,suppressAutoLink:!1});e.content=DOMPurify.sanitize(ce.toString()),e.type="html"}e.type=="code"&&ee.headers("content-type")=="application/octet-stream"&&(e.type="binary",e.content="binary"),a.timeout(()=>{Prism.highlightAll()},50)}},ee=>{if(!(v||K!==f)){e.type="error",e.content="unknown_error";try{ee.data=JSON.parse(ee.data),ee.data.error?e.content=ee.data.error:e.content=ee.data}catch{console.log(ee),ee.status==-1?e.content="request_error":ee.status==502&&(e.content="unreachable")}}})}function oe(){f++,e.content="",e.file=O();let I="0";e.file&&e.file.sha&&(I=e.file.sha),e.url=`/api/repo/${e.repoId}/file/${encodePathForUrl(e.filePath)}?v=${I}`;let H=e.filePath.substring(0,e.filePath.lastIndexOf("/")+1);e.fileBaseUrl=`/api/repo/${e.repoId}/file/${H?encodePathForUrl(H):""}`,e.showSource=!1,e.allowScripts=!1;let K=e.filePath.toLowerCase(),X=K.lastIndexOf(".");if(X>-1&&(K=K.substring(X+1)),e.aceOption={readOnly:!0,useWrapMode:!0,showGutter:!0,theme:"chrome",useSoftTab:!0,tabSize:2,fontSize:15,keyBinding:"vscode",fullLineSelection:!0,highlightActiveLine:!1,highlightGutterLine:!1,cursor:"hide",showInvisibles:!1,showIndentGuides:!0,showPrintMargin:!1,highlightSelectedWord:!1,enableBehaviours:!0,fadeFoldWidgets:!1,mode:M(K),onLoad:function(Y){let ee=ace.require("ace/range").Range,ce=null;function le(Ne,ke){ce!==null&&(Y.session.removeMarker(ce),ce=null),Ne!=null&&(ce=Y.session.addMarker(new ee(Ne,0,ke,1),"highlighted-line","fullLine"))}function re(Ne){let ke=window.location.hash.match(/^#L(\d+)(?:-L(\d+))?/);if(!ke){le(null);return}let Ee=parseInt(ke[1])-1,Le=ke[2]?parseInt(ke[2])-1:Ee;le(Ee,Le),Ne&&a.timeout(()=>{Y.scrollToLine(Ee,!0,!0,function(){})},100)}re(!0);let Se=null;Y.on("guttermousedown",function(Ne){let ke=Ne.getDocumentPosition().row,Ee=Ne.domEvent&&Ne.domEvent.shiftKey,Le=ke,qe=ke;Ee&&Se!==null?(Le=Math.min(Se,ke),qe=Math.max(Se,ke)):Se=ke;let Ue=Le===qe?`#L${Le+1}`:`#L${Le+1}-L${qe+1}`,U=window.location.pathname+window.location.search+Ue;window.history.replaceState(null,"",U),le(Le,qe),Ne.stop()});let $e=c(window,"hashchange",()=>re(!1));return Y.setFontSize(e.aceOption.fontSize),Y.setReadOnly(e.aceOption.readOnly),Y.setKeyboardHandler(e.aceOption.keyBinding),Y.setSelectionStyle(e.aceOption.fullLineSelection?"line":"text"),Y.setOption("displayIndentGuides",!0),Y.setHighlightActiveLine(e.aceOption.highlightActiveLine),e.aceOption.cursor=="hide"&&(Y.renderer.$cursorLayer.element.style.display="none"),Y.setHighlightGutterLine(e.aceOption.highlightGutterLine),Y.setShowInvisibles(e.aceOption.showInvisibles),Y.setDisplayIndentGuides(e.aceOption.showIndentGuides),Y.renderer.setShowPrintMargin(e.aceOption.showPrintMargin),Y.setHighlightSelectedWord(e.aceOption.highlightSelectedWord),Y.session.setUseSoftTabs(e.aceOption.useSoftTab),Y.session.setTabSize(e.aceOption.tabSize),Y.setBehavioursEnabled(e.aceOption.enableBehaviours),Y.setFadeFoldWidgets(e.aceOption.fadeFoldWidgets),$e}},e.isDarkMode&&(e.aceOption.theme="nord_dark"),e.type=z(K),e.type=="pdf"){e.content="pdf";return}se(e.filePath,e.file)}function S(){f++,e.files=[],e.content=null,e.fileCounts=null,e.fileSearchQuery="",e.onFileSearchChange(),e.repoId=i.repoId,e.type="loading",e.filePath=i.path||"",e.paths=e.filePath.split("/");let I=e.repoId;F(function(H){D();var K=r.resolve();for(let X=0;X0?e.paths.slice(0,X).join("/"):"";K=K.then(function(){return e.getFiles(Y)}).then(function(){if(e.type==="error")return r.reject("error")})}K.then(function(){v||I!==e.repoId||(e.files.length==1&&e.files[0].name==""?(e.files=[],e.type="empty"):(T(),oe()))})})}S()},Ja=function(e,t,s,i,o){async function r(f){t.get(`/api/pr/${e.pullRequestId}/options`).then(v=>{if(e.options=v.data,e.options.url){window.location=e.options.url;return}f&&f(v.data)},v=>{e.type="error",e.content=v.data.error})}async function a(f){t.get(`/api/pr/${e.pullRequestId}/content`).then(v=>{e.details=v.data,e.tabState={active:v.data.diff?"diff":"comments"},f&&f(v.data)},v=>{e.type="error",e.content=v.data.error})}function c(){e.pullRequestId=i.pullRequestId,e.type="loading",r(f=>{a()})}c()},Xa=function(e,t,s,i,o){async function r(f){t.get(`/api/gist/${e.gistId}/options`).then(v=>{if(e.options=v.data,e.options.url){window.location=e.options.url;return}f&&f(v.data)},v=>{e.type="error",e.content=v.data.error})}async function a(f){t.get(`/api/gist/${e.gistId}/content`).then(v=>{e.details=v.data;let g=v.data&&v.data.files&&v.data.files.length;e.tabState={active:g?"files":"comments"},f&&f(v.data)},v=>{e.type="error",e.content=v.data.error})}function c(){e.gistId=i.gistId,e.type="loading",r(()=>{a()})}c()},Za=function(e,t,s){e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.conferences=[],e.loading=!0,e.error="",e.search="";let i="conferences.filterPrefs",o={filters:{status:{ready:!0,expired:!1,removed:!1}},orderBy:"name"},r=loadFilterPrefs(i)||{};e.filters={status:Object.assign({},o.filters.status,r.filters&&r.filters.status||{})},e.orderBy=r.orderBy||o.orderBy,e.watch("orderBy",()=>{saveFilterPrefs(i,{filters:e.filters,orderBy:e.orderBy})}),e.watch("filters",()=>{saveFilterPrefs(i,{filters:e.filters,orderBy:e.orderBy})},!0),e.removeConference=function(a){if(!a.removing&&confirm(`Are you sure that you want to remove the conference ${a.name}? All the repositories linked to this conference will expire.`)){a.removing=!0;let c=ze({title:`Removing ${a.name}...`,date:new Date,body:`The conference ${a.name} is going to be removed.`});e.addToast(c),t.delete(`/api/conferences/${a.conferenceID}`).then(()=>{c.title=`${a.name} is removed.`,c.body=`The conference ${a.name} is removed.`,e.loadConferences()}).catch(()=>{c.title="Unable to remove conference",c.body="Please try again. The conference has not been removed."}).finally(()=>{a.removing=!1})}},e.loadConferences=()=>(e.loading=!0,e.error="",t.get("/api/conferences/").then(a=>{e.conferences=a.data||[]},a=>{e.error="Unable to load your conferences. Please try again."}).finally(()=>{e.loading=!1})),e.loadConferences(),e.conferenceFilter=a=>{if(e.filters.status[a.status]==!1)return!1;let c=e.search.trim().toLowerCase();return!!(!c||(a.name||"").toLowerCase().includes(c)||(a.conferenceID||"").toLowerCase().includes(c))}},di=function(e,t,s,i){e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.plans=[],e.editionMode=!1,e.saving=!1,e.error="";function o(){return t.get("/api/conferences/"+i.conferenceId).then(g=>{e.options={...e.options,...g.data,billing:g.data.billing||{}},e.options.startDate=new Date(e.options.startDate),e.options.endDate=new Date(e.options.endDate)})}i.conferenceId&&(e.editionMode=!0,o());function r(){t.get("/api/conferences/plans").then(g=>{e.plans=g.data,e.plan=e.plans.filter(k=>k.id==e.options.plan.planID)[0]})}r();let a=new Date;a.setDate(1),a.setMonth(a.getMonth()+1);let c=new Date(a);c.setTime(a.getTime()+179*864e5),e.options={billing:{},startDate:a,endDate:c,plan:{planID:"free_conference"},options:{link:!0,image:!0,pdf:!0,notebook:!0,update:!0,page:!0}},e.plan=null,e.watch("options.plan.planID",()=>{e.plan=e.plans.filter(g=>g.id==e.options.plan.planID)[0]});function f(){e.conference.name.setValidity("required",!0),e.conference.conferenceID.setValidity("pattern",!0),e.conference.conferenceID.setValidity("required",!0),e.conference.conferenceID.setValidity("used",!0),e.conference.startDate.setValidity("required",!0),e.conference.startDate.setValidity("invalid",!0),e.conference.endDate.setValidity("required",!0),e.conference.endDate.setValidity("invalid",!0),e.conference.setValidity("error",!0)}function v(g){switch(g){case"conf_name_missing":e.conference.name.setValidity("required",!1);break;case"conf_id_missing":e.conference.conferenceID.setValidity("required",!1);break;case"conf_id_format":e.conference.conferenceID.setValidity("pattern",!1);break;case"conf_id_used":e.conference.conferenceID.setValidity("used",!1);break;case"conf_start_date_missing":e.conference.startDate.setValidity("required",!1);break;case"conf_end_date_missing":e.conference.endDate.setValidity("required",!1);break;case"conf_start_date_invalid":e.conference.startDate.setValidity("invalid",!1);break;case"conf_end_date_invalid":e.conference.endDate.setValidity("invalid",!1);break;default:e.conference.setValidity("error",!1);break}}e.submit=function(){if(e.saving)return;e.saving=!0,e.error="";let g=JSON.parse(JSON.stringify(e.options)),k=ze({title:`Creating ${g.name}...`,date:new Date,body:`The conference ${g.conferenceID} is in creation.`});e.editionMode&&(k.title=`Updating ${g.name}...`,k.body=`The conference '${g.conferenceID}' is updating.`),e.addToast(k),f(),t.post("/api/conferences/"+(e.editionMode?g.conferenceID:""),g).then(()=>{e.editionMode?(k.title=`${g.name} updated`,k.body=`The conference '${g.conferenceID}' is updated.`):(k.title=`${g.name} created`,k.body=`The conference '${g.conferenceID}' is created.`),s.url("/conference/"+g.conferenceID)},m=>{v(m.data?.error),e.error="Unable to save the conference. Please correct any highlighted fields and try again.",e.removeToast(k)}).finally(()=>{e.saving=!1})}},xa=function(e,t,s,i){rs(e,t,()=>o(),{confirmedMessage:"Payment status checked. Your conference is ready for submissions once payment is confirmed."}),e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.conference=null,e.search="",e.filters={status:{ready:!0,expired:!1,removed:!1}},e.orderBy="-anonymizeDate",e.repoFiler=r=>{if(e.filters.status[r.status]==!1)return!1;let a=e.search.trim().toLowerCase();return!!(!a||(r.source?.fullName||"").toLowerCase().includes(a)||(r.repoId||"").toLowerCase().includes(a))};function o(){t.get("/api/conferences/"+i.conferenceId).then(r=>{e.conference=r.data})}o()},el=function(e,t){e.connections=null,e.connectionError="",e.busy=!1,e.loadConnections=()=>t.get("/github/connections").then(s=>{e.connections=s.data}).catch(s=>{e.connectionError=s.data?.error||"Unable to load connections."}),e.changeConnection=async(s,i,o)=>{e.busy=!0,e.connectionError="";try{let r=await t.post("/github/connections/migrate",{type:s.type,id:s.id,connection:i,preview:o},{headers:{"X-CSRF-Token":e.connections.csrf}});o?s.eligible=r.data.eligible:await e.loadConnections()}catch(r){e.connectionError=r.data?.error||"Unable to change connection."}finally{e.busy=!1}},e.disconnectOAuth=async()=>{e.busy=!0;try{await t.post("/github/connections/disconnect-oauth",{},{headers:{"X-CSRF-Token":e.connections.csrf}}),await e.loadConnections()}catch(s){e.connectionError=s.data?.error||"Unable to disconnect OAuth."}finally{e.busy=!1}},e.loadConnections()},tl=function(e,t){e.accountRecovery=!1,t.get("/github/account-recovery").then(s=>{e.accountRecovery=s.data.required}).catch(()=>{})};var nl=function(e,t,s){let i=ct(),o=Jt();e.Math=Math,e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.repositories=[],e.total=-1,e.totalPage=0,e.statusCounts=[],e.totalSize=0,e.selected={},e.allSelected=!1;let r=C=>{if(C.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){C.preventDefault();let E=document.querySelector('.admin-filter-toolbar input[type="search"]');E&&E.focus()}};o(document,"keydown",r),e.on("dispose",()=>document.removeEventListener("keydown",r)),e.clearFilter=C=>{C==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[C]="",e.query.page=1},e.chips=[];let a=()=>{let C=[];e.query.owner&&C.push({key:"owner",label:"Owner",value:e.query.owner}),e.query.conference&&C.push({key:"conference",label:"Conference",value:e.query.conference}),e.chips=C};e.showStatusMessage=C=>{let E=C.statusMessage||"(no message)";window.prompt(`Status message for ${C.repoId} (${C.status}):`,E)},e.fetchGithubInfo=C=>{let E=window.open("","_blank");E&&E.document.write("
Loading GitHub info for "+C.repoId+"...
"),t.get("/api/admin/repos/"+C.repoId+"/github").then(T=>{E&&(E.document.open(),E.document.write('
'+JSON.stringify(T.data,null,2).replace(/[<>]/g,D=>D==="<"?"<":">")+"
"),E.document.close())},T=>{let D=T&&T.data?JSON.stringify(T.data,null,2):String(T);E&&(E.document.body.innerHTML='
'+D+"
")})},e.statusCountFor=C=>{let E=(e.statusCounts||[]).find(T=>T._id===C);return E?E.count:0},e.statusStorageFor=C=>{let E=(e.statusCounts||[]).find(T=>T._id===C);return E?E.storage:0},e.isErrorsOnly=()=>e.query&&e.query.error&&!e.query.ready&&!e.query.preparing&&!e.query.expired&&!e.query.removed,e.toggleErrorsOnly=()=>{e.isErrorsOnly()?Object.assign(e.query,{ready:!1,preparing:!0,expired:!1,removed:!1,error:!0}):Object.assign(e.query,{ready:!1,preparing:!1,expired:!1,removed:!1,error:!0}),e.query.page=1},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=C=>{e.query.sort===C?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=C,e.query.direction="desc"),e.query.page=1},e.sortIcon=C=>e.query.sort===C?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let c="admin.repos.filterPrefs",f={page:1,limit:25,sort:"lastView",direction:"desc",search:"",owner:"",conference:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},v=loadFilterPrefs(c)||{};e.query=Object.assign({},f,v,{page:1,search:""});let g=s.search();g.owner&&(e.query.owner=g.owner),g.conference&&(e.query.conference=g.conference),g.search&&(e.query.search=g.search);let k="admin.repos.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let C=window.prompt("Preset name:");if(!C)return;let E=Object.assign({},e.query);delete E.page,e.presets=(e.presets||[]).filter(T=>T.name!==C),e.presets.push({name:C,query:E}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=C=>{Object.assign(e.query,C.query,{page:1})},e.deletePreset=C=>{e.presets=(e.presets||[]).filter(E=>E.name!==C.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.repositories.forEach(C=>{e.selected[C.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(C=>e.selected[C.repoId]),e.bulkRefresh=()=>{let C=e.selectedRepos();C.length&&confirm(`Force refresh ${C.length} repositories?`)&&C.forEach(E=>e.updateRepository(E))},e.bulkRemoveCache=()=>{let C=e.selectedRepos();C.length&&confirm(`Purge cache for ${C.length} repositories?`)&&C.forEach(E=>e.removeCache(E))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let C=new URLSearchParams(Object.entries(e.query).filter(([,E])=>E!==""&&E!==!1&&E!=null));C.set("format","csv"),C.set("limit","10000"),window.open("/api/admin/repos?"+C.toString(),"_blank")},e.removeCache=C=>{confirm("Remove cached files for "+C.repoId+"?")&&t.delete("/api/admin/repos/"+C.repoId).then(()=>m(),E=>console.error(E))},e.removeRepository=C=>{confirm("Remove repository "+C.repoId+"?")&&t.delete("/api/repo/"+C.repoId+"/").then(()=>m(),E=>console.error(E))},e.updateRepository=C=>{let E=ze({title:`Refreshing ${C.repoId}...`,date:new Date,body:`The repository ${C.repoId} is going to be refreshed.`});e.toasts.push(E),t.post(`/api/repo/${C.repoId}/refresh`).then(T=>{T.data.status=="ready"?E.title=`${C.repoId} is refreshed.`:E.title=`Refreshing of ${C.repoId}.`},T=>{E.title=`Error during the refresh of ${C.repoId}.`,E.body=T.body})},e.fetchError=null;function m(){e.fetchError=null,t.get("/api/admin/repos",{params:e.query}).then(C=>{e.total=C.data.total,e.totalPage=Math.ceil(C.data.total/e.query.limit),e.repositories=C.data.results,e.statusCounts=C.data.statusCounts||[],e.totalSize=C.data.totalSize||0,e.allSelected=!1},C=>{e.fetchError=C&&C.data&&C.data.error||"Failed to load repositories",console.error(C)})}m();let b=null;e.watch("query",()=>{i.timeout.cancel(b),b=i.timeout(m,500);let{page:C,search:E,...T}=e.query;saveFilterPrefs(c,T),a()},!0),a()},ol=function(e,t,s){let i=ct(),o=Jt();e.Math=Math,e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.users=[],e.total=-1,e.totalPage=0,e.statusCounts=[],e.selected={},e.allSelected=!1;let r=m=>{if(m.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){m.preventDefault();let b=document.querySelector('.admin-filter-toolbar input[type="search"]');b&&b.focus()}};o(document,"keydown",r),e.on("dispose",()=>document.removeEventListener("keydown",r)),e.clearFilter=m=>{m==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[m]="",e.query.page=1},e.chips=[];let a=()=>{let m=[];e.query.role&&m.push({key:"role",label:"Role",value:e.query.role}),e.chips=m};e.statusCountFor=m=>{let b=(e.statusCounts||[]).find(C=>C._id===m);return b?b.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=m=>{e.query.sort===m?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=m,e.query.direction="desc"),e.query.page=1},e.sortIcon=m=>e.query.sort===m?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let c="admin.users.filterPrefs",f={page:1,limit:25,sort:"username",direction:"asc",search:"",status:"",role:"",dateFrom:"",dateTo:""},v=loadFilterPrefs(c)||{};e.query=Object.assign({},f,v,{page:1,search:""}),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,e.users.forEach(m=>{e.selected[m.username]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedUsers=()=>e.users.filter(m=>e.selected[m.username]),e.banUser=m=>{confirm(`Ban user ${m.username}?`)&&t.post(`/api/admin/users/${m.username}/ban`).then(g,b=>console.error(b))},e.activateUser=m=>{t.post(`/api/admin/users/${m.username}/activate`).then(g,b=>console.error(b))},e.bulkBan=()=>{let m=e.selectedUsers();m.length&&confirm(`Ban ${m.length} users?`)&&m.forEach(b=>e.banUser(b))},e.exportCsv=()=>{let m=new URLSearchParams(Object.entries(e.query).filter(([,b])=>b!==""&&b!==!1&&b!=null));m.set("format","csv"),m.set("limit","10000"),window.open("/api/admin/users?"+m.toString(),"_blank")},e.fetchError=null;function g(){e.fetchError=null,t.get("/api/admin/users",{params:e.query}).then(m=>{e.total=m.data.total,e.totalPage=Math.ceil(m.data.total/e.query.limit),e.users=m.data.results,e.statusCounts=m.data.statusCounts||[],e.allSelected=!1},m=>{e.fetchError=m&&m.data&&m.data.error||"Failed to load users",console.error(m)})}g();let k=null;e.watch("query",()=>{i.timeout.cancel(k),k=i.timeout(g,500);let{page:m,search:b,...C}=e.query;saveFilterPrefs(c,C),a()},!0),a()},sl=function(e,t,s,i){let o=ct();e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.userInfo,e.repositories=[],e.search="",e.selected={},e.allSelected=!1;let r="admin.user.filterPrefs",a={filters:{status:{ready:!0,expired:!0,removed:!0,error:!0,preparing:!0}},sort:"anonymizeDate",direction:"desc"},c=loadFilterPrefs(r)||{};e.filters={status:Object.assign({},a.filters.status,c.filters&&c.filters.status||{})},e.query={sort:c.sort||a.sort,direction:c.direction||a.direction},e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort,e.sortBy=m=>{e.query.sort===m?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=m,e.query.direction="desc"),e.orderBy=(e.query.direction==="asc"?"":"-")+e.query.sort},e.sortIcon=m=>e.query.sort===m?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"",e.watch("query",()=>{saveFilterPrefs(r,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.watch("filters",()=>{saveFilterPrefs(r,{filters:e.filters,sort:e.query.sort,direction:e.query.direction})},!0),e.statusCountFor=m=>(e.repositories||[]).filter(b=>b.status===m).length,e.repoFiler=m=>e.filters.status[m.status]==!1?!1:!!(e.search.trim().length==0||m.source.fullName.indexOf(e.search)>-1||m.repoId.indexOf(e.search)>-1||m.statusMessage&&m.statusMessage.indexOf(e.search)>-1||m.conference&&m.conference.indexOf(e.search)>-1),e.selectAllOnPage=()=>{e.allSelected=!e.allSelected,(e.filteredRepositories||e.repositories).forEach(m=>{e.selected[m.repoId]=e.allSelected})},e.selectedCount=()=>Object.values(e.selected||{}).filter(Boolean).length,e.selectedRepos=()=>e.repositories.filter(m=>e.selected[m.repoId]),e.bulkRefresh=()=>{let m=e.selectedRepos();m.length&&confirm(`Force refresh ${m.length} repositories?`)&&m.forEach(b=>e.updateRepository(b))},e.bulkRemoveCache=()=>{let m=e.selectedRepos();m.length&&confirm(`Purge cache for ${m.length} repositories?`)&&m.forEach(b=>e.removeCache(b))},e.clearSelection=()=>{e.selected={},e.allSelected=!1},e.exportCsv=()=>{let m=e.filteredRepositories||e.repositories,C=["repoId","status","statusMessage","pageView","anonymizeDate","source.fullName","conference","size.storage"].join(","),E=m.map(O=>[O.repoId,O.status,O.statusMessage||"",O.pageView||0,O.anonymizeDate||"",O.source&&O.source.fullName||"",O.conference||"",O.size&&O.size.storage||0].map(q=>{let F=String(q??"");return/[",\n\r]/.test(F)?'"'+F.replace(/"/g,'""')+'"':F}).join(",")),T=new Blob([C+` +`+E.join(` +`)],{type:"text/csv"}),D=document.createElement("a");D.href=URL.createObjectURL(T),D.download=i.username+"-repositories.csv",D.click()},e.showStatusMessage=m=>{let b=m.statusMessage||"(no message)";window.prompt(`Status message for ${m.repoId} (${m.status}):`,b)},e.fetchGithubInfo=m=>{let b=window.open("","_blank");b&&b.document.write("
Loading GitHub info for "+m.repoId+"...
"),t.get("/api/admin/repos/"+m.repoId+"/github").then(C=>{b&&(b.document.open(),b.document.write('
'+JSON.stringify(C.data,null,2).replace(/[<>]/g,E=>E==="<"?"<":">")+"
"),b.document.close())},C=>{let E=C&&C.data?JSON.stringify(C.data,null,2):String(C);b&&(b.document.body.innerHTML='
'+E+"
")})};function f(m){t.get("/api/admin/users/"+m+"/repos",{}).then(b=>{e.repositories=b.data},b=>{console.error(b)})}function v(m){t.get("/api/admin/users/"+m,{}).then(b=>{e.userInfo=b.data},b=>{console.error(b)})}v(i.username),f(i.username),e.banUser=()=>{confirm(`Ban user ${i.username}?`)&&t.post(`/api/admin/users/${i.username}/ban`).then(()=>v(i.username),m=>console.error(m))},e.activateUser=()=>{t.post(`/api/admin/users/${i.username}/activate`).then(()=>v(i.username),m=>console.error(m))},e.promoteUser=()=>{confirm(`Promote ${i.username} to admin?`)&&t.post(`/api/admin/users/${i.username}/promote`).then(()=>v(i.username),m=>console.error(m))},e.demoteUser=()=>{confirm(`Remove admin privileges from ${i.username}?`)&&t.post(`/api/admin/users/${i.username}/demote`).then(()=>v(i.username),m=>console.error(m))},e.tokens=[],e.tokenForm={name:"",plaintext:null};function g(){t.get("/api/admin/tokens").then(m=>{e.tokens=m.data||[]},m=>{m.status!==401&&m.status!==403&&console.error(m)})}g(),e.createToken=()=>{e.tokenForm.name&&t.post("/api/admin/tokens",{name:e.tokenForm.name}).then(m=>{e.tokenForm.plaintext=m.data.token,e.tokenForm.name="",g()},m=>console.error(m))},e.revokeToken=m=>{confirm(`Revoke token "${m.name}"?`)&&t.delete("/api/admin/tokens/"+m.id).then(()=>g(),b=>console.error(b))},e.removeCache=m=>{confirm("Remove cached files for "+m.repoId+"?")&&t.delete("/api/admin/repos/"+m.repoId).then(()=>f(i.username),b=>console.error(b))},e.removeRepository=m=>{confirm("Remove repository "+m.repoId+"?")&&t.delete("/api/repo/"+m.repoId+"/").then(()=>f(i.username),b=>console.error(b))},e.updateRepository=m=>{let b=ze({title:`Refreshing ${m.repoId}...`,date:new Date,body:`The repository ${m.repoId} is going to be refreshed.`});e.toasts.push(b),t.post(`/api/repo/${m.repoId}/refresh`).then(C=>{C.data.status=="ready"?b.title=`${m.repoId} is refreshed.`:b.title=`Refreshing of ${m.repoId}.`},C=>{b.title=`Error during the refresh of ${m.repoId}.`,b.body=C.body})},e.getGitHubRepositories=m=>{t.get(`/api/user/${e.userInfo.username}/all_repositories`,{params:{force:"1"}}).then(b=>{e.userInfo.repositories=b.data})};let k=null;e.watch("query",()=>{o.timeout.cancel(k),k=o.timeout(()=>{f(i.username)},500)},!0)},il=function(e,t,s){let i=ct(),o=Jt();e.Math=Math,e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.conferences=[],e.total=-1,e.totalPage=0,e.statusCounts=[];let r=C=>{if(C.key==="/"&&!["INPUT","TEXTAREA","SELECT"].includes(document.activeElement?.tagName)){C.preventDefault();let E=document.querySelector('.admin-filter-toolbar input[type="search"]');E&&E.focus()}};o(document,"keydown",r),e.on("dispose",()=>document.removeEventListener("keydown",r)),e.clearFilter=C=>{C==="dateRange"?(e.query.dateFrom="",e.query.dateTo=""):e.query[C]="",e.query.page=1},e.chips=[];let a=()=>{let C=[];(e.query.dateFrom||e.query.dateTo)&&C.push({key:"dateRange",label:"Date",value:(e.query.dateFrom||"\u2026")+" \u2013 "+(e.query.dateTo||"\u2026")}),e.chips=C};e.statusCountFor=C=>{let E=(e.statusCounts||[]).find(T=>T._id===C);return E?E.count:0},e.toggleSortDirection=()=>{e.query.direction=e.query.direction==="asc"?"desc":"asc"},e.sortBy=C=>{e.query.sort===C?e.query.direction=e.query.direction==="asc"?"desc":"asc":(e.query.sort=C,e.query.direction="desc"),e.query.page=1},e.sortIcon=C=>e.query.sort===C?e.query.direction==="asc"?"fa-arrow-up":"fa-arrow-down":"";let c="admin.conferences.filterPrefs",f={page:1,limit:25,sort:"name",direction:"asc",search:"",dateFrom:"",dateTo:"",ready:!1,expired:!1,removed:!1,error:!0,preparing:!0},v=loadFilterPrefs(c)||{};e.query=Object.assign({},f,v,{page:1,search:""});let g=s.search();g.search&&(e.query.search=g.search);let k="admin.conferences.presets";e.presets=JSON.parse(localStorage.getItem(k)||"[]"),e.savePreset=()=>{let C=window.prompt("Preset name:");if(!C)return;let E=Object.assign({},e.query);delete E.page,e.presets=(e.presets||[]).filter(T=>T.name!==C),e.presets.push({name:C,query:E}),localStorage.setItem(k,JSON.stringify(e.presets))},e.applyPreset=C=>{Object.assign(e.query,C.query,{page:1})},e.deletePreset=C=>{e.presets=(e.presets||[]).filter(E=>E.name!==C.name),localStorage.setItem(k,JSON.stringify(e.presets))},e.removeConference=C=>{confirm("Remove conference "+C.conferenceID+"?")&&t.delete("/api/admin/conferences/"+C.conferenceID).then(()=>m(),E=>console.error(E))},e.exportCsv=()=>{let C=new URLSearchParams(Object.entries(e.query).filter(([,E])=>E!==""&&E!==!1&&E!=null));C.set("format","csv"),C.set("limit","10000"),window.open("/api/admin/conferences?"+C.toString(),"_blank")},e.fetchError=null;function m(){e.fetchError=null,t.get("/api/admin/conferences",{params:e.query}).then(C=>{e.total=C.data.total,e.totalPage=Math.ceil(C.data.total/e.query.limit),e.conferences=C.data.results,e.statusCounts=C.data.statusCounts||[]},C=>{e.fetchError=C&&C.data&&C.data.error||"Failed to load conferences",console.error(C)})}m();let b=null;e.watch("query",()=>{i.timeout.cancel(b),b=i.timeout(m,500);let{page:C,search:E,...T}=e.query;saveFilterPrefs(c,T),a()},!0),a()},rl=function(e,t,s,i,o){let r=ct();e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.queueList=[],e.jobs=[],e.selectedQueue="download",e.selectedStats=null,e.range="1h",e.allStates=["active","waiting","delayed","failed","completed"],e.stateFilter={active:!0,waiting:!0,delayed:!0,failed:!0,completed:!0},e.query={search:"",autoRefresh:!0},e.filteredJobs=()=>(e.jobs||[]).filter(E=>e.stateFilter[E._state]),e.jobProgressPct=E=>E&&E.progress&&typeof E.progress=="object"&&typeof E.progress.percent=="number"?Math.max(0,Math.min(100,Math.round(E.progress.percent))):typeof E.progress=="number"?Math.max(0,Math.min(100,Math.round(E.progress))):null,e.jobDuration=E=>{if(!E.processedOn)return"-";let D=(E.finishedOn||Date.now())-E.processedOn;return D<1e3?D+"ms":(D/1e3).toFixed(1)+"s"},e.metricsPoints=[],e.selectQueue=E=>{e.selectedQueue=E,a(),c()},e.setRange=E=>{e.range=E,c()};function a(){let E={queue:e.selectedQueue,search:e.query.search};t.get("/api/admin/queues",{params:E}).then(T=>{e.queueList=T.data.queues||[],e.jobs=T.data.jobs||[],e.selectedStats=e.queueList.find(D=>D.key===e.selectedQueue)||e.queueList[0]||null},T=>console.error(T))}function c(){t.get("/api/admin/queues/metrics",{params:{queue:e.selectedQueue,range:e.range}}).then(E=>{e.metricsPoints=E.data.points||[],o(m,0)},E=>console.error(E))}a(),c();let f=i(()=>{e.query.autoRefresh&&(a(),c())},15e3);e.on("dispose",()=>i.cancel(f)),e.refreshNow=function(){a(),c()};function v(E){let T=E&&E.data&&(E.data.message||E.data.error)||"Request failed";e.actionError=T,o(()=>{e.actionError=null},5e3),console.error(E)}e.actionError=null,e.removeJob=E=>{t.delete(`/api/admin/queue/${e.selectedQueue}/${E.id}`).then(a,v)},e.retryJob=E=>{t.post(`/api/admin/queue/${e.selectedQueue}/${E.id}`).then(a,v)},e.retryFailed=()=>{confirm(`Retry all failed jobs in ${e.selectedQueue}?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/retry-failed`).then(a,E=>console.error(E))},e.drainSelected=()=>{confirm(`Drain the ${e.selectedQueue} queue?`)&&t.post(`/api/admin/queue/${e.selectedQueue}/drain`).then(a,E=>console.error(E))},e.togglePause=()=>{let E=e.selectedStats&&e.selectedStats.paused?"resume":"pause";t.post(`/api/admin/queue/${e.selectedQueue}/${E}`).then(a,T=>console.error(T))},e.emptyQueue=()=>{confirm(`Empty the ${e.selectedQueue} queue? This removes ALL jobs.`)&&t.post(`/api/admin/queue/${e.selectedQueue}/empty`).then(a,E=>console.error(E))},e.pauseAll=()=>{confirm("Pause all queues?")&&t.post("/api/admin/queues/pause-all").then(a,E=>console.error(E))};let g=null;e.watch("query.search",()=>{r.timeout.cancel(g),g=r.timeout(a,350)}),e.expanded={},e.toggleJob=E=>{e.expanded[E.id]=!e.expanded[E.id]},e.humanTime=E=>{if(!E)return"";let T=new Date(E);return T.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})+" "+T.toLocaleDateString([],{month:"short",day:"numeric"})},e.delayCountdown=E=>{if(!E)return"";var T=Math.max(0,Math.ceil((E-Date.now())/1e3));if(T<=0)return"resuming soon";var D=Math.floor(T/60),O=T%60;return"in "+(D>0?D+"m "+O+"s":O+"s")};function k(E){if(E<=0)return{ticks:[0],niceMax:1};let T=Math.pow(10,Math.floor(Math.log10(E))),D=T;E/D<2?D=T/2:E/D>5&&(D=T*2);let O=Math.ceil(E/D)*D,q=[];for(let F=0;F<=O;F+=D)q.push(F);return{ticks:q,niceMax:O}}function m(){var E=document.getElementById("q-throughput-chart");if(!E)return;var T=E.getContext("2d"),D=window.devicePixelRatio||1,O=E.parentElement.getBoundingClientRect(),q=44,F=50,M=20,z=O.width-40,se=180,oe=z-q-F,S=se-M;E.width=z*D,E.height=se*D,E.style.width=z+"px",E.style.height=se+"px",T.setTransform(D,0,0,D,0,0);var I=document.body.classList.contains("dark-mode"),H="#8A857C",K=I?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",X=I?"#A7B2FF":"#3B4AD6",Y=I?"rgba(167,178,255,0.12)":"rgba(59,74,214,0.08)",ee=I?"#F08A82":"#B42318",ce=I?"rgba(240,138,130,0.08)":"rgba(180,35,24,0.06)",le=I?"#F5C842":"#B8860B",re=e.metricsPoints||[];if(re.length===0){T.fillStyle=H,T.font="12px monospace",T.textAlign="center",T.fillText("No metrics data yet",z/2,se/2),b=null;return}var Se=re.map(function(V){return V.completed}),$e=re.map(function(V){return V.failed}),Ne=re.map(function(V){return V.avgMs}),ke=re.length,Ee=oe/(ke-1||1),Le=Math.max(1,Math.max.apply(null,Se),Math.max.apply(null,$e)),qe=k(Le),Ue=Math.max.apply(null,Ne),U=Ue>0?k(Ue):{ticks:[0],niceMax:1},ne=function(V){return S-V/qe.niceMax*(S-10)},x=function(V){return S-V/U.niceMax*(S-10)},ie=function(V){return q+V*Ee};T.textAlign="right",T.textBaseline="middle",T.font="10px monospace",qe.ticks.forEach(function(V){var B=ne(V);T.strokeStyle=K,T.lineWidth=1,T.beginPath(),T.moveTo(q,B),T.lineTo(z-F,B),T.stroke(),T.fillStyle=H,T.fillText(V>=1e3?(V/1e3).toFixed(1)+"k":String(V),q-6,B)}),Ue>0&&(T.textAlign="left",U.ticks.forEach(function(V){var B=x(V);T.fillStyle=le,T.fillText(V>=1e3?(V/1e3).toFixed(1)+"s":V+"ms",z-F+6,B)}));var ge=Date.now(),Ce=Math.min(6,ke);T.textAlign="center",T.textBaseline="top";for(var _=0;_0&&(T.beginPath(),Ne.forEach(function(V,B){var Q=ie(B),J=x(V);if(B===0)T.moveTo(Q,J);else{var j=(ie(B-1)+Q)/2;T.bezierCurveTo(j,x(Ne[B-1]),j,J,Q,J)}}),T.strokeStyle=le,T.lineWidth=1,T.setLineDash([4,3]),T.stroke(),T.setLineDash([])),b={pts:re,maxLen:ke,marginLeft:q,step:Ee,totalW:z,toX:ie}}var b=null;function C(){var E=document.getElementById("q-throughput-chart");if(!(!E||E._tipBound)){E._tipBound=!0;var T=document.getElementById("q-chart-tooltip"),D=document.getElementById("q-chart-crosshair");E.addEventListener("mousemove",function(O){if(!(!b||!T||!D)){var q=b,F=E.getBoundingClientRect(),M=O.clientX-F.left,z=Math.round((M-q.marginLeft)/q.step);if(z<0||z>=q.maxLen){T.style.display="none",D.style.display="none";return}var se=q.pts[z],oe=Date.now(),S=Math.round((oe-se.ts)/6e4),I;if(S<=0)I="now";else if(S<60)I=S+"m ago";else if(S<1440){var H=Math.floor(S/60),K=S%60;I=H+"h"+(K?" "+K+"m":"")+" ago"}else I=Math.round(S/1440)+"d ago";var X='
'+I+'
● completed: '+se.completed+'/min
● failed: '+se.failed+"/min
";if(se.avgMs>0){var Y=se.avgMs>=1e3?(se.avgMs/1e3).toFixed(1)+"s":se.avgMs+"ms";X+='
● avg time: '+Y+"
"}T.innerHTML=X;var ee=q.toX(z),ce=T.offsetWidth,le=ee+10;le+ce>q.totalW&&(le=ee-ce-10),T.style.display="block",T.style.left=le+"px",T.style.top="8px",D.style.display="block",D.style.left=ee+"px"}}),E.addEventListener("mouseleave",function(){T&&(T.style.display="none"),D&&(D.style.display="none")})}}e.watch("metricsPoints",function(){o(C,50)})},al=function(e,t,s,i){let o=ct();e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null&&s.url("/"),e.entries=[],e.visible=[],e.available=!0,e.cap=1e3,e.total=0,e.pageSize=250,e.expanded={},e.detailTab={},e.copyHint="",e.parsedFilterCount=0,e.stats={last24h:0,prev24h:0,delta:0,severity:{error:0,warn:0,info:0},unique:{error:0,warn:0,info:0},buckets:[],dropped:0},e.query={search:"",bucket:"",sort:"recent",group:"code",autoRefresh:!0},e.relTime=D=>{if(!D)return"";let O=new Date(D).getTime();if(isNaN(O))return D;let q=Math.max(0,Date.now()-O),F=Math.floor(q/1e3);if(F<5)return"just now";if(F<60)return`${F}s ago`;let M=Math.floor(F/60);if(M<60)return`${M}m ago`;let z=Math.floor(M/60);if(z<24)return`${z}h ago`;let se=Math.floor(z/24);return se<7?`${se}d ago`:new Date(D).toLocaleDateString()},e.absTime=D=>{if(!D)return"";let O=new Date(D);return isNaN(O.getTime())?D:O.toLocaleString()},e.absTimeShort=D=>{if(!D)return"";let O=new Date(D);return isNaN(O.getTime())?D:O.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})};let r=/^[a-zA-Z][a-zA-Z0-9]*(?:_[a-zA-Z0-9]+)+$/;function a(D,O){let q=D&&(D.httpStatus||D.status)||null;if(typeof q=="number"){if(q>=500)return"error";if(q===401||q===403||q===404)return"info";if(q>=400)return"warn"}return O==="error"?"error":O==="warn"?"warn":"info"}function c(D){let O=(D.raw||[]).find(z=>z&&typeof z=="object"&&!Array.isArray(z));if(O){O.message&&r.test(O.message)?(D.displayMessage=O.message,D.displayContext=D.message):O.code&&r.test(String(O.code))?(D.displayMessage=String(O.code),D.displayContext=D.message):O.name&&O.name!=="AnonymousError"&&O.name!=="Error"?(D.displayMessage=O.name,D.displayContext=O.message||D.message):D.displayMessage=D.message,D._status=O.httpStatus||O.status||null,D._url=O.url||null,D._method=O.method||null,D._repoId=O.repoId||O.detail||null,D._detail=O.detail&&O.detail!==D._repoId?O.detail:null;let z=typeof O.stack=="string"?O.stack:null;for(var q=[O.cause,O.err].filter(Boolean),F=0;!z&&F{S==null||S===""||q.push([oe,S])};F("name",O&&O.name),F("code",D.displayMessage||O&&O.message),D._bucket&&F("kind",D._bucket),F("httpStatus",O&&O.httpStatus),O&&O.status&&!O.httpStatus&&F("status",O.status),F("module",D.module);let M=O&&O.detail;if(typeof M=="string"){let oe=M.trim();if(oe[0]==="{"||oe[0]==="[")try{M=JSON.parse(M)}catch{}}if(F("detail",M),F("repoId",O&&O.repoId),F("filePath",O&&O.filePath),F("upstreamStatus",O&&O.upstreamStatus),F("upstreamBody",O&&O.upstreamBody),F("url",D._url),F("err",O&&O.err),F("cause",O&&!O.err&&O.cause),F("ts",D.ts),!q.length)return JSON.stringify(D,null,2);let z=q.reduce((oe,S)=>Math.max(oe,S[0].length),0),se=["{"];return q.forEach(([oe,S],I)=>{let K=` ${`"${oe}":`.padEnd(z+3," ")} `,X=Ile===0?ce:ee+ce).join(` +`)}else typeof S=="number"||typeof S=="boolean"?Y=String(S):Y=JSON.stringify(S);se.push(`${K}${Y}${X}`)}),se.push("}"),se.join(` +`)}function v(D){let O=[],q="",F=/(\w+):(>=|<=|!=|>|<|=)?([^\s]+)/g,M=0,z;for(;z=F.exec(D);)q+=D.slice(M,z.index),M=F.lastIndex,O.push({key:z[1],op:z[2]||"=",val:z[3]});return q+=D.slice(M),{filters:O,free:q.trim().toLowerCase()}}function g(D,O){for(let q of O.filters){let F=(z,se,oe)=>{let S=parseFloat(z),I=parseFloat(se);return oe==="="?String(z)===String(se):oe==="!="?String(z)!==String(se):oe===">="?S>=I:oe==="<="?S<=I:oe===">"?S>I:oe==="<"?SO&&M._bucket!==O?!1:g(M,D)),F=e.query.group;if(F){let M=oe=>F==="module"?oe.module:oe.displayMessage||oe.message||"_",z=new Map;for(let oe of q){let S=M(oe);if(z.has(S)){let I=z.get(S);I.count++,I._related.push(oe),new Date(oe.ts)>new Date(I.ts)&&(I.ts=oe.ts,I._url=oe._url,I._status=oe._status),new Date(oe.ts)new Date(S.ts).getTime()>=se).length;q=Array.from(z.values())}else q=q.map((M,z)=>(M._key="row:"+z+":"+M.ts,M._related=[M],M._firstSeen=M.ts,M._lastHourCount=0,M.count=1,M));e.query.sort==="count"?q.sort((M,z)=>z.count-M.count||new Date(z.ts)-new Date(M.ts)):q.sort((M,z)=>new Date(z.ts)-new Date(M.ts)),e.visible=q}function m(D){let O=D?e.entries.length:0,q=D?e.pageSize:Math.max(e.pageSize,e.entries.length||e.pageSize);t.get("/api/admin/errors",{params:{offset:O,limit:q}}).then(F=>{let M=(F.data.entries||[]).map(c);e.entries=D?e.entries.concat(M):M,e.available=!!F.data.available,e.cap=F.data.max||e.cap,e.total=F.data.total||e.entries.length,k()},F=>console.error(F))}e.loadMore=()=>m(!0),e.canLoadMore=()=>e.entries.length{let O=D.data||{},q=O.prev24h?Math.round((O.last24h-O.prev24h)/O.prev24h*100):0;e.stats={last24h:O.last24h||0,prev24h:O.prev24h||0,delta:q,severity:O.severity||{error:0,warn:0,info:0},unique:O.unique||{error:0,warn:0,info:0},buckets:O.buckets||[],dropped:O.dropped||0}},D=>console.error(D))}function C(){m(),b()}e.barPx=(D,O)=>{let q=e.stats.buckets||[],F=0;for(let oe of q)F=Math.max(F,(oe.error||0)+(oe.warn||0)+(oe.info||0));if(!F)return 0;let M=(D.error||0)+(D.warn||0)+(D.info||0);if(!M)return 0;let z=Math.round(M/F*60),se=D[O]||0;return Math.round(se/M*z)},e.bucketTitle=D=>`${new Date(D.hour).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})} \xB7 ${D.error||0} err \xB7 ${D.warn||0} warn \xB7 ${D.info||0} info`,e.toggle=D=>{e.expanded[D._key]=!e.expanded[D._key]},e.setBucket=D=>{e.query.bucket=D},e.refreshNow=C,e.clearAll=()=>{confirm("Clear all captured errors?")&&t.delete("/api/admin/errors").then(C,D=>console.error(D))},e.exportCsv=()=>{let D=["ts","level","module","displayMessage","_status","_url","_repoId"],O=[D.join(",")];for(let z of e.visible)O.push(D.map(se=>{let oe=z[se]==null?"":String(z[se]);return/[",\n]/.test(oe)?`"${oe.replace(/"/g,'""')}"`:oe}).join(","));let q=new Blob([O.join(` +`)],{type:"text/csv;charset=utf-8"}),F=URL.createObjectURL(q),M=document.createElement("a");M.href=F,M.download=`errors-${new Date().toISOString().slice(0,19)}.csv`,document.body.appendChild(M),M.click(),document.body.removeChild(M),URL.revokeObjectURL(F)};function E(D){e.copyHint=`${D} copied`,o.timeout(()=>{e.copyHint=""},1500)}e.copyJson=D=>{navigator.clipboard.writeText(D._detailJson).then(()=>E("JSON"))},e.copyCurl=D=>{if(!D._url)return;let q=`curl -X ${D._method||"GET"} '${window.location.origin}${D._url}'`;navigator.clipboard.writeText(q).then(()=>E("curl"))},C();let T=i(()=>{e.query.autoRefresh&&C()},15e3);e.on("dispose",()=>i.cancel(T)),e.watch("query.search",k),e.watch("query.bucket",k),e.watch("query.sort",k),e.watch("query.group",k)},ll=function(e,t,s,i){if(e.Math=Math,e.watch("user.status",()=>{e.user==null&&s.url("/")}),e.user==null){s.url("/");return}e.data=null,e.loading=!0,e.error=null,e.performance=null,e.performanceMinutes=15,e.performanceTab="routes",e.performanceError=null,e.latencyBound=function(b,C){return b.count?b[C]==null?"> 60 s":"\u2264 "+b[C]+" ms":"No samples"},e.firstByteBound=function(b){return e.latencyBound({count:b.firstByteCount,p95UpperMs:b.firstByteP95UpperMs},"p95UpperMs")},e.sampleAge=function(b){return Math.max(0,Math.round((Date.now()-b.sampledAt)/1e3))},e.peakRss=function(b){return(e.performance.runtimeSeries||[]).filter(function(C){return C.instance===b.instance}).reduce(function(C,E){return Math.max(C,E.rss)},b.memory.rss)},e.performanceWarning=function(b){return e.sampleAge(b)>45||b.droppedBatches||b.droppedMetrics||b.sockets?.closeWait>0||b.eventLoop.p95Ms>100||b.memoryLimitBytes&&b.memory.rss>b.memoryLimitBytes*.8};var o=!1;e.loadPerformance=function(){var b=e.performanceMinutes;e.performance?.windowMinutes&&e.performance.windowMinutes!==b&&(e.performance=null),!o&&(o=!0,t.get("/api/admin/performance",{params:{minutes:b}}).then(function(C){b===e.performanceMinutes&&(e.performance=C.data,e.performanceError=C.data.available?null:"Performance monitoring is unavailable. Request history may be incomplete.")},function(){b===e.performanceMinutes&&(e.performanceError="Could not refresh performance monitoring. Displayed samples may be stale.")}).finally(function(){o=!1,b!==e.performanceMinutes&&e.loadPerformance()}))};function r(b){if(b==null)return"\u2014";for(var C=["B","KB","MB","GB","TB"],E=0,T=b;T>=1024&&E0?1:0)+" "+C[E]}e.humanBytes=r;function a(b){if(!b)return"\u2014";var C=Math.floor(b/86400),E=Math.floor(b%86400/3600),T=Math.floor(b%3600/60);return C>0?C+"d "+(E<10?"0":"")+E+"h":E>0?E+"h "+(T<10?"0":"")+T+"m":T+"m"}e.humanDuration=a;function c(b){return b==null?"\u2014":b>=1e6?(b/1e6).toFixed(1)+"M":b>=1e3?(b/1e3).toFixed(1)+"K":String(b)}e.humanNum=c,e.queueTotal=function(b){return b?(b.waiting||0)+(b.active||0)+(b.delayed||0)+(b.failed||0):0},e.statusCount=function(b){if(!e.data||!e.data.repos)return 0;for(var C=e.data.repos.statusBreakdown||[],E=0;Eg[E])&&(g[E]=C[E])})})},function(b){e.loading=!1,e.error=b.data&&b.data.error||"Failed to load overview"})}k();var m=i(k,3e4);e.on("dispose",function(){i.cancel(m)})};var dl=[{path:"/connections",template:"partials/connections.htm",title:"GitHub connections \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>el(e,t.http)},{path:"/signin",template:"partials/signin.htm",title:"Sign in \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>tl(e,t.http)},{path:"/",template:"partials/home.htm",title:"Anonymous GitHub \u2013 Share the code, not the author",preserveExplorer:!1,setup:(e,t)=>Ka(e,t.http,t.location,t.window,t.timeout)},{path:"/dashboard",template:"partials/dashboard.htm",title:"Your anonymizations \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ya(e,t.http,t.location,t.promises,t.window,t.quotaService)},{path:"/pr-dashboard",redirect:"/dashboard"},{path:"/anonymize/:repoId?",template:"partials/anonymize.htm",title:"New anonymization \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>as(e,t.http,t.html,t.params,t.location,t.translate,t.timeout)},{path:"/pull-request-anonymize/:pullRequestId?",template:"partials/anonymize.htm",title:"Anonymize a pull request \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>as(e,t.http,t.html,t.params,t.location,t.translate,t.timeout)},{path:"/gist-anonymize/:gistId?",template:"partials/anonymize.htm",title:"Anonymize a gist \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>as(e,t.http,t.html,t.params,t.location,t.translate,t.timeout)},{path:"/status/:repoId",template:"partials/status.htm",title:"Repository status \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Qa(e,t.http,t.params)},{path:"/conferences",template:"partials/conferences.htm",title:"Your conferences \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Za(e,t.http,t.location)},{path:"/conference/new",template:"partials/newConference.htm",title:"New conference \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>di(e,t.http,t.location,t.params)},{path:"/conference/:conferenceId/edit",template:"partials/newConference.htm",title:"Edit conference \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>di(e,t.http,t.location,t.params)},{path:"/conference/:conferenceId",template:"partials/conference.htm",title:"Conference \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>xa(e,t.http,t.location,t.params)},{path:"/faq",template:"partials/faq.htm",title:"FAQ \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>ja(e,t.http)},{path:"/profile",template:"partials/profile.htm",title:"Your settings \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ga(e,t.http,t.translate,t.timeout,t.quotaService)},{path:"/claim",template:"partials/claim.htm",title:"Claim an anonymization \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Wa(e,t.http,t.location)},{path:"/pr/:pullRequestId/:path(.*)*",template:"partials/pullRequest.htm",title:"Anonymous pull request \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Ja(e,t.http,t.location,t.params,t.html)},{path:"/gist/:gistId/:path(.*)*",template:"partials/gist.htm",title:"Anonymous gist \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>Xa(e,t.http,t.location,t.params,t.html)},{path:"/r/:repoId/:path(.*)*",template:"partials/explorer.htm",title:"Anonymous repository \u2013 Anonymous GitHub",preserveExplorer:!0,setup:(e,t)=>li(e,t.http,t.location,t.params,t.html,t.promises)},{path:"/repository/:repoId/:path(.*)*",template:"partials/explorer.htm",title:"Anonymous repository \u2013 Anonymous GitHub",preserveExplorer:!0,setup:(e,t)=>li(e,t.http,t.location,t.params,t.html,t.promises)},{path:"/admin/",template:"partials/admin/overview.htm",title:"Admin \xB7 Overview \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>ll(e,t.http,t.location,t.interval)},{path:"/admin/repositories",template:"partials/admin/repositories.htm",title:"Admin \xB7 Repositories \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>nl(e,t.http,t.location)},{path:"/admin/users",template:"partials/admin/users.htm",title:"Admin \xB7 Users \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>ol(e,t.http,t.location)},{path:"/admin/users/:username",template:"partials/admin/user.htm",title:"Admin \xB7 User details \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>sl(e,t.http,t.location,t.params)},{path:"/admin/conferences",template:"partials/admin/conferences.htm",title:"Admin \xB7 Conferences \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>il(e,t.http,t.location)},{path:"/admin/queues",template:"partials/admin/queues.htm",title:"Admin \xB7 Queues \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>rl(e,t.http,t.location,t.interval,t.timeout)},{path:"/admin/errors",template:"partials/admin/errors.htm",title:"Admin \xB7 Errors \u2013 Anonymous GitHub",preserveExplorer:!1,setup:(e,t)=>al(e,t.http,t.location,t.interval)},{path:"/404",template:"partials/404.htm",title:"Page not found \u2013 Anonymous GitHub",preserveExplorer:!1,setup:()=>{}},{path:"/:pathMatch(.*)*",template:"partials/404.htm",title:"Page not found \u2013 Anonymous GitHub",setup:()=>{}}];var fp={class:"container paper-page connections-page"},hp={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},mp={key:1,role:"status"},vp=["disabled"],gp={key:3},yp={class:"connections-grid"},bp={key:0},wp={class:"connection-title"},kp={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},Ep={class:"connection-actions"},Cp={key:0,class:"btn btn-ink",target:"_self",href:"/github/app/install"},_p={key:1,class:"connection-installations"},Sp={key:0},Np=["href"],Dp={class:"sr-only"},Rp=["disabled"],Tp={class:"connection-title"},Ap={key:0,target:"_self",href:"/github/login",class:"btn btn-outline-ink"},Op={key:1,class:"connection-revoke"},Pp={key:0},Ip=["disabled"],Vp={class:"connection-resources"},qp={class:"connection-title"},Mp={class:"connection-count"},$p={key:0,class:"connection-empty"},Lp={class:"connection-resource-name"},Up={key:0,class:"connection-resource-actions"},Fp=["disabled","onClick"],Bp=["disabled","onClick"],zp={key:1,class:"connection-help",role:"status"},Hp=["disabled","onClick"];function ul(e,t){return l(),d("div",fp,[t[20]||(t[20]=pe('
My work / GitHub connections

GitHub connections

Manage how GitHub shares your code. Your anonymizations and URLs stay the same.

',2)),e.connectionError?(l(),d("p",hp,u(e.connectionError),1)):p("v-if",!0),!e.connections&&!e.connectionError?(l(),d("p",mp,"Loading your connections\u2026")):p("v-if",!0),!e.connections&&e.connectionError?(l(),d("button",{key:2,class:"btn btn-outline-ink",disabled:e.busy,onClick:t[0]||(t[0]=s=>e.loadConnections())},"Try again",8,vp)):p("v-if",!0),e.connections?(l(),d("div",gp,[n("div",yp,[e.connections.appEnabled?(l(),d("section",bp,[t[8]||(t[8]=n("div",{class:"connection-top"},[n("i",{class:"fab fa-github","aria-hidden":"true"}),n("span",{class:"connection-badge"},"Recommended")],-1)),n("div",wp,[t[3]||(t[3]=n("h2",null,"GitHub App",-1)),n("span",{class:A(["connection-status",{"is-connected":e.connections.appConnected&&!e.connections.appError}])},u(e.connections.appError?"Needs attention":e.connections.appConnected?"Connected":"Not connected"),3)]),t[9]||(t[9]=n("p",null,"Read-only access to gists and the repositories you choose.",-1)),e.connections.appError?(l(),d("p",kp,u(e.connections.appError)+". Reconnect to restore access.",1)):p("v-if",!0),n("div",Ep,[e.connections.appConnected&&!e.connections.appError?(l(),d("a",Cp,[...t[4]||(t[4]=[y("Manage repository access ",-1),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-external-link"})],-1)])])):p("v-if",!0),n("a",{class:A(e.connections.appConnected&&!e.connections.appError?"connection-link":"btn btn-ink"),target:"_self",href:"/github/app/login"},u(e.connections.appConnected?"Reconnect account":"Connect GitHub account"),3)]),t[10]||(t[10]=n("p",{class:"connection-help"},"Choose repositories on GitHub. Organization access may need an administrator's approval.",-1)),e.connections.installations?.length?(l(),d("ul",_p,[(l(!0),d(W,null,Z(e.connections.installations,s=>(l(),d("li",{key:s.id},[n("div",null,[n("strong",null,u(s.account),1),s.suspended?(l(),d("span",Sp," \xB7 Suspended")):p("v-if",!0)]),n("a",{target:"_self",href:"/github/app/install?installationId="+s.id},[t[5]||(t[5]=y("Manage access ",-1)),n("span",Dp,"for "+u(s.account),1),t[6]||(t[6]=y(" \u2192",-1))],8,Np)]))),128))])):p("v-if",!0),n("button",{class:"connection-link",disabled:e.busy,onClick:t[1]||(t[1]=s=>e.loadConnections())},[...t[7]||(t[7]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Refresh access",-1)])],8,Rp)])):p("v-if",!0),n("section",null,[t[13]||(t[13]=n("div",{class:"connection-top"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-key"})]),n("span",{class:"connection-badge connection-badge-muted"},"Legacy")],-1)),n("div",Tp,[t[11]||(t[11]=n("h2",null,"GitHub OAuth",-1)),n("span",{class:A(["connection-status",{"is-connected":e.connections.oauthConnected}])},u(e.connections.oauthConnected?"Connected":"Not connected"),3)]),t[14]||(t[14]=n("p",null,"For existing OAuth anonymizations.",-1)),t[15]||(t[15]=n("p",{class:"connection-help"},"This connection uses GitHub's broader repository permissions. Existing work keeps using it until you switch below.",-1)),e.connections.oauthEnabled?(l(),d("a",Ap,u(e.connections.oauthConnected?"Reconnect OAuth":"Connect legacy OAuth"),1)):p("v-if",!0),e.connections.oauthConnected?(l(),d("div",Op,[e.connections.gistCount?(l(),d("p",Pp,u(e.connections.gistCount)+" gist(s) use your GitHub App connection when available.",1)):p("v-if",!0),t[12]||(t[12]=n("p",null,"Switch all dependent repositories before revoking access. Gists can use your GitHub App connection.",-1)),e.connections.appConnected?(l(),d("button",{key:1,class:"connection-link connection-danger",disabled:e.busy||e.connections.resources.some(s=>s.connection==="oauth"),onClick:t[2]||(t[2]=s=>e.disconnectOAuth())},"Revoke OAuth access",8,Ip)):p("v-if",!0)])):p("v-if",!0)])]),n("section",Vp,[n("div",qp,[t[16]||(t[16]=n("h2",null,"Repository connections",-1)),n("span",Mp,u(e.connections.resources?.length||0)+" resources",1)]),t[18]||(t[18]=n("p",null,"Check access, then switch each resource to the GitHub App. After reinstalling the App, reconnect existing resources here to keep their anonymous URLs and published snapshots.",-1)),e.connections.resources?.length?p("v-if",!0):(l(),d("div",$p,[...t[17]||(t[17]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1),n("div",null,[n("h3",null,"No repository connections yet"),n("p",null,"Your repositories and pull requests will appear here once you anonymize them.")],-1),n("a",{class:"connection-link",href:"/anonymize"},"New anonymization \u2192",-1)])])),(l(!0),d(W,null,Z(e.connections.resources,s=>(l(),d("div",{class:"connection-resource",key:s.type+s.id},[n("div",Lp,[n("strong",null,u(s.name||s.id),1),n("small",null,u(s.type)+" \xB7 "+u(s.id),1)]),n("span",{class:A(["connection-badge",{"connection-badge-muted":s.connection==="oauth"}])},u(s.connection==="github-app"?"Read-only App":"Legacy OAuth"),3),!["archived","removed","preparing","queue","removing","expiring"].includes(s.status)&&(s.status!=="download"||s.type==="pull-request"&&(!s.statusDate||new Date(s.statusDate).getTime()<=Date.now()-3e5))&&e.connections.appEnabled&&e.connections.appConnected?(l(),d("div",Up,[n("button",{class:"btn btn-outline-ink",disabled:e.busy,onClick:i=>e.changeConnection(s,"github-app",!0)},"Check read-only access",8,Fp),s.eligible?(l(),d("button",{key:0,class:"btn btn-ink",disabled:e.busy,onClick:i=>e.changeConnection(s,"github-app",!1)},u(s.connection==="github-app"?"Reconnect read-only access":"Switch to read-only access"),9,Bp)):p("v-if",!0),s.eligible===!1?(l(),d("span",zp,"Access unavailable. Allow this repository on GitHub, then check again.")):p("v-if",!0)])):p("v-if",!0),!["archived","removed","preparing","queue","removing","expiring"].includes(s.status)&&(s.status!=="download"||s.type==="pull-request"&&(!s.statusDate||new Date(s.statusDate).getTime()<=Date.now()-3e5))&&s.connection==="github-app"&&e.connections.oauthConnected?(l(),d("button",{key:1,class:"connection-link",disabled:e.busy,onClick:i=>e.changeConnection(s,"oauth",!1)},"Use OAuth",8,Hp)):p("v-if",!0)]))),128)),t[19]||(t[19]=n("p",{class:"connection-footnote"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-info"})]),y(" Removing access stops new fetches from GitHub. Published content keeps its current expiration and removal settings.")],-1))])])):p("v-if",!0)])}var jp={class:"container paper-page auth-page"},Gp={class:"auth-layout"},Wp={class:"auth-options"},Kp={key:0},Yp={key:0,class:"btn btn-ink auth-continue",target:"_self",href:"/github/login?recover=1"},Qp={key:1},Jp={key:1},Xp={key:2,class:"auth-legacy"},Zp={key:3,role:"status"};function cl(e,t){return l(),d("div",jp,[t[5]||(t[5]=n("a",{class:"auth-back",href:"/"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-arrow-left"})]),y(" Anonymous GitHub")],-1)),n("div",Gp,[t[4]||(t[4]=pe('
Your research, ready for review

Your code.
Your identity,
protected.
Sign in to GitHub

Sign in to create and manage your anonymizations.

',1)),n("div",Wp,[e.accountRecovery?(l(),d("section",Kp,[t[0]||(t[0]=n("h2",null,"Verify your existing account",-1)),t[1]||(t[1]=n("p",null,"We found an existing account. Verify it with your previous GitHub connection to keep your anonymizations. Future sign-ins will use the GitHub App.",-1)),e.site_options?.GITHUB_OAUTH_ENABLED?(l(),d("a",Yp,"Verify with previous GitHub connection")):(l(),d("p",Qp,"Account verification is currently unavailable. Please try again later."))])):p("v-if",!0),e.site_options?.GITHUB_APP_ENABLED&&!e.accountRecovery?(l(),d("section",Jp,[...t[2]||(t[2]=[pe('
Read-only access

Continue with GitHub

Connect through the GitHub App with read-only repository access.

  • You choose which repositories to share
  • No permission to write to your code
Sign in with GitHub Your existing anonymizations and connections stay with your account.',6)])])):p("v-if",!0),!e.site_options?.GITHUB_APP_ENABLED&&e.site_options?.GITHUB_OAUTH_ENABLED&&!e.accountRecovery?(l(),d("section",Xp,[...t[3]||(t[3]=[n("div",{class:"connection-title"},[n("h2",null,"Continue with GitHub")],-1),n("p",null,"Sign in to access your account. GitHub OAuth includes write access to private repositories.",-1),n("a",{class:"connection-link",target:"_self",href:"/github/login"},[y("Sign in with GitHub "),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-arrow-right"})])],-1)])])):p("v-if",!0),e.site_options&&!e.site_options.GITHUB_APP_ENABLED&&!e.site_options.GITHUB_OAUTH_ENABLED?(l(),d("p",Zp,"GitHub sign-in is currently unavailable. Please try again later.")):p("v-if",!0)])])])}var xp={class:"paper-empty"};function pl(e,t){return l(),d("div",xp,[...t[0]||(t[0]=[pe('
Error \xB7 404

This link
isn\u2019t here.

The anonymous mirror you\u2019re looking for has expired, been removed by its owner, or never existed. If you received this URL from an author, ask them to re-issue it.

',1)])])}var ef={class:"container paper-page admin-page"},tf={class:"admin-summary"},nf={class:"summary-total"},of=["aria-pressed"],sf={class:"count"},rf=["aria-pressed"],af={class:"count"},lf=["aria-pressed"],df={class:"count"},uf=["aria-pressed"],cf={class:"count"},pf=["aria-pressed"],ff={class:"count"},hf={key:0,class:"alert alert-danger",style:{margin:"8px 0"}},mf={class:"w-100 admin-filter-toolbar","aria-label":"Conferences","accept-charset":"UTF-8"},vf={class:"admin-filter-row"},gf={class:"search-wrap"},yf={type:"search",class:"form-control",placeholder:"Search conferences\u2026",autocomplete:"off"},bf={key:0,class:"admin-search-hint"},wf={class:"admin-filter-inline","aria-label":"Pagination"},kf=["disabled"],Ef={style:{"font-family":"var(--font-mono)","font-size":"12px",color:"var(--ink-muted)"}},Cf=["disabled"],_f={key:0,class:"admin-filter-row"},Sf={class:"admin-active-chips"},Nf={class:"key"},Df=["onClick"],Rf={class:"paper-table paper-table-conferences w-100",role:"table","aria-label":"Conferences"},Tf={class:"paper-table-head",role:"row"},Af={role:"columnheader"},Of={role:"columnheader"},Pf={role:"columnheader"},If={class:"paper-table-row",role:"row"},Vf={class:"cell-anon",role:"cell"},qf={class:"anon-text"},Mf=["textContent","href"],$f={class:"anon-sub"},Lf={class:"cell-status",role:"cell"},Uf=["textContent"],Ff={class:"cell-views num",role:"cell"},Bf=["textContent","href"],zf={class:"cell-expires",role:"cell"},Hf={class:"cell-actions",role:"cell"},jf={class:"dropdown"},Gf={class:"dropdown-menu dropdown-menu-right"},Wf=["href"],Kf=["href"],Yf=["href"],Qf=["onClick"],Jf={key:0,class:"paper-table-empty"},Xf={class:"admin-toolbar",style:{"justify-content":"space-between","border-bottom":"none"}},Zf={style:{"font-size":"12px",color:"var(--ink-muted)"}},xf={key:0,class:"pagination-compact"},eh=["disabled"],th=["max"],nh=["disabled"],oh={class:"admin-filter-inline"},sh={class:"form-control form-control-sm"};function fl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",ef,[t[47]||(t[47]=pe('
Admin \xA0/\xA0 Conferences

Conferences

',3)),n("div",tf,[n("span",nf,u(e.total>=0?e.fmt.number(e.total):"\u2026"),1),n("button",{type:"button",class:A(["summary-pill ok",{active:e.query?.ready}]),title:"Toggle ready filter",onClick:t[0]||(t[0]=o=>{e.query.ready=!e.query.ready,e.query.page=1}),"aria-pressed":!!e.query?.ready},[t[13]||(t[13]=y("Ready ",-1)),n("span",sf,u(e.fmt?.number(e.statusCountFor("ready"))),1)],10,of),n("button",{type:"button",class:A(["summary-pill warn",{active:e.query?.preparing}]),title:"Toggle preparing filter",onClick:t[1]||(t[1]=o=>{e.query.preparing=!e.query.preparing,e.query.page=1}),"aria-pressed":!!e.query?.preparing},[t[14]||(t[14]=y("Preparing ",-1)),n("span",af,u(e.fmt?.number(e.statusCountFor("preparing"))),1)],10,rf),n("button",{type:"button",class:A(["summary-pill error",{active:e.query?.error}]),title:"Toggle errored filter",onClick:t[2]||(t[2]=o=>{e.query.error=!e.query.error,e.query.page=1}),"aria-pressed":!!e.query?.error},[t[15]||(t[15]=y("Errored ",-1)),n("span",df,u(e.fmt?.number(e.statusCountFor("error"))),1)],10,lf),n("button",{type:"button",class:A(["summary-pill",{active:e.query?.expired}]),title:"Toggle expired filter",onClick:t[3]||(t[3]=o=>{e.query.expired=!e.query.expired,e.query.page=1}),"aria-pressed":!!e.query?.expired},[t[16]||(t[16]=y("Expired ",-1)),n("span",cf,u(e.fmt?.number(e.statusCountFor("expired"))),1)],10,uf),n("button",{type:"button",class:A(["summary-pill",{active:e.query?.removed}]),title:"Toggle removed filter",onClick:t[4]||(t[4]=o=>{e.query.removed=!e.query.removed,e.query.page=1}),"aria-pressed":!!e.query?.removed},[t[17]||(t[17]=y("Removed ",-1)),n("span",ff,u(e.fmt?.number(e.statusCountFor("removed"))),1)],10,pf)]),e.fetchError?(l(),d("div",hf,[t[18]||(t[18]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),y(" "+u(e.fetchError),1)])):p("v-if",!0),N((l(),d("form",mf,[n("div",vf,[n("div",gf,[N(n("input",yf,null,512),[[s,{state:e.viewState,set:o=>{e.query.search=o},value:e.query?.search,form:null,options:{}}]]),e.query?.search?p("v-if",!0):(l(),d("span",bf,"/"))]),t[22]||(t[22]=n("span",{class:"admin-filter-spacer"},null,-1)),n("button",{class:"btn btn-sm",type:"button",onClick:t[5]||(t[5]=o=>e.exportCsv())},[...t[19]||(t[19]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-export"})],-1),y(" Export",-1)])]),n("span",wf,[n("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[6]||(t[6]=o=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1,"aria-label":"Previous page"},[...t[20]||(t[20]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-left"})],-1)])],8,kf),n("span",Ef,u(e.query?.page)+"/"+u(e.totalPage||1),1),n("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[7]||(t[7]=o=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage,"aria-label":"Next page"},[...t[21]||(t[21]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-right"})],-1)])],8,Cf)])]),e.chips?.length?(l(),d("div",_f,[n("div",Sf,[(l(!0),d(W,null,Z(e.chips,(o,r)=>(l(),d("span",{class:"admin-active-chip",key:o?.key},[n("span",Nf,u(o?.label),1),n("span",null,u(o?.value),1),n("button",{type:"button",onClick:a=>e.clearFilter(o.key),"aria-label":"Clear filter"},[...t[23]||(t[23]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])],8,Df)]))),128))])])):p("v-if",!0)])),[[i,e.viewState]]),n("div",Rf,[n("div",Tf,[n("div",Af,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="name"}]),onClick:t[8]||(t[8]=o=>e.sortBy("name"))},[t[25]||(t[25]=y("Conference ",-1)),e.sortIcon("name")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("name")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[24]||(t[24]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",Of,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="status"}]),onClick:t[9]||(t[9]=o=>e.sortBy("status"))},[t[27]||(t[27]=y("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[26]||(t[26]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[30]||(t[30]=n("div",{role:"columnheader",class:"num"},"Repos",-1)),n("div",Pf,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="startDate"}]),onClick:t[10]||(t[10]=o=>e.sortBy("startDate"))},[t[29]||(t[29]=y("Window ",-1)),e.sortIcon("startDate")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("startDate")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[28]||(t[28]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[31]||(t[31]=n("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(W,null,Z(e.filteredConferences,(o,r)=>(l(),d("div",If,[n("div",Vf,[t[33]||(t[33]=n("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Conference"},[n("use",{href:"#project-icon-conference"})],-1)),n("div",qf,[n("a",{class:"repo-name",textContent:u(o?.name),href:e.safeUrl("/conference/"+o?.conferenceID)},null,8,Mf),n("div",$f,[n("span",null,u(o?.conferenceID),1),t[32]||(t[32]=y("\xA0\xB7\xA0",-1)),n("span",null,u(e.fmt?.number(o?.price||0))+" \u20AC",1)])])]),n("div",Lf,[n("span",{class:A(["status-dot",{"status-removed":o?.status=="removed"||o?.status=="expired","status-ready":o?.status=="ready","status-error":o?.status=="error","status-preparing":o?.status=="preparing"}])},null,2),n("span",{textContent:u(e.fmt?.title(o?.status))},null,8,Uf)]),n("div",Ff,[t[34]||(t[34]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1)),n("a",{title:"Show repositories in this conference",textContent:u(e.fmt?.number(o?.repositories?.length||0)),href:e.safeUrl("/admin/?conference="+o?.conferenceID)},null,8,Bf)]),n("div",zf,[t[35]||(t[35]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),y(" "+u(e.fmt?.date(o?.startDate))+" \u2013 "+u(e.fmt?.date(o?.endDate)),1)]),n("div",Hf,[n("div",jf,[t[41]||(t[41]=n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})])],-1)),n("div",Gf,[n("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+o?.conferenceID+"/edit")},[...t[36]||(t[36]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit",-1)])],8,Wf),n("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+o?.conferenceID+"/")},[...t[37]||(t[37]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View",-1)])],8,Kf),n("a",{class:"dropdown-item",href:e.safeUrl("/admin/?conference="+o?.conferenceID)},[...t[38]||(t[38]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1),y(" View repositories",-1)])],8,Yf),t[40]||(t[40]=n("div",{class:"dropdown-divider"},null,-1)),N(n("a",{class:"dropdown-item text-danger",href:"#",onClick:ue(a=>e.removeConference(o),["prevent"])},[...t[39]||(t[39]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Remove",-1)])],8,Qf),[[G,o?.status!="removed"]])])])])]))),256)),e.filteredConferences?.length==0?(l(),d("div",Jf,[...t[42]||(t[42]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1),n("span",null,"No conferences match the current filters.",-1)])])):p("v-if",!0)]),n("div",Xf,[n("span",Zf,u(e.fmt?.number(e.total))+" results",1),e.totalPage>1?(l(),d("div",xf,[n("button",{class:"btn btn-sm",onClick:t[11]||(t[11]=o=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1},[...t[43]||(t[43]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-left"})],-1),y(" Previous",-1)])],8,eh),N(n("input",{type:"number",class:"form-control form-control-sm",min:"1",style:{width:"56px"},max:e.totalPage},null,8,th),[[s,{state:e.viewState,set:o=>{e.query.page=o},value:e.query?.page,form:null,options:{}}]]),n("span",null,"of "+u(e.totalPage),1),n("button",{class:"btn btn-sm",onClick:t[12]||(t[12]=o=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage},[...t[44]||(t[44]=[y("Next ",-1),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-right"})],-1)])],8,nh)])):p("v-if",!0),n("span",oh,[t[46]||(t[46]=n("label",null,"Per page",-1)),N((l(),d("select",sh,[...t[45]||(t[45]=[pe('',5)])])),[[s,{state:e.viewState,set:o=>{e.query.limit=o},value:e.query?.limit,form:null,options:{}}]])])])])}var ih={class:"container paper-page admin-page errors-page"},rh={class:"errors-header"},ah={class:"errors-actions"},lh={class:"kpi-grid"},dh={class:"kpi-card"},uh={class:"kpi-value"},ch={key:0},ph={key:1},fh={class:"kpi-card kpi-error"},hh={class:"kpi-value"},mh={class:"kpi-sub"},vh={class:"kpi-card kpi-warn"},gh={class:"kpi-value"},yh={class:"kpi-sub"},bh={class:"kpi-card kpi-info"},wh={class:"kpi-value"},kh={class:"kpi-sub"},Eh={class:"kpi-value"},Ch={class:"kpi-sub"},_h={key:0,class:"dropped-warn"},Sh={class:"volume-chart"},Nh={class:"volume-bars"},Dh=["title"],Rh={class:"errors-toolbar","aria-label":"Error filters"},Th={class:"seg-tabs"},Ah={class:"search-wrap"},Oh={type:"search",class:"form-control",placeholder:"code:repo_not_found module:route status:>=400",autocomplete:"off"},Ph={key:0,class:"filter-count"},Ih={class:"select-wrap"},Vh={class:"form-control form-control-sm"},qh={class:"select-wrap"},Mh={class:"form-control form-control-sm"},$h={class:"autoref"},Lh={type:"checkbox"},Uh={key:0,class:"admin-empty"},Fh={key:1,class:"errors-pager"},Bh={key:2,class:"errors-list"},zh=["onClick"],Hh={class:"col-when"},jh={class:"when-rel"},Gh={class:"when-abs"},Wh={class:"col-sev"},Kh={class:"sev-label"},Yh={class:"col-mod"},Qh={class:"pill pill-module"},Jh={class:"col-msg"},Xh={class:"msg-code"},Zh={key:0,class:"msg-context"},xh={key:1,class:"msg-detail"},em={key:2,class:"msg-url"},tm={class:"col-count"},nm={key:0,class:"count-pill"},om={key:1,class:"count-pill count-pill-muted"},sm={class:"col-status"},im={key:0,class:"errors-row-detail"},rm={class:"detail-tabs"},am=["onClick"],lm=["onClick"],dm=["onClick"],um={class:"detail-body"},cm={class:"detail-main"},pm={key:0},fm={key:1,class:"stack-pre"},hm={key:2,class:"related-list"},mm={class:"when-abs"},vm={class:"msg-url"},gm={class:"detail-actions"},ym=["onClick"],bm=["onClick"],wm={key:0,class:"copy-hint"},km={class:"detail-aside"},Em={class:"aside-block"},Cm=["title"],_m={class:"aside-block"},Sm=["title"],Nm={class:"aside-block"},Dm={class:"aside-value"},Rm={key:0,class:"aside-sub"},Tm={key:0,class:"aside-block"},Am=["href"],Om={key:1,class:"aside-block"},Pm={class:"aside-value mono"};function hl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",ih,[t[32]||(t[32]=n("div",{class:"paper-crumbs"},[y("Admin \xA0/\xA0 "),n("span",{class:"here"},"Errors")],-1)),n("header",rh,[t[10]||(t[10]=n("h1",{class:"paper-page-title"},"Errors",-1)),n("div",ah,[n("button",{class:"btn btn-sm",type:"button",onClick:t[0]||(t[0]=o=>e.exportCsv())},[...t[8]||(t[8]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-export"})],-1),y(" Export CSV",-1)])]),n("button",{class:"btn btn-sm btn-danger",type:"button",onClick:t[1]||(t[1]=o=>e.clearAll())},[...t[9]||(t[9]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Clear all",-1)])])])]),t[33]||(t[33]=pe('',1)),n("section",lh,[n("div",dh,[t[11]||(t[11]=n("div",{class:"kpi-label"},"Last 24h",-1)),n("div",uh,u(e.stats?.last24h),1),n("div",{class:A(["kpi-sub",{up:e.stats?.delta>0,down:e.stats?.delta<0}])},[e.stats?.prev24h?(l(),d("span",ch,u(e.stats?.delta>0?"+":"")+u(e.stats?.delta)+"% vs yesterday",1)):p("v-if",!0),e.stats?.prev24h?p("v-if",!0):(l(),d("span",ph,"no prior baseline"))],2)]),n("div",fh,[t[12]||(t[12]=n("div",{class:"kpi-label"},"Errors (5xx)",-1)),n("div",hh,u(e.stats?.severity?.error),1),n("div",mh,u(e.stats?.unique?.error)+" unique",1)]),n("div",vh,[t[13]||(t[13]=n("div",{class:"kpi-label"},"Warnings (4xx)",-1)),n("div",gh,u(e.stats?.severity?.warn),1),n("div",yh,u(e.stats?.unique?.warn)+" unique",1)]),n("div",bh,[t[14]||(t[14]=n("div",{class:"kpi-label"},"Info (auth, 404)",-1)),n("div",wh,u(e.stats?.severity?.info),1),n("div",kh,u(e.stats?.unique?.info)+" unique",1)]),n("div",{class:A(["kpi-card",{"kpi-error":e.stats?.dropped>0}])},[t[15]||(t[15]=n("div",{class:"kpi-label"},"Captured",-1)),n("div",Eh,u(e.total),1),n("div",Ch,[y(" cap "+u(e.cap)+" \xB7 "+u(e.available?"live":"redis off")+" ",1),e.stats?.dropped>0?(l(),d("span",_h," \xB7 "+u(e.stats?.dropped)+" dropped",1)):p("v-if",!0)])],2)]),n("section",Sh,[t[16]||(t[16]=pe('
Volume \xB7 24h \xB7 1h bucketserror warn info
',1)),n("div",Nh,[(l(!0),d(W,null,Z(e.stats?.buckets,(o,r)=>(l(),d("div",{class:"volume-bar",key:r,title:e.bucketTitle(o)},[n("span",{class:"seg seg-error",style:Ve({height:e.barPx(o,"error")+"px"})},null,4),n("span",{class:"seg seg-warn",style:Ve({height:e.barPx(o,"warn")+"px"})},null,4),n("span",{class:"seg seg-info",style:Ve({height:e.barPx(o,"info")+"px"})},null,4)],8,Dh))),128))])]),N((l(),d("form",Rh,[n("div",Th,[n("button",{type:"button",class:A({active:e.query?.bucket===""}),onClick:t[2]||(t[2]=o=>e.setBucket(""))},"All",2),n("button",{type:"button",class:A({active:e.query?.bucket==="error"}),onClick:t[3]||(t[3]=o=>e.setBucket("error"))},"5xx",2),n("button",{type:"button",class:A({active:e.query?.bucket==="warn"}),onClick:t[4]||(t[4]=o=>e.setBucket("warn"))},"4xx",2),n("button",{type:"button",class:A({active:e.query?.bucket==="info"}),onClick:t[5]||(t[5]=o=>e.setBucket("info"))},"Info",2)]),n("div",Ah,[t[17]||(t[17]=n("svg",{class:"ui-icon search-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-search"})],-1)),N(n("input",Oh,null,512),[[s,{state:e.viewState,set:o=>{e.query.search=o},value:e.query?.search,form:null,options:{}}]]),e.parsedFilterCount?(l(),d("span",Ph,u(e.parsedFilterCount)+" filter"+u(e.parsedFilterCount>1?"s":""),1)):p("v-if",!0)]),n("div",Ih,[t[19]||(t[19]=n("label",null,"Sort",-1)),N((l(),d("select",Vh,[...t[18]||(t[18]=[n("option",{value:"recent"},"Most recent",-1),n("option",{value:"count"},"Most frequent",-1)])])),[[s,{state:e.viewState,set:o=>{e.query.sort=o},value:e.query?.sort,form:null,options:{}}]])]),n("div",qh,[t[21]||(t[21]=n("label",null,"Group",-1)),N((l(),d("select",Mh,[...t[20]||(t[20]=[n("option",{value:""},"Off",-1),n("option",{value:"code"},"By code",-1),n("option",{value:"module"},"By module",-1)])])),[[s,{state:e.viewState,set:o=>{e.query.group=o},value:e.query?.group,form:null,options:{}}]])]),n("label",$h,[N(n("input",Lh,null,512),[[s,{state:e.viewState,set:o=>{e.query.autoRefresh=o},value:e.query?.autoRefresh,form:null,options:{}}]]),t[22]||(t[22]=y(" Auto-refresh ",-1))]),n("button",{class:"btn btn-sm btn-icon",type:"button",title:"Refresh now",onClick:t[6]||(t[6]=o=>e.refreshNow()),"aria-label":"Refresh"},[...t[23]||(t[23]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1)])])])),[[i,e.viewState]]),e.visible?.length?p("v-if",!0):(l(),d("div",Uh,"No errors captured.")),e.canLoadMore()&&e.visible?.length?(l(),d("div",Fh,[n("span",null,"Showing "+u(e.entries?.length)+" of "+u(e.total)+" captured",1),n("button",{class:"btn btn-sm",type:"button",onClick:t[7]||(t[7]=o=>e.loadMore())},"Load older")])):p("v-if",!0),e.visible?.length?(l(),d("div",Bh,[t[31]||(t[31]=pe('
WhenSeverityModuleMessageCountStatus
',1)),(l(!0),d(W,null,Z(e.visible,(o,r)=>(l(),d("div",{class:A(["errors-row",{open:e.expanded[o?._key]}]),key:o?._key},[n("div",{class:"errors-row-main",onClick:a=>e.toggle(o)},[n("div",Hh,[n("div",jh,u(e.relTime(o?.ts)),1),n("div",Gh,u(e.absTimeShort(o?.ts)),1)]),n("div",Wh,[n("span",{class:A(["sev-dot","sev-"+o?._bucket])},null,2),n("span",Kh,u(e.fmt?.uppercase(o?._bucket)),1)]),n("div",Yh,[n("span",Qh,u(o?.module),1)]),n("div",Jh,[n("strong",Xh,u(o?.displayMessage),1),o?.displayContext&&o?.displayContext!==o?.displayMessage?(l(),d("span",Zh,u(o?.displayContext),1)):p("v-if",!0),o?._detail?(l(),d("span",xh,u(o?._detail),1)):p("v-if",!0),o?._url?(l(),d("div",em,u(o?._url),1)):p("v-if",!0)]),n("div",tm,[o?.count>1?(l(),d("span",nm,"\xD7"+u(o?.count),1)):p("v-if",!0),o?.count===1?(l(),d("span",om,"\xD71")):p("v-if",!0)]),n("div",sm,[o?._status?(l(),d("span",{key:0,class:A(["status-pill","status-"+o?._bucket])},u(o?._status),3)):p("v-if",!0)])],8,zh),e.expanded[o?._key]?(l(),d("div",im,[n("div",rm,[n("button",{type:"button",class:A({active:e.detailTab[o?._key]==="raw"||!e.detailTab[o?._key]}),onClick:a=>e.detailTab[o._key]="raw"},"Raw",10,am),o?._stack?(l(),d("button",{key:0,type:"button",class:A({active:e.detailTab[o?._key]==="stack"}),onClick:a=>e.detailTab[o._key]="stack"},"Stack",10,lm)):p("v-if",!0),o?.count>1?(l(),d("button",{key:1,type:"button",class:A({active:e.detailTab[o?._key]==="related"}),onClick:a=>e.detailTab[o._key]="related"},"Related ("+u(o?.count)+")",11,dm)):p("v-if",!0)]),n("div",um,[n("div",cm,[(e.detailTab[o?._key]||"raw")==="raw"?(l(),d("pre",pm,u(o?._detailJson),1)):p("v-if",!0),e.detailTab[o?._key]==="stack"?(l(),d("pre",fm,u(o?._stack),1)):p("v-if",!0),e.detailTab[o?._key]==="related"?(l(),d("div",hm,[(l(!0),d(W,null,Z(o?._related,(a,c)=>(l(),d("div",{class:"related-row",key:c},[n("span",mm,u(e.absTimeShort(a?.ts)),1),n("span",vm,u(a?._url),1),a?._status?(l(),d("span",{key:0,class:A(["status-pill","status-"+a?._bucket])},u(a?._status),3)):p("v-if",!0)]))),128))])):p("v-if",!0),n("div",gm,[n("button",{class:"btn btn-sm",type:"button",title:"Copy a curl that reproduces the request",onClick:a=>e.copyCurl(o)},[...t[24]||(t[24]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-code"})],-1),y(" Copy curl",-1)])],8,ym),n("button",{class:"btn btn-sm",type:"button",onClick:a=>e.copyJson(o)},[...t[25]||(t[25]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-clipboard"})],-1),y(" Copy JSON",-1)])],8,bm),e.copyHint?(l(),d("span",wm,u(e.copyHint),1)):p("v-if",!0)])]),n("aside",km,[n("div",Em,[t[26]||(t[26]=n("div",{class:"aside-label"},"First seen",-1)),n("div",{class:"aside-value",title:e.absTime(o?._firstSeen)},u(e.relTime(o?._firstSeen)),9,Cm)]),n("div",_m,[t[27]||(t[27]=n("div",{class:"aside-label"},"Last seen",-1)),n("div",{class:"aside-value",title:e.absTime(o?.ts)},u(e.relTime(o?.ts)),9,Sm)]),n("div",Nm,[t[28]||(t[28]=n("div",{class:"aside-label"},"Occurrences",-1)),n("div",Dm,[y(u(o?.count),1),o?._lastHourCount?(l(),d("span",Rm," \xB7 "+u(o?._lastHourCount)+" this hour",1)):p("v-if",!0)])]),o?._repoId?(l(),d("div",Tm,[t[29]||(t[29]=n("div",{class:"aside-label"},"Repository",-1)),n("a",{class:"aside-value",href:e.safeUrl("/r/"+o?._repoId)},u(o?._repoId),9,Am)])):p("v-if",!0),o?._url?(l(),d("div",Om,[t[30]||(t[30]=n("div",{class:"aside-label"},"URL",-1)),n("div",Pm,u(o?._url),1)])):p("v-if",!0)])])])):p("v-if",!0)],2))),128))])):p("v-if",!0)])}var Im={class:"container paper-page admin-page overview-page"},Vm={key:0,class:"admin-empty"},qm={key:1,class:"alert alert-danger",style:{margin:"12px 0"}},Mm={key:2},$m={class:"ov-kpi-row"},Lm={class:"ov-kpi-card"},Um={class:"ov-kpi-value"},Fm={class:"ov-kpi-sub"},Bm={class:"ov-kpi-card"},zm={class:"ov-kpi-sub"},Hm={class:"ov-kpi-card"},jm={class:"ov-kpi-sub"},Gm={class:"ov-kpi-card"},Wm={class:"ov-kpi-sub"},Km={class:"ov-kpi-card"},Ym={class:"ov-kpi-value"},Qm={class:"ov-kpi-sub"},Jm={class:"ov-daily-row"},Xm={class:"ov-daily-card"},Zm={class:"ov-daily-value"},xm={class:"ov-daily-card"},ev={class:"ov-daily-value"},tv={class:"ov-daily-sub"},nv={class:"ov-daily-card"},ov={class:"ov-daily-value"},sv={class:"ov-chart-row"},iv={class:"ov-chart-card"},rv={key:0,class:"ov-spark-bars"},av=["data-tip","aria-label"],lv={key:1,class:"ov-spark-x"},dv={class:"ov-chart-card"},uv={key:0,class:"ov-spark-bars"},cv=["data-tip","aria-label"],pv={key:1,class:"ov-spark-x"},fv={class:"ov-chart-card"},hv={key:0,class:"ov-spark-bars"},mv=["data-tip","aria-label"],vv={key:1,class:"ov-spark-x"},gv={class:"ov-chart-card"},yv={key:0,class:"ov-spark-bars"},bv=["data-tip","aria-label"],wv={key:1,class:"ov-spark-x"},kv={class:"ov-triple-row"},Ev={class:"ov-panel-card"},Cv={class:"ov-panel-head"},_v={class:"ov-panel-meta"},Sv={class:"ov-stacked-bar"},Nv={class:"ov-bar-legend"},Dv={href:"/admin/repositories",class:"ov-legend-item"},Rv={class:"ov-legend-n"},Tv={href:"/admin/repositories",class:"ov-legend-item"},Av={class:"ov-legend-n"},Ov={href:"/admin/repositories",class:"ov-legend-item"},Pv={class:"ov-legend-n"},Iv={href:"/admin/repositories",class:"ov-legend-item"},Vv={class:"ov-legend-n"},qv={href:"/admin/repositories",class:"ov-legend-item"},Mv={class:"ov-legend-n"},$v={class:"ov-panel-card"},Lv={class:"ov-panel-head"},Uv={class:"ov-panel-meta"},Fv={class:"ov-error-bars"},Bv={class:"ov-ebar-row"},zv={class:"ov-ebar-track"},Hv={class:"ov-ebar-n"},jv={class:"ov-ebar-row"},Gv={class:"ov-ebar-track"},Wv={class:"ov-ebar-n"},Kv={class:"ov-ebar-row"},Yv={class:"ov-ebar-track"},Qv={class:"ov-ebar-n"},Jv={key:0,class:"ov-panel-foot"},Xv={href:"/admin/errors"},Zv={class:"ov-panel-card"},xv={class:"ov-routes-table"},eg={class:"ov-route-row",href:"/admin/queues"},tg={class:"ov-route-n"},ng={class:"ov-route-n"},og={class:"ov-route-row",href:"/admin/queues"},sg={class:"ov-route-n"},ig={class:"ov-route-n"},rg={class:"ov-route-row",href:"/admin/queues"},ag={class:"ov-route-n"},lg={class:"ov-route-n"},dg={class:"ov-services-card"},ug={class:"ov-services-head"},cg={class:"ov-panel-meta"},pg={class:"ov-services-grid"},fg={class:"ov-svc"},hg={class:"ov-svc-info"},mg={class:"ov-svc-meta"},vg={class:"ov-svc-detail"},gg={class:"ov-svc"},yg={class:"ov-svc-info"},bg={key:0,class:"ov-svc-meta"},wg={key:1,class:"ov-svc-meta"},kg={class:"ov-svc"},Eg={class:"ov-svc-info"},Cg={key:0,class:"ov-svc-meta"},_g={key:1,class:"ov-svc-meta"},Sg={class:"ov-svc"},Ng={class:"ov-svc-info"},Dg={key:0,class:"ov-svc-meta"},Rg={key:1,class:"ov-svc-meta"},Tg={class:"ov-svc"},Ag={class:"ov-svc-info"},Og={class:"ov-svc-meta"},Pg={class:"ov-panel-card ov-performance","aria-labelledby":"performance-heading"},Ig={class:"ov-panel-head ov-performance-head"},Vg={class:"ov-performance-window"},qg={key:0,class:"ov-performance-message ov-performance-warning",role:"alert"},Mg={key:1,class:"ov-performance-empty",role:"status"},$g={key:2},Lg={class:"paper-tabs ov-performance-tabs",role:"tablist","aria-label":"Performance metrics"},Ug=["aria-selected","tabindex"],Fg=["aria-selected","tabindex"],Bg=["aria-selected","tabindex"],zg={id:"performance-routes",role:"tabpanel","aria-labelledby":"performance-routes-tab"},Hg={key:0,class:"ov-metrics-scroll",tabindex:"0",role:"region","aria-label":"Route latency metrics, scroll for more columns"},jg={class:"ov-metrics-table"},Gg={scope:"row",class:"ov-metric-name"},Wg={class:"num"},Kg={class:"num"},Yg={class:"num"},Qg={class:"num"},Jg={class:"num"},Xg={key:1,class:"ov-performance-empty"},Zg={id:"performance-processes",role:"tabpanel","aria-labelledby":"performance-processes-tab"},xg={key:0,class:"ov-performance-message ov-performance-warning",role:"status"},ey={key:1,class:"ov-metrics-scroll",tabindex:"0",role:"region","aria-label":"Process resource metrics, scroll for more columns"},ty={class:"ov-metrics-table"},ny={scope:"row",class:"ov-metric-name"},oy={key:0,class:"ov-metric-warn"},sy={class:"num"},iy={class:"num"},ry={class:"num"},ay={class:"num"},ly={class:"num"},dy={class:"num"},uy={class:"num"},cy={class:"num"},py={id:"performance-stages",role:"tabpanel","aria-labelledby":"performance-stages-tab"},fy={key:0,class:"ov-metrics-scroll",tabindex:"0",role:"region","aria-label":"Work stage metrics, scroll for more columns"},hy={class:"ov-metrics-table"},my={scope:"row",class:"ov-metric-name"},vy={class:"num"},gy={class:"num"},yy={class:"num"},by={key:1,class:"ov-performance-empty"};function ml(e,t){return l(),d("div",Im,[t[64]||(t[64]=pe('
Admin \xB7 System Health

Overview

',3)),e.loading?(l(),d("div",Vm,"Loading overview\u2026")):p("v-if",!0),e.error?(l(),d("div",qm,[t[9]||(t[9]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),y(" "+u(e.error),1)])):p("v-if",!0),e.data?(l(),d("div",Mm,[p(" \u2500\u2500 Top KPI row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),n("section",$m,[n("div",Lm,[t[10]||(t[10]=n("div",{class:"ov-kpi-label"},[y("Repositories "),n("span",{class:"ov-dot ov-dot-ok"})],-1)),n("div",Um,u(e.humanNum(e.data?.repos?.total)),1),n("div",Fm,"+"+u(e.data?.repos?.newRepos24h)+" \xB7 last 24h",1)]),n("div",Bm,[t[11]||(t[11]=n("div",{class:"ov-kpi-label"},"CPU",-1)),n("div",{class:A(["ov-kpi-value",{"ov-val-warn":e.data?.system?.cpuPercent>80}])},u(e.data?.system?.cpuPercent)+"%",3),n("div",zm,u(e.data?.system?.cpuCount)+" cores \xB7 load "+u(e.data?.system?.loadAvg?.[0]?.toFixed(1)),1)]),n("div",Hm,[t[12]||(t[12]=n("div",{class:"ov-kpi-label"},"Memory",-1)),n("div",{class:A(["ov-kpi-value",{"ov-val-warn":e.data?.system?.memPercent>85}])},u(e.data?.system?.memPercent)+"%",3),n("div",jm,u(e.humanBytes(e.data?.system?.memUsed))+" / "+u(e.humanBytes(e.data?.system?.memTotal)),1)]),n("div",Gm,[t[13]||(t[13]=n("div",{class:"ov-kpi-label"},"Disk",-1)),n("div",{class:A(["ov-kpi-value",{"ov-val-warn":e.data?.system?.diskPercent>85}])},u(e.data?.system?.diskPercent)+"%",3),n("div",Wm,u(e.humanBytes(e.data?.system?.diskUsed))+" / "+u(e.humanBytes(e.data?.system?.diskTotal))+" \xB7 "+u(e.data?.system?.diskMount),1)]),n("div",Km,[t[14]||(t[14]=n("div",{class:"ov-kpi-label"},"Uptime",-1)),n("div",Ym,u(e.humanDuration(e.data?.system?.uptime)),1),n("div",Qm,u(e.data?.system?.nodeVersion)+" \xB7 "+u(e.data?.system?.platform),1)])]),p(" \u2500\u2500 Daily activity highlights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),n("section",Jm,[n("div",Xm,[t[15]||(t[15]=n("div",{class:"ov-daily-label"},"New repos today",-1)),n("div",Zm,"+"+u(e.fmt?.number(e.data?.daily?.today?.repositories)),1),t[16]||(t[16]=n("div",{class:"ov-daily-sub"},"since yesterday",-1))]),n("div",xm,[t[17]||(t[17]=n("div",{class:"ov-daily-label"},"New users today",-1)),n("div",ev,"+"+u(e.fmt?.number(e.data?.daily?.today?.users)),1),n("div",tv,u(e.fmt?.number(e.data?.users?.total))+" total users",1)]),n("div",nv,[t[18]||(t[18]=n("div",{class:"ov-daily-label"},"Page views today",-1)),n("div",ov,"+"+u(e.fmt?.number(e.data?.daily?.today?.pageViews)),1),t[19]||(t[19]=n("div",{class:"ov-daily-sub"},"since yesterday",-1))])]),p(" \u2500\u2500 Daily charts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),n("section",sv,[n("div",iv,[t[20]||(t[20]=n("div",{class:"ov-chart-head"},[n("span",{class:"ov-chart-title"},"Daily page views \xB7 30d"),n("span",{class:"ov-chart-legend"},[n("span",{class:"ov-dot-legend ov-dot-accent"}),y("views/day")])],-1)),e.data?.history?.length?(l(),d("div",rv,[(l(!0),d(W,null,Z(e.data?.history,(s,i)=>(l(),d("div",{class:"ov-spark-col has-tip",key:i,"data-tip":e.historyLabel(s)+": +"+e.fmt?.number(s?.dailyPageViews)+" views","aria-label":e.historyLabel(s)+": +"+e.fmt?.number(s?.dailyPageViews)+" views"},[n("span",{class:"ov-spark-fill",style:Ve({height:e.historyBarH(s,"dailyPageViews")+"px"})},null,4)],8,av))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",lv,[n("span",null,u(e.historyLabel(e.data?.history[0])),1),n("span",null,u(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),n("span",null,u(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)]),n("div",dv,[t[21]||(t[21]=n("div",{class:"ov-chart-head"},[n("span",{class:"ov-chart-title"},"New repos \xB7 30d"),n("span",{class:"ov-chart-legend"},[n("span",{class:"ov-dot-legend ov-dot-ok-fill"}),y("repos/day")])],-1)),e.data?.history?.length?(l(),d("div",uv,[(l(!0),d(W,null,Z(e.data?.history,(s,i)=>(l(),d("div",{class:"ov-spark-col has-tip",key:i,"data-tip":e.historyLabel(s)+": +"+e.fmt?.number(s?.dailyRepositories)+" repos","aria-label":e.historyLabel(s)+": +"+e.fmt?.number(s?.dailyRepositories)+" repos"},[n("span",{class:"ov-spark-fill ov-spark-fill-alt",style:Ve({height:e.historyBarH(s,"dailyRepositories")+"px"})},null,4)],8,cv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",pv,[n("span",null,u(e.historyLabel(e.data?.history[0])),1),n("span",null,u(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),n("span",null,u(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)]),n("div",fv,[t[22]||(t[22]=n("div",{class:"ov-chart-head"},[n("span",{class:"ov-chart-title"},"Users \xB7 30d"),n("span",{class:"ov-chart-legend"},[n("span",{class:"ov-dot-legend ov-dot-user-fill"}),y("total users")])],-1)),e.data?.history?.length?(l(),d("div",hv,[(l(!0),d(W,null,Z(e.data?.history,(s,i)=>(l(),d("div",{class:"ov-spark-col has-tip",key:i,"data-tip":e.historyLabel(s)+": "+e.fmt?.number(s?.nbUsers)+" users","aria-label":e.historyLabel(s)+": "+e.fmt?.number(s?.nbUsers)+" users"},[n("span",{class:"ov-spark-fill ov-spark-fill-user",style:Ve({height:e.historyBarH(s,"nbUsers")+"px"})},null,4)],8,mv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",vv,[n("span",null,u(e.historyLabel(e.data?.history[0])),1),n("span",null,u(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),n("span",null,u(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)]),n("div",gv,[t[23]||(t[23]=n("div",{class:"ov-chart-head"},[n("span",{class:"ov-chart-title"},"New users \xB7 30d"),n("span",{class:"ov-chart-legend"},[n("span",{class:"ov-dot-legend ov-dot-new-user-fill"}),y("users/day")])],-1)),e.data?.history?.length?(l(),d("div",yv,[(l(!0),d(W,null,Z(e.data?.history,(s,i)=>(l(),d("div",{class:"ov-spark-col has-tip",key:i,"data-tip":e.historyLabel(s)+": +"+e.fmt?.number(s?.dailyUsers)+" users","aria-label":e.historyLabel(s)+": +"+e.fmt?.number(s?.dailyUsers)+" users"},[n("span",{class:"ov-spark-fill ov-spark-fill-new-user",style:Ve({height:e.historyBarH(s,"dailyUsers")+"px"})},null,4)],8,bv))),128))])):p("v-if",!0),e.data?.history?.length?(l(),d("div",wv,[n("span",null,u(e.historyLabel(e.data?.history[0])),1),n("span",null,u(e.historyLabel(e.data?.history[Math?.floor(e.data?.history?.length/2)])),1),n("span",null,u(e.historyLabel(e.data?.history[e.data?.history?.length-1])),1)])):p("v-if",!0)])]),p(" \u2500\u2500 Three-panel row: Status / Errors / Queues \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),n("section",kv,[p(" Repo status breakdown "),n("div",Ev,[n("div",Cv,[t[24]||(t[24]=n("span",{class:"ov-panel-title"},"Repo status",-1)),n("span",_v,u(e.fmt?.number(e.data?.repos?.total))+" total",1)]),n("div",Sv,[n("span",{class:"ov-bar-seg ov-bar-ready",title:"Ready",style:Ve({width:e.barPct("ready")+"%"})},null,4),n("span",{class:"ov-bar-seg ov-bar-preparing",title:"Preparing",style:Ve({width:e.barPct("preparing")+"%"})},null,4),n("span",{class:"ov-bar-seg ov-bar-error",title:"Error",style:Ve({width:e.barPct("error")+"%"})},null,4),n("span",{class:"ov-bar-seg ov-bar-expired",title:"Expired",style:Ve({width:e.barPct("expired")+"%"})},null,4),n("span",{class:"ov-bar-seg ov-bar-removed",title:"Removed",style:Ve({width:e.barPct("removed")+"%"})},null,4)]),n("div",Nv,[n("a",Dv,[t[25]||(t[25]=n("span",{class:"ov-swatch ov-bar-ready"},null,-1)),t[26]||(t[26]=y(" ready ",-1)),n("span",Rv,u(e.fmt?.number(e.statusCount("ready"))),1)]),n("a",Tv,[t[27]||(t[27]=n("span",{class:"ov-swatch ov-bar-preparing"},null,-1)),t[28]||(t[28]=y(" preparing ",-1)),n("span",Av,u(e.fmt?.number(e.statusCount("preparing")+e.statusCount("download"))),1)]),n("a",Ov,[t[29]||(t[29]=n("span",{class:"ov-swatch ov-bar-error"},null,-1)),t[30]||(t[30]=y(" error ",-1)),n("span",Pv,u(e.fmt?.number(e.statusCount("error"))),1)]),n("a",Iv,[t[31]||(t[31]=n("span",{class:"ov-swatch ov-bar-expired"},null,-1)),t[32]||(t[32]=y(" expired ",-1)),n("span",Vv,u(e.fmt?.number(e.statusCount("expired")+e.statusCount("expiring"))),1)]),n("a",qv,[t[33]||(t[33]=n("span",{class:"ov-swatch ov-bar-removed"},null,-1)),t[34]||(t[34]=y(" removed ",-1)),n("span",Mv,u(e.fmt?.number(e.statusCount("removed")+e.statusCount("removing"))),1)])])]),p(" Error breakdown "),n("div",$v,[n("div",Lv,[t[35]||(t[35]=n("span",{class:"ov-panel-title"},"Errors \xB7 24h",-1)),n("span",Uv,u(e.data?.errors?.last24h)+" total",1)]),n("div",Fv,[n("div",Bv,[t[36]||(t[36]=n("span",{class:"ov-ebar-label"},"5xx",-1)),n("span",zv,[n("span",{class:"ov-ebar-fill ov-ebar-error",style:Ve({width:e.errPct("error")+"%"})},null,4)]),n("span",Hv,u(e.data?.errors?.severity?.error),1)]),n("div",jv,[t[37]||(t[37]=n("span",{class:"ov-ebar-label"},"4xx",-1)),n("span",Gv,[n("span",{class:"ov-ebar-fill ov-ebar-warn",style:Ve({width:e.errPct("warn")+"%"})},null,4)]),n("span",Wv,u(e.data?.errors?.severity?.warn),1)]),n("div",Kv,[t[38]||(t[38]=n("span",{class:"ov-ebar-label"},"Info",-1)),n("span",Yv,[n("span",{class:"ov-ebar-fill ov-ebar-info",style:Ve({width:e.errPct("info")+"%"})},null,4)]),n("span",Qv,u(e.data?.errors?.severity?.info),1)])]),e.data?.repos?.recentErrors24h?(l(),d("div",Jv,[n("a",Xv,u(e.data?.repos?.recentErrors24h)+" repos in error state \u2192",1)])):p("v-if",!0)]),p(" Top routes / queues "),n("div",Zv,[t[43]||(t[43]=n("div",{class:"ov-panel-head"},[n("span",{class:"ov-panel-title"},"Queues"),n("span",{class:"ov-panel-meta"},"by state")],-1)),n("div",xv,[t[42]||(t[42]=pe('
QueueActiveWaitFailed
',1)),n("a",eg,[t[39]||(t[39]=n("span",{class:"ov-route-name"},"download",-1)),n("span",tg,u(e.data?.queues?.download?.active),1),n("span",ng,u(e.data?.queues?.download?.waiting),1),n("span",{class:A(["ov-route-n ov-route-lat",{"ov-n-bad":e.data?.queues?.download?.failed>0}])},u(e.data?.queues?.download?.failed),3)]),n("a",og,[t[40]||(t[40]=n("span",{class:"ov-route-name"},"remove",-1)),n("span",sg,u(e.data?.queues?.remove?.active),1),n("span",ig,u(e.data?.queues?.remove?.waiting),1),n("span",{class:A(["ov-route-n ov-route-lat",{"ov-n-bad":e.data?.queues?.remove?.failed>0}])},u(e.data?.queues?.remove?.failed),3)]),n("a",rg,[t[41]||(t[41]=n("span",{class:"ov-route-name"},"cache",-1)),n("span",ag,u(e.data?.queues?.cache?.active),1),n("span",lg,u(e.data?.queues?.cache?.waiting),1),n("span",{class:A(["ov-route-n ov-route-lat",{"ov-n-bad":e.data?.queues?.cache?.failed>0}])},u(e.data?.queues?.cache?.failed),3)])])])]),p(" \u2500\u2500 Services bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 "),n("section",dg,[n("div",ug,[t[44]||(t[44]=n("span",{class:"ov-panel-title"},"Services",-1)),n("span",cg,u(e.fmt?.number(e.data?.users?.total))+" users \xB7 "+u(e.data?.conferences?.total)+" conferences",1)]),n("div",pg,[n("div",fg,[t[46]||(t[46]=n("span",{class:"ov-svc-dot ov-dot-ok"},null,-1)),n("div",hg,[t[45]||(t[45]=n("span",{class:"ov-svc-name"},"web",-1)),n("span",mg,u(e.data?.system?.nodeVersion),1)]),n("span",vg,"uptime "+u(e.humanDuration(e.data?.system?.uptime)),1)]),n("div",gg,[n("span",{class:A(["ov-svc-dot",e.queueTotal(e.data?.queues?.download)>0?"ov-dot-ok":"ov-dot-idle"])},null,2),n("div",yg,[t[47]||(t[47]=n("span",{class:"ov-svc-name"},"download",-1)),e.queueTotal(e.data?.queues?.download)?(l(),d("span",bg,u(e.queueTotal(e.data?.queues?.download))+" jobs",1)):p("v-if",!0),e.queueTotal(e.data?.queues?.download)?p("v-if",!0):(l(),d("span",wg,"idle"))])]),n("div",kg,[n("span",{class:A(["ov-svc-dot",e.queueTotal(e.data?.queues?.cache)>0?"ov-dot-ok":"ov-dot-idle"])},null,2),n("div",Eg,[t[48]||(t[48]=n("span",{class:"ov-svc-name"},"cache",-1)),e.queueTotal(e.data?.queues?.cache)?(l(),d("span",Cg,u(e.queueTotal(e.data?.queues?.cache))+" jobs",1)):p("v-if",!0),e.queueTotal(e.data?.queues?.cache)?p("v-if",!0):(l(),d("span",_g,"idle"))])]),n("div",Sg,[n("span",{class:A(["ov-svc-dot",e.queueTotal(e.data?.queues?.remove)>0?"ov-dot-ok":"ov-dot-idle"])},null,2),n("div",Ng,[t[49]||(t[49]=n("span",{class:"ov-svc-name"},"remove",-1)),e.queueTotal(e.data?.queues?.remove)?(l(),d("span",Dg,u(e.queueTotal(e.data?.queues?.remove))+" jobs",1)):p("v-if",!0),e.queueTotal(e.data?.queues?.remove)?p("v-if",!0):(l(),d("span",Rg,"idle"))])]),n("div",Tg,[n("span",{class:A(["ov-svc-dot",e.data?.repos?.recentErrors24h>10?"ov-dot-warn":"ov-dot-ok"])},null,2),n("div",Ag,[t[50]||(t[50]=n("span",{class:"ov-svc-name"},"errors",-1)),n("span",Og,u(e.data?.errors?.last24h)+" / 24h",1)])])])])])):p("v-if",!0),n("section",Pg,[n("div",Ig,[t[53]||(t[53]=n("div",null,[n("h2",{class:"ov-panel-title",id:"performance-heading"},"Request performance"),n("p",{class:"ov-performance-note"},"Request latency and process health \xB7 refreshes every 30 seconds")],-1)),n("div",Vg,[t[52]||(t[52]=n("label",{for:"performance-window"},"Time range",-1)),N(n("select",{id:"performance-window",class:"form-control form-control-sm","onUpdate:modelValue":t[0]||(t[0]=s=>e.performanceMinutes=s),onChange:t[1]||(t[1]=s=>e.loadPerformance()),"aria-label":"Performance time range"},[...t[51]||(t[51]=[n("option",{value:15},"Last 15 minutes",-1),n("option",{value:60},"Last hour",-1)])],544),[[Jo,e.performanceMinutes,void 0,{number:!0}]])])]),e.performanceError?(l(),d("div",qg,[t[54]||(t[54]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),n("span",null,u(e.performanceError),1),n("button",{type:"button",class:"btn btn-sm",onClick:t[2]||(t[2]=s=>e.loadPerformance())},"Retry")])):p("v-if",!0),!e.performance&&!e.performanceError?(l(),d("p",Mg,"Loading performance monitoring\u2026")):p("v-if",!0),e.performance?.available?(l(),d("div",$g,[n("div",Lg,[n("button",{id:"performance-routes-tab",type:"button",class:A(["paper-tab",{active:e.performanceTab==="routes"}]),role:"tab","aria-selected":e.performanceTab==="routes",tabindex:e.performanceTab==="routes"?0:-1,"aria-controls":"performance-routes",onClick:t[3]||(t[3]=s=>e.performanceTab="routes"),onKeydown:t[4]||(t[4]=s=>e.previewTabKeydown(s))},"Routes",42,Ug),n("button",{id:"performance-processes-tab",type:"button",class:A(["paper-tab",{active:e.performanceTab==="processes"}]),role:"tab","aria-selected":e.performanceTab==="processes",tabindex:e.performanceTab==="processes"?0:-1,"aria-controls":"performance-processes",onClick:t[5]||(t[5]=s=>e.performanceTab="processes"),onKeydown:t[6]||(t[6]=s=>e.previewTabKeydown(s))},"Processes",42,Fg),n("button",{id:"performance-stages-tab",type:"button",class:A(["paper-tab",{active:e.performanceTab==="stages"}]),role:"tab","aria-selected":e.performanceTab==="stages",tabindex:e.performanceTab==="stages"?0:-1,"aria-controls":"performance-stages",onClick:t[7]||(t[7]=s=>e.performanceTab="stages"),onKeydown:t[8]||(t[8]=s=>e.previewTabKeydown(s))},"Work stages",42,Bg)]),N(n("div",zg,[e.performance.routes?.length?(l(),d("div",Hg,[n("table",jg,[t[55]||(t[55]=n("caption",{class:"sr-only"},"Route latency for the selected time range",-1)),t[56]||(t[56]=n("thead",null,[n("tr",null,[n("th",{scope:"col"},"Route"),n("th",{scope:"col",class:"num"},"Requests"),n("th",{scope:"col",class:"num"},"Average"),n("th",{scope:"col",class:"num"},"First byte p95"),n("th",{scope:"col",class:"num"},"p95"),n("th",{scope:"col",class:"num"},"p99"),n("th",{scope:"col",class:"num"},"Interrupted"),n("th",{scope:"col",class:"num"},"5xx"),n("th",{scope:"col",class:"num"},"Slow")])],-1)),n("tbody",null,[(l(!0),d(W,null,Z(e.performance.routes,s=>(l(),d("tr",{key:s.service+s.method+s.route},[n("th",Gg,[n("span",null,u(s.route),1),n("small",null,u(s.service)+" \xB7 "+u(s.method),1)]),n("td",Wg,u(e.fmt.number(s.count)),1),n("td",Kg,u(s.avgMs)+" ms",1),n("td",Yg,u(e.firstByteBound(s)),1),n("td",Qg,u(e.latencyBound(s,"p95UpperMs")),1),n("td",Jg,u(e.latencyBound(s,"p99UpperMs")),1),n("td",{class:A(["num",{"ov-metric-warn":s.aborted>0}])},u(e.fmt.number(s.aborted)),3),n("td",{class:A(["num",{"ov-metric-warn":s.errors>0}])},u(e.fmt.number(s.errors)),3),n("td",{class:A(["num",{"ov-metric-warn":s.slow>0}])},u(e.fmt.number(s.slow)),3)]))),128))])])])):(l(),d("p",Xg,"No recorded requests in this time range yet."))],512),[[G,e.performanceTab==="routes"]]),N(n("div",Zg,[t[60]||(t[60]=n("p",{class:"ov-performance-note"},"API and streamer processes \xB7 latest sample per instance",-1)),e.performance.instances?.length?(l(),d("div",ey,[n("table",ty,[t[58]||(t[58]=n("caption",{class:"sr-only"},"API and streamer process resource usage",-1)),t[59]||(t[59]=n("thead",null,[n("tr",null,[n("th",{scope:"col"},"Process"),n("th",{scope:"col",class:"num"},"RSS / limit"),n("th",{scope:"col",class:"num"},"CPU"),n("th",{scope:"col",class:"num"},"Event loop p95"),n("th",{scope:"col",class:"num"},"Active requests"),n("th",{scope:"col",class:"num"},"Sockets / CLOSE_WAIT"),n("th",{scope:"col",class:"num"},"Workers / waiting"),n("th",{scope:"col",class:"num"},"Sample age"),n("th",{scope:"col",class:"num"},"Dropped batches / metrics")])],-1)),n("tbody",null,[(l(!0),d(W,null,Z(e.performance.instances,s=>(l(),d("tr",{key:s.instance,class:A({"ov-metric-warning-row":e.performanceWarning(s)})},[n("th",ny,[n("span",null,u(s.instance),1),e.performanceWarning(s)?(l(),d("small",oy,[...t[57]||(t[57]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1),y(" Needs attention",-1)])])):p("v-if",!0)]),n("td",sy,[y(u(e.humanBytes(s.memory.rss))+" / "+u(e.humanBytes(s.memoryLimitBytes)),1),n("small",null,"Peak "+u(e.humanBytes(e.peakRss(s))),1)]),n("td",iy,u(s.cpuPercent.toFixed(1))+"%",1),n("td",ry,u(s.eventLoop.p95Ms.toFixed(1))+" ms",1),n("td",ay,u(s.activeRequests),1),n("td",ly,u(s.sockets?.descriptors??"Unavailable")+" / "+u(s.sockets?.closeWait??"Unavailable"),1),n("td",dy,u(s.workers?.running??0)+" / "+u(s.workers?.waiting??0),1),n("td",uy,u(e.sampleAge(s))+" s",1),n("td",cy,u(s.droppedBatches)+" / "+u(s.droppedMetrics),1)],2))),128))])])])):(l(),d("div",xg,"No recent process samples. Monitoring coverage is incomplete."))],512),[[G,e.performanceTab==="processes"]]),N(n("div",py,[e.performance.stages?.some(s=>s.metric!=="first_byte")?(l(),d("div",fy,[n("table",hy,[t[61]||(t[61]=n("caption",{class:"sr-only"},"Work stages and cache results",-1)),t[62]||(t[62]=n("thead",null,[n("tr",null,[n("th",{scope:"col"},"Work stage"),n("th",{scope:"col",class:"num"},"Samples"),n("th",{scope:"col",class:"num"},"Average"),n("th",{scope:"col",class:"num"},"p95")])],-1)),n("tbody",null,[(l(!0),d(W,null,Z(e.performance.stages.filter(s=>s.metric!=="first_byte"),s=>(l(),d("tr",{key:s.service+s.metric},[n("th",my,[n("span",null,u(s.metric),1),n("small",null,u(s.service),1)]),n("td",vy,u(e.fmt.number(s.count)),1),n("td",gy,u(s.avgMs)+" ms",1),n("td",yy,u(e.latencyBound(s,"p95UpperMs")),1)]))),128))])])])):(l(),d("p",by,"No recorded work stages or cache results in this time range yet."))],512),[[G,e.performanceTab==="stages"]]),t[63]||(t[63]=n("details",{class:"ov-performance-help"},[n("summary",null,"How to read these metrics"),n("p",null,"Latency includes upstream waits and response transfer. Percentiles show histogram bucket upper bounds, not exact timings. Process rows marked \u201CNeeds attention\u201D have stale samples, dropped monitoring data, CLOSE_WAIT sockets, high event loop delay, or high memory usage.")],-1))])):p("v-if",!0)])])}var wy={class:"container paper-page admin-page"},ky={class:"q-header"},Ey={class:"q-header-actions"},Cy={class:"q-range-btns"},_y={class:"q-cards"},Sy=["aria-pressed","onKeydown","onClick"],Ny={class:"q-card-head"},Dy=["textContent"],Ry=["textContent"],Ty={class:"q-card-sub"},Ay={key:0,class:"q-card-bar"},Oy={key:0,class:"q-detail"},Py={class:"q-throughput"},Iy={class:"q-section-label"},Vy={class:"q-section-right"},qy={class:"q-stats-panel"},My={class:"q-section-label"},$y={class:"q-stats-grid"},Ly={class:"q-stat"},Uy=["textContent"],Fy={class:"q-stat"},By=["textContent"],zy={class:"q-stat"},Hy=["textContent"],jy={class:"q-stat"},Gy=["textContent"],Wy={class:"q-stat"},Ky=["textContent"],Yy={class:"q-stat"},Qy=["textContent"],Jy={class:"q-stats-actions"},Xy=["disabled"],Zy={class:"q-jobs"},xy={class:"q-jobs-header"},eb={class:"q-section-label"},tb={class:"q-state-filters"},ob={class:"q-state-toggle"},sb={type:"checkbox"},ib={class:"q-search-row"},rb={type:"search",class:"form-control",placeholder:"Search by job/repo id\u2026",autocomplete:"off"},ab={class:"q-auto-refresh"},lb={type:"checkbox"},db={key:0,class:"q-table"},ub=["onClick"],cb={class:"q-cell-state"},pb=["textContent"],fb=["textContent"],hb={class:"q-cell-id"},mb=["textContent","href"],vb={class:"q-cell-payload"},gb=["textContent"],yb={key:0,class:"q-payload-detail"},bb=["textContent"],wb=["textContent"],kb={class:"q-cell-progress"},Eb={key:0,class:"q-progress-wrap"},Cb=["textContent"],_b={class:"q-cell-actions"},Sb=["onClick"],Nb=["onClick"],Db={key:0,class:"q-detail-row"},Rb={colspan:"7"},Tb={class:"q-job-detail"},Ab={class:"q-job-detail-grid"},Ob={class:"q-job-detail-item"},Pb={class:"q-job-detail-value"},Ib=["textContent","href"],Vb={class:"q-job-detail-item"},qb={class:"q-job-detail-value"},Mb=["textContent"],$b={key:0,class:"q-job-detail-item"},Lb=["textContent"],Ub={key:1,class:"q-job-detail-item"},Fb=["textContent"],Bb={key:2,class:"q-job-detail-item"},zb={class:"q-job-detail-value"},Hb={key:3,class:"q-job-detail-item"},jb=["textContent"],Gb={key:4,class:"q-job-detail-item"},Wb=["textContent"],Kb={key:5,class:"q-job-detail-item"},Yb=["textContent"],Qb={key:6,class:"q-job-detail-item"},Jb=["textContent"],Xb={key:7,class:"q-job-detail-item"},Zb=["textContent"],xb={key:0,class:"q-job-detail-error"},e1=["textContent"],t1={key:1},n1=["textContent"],o1={class:"q-job-detail-actions"},s1=["onClick"],i1=["onClick"],r1=["href"],a1={key:1,class:"paper-table-empty",style:{border:"1px solid var(--border-color)","border-radius":"10px",background:"var(--paper-card)"}},l1={key:0},d1={key:1};function vl(e,t){let s=ye("field");return l(),d("div",wy,[t[48]||(t[48]=n("div",{class:"paper-crumbs"},[y("Admin \xA0/\xA0 "),n("span",{class:"here"},"Queues")],-1)),n("div",ky,[t[12]||(t[12]=n("h1",{class:"paper-page-title"},"Queues",-1)),n("div",Ey,[n("div",Cy,[n("button",{class:A(["btn btn-sm",{active:e.range=="1h"}]),onClick:t[0]||(t[0]=i=>e.setRange("1h"))},"1h",2),n("button",{class:A(["btn btn-sm",{active:e.range=="6h"}]),onClick:t[1]||(t[1]=i=>e.setRange("6h"))},"6h",2),n("button",{class:A(["btn btn-sm",{active:e.range=="24h"}]),onClick:t[2]||(t[2]=i=>e.setRange("24h"))},"24h",2),n("button",{class:A(["btn btn-sm",{active:e.range=="7d"}]),onClick:t[3]||(t[3]=i=>e.setRange("7d"))},"7d",2)]),n("button",{class:"btn btn-sm",onClick:t[4]||(t[4]=i=>e.pauseAll())},"Pause all"),n("button",{class:"btn btn-sm btn-dark",onClick:t[5]||(t[5]=i=>e.drainSelected())},"Drain "+u(e.selectedQueue),1)])]),t[49]||(t[49]=pe('',1)),p(" Queue overview cards "),n("div",_y,[(l(!0),d(W,null,Z(e.queueList,(i,o)=>(l(),d("div",{class:A(["q-card",{selected:e.selectedQueue==i?.key,paused:i?.paused}]),role:"button",tabindex:"0","aria-pressed":e.selectedQueue===i.key,onKeydown:[Rn(ue(r=>e.selectQueue(i.key),["prevent"]),["enter"]),Rn(ue(r=>e.selectQueue(i.key),["prevent"]),["space"])],onClick:r=>e.selectQueue(i.key)},[n("div",Ny,[n("span",{class:A(["q-dot",{"q-dot-red":i?.paused||i?.counts?.failed>0}])},null,2),n("span",{class:"q-card-name",textContent:u(i?.label)},null,8,Dy)]),n("div",{class:"q-card-count",textContent:u((i?.counts?.waiting||0)+(i?.counts?.active||0)+(i?.counts?.delayed||0))},null,8,Ry),n("div",Ty,[n("span",null,"waiting \xB7 "+u(i?.counts?.active||0)+" active",1),i?.counts?.active?(l(),d("div",Ay,[n("div",{class:"q-card-bar-fill",style:Ve({width:i?.counts?.active/((i?.counts?.waiting||0)+(i?.counts?.active||0)+(i?.counts?.delayed||0)||1)*100+"%"})},null,4)])):p("v-if",!0)])],42,Sy))),256))]),p(" Detail: throughput chart + stats panel "),e.selectedStats?(l(),d("div",Oy,[n("div",Py,[n("div",Iy,[y(u(e.selectedQueue)+"\xB7throughput ",1),n("span",Vy,[t[13]||(t[13]=n("span",{class:"q-legend-completed"},"\u25CF",-1)),t[14]||(t[14]=y(" completed ",-1)),t[15]||(t[15]=n("span",{class:"q-legend-failed"},"\u25CF",-1)),t[16]||(t[16]=y(" failed ",-1)),t[17]||(t[17]=n("span",{class:"q-legend-exec"},"- -",-1)),y(" avg time \xB7 "+u(e.fmt?.uppercase(e.range)),1)])]),t[18]||(t[18]=n("div",{class:"q-chart-wrap"},[n("canvas",{id:"q-throughput-chart",height:"180"}),n("div",{id:"q-chart-tooltip",class:"q-chart-tooltip",style:{display:"none"}}),n("div",{id:"q-chart-crosshair",class:"q-chart-crosshair",style:{display:"none"}})],-1))]),n("div",qy,[n("div",My,u(e.selectedQueue)+"\xB7stats",1),n("div",$y,[n("div",Ly,[t[19]||(t[19]=n("div",{class:"q-stat-label"},"WAITING",-1)),n("div",{class:"q-stat-value",textContent:u(e.selectedStats?.counts?.waiting||0)},null,8,Uy)]),n("div",Fy,[t[20]||(t[20]=n("div",{class:"q-stat-label"},"ACTIVE",-1)),n("div",{class:"q-stat-value",textContent:u(e.selectedStats?.counts?.active||0)},null,8,By)]),n("div",zy,[t[21]||(t[21]=n("div",{class:"q-stat-label"},"COMPLETED (24H)",-1)),n("div",{class:"q-stat-value",textContent:u(e.fmt?.number(e.selectedStats?.completed24h))},null,8,Hy)]),n("div",jy,[t[22]||(t[22]=n("div",{class:"q-stat-label"},"FAILED (24H)",-1)),n("div",{class:"q-stat-value",textContent:u(e.selectedStats?.failed24h||0)},null,8,Gy)]),n("div",Wy,[t[23]||(t[23]=n("div",{class:"q-stat-label"},"DELAYED",-1)),n("div",{class:"q-stat-value",textContent:u(e.selectedStats?.counts?.delayed||0)},null,8,Ky)]),n("div",Yy,[t[24]||(t[24]=n("div",{class:"q-stat-label"},"WORKERS",-1)),n("div",{class:"q-stat-value",textContent:u(e.selectedStats?.workers||0)},null,8,Qy)])]),n("div",Jy,[n("button",{class:"btn btn-sm",onClick:t[6]||(t[6]=i=>e.togglePause())},u(e.selectedStats?.paused?"Resume":"Pause"),1),n("button",{class:"btn btn-sm",onClick:t[7]||(t[7]=i=>e.retryFailed()),disabled:!e.selectedStats?.counts?.failed},"Retry failed",8,Xy),n("button",{class:"btn btn-sm",onClick:t[8]||(t[8]=i=>e.emptyQueue())},"Empty")])])])):p("v-if",!0),e.actionError?(l(),d("div",{key:1,class:"q-toast-error",onClick:t[9]||(t[9]=i=>e.actionError=null)},[t[25]||(t[25]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-info"})],-1)),y(" "+u(e.actionError),1)])):p("v-if",!0),p(" Jobs table "),n("div",Zy,[n("div",xy,[n("div",eb,"ALL JOBS \xB7 "+u(e.fmt?.uppercase(e.selectedQueue)),1),n("div",tb,[(l(!0),d(W,null,Z(e.allStates,(i,o)=>(l(),d("label",ob,[N(n("input",sb,null,512),[[s,{state:e.viewState,set:r=>{e.stateFilter[i]=r},value:e.stateFilter[i],form:null,options:{}}]]),n("span",{class:A("q-state-chip q-state-"+i)},u(i),3)]))),256))])]),n("div",ib,[N(n("input",rb,null,512),[[s,{state:e.viewState,set:i=>{e.query.search=i},value:e.query?.search,form:null,options:{}}]]),n("label",ab,[N(n("input",lb,null,512),[[s,{state:e.viewState,set:i=>{e.query.autoRefresh=i},value:e.query?.autoRefresh,form:null,options:{}}]]),t[26]||(t[26]=y(" Auto-refresh ",-1))]),n("button",{class:"btn btn-sm btn-icon",type:"button",title:"Refresh now",onClick:t[10]||(t[10]=i=>e.refreshNow()),"aria-label":"Refresh"},[...t[27]||(t[27]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1)])])]),e.filteredJobs().length>0?(l(),d("table",db,[t[46]||(t[46]=n("thead",null,[n("tr",null,[n("th",null,"STATE"),n("th",null,"JOB ID"),n("th",null,"PAYLOAD"),n("th",null,"ATTEMPTS"),n("th",null,"DURATION"),n("th",null,"PROGRESS"),n("th")])],-1)),(l(!0),d(W,null,Z(e.filteredJobs(),(i,o)=>(l(),d("tbody",null,[n("tr",{style:{cursor:"pointer"},class:A({"q-row-failed":i?._state=="failed","q-row-expanded":e.expanded[i?.id]}),onClick:r=>e.toggleJob(i)},[n("td",cb,[n("span",{textContent:u(i?._state),class:A("q-state-badge q-state-"+i?._state)},null,10,pb),i?._state=="delayed"&&i?.delayUntil?(l(),d("span",{key:0,class:"q-delay-hint",textContent:u(e.delayCountdown(i?.delayUntil))},null,8,fb)):p("v-if",!0)]),n("td",hb,[(l(),d("svg",{class:A(["ui-icon q-chevron",{"q-chevron-open":e.expanded[i?.id]}]),"aria-hidden":"true"},[...t[28]||(t[28]=[n("use",{href:"#ui-icon-chevron-right"},null,-1)])],2)),n("a",{target:"_blank",textContent:u("job:"+e.fmt.limitTo(i?.id,6)),onClick:t[11]||(t[11]=r=>r.stopPropagation()),href:e.safeUrl("/r/"+i?.id)},null,8,mb)]),n("td",vb,[n("span",{textContent:u(i?.name||"anonymize")},null,8,gb),i?.data?.repoId&&i?.data?.repoId!==i?.name?(l(),d("span",yb," \xB7 "+u(i?.data?.repoId),1)):p("v-if",!0)]),n("td",{class:"q-cell-num",textContent:u(i?.attemptsMade||1)},null,8,bb),n("td",{class:"q-cell-num",textContent:u(e.jobDuration(i))},null,8,wb),n("td",kb,[e.jobProgressPct(i)!==null?(l(),d("div",Eb,[n("div",{class:"q-progress-bar",style:Ve({"--pct":e.jobProgressPct(i)+"%"})},null,4),n("span",{class:"q-progress-label",textContent:u(e.jobProgressPct(i)+"%")},null,8,Cb)])):p("v-if",!0)]),n("td",_b,[i?._state=="failed"?(l(),d("button",{key:0,class:"btn btn-sm btn-icon",title:"Retry",onClick:r=>{e.retryJob(i),r.stopPropagation()},"aria-label":"Retry job"},[...t[29]||(t[29]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1)])],8,Sb)):p("v-if",!0),n("button",{class:"btn btn-sm btn-icon",title:"Remove","aria-label":"Remove job",onClick:r=>{e.removeJob(i),r.stopPropagation()}},[...t[30]||(t[30]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1)])],8,Nb)])],10,ub),e.expanded[i?.id]?(l(),d("tr",Db,[n("td",Rb,[n("div",Tb,[n("div",Ab,[n("div",Ob,[t[31]||(t[31]=n("span",{class:"q-job-detail-label"},"JOB ID",-1)),n("span",Pb,[n("a",{target:"_blank",textContent:u(i?.id),href:e.safeUrl("/r/"+i?.id)},null,8,Ib)])]),n("div",Vb,[t[32]||(t[32]=n("span",{class:"q-job-detail-label"},"STATE",-1)),n("span",qb,[n("span",{textContent:u(i?._state),class:A("q-state-badge q-state-"+i?._state)},null,10,Mb)])]),i?.data?.repoId?(l(),d("div",$b,[t[33]||(t[33]=n("span",{class:"q-job-detail-label"},"REPO ID",-1)),n("span",{class:"q-job-detail-value",textContent:u(i?.data?.repoId)},null,8,Lb)])):p("v-if",!0),i?.timestamp?(l(),d("div",Ub,[t[34]||(t[34]=n("span",{class:"q-job-detail-label"},"CREATED",-1)),n("span",{class:"q-job-detail-value",textContent:u(e.humanTime(i?.timestamp))},null,8,Fb)])):p("v-if",!0),i?._state=="delayed"&&i?.delayUntil?(l(),d("div",Bb,[t[35]||(t[35]=n("span",{class:"q-job-detail-label"},"RETRY AT",-1)),n("span",zb,u(e.humanTime(i?.delayUntil))+" ("+u(e.delayCountdown(i?.delayUntil))+")",1)])):p("v-if",!0),i?.processedOn?(l(),d("div",Hb,[t[36]||(t[36]=n("span",{class:"q-job-detail-label"},"PROCESSED",-1)),n("span",{class:"q-job-detail-value",textContent:u(e.humanTime(i?.processedOn))},null,8,jb)])):p("v-if",!0),i?.finishedOn?(l(),d("div",Gb,[t[37]||(t[37]=n("span",{class:"q-job-detail-label"},"FINISHED",-1)),n("span",{class:"q-job-detail-value",textContent:u(e.humanTime(i?.finishedOn))},null,8,Wb)])):p("v-if",!0),i?.attemptsMade?(l(),d("div",Kb,[t[38]||(t[38]=n("span",{class:"q-job-detail-label"},"ATTEMPTS",-1)),n("span",{class:"q-job-detail-value",textContent:u(i?.attemptsMade)},null,8,Yb)])):p("v-if",!0),i?.progress&&i?.progress?.status?(l(),d("div",Qb,[t[39]||(t[39]=n("span",{class:"q-job-detail-label"},"STATUS",-1)),n("span",{class:"q-job-detail-value",textContent:u(i?.progress?.status)},null,8,Jb)])):p("v-if",!0),e.jobProgressPct(i)!==null?(l(),d("div",Xb,[t[40]||(t[40]=n("span",{class:"q-job-detail-label"},"PROGRESS",-1)),n("span",{class:"q-job-detail-value",textContent:u(e.jobProgressPct(i)+"%")},null,8,Zb)])):p("v-if",!0)]),i?.failedReason?(l(),d("div",xb,[t[41]||(t[41]=n("span",{class:"q-job-detail-label"},"ERROR",-1)),n("div",{class:"q-error-reason",textContent:u(i?.failedReason)},null,8,e1)])):p("v-if",!0),i?.stacktrace?.length?(l(),d("div",t1,[t[42]||(t[42]=n("span",{class:"q-job-detail-label"},"STACKTRACE",-1)),(l(!0),d(W,null,Z(i?.stacktrace,(r,a)=>(l(),d("pre",{class:"q-error-stack",key:a},[n("code",{textContent:u(r)},null,8,n1)]))),128))])):p("v-if",!0),n("div",o1,[i?._state=="failed"?(l(),d("button",{key:0,class:"btn btn-sm",onClick:r=>e.retryJob(i)},[...t[43]||(t[43]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Retry",-1)])],8,s1)):p("v-if",!0),n("button",{class:"btn btn-sm",onClick:r=>e.removeJob(i)},[...t[44]||(t[44]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Remove",-1)])],8,i1),n("a",{class:"btn btn-sm",target:"_blank",href:e.safeUrl("/r/"+i?.id)},[...t[45]||(t[45]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-external-link"})],-1),y(" View repo",-1)])],8,r1)])])])])):p("v-if",!0)]))),256))])):p("v-if",!0),e.filteredJobs().length==0?(l(),d("div",a1,[t[47]||(t[47]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-check-circle"})],-1)),e.query?.search?p("v-if",!0):(l(),d("span",l1,"No jobs in the "+u(e.selectedQueue)+" queue.",1)),e.query?.search?(l(),d("span",d1,"No jobs match the current filters.")):p("v-if",!0)])):p("v-if",!0)])])}var u1={class:"container paper-page admin-page"},c1={class:"admin-summary"},p1={class:"summary-total"},f1={class:"summary-meta"},h1=["aria-pressed"],m1={class:"count"},v1=["aria-pressed"],g1={class:"count"},y1=["aria-pressed"],b1={class:"count"},w1=["aria-pressed"],k1={class:"count"},E1=["aria-pressed"],C1={class:"count"},_1={key:0,class:"alert alert-danger",style:{margin:"8px 0"}},S1={class:"w-100 admin-filter-toolbar","aria-label":"Repositories","accept-charset":"UTF-8"},N1={class:"admin-filter-row"},D1={class:"search-wrap"},R1={type:"search",class:"form-control","aria-label":"Search repositories",placeholder:"Search repoId, source repo, error message\u2026",autocomplete:"off"},T1={key:0,class:"admin-search-hint"},A1={class:"admin-filter-inline"},O1={type:"text",class:"form-control form-control-sm",placeholder:"username"},P1={class:"admin-filter-inline"},I1={type:"text",class:"form-control form-control-sm",placeholder:"ID"},V1={class:"admin-filter-inline","aria-label":"Pagination"},q1=["disabled"],M1={style:{"font-family":"var(--font-mono)","font-size":"12px",color:"var(--ink-muted)"}},$1=["disabled"],L1={key:0,class:"admin-filter-row"},U1={class:"admin-active-chips"},F1={class:"key"},B1=["onClick"],z1={key:1,class:"bulk-bar"},H1={class:"paper-table paper-table-repos has-bulk w-100",role:"table","aria-label":"Repositories"},j1={class:"paper-table-head",role:"row"},G1={role:"columnheader",style:{width:"28px"}},W1=["checked"],K1={role:"columnheader"},Y1={role:"columnheader"},Q1={role:"columnheader",class:"num"},J1={role:"columnheader"},X1={role:"cell",style:{width:"28px"}},Z1={type:"checkbox","aria-label":"Select repository"},x1={class:"cell-anon",role:"cell"},ew={class:"anon-text"},tw=["textContent","href"],nw={class:"anon-sub"},ow=["textContent","href"],sw={key:0},iw=["textContent","href"],rw={key:1},aw=["textContent","href"],lw={key:2},dw={class:"cell-status",role:"cell"},uw={class:"status-line"},cw=["textContent"],pw=["textContent","title"],fw={class:"cell-views num",role:"cell"},hw=["textContent"],mw={class:"cell-expires",role:"cell"},vw=["textContent"],gw={class:"cell-actions",role:"cell"},yw={class:"dropdown"},bw={class:"dropdown-menu dropdown-menu-right"},ww=["href"],kw=["href"],Ew=["href"],Cw=["onClick"],_w=["onClick"],Sw=["onClick"],Nw=["onClick"],Dw=["onClick"],Rw=["onClick"],Tw={key:0,class:"paper-table-empty"},Aw={class:"admin-toolbar",style:{"justify-content":"space-between","border-bottom":"none"}},Ow={style:{"font-size":"12px",color:"var(--ink-muted)"}},Pw={key:0,class:"pagination-compact"},Iw=["disabled"],Vw=["max"],qw=["disabled"],Mw={class:"admin-filter-inline"},$w={class:"form-control form-control-sm"};function gl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",u1,[t[69]||(t[69]=pe('
Admin \xA0/\xA0 Repositories

Repositories

',3)),n("div",c1,[n("span",p1,u(e.total>=0?e.fmt.number(e.total):"\u2026"),1),n("span",f1,u(e.fmt?.humanFileSize(e.totalSize))+" on disk",1),n("button",{type:"button",class:A(["summary-pill ok",{active:e.query?.ready}]),title:"Toggle ready filter",onClick:t[0]||(t[0]=o=>{e.query.ready=!e.query.ready,e.query.page=1}),"aria-pressed":!!e.query?.ready},[t[18]||(t[18]=y("Ready ",-1)),n("span",m1,u(e.fmt?.number(e.statusCountFor("ready"))),1)],10,h1),n("button",{type:"button",class:A(["summary-pill warn",{active:e.query?.preparing}]),title:"Toggle preparing filter",onClick:t[1]||(t[1]=o=>{e.query.preparing=!e.query.preparing,e.query.page=1}),"aria-pressed":!!e.query?.preparing},[t[19]||(t[19]=y("Preparing ",-1)),n("span",g1,u(e.fmt?.number(e.statusCountFor("preparing")+e.statusCountFor("download"))),1)],10,v1),n("button",{type:"button",class:A(["summary-pill error",{active:e.query?.error}]),title:"Toggle errored filter",onClick:t[2]||(t[2]=o=>{e.query.error=!e.query.error,e.query.page=1}),"aria-pressed":!!e.query?.error},[t[20]||(t[20]=y("Errored ",-1)),n("span",b1,u(e.fmt?.number(e.statusCountFor("error"))),1)],10,y1),n("button",{type:"button",class:A(["summary-pill",{active:e.query?.expired}]),title:"Toggle expired filter",onClick:t[3]||(t[3]=o=>{e.query.expired=!e.query.expired,e.query.page=1}),"aria-pressed":!!e.query?.expired},[t[21]||(t[21]=y("Expired ",-1)),n("span",k1,u(e.fmt?.number(e.statusCountFor("expired")+e.statusCountFor("expiring"))),1)],10,w1),n("button",{type:"button",class:A(["summary-pill",{active:e.query?.removed}]),title:"Toggle removed filter",onClick:t[4]||(t[4]=o=>{e.query.removed=!e.query.removed,e.query.page=1}),"aria-pressed":!!e.query?.removed},[t[22]||(t[22]=y("Removed ",-1)),n("span",C1,u(e.fmt?.number(e.statusCountFor("removed")+e.statusCountFor("removing"))),1)],10,E1)]),e.fetchError?(l(),d("div",_1,[t[23]||(t[23]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),y(" "+u(e.fetchError),1)])):p("v-if",!0),N((l(),d("form",S1,[p(" Row 1: search + scoped inputs + headline actions "),n("div",N1,[n("div",D1,[N(n("input",R1,null,512),[[s,{state:e.viewState,set:o=>{e.query.search=o},value:e.query?.search,form:null,options:{}}]]),e.query?.search?p("v-if",!0):(l(),d("span",T1,"/"))]),n("span",A1,[t[24]||(t[24]=n("label",null,"Owner",-1)),N(n("input",O1,null,512),[[s,{state:e.viewState,set:o=>{e.query.owner=o},value:e.query?.owner,form:null,options:{}}]])]),n("span",P1,[t[25]||(t[25]=n("label",null,"Conference",-1)),N(n("input",I1,null,512),[[s,{state:e.viewState,set:o=>{e.query.conference=o},value:e.query?.conference,form:null,options:{}}]])]),t[29]||(t[29]=n("span",{class:"admin-filter-spacer"},null,-1)),n("button",{class:"btn btn-sm",type:"button",title:"Export current view to CSV",onClick:t[5]||(t[5]=o=>e.exportCsv())},[...t[26]||(t[26]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-export"})],-1),y(" Export",-1)])]),n("span",V1,[n("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[6]||(t[6]=o=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1,"aria-label":"Previous page"},[...t[27]||(t[27]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-left"})],-1)])],8,q1),n("span",M1,u(e.query?.page)+"/"+u(e.totalPage||1),1),n("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[7]||(t[7]=o=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage,"aria-label":"Next page"},[...t[28]||(t[28]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-right"})],-1)])],8,$1)])]),p(" Row 2: appears only when there are active filter chips "),e.chips?.length?(l(),d("div",L1,[n("div",U1,[(l(!0),d(W,null,Z(e.chips,(o,r)=>(l(),d("span",{class:"admin-active-chip",key:o?.key},[n("span",F1,u(o?.label),1),n("span",null,u(o?.value),1),n("button",{type:"button","aria-label":"Remove filter",onClick:a=>e.clearFilter(o.key)},[...t[30]||(t[30]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])],8,B1)]))),128))])])):p("v-if",!0)])),[[i,e.viewState]]),e.selectedCount()>0?(l(),d("div",z1,[n("span",null,[n("strong",null,u(e.selectedCount()),1),t[31]||(t[31]=y(" selected",-1))]),n("button",{class:"btn btn-sm",type:"button",onClick:t[8]||(t[8]=o=>e.bulkRefresh())},[...t[32]||(t[32]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Force refresh",-1)])]),n("button",{class:"btn btn-sm text-danger",type:"button",onClick:t[9]||(t[9]=o=>e.bulkRemoveCache())},[...t[33]||(t[33]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-broom"})],-1),y(" Remove cache",-1)])]),n("button",{class:"btn btn-sm",type:"button",onClick:t[10]||(t[10]=o=>e.clearSelection())},"Clear")])):p("v-if",!0),n("div",H1,[n("div",j1,[n("div",G1,[n("input",{type:"checkbox","aria-label":"Select all on page",onClick:t[11]||(t[11]=o=>e.selectAllOnPage()),checked:e.allSelected},null,8,W1)]),n("div",K1,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="source.repositoryName"}]),onClick:t[12]||(t[12]=o=>e.sortBy("source.repositoryName"))},[t[35]||(t[35]=y("Repository ",-1)),e.sortIcon("source.repositoryName")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("source.repositoryName")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[34]||(t[34]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",Y1,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="status"}]),onClick:t[13]||(t[13]=o=>e.sortBy("status"))},[t[37]||(t[37]=y("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[36]||(t[36]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",Q1,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="pageView"}]),onClick:t[14]||(t[14]=o=>e.sortBy("pageView"))},[t[39]||(t[39]=y("Views ",-1)),e.sortIcon("pageView")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("pageView")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[38]||(t[38]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",J1,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="anonymizeDate"}]),onClick:t[15]||(t[15]=o=>e.sortBy("anonymizeDate"))},[t[41]||(t[41]=y("Anonymized ",-1)),e.sortIcon("anonymizeDate")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("anonymizeDate")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[40]||(t[40]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[42]||(t[42]=n("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(W,null,Z(e.filteredRepositories,(o,r)=>(l(),d("div",{class:A(["paper-table-row",{"repo-inactive":o?.status=="expired"||o?.status=="removed","repo-error":o?.status=="error","row-selected":e.selected[o?.repoId]}]),role:"row"},[n("div",X1,[N(n("input",Z1,null,512),[[s,{state:e.viewState,set:a=>{e.selected[o.repoId]=a},value:e.selected[o?.repoId],form:null,options:{}}]])]),n("div",x1,[t[47]||(t[47]=n("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[n("use",{href:"#project-type-repo"})],-1)),n("div",ew,[n("a",{class:"repo-name",target:"_blank",textContent:u(o?.repoId),href:e.safeUrl("/r/"+o?.repoId)},null,8,tw),n("div",nw,[n("a",{textContent:u(o?.source?.repositoryName),href:e.safeUrl("https://github.com/"+o?.source?.repositoryName+"/")},null,8,ow),o?.options?.update?(l(),d("span",sw,[t[43]||(t[43]=y("\xA0\xB7\xA0",-1)),n("a",{textContent:u(o?.source?.branch),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/tree/"+o?.source?.branch)},null,8,iw)])):p("v-if",!0),o?.options?.update?p("v-if",!0):(l(),d("span",rw,[t[44]||(t[44]=y("\xA0\xB7\xA0@",-1)),n("a",{textContent:u(o?.source?.commit?.substring(0,8)),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/tree/"+o?.source?.commit)},null,8,aw)])),o?.conference?(l(),d("span",lw,[t[45]||(t[45]=y("\xA0\xB7\xA0",-1)),t[46]||(t[46]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-conference"})],-1)),y(" "+u(o?.conference),1)])):p("v-if",!0),n("span",null,"\xA0\xB7\xA0"+u(e.fmt?.humanFileSize(o?.size?.storage)),1),n("span",null,"\xA0\xB7\xA0"+u(e.fmt?.number(o?.options?.terms?.length))+" terms",1)])])]),n("div",dw,[n("span",uw,[n("span",{class:A(["status-dot",{"status-removed":o?.status=="removed"||o?.status=="expired","status-ready":o?.status=="ready","status-error":o?.status=="error","status-preparing":o?.status=="preparing"}])},null,2),n("span",{textContent:u(e.fmt?.title(o?.status))},null,8,cw)]),o?.statusMessage?(l(),d("span",{key:0,class:"status-sub",textContent:u(e.fmt?.statusMsg(o?.statusMessage)),title:o?.statusMessage},null,8,pw)):p("v-if",!0)]),n("div",fw,[t[48]||(t[48]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1)),t[49]||(t[49]=y()),n("span",{textContent:u(e.fmt?.number(o?.pageView||0))},null,8,hw)]),n("div",mw,[t[50]||(t[50]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),t[51]||(t[51]=y()),n("span",{textContent:u(e.fmt?.humanTime(o?.anonymizeDate))},null,8,vw)]),n("div",gw,[n("div",yw,[t[63]||(t[63]=n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})])],-1)),n("div",bw,[n("a",{class:"dropdown-item",href:e.safeUrl("/anonymize/"+o?.repoId)},[...t[52]||(t[52]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit",-1)])],8,ww),n("a",{class:"dropdown-item",href:e.safeUrl("/r/"+o?.repoId+"/")},[...t[53]||(t[53]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View repo",-1)])],8,kw),o?.options?.page&&o?.status=="ready"?(l(),d("a",{key:0,class:"dropdown-item",target:"_self",href:e.safeUrl("/w/"+o?.repoId+"/")},[...t[54]||(t[54]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-globe"})],-1),y(" View page",-1)])],8,Ew)):p("v-if",!0),n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.fetchGithubInfo(o),["prevent"])},[...t[55]||(t[55]=[n("i",{class:"fab fa-github"},null,-1),y(" Live GitHub info",-1)])],8,Cw),t[61]||(t[61]=n("div",{class:"dropdown-divider"},null,-1)),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.updateRepository(o),["prevent"])},[...t[56]||(t[56]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Force update",-1)])],8,_w),[[G,o?.status=="ready"||o?.status=="error"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.updateRepository(o),["prevent"])},[...t[57]||(t[57]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-check-circle"})],-1),y(" Enable",-1)])],8,Sw),[[G,o?.status=="removed"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.showStatusMessage(o),["prevent"])},[...t[58]||(t[58]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1),y(" View status message",-1)])],8,Nw),[[G,o?.statusMessage]]),t[62]||(t[62]=n("div",{class:"dropdown-divider"},null,-1)),n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.removeCache(o),["prevent"])},[...t[59]||(t[59]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-broom"})],-1),y(" Remove cache",-1)])],8,Dw),N(n("a",{class:"dropdown-item text-danger",href:"#",onClick:ue(a=>e.removeRepository(o),["prevent"])},[...t[60]||(t[60]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Remove",-1)])],8,Rw),[[G,o?.status=="ready"]])])])])],2))),256)),e.filteredRepositories?.length==0?(l(),d("div",Tw,[...t[64]||(t[64]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1),n("span",null,"No repositories match the current filters.",-1)])])):p("v-if",!0)]),n("div",Aw,[n("span",Ow,u(e.fmt?.number(e.total))+" results",1),e.totalPage>1?(l(),d("div",Pw,[n("button",{class:"btn btn-sm",onClick:t[16]||(t[16]=o=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1},[...t[65]||(t[65]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-left"})],-1),y(" Previous ",-1)])],8,Iw),N(n("input",{type:"number",class:"form-control form-control-sm",min:"1",style:{width:"56px"},"aria-label":"Page",max:e.totalPage},null,8,Vw),[[s,{state:e.viewState,set:o=>{e.query.page=o},value:e.query?.page,form:null,options:{}}]]),n("span",null,"of "+u(e.totalPage),1),n("button",{class:"btn btn-sm",onClick:t[17]||(t[17]=o=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage},[...t[66]||(t[66]=[y(" Next ",-1),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-right"})],-1)])],8,qw)])):p("v-if",!0),n("span",Mw,[t[68]||(t[68]=n("label",null,"Per page",-1)),N((l(),d("select",$w,[...t[67]||(t[67]=[pe('',5)])])),[[s,{state:e.viewState,set:o=>{e.query.limit=o},value:e.query?.limit,form:null,options:{}}]])])])])}var Lw={class:"container paper-page admin-page"},Uw={class:"paper-crumbs"},Fw={class:"here"},Bw={class:"paper-page-title"},zw={key:0,class:"user-detail-card"},Hw={class:"user-header"},jw=["src"],Gw={class:"status-dot-wrap"},Ww=["textContent"],Kw={key:0,class:"type-badge type-repo"},Yw={class:"user-actions",style:{"margin-top":"4px"}},Qw={class:"user-detail-grid"},Jw={class:"detail-value"},Xw={class:"detail-value"},Zw={class:"detail-value",style:{"font-family":"var(--font-mono)","font-size":"0.85rem"}},xw={class:"detail-value"},ek=["href"],tk={class:"detail-value"},nk={class:"detail-value"},ok={key:0},sk={key:1,class:"text-muted"},ik={class:"detail-value"},rk={key:0,style:{"margin-top":"20px"}},ak={class:"paper-table w-100",style:{"margin-top":"10px"}},lk={class:"paper-table-row",style:{"grid-template-columns":"1fr 160px"}},dk={class:"cell-anon",role:"cell"},uk={class:"anon-text"},ck=["textContent"],pk={class:"cell-expires",role:"cell"},fk={key:1,class:"admin-section-header"},hk={class:"section-count"},mk={key:2,class:"user-detail-card"},vk={type:"text",class:"form-control",placeholder:"Token name (e.g. dev-laptop)",required:""},gk={key:0,class:"alert alert-warning",role:"alert"},yk={style:{"white-space":"pre-wrap","word-break":"break-all",margin:"8px 0 0","font-family":"var(--font-mono)","font-size":"0.85rem"}},bk={key:1,class:"paper-table w-100"},wk={class:"paper-table-row",role:"row",style:{"grid-template-columns":"1fr 200px 200px 80px"}},kk=["textContent"],Ek=["textContent"],Ck={role:"cell"},_k={key:0},Sk={key:1,class:"text-muted"},Nk={role:"cell"},Dk=["onClick"],Rk={key:2,class:"paper-table-empty"},Tk={class:"admin-section-header"},Ak={class:"section-count"},Ok={class:"admin-summary"},Pk={class:"summary-total"},Ik=["aria-pressed"],Vk={class:"count"},qk=["aria-pressed"],Mk={class:"count"},$k=["aria-pressed"],Lk={class:"count"},Uk=["aria-pressed"],Fk={class:"count"},Bk=["aria-pressed"],zk={class:"count"},Hk={class:"w-100 admin-filter-toolbar","aria-label":"Repositories","accept-charset":"UTF-8"},jk={class:"admin-filter-row"},Gk={class:"search-wrap"},Wk={type:"search",class:"form-control","aria-label":"Search repositories",placeholder:"Search repoId, source repo, error message\u2026",autocomplete:"off"},Kk={key:3,class:"bulk-bar"},Yk={class:"paper-table paper-table-repos has-bulk w-100",role:"table","aria-label":"Repositories"},Qk={class:"paper-table-head",role:"row"},Jk={role:"columnheader",style:{width:"28px"}},Xk=["checked"],Zk={role:"columnheader"},xk={role:"columnheader"},e0={role:"columnheader",class:"num"},t0={role:"columnheader"},n0={role:"cell",style:{width:"28px"}},o0={type:"checkbox","aria-label":"Select repository"},s0={class:"cell-anon",role:"cell"},i0={class:"anon-text"},r0=["textContent","href"],a0={class:"anon-sub"},l0=["textContent","href"],d0={key:0},u0=["textContent","href"],c0={key:1},p0=["textContent","href"],f0={key:2},h0={class:"cell-status",role:"cell"},m0={class:"status-line"},v0=["textContent"],g0=["textContent","title"],y0=["textContent"],b0=["textContent"],w0={class:"cell-actions",role:"cell"},k0={class:"dropdown"},E0={class:"dropdown-menu dropdown-menu-right"},C0=["href"],_0=["href"],S0=["href"],N0=["onClick"],D0=["onClick"],R0=["onClick"],T0=["onClick"],A0=["onClick"],O0=["onClick"],P0={key:0,class:"paper-table-empty"};function yl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",Lw,[n("div",Uw,[t[22]||(t[22]=n("a",{href:"/admin/users"},"Users",-1)),t[23]||(t[23]=y(" \xA0/\xA0 ",-1)),n("span",Fw,u(e.userInfo?.username||"Profile"),1)]),n("h1",Bw,u(e.userInfo?.username||"User"),1),t[85]||(t[85]=pe('',1)),e.userInfo?(l(),d("div",zw,[n("div",Hw,[e.userInfo?.photo?(l(),d("img",{key:0,width:"56",height:"56",src:e.safeUrl(e.userInfo?.photo)},null,8,jw)):p("v-if",!0),n("div",null,[n("h2",null,[y(u(e.userInfo?.username)+" ",1),n("span",Gw,[n("span",{class:A(["status-dot",{"status-ready":e.userInfo?.status=="active","status-removed":e.userInfo?.status!="active"}])},null,2),n("span",{textContent:u(e.fmt?.title(e.userInfo?.status))},null,8,Ww)]),e.userInfo?.isAdmin?(l(),d("span",Kw,"Admin")):p("v-if",!0)]),n("div",Yw,[e.userInfo?.status!=="banned"?(l(),d("button",{key:0,class:"btn btn-sm text-danger",onClick:t[0]||(t[0]=o=>e.banUser())},[...t[24]||(t[24]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-ban"})],-1),y(" Ban",-1)])])):p("v-if",!0),e.userInfo?.status==="banned"||e.userInfo?.status==="removed"?(l(),d("button",{key:1,class:"btn btn-sm",onClick:t[1]||(t[1]=o=>e.activateUser())},[...t[25]||(t[25]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-check-circle"})],-1),y(" Activate",-1)])])):p("v-if",!0),e.userInfo?.isAdmin?p("v-if",!0):(l(),d("button",{key:2,class:"btn btn-sm",onClick:t[2]||(t[2]=o=>e.promoteUser())},[...t[26]||(t[26]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user-shield"})],-1),y(" Promote to admin",-1)])])),e.userInfo?.isAdmin?(l(),d("button",{key:3,class:"btn btn-sm text-danger",onClick:t[3]||(t[3]=o=>e.demoteUser())},[...t[27]||(t[27]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user-minus"})],-1),y(" Remove admin",-1)])])):p("v-if",!0)])])]),n("div",Qw,[t[30]||(t[30]=n("div",{class:"detail-label"},"ID",-1)),n("div",Jw,u(e.userInfo?._id),1),t[31]||(t[31]=n("div",{class:"detail-label"},"Email",-1)),n("div",Xw,u(e.userInfo?.emails?.[0]?.email),1),t[32]||(t[32]=n("div",{class:"detail-label"},"Access token",-1)),n("div",Zw,u(e.userInfo?.accessTokens?.github),1),t[33]||(t[33]=n("div",{class:"detail-label"},"GitHub",-1)),n("div",xw,[n("a",{target:"_blank",href:e.safeUrl("https://github.com/"+e.userInfo?.username)},[t[28]||(t[28]=n("i",{class:"fab fa-github"},null,-1)),y(" "+u(e.userInfo?.username),1)],8,ek)]),t[34]||(t[34]=n("div",{class:"detail-label"},"Created",-1)),n("div",tk,u(e.fmt?.humanTime(e.userInfo?.dateOfEntry)),1),t[35]||(t[35]=n("div",{class:"detail-label"},"Last connection",-1)),n("div",nk,[e.userInfo?.accessTokenDates?.github?(l(),d("span",ok,u(e.fmt?.humanTime(e.userInfo?.accessTokenDates?.github)),1)):p("v-if",!0),e.userInfo?.accessTokenDates?.github?p("v-if",!0):(l(),d("span",sk,"never"))]),t[36]||(t[36]=n("div",{class:"detail-label"},"GitHub repos",-1)),n("div",ik,[y(u(e.userInfo?.repositories?.length)+" repositories ",1),n("button",{class:"btn btn-sm ml-2",onClick:t[4]||(t[4]=o=>e.showRepos=!e.showRepos)},u(e.showRepos?"Hide":"Show"),1),n("button",{class:"btn btn-sm ml-1",onClick:t[5]||(t[5]=o=>e.getGitHubRepositories())},[...t[29]||(t[29]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Refresh ",-1)])])])]),e.showRepos?(l(),d("div",rk,[t[39]||(t[39]=n("div",{class:"paper-section-eyebrow"},"GitHub repositories",-1)),n("div",ak,[(l(!0),d(W,null,Z(e.userInfo?.repositories,(o,r)=>(l(),d("div",lk,[n("div",dk,[t[37]||(t[37]=n("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[n("use",{href:"#project-type-repo"})],-1)),n("div",uk,[n("span",{class:"repo-name",textContent:u(o?.name)},null,8,ck)])]),n("div",pk,[t[38]||(t[38]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-database"})],-1)),y(" "+u(e.fmt?.humanFileSize(o?.size)),1)])]))),256))])])):p("v-if",!0)])):p("v-if",!0),e.userInfo&&e.userInfo?.isAdmin&&e.user&&e.user?.username==e.userInfo?.username?(l(),d("div",fk,[t[40]||(t[40]=n("h2",null,[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-key"})]),y(" API tokens")],-1)),n("span",hk,u(e.tokens?.length),1)])):p("v-if",!0),e.userInfo&&e.userInfo?.isAdmin&&e.user&&e.user?.username==e.userInfo?.username?(l(),d("div",mk,[t[46]||(t[46]=n("p",{class:"paper-page-lede"},[y("Personal API tokens for this admin account. Send as "),n("code",null,"Authorization: Bearer "),y(" to authenticate without GitHub OAuth (useful for development).")],-1)),N((l(),d("form",{class:"d-flex",style:{gap:"8px","margin-bottom":"12px"},onSubmit:t[6]||(t[6]=ue(o=>e.submitForm(o,()=>{e.createToken()}),["prevent"]))},[N(n("input",vk,null,512),[[s,{state:e.viewState,set:o=>{e.tokenForm.name=o},value:e.tokenForm?.name,form:null,options:{}}]]),t[41]||(t[41]=n("button",{type:"submit",class:"btn btn-primary"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-plus"})]),y(" Generate")],-1))],32)),[[i,e.viewState]]),e.tokenForm?.plaintext?(l(),d("div",gk,[t[42]||(t[42]=n("strong",null,"Copy this token now \u2014 it will not be shown again:",-1)),n("pre",yk,u(e.tokenForm?.plaintext),1),n("button",{class:"btn btn-sm",onClick:t[7]||(t[7]=o=>e.tokenForm.plaintext=null)},"Dismiss")])):p("v-if",!0),e.tokens?.length?(l(),d("div",bk,[t[44]||(t[44]=n("div",{class:"paper-table-head",role:"row",style:{"grid-template-columns":"1fr 200px 200px 80px"}},[n("div",{role:"columnheader"},"Name"),n("div",{role:"columnheader"},"Created"),n("div",{role:"columnheader"},"Last used"),n("div",{role:"columnheader","aria-label":"Actions"})],-1)),(l(!0),d(W,null,Z(e.tokens,(o,r)=>(l(),d("div",wk,[n("div",{role:"cell",textContent:u(o?.name)},null,8,kk),n("div",{role:"cell",textContent:u(e.fmt?.humanTime(o?.createdAt))},null,8,Ek),n("div",Ck,[o?.lastUsedAt?(l(),d("span",_k,u(e.fmt?.humanTime(o?.lastUsedAt)),1)):p("v-if",!0),o?.lastUsedAt?p("v-if",!0):(l(),d("span",Sk,"never"))]),n("div",Nk,[n("button",{class:"btn btn-sm text-danger btn-icon",title:"Revoke","aria-label":"Revoke token",onClick:a=>e.revokeToken(o)},[...t[43]||(t[43]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1)])],8,Dk)])]))),256))])):p("v-if",!0),e.tokens?.length?p("v-if",!0):(l(),d("div",Rk,[...t[45]||(t[45]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1),n("span",null,"No tokens yet.",-1)])]))])):p("v-if",!0),n("div",Tk,[t[47]||(t[47]=n("h2",null,[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})]),y(" Anonymized repositories")],-1)),n("span",Ak,u(e.repositories?.length),1)]),n("div",Ok,[n("span",Pk,u(e.fmt?.number(e.repositories?.length)),1),n("button",{type:"button",class:A(["summary-pill ok",{active:e.filters?.status?.ready===!1}]),title:"Toggle ready filter",onClick:t[8]||(t[8]=o=>e.filters.status.ready=!e.filters.status.ready),"aria-pressed":e.filters?.status?.ready===!1},[t[48]||(t[48]=y("Ready ",-1)),n("span",Vk,u(e.fmt?.number(e.statusCountFor("ready"))),1)],10,Ik),n("button",{type:"button",class:A(["summary-pill warn",{active:e.filters?.status?.preparing===!1}]),title:"Toggle preparing filter",onClick:t[9]||(t[9]=o=>e.filters.status.preparing=!e.filters.status.preparing),"aria-pressed":e.filters?.status?.preparing===!1},[t[49]||(t[49]=y("Preparing ",-1)),n("span",Mk,u(e.fmt?.number(e.statusCountFor("preparing"))),1)],10,qk),n("button",{type:"button",class:A(["summary-pill error",{active:e.filters?.status?.error===!1}]),title:"Toggle errored filter",onClick:t[10]||(t[10]=o=>e.filters.status.error=!e.filters.status.error),"aria-pressed":e.filters?.status?.error===!1},[t[50]||(t[50]=y("Errored ",-1)),n("span",Lk,u(e.fmt?.number(e.statusCountFor("error"))),1)],10,$k),n("button",{type:"button",class:A(["summary-pill",{active:e.filters?.status?.expired===!1}]),title:"Toggle expired filter",onClick:t[11]||(t[11]=o=>e.filters.status.expired=!e.filters.status.expired),"aria-pressed":e.filters?.status?.expired===!1},[t[51]||(t[51]=y("Expired ",-1)),n("span",Fk,u(e.fmt?.number(e.statusCountFor("expired"))),1)],10,Uk),n("button",{type:"button",class:A(["summary-pill",{active:e.filters?.status?.removed===!1}]),title:"Toggle removed filter",onClick:t[12]||(t[12]=o=>e.filters.status.removed=!e.filters.status.removed),"aria-pressed":e.filters?.status?.removed===!1},[t[52]||(t[52]=y("Removed ",-1)),n("span",zk,u(e.fmt?.number(e.statusCountFor("removed"))),1)],10,Bk)]),N((l(),d("form",Hk,[n("div",jk,[n("div",Gk,[N(n("input",Wk,null,512),[[s,{state:e.viewState,set:o=>{e.search=o},value:e.search,form:null,options:{}}]])]),t[54]||(t[54]=n("span",{class:"admin-filter-spacer"},null,-1)),n("button",{class:"btn btn-sm",type:"button",title:"Export current view to CSV",onClick:t[13]||(t[13]=o=>e.exportCsv())},[...t[53]||(t[53]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-export"})],-1),y(" Export",-1)])])])])),[[i,e.viewState]]),e.selectedCount()>0?(l(),d("div",Kk,[n("span",null,[n("strong",null,u(e.selectedCount()),1),t[55]||(t[55]=y(" selected",-1))]),n("button",{class:"btn btn-sm",type:"button",onClick:t[14]||(t[14]=o=>e.bulkRefresh())},[...t[56]||(t[56]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Force refresh",-1)])]),n("button",{class:"btn btn-sm text-danger",type:"button",onClick:t[15]||(t[15]=o=>e.bulkRemoveCache())},[...t[57]||(t[57]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-broom"})],-1),y(" Remove cache",-1)])]),n("button",{class:"btn btn-sm",type:"button",onClick:t[16]||(t[16]=o=>e.clearSelection())},"Clear")])):p("v-if",!0),n("div",Yk,[n("div",Qk,[n("div",Jk,[n("input",{type:"checkbox","aria-label":"Select all on page",onClick:t[17]||(t[17]=o=>e.selectAllOnPage()),checked:e.allSelected},null,8,Xk)]),n("div",Zk,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="source.repositoryName"}]),onClick:t[18]||(t[18]=o=>e.sortBy("source.repositoryName"))},[t[59]||(t[59]=y("Repository ",-1)),e.sortIcon("source.repositoryName")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("source.repositoryName")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[58]||(t[58]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",xk,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="status"}]),onClick:t[19]||(t[19]=o=>e.sortBy("status"))},[t[61]||(t[61]=y("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[60]||(t[60]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",e0,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="pageView"}]),onClick:t[20]||(t[20]=o=>e.sortBy("pageView"))},[t[63]||(t[63]=y("Views ",-1)),e.sortIcon("pageView")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("pageView")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[62]||(t[62]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),n("div",t0,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="anonymizeDate"}]),onClick:t[21]||(t[21]=o=>e.sortBy("anonymizeDate"))},[t[65]||(t[65]=y("Anonymized ",-1)),e.sortIcon("anonymizeDate")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("anonymizeDate")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[64]||(t[64]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[66]||(t[66]=n("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(W,null,Z(e.filteredRepositories,(o,r)=>(l(),d("div",{class:A(["paper-table-row",{"repo-inactive":o?.status=="expired"||o?.status=="removed","repo-error":o?.status=="error","row-selected":e.selected[o?.repoId]}]),role:"row"},[n("div",n0,[N(n("input",o0,null,512),[[s,{state:e.viewState,set:a=>{e.selected[o.repoId]=a},value:e.selected[o?.repoId],form:null,options:{}}]])]),n("div",s0,[t[71]||(t[71]=n("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[n("use",{href:"#project-type-repo"})],-1)),n("div",i0,[n("a",{class:"repo-name",target:"_blank",textContent:u(o?.repoId),href:e.safeUrl("/r/"+o?.repoId)},null,8,r0),n("div",a0,[n("a",{textContent:u(o?.source?.fullName),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/")},null,8,l0),o?.options?.update?(l(),d("span",d0,[t[67]||(t[67]=y("\xA0\xB7\xA0",-1)),n("a",{textContent:u(o?.source?.branch),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/tree/"+o?.source?.branch)},null,8,u0)])):p("v-if",!0),o?.options?.update?p("v-if",!0):(l(),d("span",c0,[t[68]||(t[68]=y("\xA0\xB7\xA0@",-1)),n("a",{textContent:u(o?.source?.commit?.substring(0,8)),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/tree/"+o?.source?.commit)},null,8,p0)])),o?.conference?(l(),d("span",f0,[t[69]||(t[69]=y("\xA0\xB7\xA0",-1)),t[70]||(t[70]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-conference"})],-1)),y(" "+u(o?.conference),1)])):p("v-if",!0),n("span",null,"\xA0\xB7\xA0"+u(e.fmt?.humanFileSize(o?.size?.storage)),1),n("span",null,"\xA0\xB7\xA0"+u(e.fmt?.number(o?.options?.terms?.length))+" terms",1)])])]),n("div",h0,[n("span",m0,[n("span",{class:A(["status-dot",{"status-removed":o?.status=="removed"||o?.status=="expired","status-ready":o?.status=="ready","status-error":o?.status=="error","status-preparing":o?.status=="preparing"}])},null,2),n("span",{textContent:u(e.fmt?.title(o?.status))},null,8,v0)]),o?.statusMessage?(l(),d("span",{key:0,class:"status-sub",textContent:u(e.fmt?.statusMsg(o?.statusMessage)),title:o?.statusMessage},null,8,g0)):p("v-if",!0)]),n("div",{class:"cell-views num",role:"cell",textContent:u(e.fmt?.number(o?.pageView||0))},null,8,y0),n("div",{class:"cell-expires",role:"cell",textContent:u(e.fmt?.humanTime(o?.anonymizeDate))},null,8,b0),n("div",w0,[n("div",k0,[t[83]||(t[83]=n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})])],-1)),n("div",E0,[n("a",{class:"dropdown-item",href:e.safeUrl("/anonymize/"+o?.repoId)},[...t[72]||(t[72]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit",-1)])],8,C0),n("a",{class:"dropdown-item",href:e.safeUrl("/r/"+o?.repoId+"/")},[...t[73]||(t[73]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View repo",-1)])],8,_0),o?.options?.page&&o?.status=="ready"?(l(),d("a",{key:0,class:"dropdown-item",target:"_self",href:e.safeUrl("/w/"+o?.repoId+"/")},[...t[74]||(t[74]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-globe"})],-1),y(" View page",-1)])],8,S0)):p("v-if",!0),n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.fetchGithubInfo(o),["prevent"])},[...t[75]||(t[75]=[n("i",{class:"fab fa-github"},null,-1),y(" Live GitHub info",-1)])],8,N0),t[81]||(t[81]=n("div",{class:"dropdown-divider"},null,-1)),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.updateRepository(o),["prevent"])},[...t[76]||(t[76]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Force update",-1)])],8,D0),[[G,o?.status=="ready"||o?.status=="error"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.updateRepository(o),["prevent"])},[...t[77]||(t[77]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-check-circle"})],-1),y(" Enable",-1)])],8,R0),[[G,o?.status=="removed"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.showStatusMessage(o),["prevent"])},[...t[78]||(t[78]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1),y(" View status message",-1)])],8,T0),[[G,o?.statusMessage]]),t[82]||(t[82]=n("div",{class:"dropdown-divider"},null,-1)),n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.removeCache(o),["prevent"])},[...t[79]||(t[79]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-broom"})],-1),y(" Remove cache",-1)])],8,A0),N(n("a",{class:"dropdown-item text-danger",href:"#",onClick:ue(a=>e.removeRepository(o),["prevent"])},[...t[80]||(t[80]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Remove",-1)])],8,O0),[[G,o?.status=="ready"]])])])])],2))),256)),e.filteredRepositories?.length==0?(l(),d("div",P0,[...t[84]||(t[84]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1),n("span",null,"No repositories match the current filters.",-1)])])):p("v-if",!0)])])}var I0={class:"container paper-page admin-page"},V0={class:"admin-summary"},q0={class:"summary-total"},M0=["aria-pressed"],$0={class:"count"},L0=["aria-pressed"],U0={class:"count"},F0=["aria-pressed"],B0={class:"count"},z0={key:0,class:"alert alert-danger",style:{margin:"8px 0"}},H0={class:"w-100 admin-filter-toolbar","aria-label":"Users","accept-charset":"UTF-8"},j0={class:"admin-filter-row"},G0={class:"search-wrap"},W0={type:"search",class:"form-control","aria-label":"Search users",placeholder:"Search username or email\u2026",autocomplete:"off"},K0={key:0,class:"admin-search-hint"},Y0={class:"admin-filter-inline"},Q0={class:"form-control form-control-sm"},J0={class:"admin-filter-inline","aria-label":"Pagination"},X0=["disabled"],Z0={style:{"font-family":"var(--font-mono)","font-size":"12px",color:"var(--ink-muted)"}},x0=["disabled"],eE={key:0,class:"admin-filter-row"},tE={class:"admin-active-chips"},nE={class:"key"},oE=["onClick"],sE={key:1,class:"bulk-bar"},iE={class:"paper-table w-100",role:"table","aria-label":"Users",style:{"--cols":"28px minmax(280px, 2.4fr) 100px 140px 140px 52px"}},rE={class:"paper-table-head admin-users-row",role:"row"},aE={role:"columnheader",style:{width:"28px"}},lE=["checked"],dE={role:"columnheader"},uE={role:"columnheader"},cE={role:"cell",style:{width:"28px"}},pE={type:"checkbox","aria-label":"Select user"},fE={class:"cell-anon",role:"cell"},hE=["src"],mE={class:"anon-text"},vE=["textContent","href"],gE={class:"anon-sub"},yE={key:0},bE=["href"],wE={key:1},kE={class:"cell-views num",role:"cell"},EE=["textContent","href"],CE={class:"cell-status",role:"cell"},_E=["textContent"],SE={class:"cell-status",role:"cell"},NE={key:0,class:"type-badge type-repo"},DE={key:1,class:"empty-dash"},RE={class:"cell-actions",role:"cell"},TE={class:"dropdown"},AE={class:"dropdown-menu dropdown-menu-right"},OE=["href"],PE=["href"],IE=["onClick"],VE=["onClick"],qE={key:0,class:"paper-table-empty"},ME={class:"admin-toolbar",style:{"justify-content":"space-between","border-bottom":"none"}},$E={style:{"font-size":"12px",color:"var(--ink-muted)"}},LE={key:0,class:"pagination-compact"},UE=["disabled"],FE=["max"],BE=["disabled"],zE={class:"admin-filter-inline"},HE={class:"form-control form-control-sm"};function bl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",I0,[t[46]||(t[46]=pe('
Admin \xA0/\xA0 Users

Users

',3)),n("div",V0,[n("span",q0,u(e.total>=0?e.fmt.number(e.total):"\u2026"),1),n("button",{type:"button",class:A(["summary-pill ok",{active:e.query?.status=="active"}]),onClick:t[0]||(t[0]=o=>{e.query.status=e.query.status=="active"?"":"active",e.query.page=1}),"aria-pressed":e.query?.status=="active"},[t[13]||(t[13]=y("Active ",-1)),n("span",$0,u(e.fmt?.number(e.statusCountFor("active"))),1)],10,M0),n("button",{type:"button",class:A(["summary-pill error",{active:e.query?.status=="banned"}]),onClick:t[1]||(t[1]=o=>{e.query.status=e.query.status=="banned"?"":"banned",e.query.page=1}),"aria-pressed":e.query?.status=="banned"},[t[14]||(t[14]=y("Banned ",-1)),n("span",U0,u(e.fmt?.number(e.statusCountFor("banned"))),1)],10,L0),n("button",{type:"button",class:A(["summary-pill",{active:e.query?.status=="removed"}]),onClick:t[2]||(t[2]=o=>{e.query.status=e.query.status=="removed"?"":"removed",e.query.page=1}),"aria-pressed":e.query?.status=="removed"},[t[15]||(t[15]=y("Removed ",-1)),n("span",B0,u(e.fmt?.number(e.statusCountFor("removed"))),1)],10,F0)]),e.fetchError?(l(),d("div",z0,[t[16]||(t[16]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),y(" "+u(e.fetchError),1)])):p("v-if",!0),N((l(),d("form",H0,[n("div",j0,[n("div",G0,[N(n("input",W0,null,512),[[s,{state:e.viewState,set:o=>{e.query.search=o},value:e.query?.search,form:null,options:{}}]]),e.query?.search?p("v-if",!0):(l(),d("span",K0,"/"))]),n("span",Y0,[t[18]||(t[18]=n("label",null,"Role",-1)),N((l(),d("select",Q0,[...t[17]||(t[17]=[n("option",{value:""},"Any",-1),n("option",{value:"admin"},"Admin",-1)])])),[[s,{state:e.viewState,set:o=>{e.query.role=o},value:e.query?.role,form:null,options:{}}]])]),t[22]||(t[22]=n("span",{class:"admin-filter-spacer"},null,-1)),n("button",{class:"btn btn-sm",type:"button",onClick:t[3]||(t[3]=o=>e.exportCsv())},[...t[19]||(t[19]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-export"})],-1),y(" Export",-1)])]),n("span",J0,[n("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[4]||(t[4]=o=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1,"aria-label":"Previous page"},[...t[20]||(t[20]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-left"})],-1)])],8,X0),n("span",Z0,u(e.query?.page)+"/"+u(e.totalPage||1),1),n("button",{class:"btn btn-sm btn-icon",type:"button",onClick:t[5]||(t[5]=o=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage,"aria-label":"Next page"},[...t[21]||(t[21]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-right"})],-1)])],8,x0)])]),e.chips?.length?(l(),d("div",eE,[n("div",tE,[(l(!0),d(W,null,Z(e.chips,(o,r)=>(l(),d("span",{class:"admin-active-chip",key:o?.key},[n("span",nE,u(o?.label),1),n("span",null,u(o?.value),1),n("button",{type:"button",onClick:a=>e.clearFilter(o.key),"aria-label":"Clear filter"},[...t[23]||(t[23]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])],8,oE)]))),128))])])):p("v-if",!0)])),[[i,e.viewState]]),e.selectedCount()>0?(l(),d("div",sE,[n("span",null,[n("strong",null,u(e.selectedCount()),1),t[24]||(t[24]=y(" selected",-1))]),n("button",{class:"btn btn-sm text-danger",type:"button",onClick:t[6]||(t[6]=o=>e.bulkBan())},[...t[25]||(t[25]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-ban"})],-1),y(" Ban",-1)])]),n("button",{class:"btn btn-sm",type:"button",onClick:t[7]||(t[7]=o=>{e.selected={},e.allSelected=!1})},"Clear")])):p("v-if",!0),n("div",iE,[n("div",rE,[n("div",aE,[n("input",{type:"checkbox","aria-label":"Select all on page",onClick:t[8]||(t[8]=o=>e.selectAllOnPage()),checked:e.allSelected},null,8,lE)]),n("div",dE,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="username"}]),onClick:t[9]||(t[9]=o=>e.sortBy("username"))},[t[27]||(t[27]=y("User ",-1)),e.sortIcon("username")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("username")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[26]||(t[26]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[30]||(t[30]=n("div",{role:"columnheader",class:"num"},"Repos",-1)),n("div",uE,[n("button",{type:"button",class:A(["sortable",{active:e.query?.sort=="status"}]),onClick:t[10]||(t[10]=o=>e.sortBy("status"))},[t[29]||(t[29]=y("Status ",-1)),e.sortIcon("status")?(l(),d("svg",{key:0,class:A(["ui-icon sort-direction",{ascending:e.sortIcon("status")==="fa-arrow-up"}]),"aria-hidden":"true"},[...t[28]||(t[28]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)]),t[31]||(t[31]=n("div",{role:"columnheader"},"Role",-1)),t[32]||(t[32]=n("div",{role:"columnheader","aria-label":"Actions"},null,-1))]),(l(!0),d(W,null,Z(e.filteredUsers,(o,r)=>(l(),d("div",{class:A(["paper-table-row admin-users-row",{"row-selected":e.selected[o?.username]}]),role:"row"},[n("div",cE,[N(n("input",pE,null,512),[[s,{state:e.viewState,set:a=>{e.selected[o.username]=a},value:e.selected[o?.username],form:null,options:{}}]])]),n("div",fE,[o?.photo?(l(),d("img",{key:0,width:"28",height:"28",class:"rounded-circle",style:{"flex-shrink":"0"},src:e.safeUrl(o?.photo)},null,8,hE)):p("v-if",!0),n("div",mE,[n("a",{class:"repo-name",textContent:u(o?.username),href:e.safeUrl("/admin/users/"+o?.username)},null,8,vE),n("div",gE,[o?.emails?.[0]?.email?(l(),d("span",yE,u(o?.emails?.[0]?.email)+" \xB7 ",1)):p("v-if",!0),n("a",{target:"_blank",href:e.safeUrl("https://github.com/"+o?.username)},[t[33]||(t[33]=n("i",{class:"fab fa-github"},null,-1)),y(" "+u(o?.username),1)],8,bE),o?.dateOfEntry?(l(),d("span",wE,"\xA0\xB7\xA0Joined "+u(e.fmt?.humanTime(o?.dateOfEntry)),1)):p("v-if",!0)])])]),n("div",kE,[t[34]||(t[34]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1)),n("a",{title:"Show this user's repositories",textContent:u(e.fmt?.number(o?.repoCount||0)),href:e.safeUrl("/admin/repositories?owner="+o?.username)},null,8,EE)]),n("div",CE,[n("span",{class:A(["status-dot",{"status-ready":o?.status=="active","status-removed":o?.status=="removed"||o?.status=="banned"}])},null,2),n("span",{textContent:u(e.fmt?.title(o?.status))},null,8,_E)]),n("div",SE,[o?.isAdmin?(l(),d("span",NE,"Admin")):p("v-if",!0),o?.isAdmin?p("v-if",!0):(l(),d("span",DE,"\u2014"))]),n("div",RE,[n("div",TE,[t[40]||(t[40]=n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})])],-1)),n("div",AE,[n("a",{class:"dropdown-item",href:e.safeUrl("/admin/users/"+o?.username)},[...t[35]||(t[35]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View details",-1)])],8,OE),n("a",{class:"dropdown-item",href:e.safeUrl("/admin/repositories?owner="+o?.username)},[...t[36]||(t[36]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1),y(" View repositories",-1)])],8,PE),t[39]||(t[39]=n("div",{class:"dropdown-divider"},null,-1)),N(n("a",{class:"dropdown-item text-danger",href:"#",onClick:ue(a=>e.banUser(o),["prevent"])},[...t[37]||(t[37]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-ban"})],-1),y(" Ban",-1)])],8,IE),[[G,o?.status=="active"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.activateUser(o),["prevent"])},[...t[38]||(t[38]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-check-circle"})],-1),y(" Activate",-1)])],8,VE),[[G,o?.status=="removed"||o?.status=="banned"]])])])])],2))),256)),e.filteredUsers?.length==0?(l(),d("div",qE,[...t[41]||(t[41]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1),n("span",null,"No users match the current filters.",-1)])])):p("v-if",!0)]),n("div",ME,[n("span",$E,u(e.fmt?.number(e.total))+" results",1),e.totalPage>1?(l(),d("div",LE,[n("button",{class:"btn btn-sm",onClick:t[11]||(t[11]=o=>e.query.page=Math.max(1,e.query.page-1)),disabled:e.query?.page<=1},[...t[42]||(t[42]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-left"})],-1),y(" Previous",-1)])],8,UE),N(n("input",{type:"number",class:"form-control form-control-sm",min:"1",style:{width:"56px"},max:e.totalPage},null,8,FE),[[s,{state:e.viewState,set:o=>{e.query.page=o},value:e.query?.page,form:null,options:{}}]]),n("span",null,"of "+u(e.totalPage),1),n("button",{class:"btn btn-sm",onClick:t[12]||(t[12]=o=>e.query.page=Math.min(e.totalPage,e.query.page+1)),disabled:e.query?.page>=e.totalPage},[...t[43]||(t[43]=[y("Next ",-1),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-chevron-right"})],-1)])],8,BE)])):p("v-if",!0),n("span",zE,[t[45]||(t[45]=n("label",null,"Per page",-1)),N((l(),d("select",HE,[...t[44]||(t[44]=[n("option",{value:"10"},"10",-1),n("option",{value:"25"},"25",-1),n("option",{value:"50"},"50",-1),n("option",{value:"100"},"100",-1)])])),[[s,{state:e.viewState,set:o=>{e.query.limit=o},value:e.query?.limit,form:null,options:{}}]])])])])}var jE={class:"anonymize-landing"},GE={class:"anonymize-landing-inner"},WE={class:"form-group mt-4 mb-2"},KE={class:"source-url-label-row"},YE={key:0,class:"repo-access","aria-label":"GitHub access"},QE={key:0,class:"repo-access-switch",role:"group","aria-label":"Repository connection"},JE=["aria-pressed","disabled"],XE=["aria-pressed","disabled"],ZE={key:1,class:"connection-badge"},xE={id:"sourceUrl-landing",type:"text",class:"form-control form-control-lg",placeholder:"https://github.com/owner/repository"},eC={key:0,class:"draft-status",role:"status"},tC={key:1,class:"text-danger",role:"alert"},nC={key:2,class:"repo-access-details","aria-label":"GitHub access"},oC={class:"repo-access-main"},sC={class:"repo-access-controls"},iC={key:1,class:"connection-link",href:"/connections"},rC={class:"anonymize-workspace"},aC={class:"anonymize-topbar"},lC={class:"anonymize-topbar-inner"},dC={class:"anonymize-topbar-head"},uC={class:"paper-page-title anonymize-topbar-title"},cC={key:0},pC={key:1},fC={key:0,class:"alert alert-info",role:"status"},hC={key:1,class:"alert alert-info",role:"status"},mC={key:1},vC={class:"anonymize-mobile-tabs",role:"tablist","aria-label":"Anonymization workspace"},gC=["aria-selected","tabindex"],yC=["aria-selected","tabindex"],bC={key:2,class:"anonymize-preview-empty",id:"workspace-preview",role:"status"},wC={class:"anonymize-split"},kC=["role","aria-labelledby"],EC={class:"form needs-validation paper-settings-main",name:"anonymize",novalidate:""},CC={class:"anonymize-fields"},_C={class:"paper-settings-section"},SC={class:"form-group"},NC={class:"source-url-label-row"},DC={key:0,class:"repo-access","aria-label":"GitHub access"},RC={key:0,class:"repo-access-switch",role:"group","aria-label":"Repository connection"},TC=["aria-pressed","disabled"],AC=["aria-pressed","disabled"],OC={key:1,class:"connection-badge"},PC=["disabled"],IC={class:"invalid-feedback"},VC={class:"invalid-feedback"},qC={class:"invalid-feedback"},MC={class:"invalid-feedback"},$C={key:0,class:"repo-access-details","aria-label":"GitHub access"},LC={class:"repo-access-main"},UC={class:"repo-access-controls"},FC={key:1,class:"connection-link",href:"/connections"},BC={key:1,class:"repo-access-details"},zC={key:0,role:"status"},HC={key:2,class:"form-grid-2"},jC={class:"form-group"},GC={class:"input-group"},WC={class:"form-control",id:"branch",name:"branch"},KC=["textContent","value"],YC={class:"input-group-append"},QC={class:"form-group"},JC=["disabled"],XC={class:"invalid-feedback"},ZC={class:"invalid-feedback"},xC={class:"form-check"},e2={class:"form-check-input",type:"checkbox",id:"update",name:"update"},t2={class:"paper-settings-section"},n2={class:"form-group"},o2=["disabled"],s2={class:"form-text text-muted"},i2={class:"invalid-feedback"},r2={class:"form-group"},a2=["disabled"],l2={class:"form-text text-muted"},d2={class:"invalid-feedback"},u2={class:"form-group"},c2=["disabled"],p2={class:"form-text text-muted"},f2={class:"invalid-feedback"},h2={class:"form-group"},m2={class:"redaction-syntax"},v2={class:"form-text text-muted"},g2={class:"warning-feedback"},y2={class:"invalid-feedback"},b2={class:"paper-settings-section"},w2={class:"form-check"},k2={class:"form-check-input",type:"checkbox",id:"link",name:"link"},E2={class:"form-check"},C2={class:"form-check-input",type:"checkbox",id:"image",name:"image"},_2={class:"form-check"},S2={class:"form-check-input",type:"checkbox",id:"pdf",name:"pdf"},N2={class:"form-check"},D2={class:"form-check-input",type:"checkbox",id:"notebook",name:"notebook"},R2={class:"form-check"},T2=["disabled"],A2={key:0,class:"form-text text-muted"},O2={key:1,class:"form-text text-muted"},P2={key:0,class:"form-text text-muted"},I2={class:"form-check"},V2={class:"form-check-input",type:"checkbox",id:"title-gist",name:"title-gist"},q2={class:"form-check"},M2={class:"form-check-input",type:"checkbox",id:"content-gist",name:"content-gist"},$2={class:"form-check"},L2={class:"form-check-input",type:"checkbox",id:"comments-gist",name:"comments-gist"},U2={class:"form-check"},F2={class:"form-check-input",type:"checkbox",id:"username-gist",name:"username-gist"},B2={class:"form-check"},z2={class:"form-check-input",type:"checkbox",id:"date-gist",name:"date-gist"},H2={class:"form-check"},j2={class:"form-check-input",type:"checkbox",id:"origin-gist",name:"origin-gist"},G2={class:"form-check"},W2={class:"form-check-input",type:"checkbox",id:"title",name:"title"},K2={class:"form-check"},Y2={class:"form-check-input",type:"checkbox",id:"body",name:"body"},Q2={class:"form-check"},J2={class:"form-check-input",type:"checkbox",id:"diff",name:"diff"},X2={class:"form-check"},Z2={class:"form-check-input",type:"checkbox",id:"comments",name:"comments"},x2={class:"form-check"},e_={class:"form-check-input",type:"checkbox",id:"username",name:"username"},t_={class:"form-check"},n_={class:"form-check-input",type:"checkbox",id:"date",name:"date"},o_={class:"form-check"},s_={class:"form-check-input",type:"checkbox",id:"origin",name:"origin"},i_={class:"paper-settings-section hosting-settings",id:"repository-hosting","aria-labelledby":"hosting-heading"},r_={key:0,class:"hosting-usage"},a_={key:0},l_={key:1},d_={key:2},u_={key:3},c_={class:"expiration-choices"},p_={class:"expiration-choice"},f_=["checked","disabled"],h_={key:0,class:"dated-options"},m_={key:0,class:"hosting-date"},v_=["min","max"],g_={class:"invalid-feedback"},y_={class:"invalid-feedback"},b_={class:"hosting-property"},w_={key:1,class:"expiration-choice"},k_=["checked","disabled"],E_={key:0},C_={key:1,class:"form-text text-muted"},__={class:"form-group conference-field"},S_={class:"form-text text-muted"},N_=["href"],D_={class:"invalid-feedback"},R_={class:"form-text text-muted"},T_={key:2,class:"inline-hosting"},A_={key:0,role:"alert",class:"text-danger"},O_={key:1,role:"alert",class:"text-danger"},P_=["disabled"],I_={key:2,role:"status"},V_={key:3,role:"status",class:"form-text text-muted"},q_={key:0,class:"capacity-reason"},M_={key:1,class:"subscription-choice"},$_={class:"billing-cycle"},L_=["value","checked","onChange"],U_={class:"hosting-terms"},F_={key:2,role:"status"},B_={key:3,class:"capacity-options"},z_=["disabled"],H_={key:5,class:"hosting-terms"},j_={key:6,class:"repository-pass"},G_=["disabled"],W_={class:"paper-settings-section"},K_={class:"form-group"},Y_={style:{position:"relative"}},Q_={type:"text",id:"coauthorSearch",class:"form-control",placeholder:"Search GitHub username\u2026",autocomplete:"off"},J_={class:"dropdown-menu show",style:{display:"block","max-height":"220px","overflow-y":"auto",width:"100%"}},X_=["onClick"],Z_=["src"],x_=["textContent"],eS=["textContent"],tS={class:"coauthor-list"},nS={class:"coauthor-row d-flex align-items-center",style:{padding:"6px 0",gap:"8px"}},oS=["src"],sS=["textContent","href"],iS=["onClick"],rS={class:"form-text text-muted"},aS=["textContent"],lS={key:1,class:"draft-status",role:"status"},dS={key:2,class:"draft-status"},uS={class:"anonymize-submit-bar"},cS=["disabled"],pS=["disabled"],fS={key:2,class:"checkout-return-note"},hS=["disabled"],mS=["disabled"],vS=["disabled"],gS=["disabled"],yS=["role","aria-labelledby"],bS={class:"anonymize-preview-head"},wS={key:0,class:"anonymize-preview-status",role:"status"},kS={key:1,class:"anonymize-preview-status",role:"status"},ES={key:2,class:"anonymize-preview-status",role:"alert"},CS={key:3,class:"anonymize-preview-status"},_S=["innerHTML"],SS=["role","aria-labelledby"],NS={class:"anonymize-preview-head"},DS={key:0,class:"anonymize-preview-status",role:"status"},RS={key:1,class:"anonymize-preview-status",role:"status"},TS={key:2,class:"anonymize-preview-status",role:"alert"},AS={key:3,class:"anonymize-preview-body"},OS={class:"d-flex w-100 justify-content-between align-items-center flex-wrap"},PS={class:"pr-title mb-1"},IS={key:0},VS=["textContent"],qS={key:0},MS={key:1},$S={key:2},LS={class:"pr-comments mt-3"},US={class:"pr-comment"},FS={class:"pr-comment-head"},BS=["textContent"],zS={key:0,class:"pr-comment-date"},HS={key:3},jS={class:"pr-comments"},GS={class:"pr-comment"},WS={class:"pr-comment-head"},KS={key:0,class:"pr-comment-author"},YS=["textContent"],QS=["textContent"],JS={key:0,class:"pr-comment-body"},XS=["role","aria-labelledby"],ZS={class:"anonymize-preview-head"},xS={key:0,class:"anonymize-preview-status",role:"status"},eN={key:1,class:"anonymize-preview-status",role:"status"},tN={key:2,class:"anonymize-preview-status",role:"alert"},nN={key:3,class:"anonymize-preview-body"},oN={class:"d-flex w-100 justify-content-between align-items-center flex-wrap"},sN={class:"pr-title mb-1"},iN={key:0},rN=["textContent"],aN={key:0},lN={key:1,class:"pr-body shadow-sm p-3 mb-4 rounded",style:{background:"var(--paper-bg-alt)"}},dN={key:2,class:"paper-tabs",role:"tablist"},uN=["aria-selected","tabindex"],cN=["aria-selected","tabindex"],pN=["textContent"],fN={key:3,class:"anonymize-preview-status"},hN={class:"paper-tab-content"},mN={key:0,role:"tabpanel",id:"preview-pr-diff-panel","aria-labelledby":"preview-pr-diff-tab"},vN=["innerHTML"],gN={key:1,role:"tabpanel",id:"preview-pr-comments-panel","aria-labelledby":"preview-pr-comments-tab"},yN={class:"pr-comments"},bN={class:"pr-comment"},wN={class:"pr-comment-head"},kN={key:0,class:"pr-comment-author"},EN=["textContent"],CN=["textContent"],_N={key:0,class:"pr-comment-body"};function wl(e,t){let s=We("gist-file"),i=We("markdown"),o=ye("field"),r=ye("form");return l(),d("div",{class:A(["anonymize-page h-100",{"mobile-preview-active":e.mobilePane==="preview","preview-expanded":e.previewExpanded}])},[p(" ===== STATE 1: No URL \u2014 centered input ===== "),N(n("div",jE,[n("div",GE,[t[44]||(t[44]=n("div",{class:"paper-crumbs"},[y("My work \xA0/\xA0 "),n("span",{class:"here"},"New anonymization")],-1)),t[45]||(t[45]=n("h1",{class:"paper-page-title"},[y("New "),n("em",null,"anonymization")],-1)),t[46]||(t[46]=n("p",{class:"paper-page-lede"}," Paste a GitHub repository, pull-request, or gist URL. We\u2019ll fetch it, redact the terms you choose in text files, and give you a share link. Images and PDFs are served unchanged when enabled. Review them before sharing. ",-1)),n("div",WE,[n("div",KE,[t[40]||(t[40]=n("label",{class:"paper-field-label",for:"sourceUrl-landing"},"Source URL",-1)),!e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",YE,[!e.isUpdate&&e.detectedType!=="gist"?(l(),d("div",QE,[n("button",{type:"button","aria-pressed":e.githubConnection==="github-app",disabled:e.githubConnection==="github-app",onClick:t[0]||(t[0]=a=>e.chooseGitHubConnection("github-app"))},[...t[39]||(t[39]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1),y(),n("span",{class:"sr-only"},"Read-only ",-1),y("GitHub App",-1)])],8,JE),n("button",{type:"button","aria-pressed":e.githubConnection==="oauth",disabled:e.githubConnection==="oauth",onClick:t[1]||(t[1]=a=>e.chooseGitHubConnection("oauth"))},"Legacy OAuth",8,XE)])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"?(l(),d("span",ZE,u((e.detectedType==="gist"?e.githubConnections?.gistConnection==="github-app":e.githubConnection==="github-app")?"Read-only GitHub App":"Legacy OAuth"),1)):p("v-if",!0)])):p("v-if",!0)]),N(n("input",xE,null,512),[[o,{state:e.viewState,set:a=>{e.sourceUrl=a},value:e.sourceUrl,form:null,options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"},change:()=>{e.urlSelected()}}]])]),e.draftRestored?(l(),d("div",eC,[t[41]||(t[41]=y("Your unsaved draft was restored. ",-1)),n("button",{type:"button",class:"draft-discard",onClick:t[2]||(t[2]=a=>e.discardDraft())},"Discard draft")])):p("v-if",!0),e.sourceUrlError?(l(),d("p",tC,u(e.sourceUrlError),1)):p("v-if",!0),t[47]||(t[47]=n("small",{class:"form-text",style:{color:"var(--ink-muted)"}}," Repository, pull request (\u2026/pull/42) and gist (gist.github.com/\u2026) URLs are all accepted. ",-1)),!e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",nC,[n("div",oC,[n("div",sC,[e.detectedType!=="gist"&&e.githubConnection!=="oauth"?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[3]||(t[3]=a=>e.grantGitHubAccess())},[...t[42]||(t[42]=[y("Manage access ",-1),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-external-link"})],-1)])])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"||e.githubConnection==="oauth"?(l(),d("a",iC,u(e.isUpdate?"Change connection":"Manage connections")+" \u2192",1)):p("v-if",!0)])]),t[43]||(t[43]=n("div",{class:"repo-access-note"},[n("span",null,[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-info"})]),y(" Anonymized content is public, even from private repositories.")])],-1))])):p("v-if",!0)])],512),[[G,!e.workspaceOpen&&!e.isUpdate]]),p(" ===== STATE 2: URL provided \u2014 form (left) + preview (right) ===== "),N(n("div",rC,[n("header",aC,[n("div",lC,[n("div",dC,[n("h1",uC,[e.isUpdate?p("v-if",!0):(l(),d("span",cC,"New anonymization")),e.isUpdate?(l(),d("span",pC,"Edit anonymization")):p("v-if",!0)]),N(n("span",{class:A(["type-badge",{"type-repo":e.detectedType==="repo","type-pr":e.detectedType==="pr","type-gist":e.detectedType==="gist"}])},u(e.detectedType==="repo"?"Repo":e.detectedType==="pr"?"PR":"Gist"),3),[[G,e.detectedType]])])])]),e.detectedType==="gist"&&e.gistAppRequired?(l(),d("aside",fC,[t[48]||(t[48]=n("p",null,"Reconnect your GitHub account to read this gist. Your draft will be restored when you return.",-1)),n("button",{type:"button",class:"btn btn-ink",onClick:t[4]||(t[4]=a=>e.connectGistApp())},"Connect GitHub App to access gists")])):p("v-if",!0),e.detectedType==="gist"&&e.gistOAuthRequired?(l(),d("aside",hC,[t[49]||(t[49]=n("p",null,"Connect GitHub OAuth to access gists. Your account and existing anonymizations stay the same, and your draft will be restored when you return.",-1)),t[50]||(t[50]=n("p",null,"GitHub's legacy OAuth connection includes write access to private repositories.",-1)),e.githubConnections?.oauthEnabled?(l(),d("button",{key:0,type:"button",class:"btn btn-ink",onClick:t[5]||(t[5]=a=>e.connectGistOAuth())},"Connect GitHub OAuth to access gists")):(l(),d("p",mC,"GitHub OAuth is currently unavailable. Please try again later."))])):p("v-if",!0),n("nav",vC,[n("button",{id:"workspace-settings-tab",role:"tab",type:"button","aria-selected":e.mobilePane==="settings","aria-controls":"workspace-settings",tabindex:e.mobilePane==="settings"?0:-1,onKeydown:t[6]||(t[6]=a=>e.previewTabKeydown(a)),onClick:t[7]||(t[7]=a=>e.selectMobilePane("settings"))},"Settings",40,gC),n("button",{id:"workspace-preview-tab",role:"tab",type:"button","aria-selected":e.mobilePane==="preview","aria-controls":"workspace-preview",tabindex:e.mobilePane==="preview"?0:-1,onKeydown:t[8]||(t[8]=a=>e.previewTabKeydown(a)),onClick:t[9]||(t[9]=a=>e.selectMobilePane("preview"))},"Reviewer preview",40,yC)]),e.detectedType!=="repo"&&!e.details?(l(),d("div",bC,u(e.sourceLoading?"Loading source\u2026":"Choose an accessible source to see its preview."),1)):p("v-if",!0),n("div",wC,[p(" Form column (left) "),n("div",{id:"workspace-settings",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-settings-tab":null,class:"anonymize-form-col overflow-auto"},[N((l(),d("form",EC,[n("div",CC,[n("section",_C,[t[61]||(t[61]=n("h2",{class:"paper-section-eyebrow"},"Source & access",-1)),n("div",SC,[n("div",NC,[t[52]||(t[52]=n("label",{class:"paper-field-label",for:"sourceUrl"},"GitHub URL",-1)),e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",DC,[!e.isUpdate&&e.detectedType!=="gist"?(l(),d("div",RC,[n("button",{type:"button","aria-pressed":e.githubConnection==="github-app",disabled:e.githubConnection==="github-app",onClick:t[10]||(t[10]=a=>e.chooseGitHubConnection("github-app"))},[...t[51]||(t[51]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1),y(),n("span",{class:"sr-only"},"Read-only ",-1),y("GitHub App",-1)])],8,TC),n("button",{type:"button","aria-pressed":e.githubConnection==="oauth",disabled:e.githubConnection==="oauth",onClick:t[11]||(t[11]=a=>e.chooseGitHubConnection("oauth"))},"Legacy OAuth",8,AC)])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"?(l(),d("span",OC,u((e.detectedType==="gist"?e.githubConnections?.gistConnection==="github-app":e.githubConnection==="github-app")?"Read-only GitHub App":"Legacy OAuth"),1)):p("v-if",!0)])):p("v-if",!0)]),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.anonymize?.sourceUrl?.invalid}]),name:"sourceUrl",id:"sourceUrl",disabled:e.isUpdate&&e.detectedType!=="repo",placeholder:"Paste a GitHub repo or pull request URL"},null,10,PC),[[o,{state:e.viewState,set:a=>{e.sourceUrl=a},value:e.sourceUrl,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"},change:()=>{e.urlSelected()}}]]),N(n("div",IC," Please provide a valid GitHub URL. ",512),[[G,e.anonymize?.sourceUrl?.errors?.github]]),N(n("div",VC," Not accessible. The organization may restrict access. ",512),[[G,e.anonymize?.sourceUrl?.errors?.access]]),N(n("div",qC," Does not exist or is not accessible. ",512),[[G,e.anonymize?.sourceUrl?.errors?.missing]]),N(n("div",MC," Already anonymized. ",512),[[G,e.anonymize?.sourceUrl?.errors?.used]])]),e.sourceUrl&&e.githubConnections?.appEnabled&&e.githubConnections.appConnected&&e.githubConnections.oauthConnected?(l(),d("aside",$C,[n("div",LC,[n("div",UC,[e.detectedType!=="gist"&&e.githubConnection!=="oauth"?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[12]||(t[12]=a=>e.grantGitHubAccess())},[...t[53]||(t[53]=[y("Manage access ",-1),n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-external-link"})],-1)])])):p("v-if",!0),e.isUpdate||e.detectedType==="gist"||e.githubConnection==="oauth"?(l(),d("a",FC,u(e.isUpdate?"Change connection":"Manage connections")+" \u2192",1)):p("v-if",!0)])]),t[54]||(t[54]=n("div",{class:"repo-access-note"},[n("span",null,[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-info"})]),y(" Anonymized content is public, even from private repositories.")])],-1))])):p("v-if",!0),e.isUpdate&&e.detectedType==="repo"&&e.role==="owner"&&e.sourceUrl==="https://github.com/"+e._originalFullName?(l(),d("aside",BC,[t[55]||(t[55]=n("p",null,"If you deleted and recreated this repository, reconnect it before choosing a branch.",-1)),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[13]||(t[13]=a=>e.reconnectSource())},"Reconnect source repository"),e.reconnectRepositoryId?(l(),d("p",zC,"Source reloaded. Review the branch, commit, and anonymization preview, then save to replace the published snapshot.")):p("v-if",!0)])):p("v-if",!0),e.detectedType==="repo"?(l(),d("div",HC,[n("div",jC,[t[57]||(t[57]=n("label",{class:"paper-field-label",for:"branch"},"Branch",-1)),n("div",GC,[N((l(),d("select",WC,[(l(!0),d(W,null,Z(e.branches,(a,c)=>(l(),d("option",{textContent:u(a?.name),value:a?.name},null,8,KC))),256))])),[[o,{state:e.viewState,set:a=>{e.source.branch=a},value:e.source?.branch,form:"anonymize",options:{}}]]),n("div",YC,[n("button",{class:"btn btn-icon refresh-branches",type:"button",title:"Refresh branches",onClick:t[14]||(t[14]=a=>e.getBranches(!0)),"aria-label":"Refresh branches"},[...t[56]||(t[56]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1)])])])])]),n("div",QC,[t[58]||(t[58]=n("label",{class:"paper-field-label",for:"commit"},"Commit",-1)),N(n("input",{class:A(["form-control",{"is-invalid":e.anonymize?.commit?.invalid}]),id:"commit",disabled:e.options.update,name:"commit",pattern:"[a-fA-Z0-9]{6,}",required:""},null,10,JC),[[o,{state:e.viewState,set:a=>{e.source.commit=a},value:e.source?.commit,form:"anonymize",options:{}}]]),N(n("div",XC," The commit SHA is not valid. ",512),[[G,e.anonymize?.commit?.errors?.pattern||e.anonymize?.commit?.errors?.required]]),N(n("div",ZC," This commit no longer exists in the repository. Click refresh to get the latest. ",512),[[G,e.anonymize?.commit?.errors?.exists]])])])):p("v-if",!0),N(n("div",xC,[N(n("input",e2,null,512),[[o,{state:e.viewState,set:a=>{e.options.update=a},value:e.options?.update,form:"anonymize",options:{}}]]),t[59]||(t[59]=n("label",{class:"form-check-label",for:"update"},"Auto-update from GitHub",-1)),t[60]||(t[60]=n("small",{class:"form-text text-muted"},"Follows the latest version, at most once an hour.",-1))],512),[[G,e.detectedType]])]),N(n("section",t2,[t[79]||(t[79]=n("h2",{class:"paper-section-eyebrow"},"Anonymization",-1)),N(n("div",n2,[t[62]||(t[62]=n("label",{class:"paper-field-label",for:"repoId"},"Anonymized repository ID",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.anonymize?.repoId?.invalid}]),name:"repoId",id:"repoId",disabled:e.isUpdate},null,10,o2),[[o,{state:e.viewState,set:a=>{e.repoId=a},value:e.repoId,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),n("small",s2,"anonymous.4open.science/r/"+u(e.repoId),1),N(n("div",i2,"ID can only contain letters and numbers.",512),[[G,e.anonymize?.repoId?.errors?.format]]),N(n("div",{class:"invalid-feedback"},u(e.repoId)+" is already used.",513),[[G,e.anonymize?.repoId?.errors?.used]])],512),[[G,e.detectedType==="repo"]]),N(n("div",r2,[t[65]||(t[65]=n("label",{class:"paper-field-label",for:"pullRequestId"},"Anonymized pull request ID",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.anonymize?.pullRequestId?.invalid}]),name:"pullRequestId",id:"pullRequestId",disabled:e.isUpdate},null,10,a2),[[o,{state:e.viewState,set:a=>{e.pullRequestId=a},value:e.pullRequestId,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),n("small",l2,[t[63]||(t[63]=y("Your share link will be ",-1)),n("code",null,"anonymous.4open.science/pr/"+u(e.pullRequestId),1),t[64]||(t[64]=y(".",-1))]),N(n("div",d2,"ID can only contain letters and numbers.",512),[[G,e.anonymize?.pullRequestId?.errors?.format]]),N(n("div",{class:"invalid-feedback"},u(e.pullRequestId)+" is already used.",513),[[G,e.anonymize?.pullRequestId?.errors?.used]])],512),[[G,e.detectedType==="pr"]]),N(n("div",u2,[t[68]||(t[68]=n("label",{class:"paper-field-label",for:"gistId"},"Anonymized gist ID",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.anonymize?.gistId?.invalid}]),name:"gistId",id:"gistId",disabled:e.isUpdate},null,10,c2),[[o,{state:e.viewState,set:a=>{e.gistId=a},value:e.gistId,form:"anonymize",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),n("small",p2,[t[66]||(t[66]=y("Your share link will be ",-1)),n("code",null,"anonymous.4open.science/gist/"+u(e.gistId),1),t[67]||(t[67]=y(".",-1))]),N(n("div",f2,"ID can only contain letters and numbers.",512),[[G,e.anonymize?.gistId?.errors?.format]]),N(n("div",{class:"invalid-feedback"},u(e.gistId)+" is already used.",513),[[G,e.anonymize?.gistId?.errors?.used]])],512),[[G,e.detectedType==="gist"]]),n("div",h2,[t[77]||(t[77]=n("label",{class:"paper-field-label",for:"terms"},"Terms to redact",-1)),N(n("textarea",{class:A(["form-control",{"is-invalid":e.anonymize?.terms?.invalid}]),id:"terms",name:"terms",rows:"3"},null,2),[[o,{state:e.viewState,set:a=>{e.terms=a},value:e.terms,form:"anonymize",options:{debounce:250}}]]),t[78]||(t[78]=n("small",{class:"form-text text-muted"},"One term per line.",-1)),n("details",m2,[t[75]||(t[75]=n("summary",null,"Regex & replacement syntax",-1)),t[76]||(t[76]=y()),n("small",v2,[t[69]||(t[69]=y("Regex is supported. Replaced by ",-1)),n("code",null,u(e.site_options?.ANONYMIZATION_MASK)+"-[N]",1),t[70]||(t[70]=y(", or use ",-1)),t[71]||(t[71]=n("code",null,"term=>replacement",-1)),t[72]||(t[72]=y(" to pick your own (e.g. ",-1)),t[73]||(t[73]=n("code",null,"Anonymous=>ABC",-1)),t[74]||(t[74]=y(").",-1))])]),N(n("div",g2,"Regex characters detected. Escape them if unintentional.",512),[[G,e.termsRegexWarning]]),N(n("div",y2,"Terms are in an invalid format.",512),[[G,e.anonymize?.terms?.errors?.format]])])],512),[[G,e.detectedType]]),N(n("section",b2,[t[99]||(t[99]=n("h2",{class:"paper-section-eyebrow"},"Display",-1)),N(n("div",null,[n("div",w2,[N(n("input",k2,null,512),[[o,{state:e.viewState,set:a=>{e.options.link=a},value:e.options?.link,form:"anonymize",options:{}}]]),t[80]||(t[80]=n("label",{class:"form-check-label",for:"link"},"Keep links",-1))]),n("div",E2,[N(n("input",C2,null,512),[[o,{state:e.viewState,set:a=>{e.options.image=a},value:e.options?.image,form:"anonymize",options:{}}]]),t[81]||(t[81]=n("label",{class:"form-check-label",for:"image"},"Display images",-1))]),n("div",_2,[N(n("input",S2,null,512),[[o,{state:e.viewState,set:a=>{e.options.pdf=a},value:e.options?.pdf,form:"anonymize",options:{}}]]),t[82]||(t[82]=n("label",{class:"form-check-label",for:"pdf"},"Display PDFs",-1))]),n("div",N2,[N(n("input",D2,null,512),[[o,{state:e.viewState,set:a=>{e.options.notebook=a},value:e.options?.notebook,form:"anonymize",options:{}}]]),t[83]||(t[83]=n("label",{class:"form-check-label",for:"notebook"},"Display Notebooks",-1))]),n("div",R2,[N(n("input",{class:"form-check-input",type:"checkbox",id:"page",name:"page",disabled:!e.details?.hasPage||e.details?.pageSource&&e.details?.pageSource?.branch!==e.source?.branch},null,8,T2),[[o,{state:e.viewState,set:a=>{e.options.page=a},value:e.options?.page,form:"anonymize",options:{}}]]),t[84]||(t[84]=n("label",{class:"form-check-label",for:"page"},"GitHub Pages",-1)),e.details?.hasPage?p("v-if",!0):(l(),d("small",A2,u(e.fmt?.translate("WARNINGS.page_not_enabled_on_repo")),1)),e.details?.hasPage&&e.details?.pageSource?.branch&&e.source?.branch&&e.details.pageSource.branch!==e.source.branch?(l(),d("small",O2,u(e.fmt?.translate("WARNINGS.page_branch_mismatch",{pageBranch:e.details?.pageSource?.branch,selectedBranch:e.source?.branch})),1)):p("v-if",!0)])],512),[[G,e.detectedType==="repo"]]),e.detectedType==="repo"&&(e.options.image||e.options.pdf)?(l(),d("p",P2,[...t[85]||(t[85]=[y("Images and PDFs are served unchanged. Review their contents and metadata before sharing. ",-1),n("a",{href:"/faq#formats"},"Supported formats",-1)])])):p("v-if",!0),N(n("div",null,[n("div",I2,[N(n("input",V2,null,512),[[o,{state:e.viewState,set:a=>{e.options.title=a},value:e.options?.title,form:"anonymize",options:{}}]]),t[86]||(t[86]=n("label",{class:"form-check-label",for:"title-gist"},"Gist description",-1))]),n("div",q2,[N(n("input",M2,null,512),[[o,{state:e.viewState,set:a=>{e.options.content=a},value:e.options?.content,form:"anonymize",options:{}}]]),t[87]||(t[87]=n("label",{class:"form-check-label",for:"content-gist"},"File contents",-1))]),n("div",$2,[N(n("input",L2,null,512),[[o,{state:e.viewState,set:a=>{e.options.comments=a},value:e.options?.comments,form:"anonymize",options:{}}]]),t[88]||(t[88]=n("label",{class:"form-check-label",for:"comments-gist"},"Comments",-1))]),n("div",U2,[N(n("input",F2,null,512),[[o,{state:e.viewState,set:a=>{e.options.username=a},value:e.options?.username,form:"anonymize",options:{}}]]),t[89]||(t[89]=n("label",{class:"form-check-label",for:"username-gist"},"Usernames",-1))]),n("div",B2,[N(n("input",z2,null,512),[[o,{state:e.viewState,set:a=>{e.options.date=a},value:e.options?.date,form:"anonymize",options:{}}]]),t[90]||(t[90]=n("label",{class:"form-check-label",for:"date-gist"},"Dates",-1))]),n("div",H2,[N(n("input",j2,null,512),[[o,{state:e.viewState,set:a=>{e.options.origin=a},value:e.options?.origin,form:"anonymize",options:{}}]]),t[91]||(t[91]=n("label",{class:"form-check-label",for:"origin-gist"},"Source gist ID",-1))])],512),[[G,e.detectedType==="gist"]]),N(n("div",null,[n("div",G2,[N(n("input",W2,null,512),[[o,{state:e.viewState,set:a=>{e.options.title=a},value:e.options?.title,form:"anonymize",options:{}}]]),t[92]||(t[92]=n("label",{class:"form-check-label",for:"title"},"PR title",-1))]),n("div",K2,[N(n("input",Y2,null,512),[[o,{state:e.viewState,set:a=>{e.options.body=a},value:e.options?.body,form:"anonymize",options:{}}]]),t[93]||(t[93]=n("label",{class:"form-check-label",for:"body"},"PR body",-1))]),n("div",Q2,[N(n("input",J2,null,512),[[o,{state:e.viewState,set:a=>{e.options.diff=a},value:e.options?.diff,form:"anonymize",options:{}}]]),t[94]||(t[94]=n("label",{class:"form-check-label",for:"diff"},"Diff",-1))]),n("div",X2,[N(n("input",Z2,null,512),[[o,{state:e.viewState,set:a=>{e.options.comments=a},value:e.options?.comments,form:"anonymize",options:{}}]]),t[95]||(t[95]=n("label",{class:"form-check-label",for:"comments"},"Comments",-1))]),n("div",x2,[N(n("input",e_,null,512),[[o,{state:e.viewState,set:a=>{e.options.username=a},value:e.options?.username,form:"anonymize",options:{}}]]),t[96]||(t[96]=n("label",{class:"form-check-label",for:"username"},"Usernames",-1))]),n("div",t_,[N(n("input",n_,null,512),[[o,{state:e.viewState,set:a=>{e.options.date=a},value:e.options?.date,form:"anonymize",options:{}}]]),t[97]||(t[97]=n("label",{class:"form-check-label",for:"date"},"Dates",-1))]),n("div",o_,[N(n("input",s_,null,512),[[o,{state:e.viewState,set:a=>{e.options.origin=a},value:e.options?.origin,form:"anonymize",options:{}}]]),t[98]||(t[98]=n("label",{class:"form-check-label",for:"origin"},"Project name",-1))])],512),[[G,e.detectedType==="pr"]])],512),[[G,e.detectedType]]),N(n("section",i_,[t[115]||(t[115]=n("h2",{class:"paper-section-eyebrow",id:"hosting-heading"},"Hosting & expiration",-1)),e.detectedType==="repo"&&e.billing?.enabled?(l(),d("p",r_,[e.isUpdate&&e.role!=="owner"?(l(),d("span",a_,"Uses the owner's hosting")):e.hasAuthorHosting()?(l(),d("span",l_,"Your author subscription is active.")):e.conference?(l(),d("span",d_,"Conference hosting is checked on submission.")):e.hostingQuota?.repository?(l(),d("span",u_,u(e.hostingQuota.repository.used)+" of "+u(e.hostingQuota.repository.total)+" active repositories \xB7 Free",1)):p("v-if",!0)])):p("v-if",!0),n("fieldset",c_,[t[105]||(t[105]=n("legend",{class:"sr-only"},"Expiration",-1)),n("label",p_,[n("input",{type:"radio",name:"expiration-choice",checked:e.options.expirationMode!=="never",onChange:t[15]||(t[15]=a=>e.useDatedHosting()),disabled:e.billingPending},null,40,f_),t[100]||(t[100]=n("span",null,"Expire on a date",-1))]),e.options.expirationMode!=="never"?(l(),d("div",h_,[e.options?.expirationMode!=="never"?(l(),d("div",m_,[t[101]||(t[101]=n("label",{class:"paper-field-label",for:"expirationDate"},"Expires",-1)),N(n("input",{class:A(["form-control",{"is-invalid":e.anonymize?.expirationDate?.invalid}]),type:"date",name:"expirationDate",id:"expirationDate",required:"",min:e.minExpirationDate,max:e.maxExpirationDate},null,10,v_),[[o,{state:e.viewState,set:a=>{e.options.expirationDate=a},value:e.options?.expirationDate,form:"anonymize",options:{}}]]),N(n("div",g_,"Pick a date in the future.",512),[[G,e.anonymize?.expirationDate?.errors?.min]]),N(n("div",{class:"invalid-feedback"},"Pick a date on or before "+u(e.fmt?.date(e.maxExpirationDate))+".",513),[[G,e.anonymize?.expirationDate?.errors?.max]]),N(n("div",y_,"Enter a valid expiration date.",512),[[G,e.anonymize?.expirationDate?.errors?.required||e.anonymize?.expirationDate?.errors?.date]])])):p("v-if",!0),n("div",b_,[t[103]||(t[103]=n("label",{for:"expiration"},"Then",-1)),N(n("select",{id:"expiration",class:"form-control","onUpdate:modelValue":t[16]||(t[16]=a=>e.options.expirationMode=a)},[...t[102]||(t[102]=[n("option",{value:"remove"},"Remove content",-1),n("option",{value:"redirect"},"Redirect to GitHub",-1)])],512),[[Jo,e.options.expirationMode]])])])):p("v-if",!0),e.detectedType==="repo"?(l(),d("label",w_,[n("input",{type:"radio",name:"expiration-choice",checked:e.options.expirationMode==="never",onChange:t[17]||(t[17]=a=>e.options.expirationMode="never"),disabled:e.billingPending},null,40,k_),n("span",null,[t[104]||(t[104]=y("Never expire",-1)),e.options.expirationMode!=="never"||e.hasAuthorHosting()?(l(),d("small",E_,u(e.hasAuthorHosting()?"Included in your subscription":"Author subscription"),1)):p("v-if",!0)])])):p("v-if",!0)]),e.options.expirationMode==="redirect"?(l(),d("p",C_,"Visitors will be redirected to the original GitHub source on this date, revealing its identity.")):p("v-if",!0),n("div",__,[t[106]||(t[106]=n("label",{class:"paper-field-label",for:"conference"},[y("Conference code "),n("span",{class:"paper-optional"},"(optional)")],-1)),N(n("input",{class:A(["form-control",{"is-invalid":e.anonymize?.conference?.invalid}]),id:"conference",name:"conference"},null,2),[[o,{state:e.viewState,set:a=>{e.conference=a},value:e.conference,form:"anonymize",options:{debounce:{default:800,blur:0},updateOn:"default blur"}}]]),N(n("small",S_,[n("a",{target:"_blank",href:e.safeUrl(e.conference_data?.url)},u(e.conference_data?.name),9,N_),y(" expires "+u(e.fmt?.date(e.conference_data?.endDate))+". ",1)],512),[[G,e.conference_data]]),N(n("div",D_,"The conference is not activated.",512),[[G,e.anonymize?.conference?.errors?.activated]]),N(n("small",R_,"Link to a conference to apply its shared defaults.",512),[[G,!e.conference_data]])]),e.detectedType==="repo"&&e.billing?.enabled?(l(),d("div",T_,[e.taskValidationError?(l(),d("p",A_,u(e.taskValidationError),1)):p("v-if",!0),e.billingError?(l(),d("p",O_,[y(u(e.billingError)+" ",1),n("button",{type:"button",class:"task-text-button",onClick:t[18]||(t[18]=a=>e.loadBilling()),disabled:e.billingBusy},"Reload billing",8,P_)])):p("v-if",!0),e.billingPending?(l(),d("div",I_,[...t[107]||(t[107]=[n("p",null,[n("strong",null,"Confirming your payment\u2026")],-1),n("p",{class:"form-text text-muted"},"Your draft is saved. Please do not pay again.",-1)])])):e.billingNotice?(l(),d("p",V_,u(e.billingNotice),1)):p("v-if",!0),e.hostingNeedsPayment()&&!e.billingPending?(l(),d(W,{key:4},[e.options.expirationMode!=="never"?(l(),d("p",q_,u(e.options.update&&!e.hostingQuotaBlocked&&e.hostingQuota?.repository?.used(l(),d("label",{class:A(["cycle-option",{selected:e.selectedHostingPlan()?.id===a.id}]),key:a.id},[n("input",{type:"radio",name:"hosting-plan",value:a.id,checked:e.selectedHostingPlan()?.id===a.id,onChange:c=>e.hostingPlan=a.id},null,40,L_),n("span",null,u(e.billingPrice(a)),1)],2))),128))]),n("p",null,u(e.selectedHostingPlan()?.repositories)+" repositories, "+u(e.billingBytes(e.selectedHostingPlan()?.storage))+". Coauthors included.",1),n("p",U_,"Renews "+u(e.selectedHostingPlan()?.interval==="year"?"annually":"monthly")+" until cancelled. Tax shown at checkout.",1),t[110]||(t[110]=n("p",{class:"hosting-terms"},"If paid access ends, never-expiring repositories expire after 90 days.",-1))])):(l(),d("p",F_,"New purchases are temporarily unavailable. Your draft is kept.")),e.options.expirationMode!=="never"?(l(),d("details",B_,[t[111]||(t[111]=n("summary",null,"Keep using free hosting",-1)),t[112]||(t[112]=n("p",null,"Remove a repository you no longer need, or use conference hosting. Removing a repository affects its review link.",-1)),t[113]||(t[113]=n("a",{href:"/dashboard"},"Review my repositories",-1)),n("button",{type:"button",class:"task-text-button",onClick:t[19]||(t[19]=a=>e.anonymizeRepo(a)),disabled:e.sourceLoading||e.billingBusy},"Recheck capacity and submit",8,z_)])):p("v-if",!0)],64)):e.options.expirationMode==="never"&&!e.billingPending?(l(),d("p",H_,"No scheduled expiration while subscribed. A 90-day grace period applies if paid access ends.")):p("v-if",!0),e.isUpdate&&e.role==="owner"&&!e.hasAuthorHosting()?(l(),d("details",j_,[t[114]||(t[114]=n("summary",null,"Hosting just this repository?",-1)),(l(!0),d(W,null,Z((e.billing?.plans||[]).filter(a=>a.id==="author_pass"),a=>(l(),d("div",{key:a.id},[n("p",null,u(e.billingPrice(a))+" \xB7 "+u(e.billingBytes(a.storage))+" for 180 days. No renewal. Does not include Never expire.",1),n("button",{type:"button",class:"btn btn-outline-ink",disabled:e.billingBusy||e.hostingSaving||e.sourceLoading||e.billing.checkoutEnabled===!1||e.billingPending,onClick:t[20]||(t[20]=c=>e.checkoutRepository(!0))},"Review repository pass",8,G_)]))),128))])):p("v-if",!0)])):p("v-if",!0)],512),[[G,e.detectedType]]),N(n("section",W_,[t[119]||(t[119]=n("h2",{class:"paper-section-eyebrow"},"Coauthors",-1)),t[120]||(t[120]=n("p",{class:"form-text text-muted",style:{"margin-bottom":"8px"}}," Co-authors can view and edit these settings. They cannot delete the anonymization or manage co-authors. ",-1)),N(n("div",K_,[t[116]||(t[116]=n("label",{class:"paper-field-label",for:"coauthorSearch"},"Add a GitHub user",-1)),n("div",Y_,[N(n("input",Q_,null,512),[[o,{state:e.viewState,set:a=>{e.coauthorSearch=a},value:e.coauthorSearch,form:"anonymize",options:{debounce:300},change:()=>{e.searchCoauthors()}}]]),N(n("div",J_,[(l(!0),d(W,null,Z(e.coauthorResults,(a,c)=>(l(),d("a",{href:"#",class:"dropdown-item d-flex align-items-center",onClick:ue(f=>e.addCoauthor(a,f),["prevent"])},[n("img",{alt:"",style:{width:"22px",height:"22px","border-radius":"50%","margin-right":"8px"},src:e.safeUrl(a?.photo)},null,8,Z_),n("span",{textContent:u(a?.username)},null,8,x_)],8,X_))),256))],512),[[G,e.coauthorResults?.length>0]])]),N(n("small",{class:"form-text text-muted",textContent:u(e.coauthorError)},null,8,eS),[[G,e.coauthorError]])],512),[[G,e.role==="owner"||e.role==="admin"]]),n("div",tS,[(l(!0),d(W,null,Z(e.coauthors,(a,c)=>(l(),d("div",nS,[a?.photo?(l(),d("img",{key:0,alt:"",style:{width:"24px",height:"24px","border-radius":"50%"},src:e.safeUrl(a?.photo)},null,8,oS)):p("v-if",!0),n("a",{target:"_blank",textContent:u(a?.username),href:e.safeUrl("https://github.com/"+a?.username)},null,8,sS),t[118]||(t[118]=n("span",{class:"type-badge type-coauthor"},"Co-author",-1)),N(n("button",{type:"button",class:"btn btn-sm btn-icon",style:{"margin-left":"auto"},title:"Remove co-author",onClick:f=>e.removeCoauthor(a),"aria-label":"Remove co-author"},[...t[117]||(t[117]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])],8,iS),[[G,e.role==="owner"||e.role==="admin"]])]))),256)),N(n("div",rS," No co-authors yet. ",512),[[G,!e.coauthors||e.coauthors?.length===0]])])],512),[[G,e.isUpdate&&e.detectedType==="repo"]]),e.error?(l(),d("div",{key:0,class:"alert alert-danger",role:"alert",textContent:u(e.error)},null,8,aS)):p("v-if",!0),e.draftRestored?(l(),d("div",lS,[t[121]||(t[121]=y("Your unsaved draft was restored. ",-1)),n("button",{type:"button",class:"draft-discard",onClick:t[21]||(t[21]=a=>e.discardDraft())},"Discard draft")])):e.unsavedChanges?(l(),d("div",dS,[y(u(e.draftSaved?"Draft saved in this tab for 30 minutes.":"Unsaved changes. Keep this tab open until you save.")+" ",1),n("button",{type:"button",class:"draft-discard",onClick:t[22]||(t[22]=a=>e.discardDraft())},u(e.isUpdate?"Restore saved settings":"Discard changes"),1)])):p("v-if",!0)]),N(n("div",uS,[e.detectedType==="repo"?(l(),d(W,{key:0},[e.billingPending?(l(),d("button",{key:0,type:"button",class:"btn btn-ink",onClick:t[23]||(t[23]=a=>e.refreshBilling()),disabled:e.billingBusy},"Check payment status",8,cS)):(l(),d("button",{key:1,type:"submit",class:"btn btn-ink",disabled:e.sourceLoading||e.billingBusy||e.hostingSaving||e.billingLoading||e.hostingNeedsPayment()&&(!e.authorPlans().length||e.billing?.checkoutEnabled===!1),onClick:t[24]||(t[24]=ue(a=>e.submitForm(a,()=>{e.submitRepository(a)}),["prevent"]))},u(e.hostingSaving?"Saving draft\u2026":e.hostingNeedsPayment()?"Continue to checkout":e.isUpdate?"Save changes":"Create anonymous link"),9,pS)),e.hostingNeedsPayment()&&!e.billingPending?(l(),d("p",fS,"Review payment in Stripe, then return to finish.")):p("v-if",!0)],64)):p("v-if",!0),e.detectedType==="pr"&&!e.isUpdate?(l(),d("button",{key:1,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[25]||(t[25]=ue(a=>e.submitForm(a,()=>{e.anonymizePullRequest(a)}),["prevent"]))},[...t[122]||(t[122]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1),y(" Anonymize Pull Request ",-1)])],8,hS)):p("v-if",!0),e.detectedType==="pr"&&e.isUpdate?(l(),d("button",{key:2,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[26]||(t[26]=ue(a=>e.submitForm(a,()=>{e.anonymizePullRequest(a)}),["prevent"]))},[...t[123]||(t[123]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-save"})],-1),y(" Update Pull Request ",-1)])],8,mS)):p("v-if",!0),e.detectedType==="gist"&&!e.isUpdate?(l(),d("button",{key:3,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[27]||(t[27]=ue(a=>e.submitForm(a,()=>{e.anonymizeGist(a)}),["prevent"]))},[...t[124]||(t[124]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1),y(" Anonymize Gist ",-1)])],8,vS)):p("v-if",!0),e.detectedType==="gist"&&e.isUpdate?(l(),d("button",{key:4,type:"submit",disabled:e.sourceLoading,class:"btn btn-ink",onClick:t[28]||(t[28]=ue(a=>e.submitForm(a,()=>{e.anonymizeGist(a)}),["prevent"]))},[...t[125]||(t[125]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-save"})],-1),y(" Update Gist ",-1)])],8,gS)):p("v-if",!0)],512),[[G,e.detectedType]])])),[[r,e.viewState]])],8,kC),p(" Preview column (right) "),e.detectedType==="repo"?(l(),d("div",{key:0,id:"workspace-preview",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-preview-tab":null,class:"anonymize-preview-col"},[n("div",bS,[t[126]||(t[126]=n("strong",null,"README.md",-1)),n("button",{type:"button",class:"task-text-button preview-expand",onClick:t[29]||(t[29]=a=>e.previewExpanded=!e.previewExpanded)},u(e.previewExpanded?"Restore split view":"Expand preview"),1)]),e.sourceLoading&&e.previewStatus==="idle"?(l(),d("div",wS,"Loading source\u2026")):p("v-if",!0),e.previewStatus==="loading"?(l(),d("div",kS,"Updating the anonymized preview\u2026")):p("v-if",!0),e.previewStatus==="error"?(l(),d("div",ES,[t[127]||(t[127]=n("p",null,"Unable to generate the anonymized preview. The latest redactions have not been verified.",-1)),n("button",{class:"btn btn-outline-ink",type:"button",onClick:t[30]||(t[30]=a=>e.retryPreview())},"Retry preview")])):p("v-if",!0),!e.sourceLoading&&!e.readme&&e.previewStatus==="idle"?(l(),d("div",CS,"No README is available to preview. Review the published files before sharing.")):p("v-if",!0),e.previewStatus==="ready"?(l(),d("div",{key:4,class:"anonymize-preview-body markdown-body body",innerHTML:e.sanitize(e.html_readme)},null,8,_S)):p("v-if",!0)],8,yS)):p("v-if",!0),e.detectedType==="gist"&&e.details?(l(),d("div",{key:1,id:"workspace-preview",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-preview-tab":null,class:"anonymize-preview-col"},[n("div",NS,[t[128]||(t[128]=n("strong",null,"Gist preview",-1)),n("button",{type:"button",class:"task-text-button preview-expand",onClick:t[31]||(t[31]=a=>e.previewExpanded=!e.previewExpanded)},u(e.previewExpanded?"Restore split view":"Expand preview"),1)]),e.sourceLoading&&e.previewStatus==="idle"?(l(),d("div",DS,"Loading source\u2026")):p("v-if",!0),e.previewStatus==="loading"?(l(),d("div",RS,"Updating the anonymized preview\u2026")):p("v-if",!0),e.previewStatus==="error"?(l(),d("div",TS,[t[129]||(t[129]=n("p",null,"Unable to generate the anonymized preview. The latest redactions have not been verified.",-1)),n("button",{class:"btn btn-outline-ink",type:"button",onClick:t[32]||(t[32]=a=>e.retryPreview())},"Retry preview")])):p("v-if",!0),e.previewStatus==="ready"?(l(),d("div",AS,[n("div",OS,[n("h2",PS,[e.options?.title?(l(),d("span",IS,u(e.anonymizeGistContent(e.details?.gist?.description)||"Untitled gist"),1)):p("v-if",!0),n("span",{class:A(["badge",{"badge-success":e.details?.gist?.isPublic,"badge-secondary":!e.details?.gist?.isPublic}])},u(e.details?.gist?.isPublic?"public":"secret"),3)]),e.options?.date?(l(),d("small",{key:0,textContent:u(e.fmt?.date(e.details?.gist?.updatedDate))},null,8,VS)):p("v-if",!0)]),e.options?.origin?(l(),d("small",qS,"Gist ID: "+u(e.details?.source?.gistId),1)):p("v-if",!0),e.options?.username&&e.details?.gist?.ownerLogin?(l(),d("small",MS,"By @"+u(e.anonymizeGistContent(e.details?.gist?.ownerLogin)),1)):p("v-if",!0),e.options?.content&&e.previewGistFiles?.length?(l(),d("div",$S,[n("ul",LS,[(l(!0),d(W,null,Z(e.previewGistFiles,(a,c)=>(l(),d("li",US,[n("div",FS,[n("strong",{textContent:u(a?.filename)},null,8,BS),a?.language?(l(),d("span",zS,u(a?.language),1)):p("v-if",!0)]),_e(s,{file:a,terms:e.terms,options:e.options},null,8,["file","terms","options"])]))),256))])])):p("v-if",!0),e.options?.comments&&e.details?.gist?.comments&&e.details?.gist?.comments?.length?(l(),d("div",HS,[t[132]||(t[132]=n("h3",{class:"paper-section-eyebrow mt-3"},"Comments",-1)),n("ul",jS,[(l(!0),d(W,null,Z(e.details?.gist?.comments,(a,c)=>(l(),d("li",GS,[n("div",WS,[e.options?.username?(l(),d("span",KS,[t[130]||(t[130]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user"})],-1)),t[131]||(t[131]=y(" @",-1)),n("span",{textContent:u(e.anonymizeGistContent(a?.author))},null,8,YS)])):p("v-if",!0),e.options?.date?(l(),d("span",{key:1,class:"pr-comment-date",textContent:u(e.fmt?.date(a?.updatedDate))},null,8,QS)):p("v-if",!0)]),e.options?.body?(l(),d("div",JS,[_e(i,{content:e.anonymizeGistContent(a?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0)]))),256))])])):p("v-if",!0)])):p("v-if",!0)],8,SS)):p("v-if",!0),e.detectedType==="pr"&&e.details?(l(),d("div",{key:2,id:"workspace-preview",role:e.mobileWorkspace?"tabpanel":null,"aria-labelledby":e.mobileWorkspace?"workspace-preview-tab":null,class:"anonymize-preview-col"},[n("div",ZS,[t[133]||(t[133]=n("strong",null,"Pull request preview",-1)),n("button",{type:"button",class:"task-text-button preview-expand",onClick:t[33]||(t[33]=a=>e.previewExpanded=!e.previewExpanded)},u(e.previewExpanded?"Restore split view":"Expand preview"),1)]),e.sourceLoading&&e.previewStatus==="idle"?(l(),d("div",xS,"Loading source\u2026")):p("v-if",!0),e.previewStatus==="loading"?(l(),d("div",eN,"Updating the anonymized preview\u2026")):p("v-if",!0),e.previewStatus==="error"?(l(),d("div",tN,[t[134]||(t[134]=n("p",null,"Unable to generate the anonymized preview. The latest redactions have not been verified.",-1)),n("button",{class:"btn btn-outline-ink",type:"button",onClick:t[34]||(t[34]=a=>e.retryPreview())},"Retry preview")])):p("v-if",!0),e.previewStatus==="ready"?(l(),d("div",nN,[n("div",oN,[n("h2",sN,[e.options?.title?(l(),d("span",iN,u(e.anonymizePrContent(e.details?.pullRequest?.title)),1)):p("v-if",!0),n("span",{class:A(["badge",{"badge-success":e.details?.pullRequest?.merged,"badge-warning":e.details?.pullRequest?.state=="open","badge-danger":e.details?.pullRequest?.state=="closed"&&!e.details?.pullRequest?.merged}])},u(e.fmt?.title(e.details?.pullRequest?.merged?"merged":e.details?.pullRequest?.state)),3)]),e.options?.date?(l(),d("small",{key:0,textContent:u(e.fmt?.date(e.details?.pullRequest?.updatedDate))},null,8,rN)):p("v-if",!0)]),e.options?.origin?(l(),d("small",aN,"Pull Request on "+u(e.details?.pullRequest?.baseRepositoryFullName),1)):p("v-if",!0),e.options?.body?(l(),d("div",lN,[_e(i,{content:e.anonymizePrContent(e.details?.pullRequest?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0),e.options?.diff||e.options?.comments?(l(),d("nav",dN,[e.options?.diff?(l(),d("button",{key:0,class:A(["paper-tab",{active:e.prTabState?.active=="diff"}]),type:"button",role:"tab",id:"preview-pr-diff-tab","aria-selected":e.prTabState?.active==="diff","aria-controls":"preview-pr-diff-panel",tabindex:e.prTabState?.active==="diff"?0:-1,onKeydown:t[35]||(t[35]=a=>e.previewTabKeydown(a)),onClick:t[36]||(t[36]=a=>e.prTabState.active="diff")},[...t[135]||(t[135]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-code"})],-1),y(" Diff ",-1)])],42,uN)):p("v-if",!0),e.options?.comments?(l(),d("button",{key:1,class:A(["paper-tab",{active:e.prTabState?.active=="comments"}]),type:"button",role:"tab",id:"preview-pr-comments-tab","aria-selected":e.prTabState?.active==="comments","aria-controls":"preview-pr-comments-panel",tabindex:e.prTabState?.active==="comments"?0:-1,onKeydown:t[37]||(t[37]=a=>e.previewTabKeydown(a)),onClick:t[38]||(t[38]=a=>e.prTabState.active="comments")},[t[136]||(t[136]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-comment"})],-1)),n("span",{textContent:u(e.fmt.plural(e.details?.pullRequest?.comments?.length,{0:"No comments",one:"1 comment",other:"{} comments"}))},null,8,pN)],42,cN)):p("v-if",!0)])):p("v-if",!0),!e.options?.diff&&!e.options?.comments?(l(),d("div",fN,"Diff and comments are hidden by your display settings.")):p("v-if",!0),n("div",hN,[e.options?.diff&&e.prTabState?.active=="diff"?(l(),d("div",mN,[n("div",{class:"pr-diff",innerHTML:e.sanitize(e.fmt?.diff(e.anonymizePrContent(e.details?.pullRequest?.diff)))},null,8,vN)])):p("v-if",!0),e.options?.comments&&e.prTabState?.active=="comments"?(l(),d("div",gN,[n("ul",yN,[(l(!0),d(W,null,Z(e.details?.pullRequest?.comments,(a,c)=>(l(),d("li",bN,[n("div",wN,[e.options?.username?(l(),d("span",kN,[t[137]||(t[137]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user"})],-1)),t[138]||(t[138]=y(" @",-1)),n("span",{textContent:u(e.anonymizePrContent(a?.author))},null,8,EN)])):p("v-if",!0),e.options?.date?(l(),d("span",{key:1,class:"pr-comment-date",textContent:u(e.fmt?.date(a?.updatedDate))},null,8,CN)):p("v-if",!0)]),e.options?.body?(l(),d("div",_N,[_e(i,{content:e.anonymizePrContent(a?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0)]))),256))])])):p("v-if",!0)])])):p("v-if",!0)],8,XS)):p("v-if",!0)])],512),[[G,e.workspaceOpen||e.isUpdate]])],2)}var SN={class:"container-fluid h-100 anonymize-page"},NN={class:"row h-100 flex-column flex-md-row"},DN={class:"col-md sidePanel shadow overflow-auto anonymize-form-col"},RN={class:"form-group"},TN={class:"form-group"},AN={class:"form-check"},ON={class:"form-check-input",type:"checkbox",id:"update",name:"update"},PN={class:"form-group"},IN={class:"form-text text-muted"},VN=["href"],qN={class:"invalid-feedback"},MN={class:"form-text text-muted"},$N={class:"form-group"},LN={id:"idHelp",class:"form-text text-muted"},UN={class:"invalid-feedback"},FN={class:"form-group"},BN={class:"invalid-feedback"},zN={class:"form-group"},HN={class:"form-control",id:"expiration",name:"expiration"},jN={class:"form-group",id:"expiration-date-form"},GN={class:"form-control",type:"date",name:"expirationDate",id:"expirationDate"},WN={class:"accordion mb-3",id:"options"},KN={class:"card"},YN={id:"collapseOne",class:"collapse show","aria-labelledby":"headingOne","data-parent":"#options"},QN={class:"card-body"},JN={class:"form-group mb-0"},XN={class:"form-check"},ZN={class:"form-check-input",type:"checkbox",id:"link",name:"link"},xN={class:"form-check"},eD={class:"form-check-input",type:"checkbox",id:"image",name:"image"},tD={class:"form-check"},nD={class:"form-check-input",type:"checkbox",id:"date",name:"date"},oD={class:"form-check"},sD={class:"form-check-input",type:"checkbox",id:"username",name:"username"},iD={class:"form-check"},rD={class:"form-check-input",type:"checkbox",id:"comments",name:"comments"},aD={class:"form-check"},lD={class:"form-check-input",type:"checkbox",id:"diff",name:"diff"},dD={class:"form-check"},uD={class:"form-check-input",type:"checkbox",id:"origin",name:"origin"},cD={class:"form-check"},pD={class:"form-check-input",type:"checkbox",id:"title",name:"title"},fD={class:"form-check"},hD={class:"form-check-input",type:"checkbox",id:"body",name:"body"},mD=["textContent"],vD={class:"anonymize-submit-bar"},gD={key:0,class:"col-md-8 p-2 overflow-auto anonymize-preview-col"},yD={class:"d-flex w-100 justify-content-between align-items-center flex-wrap"},bD={class:"pr-title mb-1"},wD={key:0},kD=["textContent"],ED={key:0},CD={key:1,class:"pr-body shadow-sm p-3 mb-4 rounded",style:{background:"var(--sidebar-bg-color)"}},_D={class:"nav nav-tabs",id:"myTab",role:"tablist"},SD={key:0,class:"nav-item",role:"presentation"},ND={key:1,class:"nav-item",role:"presentation"},DD=["textContent"],RD={class:"tab-content",id:"pills-tabContent"},TD={class:"tab-pane show active",id:"pills-diff",role:"tabpanel","aria-labelledby":"pills-diff-tab"},AD={key:0,class:"pr-diff shadow-sm p-3 mb-4 rounded",style:{background:"var(--sidebar-bg-color)"}},OD={style:{"overflow-x":"auto"}},PD=["innerHTML"],ID={key:0,class:"pr-comments list-group"},VD={class:"pr-comment list-group-item"},qD={class:"d-flex w-100 justify-content-between flex-wrap"},MD={key:0,class:"mb-1"},$D=["textContent"],LD={class:"mb-1"};function kl(e,t){let s=We("markdown"),i=ye("field"),o=ye("form");return l(),d("div",SN,[n("div",NN,[n("div",DN,[n("div",{class:A(["p-0 py-2 m-auto",{card:!e.pullRequestUrl,container:e.pullRequestUrl}])},[N((l(),d("form",{class:A(["form needs-validation",{"card-body":!e.pullRequestUrl}]),name:"anonymizeForm",novalidate:""},[t[30]||(t[30]=pe('
Anonymize \xA0/\xA0 Pull request

Anonymize a pull request

Fill in the details \u2014 it only takes a minute.

Source
',4)),p(" pullRequestUrl "),n("div",RN,[t[2]||(t[2]=n("label",{for:"pullRequestUrl"},"URL of your pull request",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.anonymize?.pullRequestUrl?.invalid}]),name:"pullRequestUrl",id:"pullRequestUrl",placeholder:"https://github.com/owner/repo/pull/123"},null,2),[[i,{state:e.viewState,set:r=>{e.pullRequestUrl=r},value:e.pullRequestUrl,form:"anonymizeForm",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"},change:()=>{e.pullRequestSelected()}}]]),N(n("div",{class:"invalid-feedback"},u(e.pullRequestUrl)+" is not accessible. Some organizations are restricting the access to the repositories. ",513),[[G,e.anonymize?.pullRequestUrl?.errors?.access]]),N(n("div",{class:"invalid-feedback"},u(e.pullRequestUrl)+" does not exist or is not accessible ",513),[[G,e.anonymize?.pullRequestUrl?.errors?.missing]]),N(n("div",{class:"invalid-feedback"},u(e.pullRequestUrl)+" is already anonymized ",513),[[G,e.anonymize?.pullRequestUrl?.errors?.used]])]),N(n("div",null,[n("div",TN,[n("div",AN,[N(n("input",ON,null,512),[[i,{state:e.viewState,set:r=>{e.options.update=r},value:e.options?.update,form:"anonymizeForm",options:{}}]]),t[3]||(t[3]=n("label",{class:"form-check-label",for:"update"},"Auto update",-1)),t[4]||(t[4]=n("small",{id:"updateHelp",class:"form-text text-muted"},"Automatically update the anonymized pull request with the latest updates. The pull request is updated once per day maximum.",-1))])]),t[26]||(t[26]=n("div",{class:"paper-section-eyebrow anonymize-section-title"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-conference"})]),y(" Conference ID ")],-1)),p(" Conference "),n("div",PN,[t[5]||(t[5]=n("label",{for:"conference"},[y("Conference ID "),n("span",{class:"text-muted"},"(Optional)")],-1)),N(n("input",{class:A(["form-control",{"is-invalid":e.anonymize?.conference?.invalid}]),id:"conference",name:"conference"},null,2),[[i,{state:e.viewState,set:r=>{e.conference=r},value:e.conference,form:"anonymizeForm",options:{debounce:{default:800,blur:0},updateOn:"default blur"}}]]),N(n("small",IN,[n("a",{target:"_target",href:e.safeUrl(e.conference_data?.url)},u(e.conference_data?.name),9,VN),y(" will expire on "+u(e.fmt?.date(e.conference_data?.endDate))+".",1)],512),[[G,e.conference_data]]),N(n("div",qN," The conference is not activated. ",512),[[G,e.anonymize?.conference?.errors?.activated]]),N(n("small",MN," Use the Conference ID that your conference provided you. This will update automatically the anonymization options based on the conference preferences. ",512),[[G,!e.conference_data]])]),t[27]||(t[27]=n("div",{class:"paper-section-eyebrow anonymize-section-title"},[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})]),y(" Anonymization Options ")],-1)),p(" Pull Request ID "),n("div",$N,[t[6]||(t[6]=n("label",{for:"pullRequestId"},"Anonymized pull request id",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.anonymize?.pullRequestId?.invalid}]),name:"pullRequestId",id:"pullRequestId"},null,2),[[i,{state:e.viewState,set:r=>{e.pullRequestId=r},value:e.pullRequestId,form:"anonymizeForm",options:{debounce:{default:1e3,blur:0,click:0},updateOn:"default blur click"}}]]),n("small",LN,"Id used in the url: https://anonymous.4open.science/r/"+u(e.pullRequestId),1),N(n("div",UN," Repository id can only contain letters and numbers ",512),[[G,e.anonymize?.pullRequestId?.errors?.format]]),N(n("div",{class:"invalid-feedback"},u(e.pullRequestId)+" is already used ",513),[[G,e.anonymize?.pullRequestId?.errors?.used]])]),p(" Terms "),n("div",FN,[t[7]||(t[7]=n("label",{for:"terms"},"Terms to anonymize",-1)),N(n("textarea",{class:A(["form-control",{"is-invalid":e.anonymize?.terms?.invalid}]),id:"terms",name:"terms",rows:"3"},null,2),[[i,{state:e.viewState,set:r=>{e.terms=r},value:e.terms,form:"anonymizeForm",options:{debounce:250}}]]),t[8]||(t[8]=n("small",{id:"termsHelp",class:"form-text text-muted"},"One term per line. Each term will be replaced by XXX.",-1)),N(n("div",BN," Terms are in an invalid format ",512),[[G,e.anonymize?.terms?.errors?.format]])]),n("div",zN,[t[10]||(t[10]=n("label",{for:"expiration"},"Expiration strategy",-1)),N((l(),d("select",HN,[...t[9]||(t[9]=[n("option",{value:"never",selected:""},"Never expire",-1),n("option",{value:"redirect"}," Redirect to GitHub when expired ",-1),n("option",{value:"remove"},"Remove when expired",-1)])])),[[i,{state:e.viewState,set:r=>{e.options.expirationMode=r},value:e.options?.expirationMode,form:"anonymizeForm",options:{}}]]),t[11]||(t[11]=n("small",{class:"form-text text-muted"},"Define the expiration strategy for the anonymized repository.",-1))]),N(n("div",jN,[t[12]||(t[12]=n("label",{for:"expirationDate"},"Expiration date of the anonymized repository",-1)),N(n("input",GN,null,512),[[i,{state:e.viewState,set:r=>{e.options.expirationDate=r},value:e.options?.expirationDate,form:"anonymizeForm",options:{}}]]),N(n("small",{class:"form-text text-muted"},"After "+u(e.fmt?.date(e.options?.expirationDate))+", the repository will be removed and the visitor will not be able to see the content of the repository.",513),[[G,e.options?.expirationMode=="remove"]]),N(n("small",{class:"form-text text-muted"},"After "+u(e.fmt?.date(e.options?.expirationDate))+", the visitors of the anonymized repository will be redirected to "+u(e.pullRequestUrl)+".",513),[[G,e.options?.expirationMode=="redirect"]])],512),[[G,e.options?.expirationMode!="never"]]),n("div",WN,[n("div",KN,[t[25]||(t[25]=pe('

',1)),n("div",YN,[n("div",QN,[n("div",JN,[n("div",XN,[N(n("input",ZN,null,512),[[i,{state:e.viewState,set:r=>{e.options.link=r},value:e.options?.link,form:"anonymizeForm",options:{}}]]),t[13]||(t[13]=n("label",{class:"form-check-label",for:"link"},"Keep links",-1)),t[14]||(t[14]=n("small",{class:"form-text text-muted"},"Keep or remove all the links.",-1))]),n("div",xN,[N(n("input",eD,null,512),[[i,{state:e.viewState,set:r=>{e.options.image=r},value:e.options?.image,form:"anonymizeForm",options:{}}]]),t[15]||(t[15]=n("label",{class:"form-check-label",for:"image"},"Display images",-1)),t[16]||(t[16]=n("small",{class:"form-text text-muted"},"Images are not anonymized",-1))]),n("div",tD,[N(n("input",nD,null,512),[[i,{state:e.viewState,set:r=>{e.options.date=r},value:e.options?.date,form:"anonymizeForm",options:{}}]]),t[17]||(t[17]=n("label",{class:"form-check-label",for:"date"},"Display dates",-1)),t[18]||(t[18]=n("small",{class:"form-text text-muted"},"Display the date of the Pull Request and the date of the comments.",-1))]),n("div",oD,[N(n("input",sD,null,512),[[i,{state:e.viewState,set:r=>{e.options.username=r},value:e.options?.username,form:"anonymizeForm",options:{}}]]),t[19]||(t[19]=n("label",{class:"form-check-label",for:"username"},"Display username",-1))]),n("div",iD,[N(n("input",rD,null,512),[[i,{state:e.viewState,set:r=>{e.options.comments=r},value:e.options?.comments,form:"anonymizeForm",options:{}}]]),t[20]||(t[20]=n("label",{class:"form-check-label",for:"comments"},"Display comments",-1))]),n("div",aD,[N(n("input",lD,null,512),[[i,{state:e.viewState,set:r=>{e.options.diff=r},value:e.options?.diff,form:"anonymizeForm",options:{}}]]),t[21]||(t[21]=n("label",{class:"form-check-label",for:"diff"},"Display diff",-1))]),n("div",dD,[N(n("input",uD,null,512),[[i,{state:e.viewState,set:r=>{e.options.origin=r},value:e.options?.origin,form:"anonymizeForm",options:{}}]]),t[22]||(t[22]=n("label",{class:"form-check-label",for:"origin"},"Display the project name",-1))]),n("div",cD,[N(n("input",pD,null,512),[[i,{state:e.viewState,set:r=>{e.options.title=r},value:e.options?.title,form:"anonymizeForm",options:{}}]]),t[23]||(t[23]=n("label",{class:"form-check-label",for:"title"},"Display the PR title",-1))]),n("div",fD,[N(n("input",hD,null,512),[[i,{state:e.viewState,set:r=>{e.options.body=r},value:e.options?.body,form:"anonymizeForm",options:{}}]]),t[24]||(t[24]=n("label",{class:"form-check-label",for:"body"},"Display the PR body and comment bodies",-1))])])])])])])],512),[[G,e.pullRequestUrl]]),e.error?(l(),d("div",{key:0,class:"alert alert-danger",role:"alert",textContent:u(e.error)},null,8,mD)):p("v-if",!0),N(n("div",vD,[e.isUpdate?p("v-if",!0):(l(),d("button",{key:0,id:"submit",type:"submit",class:"btn btn-ink btn-block",onClick:t[0]||(t[0]=ue(r=>e.submitForm(r,()=>{e.anonymizePullRequest(r)}),["prevent"]))},[...t[28]||(t[28]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1),y(" Anonymize ",-1)])])),e.isUpdate?(l(),d("button",{key:1,id:"submit",type:"submit",class:"btn btn-ink btn-block",onClick:t[1]||(t[1]=ue(r=>e.submitForm(r,()=>{e.updatePullRequest(r)}),["prevent"]))},[...t[29]||(t[29]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-save"})],-1),y(" Update ",-1)])])):p("v-if",!0)],512),[[G,e.pullRequestUrl]])],2)),[[o,e.viewState]])],2)]),e.details?(l(),d("div",gD,[n("div",yD,[n("h2",bD,[e.options?.title?(l(),d("span",wD,u(e.anonymize(e.details?.pullRequest?.title)),1)):p("v-if",!0),n("span",{class:A(["badge",{"badge-success":e.details?.pullRequest?.merged,"badge-warning":e.details?.pullRequest?.state=="open","badge-danger":e.details?.pullRequest?.state=="closed"&&!e.details?.pullRequest?.merged}])},u(e.fmt?.title(e.details?.pullRequest?.merged?"merged":e.details?.pullRequest?.state)),3)]),e.options?.date?(l(),d("small",{key:0,textContent:u(e.fmt?.date(e.details?.pullRequest?.updatedDate))},null,8,kD)):p("v-if",!0)]),e.options?.origin?(l(),d("small",ED,"Pull Request on "+u(e.details?.pullRequest?.baseRepositoryFullName),1)):p("v-if",!0),e.options?.body?(l(),d("div",CD,[_e(s,{content:e.anonymize(e.details?.pullRequest?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])])):p("v-if",!0),n("ul",_D,[e.options?.diff?(l(),d("li",SD,[...t[31]||(t[31]=[n("button",{class:"nav-link active",id:"pills-diff-tab","data-toggle":"pill","data-target":"#pills-diff",type:"button",role:"tab","aria-controls":"pills-diff","aria-selected":"true"}," Diff ",-1)])])):p("v-if",!0),e.options?.comments?(l(),d("li",ND,[n("button",{class:A(["nav-link",{active:!e.options?.diff}]),id:"pills-comments-tab","data-toggle":"pill","data-target":"#pills-comments",type:"button",role:"tab","aria-controls":"pills-comments","aria-selected":"false"},[n("span",{textContent:u(e.fmt.plural(e.details?.pullRequest?.comments?.length,{0:"No comment",one:"One Comment",other:"{} Comments"}))},null,8,DD)],2)])):p("v-if",!0)]),n("div",RD,[n("div",TD,[e.options?.diff?(l(),d("div",AD,[n("pre",OD,[n("code",{innerHTML:e.sanitize(e.fmt?.diff(e.anonymize(e.details?.pullRequest?.diff)))},null,8,PD)])])):p("v-if",!0)]),n("div",{class:A(["tab-pane",{"show active":!e.options?.diff}]),id:"pills-comments",role:"tabpanel","aria-labelledby":"pills-comments-tab"},[e.options?.comments?(l(),d("ul",ID,[(l(!0),d(W,null,Z(e.details?.pullRequest?.comments,(r,a)=>(l(),d("li",VD,[n("div",qD,[e.options?.username?(l(),d("h5",MD," @"+u(e.anonymize(r?.author)),1)):p("v-if",!0),e.options?.date?(l(),d("small",{key:1,textContent:u(e.fmt?.date(r?.updatedDate))},null,8,$D)):p("v-if",!0)]),n("p",LD,[e.options?.body?(l(),$t(s,{key:0,class:"pr-comment-body",content:e.anonymize(r?.body),options:e.options,terms:e.terms},null,8,["content","options","terms"])):p("v-if",!0)])]))),256))])):p("v-if",!0)],2)])])):p("v-if",!0)])])}var UD={class:"container paper-page claim-page"},FD={class:"paper-settings-main claim-form"},BD={class:"form-group"},zD={class:"invalid-feedback"},HD={class:"form-group"};function El(e,t){let s=ye("field"),i=ye("form");return l(),d("div",UD,[t[6]||(t[6]=pe('
My work \xA0/\xA0 Claim

Claim an anonymization

Take ownership of an existing anonymized repository so it appears on your dashboard.

',3)),n("div",FD,[t[5]||(t[5]=n("p",{class:"paper-section-copy"},"Use this when an anonymization was created by a co-author or from another account. You must have access to the GitHub repository it was made from.",-1)),N((l(),d("form",{class:"form needs-validation",name:"claimForm",novalidate:"",onSubmit:t[0]||(t[0]=ue(o=>e.submitForm(o,()=>{e.claim()}),["prevent"]))},[n("div",BD,[t[1]||(t[1]=n("label",{class:"paper-field-label",for:"repoUrl"},"GitHub repository URL",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.claimForm?.repoUrl?.invalid&&(e.claimForm?.repoUrl?.touched||e.claimForm?.submitted)}]),name:"repoUrl",id:"repoUrl",required:""},null,2),[[s,{state:e.viewState,set:o=>{e.repoUrl=o},value:e.repoUrl,form:"claimForm",options:{}}]]),N(n("div",zD," No anonymization matches this repository and ID. Check both values and that you can access the repository on GitHub. ",512),[[G,e.claimForm?.repoUrl?.errors?.not_found]])]),n("div",HD,[t[2]||(t[2]=n("label",{class:"paper-field-label",for:"repoId"},"Anonymized repository ID",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.claimForm?.repoId?.invalid&&(e.claimForm?.repoId?.touched||e.claimForm?.submitted)}]),name:"repoId",id:"repoId",required:""},null,2),[[s,{state:e.viewState,set:o=>{e.repoId=o},value:e.repoId,form:"claimForm",options:{}}]]),t[3]||(t[3]=n("small",{id:"idHelp",class:"form-text text-muted"},[y("The ID is the last part of the anonymized URL: "),n("code",null,"anonymous.4open.science/r/"),y(".")],-1))]),t[4]||(t[4]=n("button",{id:"submit",type:"submit",class:"btn btn-ink"}," Claim anonymization ",-1))],32)),[[i,e.viewState]])])])}var jD={class:"container page paper-page conference-page"},GD={class:"paper-crumbs"},WD={class:"here"},KD={class:"d-flex align-items-end flex-wrap",style:{gap:"12px","justify-content":"space-between"}},YD=["textContent"],QD={key:0,class:"paper-page-lede"},JD=["textContent","href"],XD={class:"d-flex align-items-center flex-wrap",style:{gap:"10px"}},ZD=["textContent"],xD=["href"],eR={class:"paper-meta-rule"},tR=["textContent"],nR=["textContent"],oR={key:0},sR={key:0,class:"conference-payment-status",role:"status"},iR=["disabled"],rR={key:1,role:"alert"},aR={key:2,class:"paper-settings-section","aria-labelledby":"conference-payment-heading"},lR={key:0,role:"status"},dR={key:1,role:"alert"},uR=["disabled"],cR={class:"search-wrap"},pR={type:"search",id:"search",class:"form-control","aria-label":"Search repositories",placeholder:"Search by ID or source repository\u2026",autocomplete:"off"},fR={class:"dashboard-filter-controls"},hR={class:"dropdown"},mR={class:"btn dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},vR={class:"filter-btn-value"},gR={class:"dropdown-menu","aria-labelledby":"dropdownSort"},yR={class:"form-check dropdown-item"},bR={class:"form-check-input",type:"radio",name:"sort",id:"anonymizeDate",value:"-anonymizeDate"},wR={class:"form-check dropdown-item"},kR={class:"form-check-input",type:"radio",name:"sort",id:"sortID",value:"repoId"},ER={class:"form-check dropdown-item"},CR={class:"form-check-input",type:"radio",name:"sort",id:"sortStatus",value:"-status"},_R={class:"form-check dropdown-item"},SR={class:"form-check-input",type:"radio",name:"sort",id:"sortViews",value:"-pageView"},NR={class:"dropdown"},DR={class:"btn dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},RR={key:0,class:"filter-btn-value"},TR={key:1,class:"filter-btn-value"},AR={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},OR={class:"form-check dropdown-item"},PR=["id"],IR=["for"],VR={class:"dashboard-meta"},qR={class:"dashboard-count"},MR={key:0},$R={key:0},LR={key:1},UR={key:1},FR={key:0,class:"filter-chip"},BR=["onClick","aria-label"],zR={class:"paper-table paper-table-repos w-100",role:"table","aria-label":"Repositories"},HR={class:"cell-anon",role:"cell"},jR={class:"anon-text"},GR=["textContent","href"],WR={class:"anon-sub"},KR={class:"anon-source"},YR=["textContent","href"],QR={key:0},JR=["textContent","href"],XR={key:1},ZR=["href"],xR={class:"cell-status",role:"cell"},eT={class:"status-line"},tT=["textContent"],nT={key:0,class:"status-sub"},oT={class:"cell-views num",role:"cell"},sT=["textContent"],iT={class:"cell-expires",role:"cell"},rT={key:0,class:"expires-never"},aT=["textContent"],lT={key:2,class:"expires-past"},dT={key:0},uT={key:3,class:"empty-dash","aria-label":"Not applicable"},cT={class:"cell-actions",role:"cell"},pT={class:"dropdown"},fT=["aria-label"],hT={class:"dropdown-menu dropdown-menu-right"},mT=["href"],vT=["href"],gT={key:0,class:"paper-table-empty"},yT={key:0},bT={key:1},wT={key:2,class:"paper-table-empty-actions"};function Cl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",jD,[n("div",null,[n("div",GD,[t[4]||(t[4]=n("a",{href:"/dashboard"},"My work",-1)),t[5]||(t[5]=y(" \xA0/\xA0 ",-1)),t[6]||(t[6]=n("a",{href:"/conferences"},"Conferences",-1)),t[7]||(t[7]=y(" \xA0/\xA0 ",-1)),n("span",WD,u(e.conference?.conferenceID),1)]),n("div",KD,[n("div",null,[n("h1",{class:"paper-page-title",textContent:u(e.conference?.name)},null,8,YD),e.conference?.url?(l(),d("p",QD,[n("a",{target:"_blank",rel:"noopener",textContent:u(e.conference?.url),href:e.safeUrl(e.conference?.url)},null,8,JD)])):p("v-if",!0)]),n("div",XD,[n("span",{class:A(["status-pill",{"status-pill-ready":e.conference?.status=="ready","status-pill-removed":e.conference?.status=="removed"||e.conference?.status=="expired"}])},[n("span",{class:A(["status-dot","status-"+e.conference?.status]),"aria-hidden":"true"},null,2),n("span",{textContent:u(e.fmt?.statusLabel(e.conference?.status))},null,8,ZD)],2),n("a",{class:"btn btn-outline-ink",href:e.safeUrl("/conference/"+e.conference?.conferenceID+"/edit")},[...t[8]||(t[8]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit conference",-1)])],8,xD)])]),n("div",eR,[n("span",null,[t[9]||(t[9]=y("ID ",-1)),n("b",{class:"commit-hash",textContent:u(e.conference?.conferenceID)},null,8,tR)]),n("span",null,[t[10]||(t[10]=y("Review window ",-1)),n("b",null,u(e.fmt?.date(e.conference?.startDate,"mediumDate"))+" \u2013 "+u(e.fmt?.date(e.conference?.endDate,"mediumDate")),1)]),n("span",null,[t[11]||(t[11]=y("Repositories ",-1)),n("b",null,u(e.fmt?.number(e.conference?.repositories?.length)),1)]),n("span",null,[t[12]||(t[12]=y("Plan ",-1)),n("b",{textContent:u(e.conference?.plan?.name||e.conference?.plan?.planID||"Free")},null,8,nR)]),e.conference?.price?(l(),d("span",oR,[t[13]||(t[13]=y("Cost so far ",-1)),n("b",null,u(e.fmt?.number(e.conference?.price,2))+" \u20AC",1)])):p("v-if",!0)]),e.billingNotice?(l(),d("div",sR,[n("p",null,u(e.billingNotice),1),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[0]||(t[0]=o=>e.refreshBilling()),disabled:e.billingBusy},"Check payment status",8,iR)])):p("v-if",!0),e.billingError&&e.conference?.status!=="pending_payment"?(l(),d("p",rR,u(e.billingError),1)):p("v-if",!0),e.conference?.status==="pending_payment"?(l(),d("section",aR,[t[14]||(t[14]=n("h2",{id:"conference-payment-heading"},"Activate your review package",-1)),t[15]||(t[15]=n("p",null,"This conference is waiting for payment. Authors can join after payment is confirmed. Checkout returns to this conference. Authors within the package do not pay separately.",-1)),e.billingLoading?(l(),d("p",lR,"Loading payment options\u2026")):p("v-if",!0),e.billingError?(l(),d("p",dR,u(e.billingError),1)):p("v-if",!0),(l(!0),d(W,null,Z((e.billing?.plans||[]).filter(o=>o.id==="conference"),o=>(l(),d("div",{key:o.id},[n("p",null,u(e.billingPrice(o))+" for up to "+u(o.repositories)+" repositories and "+u(e.billingBytes(o.storage))+" of source files during the review window. Taxes, if applicable, appear at checkout.",1),n("button",{type:"button",class:"btn btn-primary",onClick:t[1]||(t[1]=r=>e.checkout("conference",e.conference.conferenceID)),disabled:e.billingBusy||e.billingPending||e.billing?.checkoutEnabled===!1},u(e.billingBusy?"Please wait\u2026":"Pay for review package"),9,uR)]))),128)),t[16]||(t[16]=n("p",null,[n("a",{href:"/profile#settings-billing"},"Manage invoices")],-1))])):p("v-if",!0),t[37]||(t[37]=n("div",{class:"paper-section-eyebrow"},"Repositories",-1)),N((l(),d("form",{class:"w-100 dashboard-filter-row","aria-label":"Filter repositories","accept-charset":"UTF-8",onSubmit:t[2]||(t[2]=ue(o=>e.submitForm(o,()=>{o.preventDefault()}),["prevent"]))},[n("div",cR,[N(n("input",pR,null,512),[[s,{state:e.viewState,set:o=>{e.search=o},value:e.search,form:null,options:{}}]])]),n("div",fR,[n("div",hR,[n("button",mR,[t[17]||(t[17]=n("span",{class:"filter-btn-label"},"Sort",-1)),n("span",vR,u({"-anonymizeDate":"Anonymize date",repoId:"ID","-status":"Status","-pageView":"Views"}[e.orderBy]||"Custom"),1)]),n("div",gR,[t[22]||(t[22]=n("h6",{class:"dropdown-header"},"Order by",-1)),n("div",yR,[N(n("input",bR,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[18]||(t[18]=n("label",{class:"form-check-label",for:"anonymizeDate"},"Anonymize date",-1))]),n("div",wR,[N(n("input",kR,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[19]||(t[19]=n("label",{class:"form-check-label",for:"sortID"},"ID",-1))]),n("div",ER,[N(n("input",CR,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[20]||(t[20]=n("label",{class:"form-check-label",for:"sortStatus"},"Status",-1))]),n("div",_R,[N(n("input",SR,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[21]||(t[21]=n("label",{class:"form-check-label",for:"sortViews"},"Views",-1))])])]),n("div",NR,[n("button",DR,[t[23]||(t[23]=n("span",{class:"filter-btn-label"},"Status",-1)),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?(l(),d("span",RR,"All")):p("v-if",!0),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?p("v-if",!0):(l(),d("span",TR,u((e.filters?.status?.ready?0:1)+(e.filters?.status?.expired?0:1)+(e.filters?.status?.removed?0:1))+" hidden ",1))]),n("div",AR,[t[24]||(t[24]=n("h6",{class:"dropdown-header"},"Show statuses",-1)),(l(!0),d(W,null,Z(e.statusLabels,(o,r,a)=>(l(),d("div",OR,[N(n("input",{class:"form-check-input",type:"checkbox",id:"status-"+r},null,8,PR),[[s,{state:e.viewState,set:c=>{e.filters.status[r]=c},value:e.filters?.status[r],form:null,options:{}}]]),n("label",{class:"form-check-label",for:"status-"+r},u(o),9,IR)]))),256))])])])],32)),[[i,e.viewState]]),n("div",VR,[n("span",qR,[e.filteredRepositories?.length===e.conference?.repositories?.length?(l(),d("span",MR,[y(u(e.fmt?.number(e.conference?.repositories?.length))+" repositor",1),e.conference?.repositories?.length===1?(l(),d("span",$R,"y")):p("v-if",!0),e.conference?.repositories?.length!==1?(l(),d("span",LR,"ies")):p("v-if",!0)])):p("v-if",!0),e.filteredRepositories?.length!==e.conference?.repositories?.length?(l(),d("span",UR,u(e.fmt?.number(e.filteredRepositories?.length))+" of "+u(e.fmt?.number(e.conference?.repositories?.length))+" shown",1)):p("v-if",!0)]),(l(!0),d(W,null,Z(e.filters?.status,(o,r,a)=>(l(),d(W,null,[o===!1?(l(),d("span",FR,[y(" Hiding "+u(e.statusLabels[r])+" ",1),n("button",{type:"button",class:"filter-chip-close",onClick:c=>{e.filters.status[r]=!0},"aria-label":"Show "+e.statusLabels[r]+" again"},"\xD7",8,BR)])):p("v-if",!0)],64))),256))]),n("div",zR,[t[36]||(t[36]=n("div",{class:"paper-table-head",role:"row"},[n("div",{role:"columnheader"},"Repository"),n("div",{role:"columnheader"},"Status"),n("div",{role:"columnheader",class:"num"},"Views"),n("div",{role:"columnheader"},"Expires"),n("div",{role:"columnheader"},[n("span",{class:"sr-only"},"Actions")])],-1)),(l(!0),d(W,null,Z(e.filteredRepositories,(o,r)=>(l(),d("div",{class:A(["paper-table-row",{"repo-inactive":o?.status=="expired"||o?.status=="removed","repo-error":o?.status=="error"}]),role:"row",key:o?.repoId},[n("div",HR,[t[27]||(t[27]=n("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Repository"},[n("use",{href:"#project-type-repo"})],-1)),n("div",jR,[n("a",{class:"repo-name",textContent:u(o?.repoId),href:e.safeUrl("/r/"+o?.repoId+"/")},null,8,GR),n("div",WR,[n("span",KR,[n("a",{target:"_blank",rel:"noopener",textContent:u(o?.source?.fullName),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/")},null,8,YR),o?.options?.update&&o?.source?.branch?(l(),d("span",QR,[t[25]||(t[25]=y(" \xB7 ",-1)),n("a",{target:"_blank",rel:"noopener",textContent:u(o?.source?.branch),href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/tree/"+o?.source?.branch)},null,8,JR)])):p("v-if",!0),o?.source?.commit?(l(),d("span",XR,[t[26]||(t[26]=y(" \xB7 ",-1)),n("a",{class:"commit-hash",target:"_blank",rel:"noopener",href:e.safeUrl("https://github.com/"+o?.source?.fullName+"/tree/"+o?.source?.commit)},"@"+u(o?.source?.commit?.substring(0,8)),9,ZR)])):p("v-if",!0)])])])]),n("div",xR,[n("div",eT,[n("span",{class:A(["status-dot","status-"+(o?.status=="error"?"error":o?.status=="ready"?"ready":o?.status=="expired"||o?.status=="removed"?o?.status:"progress")]),"aria-hidden":"true"},null,2),n("span",{class:"status-word",textContent:u(e.fmt?.statusLabel(o?.status))},null,8,tT)]),o?.anonymizeDate?(l(),d("div",nT,"anonymized "+u(e.fmt?.humanTime(o?.anonymizeDate)),1)):p("v-if",!0)]),n("div",oT,[t[28]||(t[28]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1)),t[29]||(t[29]=y()),n("span",{textContent:u(e.fmt?.number(o?.pageView))},null,8,sT)]),n("div",iT,[t[31]||(t[31]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),o?.status=="ready"&&(o?.options?.expirationMode==="never"||!o?.options?.expirationDate)?(l(),d("span",rT,"Never")):p("v-if",!0),o?.status=="ready"&&o?.options?.expirationMode!=="never"&&o?.options?.expirationDate?(l(),d("span",{key:1,textContent:u(e.fmt?.humanTime(o?.options?.expirationDate))},null,8,aT)):p("v-if",!0),o?.status=="expired"?(l(),d("span",lT,[t[30]||(t[30]=y("Expired",-1)),o?.options?.expirationDate?(l(),d("span",dT,u(e.fmt?.humanTime(o?.options?.expirationDate)),1)):p("v-if",!0)])):p("v-if",!0),o?.status!="ready"&&o?.status!="expired"?(l(),d("span",uT,"\u2014")):p("v-if",!0)]),n("div",cT,[n("div",pT,[n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-label":"Actions for "+o?.repoId},[...t[32]||(t[32]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})],-1)])],8,fT),n("div",hT,[n("a",{class:"dropdown-item",href:e.safeUrl("/r/"+o?.repoId+"/")},[...t[33]||(t[33]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View ",-1)])],8,mT),n("a",{class:"dropdown-item",href:e.safeUrl("/anonymize/"+o?.repoId)},[...t[34]||(t[34]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit ",-1)])],8,vT)])])])],2))),128)),e.filteredRepositories?.length==0?(l(),d("div",gT,[t[35]||(t[35]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1)),e.conference?.repositories?.length?p("v-if",!0):(l(),d("span",yT,"No repository has been submitted to this conference yet.")),e.conference?.repositories?.length?(l(),d("span",bT,"Nothing matches the current filters.")):p("v-if",!0),e.conference?.repositories?.length?(l(),d("div",wT,[n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[3]||(t[3]=o=>{e.search="",e.filters.status.ready=!0,e.filters.status.expired=!0,e.filters.status.removed=!0})},"Clear filters")])):p("v-if",!0)])):p("v-if",!0)])])])}var kT={class:"container page paper-page conferences-page"},ET={class:"row"},CT={class:"w-100"},_T={class:"search-wrap"},ST={type:"search",id:"search",class:"form-control","aria-label":"Search conferences",placeholder:"Search by name or ID\u2026",autocomplete:"off"},NT={class:"dashboard-filter-controls"},DT={class:"dropdown"},RT={class:"btn dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},TT={class:"filter-btn-value"},AT={class:"dropdown-menu","aria-labelledby":"dropdownSort"},OT={class:"form-check dropdown-item"},PT={class:"form-check-input",type:"radio",name:"sort",id:"sortName",value:"name"},IT={class:"form-check dropdown-item"},VT={class:"form-check-input",type:"radio",name:"sort",id:"sortID",value:"conferenceID"},qT={class:"form-check dropdown-item"},MT={class:"form-check-input",type:"radio",name:"sort",id:"sortStatus",value:"-status"},$T={class:"dropdown"},LT={class:"btn dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},UT={key:0,class:"filter-btn-value"},FT={key:1,class:"filter-btn-value"},BT={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},zT={class:"form-check dropdown-item"},HT=["id"],jT=["for"],GT={class:"dashboard-meta"},WT={class:"dashboard-count"},KT={key:0},YT={key:0},QT={key:1},JT={key:0,class:"filter-chip"},XT=["onClick","aria-label"],ZT={key:0,class:"conference-feedback",role:"alert"},xT={key:1,class:"conference-feedback",role:"status"},eA={class:"paper-table paper-table-conferences w-100",role:"table","aria-label":"Conferences"},tA={class:"cell-anon",role:"cell"},nA={class:"anon-text"},oA=["textContent","href"],sA={class:"anon-sub"},iA={class:"anon-source"},rA=["textContent"],aA={key:0},lA=["textContent","href"],dA={class:"cell-status",role:"cell"},uA={class:"status-line"},cA=["textContent"],pA={class:"cell-views num",role:"cell"},fA=["textContent"],hA={class:"cell-expires",role:"cell"},mA={key:0},vA={key:1,class:"empty-dash","aria-label":"No review window"},gA={class:"cell-actions",role:"cell"},yA={class:"dropdown"},bA=["disabled","aria-label"],wA={class:"dropdown-menu dropdown-menu-right"},kA=["href"],EA=["href"],CA={key:0},_A=["onClick"],SA={key:0,class:"paper-table-empty"},NA={key:0},DA={key:1},RA={class:"paper-table-empty-actions"},TA={key:1,href:"/conference/new",class:"btn btn-ink"};function _l(e,t){let s=ye("field"),i=ye("form");return l(),d("div",kT,[n("div",ET,[n("div",CT,[t[10]||(t[10]=pe('
My work \xA0/\xA0 Conferences

Your conferences

Group anonymizations by venue, give chairs a shared dashboard, and set one expiry for every submission.

New conference
',2)),N((l(),d("form",{class:"w-100 dashboard-filter-row","aria-label":"Filter conferences","accept-charset":"UTF-8",onSubmit:t[0]||(t[0]=ue(o=>e.submitForm(o,()=>{o.preventDefault()}),["prevent"]))},[n("div",_T,[N(n("input",ST,null,512),[[s,{state:e.viewState,set:o=>{e.search=o},value:e.search,form:null,options:{}}]])]),n("div",NT,[n("div",DT,[n("button",RT,[t[3]||(t[3]=n("span",{class:"filter-btn-label"},"Sort",-1)),n("span",TT,u({name:"Name",conferenceID:"ID","-status":"Status"}[e.orderBy]||"Custom"),1)]),n("div",AT,[t[7]||(t[7]=n("h6",{class:"dropdown-header"},"Order by",-1)),n("div",OT,[N(n("input",PT,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[4]||(t[4]=n("label",{class:"form-check-label",for:"sortName"},"Name",-1))]),n("div",IT,[N(n("input",VT,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[5]||(t[5]=n("label",{class:"form-check-label",for:"sortID"},"ID",-1))]),n("div",qT,[N(n("input",MT,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[6]||(t[6]=n("label",{class:"form-check-label",for:"sortStatus"},"Status",-1))])])]),n("div",$T,[n("button",LT,[t[8]||(t[8]=n("span",{class:"filter-btn-label"},"Status",-1)),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?(l(),d("span",UT,"All")):p("v-if",!0),e.filters?.status?.ready&&e.filters?.status?.expired&&e.filters?.status?.removed?p("v-if",!0):(l(),d("span",FT,u((e.filters?.status?.ready?0:1)+(e.filters?.status?.expired?0:1)+(e.filters?.status?.removed?0:1))+" hidden ",1))]),n("div",BT,[t[9]||(t[9]=n("h6",{class:"dropdown-header"},"Show statuses",-1)),(l(!0),d(W,null,Z(e.statusLabels,(o,r,a)=>(l(),d("div",zT,[N(n("input",{class:"form-check-input",type:"checkbox",id:"status-"+r},null,8,HT),[[s,{state:e.viewState,set:c=>{e.filters.status[r]=c},value:e.filters?.status[r],form:null,options:{}}]]),n("label",{class:"form-check-label",for:"status-"+r},u(o),9,jT)]))),256))])])])],32)),[[i,e.viewState]]),n("div",GT,[n("span",WT,[e.filteredConferences?.length===e.conferences?.length?(l(),d("span",KT,[y(u(e.fmt?.number(e.conferences?.length))+" conference",1),e.conferences?.length!==1?(l(),d("span",YT,"s")):p("v-if",!0)])):p("v-if",!0),e.filteredConferences?.length!==e.conferences?.length?(l(),d("span",QT,u(e.fmt?.number(e.filteredConferences?.length))+" of "+u(e.fmt?.number(e.conferences?.length))+" shown",1)):p("v-if",!0)]),(l(!0),d(W,null,Z(e.filters?.status,(o,r,a)=>(l(),d(W,null,[o===!1?(l(),d("span",JT,[y(" Hiding "+u(e.statusLabels[r])+" ",1),n("button",{type:"button",class:"filter-chip-close",onClick:c=>{e.filters.status[r]=!0},"aria-label":"Show "+e.statusLabels[r]+" again"},"\xD7",8,XT)])):p("v-if",!0)],64))),256))])]),e.error?(l(),d("div",ZT,[n("span",null,u(e.error),1),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[1]||(t[1]=o=>e.loadConferences())},"Retry")])):p("v-if",!0),e.loading?(l(),d("div",xT,"Loading conferences\u2026")):p("v-if",!0),n("div",eA,[t[24]||(t[24]=n("div",{class:"paper-table-head",role:"row"},[n("div",{role:"columnheader"},"Conference"),n("div",{role:"columnheader"},"Status"),n("div",{role:"columnheader",class:"num"},"Repos"),n("div",{role:"columnheader"},"Review window"),n("div",{role:"columnheader"},[n("span",{class:"sr-only"},"Actions")])],-1)),(l(!0),d(W,null,Z(e.filteredConferences,(o,r)=>(l(),d("div",{class:A(["paper-table-row row-clickable",{"repo-inactive":o?.status=="expired"||o?.status=="removed"}]),role:"row",key:o?.conferenceID},[n("div",tA,[t[13]||(t[13]=n("svg",{class:"ui-icon record-type-icon",role:"img","aria-label":"Conference"},[n("use",{href:"#project-icon-conference"})],-1)),n("div",nA,[n("a",{class:"repo-name",textContent:u(o?.name),href:e.safeUrl("/conference/"+o?.conferenceID)},null,8,oA),n("div",sA,[n("span",iA,[t[12]||(t[12]=y("ID ",-1)),n("span",{class:"commit-hash",textContent:u(o?.conferenceID)},null,8,rA),o?.url?(l(),d("span",aA,[t[11]||(t[11]=y(" \xB7 ",-1)),n("a",{target:"_blank",rel:"noopener",textContent:u(e.fmt?.limitTo(o?.url,60)),href:e.safeUrl(o?.url)},null,8,lA)])):p("v-if",!0)])])])]),n("div",dA,[n("div",uA,[n("span",{class:A(["status-dot","status-"+o?.status]),"aria-hidden":"true"},null,2),n("span",{class:"status-word",textContent:u(e.fmt?.statusLabel(o?.status))},null,8,cA)])]),n("div",pA,[t[14]||(t[14]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1)),t[15]||(t[15]=y()),n("span",{textContent:u(e.fmt?.number(o?.nbRepositories||0))},null,8,fA)]),n("div",hA,[t[16]||(t[16]=n("svg",{class:"ui-icon mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),o?.startDate?(l(),d("span",mA,u(e.fmt?.date(o?.startDate,"mediumDate"))+" \u2013 "+u(e.fmt?.date(o?.endDate,"mediumDate")),1)):p("v-if",!0),o?.startDate?p("v-if",!0):(l(),d("span",vA,"\u2014"))]),n("div",gA,[n("div",yA,[n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:o?.removing,"aria-label":"Actions for "+o?.name},[...t[17]||(t[17]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})],-1)])],8,bA),n("div",wA,[n("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+o?.conferenceID+"/")},[...t[18]||(t[18]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View ",-1)])],8,kA),n("a",{class:"dropdown-item",href:e.safeUrl("/conference/"+o?.conferenceID+"/edit")},[...t[19]||(t[19]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit ",-1)])],8,EA),o?.status!="removed"?(l(),d("div",CA,[t[21]||(t[21]=n("div",{class:"dropdown-divider"},null,-1)),n("button",{type:"button",class:"dropdown-item dropdown-item-danger",onClick:a=>e.removeConference(o)},[...t[20]||(t[20]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Remove ",-1)])],8,_A)])):p("v-if",!0)])])])],2))),128)),!e.loading&&!e.error&&e.filteredConferences?.length==0?(l(),d("div",SA,[t[23]||(t[23]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1)),e.conferences?.length==0?(l(),d("span",NA,"You have not created a conference yet.")):p("v-if",!0),e.conferences?.length>0?(l(),d("span",DA,"Nothing matches the current filters.")):p("v-if",!0),n("div",RA,[e.conferences?.length>0?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[2]||(t[2]=o=>{e.search="",e.filters.status.ready=!0,e.filters.status.expired=!0,e.filters.status.removed=!0})},"Clear filters")):p("v-if",!0),e.conferences?.length==0?(l(),d("a",TA,[...t[22]||(t[22]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#project-icon-plus"})],-1),y(" New conference",-1)])])):p("v-if",!0)])])):p("v-if",!0)])])])}var AA={class:"container page dashboard-page paper-page"},OA={class:"row"},PA={class:"w-100"},IA={class:"dashboard-heading"},VA=["open"],qA=["aria-expanded"],MA=["stroke-dasharray"],$A={key:1,d:"M7 12c0-4 4-4 5 0s5 4 5 0-4-4-5 0-5 4-5 0",class:"quota-ring-unlimited"},LA={key:0,class:"quota-summary-value"},UA={key:0},FA={class:"quota-panel",id:"dashboard-usage"},BA={class:"quota-panel-heading"},zA={key:1,class:"quota-loading",role:"status"},HA={class:"search-wrap"},jA={type:"search",id:"search",class:"form-control","aria-label":"Search anonymizations",placeholder:"Search projects, IDs, or conferences\u2026",autocomplete:"off"},GA=["aria-expanded"],WA={class:"btn-group",role:"group","aria-label":"Type"},KA=["aria-pressed"],YA=["aria-pressed"],QA=["aria-pressed"],JA=["aria-pressed"],XA={class:"dropdown"},ZA={class:"btn dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},xA={class:"filter-btn-value"},eO={class:"sr-only"},tO={class:"dropdown-menu","aria-labelledby":"dropdownSort"},nO={class:"form-check dropdown-item"},oO=["onClick","checked","id"],sO=["for"],iO={class:"dropdown"},rO={class:"btn dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},aO={key:0,class:"filter-btn-value"},lO={key:1,class:"filter-btn-value"},dO={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},uO={class:"form-check dropdown-item"},cO=["id"],pO=["for"],fO={key:0,class:"dashboard-meta"},hO={class:"dashboard-view-tabs",role:"group","aria-label":"Project view"},mO=["aria-pressed"],vO=["aria-pressed","aria-label"],gO={class:"dashboard-count"},yO={key:0},bO={key:0},wO={key:1},kO={class:"dashboard-active-filters"},EO=["onClick","aria-label","title"],CO=["aria-busy"],_O={class:"paper-table-head",role:"row"},SO=["aria-sort"],NO=["aria-sort"],DO=["aria-sort"],RO=["aria-sort"],TO={key:0,class:"paper-table-row paper-table-skeleton",role:"row","aria-hidden":"true"},AO=["onClick"],OO={class:"cell-anon",role:"cell"},PO=["aria-label","title"],IO={class:"project-type-svg","aria-hidden":"true"},VO=["href"],qO={class:"anon-text"},MO={class:"anon-title"},$O=["title","textContent","href"],LO=["textContent"],UO={key:2,class:"type-badge type-coauthor",title:"You are a co-author on this anonymization"},FO={class:"anon-sub"},BO=["title"],zO=["title"],HO=["title"],jO=["textContent"],GO={class:"dashboard-row-meta",role:"presentation"},WO={class:"cell-status",role:"cell"},KO={class:"status-line"},YO=["textContent"],QO=["textContent","title"],JO=["title"],XO=["href"],ZO=["onClick"],xO={key:4,class:"status-sub status-sub-date"},eP=["aria-label"],tP={class:"cell-expires",role:"cell"},nP={key:0,class:"expires-never"},oP=["textContent"],sP={key:2,class:"expires-past"},iP={key:3,class:"expires-past"},rP={key:4,class:"empty-dash","aria-label":"Not applicable"},aP={class:"cell-actions",role:"cell"},lP=["onClick","disabled","title","aria-label"],dP=["onClick","data-project-actions","aria-controls","aria-expanded"],uP={key:2,class:"dropdown"},cP=["data-project-actions","aria-label"],pP={class:"dropdown-menu dropdown-menu-right"},fP=["onClick","aria-controls","aria-expanded"],hP=["href"],mP=["href"],vP=["onClick","disabled"],gP=["href"],yP=["onClick"],bP=["onClick"],wP=["onClick"],kP={key:5},EP=["onClick"],CP={key:1,class:"project-details-row",role:"row"},_P=["id","onKeydown"],SP={class:"project-details-heading"},NP=["onClick"],DP={class:"project-details-list"},RP={key:0},TP={key:1},AP={key:0},OP={key:2},PP={key:0,class:"project-progress-help"},IP=["href"],VP=["onSubmit"],qP=["for"],MP=["id"],$P={class:"project-name-controls"},LP=["id","aria-describedby","disabled"],UP=["disabled"],FP={key:0,class:"project-name-error",role:"alert"},BP={key:1,role:"status"},zP={key:0,class:"paper-table-empty"},HP={key:0},jP={key:1},GP={class:"paper-table-empty-actions"},WP={key:1,href:"/anonymize",class:"btn btn-ink"},KP={key:0,class:"dashboard-pagination"},YP={key:0,role:"alert"},QP=["disabled"];function Sl(e,t){let s=We("quota-usage"),i=ye("field"),o=ye("form");return l(),d("div",AA,[n("div",OA,[n("div",PA,[n("div",IA,[n("div",null,[t[27]||(t[27]=n("h1",{class:"paper-page-title"},"Projects",-1)),t[28]||(t[28]=n("p",{class:"paper-page-lede"},"Manage your anonymous links.",-1)),n("details",{class:"dashboard-quota",open:e.quotaExpanded,onToggle:t[1]||(t[1]=r=>e.quotaExpanded=r.target.open),onKeydown:t[2]||(t[2]=Rn(ue(r=>e.closeQuota(),["prevent","stop"]),["esc"]))},[n("summary",{"aria-controls":"dashboard-usage","aria-expanded":e.quotaExpanded},[(l(),d("svg",{class:A(["quota-summary-ring",e.quota?"quota-"+e.quota.repository.level:""]),viewBox:"0 0 24 24","aria-hidden":"true"},[t[21]||(t[21]=n("circle",{class:"quota-ring-track",cx:"12",cy:"12",r:"9"},null,-1)),e.quota&&!e.quota.repository.unlimited?(l(),d("circle",{key:0,class:"quota-ring-fill",cx:"12",cy:"12",r:"9",pathLength:"100","stroke-dasharray":e.quota.repository.percent+" 100"},null,8,MA)):p("v-if",!0),e.quota?.repository.unlimited?(l(),d("path",$A)):p("v-if",!0)],2)),t[23]||(t[23]=n("span",{class:"quota-summary-label"},"Usage",-1)),e.quota?(l(),d("span",LA,[y(u(e.fmt.number(e.quota.repository.used)),1),e.quota.repository.unlimited?p("v-if",!0):(l(),d("span",UA," / "+u(e.fmt.number(e.quota.repository.total)),1)),t[22]||(t[22]=y(" repos",-1))])):p("v-if",!0),t[24]||(t[24]=n("svg",{class:"project-type-svg quota-summary-chevron","aria-hidden":"true"},[n("use",{href:"#project-icon-chevron"})],-1))],8,qA),n("div",FA,[n("div",BA,[t[26]||(t[26]=n("h2",null,"Account usage",-1)),n("button",{type:"button",class:"project-close","aria-label":"Close usage",onClick:t[0]||(t[0]=r=>e.closeQuota())},[...t[25]||(t[25]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])])]),e.quota?(l(),$t(s,{key:0,quota:e.quota,fmt:e.fmt},null,8,["quota","fmt"])):(l(),d("p",zA,"Loading usage\u2026"))])],40,VA)]),t[29]||(t[29]=pe('',1))]),p(" Search + filters "),N((l(),d("form",{class:"w-100 dashboard-filter-row","aria-label":"Filter anonymizations","accept-charset":"UTF-8",onSubmit:t[9]||(t[9]=ue(r=>e.submitForm(r,()=>{r.preventDefault()}),["prevent"]))},[n("div",HA,[N(n("input",jA,null,512),[[i,{state:e.viewState,set:r=>{e.search=r},value:e.search,form:null,options:{}}]])]),n("button",{class:"btn dashboard-filters-toggle",type:"button","aria-expanded":e.filtersExpanded,"aria-controls":"dashboard-filter-controls",onClick:t[3]||(t[3]=r=>e.filtersExpanded=!e.filtersExpanded)},[...t[30]||(t[30]=[y("Filters",-1),n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-filter"})],-1)])],8,GA),n("div",{id:"dashboard-filter-controls",class:A(["dashboard-filter-controls",{expanded:e.filtersExpanded}])},[n("div",WA,[n("button",{type:"button",class:A(["btn",{"btn-primary":e.typeFilter==="all"}]),onClick:t[4]||(t[4]=r=>e.typeFilter="all"),"aria-pressed":e.typeFilter==="all"},"All",10,KA),n("button",{type:"button",class:A(["btn dashboard-type-filter",{"btn-primary":e.typeFilter==="repo"}]),title:"Repositories",onClick:t[5]||(t[5]=r=>e.typeFilter="repo"),"aria-pressed":e.typeFilter==="repo"},[...t[31]||(t[31]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-type-repo"})],-1),n("span",{class:"type-filter-label"},"Repos",-1)])],10,YA),n("button",{type:"button",class:A(["btn dashboard-type-filter",{"btn-primary":e.typeFilter==="pr"}]),title:"Pull requests",onClick:t[6]||(t[6]=r=>e.typeFilter="pr"),"aria-pressed":e.typeFilter==="pr"},[...t[32]||(t[32]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-type-pr"})],-1),n("span",{class:"type-filter-label"},"PRs",-1)])],10,QA),n("button",{type:"button",class:A(["btn dashboard-type-filter",{"btn-primary":e.typeFilter==="gist"}]),title:"Gists",onClick:t[7]||(t[7]=r=>e.typeFilter="gist"),"aria-pressed":e.typeFilter==="gist"},[...t[33]||(t[33]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-type-gist"})],-1),n("span",{class:"type-filter-label"},"Gists",-1)])],10,JA)]),n("div",{id:"dashboard-extra-filters",class:A(["dashboard-extra-filters",{expanded:e.filtersExpanded}])},[n("div",XA,[n("button",ZA,[t[35]||(t[35]=n("span",{class:"filter-btn-label"},"Sort",-1)),n("span",xA,u(e.sortLabel()),1),(l(),d("svg",{class:A(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[34]||(t[34]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)),n("span",eO,u(e.sortDesc()?"descending":"ascending"),1)]),n("div",tO,[t[36]||(t[36]=n("h6",{class:"dropdown-header"},"Order by",-1)),(l(!0),d(W,null,Z(e.sortFields,(r,a,c)=>(l(),d("div",nO,[n("input",{class:"form-check-input",type:"radio",name:"sort",onClick:f=>e.setSort(a,r.defaultDesc),checked:e.isSortedBy(a),id:"sort-"+c},null,8,oO),n("label",{class:"form-check-label",for:"sort-"+c},u(r?.label),9,sO)]))),256)),t[37]||(t[37]=n("div",{class:"dropdown-divider"},null,-1)),n("button",{type:"button",class:"dropdown-item",onClick:t[8]||(t[8]=r=>e.toggleSortDirection())},u(e.sortDesc()?"Switch to ascending":"Switch to descending"),1)])]),n("div",iO,[n("button",rO,[t[38]||(t[38]=n("span",{class:"filter-btn-label"},"Status",-1)),e.hasHiddenStatus()?p("v-if",!0):(l(),d("span",aO,"All")),e.hasHiddenStatus()?(l(),d("span",lO,u(e.hiddenStatusCount())+" hidden",1)):p("v-if",!0)]),n("div",dO,[t[39]||(t[39]=n("h6",{class:"dropdown-header"},"Show statuses",-1)),(l(!0),d(W,null,Z(e.statusKeyLabels,(r,a,c)=>(l(),d("div",uO,[N(n("input",{class:"form-check-input",type:"checkbox",id:"status-"+a},null,8,cO),[[i,{state:e.viewState,set:f=>{e.filters.status[a]=f},value:e.filters?.status[a],form:null,options:{}}]]),n("label",{class:"form-check-label",for:"status-"+a},u(r),9,pO)]))),256))])])],2)],2)],32)),[[o,e.viewState]]),p(" Result count + active filter chips "),e.loading?p("v-if",!0):(l(),d("div",fO,[n("div",hO,[n("button",{type:"button","aria-pressed":e.projectView==="all",onClick:t[10]||(t[10]=r=>e.setProjectView("all")),"aria-label":"All projects"},[...t[40]||(t[40]=[n("span",{class:"dashboard-view-long"},"All projects",-1),n("span",{class:"dashboard-view-short","aria-hidden":"true"},"All",-1)])],8,mO),n("button",{type:"button","aria-pressed":e.projectView==="attention",onClick:t[11]||(t[11]=r=>e.setProjectView("attention")),"aria-label":"Needs attention "+e.attentionCount()},[t[41]||(t[41]=n("span",{class:"dashboard-attention-prefix"},"Needs ",-1)),t[42]||(t[42]=n("span",null,"attention",-1)),t[43]||(t[43]=y()),n("span",{class:A(["attention-count",{"has-attention":e.attentionCount()>0}])},u(e.attentionCount()),3)],8,vO)]),n("span",gO,[(e.dashboardTotals?.filtered??e.filteredItems?.length)===(e.dashboardTotals?.total??e.items?.length)?(l(),d("span",yO,[y(u(e.fmt?.number(e.dashboardTotals?.total??e.items?.length))+" project",1),(e.dashboardTotals?.total??e.items?.length)!==1?(l(),d("span",bO,"s")):p("v-if",!0)])):(l(),d("span",wO,u(e.fmt?.number(e.dashboardTotals?.filtered??e.filteredItems?.length))+" of "+u(e.fmt?.number(e.dashboardTotals?.total??e.items?.length))+" shown",1))]),n("div",kO,[(l(!0),d(W,null,Z(e.filters?.status,(r,a,c)=>(l(),d(W,null,[r===!1?(l(),d("button",{key:0,type:"button",class:"filter-chip",onClick:f=>e.filters.status[a]=!0,"aria-label":"Show "+e.statusKeyLabels[a]+" again",title:"Show "+e.statusKeyLabels[a]+" again"},[y(u(e.statusKeyLabels[a])+" hidden",1),t[44]||(t[44]=n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1))],8,EO)):p("v-if",!0)],64))),256)),e.typeFilter!=="all"?(l(),d("button",{key:0,type:"button",class:"filter-chip",onClick:t[12]||(t[12]=r=>e.typeFilter="all"),"aria-label":"Show all project types"},[y(u(e.typeFilter==="repo"?"Repositories":e.typeFilter==="pr"?"Pull requests":"Gists"),1),t[45]||(t[45]=n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1))])):p("v-if",!0),e.showClearFilters()?(l(),d("button",{key:1,type:"button",class:"btn-link-inline",onClick:t[13]||(t[13]=r=>e.clearFilters())},"Clear filters")):p("v-if",!0)])]))]),p(" Table "),n("div",{class:"paper-table paper-table-dashboard",role:"table","aria-label":"Anonymizations","aria-busy":e.loading},[n("div",_O,[n("div",{role:"columnheader","aria-sort":e.isSortedBy("_label")?e.sortDesc()?"descending":"ascending":"none"},[n("button",{type:"button",class:A(["sortable",{active:e.isSortedBy("_label")}]),onClick:t[14]||(t[14]=r=>e.setSort("_label"))},[t[47]||(t[47]=y(" Project ",-1)),e.isSortedBy("_label")?(l(),d("svg",{key:0,class:A(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[46]||(t[46]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,SO),n("div",{role:"columnheader","aria-sort":e.isSortedBy("status")?e.sortDesc()?"descending":"ascending":"none"},[n("button",{type:"button",class:A(["sortable",{active:e.isSortedBy("status")}]),onClick:t[15]||(t[15]=r=>e.setSort("status"))},[t[49]||(t[49]=y(" Status ",-1)),e.isSortedBy("status")?(l(),d("svg",{key:0,class:A(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[48]||(t[48]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,NO),n("div",{role:"columnheader",class:"num","aria-sort":e.isSortedBy("pageView")?e.sortDesc()?"descending":"ascending":"none"},[n("button",{type:"button",class:A(["sortable",{active:e.isSortedBy("pageView")}]),onClick:t[16]||(t[16]=r=>e.setSort("pageView"))},[t[51]||(t[51]=y(" Views ",-1)),e.isSortedBy("pageView")?(l(),d("svg",{key:0,class:A(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[50]||(t[50]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,DO),n("div",{role:"columnheader","aria-sort":e.isSortedBy("options.expirationDate")?e.sortDesc()?"descending":"ascending":"none"},[n("button",{type:"button",class:A(["sortable",{active:e.isSortedBy("options.expirationDate")}]),onClick:t[17]||(t[17]=r=>e.setSort("options.expirationDate"))},[t[53]||(t[53]=y(" Expires ",-1)),e.isSortedBy("options.expirationDate")?(l(),d("svg",{key:0,class:A(["project-type-svg sort-direction",{ascending:!e.sortDesc()}]),"aria-hidden":"true"},[...t[52]||(t[52]=[n("use",{href:"#project-icon-arrow"},null,-1)])],2)):p("v-if",!0)],2)],8,RO),t[54]||(t[54]=n("div",{role:"columnheader"},[n("span",{class:"sr-only"},"Actions")],-1))]),p(" Loading skeleton: keeps the layout stable while the three lists load "),(l(),d(W,null,Z([1,2,3,4],(r,a)=>(l(),d(W,null,[e.loading?(l(),d("div",TO,[...t[55]||(t[55]=[n("div",{class:"cell-anon",role:"cell"},[n("span",{class:"skeleton skeleton-badge"}),n("div",{class:"anon-text"},[n("span",{class:"skeleton skeleton-line",style:{width:"38%"}}),n("span",{class:"skeleton skeleton-line skeleton-line-sm",style:{width:"56%"}})])],-1),n("div",{class:"cell-status",role:"cell"},[n("span",{class:"skeleton skeleton-line",style:{width:"60%"}})],-1),n("div",{class:"cell-views num",role:"cell"},[n("span",{class:"skeleton skeleton-line",style:{width:"40%"}})],-1),n("div",{class:"cell-expires",role:"cell"},[n("span",{class:"skeleton skeleton-line",style:{width:"55%"}})],-1),n("div",{class:"cell-actions",role:"cell"},null,-1)])])):p("v-if",!0)],64))),64)),(l(!0),d(W,null,Z(e.filteredItems,(r,a)=>(l(),d(W,{key:r?._type+":"+(r?._id||a)},[e.loading?p("v-if",!0):(l(),d("div",{key:0,class:A(["paper-table-row",{"repo-inactive":r?._statusKey=="expired"||r?._statusKey=="removed","repo-error":r?.status=="error","row-clickable":!!r?._viewUrl}]),role:"row",onClick:c=>e.openItem(r,c)},[n("div",OO,[n("span",{class:"project-type-icon",role:"img","aria-label":r?._type==="repo"?"Repository":r?._type==="pr"?"Pull request":"Gist",title:r?._type==="repo"?"Repository":r?._type==="pr"?"Pull request":"Gist"},[(l(),d("svg",IO,[n("use",{href:"#project-type-"+r._type},null,8,VO)]))],8,PO),n("div",qO,[n("div",MO,[r?._viewUrl?(l(),d("a",{key:0,class:"repo-name",title:r._label,textContent:u(r?._label),href:e.safeUrl(r?._viewUrl)},null,8,$O)):p("v-if",!0),r?._viewUrl?p("v-if",!0):(l(),d("span",{key:1,class:"repo-name repo-name-static",textContent:u(r?._label)},null,8,LO)),r?.role==="coauthor"?(l(),d("span",UO,"Co-author")):p("v-if",!0)]),n("div",FO,[r?._id?(l(),d("code",{key:0,class:"anonymous-id",title:r._id},u(r._id),9,BO)):p("v-if",!0),r?._type==="repo"&&r?.source?.commit?(l(),d("span",{key:1,class:"commit-hash",title:r.source.commit},u(r.source.commit.substring(0,8)),9,zO)):p("v-if",!0),r?.conference?(l(),d("span",{key:2,class:"cell-conf conf-tag",title:r?.conference},[t[56]||(t[56]=n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-conference"})],-1)),t[57]||(t[57]=y()),n("span",{textContent:u(r?.conference)},null,8,jO)],8,HO)):p("v-if",!0)])])]),n("div",GO,[n("div",WO,[n("div",KO,[n("span",{class:A(["status-dot","status-"+r?._statusKey]),"aria-hidden":"true"},null,2),n("span",{class:"status-word",textContent:u(e.fmt?.statusLabel(r?.status))},null,8,YO)]),r?.status=="error"&&r?.statusMessage?(l(),d("div",{key:0,class:"status-sub status-sub-error",textContent:u(e.fmt?.statusMsg(r?.statusMessage)),title:r?.statusMessage},null,8,QO)):p("v-if",!0),r?._stale?(l(),d("div",{key:1,class:"status-sub status-sub-warn",title:"Last activity "+e.fmt?.humanTime(r?.anonymizeDate||r?.lastView)}," Last activity "+u(e.fmt?.humanTime(r?.anonymizeDate||r?.lastView))+" \xB7 may be stuck ",9,JO)):p("v-if",!0),r.status==="error"&&r._editUrl?(l(),d("a",{key:2,class:"project-attention-action",href:e.safeUrl(r._editUrl)},"Fix source",8,XO)):p("v-if",!0),r._stale||r._broken?(l(),d("button",{key:3,type:"button",class:"project-attention-action",onClick:ue(c=>e.showProjectDetails(r),["stop"])},u(r._broken?"Review details":"Check progress"),9,ZO)):p("v-if",!0),r?.status!="error"&&!r?._stale&&r?.anonymizeDate?(l(),d("div",xO," anonymized "+u(e.fmt?.humanTime(r?.anonymizeDate)),1)):p("v-if",!0)]),n("div",{class:"cell-views num",role:"cell","aria-label":e.fmt.number(r.pageView)+" views"},[t[58]||(t[58]=n("svg",{class:"project-type-svg mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1)),n("span",null,u(e.fmt.number(r.pageView)),1)],8,eP),n("div",tP,[t[59]||(t[59]=n("svg",{class:"project-type-svg mobile-meta-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),r?._expiry?.kind==="never"?(l(),d("span",nP,"Never")):p("v-if",!0),r?._expiry?.kind==="date"?(l(),d("span",{key:1,textContent:u(e.fmt?.humanTime(r?._expiry?.date))},null,8,oP)):p("v-if",!0),r?._expiry?.kind==="expired"&&r?._expiry?.date?(l(),d("span",sP,"Expired "+u(e.fmt?.humanTime(r?._expiry?.date)),1)):p("v-if",!0),r?._expiry?.kind==="expired"&&!r?._expiry?.date?(l(),d("span",iP,"Expired")):p("v-if",!0),r?._expiry?.kind==="none"?(l(),d("span",rP,"\u2014")):p("v-if",!0)])]),n("div",aP,[r._viewUrl?(l(),d("button",{key:0,type:"button",class:"copy-link-inline",onClick:ue(c=>e.copyLink(r),["stop"]),disabled:!!e.copyingId,title:"Copy anonymous link for "+r._label,"aria-label":"Copy anonymous link for "+r._label},[...t[60]||(t[60]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-copy"})],-1)])],8,lP)):p("v-if",!0),r._broken?(l(),d("button",{key:1,type:"button",class:"project-details-button",onClick:ue(c=>e.showProjectDetails(r),["stop"]),"data-project-actions":encodeURIComponent(r._type+":"+r._id),"aria-controls":e.projectDetailsId(r),"aria-expanded":e.selectedProject===r},"Details",8,dP)):p("v-if",!0),r?._broken?p("v-if",!0):(l(),d("div",uP,[n("button",{class:"btn btn-icon-dots",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","data-project-actions":encodeURIComponent(r._type+":"+r._id),"aria-label":"Actions for "+r?._name},[...t[61]||(t[61]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-more"})],-1)])],8,cP),n("div",pP,[n("button",{type:"button",class:"dropdown-item",onClick:c=>e.showProjectDetails(r),"aria-controls":e.projectDetailsId(r),"aria-expanded":e.selectedProject===r},"Project details & name",8,fP),n("a",{class:"dropdown-item",href:e.safeUrl(r?._viewUrl)}," View ",8,hP),r?._type==="repo"&&r?.options?.page&&r?.status=="ready"?(l(),d("a",{key:0,class:"dropdown-item",target:"_self",href:e.safeUrl("/w/"+r?.repoId+"/")}," View page ",8,mP)):p("v-if",!0),r?._viewUrl?(l(),d("button",{key:1,type:"button",class:"dropdown-item",onClick:c=>e.copyLink(r),disabled:!!e.copyingId}," Copy anonymous link ",8,vP)):p("v-if",!0),n("a",{class:"dropdown-item",href:e.safeUrl(r?._editUrl)}," Edit ",8,gP),r?.status=="ready"||r?.status=="error"?(l(),d("button",{key:2,type:"button",class:"dropdown-item",onClick:c=>e.refreshItem(r)}," Force update ",8,yP)):p("v-if",!0),r?.status=="removed"?(l(),d("button",{key:3,type:"button",class:"dropdown-item",onClick:c=>e.refreshItem(r)}," Enable ",8,bP)):p("v-if",!0),r?.status=="expired"?(l(),d("button",{key:4,type:"button",class:"dropdown-item",onClick:c=>e.extendItem(r)}," Extend 6 months ",8,wP)):p("v-if",!0),(r?.status=="ready"||r?.status=="expired"||r?.status=="error")&&r?.role!=="coauthor"?(l(),d("div",kP,[t[62]||(t[62]=n("div",{class:"dropdown-divider"},null,-1)),n("button",{type:"button",class:"dropdown-item dropdown-item-danger",onClick:c=>e.removeItem(r)}," Remove ",8,EP)])):p("v-if",!0)])]))])],10,AO)),!e.loading&&e.selectedProject===r?(l(),d("div",CP,[n("div",{class:"project-details",role:"cell","aria-colspan":"5",id:e.projectDetailsId(r),tabindex:"-1",onKeydown:Rn(ue(c=>e.closeProjectDetails(r),["stop"]),["esc"])},[n("div",SP,[t[64]||(t[64]=n("h2",null,"Project details",-1)),n("button",{type:"button",class:"project-close",onClick:c=>e.closeProjectDetails(r),"aria-label":"Close project details"},[...t[63]||(t[63]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])],8,NP)]),n("dl",DP,[n("div",null,[t[65]||(t[65]=n("dt",null,"Source",-1)),n("dd",null,u(r._source||"Not available"),1)]),n("div",null,[t[66]||(t[66]=n("dt",null,"Anonymous ID",-1)),n("dd",null,[n("code",null,u(r._id||"Missing identifier"),1)])]),r.source?.commit?(l(),d("div",RP,[t[67]||(t[67]=n("dt",null,"Commit",-1)),n("dd",null,[n("code",null,u(r.source.commit),1)])])):p("v-if",!0),r.conference?(l(),d("div",TP,[t[68]||(t[68]=n("dt",null,"Conference",-1)),n("dd",null,u(r.conference),1)])):p("v-if",!0),n("div",null,[t[69]||(t[69]=n("dt",null,"Status",-1)),n("dd",null,[y(u(e.fmt.statusLabel(r.status)),1),r.statusMessage?(l(),d("span",AP," \xB7 "+u(e.fmt.statusMsg(r.statusMessage)),1)):p("v-if",!0)])]),r.anonymizeDate?(l(),d("div",OP,[t[70]||(t[70]=n("dt",null,"Last anonymized",-1)),n("dd",null,u(e.fmt.humanTime(r.anonymizeDate)),1)])):p("v-if",!0)]),r._stale?(l(),d("p",PP,"This download has not progressed recently. Check the source access and selected branch before retrying.")):p("v-if",!0),r._editUrl?(l(),d("a",{key:1,class:"project-attention-action",href:e.safeUrl(r._editUrl)},u(e.needsAttention(r)?"Check source settings":"Edit anonymization settings"),9,IP)):p("v-if",!0),r._id?(l(),d("form",{key:2,class:"project-name-form",onSubmit:ue(c=>e.saveProjectName(r),["prevent"])},[n("label",{for:"project-name-"+r._type+"-"+r._id},"Project name",8,qP),n("p",{id:"project-name-help-"+r._type+"-"+r._id},"Only you see this name. Leave it blank to use the default.",8,MP),n("div",$P,[N(n("input",{class:"form-control",type:"text",id:"project-name-"+r._type+"-"+r._id,"aria-describedby":"project-name-help-"+r._type+"-"+r._id,maxlength:"100","onUpdate:modelValue":t[18]||(t[18]=c=>e.projectName=c),disabled:e.nameSaving},null,8,LP),[[co,e.projectName]]),n("button",{class:"btn btn-ink",type:"submit",disabled:e.nameSaving},u(e.nameSaving?"Saving\u2026":"Save name"),9,UP)]),e.nameError?(l(),d("p",FP,u(e.nameError),1)):p("v-if",!0),e.nameMessage?(l(),d("p",BP,u(e.nameMessage),1)):p("v-if",!0)],40,VP)):p("v-if",!0)],40,_P)])):p("v-if",!0)],64))),128)),!e.loading&&e.filteredItems?.length==0?(l(),d("div",zP,[t[72]||(t[72]=n("svg",{class:"project-type-svg project-empty-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1)),e.hasProjects()?p("v-if",!0):(l(),d("span",HP,"You have no anonymizations yet.")),e.hasProjects()?(l(),d("span",jP,"Nothing matches the current filters.")):p("v-if",!0),n("div",GP,[e.hasActiveFilters()?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[19]||(t[19]=r=>e.clearFilters())},"Clear filters")):p("v-if",!0),e.hasProjects()?p("v-if",!0):(l(),d("a",WP,[...t[71]||(t[71]=[n("svg",{class:"project-type-svg","aria-hidden":"true"},[n("use",{href:"#project-icon-plus"})],-1),y(" New anonymization",-1)])]))])])):p("v-if",!0)],8,CO)]),e.dashboardCursor||e.dashboardError?(l(),d("div",KP,[e.dashboardError?(l(),d("p",YP,u(e.dashboardError),1)):p("v-if",!0),e.dashboardCursor?(l(),d("button",{key:1,type:"button",class:"btn",onClick:t[20]||(t[20]=r=>e.loadMoreProjects()),disabled:e.loadingMore},u(e.loadingMore?"Loading\u2026":"Load more projects"),9,QP)):p("v-if",!0)])):p("v-if",!0)])}var JP={class:"explorer-page"},XP=["aria-label"],ZP={class:"ui-icon","aria-hidden":"true"},xP=["href"],e3=["textContent"],t3={class:"leftCol-head"},n3={class:"leftCol-search"},o3={class:"tree-search-box"},s3=["href"],i3={type:"text",class:"tree-search-input",placeholder:"Search files","aria-label":"Search files"},r3={class:"leftCol-project-header"},a3=["textContent"],l3={class:"project-file-count"},d3={class:"leftCol-body"},u3={key:0,class:"paper-inline-warning",role:"alert"},c3={key:1,class:"paper-inline-warning",role:"alert"},p3={class:"leftCol-foot"},f3=["title"],h3=["title"],m3=["title"],v3={key:2,class:"last-update",title:"Older repositories have no recorded publication date. The source commit date does not establish when files became available here."},g3={class:"explorer-main"},y3={class:"status-bar"},b3={class:"breadcrumb paths","aria-label":"Path"},w3=["textContent"],k3={class:"status-bar-actions"},E3=["href"],C3={class:"d-none d-md-inline"},_3={class:"ui-icon","aria-hidden":"true"},S3=["href"],N3={class:"d-none d-md-inline"},D3=["href"],R3=["href"],T3=["href"],A3=["href"],O3={class:"explorer-content"};function Nl(e,t){let s=We("tree"),i=We("partial-view"),o=ye("field");return l(),d("div",JP,[N(n("button",{class:"sidebar-toggle",onClick:t[0]||(t[0]=r=>e.sidebarCollapsed=!e.sidebarCollapsed),"aria-label":e.sidebarCollapsed?"Show files":"Hide files"},[(l(),d("svg",ZP,[n("use",{href:e.sidebarCollapsed?"#ui-icon-folder":"#project-icon-close"},null,8,xP)])),n("span",{textContent:u(e.sidebarCollapsed?"Files":"Close")},null,8,e3)],8,XP),[[G,e.files?.length]]),N(n("div",{class:A(["leftCol",{collapsed:e.sidebarCollapsed}])},[n("div",t3,[t[7]||(t[7]=n("span",{class:"leftCol-eyebrow"},"Files",-1)),n("button",{class:"leftCol-close","aria-label":"Close files",onClick:t[1]||(t[1]=r=>e.sidebarCollapsed=!0)},[...t[6]||(t[6]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-close"})],-1)])])]),n("div",n3,[n("div",o3,[(l(),d("svg",{class:A(["ui-icon tree-search-icon",{"fa-spin":e.fileSearchLoading}]),"aria-hidden":"true"},[n("use",{href:e.fileSearchLoading?"#ui-icon-spinner":"#ui-icon-search"},null,8,s3)],2)),N(n("input",i3,null,512),[[o,{state:e.viewState,set:r=>{e.fileSearchQuery=r},value:e.fileSearchQuery,form:null,options:{debounce:300},change:()=>{e.onFileSearchChange()}}]]),N(n("kbd",{class:"tree-search-kbd"},u(e.isMac?"\u2318":"Ctrl+")+"K",513),[[G,!e.fileSearchQuery]]),N(n("button",{class:"tree-search-clear","aria-label":"Clear search",onClick:t[2]||(t[2]=r=>{e.fileSearchQuery="",e.onFileSearchChange()})},"\xD7",512),[[G,e.fileSearchQuery]])])]),n("div",r3,[n("span",{class:"project-name",textContent:u(e.repoId)},null,8,a3),n("span",l3,u(e.fileCounts?.[""]||e.files?.length)+" files",1)]),n("div",d3,[e.options?.truncatedFolders?.length>0?(l(),d("div",u3,[t[8]||(t[8]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),y(" "+u(e.fmt?.translate("WARNINGS.repo_truncated")),1)])):p("v-if",!0),e.options?.hasSubmodules?(l(),d("div",c3,[t[9]||(t[9]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})],-1)),y(" "+u(e.fmt?.translate("WARNINGS.submodules_not_included")),1)])):p("v-if",!0),_e(s,{class:"files",file:e.files,"search-query":e.fileSearchQuery,"search-results":e.fileSearchResults,page:e.viewState},null,8,["file","search-query","search-results","page"])]),n("div",p3,[n("span",{class:"last-update",title:e.options?.sourceCommitDate||e.options?.anonymizedAt||e.options?.lastUpdateDate},u(e.options?.sourceCommitDate?"Source commit":e.options?.anonymizedAt?"Anonymized":"Updated")+" "+u(e.fmt?.date(e.options?.sourceCommitDate||e.options?.anonymizedAt||e.options?.lastUpdateDate)),9,f3),e.options?.settingsSavedAt?(l(),d("span",{key:0,class:"last-update",title:e.options.settingsSavedAt}," Settings saved "+u(e.fmt?.date(e.options.settingsSavedAt)),9,h3)):p("v-if",!0),e.options?.publishedAt?(l(),d("span",{key:1,class:"last-update",title:e.options.publishedAt}," Snapshot ready "+u(e.fmt?.date(e.options.publishedAt)),9,m3)):p("v-if",!0),e.options?.anonymizedAt&&!e.options?.publishedAt?(l(),d("span",v3," Snapshot ready date not recorded ")):p("v-if",!0)])],2),[[G,e.files?.length]]),N(n("div",{class:"leftCol-backdrop",onClick:t[3]||(t[3]=r=>e.sidebarCollapsed=!0)},null,512),[[G,e.files?.length&&!e.sidebarCollapsed]]),n("div",g3,[n("div",y3,[n("ol",b3,[(l(!0),d(W,null,Z(e.paths,(r,a)=>(l(),d("li",{class:"breadcrumb-item",textContent:u(r)},null,8,w3))),256))]),n("div",k3,[e.options?.isAdmin||e.options?.isOwner?(l(),d("a",{key:0,class:"btn btn-sm","aria-label":"Edit",href:e.safeUrl("/anonymize/"+e.repoId)},[...t[10]||(t[10]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),n("span",{class:"d-none d-md-inline"}," Edit",-1)])],8,E3)):p("v-if",!0),e.type=="html-doc"&&!e.showSource?(l(),d("button",{key:1,class:A(["btn btn-sm",{"btn-active":e.allowScripts}]),"aria-label":"Allow this document to run JavaScript",title:"Scripts in this file are blocked by default. Enable them only if you trust the repository \u2014 the document stays isolated from your session either way.",onClick:t[4]||(t[4]=r=>e.toggleAllowScripts())},[t[11]||(t[11]=n("i",{class:"fab fa-js"},null,-1)),n("span",C3,u(e.allowScripts?"JS on":"JS off"),1)],2)):p("v-if",!0),e.type=="html-doc"?(l(),d("button",{key:2,class:"btn btn-sm","aria-label":"Toggle between the rendered document and its source",title:"Toggle between the rendered document and its source",onClick:t[5]||(t[5]=r=>e.toggleSource())},[(l(),d("svg",_3,[n("use",{href:e.showSource?"#project-icon-eye":"#ui-icon-code"},null,8,S3)])),n("span",N3,u(e.showSource?"Rendered":"Source"),1)])):p("v-if",!0),N(n("a",{target:"_self",class:"btn btn-sm","aria-label":"View raw current file",title:"View the raw content of the current file",href:e.safeUrl(e.url)},[...t[12]||(t[12]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-file"})],-1),n("span",{class:"d-none d-md-inline"}," Raw",-1)])],8,D3),[[G,e.content!=null]]),N(n("a",{target:"_self",class:"btn btn-sm","aria-label":"Download current file",title:"Download the current file",href:e.safeUrl(e.url+"&download=true")},[...t[13]||(t[13]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-download"})],-1),n("span",{class:"d-none d-md-inline"}," Download",-1)])],8,R3),[[G,e.content!=null]]),e.options?.download?(l(),d("a",{key:3,target:"_self",class:"btn btn-sm","aria-label":"Download full repository as ZIP",title:"Download the full repository as a ZIP archive",href:e.safeUrl("/api/repo/"+e.repoId+"/zip")},[...t[14]||(t[14]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-archive"})],-1),n("span",{class:"d-none d-md-inline"}," Full repo ZIP",-1)])],8,T3)):p("v-if",!0),e.options?.hasWebsite?(l(),d("a",{key:4,target:"_self",class:"btn btn-sm","aria-label":"Website",href:e.safeUrl("/w/"+e.repoId+"/")},[...t[15]||(t[15]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-globe"})],-1),n("span",{class:"d-none d-md-inline"}," Website",-1)])],8,A3)):p("v-if",!0)])]),n("div",O3,[_e(i,{name:"partials/pageView.htm",state:e.viewState},null,8,["state"])])])])}var P3={class:"paper-faq"};function Dl(e,t){return l(),d("div",P3,[...t[0]||(t[0]=[pe('
Help

Answers to the questions that come up most.

If something's missing, write to us \u2014 report a bug on GitHub.

',1),n("div",{class:"paper-faq-body"},[n("aside",{class:"paper-faq-toc"},[n("div",{class:"paper-faq-toc-head"},"Contents"),n("nav",null,[n("a",{href:"#faq-general"},"General"),n("a",{href:"#faq-plans"},"Plans and billing"),n("a",{href:"#faq-features"},"Features"),n("a",{href:"#faq-limitations"},"Limitations"),n("a",{href:"#faq-privacy"},"Privacy & Security"),n("a",{href:"#faq-hosting"},"Self-Hosting")])]),n("section",{class:"faq-section","aria-label":"FAQs"},[n("div",null,[p(" General "),n("h4",{class:"faq-cat"},[n("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[n("use",{href:"#ui-icon-info"})]),y("General ")]),n("div",{class:"panel-group",id:"faq-general",role:"tablist","aria-multiselectable":"true"},[n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingWhatIs"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#whatIs","aria-expanded":"false","aria-controls":"whatIs"}," What is Anonymous GitHub? ")])]),n("div",{id:"whatIs",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingWhatIs"},[n("div",{class:"panel-body p-3"},[n("p",null," Anonymous GitHub is an open-source tool with free hosting and optional paid plans that anonymizes GitHub repositories and pull requests for double-anonymous (double-blind) peer review. It replaces identifying information \u2014 such as the repository owner, organization name, and custom terms \u2014 so that reviewers cannot determine the identity of the authors through the code repository. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingHowWork"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#howWork","aria-expanded":"false","aria-controls":"howWork"}," How does Anonymous GitHub work? ")])]),n("div",{id:"howWork",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingHowWork"},[n("div",{class:"panel-body p-3"},[n("p",null," Anonymous GitHub either downloads the complete repository and anonymizes the content, or proxies requests to GitHub on the fly. In both cases, the original and anonymized versions of files are cached on the server. The system automatically detects and replaces the repository owner, organization name, and repository name. You can also specify additional custom terms to anonymize using one-per-line regex patterns. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingScope"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#scope","aria-expanded":"false","aria-controls":"scope"}," What is the scope of anonymization? ")])]),n("div",{id:"scope",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingScope"},[n("div",{class:"panel-body p-3"},[n("p",null," In double-anonymous peer review, the boundary of anonymization is the paper plus its online appendix \u2014 not the entire internet. Searching for any part of the paper or the online appendix can be considered a deliberate attempt to break anonymity. Anonymous GitHub anonymizes the repository owner, organization, repository name, file and directory names, and file contents across all text-based file types. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingCost"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-general",href:"#cost","aria-expanded":"false","aria-controls":"cost"}," How much does it cost? ")])]),n("div",{id:"cost",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingCost"},[n("div",{class:"panel-body p-3"},[n("p",null," A free account includes 5 owned repositories and 2 GiB of source files. Optional paid plans offer more capacity, automatic refresh, and, with an author subscription, never-expiring repositories. Reviewers can read shared repositories without an account or payment. "),n("p",null,[y(" See "),n("a",{href:"/profile#settings-billing"},"Plans and billing"),y(" for available plans and current prices. Offers depend on whether payments are enabled on this instance; the checkout shows the amount before you pay. Subscriptions help fund hosting, storage, backups, and continued maintenance. ")]),n("p",null,[y(" You can also support development through "),n("a",{href:"https://github.com/sponsors/tdurieux/",target:"_blank",rel:"noopener"},"GitHub Sponsors"),y(" or "),n("a",{href:"https://ko-fi.com/tdurieux",target:"_blank",rel:"noopener"},"Ko-fi"),y(". Donations are separate from subscriptions and do not automatically unlock paid features. ")])])])])]),p(" Plans and billing "),n("h4",{class:"faq-cat",id:"faq-plans-title"},"Plans and billing"),n("div",{class:"panel-group",id:"faq-plans",role:"tablist","aria-label":"Plans and billing","aria-multiselectable":"true"},[n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingFreePlan"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#freePlan","aria-expanded":"false","aria-controls":"freePlan"},"What is included in a free account?")])]),n("div",{id:"freePlan",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingFreePlan"},[n("div",{class:"panel-body p-3"},[n("p",null,"The default free allowance is 5 repositories you own and 2 GiB of source files in total. Core anonymization and reviewer access remain free. You can manually refresh a repository within your allowance and choose a dated expiration up to one year ahead."),n("p",null,"Repositories shared with you as a coauthor do not use your own slots. Gists and pull requests are not included in these repository quotas. The usage shown in your account is the allowance available on this instance.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingAuthorPlans"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#authorPlans","aria-expanded":"false","aria-controls":"authorPlans"},"What do monthly and annual author subscriptions include?")])]),n("div",{id:"authorPlans",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingAuthorPlans"},[n("div",{class:"panel-body p-3"},[n("p",null,[y("Both include 20 owned repositories and 10 GiB of source files in total. They also allow automatic refresh when enabled in repository settings and let the owner choose "),n("strong",null,"Never expire"),y(".")]),n("p",null,[y("Monthly and annual plans offer the same features with different billing periods. They renew automatically until you cancel renewal. Current prices are shown in "),n("a",{href:"/profile#settings-billing"},"Plans and billing"),y(".")]),n("p",null,"Paid plans do not change how anonymization works. File-size limits and other service safeguards still apply. Review your anonymized content before sharing it.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingReviewPass"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#reviewPass","aria-expanded":"false","aria-controls":"reviewPass"},"Can I pay for one repository without subscribing?")])]),n("div",{id:"reviewPass",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingReviewPass"},[n("div",{class:"panel-body p-3"},[n("p",null,"The author review pass covers one selected repository for 180 days, with a separate 2 GiB allowance and automatic refresh when enabled. It is a one-time purchase and does not renew automatically."),n("p",null,[y("Enter the anonymized ID of an existing repository you own in "),n("a",{href:"/profile#settings-billing"},"Plans and billing"),y(". A pass does not unlock Never expire and does not override the repository's chosen expiration date.")])])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingConferencePlans"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#conferencePlans","aria-expanded":"false","aria-controls":"conferencePlans"},"Can a conference or lab pay for a group?")])]),n("div",{id:"conferencePlans",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingConferencePlans"},[n("div",{class:"panel-body p-3"},[n("p",null,"A conference review package provides a shared allowance of 100 repositories and 50 GiB for a review window of up to 180 days. The organizer pays once; the package does not renew automatically. A lab organizing a review can use this shared package too."),n("p",null,"The paid conference must be activated by payment before authors can submit under its Conference ID. Eligible repositories use the conference allowance before an author's personal allowance, so authors do not each need a subscription for that capacity."),n("p",null,"The package has a fixed review window. Never expire still requires the repository owner's monthly or annual author subscription. See the available offer when creating a conference.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingPaidCoauthors"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#paidCoauthors","aria-expanded":"false","aria-controls":"paidCoauthors"},"Does every coauthor need to pay?")])]),n("div",{id:"paidCoauthors",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingPaidCoauthors"},[n("div",{class:"panel-body p-3"},[n("p",null,"No. Coauthors can collaborate without buying a subscription. A shared repository uses its owner's allowance, unless a repository pass or paid conference covers it. It does not consume each coauthor's personal allowance."),n("p",null,"A coauthor's subscription does not increase the owner's allowance. If the owner's available capacity is exhausted, a coauthor's refresh or edit may also be blocked. Reviewers never need a paid account.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingCapacity"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#capacity","aria-expanded":"false","aria-controls":"capacity"},"What counts toward my allowance, and what happens at the limit?")])]),n("div",{id:"capacity",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingCapacity"},[n("div",{class:"panel-body p-3"},[n("p",null,"The repository limit counts work you own. Storage counts the source-file sizes reserved for those repositories, not just files a reviewer opens. Archived or failed repositories can still reserve capacity, and a refresh does not automatically reduce a previous storage reservation."),n("p",null,"At the repository limit you cannot add another repository to that allowance. An edit or refresh must also fit the available storage. Remove work you no longer need, choose a paid plan, or use an eligible conference allowance."),n("p",null,"Removing a repository releases its reservation when capacity is next checked. Expired repositories may continue to reserve capacity until cleanup. Reaching a limit does not itself delete existing review links.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingNeverExpire"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#neverExpire","aria-expanded":"false","aria-controls":"neverExpire"},"What happens to Never expire repositories if I stop subscribing?")])]),n("div",{id:"neverExpire",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingNeverExpire"},[n("div",{class:"panel-body p-3"},[n("p",null,[y("Never expire is available to monthly and annual author subscribers. If paid access ends, these repositories remain available for a "),n("strong",null,"90-day grace period"),y(", then expire and their hosted content is removed.")]),n("p",null,"Renewing during the grace period keeps them active. After expiration, you must renew and explicitly reactivate the repository; restoring content also requires access to its GitHub source. A repository does not become public on GitHub when it expires."),n("p",null,"Existing never-expiring repositories created before this billing policy retain their settings. Never expire is not a guarantee of perpetual service availability.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingCancelPlan"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#cancelPlan","aria-expanded":"false","aria-controls":"cancelPlan"},"How do I cancel, and what happens after paid access ends?")])]),n("div",{id:"cancelPlan",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingCancelPlan"},[n("div",{class:"panel-body p-3"},[n("p",null,[y("Open "),n("a",{href:"/profile#settings-billing"},"Plans and billing"),y(" and choose "),n("strong",null,"Manage billing and invoices"),y(" to manage renewal. Cancelling renewal keeps subscription benefits until the end of the paid period.")]),n("p",null,"After paid access ends, repositories fall back to another eligible allowance or the free allowance. Automatic refresh pauses on the free allowance; manual refresh remains available within its limits. Existing review links keep their configured expiration dates, except paid Never expire repositories, which follow the 90-day grace period described above."),n("p",null,"A repository pass or conference package ends after its paid window without automatic renewal.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingPaymentHandling"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-plans",href:"#paymentHandling","aria-expanded":"false","aria-controls":"paymentHandling"},"How are payments handled?")])]),n("div",{id:"paymentHandling",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingPaymentHandling"},[n("div",{class:"panel-body p-3"},[n("p",null,[y("Stripe processes checkout and billing management. Anonymous GitHub does not store your card details. You can access billing management and invoices from "),n("a",{href:"/profile#settings-billing"},"Plans and billing"),y(".")]),n("p",null,[y("Paid access is activated after payment is confirmed. If checkout succeeds but your account has not updated, choose "),n("strong",null,"Refresh payment status"),y(" before trying another purchase. If paid plans are unavailable on this instance, no checkout is offered.")])])])])]),p(" Features "),n("h4",{class:"faq-cat"},[n("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[n("use",{href:"#project-icon-filter"})]),y("Features ")]),n("div",{class:"panel-group",id:"faq-features",role:"tablist","aria-multiselectable":"true"},[n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingFormats"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#formats","aria-expanded":"false","aria-controls":"formats"}," Which file formats are supported? ")])]),n("div",{id:"formats",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingFormats"},[n("div",{class:"panel-body p-3"},[n("p",null," Anonymous GitHub can display and render a wide variety of file types: "),n("ul",null,[n("li",null,[n("strong",null,"Text and source code"),y(" \u2014 displayed with syntax highlighting")]),n("li",null,[n("strong",null,"Markdown"),y(" \u2014 rendered as formatted HTML")]),n("li",null,[n("strong",null,"Images"),y(" (PNG, JPG, SVG, etc.) \u2014 displayed inline")]),n("li",null,[n("strong",null,"PDFs"),y(" \u2014 rendered directly in the browser")]),n("li",null,[n("strong",null,"Jupyter Notebooks"),y(" \u2014 rendered with code cells and outputs")])]),n("p",null," Only text-based files are anonymized. Anonymous GitHub analyzes the content of each file to determine whether it is textual or binary. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingPR"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#pullRequests","aria-expanded":"false","aria-controls":"pullRequests"}," Can I anonymize pull requests? ")])]),n("div",{id:"pullRequests",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingPR"},[n("div",{class:"panel-body p-3"},[n("p",null," Yes. In addition to full repositories, Anonymous GitHub supports anonymizing individual pull requests. Simply paste the URL of a GitHub pull request when creating a new anonymized repository, and the system will automatically detect that it is a pull request and anonymize it accordingly. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingConference"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#conference","aria-expanded":"false","aria-controls":"conference"}," What is the Conference ID feature? ")])]),n("div",{id:"conference",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingConference"},[n("div",{class:"panel-body p-3"},[n("p",null," When creating an anonymized repository, you can associate it with a Conference ID. This allows conferences to define default anonymization settings (such as expiration dates) that are automatically applied to repositories submitted under that conference. If your conference provides a Conference ID, enter it during the anonymization setup. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingExpiration"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#expiration","aria-expanded":"false","aria-controls":"expiration"}," What happens when an anonymized repository expires? ")])]),n("div",{id:"expiration",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingExpiration"},[n("div",{class:"panel-body p-3"},[n("p",null," You can configure one of three expiration strategies when creating your anonymized repository: "),n("ul",null,[n("li",null,[n("strong",null,"Never expire"),y(": with a monthly or annual author subscription, no scheduled expiration while subscribed. A 90-day grace period applies after paid access ends. See "),n("a",{href:"#neverExpire"},"the subscription expiration policy"),y(".")]),n("li",null,[n("strong",null,"Redirect to GitHub"),y(" \u2014 after expiration, visitors are redirected to the original GitHub repository.")]),n("li",null,[n("strong",null,"Remove content"),y(" \u2014 after expiration, the anonymized content is deleted from the server.")])])])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingDownload"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#download","aria-expanded":"false","aria-controls":"download"}," Can I download an anonymized repository? ")])]),n("div",{id:"download",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingDownload"},[n("div",{class:"panel-body p-3"},[n("p",null," Yes. Anonymized repositories can be downloaded as a ZIP file. This is useful if reviewers want to build or test the code locally. The downloaded archive contains the fully anonymized version of the repository. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingUpdates"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#updates","aria-expanded":"false","aria-controls":"updates"}," Are updates to the original repository reflected in the anonymized version? ")])]),n("div",{id:"updates",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingUpdates"},[n("div",{class:"panel-body p-3"},[n("p",null," You can refresh the anonymized repository from GitHub without creating a new share link. Free accounts can request a manual refresh within their allowance. Automatic refresh requires an eligible paid allowance and must be enabled in repository settings. It pauses when the repository falls back to the free allowance. "),n("p",null," After changing files or contributor names, review your anonymization terms before sharing the updated content. If GitHub access is revoked or the source is deleted, the service cannot fetch updates. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingCLI"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-features",href:"#cli","aria-expanded":"false","aria-controls":"cli"}," Is there a command-line tool? ")])]),n("div",{id:"cli",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingCLI"},[n("div",{class:"panel-body p-3"},[n("p",null," Yes. Anonymous GitHub provides a CLI tool that lets you anonymize repositories locally, generating an anonymized ZIP file on your machine. Install it via npm: "),n("pre",{style:{"background-color":"var(--hover-bg-color)",padding:"12px","border-radius":"4px","margin-top":"8px",color:"var(--color)"}},[n("code",null,`npm install -g @tdurieux/anonymous_github +anonymous_github`)])])])])]),p(" Limitations "),n("h4",{class:"faq-cat"},[n("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[n("use",{href:"#ui-icon-warning"})]),y("Limitations ")]),n("div",{class:"panel-group",id:"faq-limitations",role:"tablist","aria-multiselectable":"true"},[n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingLimitation"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-limitations",href:"#limitation","aria-expanded":"false","aria-controls":"limitation"}," What are the limitations of Anonymous GitHub? ")])]),n("div",{id:"limitation",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingLimitation"},[n("div",{class:"panel-body p-3"},[n("ul",null,[n("li",null," Anonymous GitHub only anonymizes text-based files. Binary files (compiled executables, archives, etc.) are served as-is without anonymization. "),n("li",null," Files larger than 8 MB are not supported. "),n("li",null," Static site generators (such as Jekyll) used with GitHub Pages are not fully supported, although Markdown files are converted to HTML. "),n("li",null," The anonymization of terms within source code may change the behavior of the program (e.g., if a replaced term appears in a string literal or identifier). ")])])])])]),p(" Privacy & Security "),n("h4",{class:"faq-cat"},[n("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})]),y("Privacy & Security ")]),n("div",{class:"panel-group",id:"faq-privacy",role:"tablist","aria-multiselectable":"true"},[n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingData"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-privacy",href:"#data","aria-expanded":"false","aria-controls":"data"}," How is my data handled? ")])]),n("div",{id:"data",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingData"},[n("div",{class:"panel-body p-3"},[n("p",null," Repository data is used to provide the anonymization service. If you purchase a plan, Stripe processes payment and billing information. When a repository is removed or expires, only its configuration is retained \u2014 this makes it easy to restore the repository if needed and ensures that no future repository reuses the same ID. ")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingPermissions"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-privacy",href:"#permissions","aria-expanded":"false","aria-controls":"permissions"}," Why does GitHub say Anonymous GitHub asks for write access? ")])]),n("div",{id:"permissions",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingPermissions"},[n("div",{class:"panel-body p-3"},[n("p",null,[y("The GitHub App has read-only access to the repositories you choose. You can change repository access on your "),n("a",{href:"/connections"},"GitHub connections"),y(" page.")]),n("p",null,"Legacy GitHub OAuth includes write access to private repositories because GitHub's OAuth scopes do not offer a read-only option for them. Existing OAuth anonymizations and gists can still use this connection."),n("p",null,"Anonymous GitHub reads repository content. It never pushes, modifies, or deletes files on GitHub.")])])]),n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingViewer"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-privacy",href:"#viewer","aria-expanded":"false","aria-controls":"viewer"}," Can repository owners see who viewed their anonymized repository? ")])]),n("div",{id:"viewer",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingViewer"},[n("div",{class:"panel-body p-3"},[n("p",null," No. Only the total number of views is tracked as an incremental counter. It is not possible for the repository owner or for Anonymous GitHub to identify individual viewers. Reviewer anonymity is fully preserved. ")])])])]),p(" Self-Hosting "),n("h4",{class:"faq-cat"},[n("svg",{class:"ui-icon mr-2","aria-hidden":"true"},[n("use",{href:"#project-icon-storage"})]),y("Self-Hosting ")]),n("div",{class:"panel-group",id:"faq-hosting",role:"tablist","aria-multiselectable":"true"},[n("div",{class:"panel panel-default mb-3"},[n("div",{class:"panel-heading p-3",role:"tab",id:"headingDeploy"},[n("h3",{class:"panel-title"},[n("a",{class:"collapsed",role:"button","data-toggle":"collapse","data-parent":"#faq-hosting",href:"#deploy","aria-expanded":"false","aria-controls":"deploy"}," Can I deploy my own instance? ")])]),n("div",{id:"deploy",class:"panel-collapse collapse",role:"tabpanel","aria-labelledby":"headingDeploy"},[n("div",{class:"panel-body p-3"},[n("p",null,[y(" Yes. Anonymous GitHub is fully open source (GPL-3.0) and supports Docker-based deployment. Billing is optional and disabled by default for self-hosted instances; paid hosted plans are not required to run your own server. You will need to configure a GitHub OAuth app and provide a GitHub token. Detailed setup instructions are available on the "),n("a",{href:"https://github.com/tdurieux/anonymous_github/",target:"_blank"},"GitHub repository"),y(". ")]),n("p",null," The basic steps are: "),n("ol",null,[n("li",null,"Clone the repository and install dependencies"),n("li",null,[y("Create a "),n("code",null,".env"),y(" file with your GitHub token, OAuth client ID, and client secret")]),n("li",null,[y("Run "),n("code",null,"docker-compose up -d")])])])])])]),n("div",{class:"text-center mt-5 mb-5 p-4",style:{"background-color":"var(--hover-bg-color)","border-radius":"8px"}},[n("p",{class:"mb-2",style:{"font-size":"1.1rem"}}," Still have questions? "),n("p",{class:"text-muted mb-0"},[y(" Open an issue on the "),n("a",{href:"https://github.com/tdurieux/anonymous_github/issues",target:"_blank"},"GitHub repository"),y(" and we'll be happy to help. ")])])])])],-1)])])}var I3={class:"pr-page"},V3={class:"container paper-page pr-page-inner"},q3={class:"pr-header"},M3={class:"pr-title-row"},$3={class:"paper-page-title pr-title"},L3=["textContent"],U3={key:1,class:"text-muted"},F3=["href"],B3={class:"pr-header-meta"},z3={key:0,class:"pr-meta-item"},H3=["textContent"],j3={key:1,class:"pr-meta-item"},G3=["textContent"],W3={key:2,class:"pr-meta-item"},K3=["textContent"],Y3={key:0,class:"paper-tabs",role:"tablist"},Q3=["aria-selected","tabindex"],J3=["textContent"],X3=["aria-selected","tabindex"],Z3=["textContent"],x3={class:"paper-tab-content"},eI={key:0,role:"tabpanel",id:"gist-files-panel","aria-labelledby":"gist-files-tab"},tI={class:"pr-comments"},nI={class:"pr-comment"},oI={class:"pr-comment-head"},sI=["textContent"],iI={key:0,class:"pr-comment-date"},rI={key:0,class:"paper-table-empty"},aI={key:1,role:"tabpanel",id:"gist-comments-panel","aria-labelledby":"gist-comments-tab"},lI={class:"pr-comments"},dI={class:"pr-comment"},uI={class:"pr-comment-head"},cI={key:0,class:"pr-comment-author"},pI=["textContent"],fI=["textContent"],hI={key:0,class:"pr-comment-body"},mI={key:0,class:"paper-table-empty"};function Rl(e,t){let s=We("gist-file"),i=We("markdown");return l(),d("div",I3,[n("div",V3,[t[17]||(t[17]=n("div",{class:"paper-crumbs"},[n("a",{href:"/dashboard"},"Reviewer"),y(" \xA0/\xA0 "),n("span",{class:"here"},"Gist")],-1)),n("header",q3,[n("div",M3,[n("h1",$3,[e.details?.description?(l(),d("span",{key:0,textContent:u(e.details?.description)},null,8,L3)):p("v-if",!0),e.details?.description?p("v-if",!0):(l(),d("span",U3,"Untitled gist"))]),e.options?.isAdmin||e.options?.isOwner?(l(),d("a",{key:0,class:"btn btn-sm","aria-label":"Edit",href:e.safeUrl("/gist-anonymize/"+e.gistId)},[...t[4]||(t[4]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),n("span",{class:"d-none d-md-inline"}," Edit",-1)])],8,F3)):p("v-if",!0)]),n("div",B3,[n("span",{class:A(["paper-pill",{good:e.details?.isPublic,warn:!e.details?.isPublic}])},u(e.details?.isPublic?"Public":"Secret"),3),e.details?.ownerLogin?(l(),d("span",z3,[t[5]||(t[5]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user"})],-1)),t[6]||(t[6]=y(" @",-1)),n("span",{textContent:u(e.details?.ownerLogin)},null,8,H3)])):p("v-if",!0),e.details?.updatedDate?(l(),d("span",j3,[t[7]||(t[7]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),t[8]||(t[8]=y()),n("span",{textContent:u(e.fmt?.date(e.details?.updatedDate))},null,8,G3)])):p("v-if",!0),e.details?.anonymizeDate?(l(),d("span",W3,[t[9]||(t[9]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1)),t[10]||(t[10]=y(" Anonymized ",-1)),n("span",{textContent:u(e.fmt?.date(e.details?.anonymizeDate))},null,8,K3)])):p("v-if",!0)])]),e.details?.files&&e.details?.files?.length||e.details?.comments&&e.details?.comments?.length?(l(),d("nav",Y3,[e.details?.files?(l(),d("button",{key:0,class:A(["paper-tab",{active:e.tabState?.active=="files"}]),type:"button",role:"tab",id:"gist-files-tab","aria-selected":e.tabState?.active==="files","aria-controls":"gist-files-panel",tabindex:e.tabState?.active==="files"?0:-1,onKeydown:t[0]||(t[0]=o=>e.previewTabKeydown(o)),onClick:t[1]||(t[1]=o=>e.tabState.active="files")},[t[11]||(t[11]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-type-gist"})],-1)),n("span",{textContent:u(e.fmt.plural(e.details?.files?.length,{0:"No files",one:"1 file",other:"{} files"}))},null,8,J3)],42,Q3)):p("v-if",!0),e.details?.comments?(l(),d("button",{key:1,class:A(["paper-tab",{active:e.tabState?.active=="comments"}]),type:"button",role:"tab",id:"gist-comments-tab","aria-selected":e.tabState?.active==="comments","aria-controls":"gist-comments-panel",tabindex:e.tabState?.active==="comments"?0:-1,onKeydown:t[2]||(t[2]=o=>e.previewTabKeydown(o)),onClick:t[3]||(t[3]=o=>e.tabState.active="comments")},[t[12]||(t[12]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-comment"})],-1)),n("span",{textContent:u(e.fmt.plural(e.details?.comments?.length,{0:"No comments",one:"1 comment",other:"{} comments"}))},null,8,Z3)],42,X3)):p("v-if",!0)])):p("v-if",!0),n("div",x3,[e.details?.files&&e.tabState?.active=="files"?(l(),d("div",eI,[n("ul",tI,[(l(!0),d(W,null,Z(e.details?.files,(o,r)=>(l(),d("li",nI,[n("div",oI,[n("strong",{textContent:u(o?.filename)},null,8,sI),o?.language?(l(),d("span",iI,u(o?.language),1)):p("v-if",!0)]),_e(s,{file:o},null,8,["file"])]))),256)),e.details?.files?.length?p("v-if",!0):(l(),d("li",rI,[...t[13]||(t[13]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-file"})],-1),n("span",null,"No files in this gist.",-1)])]))])])):p("v-if",!0),e.details?.comments&&e.tabState?.active=="comments"?(l(),d("div",aI,[n("ul",lI,[(l(!0),d(W,null,Z(e.details?.comments,(o,r)=>(l(),d("li",dI,[n("div",uI,[o?.author?(l(),d("span",cI,[t[14]||(t[14]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user"})],-1)),t[15]||(t[15]=y(" @",-1)),n("span",{textContent:u(o?.author)},null,8,pI)])):p("v-if",!0),o?.updatedDate?(l(),d("span",{key:1,class:"pr-comment-date",textContent:u(e.fmt?.date(o?.updatedDate))},null,8,fI)):p("v-if",!0)]),o?.body?(l(),d("div",hI,[_e(i,{content:o?.body},null,8,["content"])])):p("v-if",!0)]))),256)),e.details?.comments?.length?p("v-if",!0):(l(),d("li",mI,[...t[16]||(t[16]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-comment"})],-1),n("span",null,"No comments on this gist.",-1)])]))])])):p("v-if",!0)])])])}var vI={class:"collapse navbar-collapse",id:"navbarSupportedContent"},gI={class:"navbar-nav mr-auto smooth-scroll"},yI={key:0,class:"nav-item"},bI={key:1,class:"nav-item"},wI={key:2,class:"nav-item"},kI={key:3,class:"nav-item"},EI={class:"nav-item"},CI={key:4,class:"nav-item"},_I={class:"navbar-nav"},SI={key:0,class:"nav-item"},NI={key:1,class:"nav-item"},DI={key:2,class:"nav-item"},RI={key:3,class:"nav-item"},TI={key:4,class:"nav-item dropdown user-chip-wrap"},AI={class:"nav-link user-chip dropdown-toggle",href:"#",id:"navbarDropdownMenuLink",role:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},OI=["src"],PI={class:"user-chip-name"},II={class:"dropdown-menu dropdown-menu-right user-menu","aria-labelledby":"navbarDropdownMenuLink"},VI={class:"dropdown-header"},qI=["innerHTML"];function Tl(e,t){return l(),d(W,null,[n("nav",{class:A(["navbar navbar-expand-lg",{"navbar-dark":e.isDarkMode}])},[t[14]||(t[14]=pe('Anonymous GitHubSupport',3)),n("div",vI,[n("ul",gI,[e.user?p("v-if",!0):(l(),d("li",yI,[n("a",{class:A(["nav-link",{active:e.path=="/"}]),href:"/"}," Home ",2)])),e.user?(l(),d("li",bI,[n("a",{class:A(["nav-link",{active:e.path=="/dashboard"}]),href:"/dashboard"},[...t[3]||(t[3]=[n("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-grid"})],-1),y(" My work ",-1)])],2)])):p("v-if",!0),e.user?(l(),d("li",wI,[n("a",{class:A(["nav-link",{active:e.path=="/anonymize"||e.path=="/pull-request-anonymize"}]),href:"/anonymize"},[...t[4]||(t[4]=[n("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1),y(" Anonymize ",-1)])],2)])):p("v-if",!0),e.user?(l(),d("li",kI,[n("a",{class:A(["nav-link",{active:e.path=="/conferences"}]),href:"/conferences"},[...t[5]||(t[5]=[n("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[n("use",{href:"#project-icon-conference"})],-1),y(" Conferences ",-1)])],2)])):p("v-if",!0),n("li",EI,[n("a",{class:A(["nav-link",{active:e.path=="/faq"}]),href:"/faq"},[...t[6]||(t[6]=[n("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-help"})],-1),y("FAQ",-1)])],2)]),e.user&&e.user?.isAdmin?(l(),d("li",CI,[n("a",{class:A(["nav-link",{active:e.path?.indexOf("/admin")===0}]),href:"/admin/"},[...t[7]||(t[7]=[n("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[n("use",{href:"#project-icon-filter"})],-1),y(" Admin ",-1)])],2)])):p("v-if",!0)]),n("ul",_I,[t[12]||(t[12]=n("li",{class:"nav-item"},[n("a",{class:"nav-link nav-icon",target:"_blank",href:"https://github.com/tdurieux/anonymous_github/",title:"Anonymous GitHub source code","aria-label":"Anonymous GitHub source code on GitHub",rel:"noopener","data-offset":"30"},[n("i",{class:"fab fa-github","aria-hidden":"true"})])],-1)),p(` "Report a bug" is about this service. Reviewers who land on an anonymized repository often think it is about the paper, so the - label names the service and the tooltip says who to contact. `),t[12]||(t[12]=o("li",{class:"nav-item d-none d-lg-block"},[o("a",{class:"nav-link",target:"_blank",rel:"noopener",href:"https://github.com/tdurieux/anonymous_github/issues/new?template=issue_report.yml",title:"Report a problem with the Anonymous GitHub service. Questions about an anonymized repository or paper go to its authors.","data-offset":"30"},[o("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-bug"})]),b("Report a bug ")])],-1)),e.isDarkMode?p("v-if",!0):(l(),d("li",Y4,[o("a",{class:"nav-link nav-icon",href:"#",title:"Switch to dark mode","aria-label":"Switch to dark mode",role:"button",onClick:t[0]||(t[0]=me(n=>{e.darkMode(!0)},["prevent"]))},[...t[7]||(t[7]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-moon"})],-1)])])])),e.isDarkMode?(l(),d("li",J4,[o("a",{class:"nav-link nav-icon",href:"#",title:"Switch to light mode","aria-label":"Switch to light mode",role:"button",onClick:t[1]||(t[1]=me(n=>{e.darkMode(!1)},["prevent"]))},[...t[8]||(t[8]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-sun"})],-1)])])])):p("v-if",!0),e.user?p("v-if",!0):(l(),d("li",Q4,[...t[9]||(t[9]=[o("a",{class:"nav-link btn-signin",target:"_self",href:"/signin","data-offset":"30"},[o("i",{class:"fab fa-github mr-1"}),b(" Sign in ")],-1)])])),e.user?(l(),d("li",X4,[o("a",Z4,[e.user?.photo?(l(),d("img",{key:0,width:"22",height:"22",class:"rounded-circle",src:e.safeUrl(e.user?.photo)},null,8,x4)):p("v-if",!0),o("span",e3,c(e.user?.username),1)]),o("div",t3,[o("h6",o3,"Signed in as @"+c(e.user?.username),1),t[10]||(t[10]=ce('SettingsDefaults, quotas, accountGitHub connectionsRepository access and OAuthClaim an anonymizationAttach an existing mirror to your accountReport a bugAbout this service, not a paperSource codeSupport the projectSign out',9))])])):p("v-if",!0)])])],2),e.generalMessage?(l(),d("div",{key:0,class:"navbar shadow generalMessage",innerHTML:e.sanitize(e.generalMessage)},null,8,s3)):p("v-if",!0)],64)}var n3={class:"paper-landing"},r3={class:"paper-hero"},i3={class:"paper-hero-copy"},a3={class:"paper-cta-row"},l3={key:0,href:"/signin",target:"_self",class:"btn-hero"},d3={key:1,href:"/anonymize",class:"btn-hero"},u3={class:"paper-stats paper-wrap",id:"metrics","aria-label":"Usage over the last 60 days"},c3={class:"paper-stats-grid"},p3={class:"paper-stat-value"},f3={class:"paper-stat-label"},m3=["viewBox"],h3=["x","y","width","height"],v3={key:1,class:"paper-stat-delta"},g3={class:"paper-features paper-wrap","aria-label":"Product features"},y3={class:"paper-features-list",role:"tablist","aria-label":"Features","aria-orientation":"vertical"},b3=["onClick","onKeydown","id","aria-controls","aria-selected","tabindex"],w3={class:"paper-eyebrow"},k3={class:"paper-feature-title"},E3={class:"paper-feature-more"},C3={class:"paper-feature-title paper-feature-title-m","aria-hidden":"true"},_3=["href","target"],S3={class:"paper-features-stage"},N3=["id","aria-labelledby"],D3={class:"paper-frame"},R3={class:"paper-frame-bar","aria-hidden":"true"},T3={class:"url"},A3=["src","alt"],O3={class:"paper-footer"},I3={class:"paper-footer-inner"},P3={class:"paper-footer-col"},V3={key:0,href:"/dashboard"},q3={key:1,href:"/conferences"},M3={class:"paper-footer-foot"};function Dl(e,t){return l(),d("div",n3,[p(" Hero: copy on the left, the product on the right "),o("section",r3,[o("div",i3,[t[2]||(t[2]=o("div",{class:"paper-eyebrow"},"For double-blind peer review",-1)),t[3]||(t[3]=o("h1",{class:"hero-title"},[b(" Share the code,"),o("br"),o("span",{class:"accent"},"not the author.")],-1)),t[4]||(t[4]=o("p",{class:"hero-subtitle"}," Anonymous GitHub makes a read-only mirror of your repository, pull request, or gist. It redacts the terms you choose in text files, so reviewers can browse your artifact through an anonymous link. ",-1)),o("div",a3,[e.user?p("v-if",!0):(l(),d("a",l3,[...t[0]||(t[0]=[o("i",{class:"fab fa-github mr-2","aria-hidden":"true"},null,-1),b("Sign in with GitHub ",-1)])])),e.user?(l(),d("a",d3," Anonymize a repository \u2192 ")):p("v-if",!0),t[1]||(t[1]=o("a",{class:"paper-link-arrow",target:"_self",href:"https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/"},"See an anonymized repository \u2192",-1))]),t[5]||(t[5]=o("ul",{class:"paper-reassure"},[o("li",null,"Free and open source"),o("li",null,"Read-only: never writes to your repos"),o("li",null,"Expires on the date you set")],-1))]),t[6]||(t[6]=ce('
A reviewer preview with the author, affiliation, and email replaced by anonymous terms
',1))]),p(" Proof "),t[16]||(t[16]=ce('
Trusted by authors at
ICSEFSEOOPSLA
',1)),p(" Live stats "),o("section",u3,[t[7]||(t[7]=o("div",{class:"paper-stats-meta"},[o("div",{class:"paper-stats-meta-left"},"Live \xB7 last 60 days"),o("div",{class:"paper-stats-meta-right"},[o("span",{class:"paper-stats-dot","aria-hidden":"true"}),b(" updated daily ")])],-1)),o("div",c3,[(l(!0),d(X,null,re(e.cards,(n,r)=>(l(),d("div",{class:"paper-stat-card",key:n?.key},[o("div",p3,c(e.fmt?.bigNum(n?.total)),1),o("div",f3,c(n?.label),1),e.history[n?.key].bars?.length>1?(l(),d("svg",{key:0,class:"paper-stat-bars",preserveAspectRatio:"none","aria-hidden":"true",viewBox:"0 0 "+e.history[n?.key].viewW+" 36"},[(l(!0),d(X,null,re(e.history[n?.key].bars,(s,i)=>(l(),d("rect",{key:i,class:T({"is-latest":i===e.history[n.key].bars.length-1}),x:s?.x,y:s?.y,width:s?.w,height:s?.h},null,10,h3))),128))],8,m3)):p("v-if",!0),e.history[n?.key].bars?.length>1?(l(),d("div",v3," +"+c(e.fmt?.number(e.history[n?.key].deltaToday))+" today ",1)):p("v-if",!0)]))),128))])]),p(" Before / after "),t[17]||(t[17]=o("section",{class:"paper-section-head paper-wrap"},[o("div",null,[o("div",{class:"paper-eyebrow"},"Before \xB7 after"),o("h2",null,[b("The same repository, "),o("em",null,"minus you.")])]),o("p",null," Names, affiliations, emails, and any term you list are replaced across the README, source files, notebooks, and PDF links. Reviewers browse the real thing, not a zip. ")],-1)),t[18]||(t[18]=o("div",{class:"paper-preview paper-wrap","aria-label":"Before and after example"},[o("div",{class:"pane"},[o("div",{class:"pane-header"},[o("span",{class:"pane-label"},"Before \xB7 your repo"),o("span",{class:"pane-url"},"github.com/jane-smith/DeepLearnUtils")]),o("div",{class:"pane-body"},[o("div",null,[o("span",{class:"tok"},"#"),b(),o("strong",null,"DeepLearnUtils")]),o("div",null,"Developed by Jane Smith at MIT CSAIL."),o("div",null,"See Smith et\xA0al., \u201CAttention That Works,\u201D 2026."),o("div",null,"Contact: jane.smith@mit.edu")])]),o("div",{class:"pane"},[o("div",{class:"pane-header"},[o("span",{class:"pane-label"},"After \xB7 anonymous mirror"),o("span",{class:"pane-url"},"anonymous.4open.science/r/paper-7f2a")]),o("div",{class:"pane-body"},[o("div",null,[o("span",{class:"tok"},"#"),b(),o("strong",null,"DeepLearnUtils")]),o("div",null,[b("Developed by "),o("span",{class:"redact",role:"img","aria-label":"redacted author name"},"XXXX-1"),b(" at "),o("span",{class:"redact",role:"img","aria-label":"redacted affiliation"},"XXXX-2"),b(".")]),o("div",null,[b("See "),o("span",{class:"redact",role:"img","aria-label":"redacted author name"},"XXXX-1"),b(" et\xA0al., \u201CAttention That Works,\u201D 2026.")]),o("div",null,[b("Contact: "),o("span",{class:"redact",role:"img","aria-label":"redacted email address"},"XXXX-3")])])])],-1)),p(" What you get: one screenshot, three tabs "),t[19]||(t[19]=o("section",{class:"paper-section-head paper-wrap",id:"about"},[o("div",null,[o("div",{class:"paper-eyebrow"},"What you get"),o("h2",null,[b("Anonymize, review, "),o("em",null,"manage.")])]),o("p",null," Terms are redacted in text files. Enabled images and PDFs are served unchanged, so review them for identifying content before sharing. Monitor your mirror, update it, or remove it when the review is over. ")],-1)),o("section",g3,[o("div",y3,[(l(!0),d(X,null,re(e.features,(n,r)=>(l(),d("div",{class:T(["paper-feature",{"is-on":e.feature===n?.key}]),key:n?.key},[o("button",{type:"button",class:"paper-feature-tab",role:"tab",onClick:s=>e.selectFeature(n.key),onKeydown:s=>e.featureKeydown(s,r),id:"feature-tab-"+n?.key,"aria-controls":"feature-panel-"+n?.key,"aria-selected":e.feature===n?.key,tabindex:e.feature===n?.key?0:-1},[o("span",w3,c(n?.num)+" \xB7 "+c(n?.eyebrow),1),o("span",k3,[b(c(n?.title)+" ",1),o("em",null,c(n?.accent),1)])],40,b3),o("div",E3,[o("span",C3,[b(c(n?.title)+" ",1),o("em",null,c(n?.accent),1)]),o("p",null,c(n?.text),1),o("a",{class:"paper-link-arrow",href:e.safeUrl(e.featureHref(n)),target:e.featureTarget(n)},c(n?.cta)+" \u2192",9,_3)])],2))),128))]),o("div",S3,[(l(!0),d(X,null,re(e.features,(n,r)=>N((l(),d("div",{class:"paper-feature-panel",role:"tabpanel",key:n?.key,id:"feature-panel-"+n?.key,"aria-labelledby":"feature-tab-"+n?.key},[o("div",D3,[o("div",R3,[t[8]||(t[8]=o("span",{class:"dots"},[o("i"),o("i"),o("i")],-1)),o("span",T3,c(n?.url),1)]),o("div",{class:T("paper-crop paper-crop-"+n?.key)},[o("img",{loading:"lazy",width:"2880",height:"1800",src:e.safeUrl(n?.img),alt:n?.alt},null,8,A3)],2)])],8,N3)),[[Y,e.feature===n?.key]])),128))])]),p(" FAQ teaser "),t[20]||(t[20]=ce('
Before you sign in

The questions that come up most.

Read the full FAQ \u2192
What access does GitHub sign-in require?

The GitHub App has read-only access to gists and the repositories you choose. Legacy OAuth uses broader permissions. Anonymous GitHub never writes to your repositories.

Which file formats are supported?

Source code with syntax highlighting, Markdown, Jupyter notebooks, PDFs, images, and GitHub Pages sites. Text files are anonymized; enabled images and PDFs are served unchanged.

What happens when an anonymized repository expires?

You choose: the mirror is removed, or visitors are redirected to the original GitHub repository once the review is over.

',1)),o("footer",O3,[o("div",I3,[t[12]||(t[12]=o("div",{class:"paper-footer-brand"},[o("div",{class:"paper-footer-mark"},[b("Anonymous "),o("em",null,"GitHub")]),o("p",{class:"paper-footer-tag"}," A read-only, identity-stripped mirror of your repository, built for double-anonymous peer review. ")],-1)),o("div",P3,[t[9]||(t[9]=o("div",{class:"paper-footer-head"},"Product",-1)),t[10]||(t[10]=o("a",{href:"/anonymize"},"Anonymize",-1)),e.user?(l(),d("a",V3,"My work")):p("v-if",!0),e.user?(l(),d("a",q3,"Conferences")):p("v-if",!0),t[11]||(t[11]=o("a",{href:"/faq"},"FAQ",-1))]),t[13]||(t[13]=ce('',2))]),t[15]||(t[15]=o("div",{class:"paper-footer-rule"},null,-1)),o("div",M3,[o("span",null,"\xA9 "+c(e.year||2026)+" Anonymous GitHub \xB7 GPL-3.0 licensed",1),t[14]||(t[14]=o("span",{class:"paper-footer-meta"},"Built for reviewers, by researchers.",-1))])])])}var L3={class:"paper-empty"},$3={class:"paper-empty-inner"},U3={key:0,class:"paper-eyebrow"},F3={key:1,class:"paper-eyebrow"},z3={key:2,class:"paper-empty-title"},H3=["textContent"];function Rl(e,t){return l(),d("div",L3,[o("div",$3,[e.error?p("v-if",!0):(l(),d("div",U3,"Working")),e.error?(l(),d("div",F3,"Error")):p("v-if",!0),e.error?p("v-if",!0):(l(),d("h1",z3,[...t[0]||(t[0]=[b(" Loading",-1),o("span",{class:"dot-anim"},"\u2026",-1)])])),e.error?(l(),d("h1",{key:3,class:"paper-empty-title",textContent:c(e.fmt.translate(e.error))},null,8,H3)):p("v-if",!0)])])}var B3={class:"container paper-page paper-settings"},j3={class:"paper-crumbs"},G3={class:"here"},W3={class:"paper-page-title"},K3={class:"paper-settings-body"},Y3={class:"paper-settings-toc"},J3={href:"#conf-billing"},Q3={class:"form needs-validation paper-settings-main",name:"conference",novalidate:""},X3={id:"conf-basics",class:"paper-settings-section"},Z3={class:"form-group"},x3={class:"invalid-feedback"},eP={class:"invalid-feedback"},tP={class:"form-group"},oP={class:"invalid-feedback"},sP={class:"form-group"},nP={class:"invalid-feedback"},rP={class:"invalid-feedback"},iP={id:"conf-window",class:"paper-settings-section"},aP={class:"form-grid-2"},lP={class:"form-group"},dP={class:"invalid-feedback"},uP={class:"invalid-feedback"},cP={class:"form-group"},pP={class:"invalid-feedback"},fP={class:"invalid-feedback"},mP={id:"conf-rendering",class:"paper-settings-section"},hP={class:"form-check"},vP={class:"form-check-input",type:"checkbox",id:"link",name:"link"},gP={class:"form-check"},yP={class:"form-check-input",type:"checkbox",id:"image",name:"image"},bP={class:"form-check"},wP={class:"form-check-input",type:"checkbox",id:"pdf",name:"pdf"},kP={class:"form-check"},EP={class:"form-check-input",type:"checkbox",id:"notebook",name:"notebook"},CP={id:"conf-features",class:"paper-settings-section"},_P={class:"form-check"},SP={class:"form-check-input",type:"checkbox",id:"update",name:"update"},NP={class:"form-check"},DP={class:"form-check-input",type:"checkbox",id:"page",name:"page"},RP={id:"conf-plan",class:"paper-settings-section"},TP={class:"paper-plan-grid"},AP=["value"],OP=["textContent"],IP={class:"paper-plan-price"},PP=["innerHTML"],VP={key:0,id:"conf-billing",class:"paper-settings-section"},qP={class:"form-group"},MP={class:"form-group"},LP={class:"form-group"},$P={class:"form-group"},UP={class:"form-grid-3"},FP={class:"form-group"},zP={class:"form-group"},HP={class:"form-group"},BP={class:"form-group"},jP={class:"paper-settings-footer"},GP=["textContent"],WP=["textContent"],KP=["disabled"];function Tl(e,t){let n=be("paper-scrollspy"),r=be("field"),s=be("form");return l(),d("div",B3,[o("div",j3,[t[1]||(t[1]=o("a",{href:"/dashboard"},"My work",-1)),t[2]||(t[2]=b(" \xA0/\xA0 ",-1)),t[3]||(t[3]=o("a",{href:"/conferences"},"Conferences",-1)),t[4]||(t[4]=b(" \xA0/\xA0 ",-1)),o("span",G3,c(e.editionMode?"Edit":"New"),1)]),o("h1",W3,[b(c(e.editionMode?"Edit":"Create a")+" ",1),t[5]||(t[5]=o("em",null,"conference",-1))]),t[42]||(t[42]=o("p",{class:"paper-page-lede"}," Give chairs access to every anonymization submitted to a venue, and lift author quotas during the review window. ",-1)),o("div",K3,[N((l(),d("aside",Y3,[t[7]||(t[7]=o("div",{class:"paper-settings-toc-head"},"On this page",-1)),o("nav",null,[t[6]||(t[6]=ce('BasicsReview windowRendering defaultsFeaturesPlan',5)),N(o("a",J3,"Billing",512),[[Y,e.plan?.pricePerRepo>0]])])])),[[n]]),N((l(),d("form",Q3,[o("section",X3,[t[12]||(t[12]=o("div",{class:"paper-section-eyebrow"},"Basics",-1)),o("div",Z3,[t[8]||(t[8]=o("label",{class:"paper-field-label",for:"name"},"Conference name",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.name?.invalid&&(e.conference?.name?.touched||e.conference?.submitted)}]),name:"name",id:"name",required:"",placeholder:"e.g. International Conference on Software Engineering"},null,2),[[r,{state:e.viewState,set:i=>{e.options.name=i},value:e.options?.name,form:"conference",options:{}}]]),N(o("div",x3," The name of the conference is invalid. ",512),[[Y,e.conference?.name?.errors?.invalid]]),N(o("div",eP," The name of the conference is required. ",512),[[Y,e.conference?.name?.errors?.required]])]),o("div",tP,[t[9]||(t[9]=o("label",{class:"paper-field-label",for:"url"},"Website",-1)),N(o("input",{type:"url",class:T(["form-control",{"is-invalid":e.conference?.url?.invalid&&(e.conference?.url?.touched||e.conference?.submitted)}]),name:"url",id:"url",placeholder:"https://example.org"},null,2),[[r,{state:e.viewState,set:i=>{e.options.url=i},value:e.options?.url,form:"conference",options:{}}]]),N(o("div",oP," The url of the conference is invalid. ",512),[[Y,e.conference?.url?.errors?.url]])]),o("div",sP,[t[10]||(t[10]=o("label",{class:"paper-field-label",for:"conferenceID"},"Conference ID",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.conferenceID?.invalid&&(e.conference?.conferenceID?.touched||e.conference?.submitted)}]),name:"conferenceID",id:"conferenceID",required:"",pattern:"[a-zA-Z0-9\\-_]{3,10}",placeholder:"ICSE26"},null,2),[[r,{state:e.viewState,set:i=>{e.options.conferenceID=i},value:e.options?.conferenceID,form:"conference",options:{}}]]),t[11]||(t[11]=o("small",{class:"form-text text-muted"},[b("3\u201310 characters, letters, numbers, "),o("code",null,"-"),b(" and "),o("code",null,"_"),b(". Authors reference this when they anonymize.")],-1)),N(o("div",{class:"invalid-feedback"}," The conference ID '"+c(e.options?.conferenceID)+"' is already used. ",513),[[Y,e.conference?.conferenceID?.errors?.used]]),N(o("div",nP," The conference ID is required. ",512),[[Y,e.conference?.conferenceID?.errors?.required]]),N(o("div",rP," The format of the conference ID is incorrect ([a-zA-Z0-9-_]{3,10}). ",512),[[Y,e.conference?.conferenceID?.errors?.pattern]])])]),o("section",iP,[t[17]||(t[17]=o("div",{class:"paper-section-eyebrow"},"Review window",-1)),o("div",aP,[o("div",lP,[t[13]||(t[13]=o("label",{class:"paper-field-label",for:"startDate"},"Start date",-1)),N(o("input",{type:"date",class:T(["form-control",{"is-invalid":e.conference?.startDate?.invalid&&(e.conference?.startDate?.touched||e.conference?.submitted)}]),name:"startDate",id:"startDate",required:""},null,2),[[r,{state:e.viewState,set:i=>{e.options.startDate=i},value:e.options?.startDate,form:"conference",options:{}}]]),t[14]||(t[14]=o("small",{class:"form-text text-muted"},"Beginning of the review process.",-1)),N(o("div",dP," Start date is required. ",512),[[Y,e.conference?.startDate?.errors?.required]]),N(o("div",uP," Start date must be before end date. ",512),[[Y,e.conference?.startDate?.errors?.invalid]])]),o("div",cP,[t[15]||(t[15]=o("label",{class:"paper-field-label",for:"endDate"},"End date",-1)),N(o("input",{type:"date",class:T(["form-control",{"is-invalid":e.conference?.endDate?.invalid&&(e.conference?.endDate?.touched||e.conference?.submitted)}]),name:"endDate",id:"endDate",required:""},null,2),[[r,{state:e.viewState,set:i=>{e.options.endDate=i},value:e.options?.endDate,form:"conference",options:{}}]]),t[16]||(t[16]=o("small",{class:"form-text text-muted"},"All repositories expire on this date.",-1)),N(o("div",pP," End date is required. ",512),[[Y,e.conference?.endDate?.errors?.required]]),N(o("div",fP," End date is invalid. ",512),[[Y,e.conference?.endDate?.errors?.invalid]])])])]),o("section",mP,[t[25]||(t[25]=o("div",{class:"paper-section-eyebrow"},"Rendering defaults",-1)),o("div",hP,[N(o("input",vP,null,512),[[r,{state:e.viewState,set:i=>{e.options.options.link=i},value:e.options?.options?.link,form:"conference",options:{}}]]),t[18]||(t[18]=o("label",{class:"form-check-label",for:"link"},"Keep links",-1)),t[19]||(t[19]=o("small",{class:"form-text text-muted"},"Keep or remove all links from text files.",-1))]),o("div",gP,[N(o("input",yP,null,512),[[r,{state:e.viewState,set:i=>{e.options.options.image=i},value:e.options?.options?.image,form:"conference",options:{}}]]),t[20]||(t[20]=o("label",{class:"form-check-label",for:"image"},"Display images",-1)),t[21]||(t[21]=o("small",{class:"form-text text-muted"},"Images are not anonymized.",-1))]),o("div",bP,[N(o("input",wP,null,512),[[r,{state:e.viewState,set:i=>{e.options.options.pdf=i},value:e.options?.options?.pdf,form:"conference",options:{}}]]),t[22]||(t[22]=o("label",{class:"form-check-label",for:"pdf"},"Display PDFs",-1)),t[23]||(t[23]=o("small",{class:"form-text text-muted"},"PDFs are not anonymized.",-1))]),o("div",kP,[N(o("input",EP,null,512),[[r,{state:e.viewState,set:i=>{e.options.options.notebook=i},value:e.options?.options?.notebook,form:"conference",options:{}}]]),t[24]||(t[24]=o("label",{class:"form-check-label",for:"notebook"},"Display Notebooks",-1))])]),o("section",CP,[t[30]||(t[30]=o("div",{class:"paper-section-eyebrow"},"Features",-1)),o("div",_P,[N(o("input",SP,null,512),[[r,{state:e.viewState,set:i=>{e.options.options.update=i},value:e.options?.options?.update,form:"conference",options:{}}]]),t[26]||(t[26]=o("label",{class:"form-check-label",for:"update"},"Auto-update from GitHub",-1)),t[27]||(t[27]=o("small",{class:"form-text text-muted"},"Pull the latest commit automatically (hourly maximum).",-1))]),o("div",NP,[N(o("input",DP,null,512),[[r,{state:e.viewState,set:i=>{e.options.options.page=i},value:e.options?.options?.page,form:"conference",options:{}}]]),t[28]||(t[28]=o("label",{class:"form-check-label",for:"page"},"GitHub Pages",-1)),t[29]||(t[29]=o("small",{class:"form-text text-muted"},"Enable anonymized GitHub pages.",-1))])]),o("section",RP,[t[32]||(t[32]=o("div",{class:"paper-section-eyebrow"},"Plan",-1)),t[33]||(t[33]=o("p",{class:"paper-section-copy"},"Billed per repository per month, prorated by the day for as long as a repository stays in the conference.",-1)),o("div",TP,[(l(!0),d(X,null,re(e.plans,(i,a)=>(l(),d("label",{class:T(["paper-plan-card",{selected:e.options?.plan?.planID==i?.id}])},[N(o("input",{type:"radio",name:"planPicker",value:i?.id},null,8,AP),[[r,{state:e.viewState,set:u=>{e.options.plan.planID=u},value:e.options?.plan?.planID,form:"conference",options:{}}]]),o("div",{class:"paper-plan-head",textContent:c(i?.name)},null,8,OP),o("div",IP,[b(c(e.fmt?.number(i?.pricePerRepo))+"\u20AC ",1),t[31]||(t[31]=o("span",{class:"paper-plan-per"},"/ repo / month",-1))]),o("div",{class:"paper-plan-desc",innerHTML:e.sanitize(i?.description)},null,8,PP)],2))),256))])]),e.plan?.pricePerRepo>0?(l(),d("section",VP,[t[41]||(t[41]=o("div",{class:"paper-section-eyebrow"},"Billing",-1)),o("div",qP,[t[34]||(t[34]=o("label",{class:"paper-field-label",for:"billing_name"},"Name",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.billing_name?.invalid&&(e.conference?.billing_name?.touched||e.conference?.submitted)}]),name:"billing_name",id:"billing_name",required:"",placeholder:"First & last name"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.name=i},value:e.options?.billing?.name,form:"conference",options:{}}]])]),o("div",MP,[t[35]||(t[35]=o("label",{class:"paper-field-label",for:"email"},"Email",-1)),N(o("input",{type:"email",class:T(["form-control",{"is-invalid":e.conference?.email?.invalid&&(e.conference?.email?.touched||e.conference?.submitted)}]),name:"email",id:"email",required:"",placeholder:"you@example.org"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.email=i},value:e.options?.billing?.email,form:"conference",options:{}}]])]),o("div",LP,[t[36]||(t[36]=o("label",{class:"paper-field-label",for:"inputAddress"},"Address",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.inputAddress?.invalid&&(e.conference?.inputAddress?.touched||e.conference?.submitted)}]),name:"inputAddress",id:"inputAddress",required:"",placeholder:"1234 Main St"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.address=i},value:e.options?.billing?.address,form:"conference",options:{}}]])]),o("div",$P,[N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.inputAddress2?.invalid&&(e.conference?.inputAddress2?.touched||e.conference?.submitted)}]),name:"inputAddress2",id:"inputAddress2",placeholder:"Apartment, studio, or floor"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.address2=i},value:e.options?.billing?.address2,form:"conference",options:{}}]])]),o("div",UP,[o("div",FP,[t[37]||(t[37]=o("label",{class:"paper-field-label",for:"city"},"City",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.city?.invalid&&(e.conference?.city?.touched||e.conference?.submitted)}]),name:"city",id:"city",required:"",placeholder:"City"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.city=i},value:e.options?.billing?.city,form:"conference",options:{}}]])]),o("div",zP,[t[38]||(t[38]=o("label",{class:"paper-field-label",for:"country"},"Country",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.country?.invalid&&(e.conference?.country?.touched||e.conference?.submitted)}]),name:"country",id:"country",required:"",placeholder:"Country"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.country=i},value:e.options?.billing?.country,form:"conference",options:{}}]])]),o("div",HP,[t[39]||(t[39]=o("label",{class:"paper-field-label",for:"zip"},"Zip",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.zip?.invalid&&(e.conference?.zip?.touched||e.conference?.submitted)}]),name:"zip",id:"zip",required:"",placeholder:"Zip"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.zip=i},value:e.options?.billing?.zip,form:"conference",options:{}}]])])]),o("div",BP,[t[40]||(t[40]=o("label",{class:"paper-field-label",for:"vat"},"VAT number",-1)),N(o("input",{type:"text",class:T(["form-control",{"is-invalid":e.conference?.vat?.invalid&&(e.conference?.vat?.touched||e.conference?.submitted)}]),name:"vat",id:"vat",placeholder:"VAT Number"},null,2),[[r,{state:e.viewState,set:i=>{e.options.billing.vat=i},value:e.options?.billing?.vat,form:"conference",options:{}}]])])])):p("v-if",!0),o("div",jP,[e.error?(l(),d("div",{key:0,class:"alert alert-danger",role:"alert",textContent:c(e.error)},null,8,GP)):p("v-if",!0),e.message?(l(),d("div",{key:1,class:"alert alert-success",role:"alert",textContent:c(e.message)},null,8,WP)):p("v-if",!0),o("button",{id:"send",disabled:e.saving,type:"submit",class:"btn btn-ink",onClick:t[0]||(t[0]=me(i=>e.submitForm(i,()=>{e.submit(i)}),["prevent"]))},c(e.saving?e.editionMode?"Updating\u2026":"Creating\u2026":e.editionMode?"Update conference":"Create conference"),9,KP)])])),[[s,e.viewState]])])])}var YP={key:0},JP=["innerHTML"],QP={key:3},XP=["src"],ZP=["src"],xP={key:7},eV={controls:"controls"},tV=["src"],oV={key:8},sV={key:9,class:"file-error container d-flex h-100"},nV={class:"paper-ratelimit-card m-auto",style:{"max-width":"520px"}},rV={class:"paper-error-msg"},iV={key:10,class:"file-error container d-flex h-100"},aV=["textContent"],lV={key:11,class:"file-error container d-flex h-100"},dV={key:12,class:"file-error container d-flex h-100"},uV={key:13,class:"file-error container d-flex h-100"},cV={key:14,class:"file-error container d-flex h-100"},pV={class:"paper-empty-title m-auto"},fV=["href"];function Al(e,t){let n=We("html-doc"),r=We("pdfviewer"),s=We("notebook"),i=be("code-editor");return l(),d(X,null,[e.type=="text"?N((l(),d("div",YP,null,512)),[[i,{content:e.content,options:e.aceOption}]]):p("v-if",!0),e.type=="html"?(l(),d("div",{key:1,class:"file-content markdown-body",innerHTML:e.sanitize(e.content)},null,8,JP)):p("v-if",!0),e.type=="html-doc"&&!e.showSource&&e.content!=null?(l(),Lt(n,{key:2,content:e.content,"base-url":e.fileBaseUrl,"allow-scripts":e.allowScripts},null,8,["content","base-url","allow-scripts"])):p("v-if",!0),(e.type=="code"||e.type=="html-doc"&&e.showSource)&&e.content!=null?N((l(),d("div",QP,null,512)),[[i,{content:e.content,options:e.aceOption}]]):p("v-if",!0),e.type=="image"?(l(),d("img",{key:4,class:"image-content",src:e.safeUrl(e.url)},null,8,XP)):p("v-if",!0),e.type=="media"?(l(),d("iframe",{key:5,class:"h-100 overflow-auto w-100 b-0",src:e.safeUrl(e.url)},null,8,ZP)):p("v-if",!0),e.type=="pdf"?(l(),Lt(r,{key:6,src:e.safeUrl(e.url)},null,8,["src"])):p("v-if",!0),e.type=="audio"?(l(),d("div",xP,[o("audio",eV,[o("source",{src:e.safeUrl(e.url)},null,8,tV)])])):p("v-if",!0),e.type=="IPython"?(l(),d("div",oV,[Ce(s,{file:e.url,content:e.content},null,8,["file","content"])])):p("v-if",!0),e.type=="rate_limited"?(l(),d("div",sV,[o("div",nV,[t[2]||(t[2]=ce('
Temporarily paused
GitHub API rate limit reached
',1)),o("p",rV,[t[0]||(t[0]=b("This repository will be available in ",-1)),o("strong",null,c(e.rateLimitCountdown),1),t[1]||(t[1]=b(". The page will reload automatically.",-1))])])])):p("v-if",!0),e.type=="error"?(l(),d("div",iV,[o("h1",{class:"paper-empty-title m-auto",textContent:c(e.fmt.translate("ERRORS."+e.content))},null,8,aV)])):p("v-if",!0),e.type=="loading"&&!e.error?(l(),d("div",lV,[...t[3]||(t[3]=[o("h1",{class:"paper-empty-title m-auto"},"Loading\u2026",-1)])])):p("v-if",!0),e.type=="empty"?(l(),d("div",dV,[...t[4]||(t[4]=[o("h1",{class:"paper-empty-title m-auto"},[b("Empty "),o("em",null,"repository"),b(".")],-1)])])):p("v-if",!0),e.content==null&&e.type!="empty"?(l(),d("div",uV,[...t[5]||(t[5]=[o("h1",{class:"paper-empty-title m-auto"},[b("Empty "),o("em",null,"file"),b(".")],-1)])])):p("v-if",!0),e.type=="binary"?(l(),d("div",cV,[o("h1",pV,[t[6]||(t[6]=b("Unsupported ",-1)),t[7]||(t[7]=o("em",null,"binary file",-1)),t[8]||(t[8]=b(". You can ",-1)),o("a",{target:"_blank",href:e.safeUrl(e.url+"&download=true")},"download it",8,fV),t[9]||(t[9]=b(".",-1))])])):p("v-if",!0)],64)}var mV={class:"container page dashboard-page paper-page"},hV={class:"row"},vV={class:"w-100"},gV={class:"w-100","aria-label":"Pull Requests","accept-charset":"UTF-8"},yV={class:"d-flex flex-column flex-md-row align-items-md-center",style:{gap:"8px"}},bV={class:"flex-grow-1"},wV={type:"search",id:"search",class:"form-control","aria-label":"Find a pull request...",placeholder:"Find a pull request...",autocomplete:"off"},kV={class:"d-flex flex-wrap",style:{gap:"6px"}},EV={class:"dropdown"},CV={class:"dropdown-menu","aria-labelledby":"dropdownSort"},_V={class:"form-check dropdown-item"},SV={class:"form-check-input",type:"radio",name:"sort",id:"sortFullName",value:"fullName"},NV={class:"form-check dropdown-item"},DV={class:"form-check-input",type:"radio",name:"sort",id:"sortAnonymizeDate",value:"-anonymizeDate"},RV={class:"form-check dropdown-item"},TV={class:"form-check-input",type:"radio",name:"sort",id:"sortStatus",value:"-status"},AV={class:"form-check dropdown-item"},OV={class:"form-check-input",type:"radio",name:"sort",id:"sortLastView",value:"-lastView"},IV={class:"form-check dropdown-item"},PV={class:"form-check-input",type:"radio",name:"sort",id:"sortPageView",value:"-pageView"},VV={class:"dropdown"},qV={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},MV={class:"form-check dropdown-item"},LV={class:"form-check-input",type:"checkbox",name:"sort",id:"statusReady",value:"ready"},$V={class:"form-check dropdown-item"},UV={class:"form-check-input",type:"checkbox",name:"sort",id:"statusExpired",value:"expired"},FV={class:"form-check dropdown-item"},zV={class:"form-check-input",type:"checkbox",name:"sort",id:"statusRemoved",value:"removed"},HV={class:"d-flex flex-wrap mt-2",style:{gap:"6px"}},BV={class:"filter-chip"},jV=["onClick"],GV={class:"repo-list w-100"},WV={class:"repo-list-item-content"},KV={class:"repo-list-item-main"},YV={class:"repo-list-item-header"},JV=["textContent","href"],QV=["textContent"],XV=["textContent"],ZV={class:"repo-source"},xV=["href"],e5={class:"repo-date"},t5={class:"repo-meta"},o5={key:0,title:"Conference"},s5=["title"],n5=["title"],r5=["title"],i5={key:1},a5={class:"repo-list-item-actions"},l5={class:"dropdown"},d5={class:"dropdown-menu dropdown-menu-right"},u5=["href"],c5=["onClick"],p5=["onClick"],f5=["onClick"],m5=["href"],h5={key:0,class:"repo-list-empty"};function Ol(e,t){let n=be("field"),r=be("form");return l(),d("div",mV,[o("div",hV,[o("div",vV,[t[12]||(t[12]=ce('
My work \xA0/\xA0 Pull requests

Anonymized pull requests

Track PR mirrors you\u2019ve created and their reviewer traffic.

',2)),p(" Search + filters row "),N((l(),d("form",gV,[o("div",yV,[o("div",bV,[N(o("input",wV,null,512),[[n,{state:e.viewState,set:s=>{e.search=s},value:e.search,form:null,options:{}}]])]),o("div",kV,[o("div",EV,[t[6]||(t[6]=o("button",{class:"btn btn-sm dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"}," Sort ",-1)),o("div",CV,[t[5]||(t[5]=o("h6",{class:"dropdown-header"},"Select order",-1)),o("div",_V,[N(o("input",SV,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[0]||(t[0]=o("label",{class:"form-check-label",for:"sortFullName"},"Pull Request",-1))]),o("div",NV,[N(o("input",DV,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[1]||(t[1]=o("label",{class:"form-check-label",for:"sortAnonymizeDate"},"Anonymize Date",-1))]),o("div",RV,[N(o("input",TV,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[2]||(t[2]=o("label",{class:"form-check-label",for:"sortStatus"},"Status",-1))]),o("div",AV,[N(o("input",OV,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[3]||(t[3]=o("label",{class:"form-check-label",for:"sortLastView"},"Last View",-1))]),o("div",IV,[N(o("input",PV,null,512),[[n,{state:e.viewState,set:s=>{e.orderBy=s},value:e.orderBy,form:null,options:{}}]]),t[4]||(t[4]=o("label",{class:"form-check-label",for:"sortPageView"},"Page View",-1))])])]),o("div",VV,[t[11]||(t[11]=o("button",{class:"btn btn-sm dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"}," Status ",-1)),o("div",qV,[t[10]||(t[10]=o("h6",{class:"dropdown-header"},"Select status",-1)),o("div",MV,[N(o("input",LV,null,512),[[n,{state:e.viewState,set:s=>{e.filters.status.ready=s},value:e.filters?.status?.ready,form:null,options:{}}]]),t[7]||(t[7]=o("label",{class:"form-check-label",for:"statusReady"},"Ready",-1))]),o("div",$V,[N(o("input",UV,null,512),[[n,{state:e.viewState,set:s=>{e.filters.status.expired=s},value:e.filters?.status?.expired,form:null,options:{}}]]),t[8]||(t[8]=o("label",{class:"form-check-label",for:"statusExpired"},"Expired",-1))]),o("div",FV,[N(o("input",zV,null,512),[[n,{state:e.viewState,set:s=>{e.filters.status.removed=s},value:e.filters?.status?.removed,form:null,options:{}}]]),t[9]||(t[9]=o("label",{class:"form-check-label",for:"statusRemoved"},"Removed",-1))])])])])])])),[[r,e.viewState]]),p(" Active filter chips "),N(o("div",HV,[(l(!0),d(X,null,re(e.filters?.status,(s,i,a)=>N((l(),d("span",BV,[b(c(e.fmt?.title(i))+" ",1),o("button",{type:"button",class:"filter-chip-close","aria-label":"Remove filter",onClick:u=>{e.filters.status[i]=!0}}," \xD7 ",8,jV)],512)),[[Y,!s]])),256))],512),[[Y,e.filters?.status?.ready===!1||e.filters?.status?.expired===!1||e.filters?.status?.removed===!1]])]),p(" Pull request list "),o("ul",GV,[(l(!0),d(X,null,re(e.filteredPullRequests,(s,i)=>(l(),d("li",{class:T(["repo-list-item",{"repo-inactive":s?.status=="expired"||s?.status=="removed"||s?.status=="error"}])},[o("div",WV,[o("div",KV,[o("div",YV,[o("a",{class:"repo-name",textContent:c(s?.pullRequestId),href:e.safeUrl("/pr/"+s?.pullRequestId)},null,8,JV),o("span",{class:T(["status-badge",{"status-removed":s?.status=="removed"||s?.status=="expired"||s?.status=="removing"||s?.status=="expiring","status-preparing":s?.status=="preparing"||s?.status=="download","status-ready":s?.status=="ready","status-error":s?.status=="error"}])},[o("span",{textContent:c(e.fmt?.title(s?.status))},null,8,QV),s?.status=="error"?(l(),d("span",{key:0,textContent:c(": "+s?.statusMessage)},null,8,XV)):p("v-if",!0)],2)]),o("div",ZV,[o("span",null,[t[13]||(t[13]=o("i",{class:"fab fa-github","aria-hidden":"true"},null,-1)),o("a",{href:e.safeUrl("https://github.com/"+s?.source?.repositoryFullName+"/pull/"+s?.source?.pullRequestId)},c(s?.source?.repositoryFullName)+"#"+c(s?.source?.pullRequestId),9,xV)]),o("span",{class:T(["status-badge",{"status-ready":s?.merged,"status-removed":s?.state=="open","status-error":s?.state=="closed"&&!s?.merged}]),style:{"font-size":"10px"}},c(e.fmt?.title(s?.merged?"merged":s?.state)),3),o("span",e5,"anonymized "+c(e.fmt?.humanTime(s?.anonymizeDate)),1)])]),o("div",t5,[s?.conference?(l(),d("span",o5,[t[14]||(t[14]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-conference"})],-1)),b(" "+c(s?.conference),1)])):p("v-if",!0),o("span",{"data-toggle":"tooltip","data-placement":"bottom",title:"Terms: "+s?.options?.terms?.join(", ")},[t[15]||(t[15]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1)),b(" "+c(e.fmt?.number(s?.options?.terms?.length)),1)],8,s5),o("span",{"data-toggle":"tooltip","data-placement":"bottom",title:"Views: "+e.fmt?.number(s?.pageView)},[t[16]||(t[16]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1)),b(" "+c(e.fmt?.number(s?.pageView)),1)],8,n5),o("span",{"data-toggle":"tooltip","data-placement":"bottom",title:"Last view: "+e.fmt?.date(s?.lastView)},[t[17]||(t[17]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-calendar"})],-1)),b(" "+c(e.fmt?.humanTime(s?.lastView)),1)],8,r5),s?.options?.expirationMode!="never"&&s?.status=="ready"?(l(),d("span",i5,[t[18]||(t[18]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),b(" Expire: "+c(e.fmt?.humanTime(s?.options?.expirationDate)),1)])):p("v-if",!0)])]),o("div",a5,[o("div",l5,[t[24]||(t[24]=o("button",{class:"btn btn-sm dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"}," Actions ",-1)),o("div",d5,[o("a",{class:"dropdown-item",href:e.safeUrl("/pull-request-anonymize/"+s?.pullRequestId)},[...t[19]||(t[19]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit ",-1)])],8,u5),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.updatePullRequest(s),["prevent"])},[...t[20]||(t[20]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-refresh"})],-1),b(" Force update ",-1)])],8,c5),[[Y,s?.status=="ready"||s?.status=="error"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.updatePullRequest(s),["prevent"])},[...t[21]||(t[21]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-check-circle"})],-1),b(" Enable ",-1)])],8,p5),[[Y,s?.status=="removed"]]),N(o("a",{class:"dropdown-item",href:"#",onClick:me(a=>e.removePullRequest(s),["prevent"])},[...t[22]||(t[22]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1),b(" Remove ",-1)])],8,f5),[[Y,s?.status=="ready"]]),o("a",{class:"dropdown-item",href:e.safeUrl("/pr/"+s?.pullRequestId+"/")},[...t[23]||(t[23]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" View PR ",-1)])],8,m5)])])])],2))),256)),e.filteredPullRequests?.length==0?(l(),d("li",h5,[...t[25]||(t[25]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-inbox"})],-1),o("span",null,"No pull requests to display.",-1)])])):p("v-if",!0)])])])}var v5={class:"container paper-page paper-settings"},g5={class:"paper-settings-body"},y5={class:"paper-settings-toc"},b5={class:"paper-settings-main"},w5={id:"settings-quota",class:"paper-settings-section"},k5={key:1,class:"quota-row","aria-hidden":"true"},E5={class:"quota-item"},C5={id:"settings-terms",class:"paper-settings-section"},_5={class:"form-group"},S5={class:"form-control",id:"terms",name:"terms",rows:"4",placeholder:`Jane Smith + label names the service and the tooltip says who to contact. `),t[13]||(t[13]=n("li",{class:"nav-item d-none d-lg-block"},[n("a",{class:"nav-link",target:"_blank",rel:"noopener",href:"https://github.com/tdurieux/anonymous_github/issues/new?template=issue_report.yml",title:"Report a problem with the Anonymous GitHub service. Questions about an anonymized repository or paper go to its authors.","data-offset":"30"},[n("svg",{class:"ui-icon d-lg-none mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-bug"})]),y("Report a bug ")])],-1)),e.isDarkMode?p("v-if",!0):(l(),d("li",SI,[n("a",{class:"nav-link nav-icon",href:"#",title:"Switch to dark mode","aria-label":"Switch to dark mode",role:"button",onClick:t[0]||(t[0]=ue(s=>{e.darkMode(!0)},["prevent"]))},[...t[8]||(t[8]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-moon"})],-1)])])])),e.isDarkMode?(l(),d("li",NI,[n("a",{class:"nav-link nav-icon",href:"#",title:"Switch to light mode","aria-label":"Switch to light mode",role:"button",onClick:t[1]||(t[1]=ue(s=>{e.darkMode(!1)},["prevent"]))},[...t[9]||(t[9]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-sun"})],-1)])])])):p("v-if",!0),e.user?p("v-if",!0):(l(),d("li",DI,[...t[10]||(t[10]=[n("a",{class:"nav-link btn-signin",target:"_self",href:"/signin","data-offset":"30"},[n("i",{class:"fab fa-github mr-1"}),y(" Sign in ")],-1)])])),e.user?.username&&e.headerCanUpgrade&&!e.headerBillingPending?(l(),d("li",RI,[n("a",{class:"nav-link nav-upgrade",href:"/profile?upgrade=1",onClick:t[2]||(t[2]=ue(s=>e.openHeaderUpgrade(),["prevent"]))},"Upgrade")])):p("v-if",!0),e.user?(l(),d("li",TI,[n("a",AI,[e.user?.photo?(l(),d("img",{key:0,width:"22",height:"22",class:"rounded-circle",src:e.safeUrl(e.user?.photo)},null,8,OI)):p("v-if",!0),n("span",PI,u(e.user?.username),1)]),n("div",II,[n("h6",VI,"Signed in as @"+u(e.user?.username),1),t[11]||(t[11]=pe('SettingsDefaults, quotas, accountGitHub connectionsRepository access and OAuthClaim an anonymizationAttach an existing mirror to your accountReport a bugAbout this service, not a paperSource codeSupport the projectSign out',9))])])):p("v-if",!0)])])],2),e.generalMessage?(l(),d("div",{key:0,class:"navbar shadow generalMessage",innerHTML:e.sanitize(e.generalMessage)},null,8,qI)):p("v-if",!0)],64)}var MI={class:"paper-landing"},$I={class:"paper-hero"},LI={class:"paper-hero-copy"},UI={class:"paper-cta-row"},FI={key:0,href:"/signin",target:"_self",class:"btn-hero"},BI={key:1,href:"/anonymize",class:"btn-hero"},zI={class:"paper-stats paper-wrap",id:"metrics","aria-label":"Usage over the last 60 days"},HI={class:"paper-stats-grid"},jI={class:"paper-stat-value"},GI={class:"paper-stat-label"},WI=["viewBox"],KI=["x","y","width","height"],YI={key:1,class:"paper-stat-delta"},QI={class:"paper-features paper-wrap","aria-label":"Product features"},JI={class:"paper-features-list",role:"tablist","aria-label":"Features","aria-orientation":"vertical"},XI=["onClick","onKeydown","id","aria-controls","aria-selected","tabindex"],ZI={class:"paper-eyebrow"},xI={class:"paper-feature-title"},e4={class:"paper-feature-more"},t4={class:"paper-feature-title paper-feature-title-m","aria-hidden":"true"},n4=["href","target"],o4={class:"paper-features-stage"},s4=["id","aria-labelledby"],i4={class:"paper-frame"},r4={class:"paper-frame-bar","aria-hidden":"true"},a4={class:"url"},l4=["src","alt"],d4={class:"paper-footer"},u4={class:"paper-footer-inner"},c4={class:"paper-footer-col"},p4={key:0,href:"/dashboard"},f4={key:1,href:"/conferences"},h4={class:"paper-footer-foot"};function Al(e,t){return l(),d("div",MI,[p(" Hero: copy on the left, the product on the right "),n("section",$I,[n("div",LI,[t[2]||(t[2]=n("div",{class:"paper-eyebrow"},"For double-blind peer review",-1)),t[3]||(t[3]=n("h1",{class:"hero-title"},[y(" Share the code,"),n("br"),n("span",{class:"accent"},"not the author.")],-1)),t[4]||(t[4]=n("p",{class:"hero-subtitle"}," Anonymous GitHub makes a read-only mirror of your repository, pull request, or gist. It redacts the terms you choose in text files, so reviewers can browse your artifact through an anonymous link. ",-1)),n("div",UI,[e.user?p("v-if",!0):(l(),d("a",FI,[...t[0]||(t[0]=[n("i",{class:"fab fa-github mr-2","aria-hidden":"true"},null,-1),y("Sign in with GitHub ",-1)])])),e.user?(l(),d("a",BI," Anonymize a repository \u2192 ")):p("v-if",!0),t[1]||(t[1]=n("a",{class:"paper-link-arrow",target:"_self",href:"https://anonymous.4open.science/r/840c8c57-3c32-451e-bf12-0e20be300389/"},"See an anonymized repository \u2192",-1))]),t[5]||(t[5]=n("ul",{class:"paper-reassure"},[n("li",null,"Free and open source"),n("li",null,"Read-only: never writes to your repos"),n("li",null,"Expires on the date you set")],-1))]),t[6]||(t[6]=pe('
A reviewer preview with the author, affiliation, and email replaced by anonymous terms
',1))]),p(" Proof "),t[16]||(t[16]=pe('
Trusted by authors at
ICSEFSEOOPSLA
',1)),p(" Live stats "),n("section",zI,[t[7]||(t[7]=n("div",{class:"paper-stats-meta"},[n("div",{class:"paper-stats-meta-left"},"Live \xB7 last 60 days"),n("div",{class:"paper-stats-meta-right"},[n("span",{class:"paper-stats-dot","aria-hidden":"true"}),y(" updated daily ")])],-1)),n("div",HI,[(l(!0),d(W,null,Z(e.cards,(s,i)=>(l(),d("div",{class:"paper-stat-card",key:s?.key},[n("div",jI,u(e.fmt?.bigNum(s?.total)),1),n("div",GI,u(s?.label),1),e.history[s?.key].bars?.length>1?(l(),d("svg",{key:0,class:"paper-stat-bars",preserveAspectRatio:"none","aria-hidden":"true",viewBox:"0 0 "+e.history[s?.key].viewW+" 36"},[(l(!0),d(W,null,Z(e.history[s?.key].bars,(o,r)=>(l(),d("rect",{key:r,class:A({"is-latest":r===e.history[s.key].bars.length-1}),x:o?.x,y:o?.y,width:o?.w,height:o?.h},null,10,KI))),128))],8,WI)):p("v-if",!0),e.history[s?.key].bars?.length>1?(l(),d("div",YI," +"+u(e.fmt?.number(e.history[s?.key].deltaToday))+" today ",1)):p("v-if",!0)]))),128))])]),p(" Before / after "),t[17]||(t[17]=n("section",{class:"paper-section-head paper-wrap"},[n("div",null,[n("div",{class:"paper-eyebrow"},"Before \xB7 after"),n("h2",null,[y("The same repository, "),n("em",null,"minus you.")])]),n("p",null," Names, affiliations, emails, and any term you list are replaced across the README, source files, notebooks, and PDF links. Reviewers browse the real thing, not a zip. ")],-1)),t[18]||(t[18]=n("div",{class:"paper-preview paper-wrap","aria-label":"Before and after example"},[n("div",{class:"pane"},[n("div",{class:"pane-header"},[n("span",{class:"pane-label"},"Before \xB7 your repo"),n("span",{class:"pane-url"},"github.com/jane-smith/DeepLearnUtils")]),n("div",{class:"pane-body"},[n("div",null,[n("span",{class:"tok"},"#"),y(),n("strong",null,"DeepLearnUtils")]),n("div",null,"Developed by Jane Smith at MIT CSAIL."),n("div",null,"See Smith et\xA0al., \u201CAttention That Works,\u201D 2026."),n("div",null,"Contact: jane.smith@mit.edu")])]),n("div",{class:"pane"},[n("div",{class:"pane-header"},[n("span",{class:"pane-label"},"After \xB7 anonymous mirror"),n("span",{class:"pane-url"},"anonymous.4open.science/r/paper-7f2a")]),n("div",{class:"pane-body"},[n("div",null,[n("span",{class:"tok"},"#"),y(),n("strong",null,"DeepLearnUtils")]),n("div",null,[y("Developed by "),n("span",{class:"redact",role:"img","aria-label":"redacted author name"},"XXXX-1"),y(" at "),n("span",{class:"redact",role:"img","aria-label":"redacted affiliation"},"XXXX-2"),y(".")]),n("div",null,[y("See "),n("span",{class:"redact",role:"img","aria-label":"redacted author name"},"XXXX-1"),y(" et\xA0al., \u201CAttention That Works,\u201D 2026.")]),n("div",null,[y("Contact: "),n("span",{class:"redact",role:"img","aria-label":"redacted email address"},"XXXX-3")])])])],-1)),p(" What you get: one screenshot, three tabs "),t[19]||(t[19]=n("section",{class:"paper-section-head paper-wrap",id:"about"},[n("div",null,[n("div",{class:"paper-eyebrow"},"What you get"),n("h2",null,[y("Anonymize, review, "),n("em",null,"manage.")])]),n("p",null," Terms are redacted in text files. Enabled images and PDFs are served unchanged, so review them for identifying content before sharing. Monitor your mirror, update it, or remove it when the review is over. ")],-1)),n("section",QI,[n("div",JI,[(l(!0),d(W,null,Z(e.features,(s,i)=>(l(),d("div",{class:A(["paper-feature",{"is-on":e.feature===s?.key}]),key:s?.key},[n("button",{type:"button",class:"paper-feature-tab",role:"tab",onClick:o=>e.selectFeature(s.key),onKeydown:o=>e.featureKeydown(o,i),id:"feature-tab-"+s?.key,"aria-controls":"feature-panel-"+s?.key,"aria-selected":e.feature===s?.key,tabindex:e.feature===s?.key?0:-1},[n("span",ZI,u(s?.num)+" \xB7 "+u(s?.eyebrow),1),n("span",xI,[y(u(s?.title)+" ",1),n("em",null,u(s?.accent),1)])],40,XI),n("div",e4,[n("span",t4,[y(u(s?.title)+" ",1),n("em",null,u(s?.accent),1)]),n("p",null,u(s?.text),1),n("a",{class:"paper-link-arrow",href:e.safeUrl(e.featureHref(s)),target:e.featureTarget(s)},u(s?.cta)+" \u2192",9,n4)])],2))),128))]),n("div",o4,[(l(!0),d(W,null,Z(e.features,(s,i)=>N((l(),d("div",{class:"paper-feature-panel",role:"tabpanel",key:s?.key,id:"feature-panel-"+s?.key,"aria-labelledby":"feature-tab-"+s?.key},[n("div",i4,[n("div",r4,[t[8]||(t[8]=n("span",{class:"dots"},[n("i"),n("i"),n("i")],-1)),n("span",a4,u(s?.url),1)]),n("div",{class:A("paper-crop paper-crop-"+s?.key)},[n("img",{loading:"lazy",width:"2880",height:"1800",src:e.safeUrl(s?.img),alt:s?.alt},null,8,l4)],2)])],8,s4)),[[G,e.feature===s?.key]])),128))])]),p(" FAQ teaser "),t[20]||(t[20]=pe('
Before you sign in

The questions that come up most.

Read the full FAQ \u2192
What access does GitHub sign-in require?

The GitHub App has read-only access to gists and the repositories you choose. Legacy OAuth uses broader permissions. Anonymous GitHub never writes to your repositories.

Which file formats are supported?

Source code with syntax highlighting, Markdown, Jupyter notebooks, PDFs, images, and GitHub Pages sites. Text files are anonymized; enabled images and PDFs are served unchanged.

What happens when an anonymized repository expires?

You choose: the mirror is removed, or visitors are redirected to the original GitHub repository once the review is over.

',1)),n("footer",d4,[n("div",u4,[t[12]||(t[12]=n("div",{class:"paper-footer-brand"},[n("div",{class:"paper-footer-mark"},[y("Anonymous "),n("em",null,"GitHub")]),n("p",{class:"paper-footer-tag"}," A read-only, identity-stripped mirror of your repository, built for double-anonymous peer review. ")],-1)),n("div",c4,[t[9]||(t[9]=n("div",{class:"paper-footer-head"},"Product",-1)),t[10]||(t[10]=n("a",{href:"/anonymize"},"Anonymize",-1)),e.user?(l(),d("a",p4,"My work")):p("v-if",!0),e.user?(l(),d("a",f4,"Conferences")):p("v-if",!0),t[11]||(t[11]=n("a",{href:"/faq"},"FAQ",-1))]),t[13]||(t[13]=pe('',2))]),t[15]||(t[15]=n("div",{class:"paper-footer-rule"},null,-1)),n("div",h4,[n("span",null,"\xA9 "+u(e.year||2026)+" Anonymous GitHub \xB7 GPL-3.0 licensed",1),t[14]||(t[14]=n("span",{class:"paper-footer-meta"},"Built for reviewers, by researchers.",-1))])])])}var m4={class:"paper-empty"},v4={class:"paper-empty-inner"},g4={key:0,class:"paper-eyebrow"},y4={key:1,class:"paper-eyebrow"},b4={key:2,class:"paper-empty-title"},w4=["textContent"];function Ol(e,t){return l(),d("div",m4,[n("div",v4,[e.error?p("v-if",!0):(l(),d("div",g4,"Working")),e.error?(l(),d("div",y4,"Error")):p("v-if",!0),e.error?p("v-if",!0):(l(),d("h1",b4,[...t[0]||(t[0]=[y(" Loading",-1),n("span",{class:"dot-anim"},"\u2026",-1)])])),e.error?(l(),d("h1",{key:3,class:"paper-empty-title",textContent:u(e.fmt.translate(e.error))},null,8,w4)):p("v-if",!0)])])}var k4={class:"container paper-page paper-settings"},E4={class:"paper-crumbs"},C4={class:"here"},_4={class:"paper-page-title"},S4={class:"paper-settings-body"},N4={class:"paper-settings-toc"},D4={href:"#conf-billing"},R4={class:"form needs-validation paper-settings-main",name:"conference",novalidate:""},T4={id:"conf-basics",class:"paper-settings-section"},A4={class:"form-group"},O4={class:"invalid-feedback"},P4={class:"invalid-feedback"},I4={class:"form-group"},V4={class:"invalid-feedback"},q4={class:"form-group"},M4={class:"invalid-feedback"},$4={class:"invalid-feedback"},L4={id:"conf-window",class:"paper-settings-section"},U4={class:"form-grid-2"},F4={class:"form-group"},B4={class:"invalid-feedback"},z4={class:"invalid-feedback"},H4={class:"form-group"},j4={class:"invalid-feedback"},G4={class:"invalid-feedback"},W4={id:"conf-rendering",class:"paper-settings-section"},K4={class:"form-check"},Y4={class:"form-check-input",type:"checkbox",id:"link",name:"link"},Q4={class:"form-check"},J4={class:"form-check-input",type:"checkbox",id:"image",name:"image"},X4={class:"form-check"},Z4={class:"form-check-input",type:"checkbox",id:"pdf",name:"pdf"},x4={class:"form-check"},eV={class:"form-check-input",type:"checkbox",id:"notebook",name:"notebook"},tV={id:"conf-features",class:"paper-settings-section"},nV={class:"form-check"},oV={class:"form-check-input",type:"checkbox",id:"update",name:"update"},sV={class:"form-check"},iV={class:"form-check-input",type:"checkbox",id:"page",name:"page"},rV={id:"conf-plan",class:"paper-settings-section"},aV={class:"paper-plan-grid"},lV=["disabled","value"],dV=["textContent"],uV={class:"paper-plan-price"},cV={class:"paper-plan-per"},pV=["innerHTML"],fV={key:0,id:"conf-billing",class:"paper-settings-section"},hV={class:"form-group"},mV={class:"form-group"},vV={class:"form-group"},gV={class:"form-group"},yV={class:"form-grid-3"},bV={class:"form-group"},wV={class:"form-group"},kV={class:"form-group"},EV={class:"form-group"},CV={class:"paper-settings-footer"},_V=["textContent"],SV=["textContent"],NV=["disabled"];function Pl(e,t){let s=ye("paper-scrollspy"),i=ye("field"),o=ye("form");return l(),d("div",k4,[n("div",E4,[t[1]||(t[1]=n("a",{href:"/dashboard"},"My work",-1)),t[2]||(t[2]=y(" \xA0/\xA0 ",-1)),t[3]||(t[3]=n("a",{href:"/conferences"},"Conferences",-1)),t[4]||(t[4]=y(" \xA0/\xA0 ",-1)),n("span",C4,u(e.editionMode?"Edit":"New"),1)]),n("h1",_4,[y(u(e.editionMode?"Edit":"Create a")+" ",1),t[5]||(t[5]=n("em",null,"conference",-1))]),t[41]||(t[41]=n("p",{class:"paper-page-lede"}," Give chairs access to every anonymization submitted to a venue, and lift author quotas during the review window. ",-1)),n("div",S4,[N((l(),d("aside",N4,[t[7]||(t[7]=n("div",{class:"paper-settings-toc-head"},"On this page",-1)),n("nav",null,[t[6]||(t[6]=pe('BasicsReview windowRendering defaultsFeaturesPlan',5)),N(n("a",D4,"Billing",512),[[G,e.plan?.pricePerRepo>0]])])])),[[s]]),N((l(),d("form",R4,[n("section",T4,[t[12]||(t[12]=n("div",{class:"paper-section-eyebrow"},"Basics",-1)),n("div",A4,[t[8]||(t[8]=n("label",{class:"paper-field-label",for:"name"},"Conference name",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.name?.invalid&&(e.conference?.name?.touched||e.conference?.submitted)}]),name:"name",id:"name",required:"",placeholder:"e.g. International Conference on Software Engineering"},null,2),[[i,{state:e.viewState,set:r=>{e.options.name=r},value:e.options?.name,form:"conference",options:{}}]]),N(n("div",O4," The name of the conference is invalid. ",512),[[G,e.conference?.name?.errors?.invalid]]),N(n("div",P4," The name of the conference is required. ",512),[[G,e.conference?.name?.errors?.required]])]),n("div",I4,[t[9]||(t[9]=n("label",{class:"paper-field-label",for:"url"},"Website",-1)),N(n("input",{type:"url",class:A(["form-control",{"is-invalid":e.conference?.url?.invalid&&(e.conference?.url?.touched||e.conference?.submitted)}]),name:"url",id:"url",placeholder:"https://example.org"},null,2),[[i,{state:e.viewState,set:r=>{e.options.url=r},value:e.options?.url,form:"conference",options:{}}]]),N(n("div",V4," The url of the conference is invalid. ",512),[[G,e.conference?.url?.errors?.url]])]),n("div",q4,[t[10]||(t[10]=n("label",{class:"paper-field-label",for:"conferenceID"},"Conference ID",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.conferenceID?.invalid&&(e.conference?.conferenceID?.touched||e.conference?.submitted)}]),name:"conferenceID",id:"conferenceID",required:"",pattern:"[a-zA-Z0-9\\-_]{3,10}",placeholder:"ICSE26"},null,2),[[i,{state:e.viewState,set:r=>{e.options.conferenceID=r},value:e.options?.conferenceID,form:"conference",options:{}}]]),t[11]||(t[11]=n("small",{class:"form-text text-muted"},[y("3\u201310 characters, letters, numbers, "),n("code",null,"-"),y(" and "),n("code",null,"_"),y(". Authors reference this when they anonymize.")],-1)),N(n("div",{class:"invalid-feedback"}," The conference ID '"+u(e.options?.conferenceID)+"' is already used. ",513),[[G,e.conference?.conferenceID?.errors?.used]]),N(n("div",M4," The conference ID is required. ",512),[[G,e.conference?.conferenceID?.errors?.required]]),N(n("div",$4," The format of the conference ID is incorrect ([a-zA-Z0-9-_]{3,10}). ",512),[[G,e.conference?.conferenceID?.errors?.pattern]])])]),n("section",L4,[t[17]||(t[17]=n("div",{class:"paper-section-eyebrow"},"Review window",-1)),n("div",U4,[n("div",F4,[t[13]||(t[13]=n("label",{class:"paper-field-label",for:"startDate"},"Start date",-1)),N(n("input",{type:"date",class:A(["form-control",{"is-invalid":e.conference?.startDate?.invalid&&(e.conference?.startDate?.touched||e.conference?.submitted)}]),name:"startDate",id:"startDate",required:""},null,2),[[i,{state:e.viewState,set:r=>{e.options.startDate=r},value:e.options?.startDate,form:"conference",options:{}}]]),t[14]||(t[14]=n("small",{class:"form-text text-muted"},"Beginning of the review process.",-1)),N(n("div",B4," Start date is required. ",512),[[G,e.conference?.startDate?.errors?.required]]),N(n("div",z4," Start date must be before end date. ",512),[[G,e.conference?.startDate?.errors?.invalid]])]),n("div",H4,[t[15]||(t[15]=n("label",{class:"paper-field-label",for:"endDate"},"End date",-1)),N(n("input",{type:"date",class:A(["form-control",{"is-invalid":e.conference?.endDate?.invalid&&(e.conference?.endDate?.touched||e.conference?.submitted)}]),name:"endDate",id:"endDate",required:""},null,2),[[i,{state:e.viewState,set:r=>{e.options.endDate=r},value:e.options?.endDate,form:"conference",options:{}}]]),t[16]||(t[16]=n("small",{class:"form-text text-muted"},"All repositories expire on this date.",-1)),N(n("div",j4," End date is required. ",512),[[G,e.conference?.endDate?.errors?.required]]),N(n("div",G4," End date is invalid. ",512),[[G,e.conference?.endDate?.errors?.invalid]])])])]),n("section",W4,[t[25]||(t[25]=n("div",{class:"paper-section-eyebrow"},"Rendering defaults",-1)),n("div",K4,[N(n("input",Y4,null,512),[[i,{state:e.viewState,set:r=>{e.options.options.link=r},value:e.options?.options?.link,form:"conference",options:{}}]]),t[18]||(t[18]=n("label",{class:"form-check-label",for:"link"},"Keep links",-1)),t[19]||(t[19]=n("small",{class:"form-text text-muted"},"Keep or remove all links from text files.",-1))]),n("div",Q4,[N(n("input",J4,null,512),[[i,{state:e.viewState,set:r=>{e.options.options.image=r},value:e.options?.options?.image,form:"conference",options:{}}]]),t[20]||(t[20]=n("label",{class:"form-check-label",for:"image"},"Display images",-1)),t[21]||(t[21]=n("small",{class:"form-text text-muted"},"Images are not anonymized.",-1))]),n("div",X4,[N(n("input",Z4,null,512),[[i,{state:e.viewState,set:r=>{e.options.options.pdf=r},value:e.options?.options?.pdf,form:"conference",options:{}}]]),t[22]||(t[22]=n("label",{class:"form-check-label",for:"pdf"},"Display PDFs",-1)),t[23]||(t[23]=n("small",{class:"form-text text-muted"},"PDFs are not anonymized.",-1))]),n("div",x4,[N(n("input",eV,null,512),[[i,{state:e.viewState,set:r=>{e.options.options.notebook=r},value:e.options?.options?.notebook,form:"conference",options:{}}]]),t[24]||(t[24]=n("label",{class:"form-check-label",for:"notebook"},"Display Notebooks",-1))])]),n("section",tV,[t[30]||(t[30]=n("div",{class:"paper-section-eyebrow"},"Features",-1)),n("div",nV,[N(n("input",oV,null,512),[[i,{state:e.viewState,set:r=>{e.options.options.update=r},value:e.options?.options?.update,form:"conference",options:{}}]]),t[26]||(t[26]=n("label",{class:"form-check-label",for:"update"},"Auto-update from GitHub",-1)),t[27]||(t[27]=n("small",{class:"form-text text-muted"},"Pull the latest commit automatically (hourly maximum).",-1))]),n("div",sV,[N(n("input",iV,null,512),[[i,{state:e.viewState,set:r=>{e.options.options.page=r},value:e.options?.options?.page,form:"conference",options:{}}]]),t[28]||(t[28]=n("label",{class:"form-check-label",for:"page"},"GitHub Pages",-1)),t[29]||(t[29]=n("small",{class:"form-text text-muted"},"Enable anonymized GitHub pages.",-1))])]),n("section",rV,[t[31]||(t[31]=n("div",{class:"paper-section-eyebrow"},"Plan",-1)),t[32]||(t[32]=n("p",{class:"paper-section-copy"},"The review package is prepaid and covers up to 180 days. Pay from the conference page after creating it. Plan and review dates cannot change after creation.",-1)),n("div",aV,[(l(!0),d(W,null,Z(e.plans,(r,a)=>(l(),d("label",{class:A(["paper-plan-card",{selected:e.options?.plan?.planID==r?.id}])},[N(n("input",{type:"radio",disabled:e.editionMode,name:"planPicker",value:r?.id},null,8,lV),[[i,{state:e.viewState,set:c=>{e.options.plan.planID=c},value:e.options?.plan?.planID,form:"conference",options:{}}]]),n("div",{class:"paper-plan-head",textContent:u(r?.name)},null,8,dV),n("div",uV,[y(u(r.id==="free_conference"?"Free":"Prepaid package")+" ",1),n("span",cV,u(r.id==="free_conference"?"":"Price on the conference page"),1)]),n("div",{class:"paper-plan-desc",innerHTML:e.sanitize(r?.description)},null,8,pV)],2))),256))])]),e.plan?.pricePerRepo>0?(l(),d("section",fV,[t[40]||(t[40]=n("div",{class:"paper-section-eyebrow"},"Billing",-1)),n("div",hV,[t[33]||(t[33]=n("label",{class:"paper-field-label",for:"billing_name"},"Name",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.billing_name?.invalid&&(e.conference?.billing_name?.touched||e.conference?.submitted)}]),name:"billing_name",id:"billing_name",required:"",placeholder:"First & last name"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.name=r},value:e.options?.billing?.name,form:"conference",options:{}}]])]),n("div",mV,[t[34]||(t[34]=n("label",{class:"paper-field-label",for:"email"},"Email",-1)),N(n("input",{type:"email",class:A(["form-control",{"is-invalid":e.conference?.email?.invalid&&(e.conference?.email?.touched||e.conference?.submitted)}]),name:"email",id:"email",required:"",placeholder:"you@example.org"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.email=r},value:e.options?.billing?.email,form:"conference",options:{}}]])]),n("div",vV,[t[35]||(t[35]=n("label",{class:"paper-field-label",for:"inputAddress"},"Address",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.inputAddress?.invalid&&(e.conference?.inputAddress?.touched||e.conference?.submitted)}]),name:"inputAddress",id:"inputAddress",required:"",placeholder:"1234 Main St"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.address=r},value:e.options?.billing?.address,form:"conference",options:{}}]])]),n("div",gV,[N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.inputAddress2?.invalid&&(e.conference?.inputAddress2?.touched||e.conference?.submitted)}]),name:"inputAddress2",id:"inputAddress2",placeholder:"Apartment, studio, or floor"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.address2=r},value:e.options?.billing?.address2,form:"conference",options:{}}]])]),n("div",yV,[n("div",bV,[t[36]||(t[36]=n("label",{class:"paper-field-label",for:"city"},"City",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.city?.invalid&&(e.conference?.city?.touched||e.conference?.submitted)}]),name:"city",id:"city",required:"",placeholder:"City"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.city=r},value:e.options?.billing?.city,form:"conference",options:{}}]])]),n("div",wV,[t[37]||(t[37]=n("label",{class:"paper-field-label",for:"country"},"Country",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.country?.invalid&&(e.conference?.country?.touched||e.conference?.submitted)}]),name:"country",id:"country",required:"",placeholder:"Country"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.country=r},value:e.options?.billing?.country,form:"conference",options:{}}]])]),n("div",kV,[t[38]||(t[38]=n("label",{class:"paper-field-label",for:"zip"},"Zip",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.zip?.invalid&&(e.conference?.zip?.touched||e.conference?.submitted)}]),name:"zip",id:"zip",required:"",placeholder:"Zip"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.zip=r},value:e.options?.billing?.zip,form:"conference",options:{}}]])])]),n("div",EV,[t[39]||(t[39]=n("label",{class:"paper-field-label",for:"vat"},"VAT number",-1)),N(n("input",{type:"text",class:A(["form-control",{"is-invalid":e.conference?.vat?.invalid&&(e.conference?.vat?.touched||e.conference?.submitted)}]),name:"vat",id:"vat",placeholder:"VAT Number"},null,2),[[i,{state:e.viewState,set:r=>{e.options.billing.vat=r},value:e.options?.billing?.vat,form:"conference",options:{}}]])])])):p("v-if",!0),n("div",CV,[e.error?(l(),d("div",{key:0,class:"alert alert-danger",role:"alert",textContent:u(e.error)},null,8,_V)):p("v-if",!0),e.message?(l(),d("div",{key:1,class:"alert alert-success",role:"alert",textContent:u(e.message)},null,8,SV)):p("v-if",!0),n("button",{id:"send",disabled:e.saving,type:"submit",class:"btn btn-ink",onClick:t[0]||(t[0]=ue(r=>e.submitForm(r,()=>{e.submit(r)}),["prevent"]))},u(e.saving?e.editionMode?"Updating\u2026":"Creating\u2026":e.editionMode?"Update conference":"Create conference"),9,NV)])])),[[o,e.viewState]])])])}var DV={key:0},RV=["innerHTML"],TV={key:3},AV=["src"],OV=["src"],PV={key:7},IV={controls:"controls"},VV=["src"],qV={key:8},MV={key:9,class:"file-error container d-flex h-100"},$V={class:"paper-ratelimit-card m-auto",style:{"max-width":"520px"}},LV={class:"paper-error-msg"},UV={key:10,class:"file-error container d-flex h-100"},FV=["textContent"],BV={key:11,class:"file-error container d-flex h-100"},zV={key:12,class:"file-error container d-flex h-100"},HV={key:13,class:"file-error container d-flex h-100"},jV={key:14,class:"file-error container d-flex h-100"},GV={class:"paper-empty-title m-auto"},WV=["href"];function Il(e,t){let s=We("html-doc"),i=We("pdfviewer"),o=We("notebook"),r=ye("code-editor");return l(),d(W,null,[e.type=="text"?N((l(),d("div",DV,null,512)),[[r,{content:e.content,options:e.aceOption}]]):p("v-if",!0),e.type=="html"?(l(),d("div",{key:1,class:"file-content markdown-body",innerHTML:e.sanitize(e.content)},null,8,RV)):p("v-if",!0),e.type=="html-doc"&&!e.showSource&&e.content!=null?(l(),$t(s,{key:2,content:e.content,"base-url":e.fileBaseUrl,"allow-scripts":e.allowScripts},null,8,["content","base-url","allow-scripts"])):p("v-if",!0),(e.type=="code"||e.type=="html-doc"&&e.showSource)&&e.content!=null?N((l(),d("div",TV,null,512)),[[r,{content:e.content,options:e.aceOption}]]):p("v-if",!0),e.type=="image"?(l(),d("img",{key:4,class:"image-content",src:e.safeUrl(e.url)},null,8,AV)):p("v-if",!0),e.type=="media"?(l(),d("iframe",{key:5,class:"h-100 overflow-auto w-100 b-0",src:e.safeUrl(e.url)},null,8,OV)):p("v-if",!0),e.type=="pdf"?(l(),$t(i,{key:6,src:e.safeUrl(e.url)},null,8,["src"])):p("v-if",!0),e.type=="audio"?(l(),d("div",PV,[n("audio",IV,[n("source",{src:e.safeUrl(e.url)},null,8,VV)])])):p("v-if",!0),e.type=="IPython"?(l(),d("div",qV,[_e(o,{file:e.url,content:e.content},null,8,["file","content"])])):p("v-if",!0),e.type=="rate_limited"?(l(),d("div",MV,[n("div",$V,[t[2]||(t[2]=pe('
Temporarily paused
GitHub API rate limit reached
',1)),n("p",LV,[t[0]||(t[0]=y("This repository will be available in ",-1)),n("strong",null,u(e.rateLimitCountdown),1),t[1]||(t[1]=y(". The page will reload automatically.",-1))])])])):p("v-if",!0),e.type=="error"?(l(),d("div",UV,[n("h1",{class:"paper-empty-title m-auto",textContent:u(e.fmt.translate("ERRORS."+e.content))},null,8,FV)])):p("v-if",!0),e.type=="loading"&&!e.error?(l(),d("div",BV,[...t[3]||(t[3]=[n("h1",{class:"paper-empty-title m-auto"},"Loading\u2026",-1)])])):p("v-if",!0),e.type=="empty"?(l(),d("div",zV,[...t[4]||(t[4]=[n("h1",{class:"paper-empty-title m-auto"},[y("Empty "),n("em",null,"repository"),y(".")],-1)])])):p("v-if",!0),e.content==null&&e.type!="empty"?(l(),d("div",HV,[...t[5]||(t[5]=[n("h1",{class:"paper-empty-title m-auto"},[y("Empty "),n("em",null,"file"),y(".")],-1)])])):p("v-if",!0),e.type=="binary"?(l(),d("div",jV,[n("h1",GV,[t[6]||(t[6]=y("Unsupported ",-1)),t[7]||(t[7]=n("em",null,"binary file",-1)),t[8]||(t[8]=y(". You can ",-1)),n("a",{target:"_blank",href:e.safeUrl(e.url+"&download=true")},"download it",8,WV),t[9]||(t[9]=y(".",-1))])])):p("v-if",!0)],64)}var KV={class:"container page dashboard-page paper-page"},YV={class:"row"},QV={class:"w-100"},JV={class:"w-100","aria-label":"Pull Requests","accept-charset":"UTF-8"},XV={class:"d-flex flex-column flex-md-row align-items-md-center",style:{gap:"8px"}},ZV={class:"flex-grow-1"},xV={type:"search",id:"search",class:"form-control","aria-label":"Find a pull request...",placeholder:"Find a pull request...",autocomplete:"off"},e5={class:"d-flex flex-wrap",style:{gap:"6px"}},t5={class:"dropdown"},n5={class:"dropdown-menu","aria-labelledby":"dropdownSort"},o5={class:"form-check dropdown-item"},s5={class:"form-check-input",type:"radio",name:"sort",id:"sortFullName",value:"fullName"},i5={class:"form-check dropdown-item"},r5={class:"form-check-input",type:"radio",name:"sort",id:"sortAnonymizeDate",value:"-anonymizeDate"},a5={class:"form-check dropdown-item"},l5={class:"form-check-input",type:"radio",name:"sort",id:"sortStatus",value:"-status"},d5={class:"form-check dropdown-item"},u5={class:"form-check-input",type:"radio",name:"sort",id:"sortLastView",value:"-lastView"},c5={class:"form-check dropdown-item"},p5={class:"form-check-input",type:"radio",name:"sort",id:"sortPageView",value:"-pageView"},f5={class:"dropdown"},h5={class:"dropdown-menu","aria-labelledby":"dropdownStatus"},m5={class:"form-check dropdown-item"},v5={class:"form-check-input",type:"checkbox",name:"sort",id:"statusReady",value:"ready"},g5={class:"form-check dropdown-item"},y5={class:"form-check-input",type:"checkbox",name:"sort",id:"statusExpired",value:"expired"},b5={class:"form-check dropdown-item"},w5={class:"form-check-input",type:"checkbox",name:"sort",id:"statusRemoved",value:"removed"},k5={class:"d-flex flex-wrap mt-2",style:{gap:"6px"}},E5={class:"filter-chip"},C5=["onClick"],_5={class:"repo-list w-100"},S5={class:"repo-list-item-content"},N5={class:"repo-list-item-main"},D5={class:"repo-list-item-header"},R5=["textContent","href"],T5=["textContent"],A5=["textContent"],O5={class:"repo-source"},P5=["href"],I5={class:"repo-date"},V5={class:"repo-meta"},q5={key:0,title:"Conference"},M5=["title"],$5=["title"],L5=["title"],U5={key:1},F5={class:"repo-list-item-actions"},B5={class:"dropdown"},z5={class:"dropdown-menu dropdown-menu-right"},H5=["href"],j5=["onClick"],G5=["onClick"],W5=["onClick"],K5=["href"],Y5={key:0,class:"repo-list-empty"};function Vl(e,t){let s=ye("field"),i=ye("form");return l(),d("div",KV,[n("div",YV,[n("div",QV,[t[12]||(t[12]=pe('
My work \xA0/\xA0 Pull requests

Anonymized pull requests

Track PR mirrors you\u2019ve created and their reviewer traffic.

',2)),p(" Search + filters row "),N((l(),d("form",JV,[n("div",XV,[n("div",ZV,[N(n("input",xV,null,512),[[s,{state:e.viewState,set:o=>{e.search=o},value:e.search,form:null,options:{}}]])]),n("div",e5,[n("div",t5,[t[6]||(t[6]=n("button",{class:"btn btn-sm dropdown-toggle",type:"button",id:"dropdownSort","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"}," Sort ",-1)),n("div",n5,[t[5]||(t[5]=n("h6",{class:"dropdown-header"},"Select order",-1)),n("div",o5,[N(n("input",s5,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[0]||(t[0]=n("label",{class:"form-check-label",for:"sortFullName"},"Pull Request",-1))]),n("div",i5,[N(n("input",r5,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[1]||(t[1]=n("label",{class:"form-check-label",for:"sortAnonymizeDate"},"Anonymize Date",-1))]),n("div",a5,[N(n("input",l5,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[2]||(t[2]=n("label",{class:"form-check-label",for:"sortStatus"},"Status",-1))]),n("div",d5,[N(n("input",u5,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[3]||(t[3]=n("label",{class:"form-check-label",for:"sortLastView"},"Last View",-1))]),n("div",c5,[N(n("input",p5,null,512),[[s,{state:e.viewState,set:o=>{e.orderBy=o},value:e.orderBy,form:null,options:{}}]]),t[4]||(t[4]=n("label",{class:"form-check-label",for:"sortPageView"},"Page View",-1))])])]),n("div",f5,[t[11]||(t[11]=n("button",{class:"btn btn-sm dropdown-toggle",type:"button",id:"dropdownStatus","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"}," Status ",-1)),n("div",h5,[t[10]||(t[10]=n("h6",{class:"dropdown-header"},"Select status",-1)),n("div",m5,[N(n("input",v5,null,512),[[s,{state:e.viewState,set:o=>{e.filters.status.ready=o},value:e.filters?.status?.ready,form:null,options:{}}]]),t[7]||(t[7]=n("label",{class:"form-check-label",for:"statusReady"},"Ready",-1))]),n("div",g5,[N(n("input",y5,null,512),[[s,{state:e.viewState,set:o=>{e.filters.status.expired=o},value:e.filters?.status?.expired,form:null,options:{}}]]),t[8]||(t[8]=n("label",{class:"form-check-label",for:"statusExpired"},"Expired",-1))]),n("div",b5,[N(n("input",w5,null,512),[[s,{state:e.viewState,set:o=>{e.filters.status.removed=o},value:e.filters?.status?.removed,form:null,options:{}}]]),t[9]||(t[9]=n("label",{class:"form-check-label",for:"statusRemoved"},"Removed",-1))])])])])])])),[[i,e.viewState]]),p(" Active filter chips "),N(n("div",k5,[(l(!0),d(W,null,Z(e.filters?.status,(o,r,a)=>N((l(),d("span",E5,[y(u(e.fmt?.title(r))+" ",1),n("button",{type:"button",class:"filter-chip-close","aria-label":"Remove filter",onClick:c=>{e.filters.status[r]=!0}}," \xD7 ",8,C5)],512)),[[G,!o]])),256))],512),[[G,e.filters?.status?.ready===!1||e.filters?.status?.expired===!1||e.filters?.status?.removed===!1]])]),p(" Pull request list "),n("ul",_5,[(l(!0),d(W,null,Z(e.filteredPullRequests,(o,r)=>(l(),d("li",{class:A(["repo-list-item",{"repo-inactive":o?.status=="expired"||o?.status=="removed"||o?.status=="error"}])},[n("div",S5,[n("div",N5,[n("div",D5,[n("a",{class:"repo-name",textContent:u(o?.pullRequestId),href:e.safeUrl("/pr/"+o?.pullRequestId)},null,8,R5),n("span",{class:A(["status-badge",{"status-removed":o?.status=="removed"||o?.status=="expired"||o?.status=="removing"||o?.status=="expiring","status-preparing":o?.status=="preparing"||o?.status=="download","status-ready":o?.status=="ready","status-error":o?.status=="error"}])},[n("span",{textContent:u(e.fmt?.title(o?.status))},null,8,T5),o?.status=="error"?(l(),d("span",{key:0,textContent:u(": "+o?.statusMessage)},null,8,A5)):p("v-if",!0)],2)]),n("div",O5,[n("span",null,[t[13]||(t[13]=n("i",{class:"fab fa-github","aria-hidden":"true"},null,-1)),n("a",{href:e.safeUrl("https://github.com/"+o?.source?.repositoryFullName+"/pull/"+o?.source?.pullRequestId)},u(o?.source?.repositoryFullName)+"#"+u(o?.source?.pullRequestId),9,P5)]),n("span",{class:A(["status-badge",{"status-ready":o?.merged,"status-removed":o?.state=="open","status-error":o?.state=="closed"&&!o?.merged}]),style:{"font-size":"10px"}},u(e.fmt?.title(o?.merged?"merged":o?.state)),3),n("span",I5,"anonymized "+u(e.fmt?.humanTime(o?.anonymizeDate)),1)])]),n("div",V5,[o?.conference?(l(),d("span",q5,[t[14]||(t[14]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-conference"})],-1)),y(" "+u(o?.conference),1)])):p("v-if",!0),n("span",{"data-toggle":"tooltip","data-placement":"bottom",title:"Terms: "+o?.options?.terms?.join(", ")},[t[15]||(t[15]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1)),y(" "+u(e.fmt?.number(o?.options?.terms?.length)),1)],8,M5),n("span",{"data-toggle":"tooltip","data-placement":"bottom",title:"Views: "+e.fmt?.number(o?.pageView)},[t[16]||(t[16]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1)),y(" "+u(e.fmt?.number(o?.pageView)),1)],8,$5),n("span",{"data-toggle":"tooltip","data-placement":"bottom",title:"Last view: "+e.fmt?.date(o?.lastView)},[t[17]||(t[17]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-calendar"})],-1)),y(" "+u(e.fmt?.humanTime(o?.lastView)),1)],8,L5),o?.options?.expirationMode!="never"&&o?.status=="ready"?(l(),d("span",U5,[t[18]||(t[18]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),y(" Expire: "+u(e.fmt?.humanTime(o?.options?.expirationDate)),1)])):p("v-if",!0)])]),n("div",F5,[n("div",B5,[t[24]||(t[24]=n("button",{class:"btn btn-sm dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"}," Actions ",-1)),n("div",z5,[n("a",{class:"dropdown-item",href:e.safeUrl("/pull-request-anonymize/"+o?.pullRequestId)},[...t[19]||(t[19]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit ",-1)])],8,H5),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.updatePullRequest(o),["prevent"])},[...t[20]||(t[20]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-refresh"})],-1),y(" Force update ",-1)])],8,j5),[[G,o?.status=="ready"||o?.status=="error"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.updatePullRequest(o),["prevent"])},[...t[21]||(t[21]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-check-circle"})],-1),y(" Enable ",-1)])],8,G5),[[G,o?.status=="removed"]]),N(n("a",{class:"dropdown-item",href:"#",onClick:ue(a=>e.removePullRequest(o),["prevent"])},[...t[22]||(t[22]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1),y(" Remove ",-1)])],8,W5),[[G,o?.status=="ready"]]),n("a",{class:"dropdown-item",href:e.safeUrl("/pr/"+o?.pullRequestId+"/")},[...t[23]||(t[23]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" View PR ",-1)])],8,K5)])])])],2))),256)),e.filteredPullRequests?.length==0?(l(),d("li",Y5,[...t[25]||(t[25]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-inbox"})],-1),n("span",null,"No pull requests to display.",-1)])])):p("v-if",!0)])])])}var Q5={class:"container paper-page user-settings"},J5={class:"settings-title"},X5={class:"settings-header-actions"},Z5={class:"settings-nav","aria-label":"Settings"},x5=["aria-current","onClick"],eq={class:"settings-row"},tq={class:"form-control",id:"terms",name:"terms",rows:"3",placeholder:`Jane Smith MIT CSAIL -jane.smith@example.org`},N5={id:"termsHelp",class:"form-text text-muted"},D5={class:"invalid-feedback"},R5={id:"settings-display",class:"paper-settings-section"},T5={class:"form-group paper-check-list"},A5={class:"form-check"},O5={class:"form-check-input",type:"checkbox",id:"link",name:"link"},I5={class:"form-check"},P5={class:"form-check-input",type:"checkbox",id:"image",name:"image"},V5={class:"form-check"},q5={class:"form-check-input",type:"checkbox",id:"pdf",name:"pdf"},M5={class:"form-check"},L5={class:"form-check-input",type:"checkbox",id:"notebook",name:"notebook"},$5={id:"settings-features",class:"paper-settings-section"},U5={class:"form-group paper-check-list"},F5={class:"form-check"},z5={class:"form-check-input",type:"checkbox",id:"page",name:"page"},H5={class:"form-check"},B5={class:"form-check-input",type:"checkbox",id:"loc",name:"loc"},j5={class:"form-check"},G5={class:"form-check-input",type:"checkbox",id:"update",name:"update"},W5={class:"form-group"},K5={class:"form-control",id:"mode",name:"mode"},Y5={class:"form-text text-muted"},J5={id:"settings-expiration",class:"paper-settings-section"},Q5={class:"form-group"},X5={class:"form-control",id:"expiration",name:"expiration"},Z5={key:0,class:"draft-status",role:"status"},x5={key:1,class:"draft-status"},eq={class:"paper-settings-footer"},tq={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},oq=["textContent"],sq={class:"paper-settings-actions"},nq=["disabled"],rq={key:0,class:"ui-icon mr-1","aria-hidden":"true"},iq={id:"settings-account",class:"paper-settings-section"},aq={class:"paper-account-card"},lq=["src"],dq={class:"paper-account-identity"},uq={class:"paper-account-name"},cq={class:"paper-danger-zone"},pq={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},fq=["textContent"],mq=["disabled"];function Il(e,t){let n=We("quota-usage"),r=be("paper-scrollspy"),s=be("field"),i=be("form");return l(),d("div",v5,[t[52]||(t[52]=ce('
My work \xA0/\xA0 Settings

Your settings

Defaults applied to every new anonymization, your quotas, and your account.

',3)),o("div",g5,[N((l(),d("aside",y5,[...t[4]||(t[4]=[ce('
On this page
',2)])])),[[r]]),o("div",b5,[p(" Account usage shares the dashboard component. "),o("section",w5,[t[6]||(t[6]=o("div",{class:"paper-section-eyebrow"},"Quota",-1)),t[7]||(t[7]=o("p",{class:"paper-section-copy"},"What you are using across all your anonymizations. Conferences can lift these limits during a review window.",-1)),e.quota?(l(),Lt(n,{key:0,quota:e.quota,fmt:e.fmt},null,8,["quota","fmt"])):p("v-if",!0),e.quota?p("v-if",!0):(l(),d("div",k5,[(l(),d(X,null,re([1,2,3],(a,u)=>o("div",E5,[...t[5]||(t[5]=[o("div",{class:"quota-header"},[o("span",{class:"skeleton skeleton-line",style:{width:"40%"}}),o("span",{class:"skeleton skeleton-line",style:{width:"25%"}})],-1),o("div",{class:"quota-track"},null,-1)])])),64))]))]),N((l(),d("form",{class:"form needs-validation",name:"defaultsForm",novalidate:"",onSubmit:t[2]||(t[2]=me(a=>e.submitForm(a,()=>{e.saveDefault(a)}),["prevent"]))},[o("section",C5,[t[13]||(t[13]=o("div",{class:"paper-section-eyebrow"},"Terms to redact",-1)),t[14]||(t[14]=o("p",{class:"paper-section-copy"},"Pre-filled in every new anonymization. You can still edit the list per anonymization.",-1)),o("div",_5,[t[12]||(t[12]=o("label",{class:"paper-field-label",for:"terms"},"Default terms",-1)),N(o("textarea",S5,null,512),[[s,{state:e.viewState,set:a=>{e.terms=a},value:e.terms,form:"defaultsForm",options:{debounce:250}}]]),o("small",N5,[t[8]||(t[8]=b(" One term per line (regex allowed). Each match is replaced by ",-1)),o("code",null,c(e.site_options?.ANONYMIZATION_MASK||"XXX")+"-[N]",1),t[9]||(t[9]=b(", or use ",-1)),t[10]||(t[10]=o("code",null,"term=>replacement",-1)),t[11]||(t[11]=b(" to pick your own. ",-1))]),N(o("div",D5," Terms are in an invalid format ",512),[[Y,e.defaultsForm?.terms?.errors?.format]])])]),o("section",R5,[t[23]||(t[23]=o("div",{class:"paper-section-eyebrow"},"Display",-1)),t[24]||(t[24]=o("p",{class:"paper-section-copy"},"What reviewers can see inside an anonymized repository.",-1)),o("div",T5,[o("div",A5,[N(o("input",O5,null,512),[[s,{state:e.viewState,set:a=>{e.options.link=a},value:e.options?.link,form:"defaultsForm",options:{}}]]),t[15]||(t[15]=o("label",{class:"form-check-label",for:"link"},"Keep links",-1)),t[16]||(t[16]=o("small",{class:"form-text text-muted"},"Unchecked, every link in text files is removed.",-1))]),o("div",I5,[N(o("input",P5,null,512),[[s,{state:e.viewState,set:a=>{e.options.image=a},value:e.options?.image,form:"defaultsForm",options:{}}]]),t[17]||(t[17]=o("label",{class:"form-check-label",for:"image"},"Display images",-1)),t[18]||(t[18]=o("small",{class:"form-text text-muted"},"Images are shown as is. They are not anonymized.",-1))]),o("div",V5,[N(o("input",q5,null,512),[[s,{state:e.viewState,set:a=>{e.options.pdf=a},value:e.options?.pdf,form:"defaultsForm",options:{}}]]),t[19]||(t[19]=o("label",{class:"form-check-label",for:"pdf"},"Display PDFs",-1)),t[20]||(t[20]=o("small",{class:"form-text text-muted"},"PDFs are shown as is. They are not anonymized.",-1))]),o("div",M5,[N(o("input",L5,null,512),[[s,{state:e.viewState,set:a=>{e.options.notebook=a},value:e.options?.notebook,form:"defaultsForm",options:{}}]]),t[21]||(t[21]=o("label",{class:"form-check-label",for:"notebook"},"Display notebooks",-1)),t[22]||(t[22]=o("small",{class:"form-text text-muted"},"Render Jupyter notebooks instead of raw JSON.",-1))])])]),o("section",$5,[t[33]||(t[33]=o("div",{class:"paper-section-eyebrow"},"Features",-1)),o("div",U5,[o("div",F5,[N(o("input",z5,null,512),[[s,{state:e.viewState,set:a=>{e.options.page=a},value:e.options?.page,form:"defaultsForm",options:{}}]]),t[25]||(t[25]=o("label",{class:"form-check-label",for:"page"},"GitHub Pages",-1)),t[26]||(t[26]=o("small",{class:"form-text text-muted"},"Serve an anonymized copy of the repository's GitHub Pages site. Only pages built from the anonymized branch are supported.",-1))]),o("div",H5,[N(o("input",B5,null,512),[[s,{state:e.viewState,set:a=>{e.options.loc=a},value:e.options?.loc,form:"defaultsForm",options:{}}]]),t[27]||(t[27]=o("label",{class:"form-check-label",for:"loc"},"Lines of code",-1)),t[28]||(t[28]=o("small",{class:"form-text text-muted"},"Show the line count of the repository in the explorer.",-1))]),o("div",j5,[N(o("input",G5,null,512),[[s,{state:e.viewState,set:a=>{e.options.update=a},value:e.options?.update,form:"defaultsForm",options:{}}]]),t[29]||(t[29]=o("label",{class:"form-check-label",for:"update"},"Auto-update from GitHub",-1)),t[30]||(t[30]=o("small",{class:"form-text text-muted"},"Follow the branch and pull the latest commit automatically, at most once an hour.",-1))])]),o("div",W5,[t[32]||(t[32]=o("label",{class:"paper-field-label",for:"mode"},"Fetch mode",-1)),N((l(),d("select",K5,[...t[31]||(t[31]=[o("option",{value:"GitHubStream",selected:""},"Stream from GitHub on demand",-1),o("option",{value:"GitHubDownload"},"Download to Anonymous GitHub",-1)])])),[[s,{state:e.viewState,set:a=>{e.options.mode=a},value:e.options?.mode,form:"defaultsForm",options:{}}]]),o("small",Y5," Download is faster for reviewers and enables every feature. Streaming is the only option above "+c(e.fmt?.humanFileSize(e.site_options?.MAX_REPO_SIZE*1024))+". ",1)])]),o("section",J5,[t[37]||(t[37]=o("div",{class:"paper-section-eyebrow"},"Expiration",-1)),o("div",Q5,[t[35]||(t[35]=o("label",{class:"paper-field-label",for:"expiration"},"When an anonymization expires",-1)),N((l(),d("select",X5,[...t[34]||(t[34]=[o("option",{value:"redirect"},"Redirect visitors to the GitHub repository",-1),o("option",{value:"remove",selected:""},"Remove the anonymized repository",-1)])])),[[s,{state:e.viewState,set:a=>{e.options.expirationMode=a},value:e.options?.expirationMode,form:"defaultsForm",options:{}}]]),t[36]||(t[36]=o("small",{class:"form-text text-muted"}," The expiration date itself is chosen per anonymization. Redirecting reveals the source repository, so pick it only once the review is over. ",-1))])]),e.draftRestored?(l(),d("div",Z5,[t[38]||(t[38]=b("Your unsaved draft was restored. ",-1)),o("button",{type:"button",class:"draft-discard",onClick:t[0]||(t[0]=a=>e.discardDraft())},"Discard draft")])):e.unsavedChanges?(l(),d("div",x5,[b(c(e.draftSaved?"Draft saved in this tab for 30 minutes.":"Unsaved changes. Keep this tab open until you save.")+" ",1),o("button",{type:"button",class:"draft-discard",onClick:t[1]||(t[1]=a=>e.discardDraft())},c(e.isUpdate?"Restore saved settings":"Discard changes"),1)])):p("v-if",!0),o("div",eq,[e.error?(l(),d("div",tq,[t[39]||(t[39]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})],-1)),t[40]||(t[40]=b()),o("span",{textContent:c(e.error)},null,8,oq)])):p("v-if",!0),o("div",sq,[o("button",{id:"save",type:"submit",class:"btn btn-ink",disabled:e.saving},[e.message?(l(),d("svg",rq,[...t[41]||(t[41]=[o("use",{href:"#ui-icon-check"},null,-1)])])):p("v-if",!0),b(c(e.saving?"Saving\u2026":e.message?"Saved":"Save defaults"),1)],8,nq),t[42]||(t[42]=o("span",{class:"paper-settings-hint"},"Applies to new anonymizations only. Existing ones keep their settings.",-1))])])],32)),[[i,e.viewState]]),o("section",iq,[t[50]||(t[50]=o("div",{class:"paper-section-eyebrow"},"Account",-1)),o("div",aq,[e.user?.photo?(l(),d("img",{key:0,width:"40",height:"40",class:"rounded-circle",alt:"",src:e.safeUrl(e.user?.photo)},null,8,lq)):p("v-if",!0),o("div",dq,[o("div",uq,"@"+c(e.user?.username),1),t[43]||(t[43]=o("div",{class:"paper-account-meta"},"Signed in with GitHub. Anonymous GitHub only reads your repositories.",-1))]),t[44]||(t[44]=o("a",{class:"btn btn-outline-ink",href:"/api/user/logout",target:"_self"},"Sign out",-1))]),t[51]||(t[51]=o("a",{class:"paper-settings-connection-link",href:"/connections"},[o("i",{class:"fab fa-github","aria-hidden":"true"}),o("span",null,[b("GitHub connections"),o("small",null,"Manage repository access and legacy OAuth.")]),o("span",{"aria-hidden":"true"},"\u2192")],-1)),o("div",cq,[t[48]||(t[48]=o("div",{class:"paper-danger-head"},"Delete account",-1)),t[49]||(t[49]=o("p",{class:"paper-danger-copy"}," Removes all your anonymized repositories, gists, and pull requests, revokes the application's access to your GitHub account, and erases your personal data (username, email, access tokens). This cannot be undone. ",-1)),e.deleteError?(l(),d("div",pq,[t[45]||(t[45]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-info"})],-1)),t[46]||(t[46]=b()),o("span",{textContent:c(e.deleteError)},null,8,fq)])):p("v-if",!0),o("button",{type:"button",class:"btn btn-outline-danger",onClick:t[3]||(t[3]=a=>e.deleteAccount()),disabled:e.deletingAccount},[t[47]||(t[47]=o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-trash"})],-1)),b(c(e.deletingAccount?"Deleting\u2026":"Delete my account"),1)],8,mq)])])])])])}var hq={class:"pr-page"},vq={class:"container paper-page pr-page-inner"},gq={class:"pr-header"},yq={class:"pr-title-row"},bq={class:"paper-page-title pr-title"},wq=["textContent"],kq={key:1,class:"text-muted"},Eq=["href"],Cq={class:"pr-header-meta"},_q={key:0,class:"pr-meta-item"},Sq=["textContent"],Nq={key:1,class:"pr-meta-item"},Dq=["textContent"],Rq={key:2,class:"pr-meta-item"},Tq=["textContent"],Aq={key:0,class:"pr-body-card"},Oq={key:1,class:"paper-tabs",role:"tablist"},Iq=["aria-selected","tabindex"],Pq=["aria-selected","tabindex"],Vq=["textContent"],qq={class:"paper-tab-content"},Mq={key:0,role:"tabpanel",id:"pr-diff-panel","aria-labelledby":"pr-diff-tab"},Lq=["innerHTML"],$q={key:1,role:"tabpanel",id:"pr-comments-panel","aria-labelledby":"pr-comments-tab"},Uq={class:"pr-comments"},Fq={class:"pr-comment"},zq={class:"pr-comment-head"},Hq={key:0,class:"pr-comment-author"},Bq=["textContent"],jq=["textContent"],Gq={key:0,class:"pr-comment-body"},Wq={key:0,class:"paper-table-empty"};function Pl(e,t){let n=We("markdown");return l(),d("div",hq,[o("div",vq,[t[17]||(t[17]=o("div",{class:"paper-crumbs"},[o("a",{href:"/dashboard"},"Reviewer"),b(" \xA0/\xA0 "),o("span",{class:"here"},"Pull request")],-1)),o("header",gq,[o("div",yq,[o("h1",bq,[e.details?.title?(l(),d("span",{key:0,textContent:c(e.details?.title)},null,8,wq)):p("v-if",!0),e.details?.title?p("v-if",!0):(l(),d("span",kq,"Untitled pull request"))]),e.options?.isAdmin||e.options?.isOwner?(l(),d("a",{key:0,class:"btn btn-sm","aria-label":"Edit",href:e.safeUrl("/pull-request-anonymize/"+e.pullRequestId)},[...t[4]||(t[4]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),o("span",{class:"d-none d-md-inline"}," Edit",-1)])],8,Eq)):p("v-if",!0)]),o("div",Cq,[o("span",{class:T(["paper-pill",{good:e.details?.merged,warn:e.details?.state=="open",bad:e.details?.state=="closed"&&!e.details?.merged}])},[o("span",{class:T(["status-dot",{"status-ready":e.details?.merged,"status-error":e.details?.state=="closed"&&!e.details?.merged}])},null,2),b(" "+c(e.details?.merged?"Merged":e.fmt.title(e.details?.state)),1)],2),e.details?.baseRepositoryFullName?(l(),d("span",_q,[t[5]||(t[5]=o("i",{class:"fab fa-github"},null,-1)),t[6]||(t[6]=b()),o("span",{textContent:c(e.details?.baseRepositoryFullName)},null,8,Sq)])):p("v-if",!0),e.details?.updatedDate?(l(),d("span",Nq,[t[7]||(t[7]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#project-icon-clock"})],-1)),t[8]||(t[8]=b()),o("span",{textContent:c(e.fmt?.date(e.details?.updatedDate))},null,8,Dq)])):p("v-if",!0),e.details?.anonymizeDate?(l(),d("span",Rq,[t[9]||(t[9]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-shield"})],-1)),t[10]||(t[10]=b(" Anonymized ",-1)),o("span",{textContent:c(e.fmt?.date(e.details?.anonymizeDate))},null,8,Tq)])):p("v-if",!0)])]),e.details?.body?(l(),d("section",Aq,[t[11]||(t[11]=o("div",{class:"paper-section-eyebrow"},"Description",-1)),Ce(n,{content:e.details?.body},null,8,["content"])])):p("v-if",!0),e.details?.diff||e.details?.comments?(l(),d("nav",Oq,[e.details?.diff?(l(),d("button",{key:0,class:T(["paper-tab",{active:e.tabState?.active=="diff"}]),type:"button",role:"tab",id:"pr-diff-tab","aria-selected":e.tabState?.active==="diff","aria-controls":"pr-diff-panel",tabindex:e.tabState?.active==="diff"?0:-1,onKeydown:t[0]||(t[0]=r=>e.previewTabKeydown(r)),onClick:t[1]||(t[1]=r=>e.tabState.active="diff")},[...t[12]||(t[12]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-code"})],-1),b(" Diff ",-1)])],42,Iq)):p("v-if",!0),e.details?.comments?(l(),d("button",{key:1,class:T(["paper-tab",{active:e.tabState?.active=="comments"}]),type:"button",role:"tab",id:"pr-comments-tab","aria-selected":e.tabState?.active==="comments","aria-controls":"pr-comments-panel",tabindex:e.tabState?.active==="comments"?0:-1,onKeydown:t[2]||(t[2]=r=>e.previewTabKeydown(r)),onClick:t[3]||(t[3]=r=>e.tabState.active="comments")},[t[13]||(t[13]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-comment"})],-1)),o("span",{textContent:c(e.fmt.plural(e.details?.comments?.length,{0:"No comments",one:"1 comment",other:"{} comments"}))},null,8,Vq)],42,Pq)):p("v-if",!0)])):p("v-if",!0),o("div",qq,[e.details?.diff&&e.tabState?.active=="diff"?(l(),d("div",Mq,[o("div",{class:"pr-diff",innerHTML:e.sanitize(e.fmt?.diff(e.details?.diff))},null,8,Lq)])):p("v-if",!0),e.details?.comments&&e.tabState?.active=="comments"?(l(),d("div",$q,[o("ul",Uq,[(l(!0),d(X,null,re(e.details?.comments,(r,s)=>(l(),d("li",Fq,[o("div",zq,[r?.author?(l(),d("span",Hq,[t[14]||(t[14]=o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-user"})],-1)),t[15]||(t[15]=b(" @",-1)),o("span",{textContent:c(r?.author)},null,8,Bq)])):p("v-if",!0),r?.updatedDate?(l(),d("span",{key:1,class:"pr-comment-date",textContent:c(e.fmt?.date(r?.updatedDate))},null,8,jq)):p("v-if",!0)]),r?.body?(l(),d("div",Gq,[Ce(n,{content:r?.body},null,8,["content"])])):p("v-if",!0)]))),256)),e.details?.comments?.length?p("v-if",!0):(l(),d("li",Wq,[...t[16]||(t[16]=[o("svg",{class:"ui-icon","aria-hidden":"true"},[o("use",{href:"#ui-icon-comment"})],-1),o("span",null,"No comments on this pull request.",-1)])]))])])):p("v-if",!0)])])])}var Kq={class:"container paper-page status-page"},Yq={class:"d-flex align-items-end justify-content-between flex-wrap",style:{gap:"12px"}},Jq={class:"paper-page-title"},Qq=["textContent"],Xq={key:1},Zq={class:"paper-settings-section"},xq={key:0,class:"paper-ratelimit-card",role:"status"},eM={class:"paper-error-msg"},tM=["aria-valuenow"],oM={class:"paper-progress-label"},sM=["textContent"],nM={key:0},rM=["textContent"],iM={class:"paper-progress-pct"},aM={key:2,class:"paper-error-card",role:"alert"},lM={key:0,class:"paper-error-msg"},dM={key:1,class:"paper-error-msg"},uM={class:"paper-error-actions"},cM=["href"],pM={class:"paper-detail-grid"},fM={class:"detail-value"},mM=["href"],hM={key:0,class:"detail-label"},vM={key:1,class:"detail-value"},gM=["href"],yM={key:3,class:"anonymize-submit-bar"},bM=["href"],wM=["href"];function Vl(e,t){return l(),d("div",Kq,[t[15]||(t[15]=o("div",{class:"paper-crumbs"},[b("Anonymization \xA0/\xA0 "),o("span",{class:"here"},"Status")],-1)),o("div",Yq,[o("div",null,[o("h1",Jq,[t[0]||(t[0]=b("Status of ",-1)),o("em",null,c(e.repoId),1)]),t[1]||(t[1]=o("p",{class:"paper-page-lede"},"Track progress as your anonymization is prepared.",-1))]),o("span",{class:T(["status-pill",{"status-pill-ready":e.repo?.status=="ready","status-pill-error":e.repo?.status=="error","status-pill-removed":e.repo?.status=="removed"||e.repo?.status=="expired","status-pill-ratelimit":e.rateLimitResetAt}])},[o("span",{class:T(["status-dot",{"status-ready":e.repo?.status=="ready","status-error":e.repo?.status=="error","status-removed":e.repo?.status=="removed"||e.repo?.status=="expired","status-ratelimit":e.rateLimitResetAt}])},null,2),e.rateLimitResetAt?p("v-if",!0):(l(),d("span",{key:0,textContent:c(e.fmt?.title(e.repo?.status))},null,8,Qq)),e.rateLimitResetAt?(l(),d("span",Xq,"Rate limited")):p("v-if",!0)],2)]),o("section",Zq,[t[13]||(t[13]=o("div",{class:"paper-section-eyebrow"},"Progress",-1)),t[14]||(t[14]=o("p",{class:"paper-section-copy"},[b(" The repository will take a few minutes to get ready, depending on its size. Visit the "),o("a",{href:"/faq"},"FAQ"),b(" for more information. ")],-1)),e.rateLimitResetAt?(l(),d("div",xq,[t[4]||(t[4]=ce('
Temporarily paused
GitHub API rate limit reached
',1)),o("p",eM,[t[2]||(t[2]=b("Anonymization will resume automatically in ",-1)),o("strong",null,c(e.rateLimitCountdown),1),t[3]||(t[3]=b(". No action needed \u2014 the job is queued and will continue where it left off.",-1))])])):p("v-if",!0),e.repo?.status!="error"&&!e.rateLimitResetAt?(l(),d("div",{key:1,class:T(["paper-progress",{"paper-progress-ready":e.repo?.status=="ready"}]),role:"progressbar","aria-valuemin":"0","aria-valuemax":"100","aria-valuenow":e.progress},[o("div",{class:"paper-progress-bar",style:Me("width: "+e.progress+"%;")},null,4),o("div",oM,[o("span",{textContent:c(e.fmt?.title(e.repo?.status))},null,8,sM),e.repo?.statusMessage?(l(),d("span",nM,[t[5]||(t[5]=b("\xA0\xB7\xA0",-1)),o("span",{textContent:c(e.repo?.statusMessage)},null,8,rM)])):p("v-if",!0),o("span",iM,c(e.progress||0)+"%",1)])],10,tM)):p("v-if",!0),e.repo?.status=="error"&&!e.rateLimitResetAt?(l(),d("div",aM,[t[8]||(t[8]=ce('
Anonymization failed
Something went wrong while preparing this repository.
',1)),e.repo?.statusMessage?(l(),d("p",lM,c(e.fmt?.translate("ERRORS."+e.repo?.statusMessage)),1)):p("v-if",!0),e.repo?.statusMessage?p("v-if",!0):(l(),d("p",dM,"No additional details were reported. The most common causes are private repositories, missing branches, and rate limits.")),t[9]||(t[9]=o("ul",{class:"paper-error-hints"},[o("li",null,"Make sure the source URL points to a repository or pull request you can access."),o("li",null,"Check that the chosen branch and commit still exist on GitHub."),o("li",null,"If you just signed in, the access token may need a moment to propagate \u2014 try again.")],-1)),o("div",uM,[o("a",{class:"btn btn-ink",href:e.safeUrl("/anonymize/"+e.repoId)},[...t[6]||(t[6]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-edit"})],-1),b(" Edit anonymization",-1)])],8,cM),t[7]||(t[7]=ce(' Read the FAQ Report a bug in Anonymous GitHub',2))])])):p("v-if",!0),o("div",pM,[t[10]||(t[10]=o("div",{class:"detail-label"},"Repository",-1)),o("div",fM,[o("a",{target:"_self",href:e.safeUrl("/r/"+e.repoId+"/")},"/r/"+c(e.repoId)+"/",9,mM)]),e.repo?.options?.page?(l(),d("div",hM,"GitHub Page")):p("v-if",!0),e.repo?.options?.page?(l(),d("div",vM,[o("a",{target:"_self",href:e.safeUrl("/w/"+e.repoId+"/")},"/w/"+c(e.repoId)+"/",9,gM)])):p("v-if",!0)]),e.repo?.status=="ready"?(l(),d("div",yM,[o("a",{class:"btn btn-ink",target:"_self",href:e.safeUrl("/r/"+e.repoId+"/")},[...t[11]||(t[11]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#project-icon-eye"})],-1),b(" Go to anonymized repository ",-1)])],8,bM),e.repo?.options?.page?(l(),d("a",{key:0,class:"btn",target:"_self",href:e.safeUrl("/w/"+e.repoId+"/")},[...t[12]||(t[12]=[o("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[o("use",{href:"#ui-icon-globe"})],-1),b(" Go to anonymized GitHub page ",-1)])],8,wM)):p("v-if",!0)])):p("v-if",!0)]),t[16]||(t[16]=ce('
Support Anonymous GitHub

A small team keeps this running. If it helps you, please consider contributing back \u2014 in code, ideas, or coffee.

',1))])}var sn={"partials/connections.htm":al,"partials/signin.htm":ll,"partials/404.htm":dl,"partials/admin/conferences.htm":ul,"partials/admin/errors.htm":cl,"partials/admin/overview.htm":pl,"partials/admin/queues.htm":fl,"partials/admin/repositories.htm":ml,"partials/admin/user.htm":hl,"partials/admin/users.htm":vl,"partials/anonymize.htm":gl,"partials/anonymizePullRequest.htm":yl,"partials/claim.htm":bl,"partials/conference.htm":wl,"partials/conferences.htm":kl,"partials/dashboard.htm":El,"partials/explorer.htm":Cl,"partials/faq.htm":_l,"partials/gist.htm":Sl,"partials/header.htm":Nl,"partials/home.htm":Dl,"partials/loading.htm":Rl,"partials/newConference.htm":Tl,"partials/pageView.htm":Al,"partials/pr-dashboard.htm":Ol,"partials/profile.htm":Il,"partials/pullRequest.htm":Pl,"partials/status.htm":Vl};var kM={class:"ui-icon-definitions","aria-hidden":"true",focusable:"false"};function ql(e,t){return l(),d("svg",kM,[...t[0]||(t[0]=[ce('',1)])])}function Ml(e,t){e==="partials/explorer.htm"&&(t.sidebarCollapsed=window.matchMedia?.("(max-width: 767px)").matches||!1),e==="partials/anonymize.htm"&&(t.prTabState={active:t.options.diff?"diff":"comments"},t.watchGroup(["options.diff","options.comments"],()=>{t.options[t.prTabState.active]||(t.prTabState.active=t.options.diff?"diff":t.options.comments?"comments":null)})),e==="partials/gist.htm"&&(t.tabState={active:t.details?.files?"files":"comments"}),["partials/conferences.htm","partials/conference.htm"].includes(e)&&(t.statusLabels={ready:"Ready",expired:"Expired",removed:"Removed"});let r={"partials/dashboard.htm":["filteredItems",()=>t.items,"itemFilter"],"partials/conferences.htm":["filteredConferences",()=>t.conferences,"conferenceFilter"],"partials/conference.htm":["filteredRepositories",()=>t.conference?.repositories,"repoFiler"],"partials/admin/repositories.htm":["filteredRepositories",()=>t.repositories,"repoFiler"],"partials/admin/user.htm":["filteredRepositories",()=>t.repositories,"repoFiler"],"partials/admin/users.htm":["filteredUsers",()=>t.users,"userFiler"],"partials/admin/conferences.htm":["filteredConferences",()=>t.conferences]}[e];if(r){let s=ot(()=>t.fmt.orderBy(t.fmt.filter(r[1](),t[r[2]]),t.orderBy));Object.defineProperty(t,r[0],{configurable:!0,get:()=>s.value})}}function Ll(e=(...t)=>fetch(...t)){async function t(r,s,i,a={}){let u=new URL(s,window.location.href);for(let[g,k]of Object.entries(a.params||{}))if(k!=null)for(let m of Array.isArray(k)?k:[k])u.searchParams.append(g,typeof m=="object"?JSON.stringify(m):m);let f=new AbortController,h;a.timeout?.then?a.timeout.then(()=>f.abort()):a.timeout&&(h=setTimeout(()=>f.abort(),a.timeout));try{let g={Accept:"application/json, text/plain, */*",...a.headers},k=document.cookie.match(/(?:^|;\s*)XSRF-TOKEN=([^;]*)/);k&&u.origin===window.location.origin&&(g["X-XSRF-TOKEN"]=decodeURIComponent(k[1]));let m;i!==void 0&&(i instanceof FormData?m=i:(g["Content-Type"]||(g["Content-Type"]="application/json;charset=utf-8"),m=JSON.stringify(i)));let y=await e(u.href,{method:r,headers:g,body:m,credentials:"same-origin",signal:f.signal}),E=await y.text(),w=E;if(a.transformResponse)w=a.transformResponse(E);else if(E&&(/json/i.test(y.headers.get("content-type")||"")||/^[\[{]/.test(E.trim())))try{w=JSON.parse(E)}catch{}let R={data:w,status:y.status,headers:D=>y.headers.get(D)};if(!y.ok)throw R;return R}catch(g){throw g.name==="AbortError"?{status:-1,data:null}:g}finally{clearTimeout(h)}}let n={};for(let r of["get","delete","head"])n[r]=(s,i)=>t(r.toUpperCase(),s,void 0,i);for(let r of["post","put","patch"])n[r]=(s,i,a)=>t(r.toUpperCase(),s,i,a);return n}var $l={resolve:e=>Promise.resolve(e),reject:e=>Promise.reject(e),all:e=>Promise.all(e),defer(){let e,t;return{promise:new Promise((r,s)=>{e=r,t=s}),resolve:e,reject:t}}};var Ul=function(e){function t(n){return n=n||{used:0,total:0},n.unlimited=!n.total,n.percent=n.unlimited?0:Math.min(100,n.used*100/n.total),n.level=n.unlimited?"unlimited":n.percent>=95?"danger":n.percent>=80?"warn":"ok",n}return{decorate:t,load:function(){return e.get("/api/user/quota").then(n=>{let r=n.data||{};return r.storage=t(r.storage),r.file=t(r.file),r.repository=t(r.repository),r})}}};var rr={};rd(rr,{bigNum:()=>CM,date:()=>VM,diff:()=>RM,filter:()=>IM,humanFileSize:()=>EM,humanTime:()=>_M,limitTo:()=>OM,number:()=>TM,orderBy:()=>PM,plural:()=>qM,statusLabel:()=>NM,statusMsg:()=>DM,title:()=>SM,uppercase:()=>AM});var EM=e=>window.humanFileSize(e),CM=(function(){return function(t){let n=Number(t)||0,r=Math.abs(n);return r<1e3?String(n):r<1e4?(n/1e3).toFixed(1).replace(/\.0$/,"")+"k":r<1e6?Math.round(n/1e3)+"k":r<1e7?(n/1e6).toFixed(1).replace(/\.0$/,"")+"M":Math.round(n/1e6)+"M"}})(),_M=(function(){return function(t){if(!t)return"never";t instanceof Date&&(t=Math.round((Date.now()-t)/1e3)),(typeof t=="string"||typeof t=="number")&&(t=Math.round((Date.now()-new Date(t))/1e3));var n=t<0?"from now":"ago";if(Math.abs(t)>7200*24){let f=new Date;return f.setSeconds(f.getSeconds()-t),"on "+f.toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"})}t=Math.abs(t);for(var r=[t/60/60/24/365,t/60/60/24/30,t/60/60/24/7,t/60/60/24,t/60/60,t/60,t],s=["year","month","week","day","hour","minute","second"],i=0;i1&&(u+="s"),a>=1)return a+" "+u+" "+n}return"0 seconds "+n}})(),SM=(function(){return function(e){if(!e)return e;e=e.toLowerCase();var t=e.split(" "),n=t.map(function(r){return r.charAt(0).toUpperCase()+r.substring(1,r.length)});return n.join(" ")}})(),NM=(function(){var e={ready:"Ready",error:"Error",expired:"Expired",expiring:"Expiring",removed:"Removed",removing:"Removing",queue:"Queued",download:"Downloading",downloaded:"Downloaded",preparing:"Preparing",anonymizing:"Anonymizing"};return function(t){if(!t)return"";if(e[t])return e[t];var n=String(t).replace(/[_-]+/g," ").toLowerCase();return n.charAt(0).toUpperCase()+n.slice(1)}})(),DM=(function(){var e={branch_not_found:"Branch not found on GitHub",repo_not_found:"Repository not found on GitHub",repository_not_found:"Repository not found on GitHub",repo_not_accessible:"Repository is not accessible with your token",pr_not_found:"Pull request not found on GitHub",gist_not_found:"Gist not found on GitHub",commit_not_found:"Commit not found on GitHub",repo_too_big:"Repository exceeds the size limit",quota_exceeded:"Storage quota exceeded",incomplete_record:"Incomplete record: missing identifier"};return function(t){if(!t)return t;var n=t.match(/^rate_limited:(\d+)$/);if(n){var r=Math.max(0,Math.ceil((parseInt(n[1],10)-Date.now())/1e3));if(r<=0)return"Rate limited \u2014 resuming soon";var s=Math.floor(r/60),i=r%60;return"Rate limited \u2014 retrying in "+(s>0?s+"m "+i+"s":i+"s")}if(e[t])return e[t];if(/^[a-z0-9]+(_[a-z0-9]+)+$/.test(t)){var a=t.replace(/_/g," ");return a.charAt(0).toUpperCase()+a.slice(1)}return t}})(),RM=(function(e){let t=r=>r.replace(/&/g,"&").replace(//g,">");function n(r,s){if(!s)return;let i=s.newPath&&s.newPath!=="/dev/null"?s.newPath:s.oldPath||"",a=s.oldPath==="/dev/null"?"added":s.newPath==="/dev/null"?"deleted":s.oldPath&&s.newPath&&s.oldPath!==s.newPath?"renamed":"modified";if(r.push('
'),r.push('
'+t(i)+''+a+"
"),s.lines.length){r.push('');for(let u of s.lines)r.push('");r.push("
'+(u.oldNo||"")+''+(u.newNo||"")+''+(u.kind==="add"?"+":u.kind==="remove"?"-":u.kind==="hunk"?"@":"")+''+t(u.text)+"
")}r.push("
")}return function(r){if(!r)return r;let s=[],i=null,a=0,u=0,f=()=>(i||(i={oldPath:"",newPath:"",lines:[]}),i),h=()=>{i&&(i.lines.length||i.oldPath||i.newPath)&&(n(s,i),i=null)},g=r.split(` -`);for(let k=0;ke});function TM(e,t){return e==null?"":Number(e).toLocaleString(void 0,t==null?{}:{minimumFractionDigits:t,maximumFractionDigits:t})}function AM(e){return String(e??"").toUpperCase()}function OM(e,t,n=0){return(e||[]).slice(n,n+t)}function IM(e,t){return Array.isArray(e)?typeof t=="function"?e.filter(t):e:[]}function PM(e,t){if(!t)return e||[];let n=Array.isArray(t)?t:[t];return[...e||[]].sort((r,s)=>{for(let i of n){let a=i[0]==="-"?-1:1;i=i.replace(/^[+-]/,"");let u=i.split(".").reduce((h,g)=>h?.[g],r),f=i.split(".").reduce((h,g)=>h?.[g],s);if(typeof u=="string"&&(u=u.toLowerCase()),typeof f=="string"&&(f=f.toLowerCase()),u!==f)return(u==null?-1:f==null?1:ur[s])}function qM(e,t){return(t?.[e]??t?.[e===1?"one":"other"]??"").replace(/\{\}/g,e??0)}var Fl={ERRORS:{cache_busy:"Downloads are busy. Please try again shortly.",invalid_sort:"The selected sort order is invalid.",invalid_cursor:"This project page is no longer valid. Reload the list.",repository_changed:"The repository changed while processing. Please retry.",repository_job_cancelled:"The repository changed or was removed while processing.",storage_delete_failed:"Unable to remove cached files. Please try again later.",unknown_error:"Unknown error, contact the admin.",unreachable:"Anonymous GitHub is unreachable, contact the admin.",request_error:"Unable to download the file, check your connection or contact the admin.",not_found:"The requested resource could not be found.",not_connected:"You must be logged in to perform this action.",not_authorized:"You do not have permission to perform this action.",unable_to_connect_user:"Unable to connect your account. Please try again later.",user_not_found:"The requested user could not be found.",user_banned:"Your account has been banned. Contact the admin for more information.",repo_access_limited:"GitHub blocked access because the repository's organization restricts third-party OAuth apps. Ask an org owner to approve Anonymous GitHub under Settings \u2192 Third-party Access \u2192 OAuth app policy, or anonymize a personal fork instead.",repo_saml_enforcement:"The repository's organization enforces SAML single sign-on. Authorize your token for that organization (GitHub \u2192 Settings \u2192 Applications, or re-run the org's SSO sign-in), then retry. Alternatively, anonymize a personal fork.",repo_not_found:"The repository was not found on GitHub. Check the URL and spelling, make sure you are signed in to the account that can see it, and confirm the repo isn't hidden under an org that restricts third-party app access.",repo_empty:"The selected branch has no commits on GitHub. Push at least one commit, or pick a different branch, then retry.",repo_not_accessible:"Anonymous GitHub cannot access this repository. Verify the repository exists and that Anonymous GitHub has been authorized for the owning organization.",repository_archived:"This repository has been archived and its files are no longer available.",repository_expired:"The repository is expired.",invalid_status:"This action cannot be performed while the resource is in its current state.",repository_not_ready:"Anonymous GitHub is still processing the repository, it can take several minutes.",repository_not_accessible:"This repository is currently not accessible.",repo_is_updating:"Anonymous GitHub is still processing the repository, it can take several minutes.",invalid_repo:"The provided repository is not valid.",invalid_source_repository:"The repository source name is invalid; expected the form 'owner/name'.",repoId_not_defined:"A repository ID must be provided.",repoUrl_not_defined:"The repository URL needs to be defined.",source_not_provided:"A repository source must be provided.",github_rate_limit_exceeded:"GitHub temporarily blocked the request because we hit its API rate limit. Wait a few minutes and try again. If the problem persists and you contact GitHub Support, include the request ID and timestamp shown in GitHub's response (the 'X-GitHub-Request-Id' header).",rate_limited:"GitHub API rate limit reached. The repository will be available shortly \u2014 please wait a moment and refresh.",repoId_already_used:"The repository ID is already used.",invalid_repoId:"The format of the repository ID is invalid.",unsupported_source:"The repository source type is not supported.",branch_not_specified:"The branch is not specified.",branch_not_found:"The branch of the repository cannot be found.",commit_not_specified:"A commit must be specified.",commit_not_found:"The configured commit no longer exists in the source repository. It may have been force-pushed, rebased, or removed.",repo_renamed:"The source repository appears to have been renamed or moved on GitHub. Please refresh and try again \u2014 the cached name has been updated.",invalid_commit_format:"The commit hash format is invalid. It must be a hexadecimal string.",pull_request_not_found:"The requested pull request could not be found.",pull_request_expired:"This pull request has expired and is no longer available.",pull_request_not_ready:"This pull request is still being prepared. Please try again shortly.",pull_request_not_available:"This pull request is currently not available.",invalid_pullRequestId:"The pull request ID is invalid.",pullRequestId_already_used:"This pull request ID is already in use. Please choose a different one.",repository_not_specified:"A repository must be specified for this pull request.",pullRequestId_not_specified:"A pull request ID must be specified.",pullRequestId_is_not_a_number:"The source pull request ID must be a number.",options_not_provided:"Anonymization options are mandatory.",terms_not_specified:"Anonymization terms must be specified.",invalid_terms_format:"Terms are in an invalid format.",missing_content:"No content was provided to the anonymization preview.",unable_to_anonymize:"An error happened during the anonymization process. Please try later or report the issue.",non_supported_mode:"The selected anonymization mode is invalid, only download and stream are supported.",invalid_path:"The provided path is invalid or missing.",path_not_specified:"A file path must be specified.",path_not_defined:"The file path has not been resolved yet.",invalid_file_path:"The requested file path is not valid.",invalid_request:"The request is missing required fields or is malformed.",invalid_project_name:"Use a project name of up to 100 characters without line breaks or control characters.",no_file_selected:"Please select a file.",file_not_found:"The requested file is not found.",file_not_accessible:"The requested file is not accessible.",file_not_supported:"The file type is not supported. Anonymous GitHub cannot handle it.",file_too_big:"The file size exceeds the limit of Anonymous GitHub.",is_folder:"The path points to a folder.",folder_not_supported:"The path points to a folder. Please select a file.",unable_to_write_file:"Unable to write file on disk.",download_not_enabled:"Repository downloads are not enabled on this server.",unable_to_download:"The repository could not be downloaded. Please try again later.",s3_config_not_provided:"Object storage has not been configured on this server.",stats_unsupported:"Statistics are only supported in download mode.",branches_not_found:"The requested branch is not found.",readme_not_available:"No README for the repository is found.",page_not_supported_on_different_branch:"GitHub Pages is served from a different branch than the one selected. Pick the branch that GitHub Pages is configured to use.",page_not_activated:"GitHub Pages is not enabled on this repository. Enable it in the repository settings on GitHub before anonymizing.",is_removed:"This resource has been removed and is no longer available.",conf_name_missing:"A conference name is required.",conf_id_missing:"A conference ID is required.",conf_id_used:"This conference ID is already in use. Please choose a different one.",conf_start_date_missing:"A start date is required for the conference.",conf_end_date_missing:"An end date is required for the conference.",conf_start_date_invalid:"The start date must be before the end date.",conf_end_date_invalid:"The end date must be in the future.",invalid_plan:"The selected plan is not valid.",conference_not_found:"The requested conference could not be found.",conf_not_found:"The requested conference could not be found.",conf_not_activated:"The conference is not activated.",billing_missing:"Billing information is required for this plan.",billing_name_missing:"A billing name is required.",billing_email_missing:"A billing email is required.",billing_address_missing:"A billing address is required.",billing_city_missing:"A billing city is required.",billing_zip_missing:"A billing ZIP/postal code is required.",billing_country_missing:"A billing country is required.",queue_not_found:"The specified queue could not be found.",job_not_found:"The specified job could not be found in the queue.",error_retrying_job:"An error occurred while retrying the job.",gist_expired:"The gist is expired.",gist_not_ready:"Anonymous GitHub is still processing the gist, it can take several minutes.",gist_not_found:"The requested gist could not be found.",gist_not_available:"This gist is currently not available.",invalid_gistId:"The format of the gist ID is invalid.",gistId_not_specified:"A gist ID must be provided.",gistId_already_used:"The gist ID is already used.",missing_token:"An authentication token is required.",invalid_token:"The provided authentication token is invalid.",login_failed:"Login failed. Please try again.",server_error:"An unexpected server error occurred. Please try again later.",username_not_defined:"A username must be provided.",github_user_not_found:"The specified GitHub user could not be found.",cannot_coauthor_self:"You cannot add yourself as a co-author.",storage_write_size_mismatch:"The downloaded file was smaller than expected. The upstream source may have returned an incomplete response \u2014 please try again.",storage_read_error:"An error occurred while reading the file from storage \u2014 please try again.",upstream_error:"A temporary error occurred while fetching from GitHub \u2014 please try again.",token_expired:"Your GitHub access token has expired. Please log out and log in again to refresh it.",job_is_active:"This job is currently running \u2014 wait for it to finish or remove it first.",github_app_access_required:"Allow this repository on GitHub using the read-only access button, then retry. Organization access may require administrator approval.",github_app_reconnect_required:"Reconnect your GitHub App account to restore read-only access.",github_app_disabled:"New GitHub App connections are currently unavailable.",github_oauth_required:"Connect legacy GitHub OAuth to use this feature.",github_identity_mismatch:"Use the same GitHub account that you are signed in with here.",github_app_permissions_invalid:"The GitHub App must be configured with read-only permissions.",github_unavailable:"GitHub is temporarily unavailable. Please retry.",connection_changed:"The repository connection changed. Reload and try again.",repository_busy:"Wait for the repository operation to finish before changing its connection.",invalid_connection:"Select a supported GitHub connection.",github_oauth_disabled:"Legacy OAuth sign-in is currently disabled.",invalid_auth_state:"The authorization session expired. Please start again from Anonymous GitHub.",invalid_webhook_signature:"The webhook signature is invalid.",webhook_processing_failed:"Webhook processing failed. Retry the delivery.",github_app_authorization_cancelled:"GitHub authorization was cancelled.",github_account_link_required:"Verify your existing account with your previous GitHub connection. Future sign-ins will use the GitHub App.",github_app_refresh_busy:"GitHub credentials are being renewed. Please retry shortly.",github_grant_revocation_failed:"Unable to revoke the GitHub grant. Please retry.",another_login_required:"Connect and verify another sign-in method before disconnecting OAuth.",oauth_resources_remaining:"Some resources still require OAuth. Migrate or remove them before disconnecting.",invalid_github_path:"The GitHub repository path is invalid."},WARNINGS:{page_not_enabled_on_repo:"GitHub Pages is not enabled on this repository. Enable it in the repository's Settings \u2192 Pages on GitHub, then refresh.",page_branch_mismatch:"GitHub Pages on this repository is served from the '{{pageBranch}}' branch, but you selected '{{selectedBranch}}'. Switch the branch above to '{{pageBranch}}' to anonymize the Pages site.",folder_truncated:"This folder has more than 10,000 entries; only a partial listing is shown.",repo_truncated:"Some folders in this repository have too many files to be fully listed. Affected folders are marked with a warning icon.",submodules_not_included:"This repository uses git submodules. Submodule contents are not included in the anonymized repository and appear as empty folders."}};var zl={name:"htmlDoc",props:["content","baseUrl","allowScripts"],setup(e){let t=et(null);return Mt(()=>{let r=[t.value][0];r.classList.add("html-doc");function s(){r.innerHTML="";let i=e.content;if(typeof i!="string")return;let a=document.createElement("iframe");a.className="html-doc-frame",a.setAttribute("title","Rendered HTML document");let u=["allow-popups","allow-popups-to-escape-sandbox"];e.allowScripts&&u.push("allow-scripts","allow-forms","allow-modals"),a.setAttribute("sandbox",u.join(" ")),a.setAttribute("referrerpolicy","no-referrer"),r.appendChild(a);let f="";e.baseUrl&&(f=''),a.srcdoc=f+i}Be(()=>e.content,s,{immediate:!0}),Be(()=>e.baseUrl,s,{immediate:!0}),Be(()=>e.allowScripts,s,{immediate:!0})}),()=>ke("html-doc",{ref:t})}};var Hl={name:"pdfviewer",props:["src"],setup(e){let t=et(null);return Mt(()=>{let n=[t.value],r=400,s=[.5,.75,1,1.25,1.5,2,3],i=1e3,a=n[0];a.classList.add("pdf-viewer");let u=null,f=[],h=!1,g=null,k=1,m=1,y=0,E=0,w=612/792,R=0,D=null,A=new Map,V=0;function H(M){let v=A.get(M);v&&(v.cancelled=!0,v.task?.cancel?.(),A.delete(M));let C=M.querySelector("canvas");C&&(C.width=0,C.height=0),M.innerHTML="",delete M.dataset.state}let q=document.createElement("div");q.className="pdf-toolbar";let U=document.createElement("div");U.className="pdf-pages",U.tabIndex=0,U.setAttribute("aria-label","PDF pages"),a.appendChild(q),a.appendChild(U);function ae(M,v,C){let P=document.createElement("button");return P.type="button",P.className="pdf-toolbar-btn",P.title=v,P.setAttribute("aria-label",v),P.innerHTML='',P.addEventListener("click",C),P}let ie=ae("fa-chevron-up","Previous page",function(){_e(m-1)}),_=ae("fa-chevron-down","Next page",function(){_e(m+1)}),O=document.createElement("input");O.type="text",O.className="pdf-toolbar-page",O.setAttribute("aria-label","Page number"),O.title="Page number \u2014 type a page and press Enter",O.addEventListener("keydown",function(M){M.key==="Enter"&&(_e(parseInt(O.value,10)),O.blur())}),O.addEventListener("blur",function(){O.value=String(m)});let G=document.createElement("span");G.className="pdf-toolbar-count";let J=ae("fa-search-minus","Zoom out",function(){S(s[Math.max(0,pe()-1)])}),ee=ae("fa-search-plus","Zoom in",function(){S(s[Math.min(s.length-1,pe()+1)])}),Q=document.createElement("button");Q.type="button",Q.className="pdf-toolbar-btn pdf-toolbar-zoom",Q.title="Reset zoom to fit the width",Q.setAttribute("aria-label","Reset zoom to fit the width"),Q.addEventListener("click",function(){S(1)}),q.appendChild(ie),q.appendChild(_);let oe=document.createElement("span");oe.className="pdf-toolbar-group",oe.appendChild(O),oe.appendChild(G),q.appendChild(oe);let ue=document.createElement("span");ue.className="pdf-toolbar-group pdf-toolbar-right",ue.appendChild(J),ue.appendChild(Q),ue.appendChild(ee),q.appendChild(ue);function pe(){let M=0;for(let v=0;v=M,Q.textContent=Math.round(k*100)+"%",J.disabled=pe()===0,ee.disabled=pe()===s.length-1}function Ie(M){let v=f[M-1];v&&(U.scrollTop+=v.getBoundingClientRect().top-U.getBoundingClientRect().top)}function _e(M){if(!u||isNaN(M))return;let v=Math.min(Math.max(1,M),u.numPages);f[v-1]&&(Ie(v),m=v,y=v,E=Date.now()+800,le(),Ue())}function Ae(){if(!f.length||Date.now(){}),D=null),g&&(clearTimeout(g),g=null),u&&(u.destroy(),u=null),f=[],m=1,U.innerHTML="",le()}function Pe(){U.innerHTML="";let M=document.createElement("div");M.className="pdf-viewer-error",M.textContent="This PDF could not be displayed.",U.appendChild(M)}function Se(){let M=Math.max(120,U.clientWidth-24);return Math.round(Math.min(M,i)*k)}function $e(M,v,C){let P=window.devicePixelRatio||1,F=M.getViewport({scale:1}),B=parseFloat(v.style.width);if(!B)return;let L=M.getViewport({scale:B/F.width*P}),W=document.createElement("canvas");return W.width=Math.floor(L.width),W.height=Math.floor(L.height),W.style.width=B+"px",W.style.height=Math.floor(L.height/P)+"px",v.innerHTML="",v.appendChild(W),v.style.height=W.style.height,C.task=M.render({canvasContext:W.getContext("2d"),viewport:L}),C.task.promise}function Ue(){if(!u)return;let M=R,v=U.getBoundingClientRect(),C=v.top-r,P=v.top+U.clientHeight+r,F=f.map((L,W)=>({slot:L,i:W,rect:L.getBoundingClientRect()})).filter(L=>L.rect.top<=P&&L.rect.bottom>=C).sort((L,W)=>Math.abs(L.rect.top-v.top)-Math.abs(W.rect.top-v.top)).slice(0,6),B=new Set(F.map(L=>L.slot));for(let L of A.keys())B.has(L)||H(L);for(let{slot:L,i:W}of F){if(L.dataset.state||V>=2)continue;let x={cancelled:!1,task:null};A.set(L,x),V++,L.dataset.state="rendering";let Z;u.getPage(W+1).then(K=>{if(Z=K,!(x.cancelled||M!==R))return $e(Z,L,x)}).then(()=>{x.cancelled||M!==R||(L.dataset.state="done",y&&Date.now(){!x.cancelled&&M===R&&(L.dataset.state="failed")}).finally(()=>{V--,Z?.cleanup?.(),u&&Ue()})}}function z(){h||(h=!0,window.requestAnimationFrame(function(){h=!1,Ae(),Ue()}))}function ne(){let M=!1;function v(){M||(M=!0,Ue())}window.requestAnimationFrame(v),window.setTimeout(v,50)}function te(){R++,f.forEach(H);let M=Se();f.forEach(function(v){delete v.dataset.state,v.innerHTML="",v.style.width=M+"px",v.style.height=Math.round(M/w)+"px"}),Ue()}function S(M){if(!u||!f.length||M===k)return;let v=m;k=M,le(),te(),_e(v)}function I(){u&&(g&&clearTimeout(g),g=setTimeout(function(){g=null,u&&f.length&&te()},250))}function j(M){if(Ee(),!M)return;let v=R;D=pdfjsLib.getDocument({url:M,isEvalSupported:!1,standardFontDataUrl:"/script/external/pdf-standard-fonts/",cMapUrl:"/script/external/pdf-cmaps/",cMapPacked:!0}),D.promise.then(function(C){if(v!==R){C.destroy();return}return u=C,u.getPage(1).then(function(P){if(v!==R)return;let F=P.getViewport({scale:1});F.width&&F.height&&(w=F.width/F.height);let B=Se();for(let L=1;L<=u.numPages;L++){let W=document.createElement("div");W.className="pdf-viewer-page",W.style.width=B+"px",W.style.height=Math.round(B/w)+"px",U.appendChild(W),f.push(W)}le(),ne()})}).catch(function(){v===R&&Pe()})}U.addEventListener("scroll",z,{passive:!0}),$(window).on("resize",I),le(),Be(()=>e.src,j,{immediate:!0}),ao(function(){U.removeEventListener("scroll",z),$(window).off("resize",I),Ee()})}),()=>ke("pdfviewer",{ref:t})}};var LM={key:0,class:"quota-row quota-usage"},$M={class:"quota-header"},UM={class:"quota-label"},FM={class:"project-type-svg","aria-hidden":"true"},zM=["href"],HM={key:0,class:"quota-percent"},BM={key:1,class:"quota-unlimited-tag"},jM={class:"quota-value"},GM={key:0},WM=["aria-label","aria-valuenow","aria-valuemax","aria-valuetext"],KM={key:1,class:"quota-remaining"},YM={key:2,class:"quota-remaining quota-limit"};function Bl(e,t){return e.quota?(l(),d("div",LM,[(l(),d(X,null,re([{key:"repository",label:"Repositories",kind:"count",icon:"project-type-repo"},{key:"storage",label:"Storage",kind:"bytes",icon:"project-icon-storage"},{key:"file",label:"Files",kind:"count",icon:"project-icon-file"}],n=>o("div",{class:T(["quota-item","quota-"+e.quota[n.key].level]),key:n.key},[o("div",$M,[o("span",UM,[(l(),d("svg",FM,[o("use",{href:"#"+n.icon},null,8,zM)])),b(c(n.label),1)]),e.quota[n.key].unlimited?p("v-if",!0):(l(),d("span",HM,c(e.fmt.number(e.quota[n.key].percent,0))+"% used",1)),e.quota[n.key].unlimited?(l(),d("span",BM,"Unlimited")):p("v-if",!0)]),o("div",jM,[o("strong",null,c(e.formatAmount(e.quota[n.key].used,n.kind)),1),e.quota[n.key].unlimited?p("v-if",!0):(l(),d("span",GM," / "+c(e.formatAmount(e.quota[n.key].total,n.kind)),1))]),e.quota[n.key].unlimited?p("v-if",!0):(l(),d("div",{key:0,class:T(["quota-track","quota-"+e.quota[n.key].level]),role:"progressbar","aria-valuemin":"0","aria-label":n.label+" quota","aria-valuenow":Math.min(e.quota[n.key].used,e.quota[n.key].total),"aria-valuemax":e.quota[n.key].total,"aria-valuetext":e.fmt.number(e.quota[n.key].percent,0)+"% used"},[e.quota[n?.key].unlimited?p("v-if",!0):(l(),d("div",{key:0,class:"quota-fill",style:Me({width:e.quota[n.key].percent+"%"})},null,4))],10,WM)),!e.quota[n.key].unlimited&&e.quota[n.key].used=e.quota[n.key].total?(l(),d("p",YM,c(e.quota[n.key].used>e.quota[n.key].total?"Limit exceeded":"Limit reached"),1)):p("v-if",!0)],2)),64))])):p("v-if",!0)}var JM={props:["quota","fmt"],setup(e){return{formatAmount:(t,n)=>n==="bytes"?e.fmt.humanFileSize(t).replace(/([a-zA-Z]+)$/," $1"):e.fmt.number(t)}},render:Bl},QM=new Set(he),Gl={props:["content","terms","options"],setup(e){let t=et(null),n=()=>{t.value.innerHTML=renderMD(e.content||"",window.location.pathname+"/../")};return Mt(()=>{n(),Be(()=>[e.content,e.terms,e.options],n,{deep:!0})}),()=>ke("markdown",{ref:t})}},XM={props:["file","terms","options"],setup(e){let t=et(null),n=()=>st(()=>t.value?.querySelectorAll("pre code").forEach(r=>window.Prism?.highlightElement(r)));return Mt(n),Be(()=>[e.file?.content,e.terms,e.options],n,{deep:!0}),()=>{let r=e.file||{},s=(r.filename||"").split(".").pop().toLowerCase();if(["md","markdown"].includes(s)||r.language==="Markdown")return ke("gist-file",{ref:t},ke(Gl,{content:r.content,terms:e.terms,options:e.options}));let i={js:"javascript",jsx:"javascript",ts:"javascript",typescript:"javascript",py:"python",html:"markup",xml:"markup",svg:"markup",sh:"bash"},a=(r.language||s||"none").toLowerCase();return ke("gist-file",{ref:t},ke("pre",{class:"line-numbers"},ke("code",{class:"language-"+(i[a]||a),key:r.content},r.content||"")))}}},ZM={props:["file","content"],setup(e){let t=et(null),n=0,r,s=async()=>{let i=++n;r?.abort(),r=new AbortController;try{let a=e.content?JSON.parse(e.content):await fetch(e.file?.download_url||e.file,{signal:r.signal}).then(u=>{if(!u.ok)throw Error("Notebook request failed");return u.json()});if(await xt("notebook"),i!==n)return;t.value.innerHTML=DOMPurify.sanitize(nb.parse(a).render()),t.value.querySelectorAll("pre code").forEach(u=>window.Prism?.highlightElement(u))}catch(a){i===n&&a.name!=="AbortError"&&(t.value.textContent="Unable to render the notebook.")}};return Mt(()=>{s(),Be(()=>[e.file,e.content],s)}),ao(()=>{n++,r?.abort()}),()=>ke("notebook",{ref:t})}},xM={props:["stats"],setup(e){return()=>{let t=Object.entries(e.stats||{}).filter(([,r])=>r.code),n=t.reduce((r,[,s])=>r+s.code,0);return ke("loc",t.map(([r,s])=>ke("div",{class:"lang",title:`${r}: ${s.code.toLocaleString()} lines`,style:{width:s.code*100/n+"%",background:langColors[r]}})))}}},Wl={Markdown:Gl,GistFile:XM,Notebook:ZM,Loc:xM,HtmlDoc:zl,QuotaUsage:JM,Pdfviewer:ui(async()=>(await xt("pdf"),pdfjsLib.GlobalWorkerOptions.workerSrc="/script/external/pdf.worker.js",Hl))},Kl={async mounted(e,{value:t}){e._editorValue=t;try{if(await ur(),e._editorDisposed)return;let n=e._editorValue,r=ace.edit(e);e._editor=r,r.setValue(String(n.content??""),-1),jl(e,n.options),e._editorCleanup=n.options?.onLoad?.(r)}catch(n){e._editorDisposed||(e.textContent=n.message)}},updated(e,{value:t}){e._editorValue=t,e._editor&&(e._editor.getValue()!==String(t.content??"")&&e._editor.setValue(String(t.content??""),-1),jl(e,t.options))},beforeUnmount(e){e._editorDisposed=!0,e._editorCleanup?.(),e._editor?.destroy()}};function jl(e,t={}){let n=QM.has(t.mode)?t.mode:"text";e._editor.session.setMode("ace/mode/"+n),t.theme&&e._editor.setTheme("ace/theme/"+t.theme),e._editor.setReadOnly(t.readOnly!==!1)}var Yl={mounted(e){if(!window.IntersectionObserver)return;let t=[...e.querySelectorAll('a[href^="#"]')],n=new Set,r=new IntersectionObserver(s=>{s.forEach(a=>a.isIntersecting?n.add(a.target.id):n.delete(a.target.id));let i=t.find(a=>n.has(a.hash.slice(1)));t.forEach(a=>a.classList.toggle("active",a===i))},{rootMargin:"-20% 0px -60% 0px",threshold:0});st(()=>t.forEach(s=>{let i=document.getElementById(s.hash.slice(1));i&&r.observe(i)})),e._observer=r},beforeUnmount(e){e._observer?.disconnect()}};function e8(e){let t={children:[]},n=new Map([["",t]]);function r(s){if(n.has(s))return n.get(s);let i=s.lastIndexOf("/"),a=r(i<0?"":s.slice(0,i)),u={name:s.slice(i+1),children:[]};return n.set(s,u),a.children.push(u),u}for(let s of e||[]){let i=s.path?`${s.path}/${s.name}`:s.name;s.size==null?r(i):r(s.path||"").children.push({...s})}return t.children}var Jl={name:"FileTree",props:["file","parent","searchQuery","searchResults","page"],setup(e){let t=$a(),n=et(null),r=He(Object.create(null)),s=null,i=ot(()=>e8(e.file)),a=()=>"/"+(Array.isArray(t.params.path)?t.params.path.join("/"):t.params.path||"");Be(()=>[t.params.repoId,t.params.path],()=>{let m="";a().split("/").filter(Boolean).forEach(y=>{m+="/"+y,r[m]=!0})},{immediate:!0});let u=ot(()=>{if(!e.searchQuery||!e.searchResults)return null;let m=new Set,y=new Set;return e.searchResults.forEach(E=>{m.add(E.path?`${E.path}/${E.name}`:E.name);let w="";(E.path||"").split("/").filter(Boolean).forEach(R=>{w=w?w+"/"+R:R,y.add(w)})}),{files:m,folders:y}}),f=()=>[...n.value.querySelectorAll("li > a")],h=m=>{n.value.querySelector(".tree-focused")?.classList.remove("tree-focused"),m&&(s=m.dataset.path,m.classList.add("tree-focused"),m.scrollIntoView?.({block:"nearest"}),n.value.focus())};function g(m){let y=f(),E=n.value.querySelector(".tree-focused")||y[0],w=y.indexOf(E);if(!["ArrowDown","ArrowUp","ArrowRight","ArrowLeft","Enter"].includes(m.key)||(m.preventDefault(),m.key==="ArrowDown"&&h(y[(w+1)%y.length]),m.key==="ArrowUp"&&h(y[(w-1+y.length)%y.length]),!E))return;let R=E.closest("li");m.key==="ArrowRight"&&R.classList.contains("folder")&&(R.classList.contains("open")?h(R.querySelector(":scope > ul > li > a")):E.click()),m.key==="ArrowLeft"&&(R.classList.contains("folder")&&R.classList.contains("open")?E.click():h(R.parentElement.closest("li.folder")?.querySelector(":scope > a"))),m.key==="Enter"&&E.click()}function k(m,y=""){let E=[...m].sort((w,R)=>+!!R.children-+!!w.children||w.name.localeCompare(R.name));return ke("ul",E.flatMap(w=>{let R=w,D=R.name,A=(y+"/"+D).slice(1);if(u.value&&!u.value.files.has(A)&&!u.value.folders.has(A))return[];for(;R.children?.length===1;)R=R.children[0],D+="/"+R.name;let V=y+"/"+D,H=!!R.children,q=u.value?r[V]!==!1:!!r[V],U=H&&e.page?.options?.truncatedFolders?.includes(V.slice(1)),ae=e.page?.fileCounts?.[V.slice(1)]||0,ie=ke("span",{class:H?"tree-icon-folder":"far fa-file tree-icon-file","aria-hidden":"true"},H?ke("svg",{viewBox:"0 0 14 12",focusable:"false"},ke("path",{d:"M1.5 10.5v-9h4l1.5 2h5.5v7z"})):null),_=ke("span",{class:"tree-name"},D),O=J=>{h(J.currentTarget),H&&(J.preventDefault(),r[V]=!q,r[V]&&!R.children.length&&e.page.getFiles(V.slice(1)),st(()=>h(f().find(ee=>ee.dataset.path===s))))},G=ke("a",{"data-path":V,href:H?void 0:`/r/${encodeURIComponent(t.params.repoId)}${encodePathForUrl(V)}`,class:{"tree-focused":s===V},onClick:O},[H?ke("span",{class:"tree-toggle"}):y?ke("span",{class:"tree-spacer"}):null,ie,_,U?ke("span",{class:"truncated-warning",title:e.page.fmt.translate("WARNINGS.folder_truncated")},ke("i",{class:"fas fa-exclamation-triangle"})):null,H&&ae?ke("span",{class:"tree-count"},ae):null]);return ke("li",{key:V,class:{file:!0,folder:H,open:q,active:a()===V,truncated:U},title:H?"":`Size: ${humanFileSize(R.size||0)}`},[G,H&&q?k(R.children,V):null])}))}return()=>ke("tree",{ref:n,tabindex:0,onKeydown:g},e.file?.length?u.value?.files.size===0?ke("div",{class:"tree-search-empty"},"No files found"):k(i.value):"Empty repository")}};function Xl(){return He({errors:{},dirty:!1,touched:!1,submitted:!1,get invalid(){return Object.values(this.errors).some(Boolean)},setValidity(e,t){this.errors[e]=!t},setDirty(){this.dirty=!0}})}function Zl(e,t){if(!e[t]){let n=Xl();Object.defineProperty(n,"invalid",{get(){return Object.values(n.errors).some(Boolean)||Object.keys(n).some(r=>r!=="invalid"&&n[r]&&typeof n[r]=="object"&&n[r].invalid)}}),e[t]=n}return e[t]}var xl={beforeMount(e,{value:t}){e._formState=Zl(t,e.name),e.addEventListener("submit",n=>n.preventDefault())}};function t8(e){return e instanceof Date?isNaN(e)?"":`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`:e||""}function Ql(e){let t=e._field.binding.value;e.type==="checkbox"?e.checked=!!t:e.type==="radio"?e.checked=t==(e._value??e.value):e._field.timer||(e.value=e.type==="date"?t8(t):t??""),ir(e)}function ir(e){let t=e._field.validation;if(!t)return;let n=e.validity;for(let[r,s]of Object.entries({required:n.valueMissing,pattern:n.patternMismatch,min:n.rangeUnderflow,max:n.rangeOverflow,date:n.badInput,email:n.typeMismatch&&e.type==="email",url:n.typeMismatch&&e.type==="url"}))t.setValidity(r,e.disabled||!s)}var ed={beforeMount(e,{value:t}){var a;let n=t.form&&Zl(t.state,t.form),r=n&&e.name?n[a=e.name]||(n[a]=Xl()):null;e._field={binding:t,validation:r,timer:null};let s=()=>{clearTimeout(e._field.timer),e._field.timer=null;let u=e._field.binding,f=e.type==="checkbox"?e.checked:e._value??e.value;if(!(e.type==="radio"&&!e.checked)){if((e.type==="number"||e.type==="range")&&(f=e.value===""?null:Number(e.value)),e.type==="date"&&(f=e.value?new Date(e.value+"T00:00:00"):null),r){r.setDirty();for(let h of Object.keys(r.errors))r.setValidity(h,!0)}u.set(f),ir(e),u.change?.()}};e._field.commit=s;let i=u=>{let f=e._field.binding.options?.debounce||0,h=typeof f=="number"?f:f[u.type]??f.default??0;clearTimeout(e._field.timer),h?e._field.timer=setTimeout(s,h):s()};e.addEventListener(e.tagName==="SELECT"||["checkbox","radio","date"].includes(e.type)?"change":"input",i),e.addEventListener("blur",()=>{r&&(r.touched=!0),e._field.timer&&s()})},mounted:Ql,updated(e,{value:t}){e._field.binding=t,Ql(e)},beforeUnmount(e){clearTimeout(e._field.timer);let{binding:t,validation:n}=e._field,r=t.form&&t.state[t.form];r&&r[e.name]===n&&delete r[e.name]}};function td(e,t){let n=e.target.closest("form");if(n?._formState&&(n._formState.submitted=!0),n?.querySelectorAll("input, select, textarea").forEach(r=>{r._field?.timer&&r._field.commit(),r._field&&ir(r)}),n&&!n.checkValidity()){let r=n.querySelector(":invalid");r?.scrollIntoView?.({block:"center"}),r?.focus(),n.reportValidity();return}return t()}var od=Symbol("session"),o8=/^\/(w|api|github)(\/|$)/;function sd(e,t={}){let n=e?.split(".").reduce((r,s)=>r?.[s],Fl);return String(n??e??"").replace(/{{\s*([^}]+?)\s*}}/g,(r,s)=>t[s]??"")}var s8={...rr,translate:sd};function n8(e){if(e==null||e==="")return e;try{let t=new URL(e,window.location.href);return["http:","https:","mailto:","tel:","blob:"].includes(t.protocol)?e:void 0}catch{return}}function r8(e="#app",t={}){!t.history&&window.location.pathname==="/"&&/^#!\/r\/[^/?#]+/.test(window.location.hash)&&window.history.replaceState(window.history.state,"",window.location.hash.slice(2));let n=new Map,r=Ll(t.fetch),s,i;function a(){let h=ct(),g={url(m){return m===void 0?i.currentRoute.value.fullPath:(i.push(m),g)},path(){return i.currentRoute.value.path},search(){return i.currentRoute.value.query}},k=new Proxy({},{get(m,y){let E=i.currentRoute.value.params[y];return Array.isArray(E)?E.join("/"):E}});return{http:r,...h,location:g,params:k,window,promises:$l,html:{trustAsHtml:m=>m},translate:(m,y)=>Promise.resolve(sd(m,y)),quotaService:Ul(r)}}function u(h){return{name:h.template,setup(){let g=tr(ut(od),n);h.setup(g,a()),Ml(h.template,g);let k=[];return()=>sn[h.template](g,k)}}}i=La({history:t.history||Va(),routes:il.map(h=>h.redirect?h:{path:h.path,component:u(h),meta:{title:h.title,preserveExplorer:h.preserveExplorer}})});let f=ta({setup(){s=tr(null,n),s.fmt=s8,s.window=window,s.Math=Math,s.sanitize=m=>DOMPurify.sanitize(m??""),s.submitForm=td,s.safeUrl=n8;let h=a();Fa(s,h.http,h.location,h.timeout),io(od,s),Be(()=>s.title,m=>{document.title=m||"Anonymous GitHub"});let g=[],k=m=>{let y=m.target.closest?.("a[href]");if(m.defaultPrevented||m.button!==0||m.metaKey||m.ctrlKey||m.shiftKey||m.altKey||!y||y.hasAttribute("download")||y.target&&y.target!=="_self"||y.dataset.toggle||y.getAttribute("href").startsWith("#"))return;let w=new URL(y.href,window.location.href);w.origin!==window.location.origin||o8.test(w.pathname)||(m.preventDefault(),i.push(w.pathname+w.search+w.hash),$("#navbarSupportedContent.show").collapse("hide"))};return document.addEventListener("click",k),ao(()=>document.removeEventListener("click",k)),()=>[ql(s,[]),ke("header",{class:"app-header"},sn["partials/header.htm"](s,g)),ke("main",{class:"app-view align-items-stretch w-100"},ke(er,null,{default:({Component:m,route:y})=>m?ke(m,{key:y.meta.preserveExplorer?y.matched[0]?.path:y.path}):null})),ke("div",{class:"position-fixed p-3",style:{zIndex:999999999,right:0,bottom:0}},s.toasts.map((m,y)=>ke("div",{class:"toast show",role:"alert","aria-live":"assertive","aria-atomic":"true",key:y},[ke("div",{class:"toast-header"},[ke("strong",{class:"mr-auto"},m.title),ke("button",{type:"button",class:"ml-2 mb-1 close","aria-label":"Close",onClick:()=>s.removeToast(m)},"\xD7")]),ke("div",{class:"toast-body"},m.body)])))]}});for(let[h,g]of Object.entries(Wl))f.component(h,g);return f.component("Tree",Jl),f.component("PartialView",{props:["name","state"],setup(h){let g=[];return()=>sn[h.name](h.state,g)}}),f.directive("field",ed),f.directive("form",xl),f.directive("code-editor",Kl),f.directive("paper-scrollspy",Yl),f.use(i),i.beforeEach(async h=>{s?.emit("routeLeave"),/^\/(r|repository|anonymize|pull-request-anonymize|gist-anonymize|pr|gist)(\/|$)/.test(h.path)&&await xt("markdown"),/^\/(r|repository)\//.test(h.path)&&await xt("org")}),i.afterEach(h=>{if(!s)return;s.title=h.meta.title,s.emit("routeChange",{title:h.meta.title}),s.emit("routeUpdate",{title:h.meta.title});let g=document.querySelector(".app-view");!h.meta.preserveExplorer&&g&&(g.scrollTop=0)}),f.mount(e),{app:f,router:i,state:s}}document.querySelector("#app")&&(window.anonymousApp=r8());})(); +jane.smith@example.org`},nq={class:"settings-syntax"},oq={class:"invalid-feedback"},sq={class:"settings-row"},iq={class:"settings-checks"},rq={class:"settings-check"},aq={class:"form-check-input",type:"checkbox",id:"link",name:"link"},lq={class:"settings-check"},dq={class:"form-check-input",type:"checkbox",id:"notebook",name:"notebook"},uq={class:"settings-check"},cq={class:"form-check-input",type:"checkbox",id:"image",name:"image"},pq={class:"settings-check"},fq={class:"form-check-input",type:"checkbox",id:"pdf",name:"pdf"},hq={class:"settings-check"},mq={class:"form-check-input",type:"checkbox",id:"loc",name:"loc"},vq={class:"settings-check"},gq={class:"form-check-input",type:"checkbox",id:"page",name:"page"},yq={class:"settings-row"},bq={class:"settings-check"},wq={class:"form-check-input",type:"checkbox",id:"update",name:"update"},kq={class:"settings-row"},Eq={class:"form-control",id:"expiration",name:"expiration"},Cq={class:"settings-help"},_q={class:"settings-save"},Sq={class:"settings-save-status draft-status",role:"status"},Nq={key:0},Dq={key:1},Rq={key:2},Tq=["disabled"],Aq={key:1,class:"settings-save-error",role:"alert"},Oq=["aria-busy"],Pq={key:0,role:"status"},Iq={key:1,class:"settings-notice",role:"alert"},Vq=["disabled"],qq={key:2,class:"settings-notice",role:"status"},Mq={key:3,class:"settings-notice",role:"status"},$q=["disabled"],Lq={class:"settings-row"},Uq={class:"settings-inline"},Fq={key:0,class:"settings-help"},Bq={key:0,class:"settings-help"},zq={id:"settings-quota"},Hq={key:1,role:"status"},jq={key:1,class:"settings-notice"},Gq={key:2,class:"settings-notice"},Wq={key:3,class:"settings-notice"},Kq={key:4,class:"settings-help"},Yq={key:5,class:"settings-plan billing-plan"},Qq={class:"settings-comparison"},Jq={class:"settings-cycles"},Xq=["checked","onChange"],Zq={class:"settings-help"},xq={class:"settings-actions"},e8=["disabled"],t8={key:6,class:"settings-help"},n8={class:"settings-row"},o8={key:0,class:"settings-inline"},s8=["disabled"],i8={key:1,class:"settings-help"},r8=["disabled"],a8={key:4,class:"settings-row"},l8={class:"settings-inline"},d8=["disabled"],u8={key:0,class:"settings-pass"},c8={class:"settings-help"},p8=["disabled"],f8={key:5,class:"settings-row"},h8={class:"settings-help"},m8={id:"settings-account",class:"settings-account-panel"},v8={class:"paper-account-card"},g8=["src"],y8={class:"paper-account-identity"},b8={class:"paper-account-name"},w8={class:"paper-danger-zone"},k8={key:0,class:"paper-inline-alert paper-inline-alert-error",role:"alert"},E8=["textContent"],C8=["disabled"],_8={key:1,class:"settings-delete-confirm"},S8={for:"delete-username"},N8={class:"settings-actions"},D8=["disabled"],R8=["disabled"];function ql(e,t){let s=We("quota-usage"),i=ye("field"),o=ye("form");return l(),d("div",Q5,[n("header",J5,[t[16]||(t[16]=n("h1",null,"Settings",-1)),n("div",X5,[n("span",null,"@"+u(e.user?.username),1)])]),n("nav",Z5,[(l(),d(W,null,Z([{id:"defaults",label:"Anonymization defaults"},{id:"billing",label:"Hosting & billing"},{id:"account",label:"Account"}],r=>n("button",{type:"button","aria-current":e.settingsTab===r.id?"page":null,onClick:a=>e.settingsTab=r.id},u(r.label),9,x5)),64))]),N(n("div",null,[t[37]||(t[37]=n("p",{class:"settings-scope"},"For new anonymizations only. Existing repositories keep their settings.",-1)),N((l(),d("form",{class:"form needs-validation",name:"defaultsForm",novalidate:"",onSubmit:t[1]||(t[1]=ue(r=>e.submitForm(r,()=>{e.saveDefault(r)}),["prevent"]))},[n("section",eq,[t[22]||(t[22]=n("div",null,[n("label",{class:"settings-label",for:"terms"},"Terms to redact"),n("p",{class:"settings-help"},"One term per line.")],-1)),n("div",null,[N(n("textarea",tq,null,512),[[i,{state:e.viewState,set:r=>{e.terms=r},value:e.terms,form:"defaultsForm",options:{debounce:250}}]]),n("details",nq,[t[21]||(t[21]=n("summary",null,"Regex & replacement syntax",-1)),n("p",null,[t[17]||(t[17]=y("Matches become ",-1)),n("code",null,u(e.site_options?.ANONYMIZATION_MASK||"XXX")+"-[N]",1),t[18]||(t[18]=y(". Use ",-1)),t[19]||(t[19]=n("code",null,"term=>replacement",-1)),t[20]||(t[20]=y(" for a custom replacement. Regex is supported.",-1))])]),N(n("div",oq,"Terms are in an invalid format.",512),[[G,e.defaultsForm?.terms?.errors?.format]])])]),n("section",sq,[t[31]||(t[31]=n("h2",null,"Reviewer display",-1)),n("div",null,[n("div",iq,[n("label",rq,[N(n("input",aq,null,512),[[i,{state:e.viewState,set:r=>{e.options.link=r},value:e.options?.link,form:"defaultsForm",options:{}}]]),t[23]||(t[23]=y("Keep links",-1))]),n("label",lq,[N(n("input",dq,null,512),[[i,{state:e.viewState,set:r=>{e.options.notebook=r},value:e.options?.notebook,form:"defaultsForm",options:{}}]]),t[24]||(t[24]=y("Render notebooks",-1))]),n("label",uq,[N(n("input",cq,null,512),[[i,{state:e.viewState,set:r=>{e.options.image=r},value:e.options?.image,form:"defaultsForm",options:{}}]]),t[25]||(t[25]=y("Show images",-1))]),n("label",pq,[N(n("input",fq,null,512),[[i,{state:e.viewState,set:r=>{e.options.pdf=r},value:e.options?.pdf,form:"defaultsForm",options:{}}]]),t[26]||(t[26]=y("Show PDFs",-1))]),n("label",hq,[N(n("input",mq,null,512),[[i,{state:e.viewState,set:r=>{e.options.loc=r},value:e.options?.loc,form:"defaultsForm",options:{}}]]),t[27]||(t[27]=y("Show line counts",-1))]),n("label",vq,[N(n("input",gq,null,512),[[i,{state:e.viewState,set:r=>{e.options.page=r},value:e.options?.page,form:"defaultsForm",options:{}}]]),t[28]||(t[28]=y("GitHub Pages",-1))])]),t[29]||(t[29]=n("p",{class:"settings-help"},"Images and PDFs are not anonymized.",-1)),t[30]||(t[30]=n("p",{class:"settings-help"},"GitHub Pages must use the anonymized branch.",-1))])]),n("section",yq,[t[34]||(t[34]=n("h2",null,"Source updates",-1)),n("div",null,[n("label",bq,[N(n("input",wq,null,512),[[i,{state:e.viewState,set:r=>{e.options.update=r},value:e.options?.update,form:"defaultsForm",options:{}}]]),t[32]||(t[32]=y("Auto-update from GitHub",-1))]),t[33]||(t[33]=n("p",{class:"settings-help"},"Latest commit, at most once an hour.",-1))])]),n("section",kq,[t[36]||(t[36]=n("label",{class:"settings-label",for:"expiration"},"On expiration",-1)),n("div",null,[N((l(),d("select",Eq,[...t[35]||(t[35]=[n("option",{value:"redirect"},"Redirect visitors to the GitHub repository",-1),n("option",{value:"remove",selected:""},"Remove the anonymized repository",-1)])])),[[i,{state:e.viewState,set:r=>{e.options.expirationMode=r},value:e.options?.expirationMode,form:"defaultsForm",options:{}}]]),n("p",Cq,u(e.options.expirationMode==="redirect"?"Redirecting reveals the original repository. Choose the date per anonymization.":"Set the expiration date for each repository."),1)])]),n("footer",_q,[n("div",Sq,[e.draftRestored?(l(),d("span",Nq,"Your unsaved draft was restored.")):e.unsavedChanges?(l(),d("span",Dq,"Unsaved changes"+u(e.draftSaved?" \xB7 Draft saved in this tab":""),1)):(l(),d("span",Rq,u(e.message?"Defaults saved":"All changes saved"),1))]),e.draftRestored||e.unsavedChanges?(l(),d("button",{key:0,type:"button",class:"draft-discard",onClick:t[0]||(t[0]=r=>e.discardDraft())},"Discard changes")):p("v-if",!0),n("button",{id:"save",type:"submit",class:"btn btn-ink",disabled:e.saving},u(e.saving?"Saving\u2026":"Save defaults"),9,Tq),e.error?(l(),d("div",Aq,u(e.error),1)):p("v-if",!0)])],32)),[[o,e.viewState]])],512),[[G,e.settingsTab==="defaults"]]),N(n("section",{id:"settings-billing","aria-busy":e.billingLoading||e.billingBusy},[t[60]||(t[60]=n("p",{class:"settings-scope"},"Your plan and usage. Reviewer access is always free.",-1)),e.billingLoading?(l(),d("p",Pq,"Loading billing\u2026")):p("v-if",!0),e.billingError?(l(),d("div",Iq,[y(u(e.billingError)+" ",1),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[2]||(t[2]=r=>e.loadBilling()),disabled:e.billingBusy},"Try again",8,Vq)])):p("v-if",!0),e.billingNotice?(l(),d("p",qq,u(e.billingNotice),1)):p("v-if",!0),e.billingPending?(l(),d("div",Mq,[t[38]||(t[38]=n("strong",null,"Confirming your payment",-1)),t[39]||(t[39]=n("p",null,"Your allowance will update after confirmation. Please do not pay again.",-1)),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[3]||(t[3]=r=>e.refreshBilling()),disabled:e.billingBusy},"Check payment status",8,$q)])):p("v-if",!0),n("section",Lq,[t[53]||(t[53]=n("h2",null,"Current plan",-1)),n("div",null,[n("div",Uq,[n("div",null,[n("strong",null,u(e.profileAuthorGrant()?"Author subscription":e.billing?.enabled?"Free":"Account allowance"),1),e.profileAuthorGrant()?(l(),d("p",Fq,u(e.profileAuthorGrant().cancelAtPeriodEnd?"Renewal cancelled \xB7 Access until ":"Paid access through ")+u(e.billingDate(e.profileAuthorGrant().until)),1)):p("v-if",!0)]),e.billing?.enabled&&!e.profileAuthorGrant()&&!e.billingPending&&!e.showAuthorPlans&&e.profileAuthorPlans().length?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[4]||(t[4]=r=>e.openProfileUpgrade())},"View Author plan")):p("v-if",!0)]),e.billing?.allowance?(l(),d("p",Bq,u(e.billing.allowance.repositories)+" repositories \xB7 "+u(e.billingBytes(e.billing.allowance.storage)),1)):p("v-if",!0),n("div",zq,[e.quota?(l(),$t(s,{key:0,quota:e.quota,fmt:e.fmt},null,8,["quota","fmt"])):(l(),d("p",Hq,"Loading usage\u2026"))]),t[52]||(t[52]=n("p",{class:"settings-help"},"Coauthored repositories use their owner's allowance. Conference hosting is separate.",-1)),e.quota?.repository&&!e.quota.repository.unlimited&&e.quota.repository.used>=e.quota.repository.total?(l(),d("p",jq,[...t[40]||(t[40]=[y("Your repository allowance is full. ",-1),n("a",{href:"/dashboard"},"Review your repositories",-1),y(" to remove work you no longer need.",-1)])])):p("v-if",!0),e.profilePastSubscription()?(l(),d("p",Gq,[...t[41]||(t[41]=[y("Your previous subscription is no longer active. Never-expiring repositories receive a 90-day grace period after paid access ends. ",-1),n("a",{href:"/dashboard"},"Review repository expiration dates",-1),y(".",-1)])])):p("v-if",!0),e.profileAuthorGrant()?.status==="past_due"?(l(),d("p",Wq,"A subscription payment is overdue. Use Manage billing to update your payment details.")):p("v-if",!0),e.profileAuthorGrant()?.cancelAtPeriodEnd?(l(),d("p",Kq,"When paid access ends, never-expiring repositories enter a 90-day grace period. Dated repositories keep their expiration dates.")):p("v-if",!0),e.showAuthorPlans&&!e.profileAuthorGrant()&&!e.billingPending&&e.profileAuthorPlans().length?(l(),d("div",Yq,[t[50]||(t[50]=n("h3",{id:"settings-plan-comparison",tabindex:"-1"},"Compare plans",-1)),n("table",Qq,[t[47]||(t[47]=n("caption",{class:"sr-only"},"Free and Author hosting",-1)),t[48]||(t[48]=n("thead",null,[n("tr",null,[n("th",{scope:"col"},"Included"),n("th",{scope:"col"},"Free"),n("th",{scope:"col"},"Author")])],-1)),n("tbody",null,[n("tr",null,[t[42]||(t[42]=n("th",{scope:"row"},"Active repositories",-1)),n("td",null,u(e.billing.allowance?.repositories),1),n("td",null,u(e.profileSelectedPlan()?.repositories),1)]),n("tr",null,[t[43]||(t[43]=n("th",{scope:"row"},"Source storage",-1)),n("td",null,u(e.billingBytes(e.billing.allowance?.storage)),1),n("td",null,u(e.billingBytes(e.profileSelectedPlan()?.storage)),1)]),t[44]||(t[44]=n("tr",null,[n("th",{scope:"row"},"Expiration"),n("td",null,"Scheduled"),n("td",null,"Scheduled or never")],-1)),t[45]||(t[45]=n("tr",null,[n("th",{scope:"row"},"Coauthors"),n("td",null,"Included"),n("td",null,"Included")],-1)),t[46]||(t[46]=n("tr",null,[n("th",{scope:"row"},"Reviewer access"),n("td",null,"Free"),n("td",null,"Free")],-1))])]),n("fieldset",Jq,[t[49]||(t[49]=n("legend",{class:"sr-only"},"Billing frequency",-1)),(l(!0),d(W,null,Z(e.profileAuthorPlans(),r=>(l(),d("label",{class:A({selected:e.profileSelectedPlan()?.id===r.id})},[n("input",{type:"radio",name:"profile-plan",checked:e.profileSelectedPlan()?.id===r.id,onChange:a=>e.profilePlan=r.id},null,40,Xq),y(u(e.billingPrice(r)),1)],2))),256))]),n("p",Zq,"Renews "+u(e.profileSelectedPlan()?.interval==="year"?"annually":"monthly")+" until cancelled. Tax shown at checkout.",1),t[51]||(t[51]=n("p",{class:"settings-help"},"If paid access ends, never-expiring repositories expire after a 90-day grace period.",-1)),n("div",xq,[n("button",{type:"button",class:"btn btn-ink",disabled:e.billingBusy||e.billing.checkoutEnabled===!1,onClick:t[5]||(t[5]=r=>e.checkout(e.profileSelectedPlan().id))},u(e.billingBusy?"Please wait\u2026":"Continue to checkout"),9,e8),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[6]||(t[6]=r=>e.showAuthorPlans=!1)},"Keep current plan")])])):p("v-if",!0),e.billing&&(!e.billing.enabled||e.billing.checkoutEnabled===!1)?(l(),d("p",t8,"New purchases are not available. Existing billing can still be managed below.")):p("v-if",!0)])]),n("section",n8,[t[55]||(t[55]=n("h2",null,"Billing",-1)),n("div",null,[e.billing?.portal?(l(),d("div",o8,[t[54]||(t[54]=n("p",{class:"settings-help"},"Invoices, payment details, and renewal.",-1)),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[7]||(t[7]=r=>e.billingPortal()),disabled:e.billingBusy},"Manage billing",8,s8)])):(l(),d("p",i8,"No billing account available.")),e.billing?.enabled&&!e.billingPending?(l(),d("button",{key:2,type:"button",class:"settings-text-button",onClick:t[8]||(t[8]=r=>e.refreshBilling()),disabled:e.billingBusy},"Refresh payment status",8,r8)):p("v-if",!0)])]),e.billing?.enabled?(l(),d("section",a8,[t[58]||(t[58]=n("h2",null,"Repository passes",-1)),n("div",null,[n("div",l8,[t[56]||(t[56]=n("p",{class:"settings-help"},[y("One repository for 180 days."),n("br"),y("No subscription or automatic renewal.")],-1)),e.profilePassPlan()?(l(),d("button",{key:0,type:"button",class:"btn btn-outline-ink",onClick:t[9]||(t[9]=r=>e.showRepositoryPass=!e.showRepositoryPass),disabled:e.billingPending},"Review a pass",8,d8)):p("v-if",!0)]),e.showRepositoryPass&&e.profilePassPlan()&&!e.billingPending?(l(),d("div",u8,[t[57]||(t[57]=n("label",{for:"billing-repository"},"Repository ID you own",-1)),N(n("input",{id:"billing-repository",class:"form-control","onUpdate:modelValue":t[10]||(t[10]=r=>e.billingRepository=r),placeholder:"Existing anonymized repository ID",autocomplete:"off"},null,512),[[co,e.billingRepository]]),n("p",c8,u(e.billingPrice(e.profilePassPlan()))+" \xB7 "+u(e.billingBytes(e.profilePassPlan().storage))+" \xB7 Never expire is not included.",1),n("button",{type:"button",class:"btn btn-ink",disabled:e.billingBusy||!e.billingRepository.trim()||e.billing.checkoutEnabled===!1,onClick:t[11]||(t[11]=r=>e.checkout("author_pass",e.billingRepository.trim()))},"Continue to checkout",8,p8)])):p("v-if",!0)])])):p("v-if",!0),e.billing?.grants?.length?(l(),d("section",f8,[t[59]||(t[59]=n("h2",null,"Your purchases",-1)),n("div",null,[(l(!0),d(W,null,Z(e.billing.grants,r=>(l(),d("div",{class:"settings-purchase",key:r.scope+r.planId+r.until},[n("strong",null,u(e.profileGrantName(r)),1),n("span",null,u(r.scope),1),n("p",h8,[y(u(r.status),1),r.status!=="revoked"?(l(),d(W,{key:0},[y(" \xB7 Paid access through "+u(e.billingDate(r.until))+u(r.cancelAtPeriodEnd?" \xB7 Renewal cancelled":""),1)],64)):p("v-if",!0)])]))),128))])])):p("v-if",!0),t[61]||(t[61]=n("section",{class:"settings-row"},[n("h2",null,"Conference hosting"),n("div",{class:"settings-inline"},[n("p",{class:"settings-help"},"Shared hosting is managed per conference."),n("a",{href:"/conferences",class:"btn btn-outline-ink"},"My conferences")])],-1))],8,Oq),[[G,e.settingsTab==="billing"]]),N(n("section",m8,[t[69]||(t[69]=n("p",{class:"settings-scope"},"Your identity, repository access, and account.",-1)),n("div",v8,[e.user?.photo?(l(),d("img",{key:0,width:"40",height:"40",class:"rounded-circle",alt:"",src:e.safeUrl(e.user?.photo)},null,8,g8)):p("v-if",!0),n("div",y8,[n("div",b8,"@"+u(e.user?.username),1),t[62]||(t[62]=n("div",{class:"paper-account-meta"},"Signed in with GitHub. Anonymous GitHub only reads your repositories.",-1))]),t[63]||(t[63]=n("a",{class:"btn btn-outline-ink",href:"/api/user/logout",target:"_self"},"Sign out",-1))]),t[70]||(t[70]=n("a",{class:"paper-settings-connection-link",href:"/connections"},[n("i",{class:"fab fa-github","aria-hidden":"true"}),n("span",null,[y("GitHub connections"),n("small",null,"Manage repository access and legacy OAuth.")]),n("span",{"aria-hidden":"true"},"\u2192")],-1)),n("div",w8,[t[67]||(t[67]=n("div",{class:"paper-danger-head"},"Delete account",-1)),t[68]||(t[68]=n("p",{class:"paper-danger-copy"}," Removes all your anonymized repositories, gists, and pull requests, revokes the application's access to your GitHub account, and erases your personal data (username, email, access tokens). This cannot be undone. ",-1)),e.deleteError?(l(),d("div",k8,[t[64]||(t[64]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-info"})],-1)),t[65]||(t[65]=y()),n("span",{textContent:u(e.deleteError)},null,8,E8)])):p("v-if",!0),n("button",{type:"button",class:"btn btn-outline-danger",onClick:t[12]||(t[12]=r=>e.confirmDeleteAccount=!0),disabled:e.deletingAccount},[t[66]||(t[66]=n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-trash"})],-1)),y(u(e.deletingAccount?"Deleting\u2026":"Delete my account"),1)],8,C8),e.confirmDeleteAccount?(l(),d("div",_8,[n("label",S8,"Type "+u(e.user?.username)+" to confirm",1),N(n("input",{id:"delete-username",class:"form-control","onUpdate:modelValue":t[13]||(t[13]=r=>e.deleteUsername=r),autocomplete:"off"},null,512),[[co,e.deleteUsername]]),n("div",N8,[n("button",{type:"button",class:"btn btn-outline-danger",onClick:t[14]||(t[14]=r=>e.deleteAccount()),disabled:e.deletingAccount||e.deleteUsername!==e.user?.username},u(e.deletingAccount?"Deleting\u2026":"Delete permanently"),9,D8),n("button",{type:"button",class:"btn btn-outline-ink",onClick:t[15]||(t[15]=r=>{e.confirmDeleteAccount=!1,e.deleteUsername=""}),disabled:e.deletingAccount},"Cancel",8,R8)])])):p("v-if",!0)])],512),[[G,e.settingsTab==="account"]])])}var T8={class:"pr-page"},A8={class:"container paper-page pr-page-inner"},O8={class:"pr-header"},P8={class:"pr-title-row"},I8={class:"paper-page-title pr-title"},V8=["textContent"],q8={key:1,class:"text-muted"},M8=["href"],$8={class:"pr-header-meta"},L8={key:0,class:"pr-meta-item"},U8=["textContent"],F8={key:1,class:"pr-meta-item"},B8=["textContent"],z8={key:2,class:"pr-meta-item"},H8=["textContent"],j8={key:0,class:"pr-body-card"},G8={key:1,class:"paper-tabs",role:"tablist"},W8=["aria-selected","tabindex"],K8=["aria-selected","tabindex"],Y8=["textContent"],Q8={class:"paper-tab-content"},J8={key:0,role:"tabpanel",id:"pr-diff-panel","aria-labelledby":"pr-diff-tab"},X8=["innerHTML"],Z8={key:1,role:"tabpanel",id:"pr-comments-panel","aria-labelledby":"pr-comments-tab"},x8={class:"pr-comments"},eM={class:"pr-comment"},tM={class:"pr-comment-head"},nM={key:0,class:"pr-comment-author"},oM=["textContent"],sM=["textContent"],iM={key:0,class:"pr-comment-body"},rM={key:0,class:"paper-table-empty"};function Ml(e,t){let s=We("markdown");return l(),d("div",T8,[n("div",A8,[t[17]||(t[17]=n("div",{class:"paper-crumbs"},[n("a",{href:"/dashboard"},"Reviewer"),y(" \xA0/\xA0 "),n("span",{class:"here"},"Pull request")],-1)),n("header",O8,[n("div",P8,[n("h1",I8,[e.details?.title?(l(),d("span",{key:0,textContent:u(e.details?.title)},null,8,V8)):p("v-if",!0),e.details?.title?p("v-if",!0):(l(),d("span",q8,"Untitled pull request"))]),e.options?.isAdmin||e.options?.isOwner?(l(),d("a",{key:0,class:"btn btn-sm","aria-label":"Edit",href:e.safeUrl("/pull-request-anonymize/"+e.pullRequestId)},[...t[4]||(t[4]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),n("span",{class:"d-none d-md-inline"}," Edit",-1)])],8,M8)):p("v-if",!0)]),n("div",$8,[n("span",{class:A(["paper-pill",{good:e.details?.merged,warn:e.details?.state=="open",bad:e.details?.state=="closed"&&!e.details?.merged}])},[n("span",{class:A(["status-dot",{"status-ready":e.details?.merged,"status-error":e.details?.state=="closed"&&!e.details?.merged}])},null,2),y(" "+u(e.details?.merged?"Merged":e.fmt.title(e.details?.state)),1)],2),e.details?.baseRepositoryFullName?(l(),d("span",L8,[t[5]||(t[5]=n("i",{class:"fab fa-github"},null,-1)),t[6]||(t[6]=y()),n("span",{textContent:u(e.details?.baseRepositoryFullName)},null,8,U8)])):p("v-if",!0),e.details?.updatedDate?(l(),d("span",F8,[t[7]||(t[7]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#project-icon-clock"})],-1)),t[8]||(t[8]=y()),n("span",{textContent:u(e.fmt?.date(e.details?.updatedDate))},null,8,B8)])):p("v-if",!0),e.details?.anonymizeDate?(l(),d("span",z8,[t[9]||(t[9]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-shield"})],-1)),t[10]||(t[10]=y(" Anonymized ",-1)),n("span",{textContent:u(e.fmt?.date(e.details?.anonymizeDate))},null,8,H8)])):p("v-if",!0)])]),e.details?.body?(l(),d("section",j8,[t[11]||(t[11]=n("div",{class:"paper-section-eyebrow"},"Description",-1)),_e(s,{content:e.details?.body},null,8,["content"])])):p("v-if",!0),e.details?.diff||e.details?.comments?(l(),d("nav",G8,[e.details?.diff?(l(),d("button",{key:0,class:A(["paper-tab",{active:e.tabState?.active=="diff"}]),type:"button",role:"tab",id:"pr-diff-tab","aria-selected":e.tabState?.active==="diff","aria-controls":"pr-diff-panel",tabindex:e.tabState?.active==="diff"?0:-1,onKeydown:t[0]||(t[0]=i=>e.previewTabKeydown(i)),onClick:t[1]||(t[1]=i=>e.tabState.active="diff")},[...t[12]||(t[12]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-code"})],-1),y(" Diff ",-1)])],42,W8)):p("v-if",!0),e.details?.comments?(l(),d("button",{key:1,class:A(["paper-tab",{active:e.tabState?.active=="comments"}]),type:"button",role:"tab",id:"pr-comments-tab","aria-selected":e.tabState?.active==="comments","aria-controls":"pr-comments-panel",tabindex:e.tabState?.active==="comments"?0:-1,onKeydown:t[2]||(t[2]=i=>e.previewTabKeydown(i)),onClick:t[3]||(t[3]=i=>e.tabState.active="comments")},[t[13]||(t[13]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-comment"})],-1)),n("span",{textContent:u(e.fmt.plural(e.details?.comments?.length,{0:"No comments",one:"1 comment",other:"{} comments"}))},null,8,Y8)],42,K8)):p("v-if",!0)])):p("v-if",!0),n("div",Q8,[e.details?.diff&&e.tabState?.active=="diff"?(l(),d("div",J8,[n("div",{class:"pr-diff",innerHTML:e.sanitize(e.fmt?.diff(e.details?.diff))},null,8,X8)])):p("v-if",!0),e.details?.comments&&e.tabState?.active=="comments"?(l(),d("div",Z8,[n("ul",x8,[(l(!0),d(W,null,Z(e.details?.comments,(i,o)=>(l(),d("li",eM,[n("div",tM,[i?.author?(l(),d("span",nM,[t[14]||(t[14]=n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-user"})],-1)),t[15]||(t[15]=y(" @",-1)),n("span",{textContent:u(i?.author)},null,8,oM)])):p("v-if",!0),i?.updatedDate?(l(),d("span",{key:1,class:"pr-comment-date",textContent:u(e.fmt?.date(i?.updatedDate))},null,8,sM)):p("v-if",!0)]),i?.body?(l(),d("div",iM,[_e(s,{content:i?.body},null,8,["content"])])):p("v-if",!0)]))),256)),e.details?.comments?.length?p("v-if",!0):(l(),d("li",rM,[...t[16]||(t[16]=[n("svg",{class:"ui-icon","aria-hidden":"true"},[n("use",{href:"#ui-icon-comment"})],-1),n("span",null,"No comments on this pull request.",-1)])]))])])):p("v-if",!0)])])])}var aM={class:"repository-task status-page"},lM={class:"task-lede"},dM={class:"task-columns"},uM={class:"task-preparation","aria-label":"Repository preparation"},cM={key:0,class:"task-ready",role:"status"},pM={key:1},fM={key:2,class:"text-danger",role:"alert"},hM={key:3,class:"paper-section-copy"},mM={key:4,class:"paper-ratelimit-card",role:"status"},vM={class:"paper-error-msg"},gM=["aria-valuenow"],yM={class:"paper-progress-label"},bM=["textContent"],wM={key:0},kM=["textContent"],EM={class:"paper-progress-pct"},CM={key:6,class:"paper-error-card",role:"alert"},_M={key:0,class:"paper-error-msg"},SM={key:1,class:"paper-error-msg"},NM={key:2},DM=["href"],RM={class:"paper-error-actions"},TM=["href"],AM={key:7,class:"task-result"},OM={class:"detail-value"},PM=["href"],IM={key:0,class:"detail-label"},VM={key:1,class:"detail-value"},qM=["href"],MM={key:8,class:"task-actions"},$M=["href"],LM=["href"],UM={class:"task-summary","aria-label":"Repository summary"},FM={class:"task-summary-foot"};function $l(e,t){return l(),d("div",aM,[t[21]||(t[21]=n("div",{class:"paper-crumbs"},[n("a",{href:"/dashboard"},"My work"),y(" / Repository")],-1)),t[22]||(t[22]=n("h1",null,"Prepare your anonymous review link",-1)),n("p",lM,u(e.repo?.status==="ready"?"Your repository is ready to share.":"Your settings are saved. Track preparation before sharing the link."),1),t[23]||(t[23]=n("ol",{class:"task-trail","aria-label":"Repository progress"},[n("li",null,"1. Repository"),n("li",null,"2. Review and hosting"),n("li",{"aria-current":"step"},"3. Review link")],-1)),n("div",dM,[n("section",uM,[e.repo?.status==="ready"?(l(),d("div",cM,[...t[1]||(t[1]=[n("strong",null,"Your review link is ready",-1)])])):p("v-if",!0),n("h2",null,u(e.repoId),1),e.repo?.status==="ready"?(l(),d("p",pM,"Share the link with reviewers. They do not need to sign in.")):p("v-if",!0),e.error?(l(),d("p",fM,[t[2]||(t[2]=y("Unable to load repository status. ",-1)),n("button",{type:"button",class:"task-text-button",onClick:t[0]||(t[0]=s=>e.getStatus())},"Try again")])):p("v-if",!0),e.repo?.status!=="ready"?(l(),d("p",hM,[...t[3]||(t[3]=[y(" The repository will take a few minutes to get ready, depending on its size. Visit the ",-1),n("a",{href:"/faq"},"FAQ",-1),y(" for more information. ",-1)])])):p("v-if",!0),e.rateLimitResetAt?(l(),d("div",mM,[t[6]||(t[6]=pe('
Temporarily paused
GitHub API rate limit reached
',1)),n("p",vM,[t[4]||(t[4]=y("Anonymization will resume automatically in ",-1)),n("strong",null,u(e.rateLimitCountdown),1),t[5]||(t[5]=y(". No action needed \u2014 the job is queued and will continue where it left off.",-1))])])):p("v-if",!0),e.repo?.status!=="ready"&&e.repo?.status!="error"&&!e.rateLimitResetAt?(l(),d("div",{key:5,class:A(["paper-progress",{"paper-progress-ready":e.repo?.status=="ready"}]),role:"progressbar","aria-valuemin":"0","aria-valuemax":"100","aria-valuenow":e.progress},[n("div",{class:"paper-progress-bar",style:Ve("width: "+e.progress+"%;")},null,4),n("div",yM,[n("span",{textContent:u(e.fmt?.title(e.repo?.status))},null,8,bM),e.repo?.statusMessage?(l(),d("span",wM,[t[7]||(t[7]=y("\xA0\xB7\xA0",-1)),n("span",{textContent:u(e.repo?.statusMessage)},null,8,kM)])):p("v-if",!0),n("span",EM,u(e.progress||0)+"%",1)])],10,gM)):p("v-if",!0),e.repo?.status=="error"&&!e.rateLimitResetAt?(l(),d("div",CM,[t[11]||(t[11]=pe('
Anonymization failed
Something went wrong while preparing this repository.
',1)),e.repo?.statusMessage?(l(),d("p",_M,u(e.fmt?.translate("ERRORS."+e.repo?.statusMessage)),1)):p("v-if",!0),e.repo?.statusMessage?p("v-if",!0):(l(),d("p",SM,"No additional details were reported. The most common causes are private repositories, missing branches, and rate limits.")),e.repo?.statusMessage==="quota_exceeded"?(l(),d("p",NM,[n("a",{href:e.safeUrl("/anonymize/"+e.repoId)},"Review this repository\u2019s hosting",8,DM),t[8]||(t[8]=y(", then retry preparation.",-1))])):p("v-if",!0),t[12]||(t[12]=n("ul",{class:"paper-error-hints"},[n("li",null,"Make sure the source URL points to a repository or pull request you can access."),n("li",null,"Check that the chosen branch and commit still exist on GitHub."),n("li",null,"If you just signed in, the access token may need a moment to propagate \u2014 try again.")],-1)),n("div",RM,[n("a",{class:"btn btn-ink",href:e.safeUrl("/anonymize/"+e.repoId)},[...t[9]||(t[9]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-edit"})],-1),y(" Edit anonymization",-1)])],8,TM),t[10]||(t[10]=pe(' Read the FAQ Report a bug in Anonymous GitHub',2))])])):p("v-if",!0),e.repo?.status==="ready"?(l(),d("div",AM,[t[13]||(t[13]=n("div",{class:"detail-label"},"Repository",-1)),n("div",OM,[n("a",{target:"_self",href:e.safeUrl("/r/"+e.repoId+"/")},u(e.reviewUrl),9,PM)]),e.repo?.options?.page?(l(),d("div",IM,"GitHub Page")):p("v-if",!0),e.repo?.options?.page?(l(),d("div",VM,[n("a",{target:"_self",href:e.safeUrl("/w/"+e.repoId+"/")},"/w/"+u(e.repoId)+"/",9,qM)])):p("v-if",!0)])):p("v-if",!0),e.repo?.status=="ready"?(l(),d("div",MM,[n("a",{class:"btn btn-ink",target:"_self",href:e.safeUrl("/r/"+e.repoId+"/")},[...t[14]||(t[14]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#project-icon-eye"})],-1),y(" Go to anonymized repository ",-1)])],8,$M),e.repo?.options?.page?(l(),d("a",{key:0,class:"btn",target:"_self",href:e.safeUrl("/w/"+e.repoId+"/")},[...t[15]||(t[15]=[n("svg",{class:"ui-icon mr-1","aria-hidden":"true"},[n("use",{href:"#ui-icon-globe"})],-1),y(" Go to anonymized GitHub page ",-1)])],8,LM)):p("v-if",!0)])):p("v-if",!0)]),n("aside",UM,[n("h3",null,u(e.repoId),1),n("dl",null,[t[16]||(t[16]=n("dt",null,"Source",-1)),n("dd",null,u(e.repo?.source?.fullName?"https://github.com/"+e.repo.source.fullName:"Loading\u2026"),1),t[17]||(t[17]=n("dt",null,"Lifetime",-1)),n("dd",null,u(e.repo?.options?.expirationMode==="never"?"Never expire while subscribed":e.repo?.options?.expirationDate?"Until "+e.fmt.date(e.repo.options.expirationDate):"Loading\u2026"),1),t[18]||(t[18]=n("dt",null,"Review access",-1)),t[19]||(t[19]=n("dd",null,"Anonymous and free",-1))]),n("div",FM,[n("strong",null,u(e.repo?.status==="ready"?"Ready to share":"Repository preparation"),1),t[20]||(t[20]=n("p",null,"Coauthors do not each need a subscription.",-1))])])])])}var ls={"partials/connections.htm":ul,"partials/signin.htm":cl,"partials/404.htm":pl,"partials/admin/conferences.htm":fl,"partials/admin/errors.htm":hl,"partials/admin/overview.htm":ml,"partials/admin/queues.htm":vl,"partials/admin/repositories.htm":gl,"partials/admin/user.htm":yl,"partials/admin/users.htm":bl,"partials/anonymize.htm":wl,"partials/anonymizePullRequest.htm":kl,"partials/claim.htm":El,"partials/conference.htm":Cl,"partials/conferences.htm":_l,"partials/dashboard.htm":Sl,"partials/explorer.htm":Nl,"partials/faq.htm":Dl,"partials/gist.htm":Rl,"partials/header.htm":Tl,"partials/home.htm":Al,"partials/loading.htm":Ol,"partials/newConference.htm":Pl,"partials/pageView.htm":Il,"partials/pr-dashboard.htm":Vl,"partials/profile.htm":ql,"partials/pullRequest.htm":Ml,"partials/status.htm":$l};var BM={class:"ui-icon-definitions","aria-hidden":"true",focusable:"false"};function Ll(e,t){return l(),d("svg",BM,[...t[0]||(t[0]=[pe('',1)])])}function Ul(e,t){e==="partials/explorer.htm"&&(t.sidebarCollapsed=window.matchMedia?.("(max-width: 767px)").matches||!1),e==="partials/anonymize.htm"&&(t.prTabState={active:t.options.diff?"diff":"comments"},t.watchGroup(["options.diff","options.comments"],()=>{t.options[t.prTabState.active]||(t.prTabState.active=t.options.diff?"diff":t.options.comments?"comments":null)})),e==="partials/gist.htm"&&(t.tabState={active:t.details?.files?"files":"comments"}),["partials/conferences.htm","partials/conference.htm"].includes(e)&&(t.statusLabels={ready:"Ready",expired:"Expired",removed:"Removed"});let i={"partials/dashboard.htm":["filteredItems",()=>t.items,"itemFilter"],"partials/conferences.htm":["filteredConferences",()=>t.conferences,"conferenceFilter"],"partials/conference.htm":["filteredRepositories",()=>t.conference?.repositories,"repoFiler"],"partials/admin/repositories.htm":["filteredRepositories",()=>t.repositories,"repoFiler"],"partials/admin/user.htm":["filteredRepositories",()=>t.repositories,"repoFiler"],"partials/admin/users.htm":["filteredUsers",()=>t.users,"userFiler"],"partials/admin/conferences.htm":["filteredConferences",()=>t.conferences]}[e];if(i){let o=ot(()=>t.fmt.orderBy(t.fmt.filter(i[1](),t[i[2]]),t.orderBy));Object.defineProperty(t,i[0],{configurable:!0,get:()=>o.value})}}function Fl(e=(...t)=>fetch(...t)){async function t(i,o,r,a={}){let c=new URL(o,window.location.href);for(let[g,k]of Object.entries(a.params||{}))if(k!=null)for(let m of Array.isArray(k)?k:[k])c.searchParams.append(g,typeof m=="object"?JSON.stringify(m):m);let f=new AbortController,v;a.timeout?.then?a.timeout.then(()=>f.abort()):a.timeout&&(v=setTimeout(()=>f.abort(),a.timeout));try{let g={Accept:"application/json, text/plain, */*",...a.headers},k=document.cookie.match(/(?:^|;\s*)XSRF-TOKEN=([^;]*)/);k&&c.origin===window.location.origin&&(g["X-XSRF-TOKEN"]=decodeURIComponent(k[1]));let m;r!==void 0&&(r instanceof FormData?m=r:(g["Content-Type"]||(g["Content-Type"]="application/json;charset=utf-8"),m=JSON.stringify(r)));let b=await e(c.href,{method:i,headers:g,body:m,credentials:"same-origin",signal:f.signal}),C=await b.text(),E=C;if(a.transformResponse)E=a.transformResponse(C);else if(C&&(/json/i.test(b.headers.get("content-type")||"")||/^[\[{]/.test(C.trim())))try{E=JSON.parse(C)}catch{}let T={data:E,status:b.status,headers:D=>b.headers.get(D)};if(!b.ok)throw T;return T}catch(g){throw g.name==="AbortError"?{status:-1,data:null}:g}finally{clearTimeout(v)}}let s={};for(let i of["get","delete","head"])s[i]=(o,r)=>t(i.toUpperCase(),o,void 0,r);for(let i of["post","put","patch"])s[i]=(o,r,a)=>t(i.toUpperCase(),o,r,a);return s}var Bl={resolve:e=>Promise.resolve(e),reject:e=>Promise.reject(e),all:e=>Promise.all(e),defer(){let e,t;return{promise:new Promise((i,o)=>{e=i,t=o}),resolve:e,reject:t}}};var zl=function(e){function t(s){return s=s||{used:0,total:0},s.unlimited=!s.total,s.percent=s.unlimited?0:Math.min(100,s.used*100/s.total),s.level=s.unlimited?"unlimited":s.percent>=95?"danger":s.percent>=80?"warn":"ok",s}return{decorate:t,load:function(){return e.get("/api/user/quota").then(s=>{let i=s.data||{};return i.storage=t(i.storage),i.file=t(i.file),i.repository=t(i.repository),i})}}};var ui={};ld(ui,{bigNum:()=>HM,date:()=>e6,diff:()=>YM,filter:()=>ZM,humanFileSize:()=>zM,humanTime:()=>jM,limitTo:()=>XM,number:()=>QM,orderBy:()=>xM,plural:()=>t6,statusLabel:()=>WM,statusMsg:()=>KM,title:()=>GM,uppercase:()=>JM});var zM=e=>window.humanFileSize(e),HM=(function(){return function(t){let s=Number(t)||0,i=Math.abs(s);return i<1e3?String(s):i<1e4?(s/1e3).toFixed(1).replace(/\.0$/,"")+"k":i<1e6?Math.round(s/1e3)+"k":i<1e7?(s/1e6).toFixed(1).replace(/\.0$/,"")+"M":Math.round(s/1e6)+"M"}})(),jM=(function(){return function(t){if(!t)return"never";t instanceof Date&&(t=Math.round((Date.now()-t)/1e3)),(typeof t=="string"||typeof t=="number")&&(t=Math.round((Date.now()-new Date(t))/1e3));var s=t<0?"from now":"ago";if(Math.abs(t)>7200*24){let f=new Date;return f.setSeconds(f.getSeconds()-t),"on "+f.toLocaleDateString(void 0,{day:"numeric",month:"short",year:"numeric"})}t=Math.abs(t);for(var i=[t/60/60/24/365,t/60/60/24/30,t/60/60/24/7,t/60/60/24,t/60/60,t/60,t],o=["year","month","week","day","hour","minute","second"],r=0;r1&&(c+="s"),a>=1)return a+" "+c+" "+s}return"0 seconds "+s}})(),GM=(function(){return function(e){if(!e)return e;e=e.toLowerCase();var t=e.split(" "),s=t.map(function(i){return i.charAt(0).toUpperCase()+i.substring(1,i.length)});return s.join(" ")}})(),WM=(function(){var e={ready:"Ready",error:"Error",expired:"Expired",expiring:"Expiring",removed:"Removed",removing:"Removing",queue:"Queued",download:"Downloading",downloaded:"Downloaded",preparing:"Preparing",anonymizing:"Anonymizing"};return function(t){if(!t)return"";if(e[t])return e[t];var s=String(t).replace(/[_-]+/g," ").toLowerCase();return s.charAt(0).toUpperCase()+s.slice(1)}})(),KM=(function(){var e={branch_not_found:"Branch not found on GitHub",repo_not_found:"Repository not found on GitHub",repository_not_found:"Repository not found on GitHub",repo_not_accessible:"Repository is not accessible with your token",pr_not_found:"Pull request not found on GitHub",gist_not_found:"Gist not found on GitHub",commit_not_found:"Commit not found on GitHub",repo_too_big:"Repository exceeds the size limit",quota_exceeded:"Storage quota exceeded",incomplete_record:"Incomplete record: missing identifier"};return function(t){if(!t)return t;var s=t.match(/^rate_limited:(\d+)$/);if(s){var i=Math.max(0,Math.ceil((parseInt(s[1],10)-Date.now())/1e3));if(i<=0)return"Rate limited \u2014 resuming soon";var o=Math.floor(i/60),r=i%60;return"Rate limited \u2014 retrying in "+(o>0?o+"m "+r+"s":r+"s")}if(e[t])return e[t];if(/^[a-z0-9]+(_[a-z0-9]+)+$/.test(t)){var a=t.replace(/_/g," ");return a.charAt(0).toUpperCase()+a.slice(1)}return t}})(),YM=(function(e){let t=i=>i.replace(/&/g,"&").replace(//g,">");function s(i,o){if(!o)return;let r=o.newPath&&o.newPath!=="/dev/null"?o.newPath:o.oldPath||"",a=o.oldPath==="/dev/null"?"added":o.newPath==="/dev/null"?"deleted":o.oldPath&&o.newPath&&o.oldPath!==o.newPath?"renamed":"modified";if(i.push('
'),i.push('
'+t(r)+''+a+"
"),o.lines.length){i.push('');for(let c of o.lines)i.push('");i.push("
'+(c.oldNo||"")+''+(c.newNo||"")+''+(c.kind==="add"?"+":c.kind==="remove"?"-":c.kind==="hunk"?"@":"")+''+t(c.text)+"
")}i.push("
")}return function(i){if(!i)return i;let o=[],r=null,a=0,c=0,f=()=>(r||(r={oldPath:"",newPath:"",lines:[]}),r),v=()=>{r&&(r.lines.length||r.oldPath||r.newPath)&&(s(o,r),r=null)},g=i.split(` +`);for(let k=0;ke});function QM(e,t){return e==null?"":Number(e).toLocaleString(void 0,t==null?{}:{minimumFractionDigits:t,maximumFractionDigits:t})}function JM(e){return String(e??"").toUpperCase()}function XM(e,t,s=0){return(e||[]).slice(s,s+t)}function ZM(e,t){return Array.isArray(e)?typeof t=="function"?e.filter(t):e:[]}function xM(e,t){if(!t)return e||[];let s=Array.isArray(t)?t:[t];return[...e||[]].sort((i,o)=>{for(let r of s){let a=r[0]==="-"?-1:1;r=r.replace(/^[+-]/,"");let c=r.split(".").reduce((v,g)=>v?.[g],i),f=r.split(".").reduce((v,g)=>v?.[g],o);if(typeof c=="string"&&(c=c.toLowerCase()),typeof f=="string"&&(f=f.toLowerCase()),c!==f)return(c==null?-1:f==null?1:ci[o])}function t6(e,t){return(t?.[e]??t?.[e===1?"one":"other"]??"").replace(/\{\}/g,e??0)}var Hl={ERRORS:{cache_busy:"Downloads are busy. Please try again shortly.",invalid_sort:"The selected sort order is invalid.",invalid_cursor:"This project page is no longer valid. Reload the list.",repository_changed:"The repository changed while processing. Please retry.",repository_job_cancelled:"The repository changed or was removed while processing.",storage_delete_failed:"Unable to remove cached files. Please try again later.",unknown_error:"Unknown error, contact the admin.",unreachable:"Anonymous GitHub is unreachable, contact the admin.",request_error:"Unable to download the file, check your connection or contact the admin.",not_found:"The requested resource could not be found.",not_connected:"You must be logged in to perform this action.",not_authorized:"You do not have permission to perform this action.",unable_to_connect_user:"Unable to connect your account. Please try again later.",user_not_found:"The requested user could not be found.",user_banned:"Your account has been banned. Contact the admin for more information.",repo_access_limited:"GitHub blocked access because the repository's organization restricts third-party OAuth apps. Ask an org owner to approve Anonymous GitHub under Settings \u2192 Third-party Access \u2192 OAuth app policy, or anonymize a personal fork instead.",repo_saml_enforcement:"The repository's organization enforces SAML single sign-on. Authorize your token for that organization (GitHub \u2192 Settings \u2192 Applications, or re-run the org's SSO sign-in), then retry. Alternatively, anonymize a personal fork.",repo_not_found:"The repository was not found on GitHub. Check the URL and spelling, make sure you are signed in to the account that can see it, and confirm the repo isn't hidden under an org that restricts third-party app access.",repo_empty:"The selected branch has no commits on GitHub. Push at least one commit, or pick a different branch, then retry.",repo_not_accessible:"Anonymous GitHub cannot access this repository. Verify the repository exists and that Anonymous GitHub has been authorized for the owning organization.",repository_archived:"This repository has been archived and its files are no longer available.",repository_expired:"The repository is expired.",invalid_status:"This action cannot be performed while the resource is in its current state.",repository_not_ready:"Anonymous GitHub is still processing the repository, it can take several minutes.",repository_not_accessible:"This repository is currently not accessible.",repo_is_updating:"Anonymous GitHub is still processing the repository, it can take several minutes.",invalid_repo:"The provided repository is not valid.",invalid_source_repository:"The repository source name is invalid; expected the form 'owner/name'.",repoId_not_defined:"A repository ID must be provided.",repoUrl_not_defined:"The repository URL needs to be defined.",source_not_provided:"A repository source must be provided.",github_rate_limit_exceeded:"GitHub temporarily blocked the request because we hit its API rate limit. Wait a few minutes and try again. If the problem persists and you contact GitHub Support, include the request ID and timestamp shown in GitHub's response (the 'X-GitHub-Request-Id' header).",rate_limited:"GitHub API rate limit reached. The repository will be available shortly \u2014 please wait a moment and refresh.",repoId_already_used:"The repository ID is already used.",invalid_repoId:"The format of the repository ID is invalid.",unsupported_source:"The repository source type is not supported.",branch_not_specified:"The branch is not specified.",branch_not_found:"The branch of the repository cannot be found.",commit_not_specified:"A commit must be specified.",commit_not_found:"The configured commit no longer exists in the source repository. It may have been force-pushed, rebased, or removed.",repo_renamed:"The source repository appears to have been renamed or moved on GitHub. Please refresh and try again \u2014 the cached name has been updated.",invalid_commit_format:"The commit hash format is invalid. It must be a hexadecimal string.",pull_request_not_found:"The requested pull request could not be found.",pull_request_expired:"This pull request has expired and is no longer available.",pull_request_not_ready:"This pull request is still being prepared. Please try again shortly.",pull_request_not_available:"This pull request is currently not available.",invalid_pullRequestId:"The pull request ID is invalid.",pullRequestId_already_used:"This pull request ID is already in use. Please choose a different one.",repository_not_specified:"A repository must be specified for this pull request.",pullRequestId_not_specified:"A pull request ID must be specified.",pullRequestId_is_not_a_number:"The source pull request ID must be a number.",options_not_provided:"Anonymization options are mandatory.",terms_not_specified:"Anonymization terms must be specified.",invalid_terms_format:"Terms are in an invalid format.",missing_content:"No content was provided to the anonymization preview.",unable_to_anonymize:"An error happened during the anonymization process. Please try later or report the issue.",non_supported_mode:"The selected anonymization mode is invalid, only download and stream are supported.",invalid_path:"The provided path is invalid or missing.",path_not_specified:"A file path must be specified.",path_not_defined:"The file path has not been resolved yet.",invalid_file_path:"The requested file path is not valid.",invalid_request:"The request is missing required fields or is malformed.",invalid_project_name:"Use a project name of up to 100 characters without line breaks or control characters.",no_file_selected:"Please select a file.",file_not_found:"The requested file is not found.",file_not_accessible:"The requested file is not accessible.",file_not_supported:"The file type is not supported. Anonymous GitHub cannot handle it.",file_too_big:"The file size exceeds the limit of Anonymous GitHub.",is_folder:"The path points to a folder.",folder_not_supported:"The path points to a folder. Please select a file.",unable_to_write_file:"Unable to write file on disk.",download_not_enabled:"Repository downloads are not enabled on this server.",unable_to_download:"The repository could not be downloaded. Please try again later.",s3_config_not_provided:"Object storage has not been configured on this server.",stats_unsupported:"Statistics are only supported in download mode.",branches_not_found:"The requested branch is not found.",readme_not_available:"No README for the repository is found.",page_not_supported_on_different_branch:"GitHub Pages is served from a different branch than the one selected. Pick the branch that GitHub Pages is configured to use.",page_not_activated:"GitHub Pages is not enabled on this repository. Enable it in the repository settings on GitHub before anonymizing.",is_removed:"This resource has been removed and is no longer available.",conf_name_missing:"A conference name is required.",conf_id_missing:"A conference ID is required.",conf_id_used:"This conference ID is already in use. Please choose a different one.",conf_start_date_missing:"A start date is required for the conference.",conf_end_date_missing:"An end date is required for the conference.",conf_start_date_invalid:"The start date must be before the end date.",conf_end_date_invalid:"The end date must be in the future.",invalid_plan:"The selected plan is not valid.",conference_not_found:"The requested conference could not be found.",conf_not_found:"The requested conference could not be found.",conf_not_activated:"The conference is not activated.",billing_missing:"Billing information is required for this plan.",billing_name_missing:"A billing name is required.",billing_email_missing:"A billing email is required.",billing_address_missing:"A billing address is required.",billing_city_missing:"A billing city is required.",billing_zip_missing:"A billing ZIP/postal code is required.",billing_country_missing:"A billing country is required.",queue_not_found:"The specified queue could not be found.",job_not_found:"The specified job could not be found in the queue.",error_retrying_job:"An error occurred while retrying the job.",gist_expired:"The gist is expired.",gist_not_ready:"Anonymous GitHub is still processing the gist, it can take several minutes.",gist_not_found:"The requested gist could not be found.",gist_not_available:"This gist is currently not available.",invalid_gistId:"The format of the gist ID is invalid.",gistId_not_specified:"A gist ID must be provided.",gistId_already_used:"The gist ID is already used.",missing_token:"An authentication token is required.",invalid_token:"The provided authentication token is invalid.",login_failed:"Login failed. Please try again.",server_error:"An unexpected server error occurred. Please try again later.",username_not_defined:"A username must be provided.",github_user_not_found:"The specified GitHub user could not be found.",cannot_coauthor_self:"You cannot add yourself as a co-author.",storage_write_size_mismatch:"The downloaded file was smaller than expected. The upstream source may have returned an incomplete response \u2014 please try again.",storage_read_error:"An error occurred while reading the file from storage \u2014 please try again.",upstream_error:"A temporary error occurred while fetching from GitHub \u2014 please try again.",token_expired:"Your GitHub access token has expired. Please log out and log in again to refresh it.",job_is_active:"This job is currently running \u2014 wait for it to finish or remove it first.",github_app_access_required:"Allow this repository on GitHub using the read-only access button, then retry. Organization access may require administrator approval.",github_app_reconnect_required:"Reconnect your GitHub App account to restore read-only access.",github_app_disabled:"New GitHub App connections are currently unavailable.",github_oauth_required:"Connect legacy GitHub OAuth to use this feature.",github_identity_mismatch:"Use the same GitHub account that you are signed in with here.",github_app_permissions_invalid:"The GitHub App must be configured with read-only permissions.",github_unavailable:"GitHub is temporarily unavailable. Please retry.",connection_changed:"The repository connection changed. Reload and try again.",repository_busy:"Wait for the repository operation to finish before changing its connection.",invalid_connection:"Select a supported GitHub connection.",github_oauth_disabled:"Legacy OAuth sign-in is currently disabled.",invalid_auth_state:"The authorization session expired. Please start again from Anonymous GitHub.",invalid_webhook_signature:"The webhook signature is invalid.",webhook_processing_failed:"Webhook processing failed. Retry the delivery.",github_app_authorization_cancelled:"GitHub authorization was cancelled.",github_account_link_required:"Verify your existing account with your previous GitHub connection. Future sign-ins will use the GitHub App.",github_app_refresh_busy:"GitHub credentials are being renewed. Please retry shortly.",github_grant_revocation_failed:"Unable to revoke the GitHub grant. Please retry.",another_login_required:"Connect and verify another sign-in method before disconnecting OAuth.",oauth_resources_remaining:"Some resources still require OAuth. Migrate or remove them before disconnecting.",invalid_github_path:"The GitHub repository path is invalid.",repository_tree_incomplete:"The repository file tree is incomplete. Reduce its size and refresh before downloading.",billing_unavailable:"Payments are not available. Please try again later.",invalid_billing_signature:"The payment notification could not be verified.",billing_webhook_failed:"The payment notification could not be processed.",billing_customer_not_found:"No billing account was found.",subscription_required_for_never_expiration:"Never-expiring repositories require the owner\u2019s active monthly or annual author subscription. Choose a dated expiration or upgrade in Plans and billing.",invalid_billing_expiration:"Choose an expiration date within the next year, or select Never expire with an author subscription.",pending_payment:"Awaiting payment"},WARNINGS:{page_not_enabled_on_repo:"GitHub Pages is not enabled on this repository. Enable it in the repository's Settings \u2192 Pages on GitHub, then refresh.",page_branch_mismatch:"GitHub Pages on this repository is served from the '{{pageBranch}}' branch, but you selected '{{selectedBranch}}'. Switch the branch above to '{{pageBranch}}' to anonymize the Pages site.",folder_truncated:"This folder has more than 10,000 entries; only a partial listing is shown.",repo_truncated:"Some folders in this repository have too many files to be fully listed. Affected folders are marked with a warning icon.",submodules_not_included:"This repository uses git submodules. Submodule contents are not included in the anonymized repository and appear as empty folders."}};var jl={name:"htmlDoc",props:["content","baseUrl","allowScripts"],setup(e){let t=tt(null);return Mt(()=>{let i=[t.value][0];i.classList.add("html-doc");function o(){i.innerHTML="";let r=e.content;if(typeof r!="string")return;let a=document.createElement("iframe");a.className="html-doc-frame",a.setAttribute("title","Rendered HTML document");let c=["allow-popups","allow-popups-to-escape-sandbox"];e.allowScripts&&c.push("allow-scripts","allow-forms","allow-modals"),a.setAttribute("sandbox",c.join(" ")),a.setAttribute("referrerpolicy","no-referrer"),i.appendChild(a);let f="";e.baseUrl&&(f=''),a.srcdoc=f+r}He(()=>e.content,o,{immediate:!0}),He(()=>e.baseUrl,o,{immediate:!0}),He(()=>e.allowScripts,o,{immediate:!0})}),()=>we("html-doc",{ref:t})}};var Gl={name:"pdfviewer",props:["src"],setup(e){let t=tt(null);return Mt(()=>{let s=[t.value],i=400,o=[.5,.75,1,1.25,1.5,2,3],r=1e3,a=s[0];a.classList.add("pdf-viewer");let c=null,f=[],v=!1,g=null,k=1,m=1,b=0,C=0,E=612/792,T=0,D=null,O=new Map,q=0;function F(_){let h=O.get(_);h&&(h.cancelled=!0,h.task?.cancel?.(),O.delete(_));let w=_.querySelector("canvas");w&&(w.width=0,w.height=0),_.innerHTML="",delete _.dataset.state}let M=document.createElement("div");M.className="pdf-toolbar";let z=document.createElement("div");z.className="pdf-pages",z.tabIndex=0,z.setAttribute("aria-label","PDF pages"),a.appendChild(M),a.appendChild(z);function se(_,h,w){let R=document.createElement("button");return R.type="button",R.className="pdf-toolbar-btn",R.title=h,R.setAttribute("aria-label",h),R.innerHTML='',R.addEventListener("click",w),R}let oe=se("fa-chevron-up","Previous page",function(){$e(m-1)}),S=se("fa-chevron-down","Next page",function(){$e(m+1)}),I=document.createElement("input");I.type="text",I.className="pdf-toolbar-page",I.setAttribute("aria-label","Page number"),I.title="Page number \u2014 type a page and press Enter",I.addEventListener("keydown",function(_){_.key==="Enter"&&($e(parseInt(I.value,10)),I.blur())}),I.addEventListener("blur",function(){I.value=String(m)});let H=document.createElement("span");H.className="pdf-toolbar-count";let K=se("fa-search-minus","Zoom out",function(){ie(o[Math.max(0,le()-1)])}),X=se("fa-search-plus","Zoom in",function(){ie(o[Math.min(o.length-1,le()+1)])}),Y=document.createElement("button");Y.type="button",Y.className="pdf-toolbar-btn pdf-toolbar-zoom",Y.title="Reset zoom to fit the width",Y.setAttribute("aria-label","Reset zoom to fit the width"),Y.addEventListener("click",function(){ie(1)}),M.appendChild(oe),M.appendChild(S);let ee=document.createElement("span");ee.className="pdf-toolbar-group",ee.appendChild(I),ee.appendChild(H),M.appendChild(ee);let ce=document.createElement("span");ce.className="pdf-toolbar-group pdf-toolbar-right",ce.appendChild(K),ce.appendChild(Y),ce.appendChild(X),M.appendChild(ce);function le(){let _=0;for(let h=0;h=_,Y.textContent=Math.round(k*100)+"%",K.disabled=le()===0,X.disabled=le()===o.length-1}function Se(_){let h=f[_-1];h&&(z.scrollTop+=h.getBoundingClientRect().top-z.getBoundingClientRect().top)}function $e(_){if(!c||isNaN(_))return;let h=Math.min(Math.max(1,_),c.numPages);f[h-1]&&(Se(h),m=h,b=h,C=Date.now()+800,re(),Ue())}function Ne(){if(!f.length||Date.now(){}),D=null),g&&(clearTimeout(g),g=null),c&&(c.destroy(),c=null),f=[],m=1,z.innerHTML="",re()}function Ee(){z.innerHTML="";let _=document.createElement("div");_.className="pdf-viewer-error",_.textContent="This PDF could not be displayed.",z.appendChild(_)}function Le(){let _=Math.max(120,z.clientWidth-24);return Math.round(Math.min(_,r)*k)}function qe(_,h,w){let R=window.devicePixelRatio||1,P=_.getViewport({scale:1}),L=parseFloat(h.style.width);if(!L)return;let V=_.getViewport({scale:L/P.width*R}),B=document.createElement("canvas");return B.width=Math.floor(V.width),B.height=Math.floor(V.height),B.style.width=L+"px",B.style.height=Math.floor(V.height/R)+"px",h.innerHTML="",h.appendChild(B),h.style.height=B.style.height,w.task=_.render({canvasContext:B.getContext("2d"),viewport:V}),w.task.promise}function Ue(){if(!c)return;let _=T,h=z.getBoundingClientRect(),w=h.top-i,R=h.top+z.clientHeight+i,P=f.map((V,B)=>({slot:V,i:B,rect:V.getBoundingClientRect()})).filter(V=>V.rect.top<=R&&V.rect.bottom>=w).sort((V,B)=>Math.abs(V.rect.top-h.top)-Math.abs(B.rect.top-h.top)).slice(0,6),L=new Set(P.map(V=>V.slot));for(let V of O.keys())L.has(V)||F(V);for(let{slot:V,i:B}of P){if(V.dataset.state||q>=2)continue;let Q={cancelled:!1,task:null};O.set(V,Q),q++,V.dataset.state="rendering";let J;c.getPage(B+1).then(j=>{if(J=j,!(Q.cancelled||_!==T))return qe(J,V,Q)}).then(()=>{Q.cancelled||_!==T||(V.dataset.state="done",b&&Date.now(){!Q.cancelled&&_===T&&(V.dataset.state="failed")}).finally(()=>{q--,J?.cleanup?.(),c&&Ue()})}}function U(){v||(v=!0,window.requestAnimationFrame(function(){v=!1,Ne(),Ue()}))}function ne(){let _=!1;function h(){_||(_=!0,Ue())}window.requestAnimationFrame(h),window.setTimeout(h,50)}function x(){T++,f.forEach(F);let _=Le();f.forEach(function(h){delete h.dataset.state,h.innerHTML="",h.style.width=_+"px",h.style.height=Math.round(_/E)+"px"}),Ue()}function ie(_){if(!c||!f.length||_===k)return;let h=m;k=_,re(),x(),$e(h)}function ge(){c&&(g&&clearTimeout(g),g=setTimeout(function(){g=null,c&&f.length&&x()},250))}function Ce(_){if(ke(),!_)return;let h=T;D=pdfjsLib.getDocument({url:_,isEvalSupported:!1,standardFontDataUrl:"/script/external/pdf-standard-fonts/",cMapUrl:"/script/external/pdf-cmaps/",cMapPacked:!0}),D.promise.then(function(w){if(h!==T){w.destroy();return}return c=w,c.getPage(1).then(function(R){if(h!==T)return;let P=R.getViewport({scale:1});P.width&&P.height&&(E=P.width/P.height);let L=Le();for(let V=1;V<=c.numPages;V++){let B=document.createElement("div");B.className="pdf-viewer-page",B.style.width=L+"px",B.style.height=Math.round(L/E)+"px",z.appendChild(B),f.push(B)}re(),ne()})}).catch(function(){h===T&&Ee()})}z.addEventListener("scroll",U,{passive:!0}),$(window).on("resize",ge),re(),He(()=>e.src,Ce,{immediate:!0}),ln(function(){z.removeEventListener("scroll",U),$(window).off("resize",ge),ke()})}),()=>we("pdfviewer",{ref:t})}};var o6={key:0,class:"quota-row quota-usage"},s6={class:"quota-header"},i6={class:"quota-label"},r6={class:"project-type-svg","aria-hidden":"true"},a6=["href"],l6={key:0,class:"quota-percent"},d6={key:1,class:"quota-unlimited-tag"},u6={class:"quota-value"},c6={key:0},p6=["aria-label","aria-valuenow","aria-valuemax","aria-valuetext"],f6={key:1,class:"quota-remaining"},h6={key:2,class:"quota-remaining quota-limit"};function Wl(e,t){return e.quota?(l(),d("div",o6,[(l(),d(W,null,Z([{key:"repository",label:"Repositories",kind:"count",icon:"project-type-repo"},{key:"storage",label:"Storage",kind:"bytes",icon:"project-icon-storage"},{key:"file",label:"Files",kind:"count",icon:"project-icon-file"}],s=>n("div",{class:A(["quota-item","quota-"+e.quota[s.key].level]),key:s.key},[n("div",s6,[n("span",i6,[(l(),d("svg",r6,[n("use",{href:"#"+s.icon},null,8,a6)])),y(u(s.label),1)]),e.quota[s.key].unlimited?p("v-if",!0):(l(),d("span",l6,u(e.fmt.number(e.quota[s.key].percent,0))+"% used",1)),e.quota[s.key].unlimited?(l(),d("span",d6,"Unlimited")):p("v-if",!0)]),n("div",u6,[n("strong",null,u(e.formatAmount(e.quota[s.key].used,s.kind)),1),e.quota[s.key].unlimited?p("v-if",!0):(l(),d("span",c6," / "+u(e.formatAmount(e.quota[s.key].total,s.kind)),1))]),e.quota[s.key].unlimited?p("v-if",!0):(l(),d("div",{key:0,class:A(["quota-track","quota-"+e.quota[s.key].level]),role:"progressbar","aria-valuemin":"0","aria-label":s.label+" quota","aria-valuenow":Math.min(e.quota[s.key].used,e.quota[s.key].total),"aria-valuemax":e.quota[s.key].total,"aria-valuetext":e.fmt.number(e.quota[s.key].percent,0)+"% used"},[e.quota[s?.key].unlimited?p("v-if",!0):(l(),d("div",{key:0,class:"quota-fill",style:Ve({width:e.quota[s.key].percent+"%"})},null,4))],10,p6)),!e.quota[s.key].unlimited&&e.quota[s.key].used=e.quota[s.key].total?(l(),d("p",h6,u(e.quota[s.key].used>e.quota[s.key].total?"Limit exceeded":"Limit reached"),1)):p("v-if",!0)],2)),64))])):p("v-if",!0)}var m6={props:["quota","fmt"],setup(e){return{formatAmount:(t,s)=>s==="bytes"?e.fmt.humanFileSize(e.quota?.storage?.unit==="bytes"?t*8:t).replace(/([a-zA-Z]+)$/," $1"):e.fmt.number(t)}},render:Wl},v6=new Set(fe),Yl={props:["content","terms","options"],setup(e){let t=tt(null),s=()=>{t.value.innerHTML=renderMD(e.content||"",window.location.pathname+"/../")};return Mt(()=>{s(),He(()=>[e.content,e.terms,e.options],s,{deep:!0})}),()=>we("markdown",{ref:t})}},g6={props:["file","terms","options"],setup(e){let t=tt(null),s=()=>Ye(()=>t.value?.querySelectorAll("pre code").forEach(i=>window.Prism?.highlightElement(i)));return Mt(s),He(()=>[e.file?.content,e.terms,e.options],s,{deep:!0}),()=>{let i=e.file||{},o=(i.filename||"").split(".").pop().toLowerCase();if(["md","markdown"].includes(o)||i.language==="Markdown")return we("gist-file",{ref:t},we(Yl,{content:i.content,terms:e.terms,options:e.options}));let r={js:"javascript",jsx:"javascript",ts:"javascript",typescript:"javascript",py:"python",html:"markup",xml:"markup",svg:"markup",sh:"bash"},a=(i.language||o||"none").toLowerCase();return we("gist-file",{ref:t},we("pre",{class:"line-numbers"},we("code",{class:"language-"+(r[a]||a),key:i.content},i.content||"")))}}},y6={props:["file","content"],setup(e){let t=tt(null),s=0,i,o=async()=>{let r=++s;i?.abort(),i=new AbortController;try{let a=e.content?JSON.parse(e.content):await fetch(e.file?.download_url||e.file,{signal:i.signal}).then(c=>{if(!c.ok)throw Error("Notebook request failed");return c.json()});if(await xt("notebook"),r!==s)return;t.value.innerHTML=DOMPurify.sanitize(nb.parse(a).render()),t.value.querySelectorAll("pre code").forEach(c=>window.Prism?.highlightElement(c))}catch(a){r===s&&a.name!=="AbortError"&&(t.value.textContent="Unable to render the notebook.")}};return Mt(()=>{o(),He(()=>[e.file,e.content],o)}),ln(()=>{s++,i?.abort()}),()=>we("notebook",{ref:t})}},b6={props:["stats"],setup(e){return()=>{let t=Object.entries(e.stats||{}).filter(([,i])=>i.code),s=t.reduce((i,[,o])=>i+o.code,0);return we("loc",t.map(([i,o])=>we("div",{class:"lang",title:`${i}: ${o.code.toLocaleString()} lines`,style:{width:o.code*100/s+"%",background:langColors[i]}})))}}},Ql={Markdown:Yl,GistFile:g6,Notebook:y6,Loc:b6,HtmlDoc:jl,QuotaUsage:m6,Pdfviewer:mr(async()=>(await xt("pdf"),pdfjsLib.GlobalWorkerOptions.workerSrc="/script/external/pdf.worker.js",Gl))},Jl={async mounted(e,{value:t}){e._editorValue=t;try{if(await mi(),e._editorDisposed)return;let s=e._editorValue,i=ace.edit(e);e._editor=i,i.setValue(String(s.content??""),-1),Kl(e,s.options),e._editorCleanup=s.options?.onLoad?.(i)}catch(s){e._editorDisposed||(e.textContent=s.message)}},updated(e,{value:t}){e._editorValue=t,e._editor&&(e._editor.getValue()!==String(t.content??"")&&e._editor.setValue(String(t.content??""),-1),Kl(e,t.options))},beforeUnmount(e){e._editorDisposed=!0,e._editorCleanup?.(),e._editor?.destroy()}};function Kl(e,t={}){let s=v6.has(t.mode)?t.mode:"text";e._editor.session.setMode("ace/mode/"+s),t.theme&&e._editor.setTheme("ace/theme/"+t.theme),e._editor.setReadOnly(t.readOnly!==!1)}var Xl={mounted(e){if(!window.IntersectionObserver)return;let t=[...e.querySelectorAll('a[href^="#"]')],s=new Set,i=new IntersectionObserver(o=>{o.forEach(a=>a.isIntersecting?s.add(a.target.id):s.delete(a.target.id));let r=t.find(a=>s.has(a.hash.slice(1)));t.forEach(a=>a.classList.toggle("active",a===r))},{rootMargin:"-20% 0px -60% 0px",threshold:0});Ye(()=>t.forEach(o=>{let r=document.getElementById(o.hash.slice(1));r&&i.observe(r)})),e._observer=i},beforeUnmount(e){e._observer?.disconnect()}};function w6(e){let t={children:[]},s=new Map([["",t]]);function i(o){if(s.has(o))return s.get(o);let r=o.lastIndexOf("/"),a=i(r<0?"":o.slice(0,r)),c={name:o.slice(r+1),children:[]};return s.set(o,c),a.children.push(c),c}for(let o of e||[]){let r=o.path?`${o.path}/${o.name}`:o.name;o.size==null?i(r):i(o.path||"").children.push({...o})}return t.children}var Zl={name:"FileTree",props:["file","parent","searchQuery","searchResults","page"],setup(e){let t=Ba(),s=tt(null),i=ze(Object.create(null)),o=null,r=ot(()=>w6(e.file)),a=()=>"/"+(Array.isArray(t.params.path)?t.params.path.join("/"):t.params.path||"");He(()=>[t.params.repoId,t.params.path],()=>{let m="";a().split("/").filter(Boolean).forEach(b=>{m+="/"+b,i[m]=!0})},{immediate:!0});let c=ot(()=>{if(!e.searchQuery||!e.searchResults)return null;let m=new Set,b=new Set;return e.searchResults.forEach(C=>{m.add(C.path?`${C.path}/${C.name}`:C.name);let E="";(C.path||"").split("/").filter(Boolean).forEach(T=>{E=E?E+"/"+T:T,b.add(E)})}),{files:m,folders:b}}),f=()=>[...s.value.querySelectorAll("li > a")],v=m=>{s.value.querySelector(".tree-focused")?.classList.remove("tree-focused"),m&&(o=m.dataset.path,m.classList.add("tree-focused"),m.scrollIntoView?.({block:"nearest"}),s.value.focus())};function g(m){let b=f(),C=s.value.querySelector(".tree-focused")||b[0],E=b.indexOf(C);if(!["ArrowDown","ArrowUp","ArrowRight","ArrowLeft","Enter"].includes(m.key)||(m.preventDefault(),m.key==="ArrowDown"&&v(b[(E+1)%b.length]),m.key==="ArrowUp"&&v(b[(E-1+b.length)%b.length]),!C))return;let T=C.closest("li");m.key==="ArrowRight"&&T.classList.contains("folder")&&(T.classList.contains("open")?v(T.querySelector(":scope > ul > li > a")):C.click()),m.key==="ArrowLeft"&&(T.classList.contains("folder")&&T.classList.contains("open")?C.click():v(T.parentElement.closest("li.folder")?.querySelector(":scope > a"))),m.key==="Enter"&&C.click()}function k(m,b=""){let C=[...m].sort((E,T)=>+!!T.children-+!!E.children||E.name.localeCompare(T.name));return we("ul",C.flatMap(E=>{let T=E,D=T.name,O=(b+"/"+D).slice(1);if(c.value&&!c.value.files.has(O)&&!c.value.folders.has(O))return[];for(;T.children?.length===1;)T=T.children[0],D+="/"+T.name;let q=b+"/"+D,F=!!T.children,M=c.value?i[q]!==!1:!!i[q],z=F&&e.page?.options?.truncatedFolders?.includes(q.slice(1)),se=e.page?.fileCounts?.[q.slice(1)]||0,oe=we("span",{class:F?"tree-icon-folder":"far fa-file tree-icon-file","aria-hidden":"true"},F?we("svg",{viewBox:"0 0 14 12",focusable:"false"},we("path",{d:"M1.5 10.5v-9h4l1.5 2h5.5v7z"})):null),S=we("span",{class:"tree-name"},D),I=K=>{v(K.currentTarget),F&&(K.preventDefault(),i[q]=!M,i[q]&&!T.children.length&&e.page.getFiles(q.slice(1)),Ye(()=>v(f().find(X=>X.dataset.path===o))))},H=we("a",{"data-path":q,href:F?void 0:`/r/${encodeURIComponent(t.params.repoId)}${encodePathForUrl(q)}`,class:{"tree-focused":o===q},onClick:I},[F?we("span",{class:"tree-toggle"}):b?we("span",{class:"tree-spacer"}):null,oe,S,z?we("span",{class:"truncated-warning",title:e.page.fmt.translate("WARNINGS.folder_truncated")},we("i",{class:"fas fa-exclamation-triangle"})):null,F&&se?we("span",{class:"tree-count"},se):null]);return we("li",{key:q,class:{file:!0,folder:F,open:M,active:a()===q,truncated:z},title:F?"":`Size: ${humanFileSize(T.size||0)}`},[H,F&&M?k(T.children,q):null])}))}return()=>we("tree",{ref:s,tabindex:0,onKeydown:g},e.file?.length?c.value?.files.size===0?we("div",{class:"tree-search-empty"},"No files found"):k(r.value):"Empty repository")}};function ed(){return ze({errors:{},dirty:!1,touched:!1,submitted:!1,get invalid(){return Object.values(this.errors).some(Boolean)},setValidity(e,t){this.errors[e]=!t},setDirty(){this.dirty=!0}})}function td(e,t){if(!e[t]){let s=ed();Object.defineProperty(s,"invalid",{get(){return Object.values(s.errors).some(Boolean)||Object.keys(s).some(i=>i!=="invalid"&&s[i]&&typeof s[i]=="object"&&s[i].invalid)}}),e[t]=s}return e[t]}var nd={beforeMount(e,{value:t}){e._formState=td(t,e.name),e.addEventListener("submit",s=>s.preventDefault())}};function k6(e){return e instanceof Date?isNaN(e)?"":`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`:e||""}function xl(e){let t=e._field.binding.value;e.type==="checkbox"?e.checked=!!t:e.type==="radio"?e.checked=t==(e._value??e.value):e._field.timer||(e.value=e.type==="date"?k6(t):t??""),ci(e)}function ci(e){let t=e._field.validation;if(!t)return;let s=e.validity;for(let[i,o]of Object.entries({required:s.valueMissing,pattern:s.patternMismatch,min:s.rangeUnderflow,max:s.rangeOverflow,date:s.badInput,email:s.typeMismatch&&e.type==="email",url:s.typeMismatch&&e.type==="url"}))t.setValidity(i,e.disabled||!o)}var od={beforeMount(e,{value:t}){var a;let s=t.form&&td(t.state,t.form),i=s&&e.name?s[a=e.name]||(s[a]=ed()):null;e._field={binding:t,validation:i,timer:null};let o=()=>{clearTimeout(e._field.timer),e._field.timer=null;let c=e._field.binding,f=e.type==="checkbox"?e.checked:e._value??e.value;if(!(e.type==="radio"&&!e.checked)){if((e.type==="number"||e.type==="range")&&(f=e.value===""?null:Number(e.value)),e.type==="date"&&(f=e.value?new Date(e.value+"T00:00:00"):null),i){i.setDirty();for(let v of Object.keys(i.errors))i.setValidity(v,!0)}c.set(f),ci(e),c.change?.()}};e._field.commit=o;let r=c=>{let f=e._field.binding.options?.debounce||0,v=typeof f=="number"?f:f[c.type]??f.default??0;clearTimeout(e._field.timer),v?e._field.timer=setTimeout(o,v):o()};e.addEventListener(e.tagName==="SELECT"||["checkbox","radio","date"].includes(e.type)?"change":"input",r),e.addEventListener("blur",()=>{i&&(i.touched=!0),e._field.timer&&o()})},mounted:xl,updated(e,{value:t}){e._field.binding=t,xl(e)},beforeUnmount(e){clearTimeout(e._field.timer);let{binding:t,validation:s}=e._field,i=t.form&&t.state[t.form];i&&i[e.name]===s&&delete i[e.name]}};function sd(e,t){let s=e.target.closest("form");if(s?._formState&&(s._formState.submitted=!0),s?.querySelectorAll("input, select, textarea").forEach(i=>{i._field?.timer&&i._field.commit(),i._field&&ci(i)}),s&&!s.checkValidity()){let i=s.querySelector("input:invalid, select:invalid, textarea:invalid");i?.scrollIntoView?.({block:"center"}),i?.focus(),s.reportValidity();return}return t()}var id=Symbol("session"),E6=/^\/(w|api|github)(\/|$)/;function rd(e,t={}){let s=e?.split(".").reduce((i,o)=>i?.[o],Hl);return String(s??e??"").replace(/{{\s*([^}]+?)\s*}}/g,(i,o)=>t[o]??"")}var C6={...ui,translate:rd};function _6(e){if(e==null||e==="")return e;try{let t=new URL(e,window.location.href);return["http:","https:","mailto:","tel:","blob:"].includes(t.protocol)?e:void 0}catch{return}}function S6(e="#app",t={}){!t.history&&window.location.pathname==="/"&&/^#!\/r\/[^/?#]+/.test(window.location.hash)&&window.history.replaceState(window.history.state,"",window.location.hash.slice(2));let s=new Map,i=Fl(t.fetch),o,r;function a(){let v=ct(),g={url(m){return m===void 0?r.currentRoute.value.fullPath:(r.push(m),g)},replace(m){return r.replace(m)},path(){return r.currentRoute.value.path},search(){return r.currentRoute.value.query}},k=new Proxy({},{get(m,b){let C=r.currentRoute.value.params[b];return Array.isArray(C)?C.join("/"):C}});return{http:i,...v,location:g,params:k,window,promises:Bl,html:{trustAsHtml:m=>m},translate:(m,b)=>Promise.resolve(rd(m,b)),quotaService:zl(i)}}function c(v){return{name:v.template,setup(){let g=ri(ut(id),s);v.setup(g,a()),Ul(v.template,g);let k=[];return()=>ls[v.template](g,k)}}}r=Fa({history:t.history||$a(),routes:dl.map(v=>v.redirect?v:{path:v.path,component:c(v),meta:{title:v.title,preserveExplorer:v.preserveExplorer}})});let f=sa({setup(){o=ri(null,s),o.fmt=C6,o.window=window,o.Math=Math,o.sanitize=m=>DOMPurify.sanitize(m??""),o.submitForm=sd,o.safeUrl=_6;let v=a();Ha(o,v.http,v.location,v.timeout),an(id,o),He(()=>o.title,m=>{document.title=m||"Anonymous GitHub"});let g=[],k=m=>{let b=m.target.closest?.("a[href]");if(m.defaultPrevented||m.button!==0||m.metaKey||m.ctrlKey||m.shiftKey||m.altKey||!b||b.hasAttribute("download")||b.target&&b.target!=="_self"||b.dataset.toggle||b.getAttribute("href").startsWith("#"))return;let E=new URL(b.href,window.location.href);E.origin!==window.location.origin||E6.test(E.pathname)||(m.preventDefault(),r.push(E.pathname+E.search+E.hash),$("#navbarSupportedContent.show").collapse("hide"))};return document.addEventListener("click",k),ln(()=>document.removeEventListener("click",k)),()=>[Ll(o,[]),we("header",{class:"app-header"},ls["partials/header.htm"](o,g)),we("main",{class:"app-view align-items-stretch w-100"},we(si,null,{default:({Component:m,route:b})=>m?we(m,{key:b.meta.preserveExplorer?b.matched[0]?.path:b.path}):null})),we("div",{class:"position-fixed p-3",style:{zIndex:999999999,right:0,bottom:0}},o.toasts.map((m,b)=>we("div",{class:"toast show",role:"alert","aria-live":"assertive","aria-atomic":"true",key:b},[we("div",{class:"toast-header"},[we("strong",{class:"mr-auto"},m.title),we("button",{type:"button",class:"ml-2 mb-1 close","aria-label":"Close",onClick:()=>o.removeToast(m)},"\xD7")]),we("div",{class:"toast-body"},m.body)])))]}});for(let[v,g]of Object.entries(Ql))f.component(v,g);return f.component("Tree",Zl),f.component("PartialView",{props:["name","state"],setup(v){let g=[];return()=>ls[v.name](v.state,g)}}),f.directive("field",od),f.directive("form",nd),f.directive("code-editor",Jl),f.directive("paper-scrollspy",Xl),f.use(r),r.beforeEach(async v=>{o?.emit("routeLeave"),/^\/(r|repository|anonymize|pull-request-anonymize|gist-anonymize|pr|gist)(\/|$)/.test(v.path)&&await xt("markdown"),/^\/(r|repository)\//.test(v.path)&&await xt("org")}),r.afterEach(v=>{if(!o)return;o.title=v.meta.title,o.emit("routeChange",{title:v.meta.title}),o.emit("routeUpdate",{title:v.meta.title});let g=document.querySelector(".app-view");!v.meta.preserveExplorer&&g&&(g.scrollTop=0)}),f.mount(e),{app:f,router:r,state:o}}document.querySelector("#app")&&(window.anonymousApp=S6());})(); /*! Bundled license information: @vue/shared/dist/shared.esm-bundler.js: diff --git a/scripts/paid-usage-report.mongosh.js b/scripts/paid-usage-report.mongosh.js new file mode 100644 index 0000000..e06da74 --- /dev/null +++ b/scripts/paid-usage-report.mongosh.js @@ -0,0 +1,53 @@ +/* global db, print */ +// Read-only: run with mongosh connected to the application database. +// Only aggregate counts leave this process. No file-content collection is read. +const now = new Date(); +const users = new Map(), github = new Map(), usernames = new Map(); +db.users.find({}, { _id: 1, externalIDs: 1, username: 1 }).maxTimeMS(60000).forEach(u => { + const id = String(u._id); + users.set(id, true); + if (u.externalIDs?.github) github.set(String(u.externalIDs.github), id); + if (u.username) usernames.set(u.username, id); +}); +const states = {}; +const active = new Map(), reserved = new Map(); +function add(map, r) { + const id = String(r.owner); + if (!map.has(id)) map.set(id, { count: 0, bytes: 0, measured: 0, collaborators: new Set() }); + const a = map.get(id); + a.count++; + a.bytes += r.size?.storage || 0; + if (r.sizeComputedAt) a.measured++; + for (const c of r.coauthors || []) { + const user = c.githubId ? github.get(String(c.githubId)) : usernames.get(c.username); + if (user && user !== id) a.collaborators.add(user); + } +} +let shared = 0; +db.anonymizedrepositories.find({}, { owner: 1, status: 1, options: 1, size: 1, sizeComputedAt: 1, coauthors: 1 }).maxTimeMS(60000).forEach(r => { + states[r.status] = (states[r.status] || 0) + 1; + if (!["removed", "expired"].includes(r.status)) add(reserved, r); + if (r.status === "ready" && (r.options?.expirationMode === "never" || !r.options?.expirationDate || r.options.expirationDate > now)) { + add(active, r); + if (r.coauthors?.length) shared++; + } +}); +function summarize(map) { + const entries = [...map.values()], counts = entries.map(x => x.count).sort((a,b) => a-b); + const percentile = p => counts[Math.max(0, Math.ceil(counts.length*p)-1)] || 0; + return { + owners: map.size, registeredOwners: [...map.keys()].filter(id => users.has(id)).length, + repositories: counts.reduce((a,b) => a+b, 0), + withSizeComputedAt: entries.reduce((a,b) => a+b.measured, 0), + buckets: [1,2,3,5,10,20,Infinity].map((max,i,ends) => ({max: Number.isFinite(max) ? max : "above20", owners: counts.filter(n => n > (ends[i-1] || 0) && n <= max).length})), + percentiles: {p50:percentile(.5),p90:percentile(.9),p95:percentile(.95),p99:percentile(.99),max:counts.at(-1)}, + countLimits: [3,5,10,20].map(limit => ({limit, atOrAbove:entries.filter(x=>x.count>=limit).length, above:entries.filter(x=>x.count>limit).length, + coauthorsOfOwnersAbove:new Set(entries.filter(x=>x.count>limit).flatMap(x=>[...x.collaborators])).size})), + storageLimits: [.5,1,2,5].map(gib => ({gib, above:entries.filter(x=>x.bytes>gib*1024**3).length})), + aboveTenOrTwoGiB: entries.filter(x=>x.count>10 || x.bytes>2*1024**3).length, + coauthorsOfOwnersAboveTenOrTwoGiB: new Set(entries.filter(x=>x.count>10 || x.bytes>2*1024**3).flatMap(x=>[...x.collaborators])).size, + coauthorsOfOwnersAtTen: new Set(entries.filter(x=>x.count>=10).flatMap(x=>[...x.collaborators])).size, + distinctCoauthors:new Set(entries.flatMap(x=>[...x.collaborators])).size + }; +} +print(JSON.stringify({asOf:now, registeredAccounts:users.size, statuses:states, activeSharedRepositories:shared, active:summarize(active), initialReservations:summarize(reserved)}, null, 2)); diff --git a/scripts/test-stripe-sandbox.js b/scripts/test-stripe-sandbox.js new file mode 100644 index 0000000..d3ae6ff --- /dev/null +++ b/scripts/test-stripe-sandbox.js @@ -0,0 +1,190 @@ +const { setTimeout } = require("node:timers"); +// Explicit opt-in integration test. Creates only tagged sandbox objects. +// Credentials live outside the repository; never log Stripe errors verbatim. +const fs = require("node:fs"); +const assert = require("node:assert/strict"); +const crypto = require("node:crypto"); +require("ts-node/register/transpile-only"); +const mongoose = require("mongoose"); +const Stripe = require("stripe"); +const config = require("../src/config").default; +const { BillingAccount, BillingGrant, BillingQuota, BillingLock } = require("../src/core/billing/models"); +const Repo = require("../src/core/model/anonymizedRepositories/anonymizedRepositories.model").default; +const Conference = require("../src/core/model/conference/conferences.model").default; +const { createCheckout, syncSubscription, fulfillCheckout, cancelAccountBilling } = require("../src/core/billing/stripe"); +const { allowance } = require("../src/core/billing/quotas"); +const { neverExpirationDeadline, reconcileNeverExpiration } = require("../src/core/billing/expiration"); +const run = crypto.randomUUID(); +const metadata = { application: "anonymous-github", sandbox_test_run: run }; +const results = []; +const customers = [], prices = [], products = [], clocks = []; +let stripe; +async function check(name, fn) { await fn(); results.push(name); console.log("PASS " + name); } +async function customer() { + const owner = new mongoose.Types.ObjectId().toString(); + const c = await stripe.customers.create({ metadata: { ...metadata, owner }, payment_method: "pm_card_visa", invoice_settings: { default_payment_method: "pm_card_visa" } }); + customers.push(c.id); + await BillingAccount.create({ _id: owner, customerId: c.id }); + return { owner, id: c.id }; +} +async function main() { + const credentialsPath = process.env.STRIPE_SANDBOX_CREDENTIALS; + if (!credentialsPath) throw new Error("Set STRIPE_SANDBOX_CREDENTIALS to a private JSON file"); + const { secret } = JSON.parse(fs.readFileSync(credentialsPath, "utf8")); + if (typeof secret !== "string" || !secret.startsWith("sk_test_")) throw new Error("Sandbox secret key required"); + stripe = new Stripe(secret, { maxNetworkRetries: 2, timeout: 20000 }); + assert.equal((await stripe.balance.retrieve()).livemode, false); + const uri = process.env.BILLING_TEST_MONGODB_URI; + assert.match(new URL(uri).pathname, /^\/billing_test_/); + await mongoose.connect(uri); + await Promise.all([BillingAccount, BillingGrant, BillingQuota, BillingLock, Repo, Conference].map(m => m.init())); + Object.assign(config, { BILLING_ENABLED: true, STRIPE_SECRET_KEY: secret, + STRIPE_WEBHOOK_SECRET: crypto.randomBytes(32).toString("hex"), BILLING_ORIGIN: "http://localhost:5183", BILLING_AUTOMATIC_TAX: false }); + const product = await stripe.products.create({ name: "Anonymous GitHub sandbox integration " + run, metadata }); + products.push(product.id); + for (const [key, amount, interval] of [ + ["STRIPE_AUTHOR_MONTHLY_PRICE",500,"month"],["STRIPE_AUTHOR_ANNUAL_PRICE",4900,"year"], + ["STRIPE_AUTHOR_PASS_PRICE",1500],["STRIPE_CONFERENCE_PRICE",19900]]) { + const p = await stripe.prices.create({ product: product.id, currency: "eur", unit_amount: amount, metadata, ...(interval ? { recurring: { interval } } : {}) }); + prices.push(p.id); config[key] = p.id; + } + const buyer = await customer(); + await Repo.create({ repoId: "sandbox-"+run, owner: buyer.owner, status: "ready" }); + await Conference.create({ conferenceID: "sandbox-"+run, owners: [buyer.owner], status: "pending_payment", + startDate: new Date(), endDate: new Date(Date.now()+86400000*30), plan: { planID: "conference" } }); + for (const plan of ["author_monthly","author_annual","author_pass","conference"]) { + await check(plan + " Checkout creation, reuse, unpaid denial and expiry", async () => { + const target = ["author_pass","conference"].includes(plan) ? "sandbox-"+run : ""; + const url = await createCheckout(buyer.owner, plan, target, stripe); + assert.match(url, /^https:\/\/checkout.stripe.com\//); + assert.equal(await createCheckout(buyer.owner,plan,target,stripe), url); + const account = await BillingAccount.findById(buyer.owner); + await fulfillCheckout(account.checkout.id, stripe); + assert.equal(await BillingGrant.countDocuments({ owner: buyer.owner }),0); + await stripe.checkout.sessions.expire(account.checkout.id); + }); + } + for (const [plan,key] of [["author_monthly","STRIPE_AUTHOR_MONTHLY_PRICE"],["author_annual","STRIPE_AUTHOR_ANNUAL_PRICE"]]) { + const c = await customer(); + const sub = await stripe.subscriptions.create({ customer:c.id, items:[{price:config[key]}], metadata:{...metadata,owner:c.owner} }); + await check(plan + " successful payment and entitlement",async()=>{ + await syncSubscription(sub.id,stripe); + assert.equal((await allowance(c.owner)).plan,plan); + assert.ok(await neverExpirationDeadline(c.owner)); + }); + await check(plan + " duplicate subscription prevention",async()=>{ + await assert.rejects(createCheckout(c.owner,plan,"",stripe),/billing_subscription_exists/); + }); + await check(plan + " cancellation preserves paid period",async()=>{ + await stripe.subscriptions.update(sub.id,{cancel_at_period_end:true}); + await syncSubscription(sub.id,stripe); + assert.equal((await allowance(c.owner)).plan,plan); + assert.equal((await BillingGrant.findById(sub.id)).cancelAtPeriodEnd,true); + }); + await check(plan + " immediate cancellation and grace expiry",async()=>{ + const deadline = await neverExpirationDeadline(c.owner); + await Repo.create({repoId:plan+"-"+run,owner:c.owner,status:"ready",options:{expirationMode:"never"},billingNeverExpiresUntil:deadline}); + await stripe.subscriptions.cancel(sub.id); + await syncSubscription(sub.id,stripe); + assert.equal((await allowance(c.owner)).plan,"free"); + await reconcileNeverExpiration(new Date(deadline.getTime()-1)); + assert.equal((await Repo.findOne({owner:c.owner})).options.expirationMode,"never"); + await reconcileNeverExpiration(deadline); + assert.equal((await Repo.findOne({owner:c.owner})).options.expirationMode,"remove"); + }); + } + await check("declined initial payment grants no paid access",async()=>{ + const c=await customer(); + const pm=await stripe.paymentMethods.attach("pm_card_chargeCustomerFail",{customer:c.id}); + await stripe.customers.update(c.id,{invoice_settings:{default_payment_method:pm.id}}); + const sub=await stripe.subscriptions.create({customer:c.id,items:[{price:config.STRIPE_AUTHOR_MONTHLY_PRICE}],payment_behavior:"default_incomplete",metadata:{...metadata,owner:c.owner}}); + await syncSubscription(sub.id,stripe); + assert.equal((await allowance(c.owner)).plan,"free"); + await assert.rejects(neverExpirationDeadline(c.owner),/subscription_required/); + }); + + await check("subscription refund revocation, signed event replay and tamper rejection",async()=>{ + const c=await customer(); + const sub=await stripe.subscriptions.create({customer:c.id,items:[{price:config.STRIPE_AUTHOR_MONTHLY_PRICE}],metadata:{...metadata,owner:c.owner}}); + await syncSubscription(sub.id,stripe); + const payments=await stripe.invoicePayments.list({invoice:sub.latest_invoice}); + const pi=payments.data.find(p=>p.payment.type==="payment_intent").payment.payment_intent; + const refund=await stripe.refunds.create({payment_intent:typeof pi==="string"?pi:pi.id}); + const charge=await stripe.charges.retrieve(refund.charge); + const express=require("express"); + const app=express(); + app.use("/webhook",require("../src/server/routes/billing").billingWebhook); + const server=await new Promise(resolve=>{const srv=app.listen(0,"127.0.0.1",()=>resolve(srv));}); + try { + // Real Stripe charge payload; local signature exercises the production HTTP route. + const payload=JSON.stringify({id:"evt_sandbox_"+run,type:"charge.refunded",data:{object:charge}}); + const signature=stripe.webhooks.generateTestHeaderString({payload,secret:config.STRIPE_WEBHOOK_SECRET}); + const post=body=>globalThis.fetch("http://127.0.0.1:"+server.address().port+"/webhook",{method:"POST",headers:{"content-type":"application/json","stripe-signature":signature},body}); + assert.equal((await post(payload)).status,200); + assert.equal((await post(payload)).status,200); + assert.equal((await post(payload+" ")).status,400); + await require("../src/core/billing/events").processBillingInbox(); + assert.equal((await allowance(c.owner)).plan,"free"); + await syncSubscription(sub.id,stripe); + assert.equal((await allowance(c.owner)).plan,"free"); + } finally { server.closeAllConnections();await new Promise(resolve=>server.close(resolve)); } + }); + await check("subscription renewal, failed renewal, and recovery using a Stripe test clock",async()=>{ + const clock=await stripe.testHelpers.testClocks.create({frozen_time:Math.floor(Date.now()/1000),name:"Anonymous GitHub "+run}); + clocks.push(clock.id); + const owner=new mongoose.Types.ObjectId().toString(); + const c=await stripe.customers.create({test_clock:clock.id,payment_method:"pm_card_visa",invoice_settings:{default_payment_method:"pm_card_visa"},metadata:{...metadata,owner}}); + customers.push(c.id);await BillingAccount.create({_id:owner,customerId:c.id}); + let sub=await stripe.subscriptions.create({customer:c.id,items:[{price:config.STRIPE_AUTHOR_MONTHLY_PRICE}],metadata:{...metadata,owner}}); + await syncSubscription(sub.id,stripe); + const original=(await BillingGrant.findById(sub.id)).until.getTime(); + async function advance(time) { + await stripe.testHelpers.testClocks.advance(clock.id,{frozen_time:time}); + for(let i=0;i<60;i++) { + if((await stripe.testHelpers.testClocks.retrieve(clock.id)).status==="ready") return; + await new Promise(r=>setTimeout(r,1000)); + } + throw new Error("Test clock did not settle"); + } + await advance(sub.items.data[0].current_period_end+1); + sub=await stripe.subscriptions.retrieve(sub.id); + let invoice=await stripe.invoices.retrieve(sub.latest_invoice); + if(invoice.status==="draft") invoice=await stripe.invoices.finalizeInvoice(invoice.id); + if(invoice.status==="open") await stripe.invoices.pay(invoice.id); + await syncSubscription(sub.id,stripe); + assert.ok((await BillingGrant.findById(sub.id)).until.getTime()>original); + const paidThrough=(await BillingGrant.findById(sub.id)).until.getTime(); + const failed=await stripe.paymentMethods.attach("pm_card_chargeCustomerFail",{customer:c.id}); + await stripe.customers.update(c.id,{invoice_settings:{default_payment_method:failed.id}}); + await advance(sub.items.data[0].current_period_end+1); + sub=await stripe.subscriptions.retrieve(sub.id); + invoice=await stripe.invoices.retrieve(sub.latest_invoice); + if(invoice.status==="draft") invoice=await stripe.invoices.finalizeInvoice(invoice.id); + try { await stripe.invoices.pay(invoice.id); } catch(e) { assert.equal(e.type,"StripeCardError"); } + await syncSubscription(sub.id,stripe); + assert.equal((await BillingGrant.findById(sub.id)).until.getTime(),paidThrough); + // App wall time does not follow Stripe's test clock. Verify paid-through does not advance. + const good=await stripe.paymentMethods.attach("pm_card_visa",{customer:c.id}); + await stripe.customers.update(c.id,{invoice_settings:{default_payment_method:good.id}}); + await stripe.invoices.pay(invoice.id); + await syncSubscription(sub.id,stripe); + assert.ok((await BillingGrant.findById(sub.id)).until.getTime()>paidThrough); + }); + await check("account deletion cancels subscription",async()=>{ + const c=await customer(); + const sub=await stripe.subscriptions.create({customer:c.id,items:[{price:config.STRIPE_AUTHOR_MONTHLY_PRICE}],metadata:{...metadata,owner:c.owner}}); + await syncSubscription(sub.id,stripe); + await cancelAccountBilling(c.owner); + assert.equal((await stripe.subscriptions.retrieve(sub.id)).status,"canceled"); + }); +} +main().catch(e=>{console.error(JSON.stringify({failure:true,type:e.type||e.name,code:e.code,parameter:e.param,message:e.type?undefined:e.message}));process.exitCode=1;}).finally(async()=>{ + if(stripe) { + for(const id of customers) try { await stripe.customers.del(id); } catch { console.error("Customer cleanup failed: "+id); } + for(const id of clocks) try { await stripe.testHelpers.testClocks.del(id); } catch { console.error("Clock cleanup failed: "+id); } + for(const id of prices) try { await stripe.prices.update(id,{active:false}); } catch { console.error("Price cleanup failed: "+id); } + for(const id of products) try { await stripe.products.update(id,{active:false}); } catch { console.error("Product cleanup failed: "+id); } + } + if(mongoose.connection.readyState) await mongoose.disconnect(); + console.log(JSON.stringify({run,passed:results.length,results})); +}); diff --git a/src/config.ts b/src/config.ts index d23a47e..3f30b9c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,6 +2,24 @@ import { resolve } from "path"; import { randomBytes } from "crypto"; interface Config { + BILLING_ENABLED: boolean; + BILLING_CHECKOUT_ENABLED: boolean; + BILLING_ORIGIN: string; + BILLING_AUTOMATIC_TAX: boolean; + STRIPE_SECRET_KEY: string; + STRIPE_WEBHOOK_SECRET: string; + STRIPE_AUTHOR_MONTHLY_PRICE: string; + STRIPE_AUTHOR_ANNUAL_PRICE: string; + STRIPE_AUTHOR_PASS_PRICE: string; + STRIPE_CONFERENCE_PRICE: string; + FREE_AUTHOR_REPOSITORIES: number; + FREE_AUTHOR_STORAGE: number; + PAID_AUTHOR_REPOSITORIES: number; + PAID_AUTHOR_STORAGE: number; + PAID_PASS_STORAGE: number; + PAID_CONFERENCE_REPOSITORIES: number; + PAID_CONFERENCE_STORAGE: number; + GITHUB_APP_ENABLED: boolean; GITHUB_APP_NEW_CONNECTIONS: boolean; GITHUB_OAUTH_ENABLED: boolean; @@ -67,6 +85,24 @@ interface Config { RATE_LIMIT: number; } const config: Config = { + BILLING_ENABLED: false, + BILLING_CHECKOUT_ENABLED: true, + BILLING_ORIGIN: "http://localhost:5000", + BILLING_AUTOMATIC_TAX: false, + STRIPE_SECRET_KEY: "", + STRIPE_WEBHOOK_SECRET: "", + STRIPE_AUTHOR_MONTHLY_PRICE: "", + STRIPE_AUTHOR_ANNUAL_PRICE: "", + STRIPE_AUTHOR_PASS_PRICE: "", + STRIPE_CONFERENCE_PRICE: "", + FREE_AUTHOR_REPOSITORIES: 5, + FREE_AUTHOR_STORAGE: 2 * 1024 ** 3, + PAID_AUTHOR_REPOSITORIES: 20, + PAID_AUTHOR_STORAGE: 10 * 1024 ** 3, + PAID_PASS_STORAGE: 2 * 1024 ** 3, + PAID_CONFERENCE_REPOSITORIES: 100, + PAID_CONFERENCE_STORAGE: 50 * 1024 ** 3, + GITHUB_APP_ENABLED: false, GITHUB_APP_NEW_CONNECTIONS: true, GITHUB_OAUTH_ENABLED: true, @@ -199,3 +235,10 @@ if (config.GITHUB_APP_ENABLED) { if (!config.GITHUB_APP_PRIVATE_KEY && !config.GITHUB_APP_PRIVATE_KEY_FILE) throw new Error("A GitHub App private key is required"); } export default config; + +if (config.BILLING_ENABLED) { + for (const key of ["FREE_AUTHOR_REPOSITORIES", "FREE_AUTHOR_STORAGE", "PAID_AUTHOR_REPOSITORIES", "PAID_AUTHOR_STORAGE", "PAID_PASS_STORAGE", "PAID_CONFERENCE_REPOSITORIES", "PAID_CONFERENCE_STORAGE"] as const) { + if (!Number.isSafeInteger(config[key]) || config[key] <= 0) throw new Error(`${key} must be a positive integer`); + } + if (!config.STRIPE_SECRET_KEY || !config.STRIPE_WEBHOOK_SECRET) throw new Error("Billing requires STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET"); +} diff --git a/src/core/AnonymizedFile.ts b/src/core/AnonymizedFile.ts index 09c684d..ccd21e0 100644 --- a/src/core/AnonymizedFile.ts +++ b/src/core/AnonymizedFile.ts @@ -265,6 +265,7 @@ export default class AnonymizedFile { folder === "" || fileDir === folder || fileDir.startsWith(folder + "/") ); if (!isAffected) return null; + if (this.repository.model.billingManaged) throw new AnonymousError("repository_tree_incomplete", { httpStatus: 409 }); const source = this.repository.source as { fetchFileInfoFromPath?: (filePath: string) => Promise; }; diff --git a/src/core/Repository.ts b/src/core/Repository.ts index b7d37af..97ffced 100644 --- a/src/core/Repository.ts +++ b/src/core/Repository.ts @@ -1,3 +1,4 @@ +import { allowance, reserveRepository } from "./billing/quotas"; import AnonymizedPathModel from "./model/anonymized-path"; import storage from "./storage"; import { contentGenerationPrefix, contentRetirementMarker } from "./content-generation"; @@ -224,6 +225,7 @@ export default class Repository { const streamed = this.model.source.type !== "Zip"; const source = this.source; const files = await source.getFiles(opt.progress); + if (this.model.billingManaged) await reserveRepository(String(this.model.owner), this.repoId, files.reduce((sum, file) => sum + (file.size || 0), 0), this.model.conference); const sourceWithTruncation = source as unknown as { truncatedFolderList?: string[] }; const truncatedFolders = Array.isArray(sourceWithTruncation.truncatedFolderList) ? [...sourceWithTruncation.truncatedFolderList] : []; @@ -638,6 +640,10 @@ export default class Repository { }); } } + // Reviewer visits must not trigger an unaffordable refresh after paid access ends. + // Free managed repositories can still be refreshed explicitly by their owner. + if (config.BILLING_ENABLED && this.model.billingManaged && !opt?.force && + (await allowance(String(this.model.owner), this.repoId, this.model.conference)).plan === "free") return; const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); if ( diff --git a/src/core/billing/config.ts b/src/core/billing/config.ts new file mode 100644 index 0000000..c6a78f8 --- /dev/null +++ b/src/core/billing/config.ts @@ -0,0 +1,24 @@ +import config from "../../config"; +import AnonymousError from "../AnonymousError"; + +export type PlanId = "author_monthly" | "author_annual" | "author_pass" | "conference"; +export const GiB = 1024 ** 3; +export function billingPlans() { + return [ + { id: "author_monthly" as PlanId, name: "Author monthly", priceId: config.STRIPE_AUTHOR_MONTHLY_PRICE, recurring: true, repositories: config.PAID_AUTHOR_REPOSITORIES, storage: config.PAID_AUTHOR_STORAGE, description: "Never-expiring repositories while subscribed, then a 90-day grace period. Renews monthly. Cancel renewal at any time." }, + { id: "author_annual" as PlanId, name: "Author annual", priceId: config.STRIPE_AUTHOR_ANNUAL_PRICE, recurring: true, repositories: config.PAID_AUTHOR_REPOSITORIES, storage: config.PAID_AUTHOR_STORAGE, description: "Never-expiring repositories while subscribed, then a 90-day grace period. Renews annually. Cancel renewal at any time." }, + { id: "author_pass" as PlanId, name: "Author review pass", priceId: config.STRIPE_AUTHOR_PASS_PRICE, recurring: false, repositories: 1, storage: config.PAID_PASS_STORAGE, description: "One repository for 180 days. No automatic renewal." }, + { id: "conference" as PlanId, name: "Conference review package", priceId: config.STRIPE_CONFERENCE_PRICE, recurring: false, repositories: config.PAID_CONFERENCE_REPOSITORIES, storage: config.PAID_CONFERENCE_STORAGE, description: "A review window of up to 180 days. No automatic renewal." }, + ]; +} +export function billingError(code: string, status = 400) { return new AnonymousError(code, { httpStatus: status }); } +export function billingOrigin() { + const url = new URL(config.BILLING_ORIGIN); + if (url.username || url.password || url.pathname !== "/" || url.search || url.hash || + (url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1"].includes(url.hostname)))) throw new Error("Invalid BILLING_ORIGIN"); + return url.origin; +} +export function requireBilling() { + if (!config.BILLING_ENABLED || !config.STRIPE_SECRET_KEY || !config.STRIPE_WEBHOOK_SECRET) throw billingError("billing_unavailable", 503); + billingOrigin(); +} diff --git a/src/core/billing/drafts.ts b/src/core/billing/drafts.ts new file mode 100644 index 0000000..de24341 --- /dev/null +++ b/src/core/billing/drafts.ts @@ -0,0 +1,23 @@ +import { randomUUID } from "crypto"; +import { BillingDraft } from "./models"; +import { billingError } from "./config"; + +const fields = ["sourceUrl", "terms", "repoId", "source", "options", "conference", "githubConnection"]; +export function validDraftPath(path: unknown): path is string { + return typeof path === "string" && /^\/anonymize(?:\/[A-Za-z0-9_-]{1,200})?$/.test(path); +} +export async function saveBillingDraft(owner: string, path: unknown, values: unknown) { + if (!validDraftPath(path) || !values || typeof values !== "object" || Array.isArray(values) || + Buffer.byteLength(JSON.stringify(values)) > 64 * 1024) throw billingError("billing_invalid_draft"); + const selected = Object.fromEntries(fields.filter(key => Object.prototype.hasOwnProperty.call(values, key)) + .map(key => [key, (values as Record)[key]])); + // A draft is private user input, never an authorization or an entitlement. + return BillingDraft.create({ _id: randomUUID(), owner, path, values: selected, + expiresAt: new Date(Date.now() + 7 * 86400_000) }); +} +export async function getBillingDraft(owner: string, id: unknown) { + if (typeof id !== "string" || !/^[a-f0-9-]{36}$/.test(id)) throw billingError("billing_draft_not_found", 404); + const draft = await BillingDraft.findOne({ _id: id, owner, expiresAt: { $gt: new Date() } }).lean(); + if (!draft) throw billingError("billing_draft_not_found", 404); + return draft; +} diff --git a/src/core/billing/events.ts b/src/core/billing/events.ts new file mode 100644 index 0000000..027971c --- /dev/null +++ b/src/core/billing/events.ts @@ -0,0 +1,55 @@ +import Stripe = require("stripe"); +import config from "../../config"; +import { randomUUID } from "crypto"; +import { BillingEvent, BillingAccount } from "./models"; +import { processBillingEvent } from "./stripe"; +import { createLogger } from "../logger"; + +const logger = createLogger("billing"); +export function billingFailure(error: unknown) { + const e = error as { type?: string; code?: string; requestId?: string }; + // Do not persist provider messages, request bodies, email addresses or keys. + return [e?.type, e?.code, e?.requestId].filter(v => typeof v === "string" && /^[a-zA-Z0-9_]+$/.test(v)).join(":") || "billing_processing_failed"; +} +export async function receiveBillingEvent(event: Stripe.Event) { + const value = event.data.object as unknown as Record; + // Retain only routing references, never the full Stripe customer/payment payload. + const parent = value.parent as { subscription_details?: { subscription?: unknown } } | undefined; + const ref = (v: unknown) => typeof v === "string" ? v : (v as { id?: string } | null)?.id; + const object = { id: value.id, parent: { subscription_details: { subscription: ref(parent?.subscription_details?.subscription) } }, payment_intent: ref(value.payment_intent), + charge: ref(value.charge), amount: value.amount, amount_refunded: value.amount_refunded, refunded: value.refunded, disputed: value.disputed }; + const id = `${event.livemode ? "live" : "test"}:${event.account || "platform"}:${event.id}`; + await BillingEvent.updateOne({ _id: id }, { $setOnInsert: { eventId: event.id, type: event.type, object } }, { upsert: true }); +} +export async function processBillingInbox(limit = 25, processEvent = processBillingEvent, now = new Date()) { + for (let i = 0; i < limit; i++) { + const token = randomUUID(); + const namespace = /^(sk|rk)_live_/.test(config.STRIPE_SECRET_KEY) ? /^live:platform:/ : /^test:platform:/; + const event = await BillingEvent.findOneAndUpdate({ _id: namespace, $or: [ + { state: "pending", nextAttemptAt: { $lte: now } }, + { state: "processing", leaseUntil: { $lte: now } }, + ] }, { $set: { state: "processing", token, leaseUntil: new Date(now.getTime() + 300_000) }, $inc: { attempts: 1 } }, + { new: true, sort: { receivedAt: 1 } }); + if (!event) break; + try { + await processEvent({ id: event.eventId, type: event.type, data: { object: event.object } } as Stripe.Event); + await BillingEvent.updateOne({ _id: event._id, token }, { $set: { state: "complete", completedAt: new Date() }, $unset: { token: 1, leaseUntil: 1, lastError: 1 } }); + } catch (error) { + const dead = event.attempts >= 12; + const lastError = billingFailure(error); + await BillingEvent.updateOne({ _id: event._id, token }, { $set: { state: dead ? "failed" : "pending", lastError, + nextAttemptAt: new Date(now.getTime() + Math.min(3600_000, 1000 * 2 ** event.attempts)) }, $unset: { token: 1, leaseUntil: 1 } }); + logger.error(dead ? "billing event requires replay" : "billing event retry scheduled", { eventId: event.eventId, type: event.type, attempts: event.attempts, code: lastError }); + } + } +} +export async function billingHealth() { + const [pending, failed, oldest, unresolved, reconciliationFailed] = await Promise.all([ + BillingEvent.countDocuments({ state: { $in: ["pending", "processing"] } }), + BillingEvent.countDocuments({ state: "failed" }), + BillingEvent.findOne({ state: { $in: ["pending", "processing"] } }).sort({ receivedAt: 1 }).select("receivedAt").lean(), + BillingAccount.countDocuments({ "checkout.key": { $exists: true }, "checkout.id": { $exists: false } }), + BillingAccount.countDocuments({ reconcileError: { $exists: true } }), + ]); + return { pending, failed, oldestPendingSeconds: oldest?.receivedAt ? Math.floor((Date.now() - oldest.receivedAt.getTime()) / 1000) : 0, unresolved, reconciliationFailed }; +} diff --git a/src/core/billing/expiration.ts b/src/core/billing/expiration.ts new file mode 100644 index 0000000..ab0ba33 --- /dev/null +++ b/src/core/billing/expiration.ts @@ -0,0 +1,78 @@ +import { reconcileBillingAccount } from "./reconciliation"; +import { createLogger } from "../logger"; +import config from "../../config"; +import { BillingGrant } from "./models"; +import { billingError } from "./config"; +import { usableGrant } from "./quotas"; +import Repo from "../model/anonymizedRepositories/anonymizedRepositories.model"; + +export const NEVER_EXPIRATION_GRACE_MS = 90 * 86400000; +async function authorGrants(owner: string) { + return BillingGrant.find({ scope: `user:${owner}`, planId: { $in: ["author_monthly", "author_annual"] } }).lean(); +} + +// This is an author benefit, independent of which scope pays the storage quota. +export async function neverExpirationDeadline(owner: string, existing?: Date) { + if (!config.BILLING_ENABLED) return undefined; + const grants = await authorGrants(owner); + const active = grants.filter(g => usableGrant(g)); + if (!active.length) { + if (existing && existing > new Date()) return existing; + throw billingError("subscription_required_for_never_expiration", 402); + } + return new Date(Math.max(existing?.getTime() || 0, ...active.map(g => g.until!.getTime() + NEVER_EXPIRATION_GRACE_MS))); +} + +// Run before ordinary expiration maintenance. Legacy never-expiring links have +// no billing deadline and are deliberately excluded. +export async function reconcileNeverExpiration(now = new Date(), reconcile = reconcileBillingAccount) { + if (!config.BILLING_ENABLED) return; + const cursor = Repo.find({ "options.expirationMode": "never", billingNeverExpiresUntil: { $exists: true }, + status: { $nin: ["removed", "expired", "expiring", "removing"] } }).select("owner billingNeverExpiresUntil").cursor(); + const deadlines = new Map(); + const verified = new Set(); + const deferred = new Set(); + for await (const repo of cursor) { + const owner = String(repo.owner); + if (!deadlines.has(owner)) { + const grants = await authorGrants(owner); + deadlines.set(owner, Math.max(0, ...grants.filter(g => !g.revoked && g.until) + .map(g => g.until!.getTime() + NEVER_EXPIRATION_GRACE_MS))); + } + const previous = repo.billingNeverExpiresUntil!; + let deadline = new Date(Math.max(previous.getTime(), deadlines.get(owner)!)); + if (deadline <= now) { + if (deferred.has(owner)) continue; + try { + if (!verified.has(owner)) { + await reconcile(owner); + verified.add(owner); + const fresh = await authorGrants(owner); + deadlines.set(owner, Math.max(0, ...fresh.filter(g => !g.revoked && g.until).map(g => g.until!.getTime() + NEVER_EXPIRATION_GRACE_MS))); + } + deadline = new Date(Math.max(previous.getTime(), deadlines.get(owner)!)); + } catch { + deferred.add(owner); + createLogger("billing").error("repository expiration deferred: billing verification failed", { owner }); + continue; + } + } + const filter = { _id: repo._id, "options.expirationMode": "never", billingNeverExpiresUntil: previous }; + if (deadline <= now) { + await Repo.updateOne(filter, { $set: { "options.expirationMode": "remove", "options.expirationDate": deadline }, + $unset: { billingNeverExpiresUntil: 1 } }); + } else if (deadline > previous) { + await Repo.updateOne(filter, { $set: { billingNeverExpiresUntil: deadline } }); + } + } +} + +export function validateBillingExpiration(options: { expirationMode?: string; expirationDate?: string | Date }) { + if (!config.BILLING_ENABLED || options.expirationMode === "never") return; + const date = options.expirationDate && new Date(options.expirationDate); + const maximum = new Date(); + maximum.setFullYear(maximum.getFullYear() + 1); + maximum.setHours(23, 59, 59, 999); + if (!["remove", "redirect"].includes(options.expirationMode || "") || !date || + !Number.isFinite(date.getTime()) || date > maximum) throw billingError("invalid_billing_expiration"); +} diff --git a/src/core/billing/maintenance.ts b/src/core/billing/maintenance.ts new file mode 100644 index 0000000..86f5448 --- /dev/null +++ b/src/core/billing/maintenance.ts @@ -0,0 +1,36 @@ +import * as schedule from "node-schedule"; +import config from "../../config"; +import { BillingEvent, BillingAccount } from "./models"; +import { processBillingInbox, billingHealth, billingFailure } from "./events"; +import { reconcileBillingAccounts } from "./reconciliation"; +import { createLogger } from "../logger"; +const logger = createLogger("billing"); +export async function startBillingMaintenance() { + if (!config.BILLING_ENABLED) return; + await Promise.all([BillingEvent.createIndexes(), BillingAccount.createIndexes()]); + let eventsRunning = false; + let reconcileRunning = false; + const events = async () => { + if (eventsRunning) return; + eventsRunning = true; + try { await processBillingInbox(); } + catch (error) { logger.error("billing worker failed", { code: billingFailure(error) }); } + finally { eventsRunning = false; } + }; + const reconcile = async () => { + if (reconcileRunning) return; + reconcileRunning = true; + try { + await reconcileBillingAccounts(); + const health = await billingHealth(); + if (health.failed || health.oldestPendingSeconds > 300 || health.unresolved || health.reconciliationFailed) logger.error("billing requires attention", health); + // Remove routing envelopes after 90 days; retain failures for investigation. + await BillingEvent.deleteMany({ state: "complete", completedAt: { $lt: new Date(Date.now() - 90 * 86400_000) } }); + } catch (error) { logger.error("billing maintenance failed", { code: billingFailure(error) }); } + finally { reconcileRunning = false; } + }; + schedule.scheduleJob("*/10 * * * * *", events); + schedule.scheduleJob("*/5 * * * *", reconcile); + void events(); + void reconcile(); +} diff --git a/src/core/billing/models.ts b/src/core/billing/models.ts new file mode 100644 index 0000000..05b8b6b --- /dev/null +++ b/src/core/billing/models.ts @@ -0,0 +1,46 @@ +import { Schema, model } from "mongoose"; + +// Billing records are separate from public user/repository serialization. +export const BillingAccount = model("billingAccount", new Schema({ + _id: String, customerId: String, + customerAttemptAt: Date, + reconciledAt: Date, reconcileAfter: { type: Date, default: () => new Date(0), index: true }, reconcileError: String, + checkout: { id: String, key: String, planId: String, target: String, expiresAt: Date, createdAt: Date, params: Schema.Types.Mixed }, +})); +export const BillingGrant = model("billingGrant", new Schema({ + _id: String, owner: { type: String, index: true }, scope: { type: String, index: true }, + planId: String, customerId: String, subscriptionId: String, paymentIntentId: { type: String, index: true }, + status: String, until: Date, cancelAtPeriodEnd: Boolean, + revision: { type: Number, default: 0 }, revoked: { type: Boolean, default: false }, + revocationReason: String, revokedAt: Date, +})); +export const BillingQuota = model("billingQuota", new Schema({ + _id: String, + allocations: [{ _id: false, repoId: String, bytes: Number, createdAt: Date }], +})); +// A short lease serializes Stripe checkout creation across API instances. +export const BillingLock = model("billingLock", new Schema({ _id: String, token: String, until: Date })); + +const eventSchema = new Schema({ + _id: String, eventId: String, type: String, object: Schema.Types.Mixed, + state: { type: String, default: "pending" }, attempts: { type: Number, default: 0 }, + receivedAt: { type: Date, default: Date.now }, nextAttemptAt: { type: Date, default: Date.now }, + leaseUntil: Date, token: String, completedAt: Date, lastError: String, +}); +eventSchema.index({ state: 1, nextAttemptAt: 1, leaseUntil: 1 }); +export const BillingEvent = model("billingEvent", eventSchema); +export const BillingAudit = model("billingAudit", new Schema({ + action: String, target: String, actor: String, reason: String, at: { type: Date, default: Date.now }, +})); + +// A reversal can arrive before its grant exists. Keep the payment-level decision. +export const BillingRevocation = model("billingRevocation", new Schema({ + _id: String, subscriptionId: String, reason: String, reviewed: { type: Boolean, default: false }, + createdAt: { type: Date, default: Date.now }, +})); + +// Short-lived, private task context. Explicit expiry checks also cover TTL sweep delays. +export const BillingDraft = model("billingDraft", new Schema({ + _id: String, owner: { type: String, required: true, index: true }, path: String, values: Schema.Types.Mixed, + expiresAt: { type: Date, required: true, expires: 0 }, +})); diff --git a/src/core/billing/quotas.ts b/src/core/billing/quotas.ts new file mode 100644 index 0000000..b648822 --- /dev/null +++ b/src/core/billing/quotas.ts @@ -0,0 +1,58 @@ +import ConferenceModel from "../model/conference/conferences.model"; +import config from "../../config"; +import { BillingGrant, BillingQuota } from "./models"; +import { billingError, billingPlans } from "./config"; +import RepositoryModel from "../model/anonymizedRepositories/anonymizedRepositories.model"; + +export function usableGrant(grant: { status?: string | null; until?: Date | null; revoked?: boolean | null }, now = new Date()) { + return !grant.revoked && !!grant.until && grant.until > now && ["active", "paid", "past_due"].includes(grant.status || ""); +} +export async function allowance(owner: string, repoId?: string, conference?: string) { + const scopes = [`user:${owner}`, ...(repoId ? [`repo:${repoId}`] : []), ...(conference ? [`conference:${conference}`] : [])]; + const grants = await BillingGrant.find({ scope: { $in: scopes }, until: { $gt: new Date() }, revoked: false }).lean(); + // A conference pays before the author. There is no double charging of allowance. + for (const scope of scopes.reverse()) { + const grant = grants.find(g => g.scope === scope && usableGrant(g)); + const plan = grant && billingPlans().find(p => p.id === grant.planId); + if (plan) return { scope, repositories: plan.repositories, storage: plan.storage, plan: plan.id }; + } + return { scope: `user:${owner}`, repositories: config.FREE_AUTHOR_REPOSITORIES, storage: config.FREE_AUTHOR_STORAGE, plan: "free" }; +} +export function allocationExpression(repoId: string) { + return { $filter: { input: "$allocations", as: "allocation", cond: { $ne: ["$$allocation.repoId", { $literal: repoId }] } } }; +} +export async function reserveRepository(owner: string, repoId: string, bytes: number, conference?: string) { + if (!config.BILLING_ENABLED) return; + if (!Number.isSafeInteger(bytes) || bytes < 0) throw billingError("billing_invalid_repository_size"); + const limits = await allowance(owner, repoId, conference); + // Seed existing repositories once. Legacy review links are preserved, but they + // count toward the owner's capacity when creating new work. + if (!await BillingQuota.exists({ _id: limits.scope })) { + const existing = await RepositoryModel.find(limits.scope.startsWith("user:") ? { owner, status: { $nin: ["removed", "expired"] } } + : limits.scope.startsWith("conference:") ? { conference, status: { $nin: ["removed", "expired"] } } : { repoId, status: { $nin: ["removed", "expired"] } }) + .select("repoId size").lean(); + try { await BillingQuota.create({ _id: limits.scope, allocations: existing.map(r => ({ repoId: r.repoId, bytes: r.size?.storage || 0, createdAt: new Date() })) }); } + catch (error) { if ((error as { code?: number }).code !== 11000) throw error; } + } + // Only confirmed terminal repositories release capacity. Unknown reservations + // remain until reconciled by an operator, so a crash cannot oversell capacity. + const ledger = await BillingQuota.findById(limits.scope).lean(); + const terminal = await RepositoryModel.find({ repoId: { $in: ledger?.allocations.map(a => a.repoId) || [] }, status: "removed" }).select("repoId").lean(); + if (terminal.length) await BillingQuota.updateOne({ _id: limits.scope }, { $pull: { allocations: { repoId: { $in: terminal.map(r => r.repoId) } } } }); + const others = allocationExpression(repoId); + // Never shrink a reservation during refresh. Concurrent generations and + // failed builds cannot free bytes still needed by the published generation. + const reservedBytes = { $max: [bytes, { $sum: { $map: { input: { $filter: { input: "$allocations", as: "a", cond: { $eq: ["$$a.repoId", { $literal: repoId }] } } }, as: "a", in: "$$a.bytes" } } }] }; + const result = await BillingQuota.updateOne({ _id: limits.scope, $expr: { $and: [ + { $lt: [{ $size: others }, limits.repositories] }, + { $lte: [{ $add: [{ $sum: { $map: { input: others, as: "a", in: "$$a.bytes" } } }, reservedBytes] }, limits.storage] }, + ] } }, [{ $set: { allocations: { $concatArrays: [others, [{ repoId: { $literal: repoId }, bytes: reservedBytes, createdAt: new Date() }]] } } }]); + if (!result.matchedCount) throw billingError("quota_exceeded", 402); +} + +export async function assertConferenceAdmission(owner: string, repoId: string, conference?: string) { + if (!conference || !config.BILLING_ENABLED) return; + const conf = await ConferenceModel.findOne({ conferenceID: conference }).lean(); + if (!conf || conf.status !== "ready" || conf.startDate > new Date() || conf.endDate <= new Date()) throw billingError("conf_not_activated"); + if (conf.plan.planID === "conference" && (await allowance(owner, repoId, conference)).scope !== `conference:${conference}`) throw billingError("conference_payment_required", 402); +} diff --git a/src/core/billing/reconciliation.ts b/src/core/billing/reconciliation.ts new file mode 100644 index 0000000..b5d5288 --- /dev/null +++ b/src/core/billing/reconciliation.ts @@ -0,0 +1,59 @@ +import { BillingAccount } from "./models"; +import Stripe = require("stripe"); +import { fulfillCheckout, syncSubscription, stripeClient, processBillingEvent, withBillingLock } from "./stripe"; +import { billingFailure } from "./events"; +import { createLogger } from "../logger"; +const logger = createLogger("billing"); + +// Paginate provider history so a missing local grant is discoverable after restore +// or lost delivery. Only paid customer accounts are scanned, once per day. +export async function reconcileBillingAccount(owner: string, stripe = stripeClient()) { + return withBillingLock(`reconcile:${owner}`, async () => { + const account = await BillingAccount.findById(owner); + if (!account?.customerId) throw new Error("billing_customer_missing"); + for await (const sub of stripe.subscriptions.list({ customer: account.customerId, status: "all", limit: 100 })) { + await syncSubscription(sub.id, stripe); + } + for await (const session of stripe.checkout.sessions.list({ customer: account.customerId, limit: 100 })) { + if (session.metadata?.application !== "anonymous-github" || session.metadata.owner !== owner) continue; + if (account.checkout?.key && !account.checkout.id && session.metadata.attempt === account.checkout.key) { + await BillingAccount.updateOne({ _id: owner, "checkout.key": account.checkout.key }, { $set: { "checkout.id": session.id } }); + } + if (session.status === "complete") await fulfillCheckout(session.id, stripe); + } + // Refunds on older invoices must also survive lost webhook deliveries. + for await (const charge of stripe.charges.list({ customer: account.customerId, limit: 100 })) { + if (charge.refunded || charge.disputed) await processBillingEvent({ type: "charge.refunded", data: { object: { ...charge, refunded: true } } } as Stripe.Event, stripe); + } + await BillingAccount.updateOne({ _id: owner }, { $set: { reconciledAt: new Date(), reconcileAfter: new Date(Date.now() + 86400_000) }, $unset: { reconcileError: 1 } }); + }); +} +export async function reconcileBillingAccounts(limit = 10) { + const accounts = await BillingAccount.find({ customerId: { $exists: true }, $or: [ + { reconcileAfter: { $lte: new Date() } }, { reconcileAfter: { $exists: false } }, + ] }).sort({ reconcileAfter: 1 }).limit(limit).lean(); + for (const account of accounts) { + try { await reconcileBillingAccount(account._id!); } + catch (error) { + const code = billingFailure(error); + await BillingAccount.updateOne({ _id: account._id }, { $set: { reconcileAfter: new Date(Date.now() + 900_000), reconcileError: code } }); + logger.error("billing reconciliation deferred", { owner: account._id, code }); + } + } +} + +export async function discoverBillingCustomers(stripe = stripeClient()) { + const Users = (await import("../model/users/users.model")).default; + for await (const customer of stripe.customers.list({ limit: 100 })) { + const owner = customer.metadata.owner; + if (customer.metadata.application !== "anonymous-github" || !owner || !/^[a-f0-9]{24}$/i.test(owner)) continue; + if (!await Users.exists({ _id: owner })) continue; + const current = await BillingAccount.findById(owner); + if (current?.customerId && current.customerId !== customer.id) { + logger.error("duplicate Stripe customer requires review", { owner }); + continue; + } + await BillingAccount.updateOne({ _id: owner, $or: [{ customerId: { $exists: false } }, { customerId: customer.id }] }, + { $set: { customerId: customer.id, reconcileAfter: new Date(0) } }, { upsert: true }); + } +} diff --git a/src/core/billing/stripe.ts b/src/core/billing/stripe.ts new file mode 100644 index 0000000..1bee291 --- /dev/null +++ b/src/core/billing/stripe.ts @@ -0,0 +1,251 @@ +import Stripe = require("stripe"); +import { randomUUID } from "crypto"; +import config from "../../config"; +import { BillingAccount, BillingGrant, BillingLock, BillingRevocation } from "./models"; +import { billingError, billingOrigin, billingPlans, requireBilling } from "./config"; +import ConferenceModel from "../model/conference/conferences.model"; +import RepositoryModel from "../model/anonymizedRepositories/anonymizedRepositories.model"; + +export function stripeClient() { requireBilling(); return new Stripe(config.STRIPE_SECRET_KEY, { maxNetworkRetries: 2, timeout: 10_000 }); } +const objectId = (value: string | { id: string } | null) => typeof value === "string" ? value : value?.id; +export async function withBillingLock(id: string, work: () => Promise): Promise { + const token = randomUUID(); + try { await BillingLock.updateOne({ _id: id, until: { $lt: new Date() } }, { $set: { token, until: new Date(Date.now() + 180_000) } }, { upsert: true }); } + catch (error) { if ((error as { code?: number }).code === 11000) throw billingError("billing_busy", 409); throw error; } + const heartbeat = setInterval(() => { + BillingLock.updateOne({ _id: id, token }, { $set: { until: new Date(Date.now() + 180_000) } }).catch(() => undefined); + }, 30_000); + heartbeat.unref(); + try { return await work(); } + finally { clearInterval(heartbeat); await BillingLock.deleteOne({ _id: id, token }); } +} +export async function syncSubscription(id: string, stripe = stripeClient()) { + // Compare-and-swap prevents a slow, earlier fetch from overwriting a newer one. + for (let retry = 0; retry < 4; retry++) { + const previous = await BillingGrant.findById(id).lean(); + const sub = await stripe.subscriptions.retrieve(id, { expand: ["latest_invoice"] }); + const owner = sub.metadata.owner; + if (!owner || sub.metadata.application !== "anonymous-github") return; + const account = await BillingAccount.findById(owner).lean(); + if (!account || account.customerId !== objectId(sub.customer)) throw billingError("billing_customer_mismatch"); + const priceId = sub.items.data[0]?.price.id; + const plan = billingPlans().find(p => p.recurring && p.priceId === priceId); + const invoice = sub.latest_invoice as Stripe.Invoice | null; + const paid = !!plan && sub.items.data.length === 1 && sub.status === "active" && invoice?.status === "paid"; + const periodEnd = sub.items.data[0]?.current_period_end; + let paidThrough = paid && periodEnd ? new Date(periodEnd * 1000) : previous?.until || new Date(0); + // A missed paid renewal followed by a failed invoice must be recoverable. + // Only matching subscription-item service periods count, not arbitrary invoices. + if (!paid && plan && sub.items.data.length === 1 && stripe.invoices?.list) { + for await (const historical of stripe.invoices.list({ subscription: id, status: "paid", limit: 100 })) { + for await (const line of stripe.invoices.listLineItems(historical.id, { limit: 100 })) { + if (!line.parent?.subscription_item_details?.proration && line.amount >= 0 && + line.parent?.subscription_item_details?.subscription_item === sub.items.data[0].id && + line.period.end * 1000 > paidThrough.getTime()) paidThrough = new Date(line.period.end * 1000); + } + } + } + const values = { owner, scope: `user:${owner}`, planId: plan?.id || "unknown", customerId: account.customerId, + subscriptionId: id, status: sub.status, cancelAtPeriodEnd: sub.cancel_at_period_end || !!sub.cancel_at, + until: paidThrough, + }; + if (!previous) { + try { await BillingGrant.create({ _id: id, ...values }); return; } + catch (error) { if ((error as { code?: number }).code !== 11000) throw error; } + } else { + const result = await BillingGrant.updateOne({ _id: id, revision: previous.revision }, { $set: values, $inc: { revision: 1 } }); + if (result.matchedCount) return; + } + } + throw billingError("billing_busy", 409); +} +export async function fulfillCheckout(id: string, stripe = stripeClient()) { + const session = await stripe.checkout.sessions.retrieve(id, { expand: ["line_items", "payment_intent.latest_charge"] }); + if (session.metadata?.application !== "anonymous-github") return; + const { owner, planId, target } = session.metadata; + const account = await BillingAccount.findById(owner).lean(); + if (!account || account.customerId !== objectId(session.customer)) throw billingError("billing_customer_mismatch"); + if (session.status !== "complete") return; + if (session.subscription) { await syncSubscription(objectId(session.subscription)!, stripe); return; } + const plan = billingPlans().find(p => p.id === planId && !p.recurring); + if (!plan || session.line_items?.data.length !== 1 || session.line_items.data[0].price?.id !== plan.priceId || session.line_items.data[0].quantity !== 1) throw billingError("billing_invalid_purchase"); + if (session.payment_status !== "paid" || session.status !== "complete") return; + const intent = session.payment_intent as Stripe.PaymentIntent | null; + const charge = intent?.latest_charge as Stripe.Charge | null; + const revoked = !!charge && (charge.refunded || charge.disputed); + const scope = plan.id === "conference" ? `conference:${target}` : `repo:${target}`; + let until = new Date(session.created * 1000 + 180 * 86400_000); + if (plan.id === "conference") { + const conference = await ConferenceModel.findOne({ conferenceID: target }); + // Historical sessions can outlive a deliberately deleted conference. + if (!conference) return; + until = conference.endDate; + } + await BillingGrant.updateOne({ _id: id }, { $setOnInsert: { owner, scope, planId, customerId: account.customerId, + paymentIntentId: objectId(session.payment_intent), status: "paid", until }, ...(revoked ? { $set: { revoked: true } } : {}) }, { upsert: true }); + const reversal = intent && await BillingRevocation.findById(intent.id).lean(); + if (reversal?.reviewed) await BillingGrant.updateOne({ _id: id }, { $set: { revoked: false } }); + else if (reversal) await BillingGrant.updateOne({ _id: id }, { $set: { revoked: true, revocationReason: reversal.reason } }); + if (plan.id === "conference" && (!revoked || reversal?.reviewed)) { + const grant = await BillingGrant.findById(id).lean(); + if (!grant?.revoked) await ConferenceModel.updateOne({ conferenceID: target, status: "pending_payment", "plan.planID": "conference" }, { $set: { status: "ready" } }); + } +} +export async function processBillingEvent(event: Stripe.Event, stripe = stripeClient()) { + if (event.type === "checkout.session.completed" || event.type === "checkout.session.async_payment_succeeded") { + await fulfillCheckout(event.data.object.id, stripe); + } else if (event.type.startsWith("customer.subscription.")) { + await syncSubscription((event.data.object as Stripe.Subscription).id, stripe); + } else if (event.type === "invoice.paid" || event.type === "invoice.payment_failed") { + const invoice = event.data.object as Stripe.Invoice; + const id = objectId(invoice.parent?.subscription_details?.subscription || null); + if (id) await syncSubscription(id, stripe); + } else if (event.type === "charge.refunded" || event.type === "charge.dispute.created") { + const charge = event.type === "charge.refunded" ? event.data.object as Stripe.Charge + : await stripe.charges.retrieve(objectId((event.data.object as Stripe.Dispute).charge)!); + // Partial goodwill refunds preserve access. Full refunds and disputes revoke. + if (event.type === "charge.refunded" && charge.refunded === false) return; + const intent = objectId(charge.payment_intent); + if (!intent) return; + const reason = event.type === "charge.dispute.created" || charge.disputed ? "dispute" : "full_refund"; + await BillingRevocation.updateOne({ _id: intent }, { $setOnInsert: { reason } }, { upsert: true }); + // A dispute escalates a reviewed refund. An older refund replay must not + // undo the operator's review of that dispute. + if (reason === "dispute") await BillingRevocation.updateOne({ _id: intent, reason: "full_refund" }, { $set: { reason, reviewed: false } }); + const reversal = await BillingRevocation.findById(intent).lean(); + if (reversal?.reviewed) return; + const revocation = { revoked: true, revocationReason: reason, revokedAt: new Date() }; + await BillingGrant.updateMany({ paymentIntentId: intent }, { $set: revocation, $inc: { revision: 1 } }); + // Resolve the affected subscription, not every subscription owned by this payer. + let after: string | undefined; + do { + const payments = await stripe.invoicePayments.list({ payment: { type: "payment_intent", payment_intent: intent }, limit: 100, ...(after ? { starting_after: after } : {}) }); + for (const payment of payments.data) { + const invoice = await stripe.invoices.retrieve(objectId(payment.invoice)!); + const subscriptionId = objectId(invoice.parent?.subscription_details?.subscription || null); + if (subscriptionId) { + await BillingRevocation.updateOne({ _id: intent }, { $set: { subscriptionId } }); + await BillingGrant.updateOne({ _id: subscriptionId }, { $set: revocation, $inc: { revision: 1 } }, { upsert: true }); + } + } + after = payments.has_more ? payments.data.at(-1)?.id : undefined; + } while (after); + } +} +export async function createCheckout(owner: string, planId: string, target = "", stripe = stripeClient(), returnPath?: string) { + if (!config.BILLING_CHECKOUT_ENABLED) throw billingError("billing_checkout_disabled", 503); + const plan = billingPlans().find(p => p.id === planId && p.priceId); + if (!plan) throw billingError("billing_plan_unavailable"); + if (plan.id === "conference") { + const conf = await ConferenceModel.findOne({ conferenceID: target, owners: owner }); + if (!conf || conf.plan.planID !== "conference" || conf.status !== "pending_payment") throw billingError("billing_invalid_conference"); + if (conf.endDate <= new Date() || conf.endDate.getTime() - conf.startDate.getTime() > 180 * 86400_000) throw billingError("billing_invalid_review_window"); + } else if (plan.id === "author_pass") { + const repo = await RepositoryModel.exists({ repoId: target, owner, status: { $nin: ["removed", "expired"] } }); + if (!repo) throw billingError("repo_not_found", 404); + } else target = ""; + const destination = returnPath || (plan.id === "conference" ? `/conference/${encodeURIComponent(target)}` : "/profile"); + if (returnPath && !/^\/anonymize(?:\/[A-Za-z0-9_-]{1,200})?\?billingDraft=[a-f0-9-]{36}$/.test(returnPath)) throw billingError("billing_invalid_draft"); + const outcomeUrl = (outcome: string) => `${billingOrigin()}${destination}${destination.includes("?") ? "&" : "?"}billing=${outcome}`; + return withBillingLock(`checkout:${owner}`, async () => { + let account = await BillingAccount.findById(owner); + if (!account) account = await BillingAccount.create({ _id: owner }); + if (!account.customerId) { + if (account.customerAttemptAt && Date.now() - account.customerAttemptAt.getTime() >= 23 * 3600_000) { + // A customer creation timeout must not cause a duplicate after key pruning. + throw billingError("billing_recovery_required", 409); + } + account.customerAttemptAt ||= new Date(); + await account.save(); + const customer = await stripe.customers.create({ metadata: { application: "anonymous-github", owner } }, { idempotencyKey: `customer:${owner}` }); + account.customerId = customer.id; + await account.save(); + } + if (account.checkout?.key && !account.checkout.id && + (!account.checkout.createdAt || Date.now() - account.checkout.createdAt.getTime() >= 23 * 3600_000)) { + for await (const candidate of stripe.checkout.sessions.list({ customer: account.customerId, limit: 100 })) { + if (candidate.metadata?.attempt === account.checkout.key && candidate.metadata.owner === owner) { + account.checkout.id = candidate.id; + await account.save(); + break; + } + } + if (!account.checkout.id) { + // After the provider key window, an expired immutable request can no + // longer create a session. Legacy attempts without expiry need review. + if (account.checkout.params?.expires_at && account.checkout.createdAt && + Date.now() - account.checkout.createdAt.getTime() > 24 * 3600_000 && + account.checkout.params.expires_at * 1000 < Date.now()) { + account.checkout = undefined; + await account.save(); + } else throw billingError("billing_recovery_required", 409); + } + } + if (account.checkout?.params?.success_url && !account.checkout.id && account.checkout.params.success_url !== outcomeUrl("success")) throw billingError("billing_checkout_in_progress", 409); + if (account.checkout?.id) { + const existing = await stripe.checkout.sessions.retrieve(account.checkout.id); + if (existing.status === "open") { + if (account.checkout.planId !== planId || account.checkout.target !== target) throw billingError("billing_checkout_in_progress", 409); + if (account.checkout.params?.success_url && account.checkout.params.success_url !== outcomeUrl("success")) throw billingError("billing_checkout_in_progress", 409); + return existing.url; + } + if (existing.status === "complete") await fulfillCheckout(existing.id, stripe); + } + const price = await stripe.prices.retrieve(plan.priceId); + const interval = plan.id === "author_monthly" ? "month" : "year"; + if (!price.active || price.currency !== "eur" || price.unit_amount == null || price.unit_amount <= 0 || + (plan.recurring ? price.recurring?.interval !== interval || price.recurring?.interval_count !== 1 : !!price.recurring)) throw billingError("billing_price_misconfigured", 503); + if (plan.recurring) { + let after: string | undefined; + do { + const subscriptions = await stripe.subscriptions.list({ customer: account.customerId, status: "all", limit: 100, ...(after ? { starting_after: after } : {}) }); + if (subscriptions.data.some(s => !["canceled", "incomplete_expired"].includes(s.status))) throw billingError("billing_subscription_exists", 409); + after = subscriptions.has_more ? subscriptions.data.at(-1)?.id : undefined; + } while (after); + } else if (await BillingGrant.exists({ scope: `${plan.id === "conference" ? "conference" : "repo"}:${target}`, revoked: false, until: { $gt: new Date() } })) throw billingError("billing_already_paid", 409); + // Persist the idempotency key before sending a request. A timeout can safely retry it. + if (!account.checkout?.key || account.checkout.id) { + account.checkout = { key: randomUUID(), planId, target, createdAt: new Date(), expiresAt: new Date(Date.now() + 1860_000) }; + await account.save(); + } + if (account.checkout.planId !== planId || account.checkout.target !== target) throw billingError("billing_checkout_in_progress", 409); + const metadata = { application: "anonymous-github", owner, planId, target, attempt: account.checkout.key! }; + const params: Stripe.Checkout.SessionCreateParams = { customer: account.customerId, expires_at: Math.floor(Date.now() / 1000) + 1860, + mode: plan.recurring ? "subscription" : "payment", line_items: [{ price: plan.priceId, quantity: 1 }], + allowed_payment_method_types: ["card"], metadata, + ...(plan.recurring ? { subscription_data: { metadata } } : { payment_intent_data: { metadata }, invoice_creation: { enabled: true } }), + billing_address_collection: "required", tax_id_collection: { enabled: true }, customer_update: { address: "auto", name: "auto" }, + automatic_tax: { enabled: config.BILLING_AUTOMATIC_TAX }, + success_url: outcomeUrl("success"), cancel_url: outcomeUrl("cancelled"), + }; + // Persist the exact parameters: configuration changes cannot alter a retry. + if (!account.checkout.params) { + account.checkout.params = params; + await account.save(); + } + const session = await stripe.checkout.sessions.create(account.checkout.params as Stripe.Checkout.SessionCreateParams, { idempotencyKey: account.checkout.key }); + account.checkout.id = session.id; + await account.save(); + return session.url; + }); +} + +export async function cancelAccountBilling(owner: string) { + const account = await BillingAccount.findById(owner).lean(); + if (!account?.customerId) return; + if (account.checkout?.key && !account.checkout.id) throw billingError("billing_checkout_in_progress", 409); + await withBillingLock(`checkout:${owner}`, async () => { + const account = await BillingAccount.findById(owner).lean(); + if (!account?.customerId) return; + if (account.checkout?.key && !account.checkout.id) throw billingError("billing_checkout_in_progress", 409); + const stripe = stripeClient(); + if (account.checkout?.id) { + const session = await stripe.checkout.sessions.retrieve(account.checkout.id); + if (session.status === "open") await stripe.checkout.sessions.expire(session.id); + } + for await (const subscription of stripe.subscriptions.list({ customer: account.customerId, status: "all", limit: 100 })) { + if (!["canceled", "incomplete_expired"].includes(subscription.status)) await stripe.subscriptions.cancel(subscription.id); + } + await BillingGrant.updateMany({ owner, subscriptionId: { $exists: true } }, { $set: { status: "canceled" }, $inc: { revision: 1 } }); + }); +} diff --git a/src/core/model/anonymizedRepositories/anonymizedRepositories.schema.ts b/src/core/model/anonymizedRepositories/anonymizedRepositories.schema.ts index 77f587f..428a902 100644 --- a/src/core/model/anonymizedRepositories/anonymizedRepositories.schema.ts +++ b/src/core/model/anonymizedRepositories/anonymizedRepositories.schema.ts @@ -2,6 +2,8 @@ import { repositoryAccessSchema } from "../repository-access.schema"; import { Schema } from "mongoose"; const AnonymizedRepositorySchema = new Schema({ + billingManaged: Boolean, + billingNeverExpiresUntil: Date, repoId: { type: String, index: { unique: true, collation: { locale: "en", strength: 2 } }, diff --git a/src/core/model/anonymizedRepositories/anonymizedRepositories.types.ts b/src/core/model/anonymizedRepositories/anonymizedRepositories.types.ts index 5c3cd88..29f2238 100644 --- a/src/core/model/anonymizedRepositories/anonymizedRepositories.types.ts +++ b/src/core/model/anonymizedRepositories/anonymizedRepositories.types.ts @@ -3,6 +3,8 @@ import { Document, Model } from "mongoose"; import { RepositoryStatus } from "../../types"; export interface IAnonymizedRepository { + billingManaged?: boolean; + billingNeverExpiresUntil?: Date; repoId: string; status?: RepositoryStatus; statusMessage?: string; diff --git a/src/core/types.ts b/src/core/types.ts index 562d7a3..b70fff8 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -17,6 +17,6 @@ export enum RepositoryStatus { ERROR = "error", } -export type ConferenceStatus = "ready" | "expired" | "removed"; +export type ConferenceStatus = "ready" | "expired" | "removed" | "pending_payment"; export type SourceStatus = "available" | "unavailable"; diff --git a/src/scripts/billing-operations.ts b/src/scripts/billing-operations.ts new file mode 100644 index 0000000..8142c95 --- /dev/null +++ b/src/scripts/billing-operations.ts @@ -0,0 +1,43 @@ +import "dotenv/config"; +import mongoose from "mongoose"; +import config from "../config"; +import { BillingAccount, BillingEvent, BillingAudit, BillingRevocation, BillingGrant } from "../core/billing/models"; +import { billingHealth, processBillingInbox } from "../core/billing/events"; +import { reconcileBillingAccount, discoverBillingCustomers } from "../core/billing/reconciliation"; + +async function main() { + const [command, target, reason] = process.argv.slice(2); + if (!["health", "inspect", "replay", "reconcile", "discover", "drain", "reinstate"].includes(command)) throw new Error("invalid_command"); + const mutations = ["replay", "reconcile", "discover", "drain", "reinstate"].includes(command); + if (mutations && (!process.env.BILLING_OPERATOR || !reason)) throw new Error("operator_and_reason_required"); + const uri = config.MONGODB_URI || `mongodb://${config.DB_USERNAME}:${config.DB_PASSWORD}@${config.DB_HOSTNAME}:27017/production`; + await mongoose.connect(uri, { autoIndex: false, ...(config.MONGODB_URI ? {} : { authSource: "admin" }) }); + if (mutations) await BillingAudit.create({ action: command, target, reason, actor: process.env.BILLING_OPERATOR }); + if (command === "reinstate") { + const reversal = await BillingRevocation.findById(target); + if (!reversal) throw new Error("payment_reversal_missing"); + reversal.reviewed = true; + await reversal.save(); + if (reversal.subscriptionId && await BillingRevocation.exists({ subscriptionId: reversal.subscriptionId, reviewed: false })) { + console.log("This payment is reviewed; other unresolved reversals still suspend the subscription."); + return; + } + const affected = reversal.subscriptionId ? { _id: reversal.subscriptionId } : { paymentIntentId: target }; + await BillingGrant.updateMany(affected, { $set: { revoked: false }, $unset: { revocationReason: 1, revokedAt: 1 }, $inc: { revision: 1 } }); + console.log("Reinstatement recorded. Reconcile the owner to verify current paid time."); + } + if (command === "health") console.log(JSON.stringify(await billingHealth(), null, 2)); + if (command === "inspect") console.log(JSON.stringify(await BillingAccount.findById(target).select("customerId reconciledAt reconcileError checkout.id checkout.createdAt"), null, 2)); + if (command === "reconcile") await reconcileBillingAccount(target); + if (command === "discover") await discoverBillingCustomers(); + if (command === "drain") await processBillingInbox(100); + if (command === "replay") { + const result = await BillingEvent.updateOne({ _id: target, state: { $in: ["failed", "complete", "pending"] } }, + { $set: { state: "pending", attempts: 0, nextAttemptAt: new Date() }, $unset: { completedAt: 1, lastError: 1 } }); + if (!result.matchedCount) throw new Error("event_not_replayable"); + } +} +main().catch(() => { + console.error("Billing operation failed. Check the command, target, BILLING_OPERATOR, reason, and server configuration. No credentials were logged."); + process.exitCode = 1; +}).finally(() => mongoose.disconnect()); diff --git a/src/server/index.ts b/src/server/index.ts index e23c348..ee8f2c1 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,3 +1,5 @@ +import { startBillingMaintenance } from "../core/billing/maintenance"; +import billing, { billingWebhook } from "./routes/billing"; import { githubAppRouter, githubAppWebhook } from "./routes/github-app"; import { config as dotenv } from "dotenv"; dotenv(); @@ -107,6 +109,7 @@ export default async function start() { startPerformanceMonitoring("api", getAnonymizationPoolStats); app.set("query parser", "extended"); app.use("/github/app/webhook", githubAppWebhook); + app.use("/api/billing/webhook", billingWebhook); app.use(express.json()); // Preserve the empty body used by API validation when no JSON was parsed. app.use((req, _res, next) => { @@ -210,6 +213,7 @@ export default async function start() { const apiRouter = express.Router(); app.use("/api", rate, apiRouter); + apiRouter.use("/billing", billing); apiRouter.use("/admin", router.admin); apiRouter.use("/options", router.option); apiRouter.use("/conferences", router.conference); @@ -300,6 +304,7 @@ export default async function start() { dailyStatsSnapshot(); await connect(); + await startBillingMaintenance(); await startTemporaryStorageMaintenance(); app.listen(config.PORT); logger.info("server started", { port: config.PORT }); diff --git a/src/server/routes/billing.ts b/src/server/routes/billing.ts new file mode 100644 index 0000000..f97407f --- /dev/null +++ b/src/server/routes/billing.ts @@ -0,0 +1,114 @@ +import * as express from "express"; +import { randomBytes } from "crypto"; +import { ensureAuthenticated } from "./connection"; +import { getUser, handleError } from "./route-utils"; +import config from "../../config"; +import { BillingAccount, BillingGrant } from "../../core/billing/models"; +import { billingOrigin, billingPlans, requireBilling } from "../../core/billing/config"; +import { createCheckout, stripeClient, fulfillCheckout, syncSubscription } from "../../core/billing/stripe"; +import { saveBillingDraft, getBillingDraft } from "../../core/billing/drafts"; +import { allowance } from "../../core/billing/quotas"; + +import { receiveBillingEvent, billingFailure } from "../../core/billing/events"; +import { createLogger } from "../../core/logger"; +import { rateLimit } from "express-rate-limit"; + +declare module "express-session" { interface SessionData { billingCSRF?: string } } +export const billingWebhook = express.Router(); +billingWebhook.post("/", express.raw({ type: "application/json", limit: "256kb" }), async (req, res) => { + if (!config.BILLING_ENABLED) { res.sendStatus(404); return; } + let event; + try { event = stripeClient().webhooks.constructEvent(req.body, req.headers["stripe-signature"] as string, config.STRIPE_WEBHOOK_SECRET); } + catch { res.status(400).json({ error: "invalid_billing_signature" }); return; } + if (event.account || (typeof event.livemode === "boolean" && event.livemode !== /^(sk|rk)_live_/.test(config.STRIPE_SECRET_KEY))) { + res.status(400).json({ error: "billing_environment_mismatch" }); return; + } + try { await receiveBillingEvent(event); res.json({ received: true }); } + catch (error) { createLogger("billing").error("billing event storage failed", { eventId: event.id, code: billingFailure(error) }); res.status(500).json({ error: "billing_webhook_failed" }); } +}); +const priceCache = new Map["prices"]["retrieve"]>> }>(); +async function displayedPrice(id: string) { + const cached = priceCache.get(id); + if (cached && cached.expires > Date.now()) return cached.value; + const value = await stripeClient().prices.retrieve(id); + priceCache.set(id, { expires: Date.now() + 60_000, value }); + return value; +} +const router = express.Router(); +router.use(ensureAuthenticated); +router.get("/", async (req, res) => { + try { + const user = await getUser(req); + req.session.billingCSRF ||= randomBytes(32).toString("hex"); + await new Promise((resolve, reject) => req.session.save(error => error ? reject(error) : resolve())); + const account = await BillingAccount.findById(user.id).lean(); + const grants = await BillingGrant.find({ owner: user.id }).select("planId scope status until cancelAtPeriodEnd revoked").lean(); + const plans = config.BILLING_ENABLED ? await Promise.all(billingPlans().filter(p => p.priceId).map(async p => { + const price = await displayedPrice(p.priceId); + return { id: p.id, name: p.name, description: p.description, repositories: p.repositories, storage: p.storage, + amount: price.unit_amount, currency: price.currency, interval: price.recurring?.interval, intervalCount: price.recurring?.interval_count }; + })) : []; + res.set("Cache-Control", "no-store").json({ enabled: config.BILLING_ENABLED, csrf: req.session.billingCSRF, plans, checkoutEnabled: config.BILLING_CHECKOUT_ENABLED, + grants: grants.map(g => ({ planId: g.planId, scope: g.scope, status: g.revoked ? "revoked" : g.status, until: g.until, cancelAtPeriodEnd: g.cancelAtPeriodEnd })), + portal: !!account?.customerId, allowance: config.BILLING_ENABLED ? await allowance(user.id) : null }); + } catch (error) { handleError(error, res, req); } +}); +router.get("/draft/:id", async (req, res) => { + try { + const user = await getUser(req); + const draft = await getBillingDraft(user.id, req.params.id); + res.set("Cache-Control", "no-store").json({ id: draft._id, path: draft.path, values: draft.values }); + } catch (error) { handleError(error, res, req); } +}); +router.use((req, res, next) => { + if (!req.session.billingCSRF || req.headers["x-csrf-token"] !== req.session.billingCSRF) { res.status(403).json({ error: "invalid_auth_state" }); return; } + next(); +}); +router.use(rateLimit({ windowMs: 60_000, limit: 30, standardHeaders: "draft-8", legacyHeaders: false })); +router.post("/draft", async (req, res) => { + try { + requireBilling(); + const user = await getUser(req); + const draft = await saveBillingDraft(user.id, req.body.path, req.body.values); + res.set("Cache-Control", "no-store").json({ id: draft._id }); + } catch (error) { handleError(error, res, req); } +}); +router.post("/checkout", async (req, res) => { + try { + requireBilling(); + const user = await getUser(req); + if (typeof req.body.planId !== "string" || (req.body.target != null && typeof req.body.target !== "string")) { res.sendStatus(400); return; } + let returnPath: string | undefined; + if (req.body.draftId != null) { + const draft = await getBillingDraft(user.id, req.body.draftId); + returnPath = `${draft.path}?billingDraft=${draft._id}`; + } + res.json({ url: await createCheckout(user.id, req.body.planId, req.body.target, undefined, returnPath) }); + } catch (error) { handleError(error, res, req); } +}); +router.post("/portal", async (req, res) => { + try { + const user = await getUser(req); + const account = await BillingAccount.findById(user.id).lean(); + if (!account?.customerId) { res.status(404).json({ error: "billing_customer_not_found" }); return; } + const portal = await stripeClient().billingPortal.sessions.create({ customer: account.customerId, return_url: `${billingOrigin()}/profile?billing=portal` }); + res.json({ url: portal.url }); + } catch (error) { handleError(error, res, req); } +}); +router.post("/refresh", async (req, res) => { + try { + requireBilling(); + const user = await getUser(req); + const account = await BillingAccount.findById(user.id).lean(); + let pending = !!account?.checkout?.key && !account.checkout.id; + if (account?.checkout?.id) { + await fulfillCheckout(account.checkout.id); + const checkout = await stripeClient().checkout.sessions.retrieve(account.checkout.id); + pending = checkout.status !== "expired" && checkout.payment_status === "unpaid"; + } + const grants = await BillingGrant.find({ owner: user.id, subscriptionId: { $exists: true } }).lean(); + for (const grant of grants) await syncSubscription(grant.subscriptionId!); + res.json({ ok: true, pending }); + } catch (error) { handleError(error, res, req); } +}); +export default router; diff --git a/src/server/routes/conference.ts b/src/server/routes/conference.ts index cf7c375..9dbcf04 100644 --- a/src/server/routes/conference.ts +++ b/src/server/routes/conference.ts @@ -1,3 +1,5 @@ +import config from "../../config"; +import { billingError } from "../../core/billing/config"; import * as express from "express"; import AnonymousError from "../../core/AnonymousError"; import Conference from "../../core/Conference"; @@ -12,37 +14,14 @@ const router = express.Router(); router.use(ensureAuthenticated); const plans = [ - { - id: "free_conference", - name: "Free", - pricePerRepo: 0, - storagePerRepo: -1, - description: `
  • Quota is deducted from user account
  • -
  • No-download
  • -
  • Conference dashboard
  • `, - }, - { - id: "premium_conference", - name: "Premium", - pricePerRepo: 0.5, - storagePerRepo: 500 * 8 * 1024, - description: `
  • 500Mo / repository
  • -
  • Repository download
  • -
  • Conference dashboard
  • `, - }, - { - id: "unlimited_conference", - name: "Unlimited", - pricePerRepo: 3, - storagePerRepo: 0, - description: `
  • Unlimited repository size
  • -
  • Repository download
  • -
  • Conference dashboard
  • `, - }, + { id: "free_conference", name: "Free", pricePerRepo: 0, storagePerRepo: -1, + description: "
  • Uses each author's allowance
  • Conference dashboard
  • " }, + { id: "conference", name: "Review package", pricePerRepo: 0, storagePerRepo: config.PAID_CONFERENCE_STORAGE, + description: `
  • Up to ${config.PAID_CONFERENCE_REPOSITORIES} repositories
  • Up to 180 days
  • Prepaid at checkout
  • ` }, ]; router.get("/plans", async (req: express.Request, res: express.Response) => { - res.json(plans); + res.json(config.BILLING_ENABLED && config.STRIPE_CONFERENCE_PRICE ? plans : plans.filter(p => p.id === "free_conference")); }); router.get("/", async (req: express.Request, res: express.Response) => { @@ -99,11 +78,13 @@ function validateConferenceForm(conf: any) { object: conf, httpStatus: 400, }); - if (plans.filter((p) => p.id == conf.plan.planID).length != 1) + if (!conf.plan || plans.filter((p) => p.id == conf.plan.planID).length != 1) throw new AnonymousError("invalid_plan", { object: conf, httpStatus: 400, }); + if (!Number.isFinite(new Date(conf.startDate).getTime()) || !Number.isFinite(new Date(conf.endDate).getTime())) throw billingError("conf_start_date_invalid"); + if (conf.plan.planID === "conference" && (!config.BILLING_ENABLED || !config.STRIPE_CONFERENCE_PRICE || new Date(conf.endDate).getTime() - new Date(conf.startDate).getTime() > 180 * 86400_000)) throw billingError("billing_invalid_review_window"); const plan = plans.filter((p) => p.id == conf.plan.planID)[0]; if (plan.pricePerRepo > 0) { const billing = conf.billing; @@ -145,16 +126,16 @@ function validateConferenceForm(conf: any) { } } -// eslint-disable-next-line @typescript-eslint/no-explicit-any export function applyConferenceForm( model: IConferenceDocument, - body: any, + body: { name: string; startDate: string | Date; endDate: string | Date; url: string; + options: IConferenceDocument["options"]; plan?: { planID: string } }, isNew: boolean ) { model.name = body.name; model.startDate = new Date(body.startDate); model.endDate = new Date(body.endDate); - model.status = "ready"; + if (isNew) model.status = body.plan?.planID === "conference" ? "pending_payment" : "ready"; model.url = body.url; model.options = body.options; if (isNew) model.repositories = []; @@ -178,7 +159,13 @@ router.post( model = queryModel; isOwnerOrAdmin(model.owners, user); } - validateConferenceForm(req.body); + if (req.params.conferenceID) { + if (req.body.plan?.planID !== model.plan.planID) throw billingError("billing_plan_change_not_supported"); + if (model.plan.planID === "conference" && (new Date(req.body.startDate).getTime() !== model.startDate.getTime() || new Date(req.body.endDate).getTime() !== model.endDate.getTime())) throw billingError("billing_review_window_locked"); + } + // Historical conference plans remain editable without being offered for purchase. + const legacyPlan = req.params.conferenceID && !plans.some(p => p.id === model.plan.planID); + validateConferenceForm(legacyPlan ? { ...req.body, plan: { planID: "free_conference" } } : req.body); applyConferenceForm(model, req.body, !req.params.conferenceID); if (!req.params.conferenceID) { @@ -194,7 +181,7 @@ router.post( size: plans.filter((p) => p.id == req.body.plan.planID)[0] .storagePerRepo, file: 0, - repository: 0, + repository: req.body.plan.planID === "conference" ? config.PAID_CONFERENCE_REPOSITORIES : 0, }, }; diff --git a/src/server/routes/repository-private.ts b/src/server/routes/repository-private.ts index f4983ad..5129e99 100644 --- a/src/server/routes/repository-private.ts +++ b/src/server/routes/repository-private.ts @@ -1,3 +1,6 @@ +import { neverExpirationDeadline, validateBillingExpiration } from "../../core/billing/expiration"; +import config from "../../config"; +import { assertConferenceAdmission, reserveRepository } from "../../core/billing/quotas"; import { randomUUID } from "crypto"; import { githubQuotaKey } from "../../core/github-token-context"; import { selectRepositoryAccess, boundAppToken, appError } from "../../core/github-app"; @@ -506,6 +509,14 @@ router.post( const sourceChanged = reconnecting || hasRepositorySourceChanged(repo.model, repoUpdate); const previousAccessRevision = repo.model.githubAccess?.revision; + if (repo.model.billingManaged) validateBillingExpiration(repoUpdate.options); + if (config.BILLING_ENABLED && repoUpdate.options.expirationMode === "never" && + (repo.model.options.expirationMode !== "never" || repo.model.billingNeverExpiresUntil)) { + repo.model.billingNeverExpiresUntil = await neverExpirationDeadline(String(repo.model.owner), + repo.model.options.expirationMode === "never" ? repo.model.billingNeverExpiresUntil : undefined); + } else if (repoUpdate.options.expirationMode !== "never") { + repo.model.billingNeverExpiresUntil = undefined; + } updateRepoModel(repo.model, repoUpdate); const reactivating = shouldReactivateInactiveRepository(repo.model); @@ -513,6 +524,9 @@ router.post( repo.model.anonymizeDate = new Date(); } + await assertConferenceAdmission(String(repo.model.owner), repo.repoId, repoUpdate.conference); + if (repo.model.billingManaged) await reserveRepository(String(repo.model.owner), repo.repoId, repo.model.size?.storage || 0, repoUpdate.conference); + if (sourceChanged) { const parsedRepository = gh(repoUpdate.fullName); if (!parsedRepository?.owner || !parsedRepository?.name) { @@ -691,6 +705,10 @@ router.post("/", async (req, res) => { repo.owner = user.id; repo.githubAccess = selectedAccess.binding; + validateBillingExpiration(repoUpdate.options); + if (repoUpdate.options.expirationMode === "never") { + repo.billingNeverExpiresUntil = await neverExpirationDeadline(user.id); + } updateRepoModel(repo, repoUpdate); repo.source.type = "GitHubStream"; repo.source.repositoryId = repository.model.id; @@ -698,6 +716,9 @@ router.post("/", async (req, res) => { repo.conference = repoUpdate.conference; + await assertConferenceAdmission(user.id, repo.repoId, repo.conference); + repo.billingManaged = config.BILLING_ENABLED; + await reserveRepository(user.id, repo.repoId, 0, repo.conference); await repo.save(); if (repoUpdate.conference) { diff --git a/src/server/routes/repository-public.ts b/src/server/routes/repository-public.ts index 9150bd3..18ea2d2 100644 --- a/src/server/routes/repository-public.ts +++ b/src/server/routes/repository-public.ts @@ -32,6 +32,7 @@ router.get( } const repo = await getRepo(req, res); if (!repo) return; + if (repo.model.billingManaged && repo.model.truncatedFolders?.length) throw new AnonymousError("repository_tree_incomplete", { httpStatus: 409 }); let user: User | undefined = undefined; try { diff --git a/src/server/routes/user.ts b/src/server/routes/user.ts index 1dd96d9..e4c5fe2 100644 --- a/src/server/routes/user.ts +++ b/src/server/routes/user.ts @@ -1,3 +1,6 @@ +import { BillingQuota, BillingDraft } from "../../core/billing/models"; +import { cancelAccountBilling } from "../../core/billing/stripe"; +import { allowance } from "../../core/billing/quotas"; import DashboardName from "../../core/model/dashboard-name"; import { dashboardSummary } from "./dashboard-summary"; import { revokeGrant } from "./github-app"; @@ -112,18 +115,21 @@ router.get("/quota", async (req, res) => { } } + const limits = config.BILLING_ENABLED ? await allowance(user.id) : null; + const reserved = limits ? await BillingQuota.findById(limits.scope).lean() : null; res.json({ storage: { - used: totalStorage, - total: config.DEFAULT_QUOTA, + unit: limits ? "bytes" : "legacy", + used: reserved ? reserved.allocations.reduce((sum, entry) => sum + (entry.bytes || 0), 0) : totalStorage, + total: limits?.storage ?? config.DEFAULT_QUOTA, }, file: { used: totalFiles, total: 0, }, repository: { - used: ready.length, - total: 20, + used: reserved ? reserved.allocations.length : ready.length, + total: limits?.repositories ?? 20, }, }); } catch (error) { @@ -175,6 +181,8 @@ router.post("/default", async (req, res) => { router.delete("/", async (req, res) => { try { const user = await getUser(req); + if (config.BILLING_ENABLED) await cancelAccountBilling(user.id); + if (isConnected) await BillingDraft.deleteMany({ owner: user.id }); const repositories = (await user.getRepositories()).filter( (r) => r.owner.id === user.model.id && r.status !== "removed" diff --git a/src/server/schedule.ts b/src/server/schedule.ts index b500be4..ebbd3ce 100644 --- a/src/server/schedule.ts +++ b/src/server/schedule.ts @@ -1,3 +1,4 @@ +import { reconcileNeverExpiration } from "../core/billing/expiration"; import { Model, Document } from "mongoose"; import * as schedule from "node-schedule"; import AnonymizedGistModel from "../core/model/anonymizedGists/anonymizedGists.model"; @@ -62,6 +63,7 @@ export function repositoryMaintenanceQuery(now: Date) { } export async function runRepositoryStatusCheck(now = new Date()) { + await reconcileNeverExpiration(now); logger.info("checking repository status and unused repositories"); const fourMonthAgo = new Date(now); fourMonthAgo.setMonth(fourMonthAgo.getMonth() - 4); diff --git a/test/billing-integration.test.js b/test/billing-integration.test.js new file mode 100644 index 0000000..a045123 --- /dev/null +++ b/test/billing-integration.test.js @@ -0,0 +1,277 @@ +const { URL } = require("node:url"); +const { setTimeout } = require("node:timers"); +const { expect } = require("chai"); +require("ts-node/register/transpile-only"); +const mongoose = require("mongoose"); +const config = require("../src/config").default; +const { BillingAccount, BillingGrant, BillingQuota, BillingLock, BillingEvent, BillingRevocation, BillingDraft } = require("../src/core/billing/models"); +const Repo = require("../src/core/model/anonymizedRepositories/anonymizedRepositories.model").default; +const Conference = require("../src/core/model/conference/conferences.model").default; +const { reserveRepository, allowance, assertConferenceAdmission } = require("../src/core/billing/quotas"); +const { fulfillCheckout, syncSubscription, createCheckout, processBillingEvent } = require("../src/core/billing/stripe"); +const uri = process.env.BILLING_TEST_MONGODB_URI; +const owner = "507f1f77bcf86cd799439011"; +const future = () => new Date(Date.now() + 86400000); +async function rejects(promise, message) { + try { await promise; throw new Error("Expected rejection"); } catch (error) { expect(error.message).to.equal(message); } +} +(uri ? describe : describe.skip)("billing with MongoDB", function () { + this.timeout(15000); + const original = { ...config }; + before(async () => { + if (!/^billing_test_/.test(new URL(uri).pathname.slice(1))) throw new Error("Use a disposable billing_test_ database"); + await mongoose.connect(uri); + await Promise.all([BillingAccount, BillingGrant, BillingQuota, BillingLock, BillingEvent, BillingRevocation, BillingDraft, Repo, Conference].map(m => m.init())); + }); + beforeEach(async () => { + Object.assign(config, { BILLING_ENABLED: true, FREE_AUTHOR_REPOSITORIES: 3, FREE_AUTHOR_STORAGE: 100, + PAID_AUTHOR_STORAGE: 1000, PAID_AUTHOR_REPOSITORIES: 20, STRIPE_AUTHOR_MONTHLY_PRICE: "price_monthly", STRIPE_AUTHOR_PASS_PRICE: "price_pass", STRIPE_CONFERENCE_PRICE: "price_conf" }); + await Promise.all([BillingAccount, BillingGrant, BillingQuota, BillingLock, BillingEvent, BillingRevocation, BillingDraft, Repo, Conference].map(m => m.deleteMany({}))); + await BillingAccount.create({ _id: owner, customerId: "cus_owner" }); + }); + after(async () => { Object.assign(config, original); await mongoose.disconnect(); }); + it("atomically admits only three concurrent repositories", async () => { + const results = await Promise.allSettled(Array.from({ length: 12 }, (_, i) => reserveRepository(owner, `repo-${i}`, 10))); + expect(results.filter(r => r.status === "fulfilled")).to.have.length(3); + expect((await BillingQuota.findById(`user:${owner}`)).allocations).to.have.length(3); + }); + it("atomically caps storage and never shrinks a concurrent reservation", async () => { + const results = await Promise.allSettled([reserveRepository(owner, "a", 60), reserveRepository(owner, "b", 60)]); + expect(results.filter(r => r.status === "fulfilled")).to.have.length(1); + const ledger = await BillingQuota.findById(`user:${owner}`); + const id = ledger.allocations[0].repoId; + await Promise.all([reserveRepository(owner, id, 90), reserveRepository(owner, id, 1)]); + expect((await BillingQuota.findById(`user:${owner}`)).allocations[0].bytes).to.equal(90); + }); + it("counts legacy repositories and releases removed repositories", async () => { + await Repo.create(["one", "two", "three"].map(repoId => ({ repoId, owner, status: "ready", size: { storage: 10 } }))); + await rejects(reserveRepository(owner, "four", 1), "quota_exceeded"); + await Repo.updateOne({ repoId: "one" }, { $set: { status: "removed" } }); + await reserveRepository(owner, "four", 1); + expect((await BillingQuota.findById(`user:${owner}`)).allocations.map(a => a.repoId)).not.to.include("one"); + }); + it("charges shared repositories only to their owner, regardless of coauthor subscriptions", async () => { + const collaborator = "507f1f77bcf86cd799439012"; + await Repo.create(["one", "two", "three"].map(repoId => ({ + repoId, owner, status: "ready", size: { storage: 10 }, + coauthors: [{ username: "collaborator", githubId: "42" }], + }))); + // A collaborator can create their own repository even when the owner is full. + await reserveRepository(collaborator, "own-work", 10); + expect((await BillingQuota.findById(`user:${collaborator}`)).allocations.map(a => a.repoId)).to.deep.equal(["own-work"]); + await BillingGrant.create({ _id: "coauthor-sub", owner: collaborator, + scope: `user:${collaborator}`, status: "active", until: future(), planId: "author_monthly" }); + expect((await allowance(owner, "one")).plan).to.equal("free"); + await rejects(reserveRepository(owner, "four", 1), "quota_exceeded"); + // Editing shared work at the owner's count cap is allowed if its bytes fit. + await reserveRepository(owner, "one", 20); + await rejects(reserveRepository(owner, "one", 90), "quota_exceeded"); + }); + it("uses a conference allowance before an author's subscription", async () => { + await BillingGrant.create([{ _id: "sub", owner, scope: `user:${owner}`, status: "active", until: future(), planId: "author_monthly" }, + { _id: "conf", owner, scope: "conference:CONF", status: "paid", until: future(), planId: "conference" }]); + expect((await allowance(owner, "repo", "CONF")).scope).to.equal("conference:CONF"); + await BillingGrant.updateOne({ _id: "conf" }, { $set: { revoked: true } }); + expect((await allowance(owner, "repo", "CONF")).scope).to.equal(`user:${owner}`); + }); + it("requires the owner's recurring subscription for never expiration", async () => { + const { neverExpirationDeadline, NEVER_EXPIRATION_GRACE_MS } = require("../src/core/billing/expiration"); + await rejects(neverExpirationDeadline(owner), "subscription_required_for_never_expiration"); + await BillingGrant.create({ _id: "pass-only", owner, scope: "repo:repo", status: "paid", until: future(), planId: "author_pass" }); + await rejects(neverExpirationDeadline(owner), "subscription_required_for_never_expiration"); + const until = future(); + await BillingGrant.create({ _id: "author", owner, scope: `user:${owner}`, status: "active", until, planId: "author_annual" }); + expect((await neverExpirationDeadline(owner)).getTime()).to.equal(until.getTime() + NEVER_EXPIRATION_GRACE_MS); + }); + it("renews never expiration, honors 90 days of grace and leaves legacy links alone", async () => { + const { reconcileNeverExpiration, NEVER_EXPIRATION_GRACE_MS } = require("../src/core/billing/expiration"); + const until = future(); + const oldDeadline = new Date(Date.now() + 1000); + await Repo.create([{ repoId: "paid-never", owner, status: "ready", options: { expirationMode: "never" }, billingNeverExpiresUntil: oldDeadline }, + { repoId: "legacy-never", owner, status: "ready", options: { expirationMode: "never" } }]); + await BillingGrant.create({ _id: "author", owner, scope: `user:${owner}`, status: "active", until, planId: "author_monthly" }); + await reconcileNeverExpiration(); + const deadline = new Date(until.getTime() + NEVER_EXPIRATION_GRACE_MS); + expect((await Repo.findOne({ repoId: "paid-never" })).billingNeverExpiresUntil.getTime()).to.equal(deadline.getTime()); + await reconcileNeverExpiration(new Date(deadline.getTime() - 1)); + expect((await Repo.findOne({ repoId: "paid-never" })).options.expirationMode).to.equal("never"); + await reconcileNeverExpiration(deadline, async () => {}); + const expired = await Repo.findOne({ repoId: "paid-never" }); + expect(expired.options.expirationMode).to.equal("remove"); + expect(expired.options.expirationDate.getTime()).to.equal(deadline.getTime()); + expect((await Repo.findOne({ repoId: "legacy-never" })).options.expirationMode).to.equal("never"); + }); + function session(status = "paid") { + return { id: "cs_pass", metadata: { application: "anonymous-github", owner, planId: "author_pass", target: "repo" }, + customer: "cus_owner", status: "complete", payment_status: status, created: Math.floor(Date.now() / 1000), + line_items: { data: [{ price: { id: "price_pass" }, quantity: 1 }] }, payment_intent: { id: "pi_pass", latest_charge: { amount_refunded: 0, disputed: false } } }; + } + it("ignores an unfinished recurring Checkout before Stripe assigns a subscription", async () => { + const stripe = { checkout: { sessions: { retrieve: async () => ({ + id: "cs_open", metadata: { application: "anonymous-github", owner, planId: "author_monthly" }, + customer: "cus_owner", status: "open", payment_status: "unpaid", subscription: null, + }) } } }; + await fulfillCheckout("cs_open", stripe); + expect(await BillingGrant.countDocuments()).to.equal(0); + }); + it("ignores unpaid checkout and fulfills duplicate deliveries exactly once", async () => { + let value = session("unpaid"); + const stripe = { checkout: { sessions: { retrieve: async () => value } } }; + await fulfillCheckout("cs_pass", stripe); + expect(await BillingGrant.countDocuments()).to.equal(0); + value = session(); + await Promise.all([fulfillCheckout("cs_pass", stripe), fulfillCheckout("cs_pass", stripe)]); + const grant = await BillingGrant.findById("cs_pass"); + expect(await BillingGrant.countDocuments()).to.equal(1); + expect(grant.scope).to.equal("repo:repo"); + expect(grant.until.getTime()).to.equal(value.created * 1000 + 180 * 86400000); + }); + it("does not reactivate a refunded pass on a checkout replay", async () => { + const value = session(); + const stripe = { checkout: { sessions: { retrieve: async () => value } } }; + await fulfillCheckout("cs_pass", stripe); + await processBillingEvent({ type: "charge.refunded", data: { object: { payment_intent: "pi_pass" } } }, { ...stripe, invoicePayments: { list: async () => ({ data: [] }) } }); + await fulfillCheckout("cs_pass", stripe); + expect((await BillingGrant.findById("cs_pass")).revoked).to.equal(true); + }); + it("rejects a checkout for a different Stripe customer", async () => { + const value = session(); value.customer = "cus_other"; + await rejects(fulfillCheckout("cs_pass", { checkout: { sessions: { retrieve: async () => value } } }), "billing_customer_mismatch"); + }); + function subscription(overrides = {}) { + return { id: "sub_owner", metadata: { application: "anonymous-github", owner }, customer: "cus_owner", status: "active", + latest_invoice: { status: "paid" }, items: { data: [{ price: { id: "price_monthly" }, current_period_end: Math.floor(future().getTime() / 1000) }] }, cancel_at_period_end: false, ...overrides }; + } + it("recognizes portal cancellations scheduled with cancel_at", async () => { + await syncSubscription("sub_owner", { subscriptions: { retrieve: async () => subscription({ + cancel_at_period_end: false, cancel_at: Math.floor(future().getTime() / 1000), + }) } }); + expect((await BillingGrant.findById("sub_owner")).cancelAtPeriodEnd).to.equal(true); + expect((await allowance(owner)).plan).to.equal("author_monthly"); + }); + it("honors paid subscription periods, cancellation and renewal failure", async () => { + let value = subscription(); + const stripe = { subscriptions: { retrieve: async () => value } }; + await syncSubscription("sub_owner", stripe); + expect((await allowance(owner)).plan).to.equal("author_monthly"); + const paidThrough = (await BillingGrant.findById("sub_owner")).until; + value = subscription({ status: "past_due", latest_invoice: { status: "open" } }); + value.items.data[0].current_period_end += 86400 * 30; + await syncSubscription("sub_owner", stripe); + expect((await BillingGrant.findById("sub_owner")).until).to.deep.equal(paidThrough); + value = subscription({ cancel_at_period_end: true }); + await syncSubscription("sub_owner", stripe); + expect((await allowance(owner)).plan).to.equal("author_monthly"); + value = subscription({ status: "canceled" }); + await syncSubscription("sub_owner", stripe); + expect((await allowance(owner)).plan).to.equal("free"); + }); + it("protects a newer subscription update from an older in-flight fetch", async () => { + await BillingGrant.create({ _id: "sub_owner", owner, scope: `user:${owner}`, planId: "author_monthly", status: "active", until: future() }); + let release; const gate = new Promise(resolve => { release = resolve; }); let started; + const firstRead = new Promise(resolve => { started = resolve; }); let calls = 0; + const stripe = { subscriptions: { retrieve: async () => { + if (++calls === 1) { started(); await gate; return subscription(); } + return subscription({ status: "canceled" }); + } } }; + const old = syncSubscription("sub_owner", stripe); + await firstRead; + await syncSubscription("sub_owner", stripe); + release(); await old; + expect((await BillingGrant.findById("sub_owner")).status).to.equal("canceled"); + }); + it("keeps conference admission closed until verified payment", async () => { + await Conference.create({ conferenceID: "CONF", owners: [owner], status: "pending_payment", startDate: new Date(Date.now() - 1000), endDate: future(), plan: { planID: "conference" } }); + await rejects(assertConferenceAdmission(owner, "repo", "CONF"), "conf_not_activated"); + const value = session(); value.id = "cs_conf"; value.metadata.planId = "conference"; value.metadata.target = "CONF"; value.line_items.data[0].price.id = "price_conf"; + await fulfillCheckout("cs_conf", { checkout: { sessions: { retrieve: async () => value } } }); + expect((await Conference.findOne({ conferenceID: "CONF" })).status).to.equal("ready"); + await assertConferenceAdmission(owner, "repo", "CONF"); + await BillingGrant.updateOne({ _id: "cs_conf" }, { $set: { revoked: true } }); + await rejects(assertConferenceAdmission(owner, "repo", "CONF"), "conference_payment_required"); + }); + it("prevents two simultaneous checkout sessions and reuses an open session", async () => { + let creates = 0; + const stripe = { prices: { retrieve: async () => ({ active: true, currency: "eur", unit_amount: 500, recurring: { interval: "month", interval_count: 1 } }) }, subscriptions: { list: async () => ({ data: [] }) }, checkout: { sessions: { + create: async () => { creates++; await new Promise(r => setTimeout(r, 30)); return { id: "cs_new", url: "https://checkout.stripe.com/test" }; }, + retrieve: async () => ({ id: "cs_new", status: "open", url: "https://checkout.stripe.com/test" }), + } } }; + const results = await Promise.allSettled([createCheckout(owner, "author_monthly", "", stripe), createCheckout(owner, "author_monthly", "", stripe)]); + expect(results.filter(r => r.status === "fulfilled")).to.have.length(1); + await createCheckout(owner, "author_monthly", "", stripe); + expect(creates).to.equal(1); + }); + it("revokes only the refunded subscription, including refunds arriving before subscription sync", async () => { + await BillingGrant.create({ _id: "other-sub", owner, customerId: "cus_owner", subscriptionId: "other-sub", status: "active", until: future() }); + const stripe = { invoicePayments: { list: async () => ({ data: [{ invoice: "in_refunded" }] }) }, + invoices: { retrieve: async () => ({ parent: { subscription_details: { subscription: "sub_refunded" } } }) } }; + await processBillingEvent({ type: "charge.refunded", data: { object: { customer: "cus_owner", payment_intent: "pi_refunded" } } }, stripe); + expect((await BillingGrant.findById("sub_refunded")).revoked).to.equal(true); + expect((await BillingGrant.findById("other-sub")).revoked).to.equal(false); + await syncSubscription("sub_refunded", { subscriptions: { retrieve: async () => subscription({ id: "sub_refunded" }) } }); + expect((await BillingGrant.findById("sub_refunded")).revoked).to.equal(true); + }); + + it("keeps reviewer visits from refreshing snapshots after paid access expires", async () => { + const Repository = require("../src/core/Repository").default; + const model = new Repo({ repoId: "frozen", owner, billingManaged: true, status: "ready", lastView: new Date(0), options: { update: true, expirationMode: "never" }, source: { type: "GitHubStream", repositoryName: "owner/repo" } }); + const repo = new Repository(model); + repo.getToken = () => { throw new Error("Unexpected upstream refresh"); }; + await BillingGrant.create({ _id: "expired-sub", owner, scope: `user:${owner}`, status: "active", until: new Date(0), planId: "author_monthly" }); + await repo.updateIfNeeded(); + expect(repo.status).to.equal("ready"); + }); + + it("authenticates billing, checks CSRF, and verifies raw webhook signatures", async () => { + const express = require("express"); + const sessionMiddleware = require("express-session"); + const Stripe = require("stripe"); + const Users = require("../src/core/model/users/users.model").default; + const routes = require("../src/server/routes/billing"); + await Users.updateOne({ _id: owner }, { $set: { username: "billing-test-author", status: "active" } }, { upsert: true }); + Object.assign(config, { STRIPE_SECRET_KEY: "sk_test_example", STRIPE_WEBHOOK_SECRET: "whsec_test_example", STRIPE_AUTHOR_MONTHLY_PRICE: "", STRIPE_AUTHOR_ANNUAL_PRICE: "", STRIPE_AUTHOR_PASS_PRICE: "", STRIPE_CONFERENCE_PRICE: "" }); + const app = express(); + app.use("/webhook", routes.billingWebhook); + app.use(express.json()); + app.use(sessionMiddleware({ secret: "billing-test-session-secret", resave: false, saveUninitialized: false })); + app.use((req, _res, next) => { req.isAuthenticated = () => req.headers["x-test-auth"] === "yes"; req.user = { user: { _id: owner } }; next(); }); + app.use("/billing", routes.default); + const server = await new Promise(resolve => { const listening = app.listen(0, "127.0.0.1", () => resolve(listening)); }); + const base = `http://127.0.0.1:${server.address().port}`; + try { + expect((await globalThis.fetch(`${base}/billing`)).status).to.equal(401); + const get = await globalThis.fetch(`${base}/billing`, { headers: { "x-test-auth": "yes" } }); + const data = await get.json(); + expect(data.csrf).to.be.a("string"); + expect(JSON.stringify(data)).not.to.include("cus_owner"); + const headers = { "x-test-auth": "yes", cookie: get.headers.get("set-cookie").split(";")[0], "content-type": "application/json" }; + expect((await globalThis.fetch(`${base}/billing/checkout`, { method: "POST", headers, body: JSON.stringify({ planId: "arbitrary" }) })).status).to.equal(403); + expect((await globalThis.fetch(`${base}/billing/draft`, { method: "POST", headers, body: JSON.stringify({ path: "/anonymize", values: { terms: "Private Author" } }) })).status).to.equal(403); + headers["x-csrf-token"] = data.csrf; + const saved = await globalThis.fetch(`${base}/billing/draft`, { method: "POST", headers, body: JSON.stringify({ path: "/anonymize", values: { terms: "Private Author" } }) }); + expect(saved.status).to.equal(200); + const draft = await saved.json(); + expect((await globalThis.fetch(`${base}/billing/draft/${draft.id}`)).status).to.equal(401); + const restored = await globalThis.fetch(`${base}/billing/draft/${draft.id}`, { headers }); + expect(restored.headers.get("cache-control")).to.equal("no-store"); + expect((await restored.json()).values.terms).to.equal("Private Author"); + await BillingDraft.updateOne({ _id: draft.id }, { owner: "another-owner" }); + expect((await globalThis.fetch(`${base}/billing/draft/${draft.id}`, { headers })).status).to.equal(404); + + const rejected = await globalThis.fetch(`${base}/billing/checkout`, { method: "POST", headers, body: JSON.stringify({ planId: "arbitrary" }) }); + expect((await rejected.json()).error).to.equal("billing_plan_unavailable"); + const payload = JSON.stringify({ id: "evt_test", type: "customer.created", data: { object: { id: "cus_unused" } } }); + const stripe = new Stripe("sk_test_example"); + const signature = stripe.webhooks.generateTestHeaderString({ payload, secret: config.STRIPE_WEBHOOK_SECRET }); + expect((await globalThis.fetch(`${base}/webhook`, { method: "POST", headers: { "content-type": "application/json", "stripe-signature": signature }, body: payload })).status).to.equal(200); + expect((await globalThis.fetch(`${base}/webhook`, { method: "POST", headers: { "content-type": "application/json", "stripe-signature": signature }, body: payload + " " })).status).to.equal(400); + expect((await BillingEvent.findById("test:platform:evt_test")).state).to.equal("pending"); + const originalUpdate = BillingEvent.updateOne; + BillingEvent.updateOne = async () => { throw new Error("simulated database outage"); }; + try { + expect((await globalThis.fetch(`${base}/webhook`, { method: "POST", headers: { "content-type": "application/json", "stripe-signature": signature }, body: payload })).status).to.equal(500); + } finally { BillingEvent.updateOne = originalUpdate; } + } finally { server.closeAllConnections(); await new Promise(resolve => server.close(resolve)); await Users.deleteOne({ _id: owner }); } + }); + +}); diff --git a/test/billing-reliability.test.js b/test/billing-reliability.test.js new file mode 100644 index 0000000..3862be6 --- /dev/null +++ b/test/billing-reliability.test.js @@ -0,0 +1,233 @@ +const { URL } = require("url"); +const { expect } = require("chai"); +require("ts-node/register/transpile-only"); +const mongoose = require("mongoose"); +const config = require("../src/config").default; +const { BillingAccount, BillingGrant, BillingEvent, BillingRevocation, BillingLock, BillingDraft } = require("../src/core/billing/models"); +const { receiveBillingEvent, processBillingInbox, billingHealth } = require("../src/core/billing/events"); +const { reconcileBillingAccount } = require("../src/core/billing/reconciliation"); +const { createCheckout, processBillingEvent } = require("../src/core/billing/stripe"); +const { reconcileNeverExpiration, NEVER_EXPIRATION_GRACE_MS } = require("../src/core/billing/expiration"); +const Repo = require("../src/core/model/anonymizedRepositories/anonymizedRepositories.model").default; +const uri = process.env.BILLING_TEST_MONGODB_URI; +const owner = "507f1f77bcf86cd799439011"; +const { saveBillingDraft, getBillingDraft } = require("../src/core/billing/drafts"); +const models = [BillingDraft, BillingAccount, BillingGrant, BillingEvent, BillingRevocation, BillingLock, Repo]; +const iterable = values => ({ async *[Symbol.asyncIterator]() { yield* values; } }); +const event = id => ({ id, livemode: false, type: "customer.created", data: { object: { id: "cus_test", email: "private@example.org" } } }); +(uri ? describe : describe.skip)("billing failure recovery", function () { + this.timeout(20000); + const original = { ...config }; + before(async () => { + if (!/^billing_test_/.test(new URL(uri).pathname.slice(1))) throw new Error("Disposable database required"); + await mongoose.connect(uri); + await Promise.all(models.map(m => m.init())); + }); + beforeEach(async () => { + await Promise.all(models.map(m => m.deleteMany({}))); + Object.assign(config, { BILLING_ENABLED: true, BILLING_CHECKOUT_ENABLED: true, STRIPE_AUTHOR_MONTHLY_PRICE: "price_monthly" }); + await BillingAccount.create({ _id: owner, customerId: "cus_owner" }); + }); + after(async () => { Object.assign(config, original); await mongoose.disconnect(); }); + it("deduplicates concurrent receipt without retaining customer data", async () => { + await Promise.all(Array.from({ length: 8 }, () => receiveBillingEvent(event("evt_one")))); + expect(await BillingEvent.countDocuments()).to.equal(1); + expect(JSON.stringify(await BillingEvent.findOne())).not.to.include("private@example.org"); + let calls = 0; + await Promise.all([processBillingInbox(1, async () => { calls++; }), processBillingInbox(1, async () => { calls++; })]); + expect(calls).to.equal(1); + expect((await BillingEvent.findOne()).state).to.equal("complete"); + }); + it("recovers a crash after side effects but before acknowledgement", async () => { + await receiveBillingEvent(event("evt_crash")); + await BillingGrant.create({ _id: "already-applied", status: "paid" }); + await BillingEvent.updateOne({}, { $set: { state: "processing", token: "dead-worker", leaseUntil: new Date(0) } }); + await processBillingInbox(1, async () => { + await BillingGrant.updateOne({ _id: "already-applied" }, { $setOnInsert: { status: "paid" } }, { upsert: true }); + }); + expect(await BillingGrant.countDocuments()).to.equal(1); + expect((await BillingEvent.findOne()).state).to.equal("complete"); + }); + it("backs off failures, redacts errors and exposes exhausted retries", async () => { + await receiveBillingEvent(event("evt_fail")); + await processBillingInbox(1, async () => { throw new Error("secret payload"); }); + let record = await BillingEvent.findOne(); + expect(record.state).to.equal("pending"); + expect(record.nextAttemptAt.getTime()).to.be.greaterThan(record.receivedAt.getTime()); + expect(record.lastError).not.to.include("secret"); + await BillingEvent.updateOne({}, { $set: { attempts: 11, nextAttemptAt: new Date(0) } }); + await processBillingInbox(1, async () => { throw new Error("secret"); }); + record = await BillingEvent.findOne(); + expect(record.state).to.equal("failed"); + expect((await billingHealth()).failed).to.equal(1); + }); + it("recovers missing grants from provider history and applies missed refunds", async () => { + const sub = { id: "sub_lost", metadata: { application: "anonymous-github", owner }, customer: "cus_owner", status: "active", + latest_invoice: { status: "paid" }, items: { data: [{ price: { id: "price_monthly" }, current_period_end: Math.floor(Date.now() / 1000) + 86400 }] } }; + const stripe = { subscriptions: { list: () => iterable([sub]), retrieve: async () => sub }, + checkout: { sessions: { list: () => iterable([]) } }, + charges: { list: () => iterable([{ id: "ch_refunded", refunded: true, payment_intent: "pi_refunded" }]) }, + invoicePayments: { list: async () => ({ data: [{ invoice: "in_refunded" }] }) }, + invoices: { retrieve: async () => ({ parent: { subscription_details: { subscription: "sub_lost" } } }) } }; + await reconcileBillingAccount(owner, stripe); + expect((await BillingGrant.findById("sub_lost")).revoked).to.equal(true); + expect((await BillingAccount.findById(owner)).reconciledAt).to.be.instanceOf(Date); + // A restored database with no grants can reconstruct the same final state. + await BillingGrant.deleteMany({}); + await reconcileBillingAccount(owner, stripe); + expect((await BillingGrant.findById("sub_lost")).revoked).to.equal(true); + }); + it("recovers paid time when the latest invoice failed after a missed renewal", async () => { + const { syncSubscription } = require("../src/core/billing/stripe"); + const end = Math.floor(Date.now() / 1000); + await syncSubscription("sub_history", { + subscriptions: { retrieve: async () => ({ id: "sub_history", customer: "cus_owner", metadata: { application: "anonymous-github", owner }, + status: "past_due", latest_invoice: { status: "open" }, items: { data: [{ id: "si_owned", price: { id: "price_monthly" }, current_period_end: end + 86400 }] } }) }, + invoices: { list: () => iterable([{ id: "in_paid" }]), listLineItems: () => iterable([ + { amount: 500, parent: { subscription_item_details: { subscription_item: "si_owned" } }, period: { end } }, + { amount: 500, parent: { subscription_item_details: { subscription_item: "si_unrelated" } }, period: { end: end + 999999 } }, + ]) }, + }); + expect((await BillingGrant.findById("sub_history")).until.getTime()).to.equal(end * 1000); + }); + it("preserves a refund received before the first grant exists", async () => { + const { fulfillCheckout } = require("../src/core/billing/stripe"); + config.STRIPE_AUTHOR_PASS_PRICE = "price_pass"; + const stripe = { invoicePayments: { list: async () => ({ data: [] }) }, checkout: { sessions: { retrieve: async () => ({ + id: "cs_late", status: "complete", payment_status: "paid", customer: "cus_owner", created: Math.floor(Date.now() / 1000), + metadata: { application: "anonymous-github", owner, planId: "author_pass", target: "repo" }, + line_items: { data: [{ price: { id: "price_pass" }, quantity: 1 }] }, + payment_intent: { id: "pi_early", latest_charge: { refunded: false, disputed: false } }, + }) } } }; + await processBillingEvent({ type: "charge.refunded", data: { object: { payment_intent: "pi_early", refunded: true } } }, stripe); + await fulfillCheckout("cs_late", stripe); + expect((await BillingGrant.findById("cs_late")).revoked).to.equal(true); + }); + it("starts a fresh attempt only after the old immutable request cannot execute", async () => { + await BillingAccount.updateOne({ _id: owner }, { $set: { checkout: { + key: "old", planId: "author_monthly", target: "", createdAt: new Date(0), params: { expires_at: 1000 }, + } } }); + const stripe = checkoutStripe(); + stripe.checkout.sessions.create = async (_params, options) => { + expect(options.idempotencyKey).not.to.equal("old"); + return { id: "cs_fresh", url: "https://checkout.stripe.com/fresh" }; + }; + expect(await createCheckout(owner, "author_monthly", "", stripe)).to.equal("https://checkout.stripe.com/fresh"); + }); + it("keeps partial refunds active and revokes a full refund", async () => { + await BillingGrant.create({ _id: "pass", paymentIntentId: "pi_pass", status: "paid" }); + const stripe = { invoicePayments: { list: async () => ({ data: [] }) } }; + const refund = refunded => ({ type: "charge.refunded", data: { object: { payment_intent: "pi_pass", refunded } } }); + await processBillingEvent(refund(false), stripe); + expect((await BillingGrant.findById("pass")).revoked).to.equal(false); + await processBillingEvent(refund(true), stripe); + expect((await BillingGrant.findById("pass")).revocationReason).to.equal("full_refund"); + }); + it("requires review for a new dispute but ignores an older refund replay after review", async () => { + await BillingGrant.create({ _id: "reviewed-pass", paymentIntentId: "pi_reviewed", status: "paid" }); + const stripe = { invoicePayments: { list: async () => ({ data: [] }) }, charges: { retrieve: async () => ({ payment_intent: "pi_reviewed", disputed: true }) } }; + const refund = { type: "charge.refunded", data: { object: { payment_intent: "pi_reviewed", refunded: true } } }; + await processBillingEvent(refund, stripe); + await BillingRevocation.updateOne({ _id: "pi_reviewed" }, { $set: { reviewed: true } }); + await BillingGrant.updateOne({ _id: "reviewed-pass" }, { $set: { revoked: false } }); + await processBillingEvent({ type: "charge.dispute.created", data: { object: { charge: "ch_reviewed" } } }, stripe); + expect((await BillingGrant.findById("reviewed-pass")).revoked).to.equal(true); + await BillingRevocation.updateOne({ _id: "pi_reviewed" }, { $set: { reviewed: true } }); + await BillingGrant.updateOne({ _id: "reviewed-pass" }, { $set: { revoked: false } }); + await processBillingEvent(refund, stripe); + expect((await BillingGrant.findById("reviewed-pass")).revoked).to.equal(false); + }); + it("defers expiration during outage and discovers a renewal before removing content", async () => { + const deadline = new Date(Date.now() - 1000); + await Repo.create({ repoId: "protected", owner, status: "ready", options: { expirationMode: "never" }, billingNeverExpiresUntil: deadline }); + await reconcileNeverExpiration(new Date(), async () => { throw new Error("Stripe unavailable"); }); + expect((await Repo.findOne()).options.expirationMode).to.equal("never"); + const until = new Date(Date.now() + 86400_000); + await reconcileNeverExpiration(new Date(), async () => { + await BillingGrant.create({ _id: "renewal", owner, scope: `user:${owner}`, planId: "author_monthly", until, status: "active" }); + }); + const repo = await Repo.findOne(); + expect(repo.options.expirationMode).to.equal("never"); + expect(repo.billingNeverExpiresUntil.getTime()).to.equal(until.getTime() + NEVER_EXPIRATION_GRACE_MS); + }); + function checkoutStripe() { + return { prices: { retrieve: async () => ({ active: true, currency: "eur", unit_amount: 500, recurring: { interval: "month", interval_count: 1 } }) }, + subscriptions: { list: async () => ({ data: [] }) }, checkout: { sessions: { + create: async () => { throw new Error("connection lost"); }, + list: () => iterable([]), + retrieve: async () => ({ status: "open", url: "https://checkout.stripe.com/recovered" }), + } } }; + } + it("keeps checkout drafts private, bounded and expired even before the TTL sweep", async () => { + const draft = await saveBillingDraft(owner, "/anonymize", { terms: "Private Author", options: { expirationMode: "never" }, customerId: "untrusted" }); + expect((await getBillingDraft(owner, draft.id)).values).not.to.have.property("customerId"); + for (const other of ["someone-else", owner]) { + if (other === owner) await BillingDraft.updateOne({ _id: draft.id }, { expiresAt: new Date(0) }); + try { await getBillingDraft(other, draft.id); throw new Error("expected rejection"); } + catch (error) { expect(error.message).to.equal("billing_draft_not_found"); } + } + for (const path of ["//evil.example", "/anonymize?next=https://evil.example", "/anonymize/../profile"]) { + try { await saveBillingDraft(owner, path, {}); throw new Error("expected rejection"); } + catch (error) { expect(error.message).to.equal("billing_invalid_draft"); } + } + try { await saveBillingDraft(owner, "/anonymize", { terms: "x".repeat(65537) }); throw new Error("expected rejection"); } + catch (error) { expect(error.message).to.equal("billing_invalid_draft"); } + }); + it("returns checkout to the saved task and refuses reuse for a different task", async () => { + const stripe = checkoutStripe(); + const draft = await saveBillingDraft(owner, "/anonymize", { terms: "Author" }); + const destination = `/anonymize?billingDraft=${draft.id}`; + let parameters; + stripe.checkout.sessions.create = async params => { parameters = params; return { id: "cs_task", url: "https://checkout.stripe.com/task" }; }; + await createCheckout(owner, "author_monthly", "", stripe, destination); + expect(parameters.success_url).to.include(destination + "&billing=success"); + expect(parameters.cancel_url).to.include(destination + "&billing=cancelled"); + await createCheckout(owner, "author_monthly", "", stripe, destination); + try { await createCheckout(owner, "author_monthly", "", stripe); throw new Error("expected rejection"); } + catch (error) { expect(error.message).to.equal("billing_checkout_in_progress"); } + try { await createCheckout(owner, "author_monthly", "", stripe, "https://evil.example"); throw new Error("expected rejection"); } + catch (error) { expect(error.message).to.equal("billing_invalid_draft"); } + }); + it("retries a lost response with identical parameters and the same key", async () => { + const stripe = checkoutStripe(); + let first; + stripe.checkout.sessions.create = async (params, options) => { first = { params, options }; throw new Error("connection lost"); }; + try { await createCheckout(owner, "author_monthly", "", stripe); } catch (e) { expect(e.message).to.equal("connection lost"); } + const saved = await BillingAccount.findById(owner); + expect(saved.checkout.id).to.equal(undefined); + stripe.checkout.sessions.create = async (params, options) => { + expect(params).to.deep.equal(first.params); + expect(options).to.deep.equal(first.options); + return { id: "cs_recovered", url: "https://checkout.stripe.com/recovered" }; + }; + await createCheckout(owner, "author_monthly", "", stripe); + expect((await BillingAccount.findById(owner)).checkout.id).to.equal("cs_recovered"); + }); + it("recovers an old attempt by metadata without creating another payment", async () => { + await BillingAccount.updateOne({ _id: owner }, { $set: { checkout: { key: "attempt", planId: "author_monthly", target: "", createdAt: new Date(0) } } }); + const stripe = checkoutStripe(); + stripe.checkout.sessions.list = () => iterable([{ id: "cs_recovered", metadata: { attempt: "attempt", owner } }]); + expect(await createCheckout(owner, "author_monthly", "", stripe)).to.equal("https://checkout.stripe.com/recovered"); + }); + it("blocks unresolved old requests instead of reusing a pruned key", async () => { + await BillingAccount.updateOne({ _id: owner }, { $set: { checkout: { key: "old", planId: "author_monthly", target: "", createdAt: new Date(0) } } }); + try { await createCheckout(owner, "author_monthly", "", checkoutStripe()); throw new Error("expected rejection"); } + catch (e) { expect(e.message).to.equal("billing_recovery_required"); } + }); + it("checks subsequent subscription pages before offering another subscription", async () => { + const stripe = checkoutStripe(); + stripe.subscriptions.list = async ({ starting_after }) => starting_after + ? { data: [{ id: "active", status: "active" }], has_more: false } + : { data: [{ id: "old", status: "canceled" }], has_more: true }; + try { await createCheckout(owner, "author_monthly", "", stripe); throw new Error("expected rejection"); } + catch (e) { expect(e.message).to.equal("billing_subscription_exists"); } + }); + it("stops new purchases independently of event processing", async () => { + config.BILLING_CHECKOUT_ENABLED = false; + try { await createCheckout(owner, "author_monthly", "", checkoutStripe()); throw new Error("expected rejection"); } + catch (e) { expect(e.message).to.equal("billing_checkout_disabled"); } + await receiveBillingEvent(event("evt_existing")); + await processBillingInbox(1, async () => {}); + expect((await BillingEvent.findOne()).state).to.equal("complete"); + }); +}); diff --git a/test/billing.test.js b/test/billing.test.js new file mode 100644 index 0000000..e3cb348 --- /dev/null +++ b/test/billing.test.js @@ -0,0 +1,51 @@ +const { expect } = require("chai"); +require("ts-node/register/transpile-only"); +const { usableGrant } = require("../src/core/billing/quotas"); +const { billingOrigin } = require("../src/core/billing/config"); +const config = require("../src/config").default; +const { applyConferenceForm } = require("../src/server/routes/conference"); + +describe("paid access policy", () => { + it("requires paid time and rejects revoked, unpaid, cancelled and expired grants", () => { + const until = new Date(Date.now() + 60000); + for (const status of ["active", "paid", "past_due"]) expect(usableGrant({ status, until })).to.equal(true); + for (const status of ["incomplete", "unpaid", "canceled", "paused", "trialing"]) expect(usableGrant({ status, until })).to.equal(false); + expect(usableGrant({ status: "active", until: new Date(0) })).to.equal(false); + expect(usableGrant({ status: "active", until, revoked: true })).to.equal(false); + }); + it("does not activate a paid conference from a submitted form or an edit", () => { + const model = {}; + const body = { plan: { planID: "conference" }, startDate: "2026-11-01", endDate: "2027-01-01" }; + applyConferenceForm(model, body, true); + expect(model.status).to.equal("pending_payment"); + applyConferenceForm(model, body, false); + expect(model.status).to.equal("pending_payment"); + model.status = "removed"; + applyConferenceForm(model, body, false); + expect(model.status).to.equal("removed"); + }); + it("requires a finite dated expiration when billing is enabled", () => { + const { validateBillingExpiration } = require("../src/core/billing/expiration"); + const enabled = config.BILLING_ENABLED; + config.BILLING_ENABLED = true; + try { + for (const options of [{}, { expirationMode: "remove" }, { expirationMode: "remove", expirationDate: "invalid" }, + { expirationMode: "remove", expirationDate: "2099-01-01" }]) { + expect(() => validateBillingExpiration(options)).to.throw("invalid_billing_expiration"); + } + expect(() => validateBillingExpiration({ expirationMode: "never" })).not.to.throw(); + expect(() => validateBillingExpiration({ expirationMode: "remove", expirationDate: new Date() })).not.to.throw(); + } finally { config.BILLING_ENABLED = enabled; } + }); + it("rejects unsafe configured redirect origins", () => { + const original = config.BILLING_ORIGIN; + try { + for (const value of ["http://example.org", "https://user:pass@example.org", "https://example.org/path", "https://example.org?next=x"]) { + config.BILLING_ORIGIN = value; + expect(() => billingOrigin()).to.throw(); + } + config.BILLING_ORIGIN = "https://example.org"; + expect(billingOrigin()).to.equal("https://example.org"); + } finally { config.BILLING_ORIGIN = original; } + }); +}); diff --git a/test/frontend-regressions.test.js b/test/frontend-regressions.test.js index 1df4bde..9207831 100644 --- a/test/frontend-regressions.test.js +++ b/test/frontend-regressions.test.js @@ -3,6 +3,7 @@ const fs = require("fs"); const vm = require("vm"); const path = require("path"); const { setImmediate } = require("timers"); +const { URLSearchParams } = require("node:url"); const source = fs.readFileSync(path.join(__dirname, "../public/script/app.js"), "utf8"); function harness(date) { @@ -11,7 +12,7 @@ function harness(date) { const context = { reactive: value => value, console, Map, Set, Date: date || Date, formDraft: state => ({ restore: () => false, clear() {}, discard() {}, checkpoint: () => ({ terms: state.terms, options: state.options }), accept() {} }), navigator: { platform: "Linux" }, document: { location: { pathname: "/r/repo" }, addEventListener() {}, querySelector() {} }, - window: {}, Prism: { highlightAll() {} }, encodeURIComponent, + URLSearchParams, window: { location: { search: "" } }, Prism: { highlightAll() {} }, encodeURIComponent, encodePathForUrl: p => p.split("/").map(encodeURIComponent).join("/"), humanFileSize: x => String(x), parseGithubUrl: () => ({ owner: "owner", repo: "repo" }), $: () => ({ on() {}, tooltip() {} }), @@ -20,6 +21,7 @@ function harness(date) { }; context.createTimers = () => ({ timeout: Object.assign(context.setTimeout, { cancel: context.clearTimeout }), interval: Object.assign(context.setInterval, { cancel: context.clearInterval }) }); context.createListeners = () => (target, name, callback) => target.addEventListener(name, callback); + vm.runInNewContext(fs.readFileSync(path.join(__dirname, "../public/script/billing.js"), "utf8").replaceAll("export function", "function"), context); const names = [...source.matchAll(/export const (\w+)/g)].map(match => match[1]); vm.runInNewContext(source.replace(/^import .*;$/gm, "").replace(/export const/g, "var") + "\nthis.pageSetups = {" + names.join(",") + "};", context); Object.assign(defs, context.pageSetups); @@ -59,7 +61,7 @@ describe("frontend production regressions", function () { for (const id of ["repoId", "pullRequestId", "gistId"]) { it(`preserves saved options when reopening a conference-linked ${id}`, async function () { const h = anonymize({ [id]: "saved" }); - h.requests[0].resolve({ data: { options: { update: true } } }); await h.flush(); + h.requests.find(r => r.url === "/api/user/default").resolve({ data: { options: { update: true } } }); await h.flush(); h.requests.at(-1).resolve({ data: { source: { fullName: "owner/repo", repositoryFullName: "owner/repo", branch: "main", commit: "abcdef", gistId: "123", pullRequestId: 1 }, conference: "conf", diff --git a/test/vue-ui.test.js b/test/vue-ui.test.js index 46d3a16..8331f9d 100644 --- a/test/vue-ui.test.js +++ b/test/vue-ui.test.js @@ -80,6 +80,126 @@ describe("Vue 3 UI", function () { let ui; afterEach(() => ui?.close()); + it("keeps defaults across settings tabs and preserves the hidden fetch preference", async () => { + ui = await browser("/profile", { + "/api/user": { username: "owner" }, + "/api/user/default": { terms: ["Original"], options: { mode: "GitHubDownload", link: true } }, + }); + expect(ui.window.document.querySelector("#mode")).to.equal(null); + await ui.input("#terms", "Changed Author"); + ui.window.document.querySelectorAll(".settings-nav button")[1].click(); + await delay(300); + ui.window.document.querySelectorAll(".settings-nav button")[0].click(); + await delay(10); + expect(ui.window.document.querySelector("#terms").value).to.equal("Changed Author"); + ui.window.document.querySelector("#save").click(); await delay(30); + const saved = ui.requests.find(r => r.method === "POST" && r.url.pathname === "/api/user/default"); + expect(saved.payload.options.mode).to.equal("GitHubDownload"); + expect(saved.payload.terms).to.deep.equal(["Changed Author"]); + expect(ui.errors).to.deep.equal([]); + }); + + it("shows paid-through access and billing management without offering a duplicate subscription", async () => { + ui = await browser("/profile", { + "/api/user": { username: "owner" }, + "/api/billing/": { enabled: true, csrf: "token", portal: true, allowance: { repositories: 20, storage: 10737418240 }, + grants: [{ planId: "author_monthly", scope: "user:owner", status: "active", until: "2099-12-01", cancelAtPeriodEnd: true }], + plans: [{ id: "author_monthly", amount: 500, currency: "eur", interval: "month" }] }, + }); + const panel = ui.window.document.querySelector("#settings-billing"); + expect(panel.textContent).to.include("Renewal cancelled"); + expect(panel.textContent).to.include("Manage billing"); + expect(panel.textContent).not.to.include("View Author plan"); + expect(panel.querySelector(".billing-plan")).to.equal(null); + expect(ui.window.document.querySelector(".nav-upgrade")).to.equal(null); + expect(ui.errors).to.deep.equal([]); + }); + + it("requires the account name before submitting account deletion", async () => { + ui = await browser("/profile", { "/api/user": { username: "owner" }, "/api/user/": {} }); + ui.window.document.querySelectorAll(".settings-nav button")[2].click(); await delay(10); + ui.window.document.querySelector(".paper-danger-zone button").click(); await delay(10); + const confirmation = ui.window.document.querySelector("#delete-username"); + const button = ui.window.document.querySelector(".settings-delete-confirm .btn-outline-danger"); + expect(button.disabled).to.equal(true); + confirmation.value = "wrong"; confirmation.dispatchEvent(new ui.window.Event("input", { bubbles: true })); await delay(10); + expect(button.disabled).to.equal(true); + confirmation.value = "owner"; confirmation.dispatchEvent(new ui.window.Event("input", { bubbles: true })); await delay(10); + expect(button.disabled).to.equal(false); + expect(ui.requests.some(r => r.method === "DELETE")).to.equal(false); + expect(ui.errors).to.deep.equal([]); + }); + + it("opens the plan comparison from the global header on another page", async () => { + ui = await browser("/dashboard", { + "/api/user": { username: "author" }, + "/api/billing/": { enabled: true, csrf: "token", grants: [], allowance: { repositories: 5, storage: 2147483648 }, plans: [{ id: "author_monthly", amount: 500, currency: "eur", interval: "month", repositories: 20, storage: 10737418240 }] }, + }); + const upgrade = ui.window.document.querySelector(".app-header .nav-upgrade"); + expect(upgrade).not.to.equal(null); + expect(ui.window.document.querySelector(".nav-support")).not.to.equal(null); + upgrade.click(); await delay(100); + expect(ui.window.document.querySelector(".settings-comparison")).not.to.equal(null); + expect(ui.window.document.querySelectorAll(".settings-nav button")[1].getAttribute("aria-current")).to.equal("page"); + expect(ui.errors).to.deep.equal([]); + }); + + it("shows subscription cadence and sends a protected checkout request", async () => { + ui = await browser("/profile", { + "/api/user": { username: "author" }, + "/api/billing/": { enabled: true, csrf: "billing-token", portal: true, grants: [], allowance: { repositories: 3, storage: 512 }, plans: [ + { id: "author_monthly", name: "Author monthly", description: "Renews monthly. Cancel renewal at any time.", amount: 500, currency: "eur", interval: "month", intervalCount: 1, repositories: 20, storage: 10737418240 }, + ] }, + "/api/billing/checkout": { __status: 409, body: { error: "billing_subscription_exists" } }, + }); + ui.window.document.querySelector(".nav-upgrade").click(); + await delay(10); + expect(ui.window.document.activeElement.id).to.equal("settings-plan-comparison"); + expect(ui.window.document.querySelector(".settings-comparison").textContent).to.include("Scheduled or never"); + expect(ui.window.document.querySelectorAll(".settings-nav button")[1].getAttribute("aria-current")).to.equal("page"); + expect(ui.window.document.querySelector("#settings-billing").textContent).to.include("/ month"); + expect(ui.window.document.querySelector("#settings-billing").textContent).to.include("10 GiB"); + ui.window.document.querySelector(".billing-plan button").click(); + await delay(30); + const request = ui.requests.find(r => r.url.pathname === "/api/billing/checkout"); + expect(request.payload).to.deep.equal({ planId: "author_monthly", target: "" }); + expect(request.headers["x-csrf-token"]).to.equal("billing-token"); + expect(ui.window.document.querySelector("#settings-billing [role=alert]").textContent).to.include("already have a subscription"); + expect(ui.errors).to.deep.equal([]); + }); + + it("refreshes the quota panel when checkout confirmation changes the allowance", async () => { + let confirmed = false; + let quotaReads = 0; + ui = await browser("/profile?billing=success", { + "/api/user": { username: "author" }, + "/api/billing/": () => ({ enabled: true, csrf: "billing-token", grants: [], plans: [], allowance: { repositories: confirmed ? 20 : 5, storage: confirmed ? 10737418240 : 2147483648 } }), + "/api/user/quota": () => { quotaReads++; return { repository: { used: 1, total: confirmed ? 20 : 5 }, storage: { used: 128, total: confirmed ? 10737418240 : 2147483648 } }; }, + "/api/billing/refresh": async () => { await delay(60); confirmed = true; return { ok: true, pending: false }; }, + }); + await delay(150); + expect(quotaReads).to.equal(2); + expect(ui.window.document.querySelector("#settings-billing").textContent).to.include("20 repositories"); + expect(ui.window.document.querySelector("#settings-quota").textContent).to.match(/\/\s*20/); + expect(ui.errors).to.deep.equal([]); + }); + + it("offers payment for a pending conference without activating it in the browser", async () => { + ui = await browser("/conference/CONF", { + "/api/user": { username: "chair" }, + "/api/conferences/CONF": { conferenceID: "CONF", name: "Research conference", status: "pending_payment", repositories: [], plan: { planID: "conference" } }, + "/api/billing/": { enabled: true, csrf: "billing-token", grants: [], plans: [{ id: "conference", amount: 19900, currency: "eur", repositories: 100, storage: 1000 }] }, + "/api/billing/checkout": { __status: 400, body: { error: "billing_invalid_conference" } }, + }); + const section = ui.window.document.querySelector('[aria-labelledby="conference-payment-heading"]'); + expect(section.textContent).to.include("waiting for payment"); + section.querySelector("button").click(); + await delay(30); + expect(ui.requests.find(r => r.url.pathname === "/api/billing/checkout").payload).to.deep.equal({ planId: "conference", target: "CONF" }); + expect(section.textContent).to.include("Only a conference owner"); + expect(ui.errors).to.deep.equal([]); + }); + const repositorySource = { "/api/user": { username: "owner" }, "/api/user/default": { terms: ["Default Author"], options: {} }, @@ -89,6 +209,135 @@ describe("Vue 3 UI", function () { "/api/anonymize-preview": request => ({ content: request.payload.content.replaceAll("Private Author", "MASKED") }), }; + const taskBilling = { enabled: true, csrf: "token", allowance: { plan: "free", repositories: 5 }, plans: [ + { id: "author_monthly", amount: 500, currency: "eur", interval: "month", repositories: 20, storage: 10737418240, description: "Renews monthly." }, + ] }; + it("saves the repository draft before contextual checkout and preserves a failed checkout", async () => { + ui = await browser("/anonymize", { ...repositorySource, + "/api/billing/": taskBilling, "/api/user/quota": { repository: { used: 5, total: 5 } }, + "/api/billing/draft": { id: "saved-task" }, + "/api/billing/checkout": { __status: 503, body: { error: "billing_unavailable" } }, + }); + const state = ui.window.document.querySelector("#sourceUrl")._field.binding.state; + state.sourceUrl = "https://github.com/owner/repo"; + await state.urlSelected(); await delay(60); + await ui.input("#terms", "Uncommitted redaction"); + await state.checkoutRepository(); + const saved = ui.requests.find(r => r.method === "POST" && r.url.pathname === "/api/billing/draft"); + expect(saved.payload.path).to.equal("/anonymize"); + expect(saved.payload.values.terms).to.equal("Uncommitted redaction"); + const checkout = ui.requests.find(r => r.url.pathname === "/api/billing/checkout"); + expect(checkout.payload.draftId).to.equal("saved-task"); + expect(state.terms).to.equal("Uncommitted redaction"); + expect(state.billingError).to.include("not available"); + expect(ui.requests.some(r => r.method === "POST" && r.url.pathname === "/api/repo/")).to.equal(false); + expect(ui.errors).to.deep.equal([]); + }); + it("restores a paid checkout task without submitting it and rechecks the allowance", async () => { + ui = await browser("/anonymize?billingDraft=saved-task&billing=success", { ...repositorySource, + "/api/billing/": { ...taskBilling, allowance: { plan: "author_monthly", repositories: 20 } }, + "/api/billing/refresh": { ok: true, pending: false }, + "/api/billing/draft/saved-task": { id: "saved-task", path: "/anonymize", values: { sourceUrl: "https://github.com/owner/repo", terms: "Restored Author", repoId: "saved-repo", source: { branch: "main" }, options: { expirationMode: "never" } } }, + }); + await delay(150); + expect(ui.window.document.querySelector("#sourceUrl")._field.binding.state.terms).to.equal("Restored Author"); + expect(ui.window.document.querySelector("#sourceUrl")._field.binding.state.repoId).to.equal("saved-repo"); + expect(ui.app.router.currentRoute.value.query).to.deep.equal({}); + expect(ui.window.document.querySelector("#sourceUrl")._field.binding.state.hostingNeedsPayment()).to.equal(false); + expect(ui.window.document.querySelector("#repository-hosting").textContent).to.include("subscription is active"); + expect(ui.requests.some(r => r.method === "POST" && r.url.pathname === "/api/repo/")).to.equal(false); + expect(ui.errors).to.deep.equal([]); + }); + it("keeps all settings and the live preview visible in the split workspace", async () => { + ui = await browser("/anonymize", { ...repositorySource, "/api/billing/": taskBilling, + "/api/user/quota": { repository: { used: 5, total: 5 } } }); + const doc = ui.window.document; + const state = doc.querySelector("#sourceUrl")._field.binding.state; + state.sourceUrl = "https://github.com/owner/repo"; + await state.urlSelected(); await delay(60); + expect(doc.querySelector('.repository-task')).to.equal(null); + for (const selector of ['#sourceUrl', '#terms', '#image', '#conference', '#expirationDate']) { + expect(doc.querySelector(selector).closest('details')).to.equal(null); + } + state.terms = "Private Author"; + await delay(450); + expect(doc.querySelector('.anonymize-preview-body').textContent).to.include("MASKED"); + expect(doc.querySelector('.anonymize-preview-body').textContent).not.to.include("Private Author"); + expect(doc.querySelector('.subscription-choice').textContent).to.include("20 repositories"); + expect(doc.querySelector('.anonymize-submit-bar').textContent).to.include("Continue to checkout"); + doc.querySelector('.preview-expand').click(); await delay(10); + expect(doc.querySelector('.anonymize-page').classList.contains('preview-expanded')).to.equal(true); + doc.querySelector('.preview-expand').click(); await delay(10); + expect(state.terms).to.equal("Private Author"); + expect(ui.requests.some(r => r.method === "POST" && r.url.pathname === "/api/repo/")).to.equal(false); + expect(ui.errors).to.deep.equal([]); + }); + + it("keeps checkout failures and pending payment in the editor without losing input", async () => { + ui = await browser("/anonymize", { ...repositorySource, "/api/billing/": taskBilling, + "/api/user/quota": { repository: { used: 5, total: 5 } }, + "/api/billing/draft": { id: "saved-task" }, + "/api/billing/checkout": { __status: 503, body: { error: "billing_unavailable" } } }); + const doc = ui.window.document; + const state = doc.querySelector("#sourceUrl")._field.binding.state; + state.sourceUrl = "https://github.com/owner/repo"; + await state.urlSelected(); await delay(60); + expect(doc.querySelector("#expirationDate").value).to.match(/^\d{4}-\d{2}-\d{2}$/); + await ui.input("#terms", "Preserved Author"); + doc.querySelector(".anonymize-submit-bar button").click(); await delay(80); + expect(doc.querySelector("#repository-hosting").textContent).to.include("Payments are not available"); + expect(state.terms).to.equal("Preserved Author"); + expect(ui.requests.find(r => r.url.pathname === "/api/billing/draft").payload.values.terms).to.equal("Preserved Author"); + state.billingPending = true; await delay(20); + expect(doc.querySelector("#repository-hosting").textContent).to.include("Confirming your payment"); + expect(doc.querySelector(".subscription-choice")).to.equal(null); + expect(doc.querySelector(".anonymize-submit-bar button").textContent).to.equal("Check payment status"); + const checkoutCount = ui.requests.filter(r => r.url.pathname === "/api/billing/checkout").length; + await state.submitRepository({}); + expect(ui.requests.filter(r => r.url.pathname === "/api/billing/checkout")).to.have.length(checkoutCount); + expect(ui.errors).to.deep.equal([]); + }); + + for (const status of ["preparing", "ready", "error"]) { + it(`keeps the task summary through repository ${status} without a premature ready link`, async () => { + ui = await browser("/status/saved", { "/api/repo/saved": { repoId: "saved", status, + source: { fullName: "owner/repo" }, options: { expirationMode: "never" } } }); + const doc = ui.window.document; + expect(doc.querySelector('.task-trail [aria-current="step"]').textContent).to.include("Review link"); + expect(doc.querySelector(".task-summary").textContent).to.include("owner/repo"); + expect(!!doc.querySelector(".task-ready")).to.equal(status === "ready"); + expect(!!doc.querySelector('.task-preparation a[href="/r/saved/"]')).to.equal(status === "ready"); + expect(ui.errors).to.deep.equal([]); + }); + } + + it("keeps free, conference and coauthor work out of author checkout", async () => { + ui = await browser("/anonymize", { ...repositorySource, "/api/billing/": taskBilling }); + const state = ui.window.document.querySelector("#sourceUrl")._field.binding.state; state.detectedType = "repo"; + state.hostingQuota = { repository: { used: 1, total: 5 } }; + expect(state.hostingNeedsPayment()).to.equal(false); + state.hostingQuota.repository.used = 5; + expect(state.hostingNeedsPayment()).to.equal(true); + state.conference = "CONF"; + expect(state.hostingNeedsPayment()).to.equal(false); + state.options.expirationMode = "never"; + expect(state.hostingNeedsPayment()).to.equal(true); + state.isUpdate = true; state.role = "coauthor"; + expect(state.hostingNeedsPayment()).to.equal(false); + }); + it("refreshes the conference in place after checkout confirmation", async () => { + let confirmed = false; + ui = await browser("/conference/CONF?billing=success", { "/api/user": { username: "chair" }, + "/api/billing/": taskBilling, + "/api/billing/refresh": () => { confirmed = true; return { ok: true, pending: false }; }, + "/api/conferences/CONF": () => ({ conferenceID: "CONF", name: "Conference", status: confirmed ? "ready" : "pending_payment", repositories: [] }), + }); + await delay(80); + expect(ui.window.document.body.textContent).to.include("Ready"); + expect(ui.window.document.querySelector('[aria-labelledby="conference-payment-heading"]')).to.equal(null); + expect(ui.errors).to.deep.equal([]); + }); + it("keeps the current repository when earlier metadata and README responses arrive late", async () => { let finishMetadata, finishReadme; ui = await browser("/anonymize", { @@ -309,7 +558,7 @@ describe("Vue 3 UI", function () { [...preview().querySelectorAll("button")].find(b => b.textContent === "Retry preview").click(); await delay(260); expect(preview().textContent).to.include("MASKED"); - expect(preview().textContent).to.include("redactions applied"); + expect(preview().querySelector(".anonymize-preview-body")).not.to.equal(null); expect(ui.errors).to.deep.equal([]); }); } @@ -756,7 +1005,7 @@ describe("Vue 3 UI", function () { "/api/repo/owner/repo/branches": [{ name: "main", commit: "abcdef123" }], "/api/repo/owner/repo/readme": "", }); - const button = [...ui.window.document.querySelectorAll("button")].find(b => b.textContent.includes("Update ")); + const button = [...ui.window.document.querySelectorAll("button")].find(b => b.textContent.includes(type === "repo" ? "Save changes" : "Update ")); const posts = () => ui.requests.filter(r => r.method === "POST" && r.url.pathname === endpoint); button.click(); await delay(10); diff --git a/test/zip-proxy-errors.test.js b/test/zip-proxy-errors.test.js index 626e081..75efe26 100644 --- a/test/zip-proxy-errors.test.js +++ b/test/zip-proxy-errors.test.js @@ -43,7 +43,7 @@ describe("ZIP proxy failures", function () { return http.get(`http://127.0.0.1:${server.address().port}/test/zip`, { headers }, onResponse); } it("answers HEAD without counting a view, obtaining a token or starting a ZIP stream", async function () { - utils.getRepo = async () => ({ repoId: "test", countView: () => { throw Error("view counted"); }, + utils.getRepo = async () => ({ repoId: "test", model: {}, countView: () => { throw Error("view counted"); }, getToken: () => { throw Error("token requested"); }, generateAnonymizeTransformer: () => { throw Error("transform requested"); } }); got.stream = () => { throw Error("archive requested"); }; const result = await new Promise((resolve, reject) => {