@commonpub/server 2.89.0 → 2.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.d.ts.map +1 -1
- package/dist/admin/admin.js +4 -5
- package/dist/admin/admin.js.map +1 -1
- package/dist/content/content.d.ts +0 -5
- package/dist/content/content.d.ts.map +1 -1
- package/dist/content/content.js +118 -122
- package/dist/content/content.js.map +1 -1
- package/dist/content/index.d.ts +1 -1
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -1
- package/dist/content/index.js.map +1 -1
- package/dist/contest/contest.d.ts +2 -308
- package/dist/contest/contest.d.ts.map +1 -1
- package/dist/contest/contest.js +93 -878
- package/dist/contest/contest.js.map +1 -1
- package/dist/contest/entries.d.ts +41 -0
- package/dist/contest/entries.d.ts.map +1 -0
- package/dist/contest/entries.js +285 -0
- package/dist/contest/entries.js.map +1 -0
- package/dist/contest/export.d.ts +20 -0
- package/dist/contest/export.d.ts.map +1 -0
- package/dist/contest/export.js +131 -0
- package/dist/contest/export.js.map +1 -0
- package/dist/contest/index.d.ts +11 -2
- package/dist/contest/index.d.ts.map +1 -1
- package/dist/contest/index.js +8 -1
- package/dist/contest/index.js.map +1 -1
- package/dist/contest/judges.js +9 -8
- package/dist/contest/judges.js.map +1 -1
- package/dist/contest/judging.d.ts +38 -0
- package/dist/contest/judging.d.ts.map +1 -0
- package/dist/contest/judging.js +274 -0
- package/dist/contest/judging.js.map +1 -0
- package/dist/contest/read.d.ts +44 -0
- package/dist/contest/read.d.ts.map +1 -0
- package/dist/contest/read.js +167 -0
- package/dist/contest/read.js.map +1 -0
- package/dist/contest/stages.d.ts +28 -0
- package/dist/contest/stages.d.ts.map +1 -0
- package/dist/contest/stages.js +52 -0
- package/dist/contest/stages.js.map +1 -0
- package/dist/contest/submissions.d.ts +90 -0
- package/dist/contest/submissions.d.ts.map +1 -0
- package/dist/contest/submissions.js +275 -0
- package/dist/contest/submissions.js.map +1 -0
- package/dist/contest/types.d.ts +207 -0
- package/dist/contest/types.d.ts.map +1 -0
- package/dist/contest/types.js +2 -0
- package/dist/contest/types.js.map +1 -0
- package/dist/contest/validation.d.ts +32 -0
- package/dist/contest/validation.d.ts.map +1 -0
- package/dist/contest/validation.js +132 -0
- package/dist/contest/validation.js.map +1 -0
- package/dist/docs/docs.d.ts +9 -3
- package/dist/docs/docs.d.ts.map +1 -1
- package/dist/docs/docs.js +16 -6
- package/dist/docs/docs.js.map +1 -1
- package/dist/events/events.d.ts.map +1 -1
- package/dist/events/events.js +12 -6
- package/dist/events/events.js.map +1 -1
- package/dist/federation/activityDedup.d.ts +14 -0
- package/dist/federation/activityDedup.d.ts.map +1 -0
- package/dist/federation/activityDedup.js +34 -0
- package/dist/federation/activityDedup.js.map +1 -0
- package/dist/federation/assertPublicHost.d.ts +14 -0
- package/dist/federation/assertPublicHost.d.ts.map +1 -0
- package/dist/federation/assertPublicHost.js +62 -0
- package/dist/federation/assertPublicHost.js.map +1 -0
- package/dist/federation/delivery.d.ts.map +1 -1
- package/dist/federation/delivery.js +37 -51
- package/dist/federation/delivery.js.map +1 -1
- package/dist/federation/federation.d.ts.map +1 -1
- package/dist/federation/federation.js +11 -7
- package/dist/federation/federation.js.map +1 -1
- package/dist/federation/hubMirroring.d.ts.map +1 -1
- package/dist/federation/hubMirroring.js +85 -66
- package/dist/federation/hubMirroring.js.map +1 -1
- package/dist/federation/inboxHandlers.d.ts.map +1 -1
- package/dist/federation/inboxHandlers.js +84 -73
- package/dist/federation/inboxHandlers.js.map +1 -1
- package/dist/federation/inboxParsing.d.ts +28 -0
- package/dist/federation/inboxParsing.d.ts.map +1 -0
- package/dist/federation/inboxParsing.js +71 -0
- package/dist/federation/inboxParsing.js.map +1 -0
- package/dist/federation/index.d.ts +2 -0
- package/dist/federation/index.d.ts.map +1 -1
- package/dist/federation/index.js +2 -0
- package/dist/federation/index.js.map +1 -1
- package/dist/federation/mastodonLogin.d.ts.map +1 -1
- package/dist/federation/mastodonLogin.js +19 -0
- package/dist/federation/mastodonLogin.js.map +1 -1
- package/dist/federation/outboxQueries.js +1 -1
- package/dist/federation/outboxQueries.js.map +1 -1
- package/dist/federation/timeline.d.ts +11 -0
- package/dist/federation/timeline.d.ts.map +1 -1
- package/dist/federation/timeline.js +101 -69
- package/dist/federation/timeline.js.map +1 -1
- package/dist/hub/hub.d.ts.map +1 -1
- package/dist/hub/hub.js +41 -3
- package/dist/hub/hub.js.map +1 -1
- package/dist/hub/index.d.ts +1 -1
- package/dist/hub/index.d.ts.map +1 -1
- package/dist/hub/index.js +1 -1
- package/dist/hub/index.js.map +1 -1
- package/dist/hub/members.d.ts +19 -0
- package/dist/hub/members.d.ts.map +1 -1
- package/dist/hub/members.js +158 -13
- package/dist/hub/members.js.map +1 -1
- package/dist/hub/moderation.d.ts +1 -1
- package/dist/hub/moderation.d.ts.map +1 -1
- package/dist/hub/moderation.js +25 -11
- package/dist/hub/moderation.js.map +1 -1
- package/dist/hub/posts.d.ts.map +1 -1
- package/dist/hub/posts.js +18 -10
- package/dist/hub/posts.js.map +1 -1
- package/dist/hub/resources.js +2 -2
- package/dist/hub/resources.js.map +1 -1
- package/dist/identity/mastodonFactory.d.ts.map +1 -1
- package/dist/identity/mastodonFactory.js +7 -0
- package/dist/identity/mastodonFactory.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/learning/learning.d.ts.map +1 -1
- package/dist/learning/learning.js +42 -22
- package/dist/learning/learning.js.map +1 -1
- package/dist/messaging/messaging.d.ts.map +1 -1
- package/dist/messaging/messaging.js +3 -3
- package/dist/messaging/messaging.js.map +1 -1
- package/dist/notification/notification.d.ts.map +1 -1
- package/dist/notification/notification.js +4 -2
- package/dist/notification/notification.js.map +1 -1
- package/dist/product/product.d.ts.map +1 -1
- package/dist/product/product.js +75 -37
- package/dist/product/product.js.map +1 -1
- package/dist/profile/index.d.ts +2 -1
- package/dist/profile/index.d.ts.map +1 -1
- package/dist/profile/index.js +1 -1
- package/dist/profile/index.js.map +1 -1
- package/dist/profile/profile.d.ts +24 -2
- package/dist/profile/profile.d.ts.map +1 -1
- package/dist/profile/profile.js +34 -8
- package/dist/profile/profile.js.map +1 -1
- package/dist/query.d.ts +18 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +24 -6
- package/dist/query.js.map +1 -1
- package/dist/rbac/seed.d.ts +1 -1
- package/dist/rbac/seed.d.ts.map +1 -1
- package/dist/rbac/seed.js +1 -0
- package/dist/rbac/seed.js.map +1 -1
- package/dist/search/contentSearch.d.ts +1 -1
- package/dist/search/contentSearch.d.ts.map +1 -1
- package/dist/search/contentSearch.js +22 -12
- package/dist/search/contentSearch.js.map +1 -1
- package/dist/social/social.d.ts +4 -2
- package/dist/social/social.d.ts.map +1 -1
- package/dist/social/social.js +25 -8
- package/dist/social/social.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/video/video.d.ts +3 -0
- package/dist/video/video.d.ts.map +1 -1
- package/dist/video/video.js +17 -13
- package/dist/video/video.js.map +1 -1
- package/dist/voting/voting.d.ts.map +1 -1
- package/dist/voting/voting.js +39 -1
- package/dist/voting/voting.js.map +1 -1
- package/package.json +9 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/contest/export.ts"],"names":[],"mappings":"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"}
|
package/dist/contest/index.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export
|
|
1
|
+
export { createContest, canCreateContest, updateContest, deleteContest, transitionContestStatus, } from './contest.js';
|
|
2
|
+
export { listContests, getContestBySlug, canViewContest, shouldRevealScores, } from './read.js';
|
|
3
|
+
export { listContestEntries, getContestEntry, submitContestEntry, withdrawContestEntry, calculateContestRanks, } from './entries.js';
|
|
4
|
+
export { synthesizeStages, normalizeStages, currentStage, isEliminated, } from './stages.js';
|
|
5
|
+
export { judgeContestEntry, advanceContestStage, } from './judging.js';
|
|
6
|
+
export { validateStageArtifactFields, validateSubmissionFields, hashTerms, } from './validation.js';
|
|
7
|
+
export { submitStageArtifact, recordPrivateAndAgreements, submitContestProposal, getEntryPrivateData, } from './submissions.js';
|
|
8
|
+
export { buildContestExport, toCsv } from './export.js';
|
|
9
|
+
export type { ContestExport } from './export.js';
|
|
10
|
+
export type { ContestListItem, ContestDetail, ContestFilters, CreateContestInput, ContestEntryItem, AdvanceStageInput, ContestPrize, ContestJudgingCriterion, ContestJudgingVisibility, ContestVisibility, CriterionScore, JudgeScoreEntry, PartitionedSubmission, AgreementAcceptanceInput, StageSource, ContestTx, } from './types.js';
|
|
11
|
+
export type { SubmitProposalArgs, SubmitProposalResult, EntryPrivateData, } from './submissions.js';
|
|
3
12
|
export { listContestJudges, addContestJudge, removeContestJudge, updateJudgeRole, acceptJudgeInvite, isContestJudge, } from './judges.js';
|
|
4
13
|
export type { JudgeRole, ContestJudgeItem, } from './judges.js';
|
|
5
14
|
export { listContestStakeholders, addContestStakeholder, removeContestStakeholder, isContestStakeholder, isContestEditor, } from './stakeholders.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,YAAY,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/contest/index.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createContest, canCreateContest, updateContest, deleteContest, transitionContestStatus, } from './contest.js';
|
|
2
|
+
export { listContests, getContestBySlug, canViewContest, shouldRevealScores, } from './read.js';
|
|
3
|
+
export { listContestEntries, getContestEntry, submitContestEntry, withdrawContestEntry, calculateContestRanks, } from './entries.js';
|
|
4
|
+
export { synthesizeStages, normalizeStages, currentStage, isEliminated, } from './stages.js';
|
|
5
|
+
export { judgeContestEntry, advanceContestStage, } from './judging.js';
|
|
6
|
+
export { validateStageArtifactFields, validateSubmissionFields, hashTerms, } from './validation.js';
|
|
7
|
+
export { submitStageArtifact, recordPrivateAndAgreements, submitContestProposal, getEntryPrivateData, } from './submissions.js';
|
|
8
|
+
export { buildContestExport, toCsv } from './export.js';
|
|
2
9
|
export { listContestJudges, addContestJudge, removeContestJudge, updateJudgeRole, acceptJudgeInvite, isContestJudge, } from './judges.js';
|
|
3
10
|
export { listContestStakeholders, addContestStakeholder, removeContestStakeholder, isContestStakeholder, isContestEditor, } from './stakeholders.js';
|
|
4
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA4BxD,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
|
package/dist/contest/judges.js
CHANGED
|
@@ -43,15 +43,16 @@ export async function addContestJudge(db, contestId, userId, role = 'judge', con
|
|
|
43
43
|
.limit(1);
|
|
44
44
|
if (!user)
|
|
45
45
|
return { added: false, error: 'User not found' };
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
.
|
|
51
|
-
.
|
|
52
|
-
|
|
46
|
+
// Race-safe add: rely on the unique (contestId,userId) constraint via
|
|
47
|
+
// onConflictDoNothing instead of a check-then-insert, which could race a
|
|
48
|
+
// concurrent double-invite into a 500. No inserted row ⇒ already a judge.
|
|
49
|
+
const [inserted] = await db
|
|
50
|
+
.insert(contestJudges)
|
|
51
|
+
.values({ contestId, userId, role })
|
|
52
|
+
.onConflictDoNothing()
|
|
53
|
+
.returning({ id: contestJudges.id });
|
|
54
|
+
if (!inserted)
|
|
53
55
|
return { added: false, error: 'User is already a judge' };
|
|
54
|
-
await db.insert(contestJudges).values({ contestId, userId, role });
|
|
55
56
|
// Notify the invited judge (non-critical)
|
|
56
57
|
if (context) {
|
|
57
58
|
createNotification(db, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judges.js","sourceRoot":"","sources":["../../src/contest/judges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAgBrE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC;QACN,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE;YACJ,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAC;SACD,IAAI,CAAC,aAAa,CAAC;SACnB,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;SACpD,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ;QAC3C,YAAY,EAAE,IAAI,CAAC,QAAQ;QAC3B,UAAU,EAAE,IAAI,CAAC,SAAS;KAC3B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAM,EACN,SAAiB,EACjB,MAAc,EACd,OAAkB,OAAO,EACzB,OAA0E;IAE1E,wBAAwB;IACxB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;SACvB,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;SAC3B,IAAI,CAAC,QAAQ,CAAC;SACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;SACjC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAElE,qBAAqB;IACrB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;SACxB,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAE5D,
|
|
1
|
+
{"version":3,"file":"judges.js","sourceRoot":"","sources":["../../src/contest/judges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DB } from '../types.js';
|
|
2
|
+
import type { ContestJudgingCriterion, CriterionScore, AdvanceStageInput } from './types.js';
|
|
3
|
+
/** A rubric criterion's max points: its `weight` when set (>0), else 100. */
|
|
4
|
+
export declare function rubricCriterionMax(c: ContestJudgingCriterion): number;
|
|
5
|
+
/**
|
|
6
|
+
* B3 — validate per-criterion scores against the RESOLVED rubric and compute the
|
|
7
|
+
* normalized overall (0–100) using the rubric's maxes, NOT the client-supplied
|
|
8
|
+
* `max` (which a tampering client could inflate to skew the weighted sum). Pure +
|
|
9
|
+
* testable. Rejects unknown criteria, missing criteria, and out-of-range scores.
|
|
10
|
+
* Returns the normalized criteriaScores (with rubric-authoritative `max`) to store.
|
|
11
|
+
*/
|
|
12
|
+
export declare function scoreAgainstRubric(rubric: ContestJudgingCriterion[] | null | undefined, submitted: CriterionScore[]): {
|
|
13
|
+
ok: true;
|
|
14
|
+
overall: number;
|
|
15
|
+
normalized: CriterionScore[];
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
error: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function judgeContestEntry(db: DB, entryId: string, score: number | undefined, judgeId: string, feedback?: string, criteriaScores?: CriterionScore[], expectedContestId?: string): Promise<{
|
|
21
|
+
judged: boolean;
|
|
22
|
+
error?: string;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Phase B2 — apply an advancement cut at a review stage: the surviving cohort
|
|
26
|
+
* (entries not already eliminated) is split into advancers + eliminated, the
|
|
27
|
+
* round's score/rank is snapshotted into each entry's `stageState`, and the
|
|
28
|
+
* contest's `currentStageId` moves to the next stage. Idempotent per stage —
|
|
29
|
+
* re-running replaces that stage's `stageState` rows rather than duplicating them.
|
|
30
|
+
* Owner-gated. `topN` ties broken by score → rank → id for determinism.
|
|
31
|
+
*/
|
|
32
|
+
export declare function advanceContestStage(db: DB, contestId: string, userId: string, input: AdvanceStageInput, canManage?: boolean): Promise<{
|
|
33
|
+
advanced: boolean;
|
|
34
|
+
advancedCount: number;
|
|
35
|
+
eliminatedCount: number;
|
|
36
|
+
error?: string;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=judging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judging.d.ts","sourceRoot":"","sources":["../../src/contest/judging.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAmB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9G,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,uBAAuB,GAAG,MAAM,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,GAAG,SAAS,EACpD,SAAS,EAAE,cAAc,EAAE,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAuB5F;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,cAAc,EAAE,EACjC,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqI9C;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,EACxB,SAAS,UAAQ,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqGhG"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { eq, and } from 'drizzle-orm';
|
|
2
|
+
import { contests, contestEntries, contestJudges } from '@commonpub/schema';
|
|
3
|
+
import { isContestEditor } from './stakeholders.js';
|
|
4
|
+
import { currentStage, normalizeStages, isEliminated } from './stages.js';
|
|
5
|
+
/** A rubric criterion's max points: its `weight` when set (>0), else 100. */
|
|
6
|
+
export function rubricCriterionMax(c) {
|
|
7
|
+
return typeof c.weight === 'number' && c.weight > 0 ? c.weight : 100;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* B3 — validate per-criterion scores against the RESOLVED rubric and compute the
|
|
11
|
+
* normalized overall (0–100) using the rubric's maxes, NOT the client-supplied
|
|
12
|
+
* `max` (which a tampering client could inflate to skew the weighted sum). Pure +
|
|
13
|
+
* testable. Rejects unknown criteria, missing criteria, and out-of-range scores.
|
|
14
|
+
* Returns the normalized criteriaScores (with rubric-authoritative `max`) to store.
|
|
15
|
+
*/
|
|
16
|
+
export function scoreAgainstRubric(rubric, submitted) {
|
|
17
|
+
if (!rubric || rubric.length === 0) {
|
|
18
|
+
return { ok: false, error: 'This contest has no judging rubric for this round; submit a single score' };
|
|
19
|
+
}
|
|
20
|
+
const rubricLabels = new Set(rubric.map((c) => c.label));
|
|
21
|
+
for (const s of submitted) {
|
|
22
|
+
if (!rubricLabels.has(s.label))
|
|
23
|
+
return { ok: false, error: `Unknown criterion: ${s.label}` };
|
|
24
|
+
}
|
|
25
|
+
const byLabel = new Map(submitted.map((s) => [s.label, s]));
|
|
26
|
+
const normalized = [];
|
|
27
|
+
let totalScore = 0;
|
|
28
|
+
let totalMax = 0;
|
|
29
|
+
for (const c of rubric) {
|
|
30
|
+
const max = rubricCriterionMax(c);
|
|
31
|
+
const s = byLabel.get(c.label);
|
|
32
|
+
if (!s)
|
|
33
|
+
return { ok: false, error: `Missing score for ${c.label}` };
|
|
34
|
+
if (s.score < 0 || s.score > max)
|
|
35
|
+
return { ok: false, error: `${c.label} score must be between 0 and ${max}` };
|
|
36
|
+
normalized.push({ label: c.label, score: s.score, max }); // rubric max is authoritative
|
|
37
|
+
totalScore += s.score;
|
|
38
|
+
totalMax += max;
|
|
39
|
+
}
|
|
40
|
+
if (totalMax <= 0)
|
|
41
|
+
return { ok: false, error: 'Invalid judging rubric' };
|
|
42
|
+
return { ok: true, overall: Math.round((totalScore / totalMax) * 100), normalized };
|
|
43
|
+
}
|
|
44
|
+
export async function judgeContestEntry(db, entryId, score, judgeId, feedback, criteriaScores, expectedContestId) {
|
|
45
|
+
// Get the entry and its contest (read-only validation, no lock needed).
|
|
46
|
+
const existing = await db
|
|
47
|
+
.select({
|
|
48
|
+
contestStatus: contests.status,
|
|
49
|
+
contestId: contests.id,
|
|
50
|
+
entrantId: contestEntries.userId,
|
|
51
|
+
stageState: contestEntries.stageState,
|
|
52
|
+
stages: contests.stages,
|
|
53
|
+
currentStageId: contests.currentStageId,
|
|
54
|
+
judgingCriteria: contests.judgingCriteria,
|
|
55
|
+
startDate: contests.startDate,
|
|
56
|
+
endDate: contests.endDate,
|
|
57
|
+
judgingEndDate: contests.judgingEndDate,
|
|
58
|
+
})
|
|
59
|
+
.from(contestEntries)
|
|
60
|
+
.innerJoin(contests, eq(contestEntries.contestId, contests.id))
|
|
61
|
+
.where(eq(contestEntries.id, entryId))
|
|
62
|
+
.limit(1);
|
|
63
|
+
if (existing.length === 0)
|
|
64
|
+
return { judged: false, error: 'Entry not found' };
|
|
65
|
+
const row = existing[0];
|
|
66
|
+
// B5a — when the caller resolved the contest from the route `:slug`, the entry
|
|
67
|
+
// must belong to THAT contest. The route `/contests/:slug/judge` otherwise
|
|
68
|
+
// ignored its slug and judged purely by entryId, a misleading contract (not an
|
|
69
|
+
// escalation, since the judge-authorization gate below is contest-scoped, but
|
|
70
|
+
// the route claims slug-scoping it never enforced).
|
|
71
|
+
if (expectedContestId && row.contestId !== expectedContestId) {
|
|
72
|
+
return { judged: false, error: 'Entry does not belong to this contest' };
|
|
73
|
+
}
|
|
74
|
+
// Check contest is in judging phase
|
|
75
|
+
if (row.contestStatus !== 'judging') {
|
|
76
|
+
return { judged: false, error: 'Contest is not in judging phase' };
|
|
77
|
+
}
|
|
78
|
+
// Cohort gate (Phase B2.5): once a review stage has culled the field, entries
|
|
79
|
+
// that didn't advance are out of later rounds and can't be scored.
|
|
80
|
+
if (isEliminated({ stageState: row.stageState })) {
|
|
81
|
+
return { judged: false, error: 'This entry was not advanced and can no longer be scored' };
|
|
82
|
+
}
|
|
83
|
+
// Per-round isolation: which review round is this score for? The entry's live
|
|
84
|
+
// `score` will aggregate only THIS round's judge scores (a classic contest with
|
|
85
|
+
// no explicit stages resolves to the synthesized `core-review`, so it stays one
|
|
86
|
+
// bucket — unchanged single-round behaviour).
|
|
87
|
+
const roundStage = currentStage({
|
|
88
|
+
status: row.contestStatus,
|
|
89
|
+
startDate: row.startDate,
|
|
90
|
+
endDate: row.endDate,
|
|
91
|
+
judgingEndDate: row.judgingEndDate,
|
|
92
|
+
stages: row.stages,
|
|
93
|
+
currentStageId: row.currentStageId,
|
|
94
|
+
});
|
|
95
|
+
const roundId = roundStage && roundStage.kind === 'review' ? roundStage.id : null;
|
|
96
|
+
// Conflict of interest: a judge cannot score their own entry.
|
|
97
|
+
if (row.entrantId === judgeId) {
|
|
98
|
+
return { judged: false, error: 'You cannot judge your own entry' };
|
|
99
|
+
}
|
|
100
|
+
// Check judge authorization via contestJudges table (accepted judges only)
|
|
101
|
+
const [judgeRecord] = await db
|
|
102
|
+
.select({ id: contestJudges.id, role: contestJudges.role, acceptedAt: contestJudges.acceptedAt })
|
|
103
|
+
.from(contestJudges)
|
|
104
|
+
.where(and(eq(contestJudges.contestId, row.contestId), eq(contestJudges.userId, judgeId)))
|
|
105
|
+
.limit(1);
|
|
106
|
+
if (!judgeRecord) {
|
|
107
|
+
return { judged: false, error: 'Not authorized to judge this contest' };
|
|
108
|
+
}
|
|
109
|
+
if (!judgeRecord.acceptedAt) {
|
|
110
|
+
return { judged: false, error: 'Judge invitation has not been accepted' };
|
|
111
|
+
}
|
|
112
|
+
if (judgeRecord.role === 'guest') {
|
|
113
|
+
return { judged: false, error: 'Guest judges cannot submit scores' };
|
|
114
|
+
}
|
|
115
|
+
// Derive the overall 0–100 score. When per-criterion scores are supplied, they
|
|
116
|
+
// are validated against the RESOLVED rubric (this round's `criteria`, else the
|
|
117
|
+
// contest-level `judgingCriteria`) and the overall is the normalized weighted
|
|
118
|
+
// sum computed with the RUBRIC's maxes (B3 — never trust the client `max`).
|
|
119
|
+
// Otherwise use the supplied holistic score.
|
|
120
|
+
let overall;
|
|
121
|
+
let storedCriteria;
|
|
122
|
+
if (criteriaScores && criteriaScores.length > 0) {
|
|
123
|
+
const rubric = (roundStage?.criteria ?? row.judgingCriteria ?? null);
|
|
124
|
+
const scored = scoreAgainstRubric(rubric, criteriaScores);
|
|
125
|
+
if (!scored.ok)
|
|
126
|
+
return { judged: false, error: scored.error };
|
|
127
|
+
overall = scored.overall;
|
|
128
|
+
storedCriteria = scored.normalized;
|
|
129
|
+
}
|
|
130
|
+
else if (typeof score === 'number') {
|
|
131
|
+
overall = score;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
return { judged: false, error: 'No score provided' };
|
|
135
|
+
}
|
|
136
|
+
// Atomic read-modify-write: lock the entry row so two judges scoring the same
|
|
137
|
+
// entry concurrently can't clobber each other's judgeScores (lost update).
|
|
138
|
+
return db.transaction(async (tx) => {
|
|
139
|
+
const [locked] = await tx
|
|
140
|
+
.select({ judgeScores: contestEntries.judgeScores })
|
|
141
|
+
.from(contestEntries)
|
|
142
|
+
.where(eq(contestEntries.id, entryId))
|
|
143
|
+
.for('update');
|
|
144
|
+
const scores = (locked?.judgeScores ?? []);
|
|
145
|
+
const record = { judgeId, score: overall, feedback };
|
|
146
|
+
if (storedCriteria)
|
|
147
|
+
record.criteriaScores = storedCriteria;
|
|
148
|
+
if (roundId)
|
|
149
|
+
record.roundId = roundId;
|
|
150
|
+
// A judge has one score per round — match on judge AND round.
|
|
151
|
+
const existingIdx = scores.findIndex((s) => s.judgeId === judgeId && (s.roundId ?? null) === (roundId ?? null));
|
|
152
|
+
if (existingIdx >= 0)
|
|
153
|
+
scores[existingIdx] = record;
|
|
154
|
+
else
|
|
155
|
+
scores.push(record);
|
|
156
|
+
// The live aggregate reflects ONLY the current round's scores, so a later
|
|
157
|
+
// judging round doesn't blend with an earlier one. Earlier rounds stay in
|
|
158
|
+
// `judgeScores` (tagged with their roundId) as history.
|
|
159
|
+
const roundScores = roundId ? scores.filter((s) => (s.roundId ?? null) === roundId) : scores;
|
|
160
|
+
const avgScore = roundScores.length
|
|
161
|
+
? Math.round(roundScores.reduce((sum, s) => sum + s.score, 0) / roundScores.length)
|
|
162
|
+
: 0;
|
|
163
|
+
await tx
|
|
164
|
+
.update(contestEntries)
|
|
165
|
+
.set({ judgeScores: scores, score: avgScore })
|
|
166
|
+
.where(eq(contestEntries.id, entryId));
|
|
167
|
+
return { judged: true };
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Phase B2 — apply an advancement cut at a review stage: the surviving cohort
|
|
172
|
+
* (entries not already eliminated) is split into advancers + eliminated, the
|
|
173
|
+
* round's score/rank is snapshotted into each entry's `stageState`, and the
|
|
174
|
+
* contest's `currentStageId` moves to the next stage. Idempotent per stage —
|
|
175
|
+
* re-running replaces that stage's `stageState` rows rather than duplicating them.
|
|
176
|
+
* Owner-gated. `topN` ties broken by score → rank → id for determinism.
|
|
177
|
+
*/
|
|
178
|
+
export async function advanceContestStage(db, contestId, userId, input, canManage = false) {
|
|
179
|
+
const fail = (error) => ({ advanced: false, advancedCount: 0, eliminatedCount: 0, error });
|
|
180
|
+
const [contest] = await db
|
|
181
|
+
.select({
|
|
182
|
+
createdById: contests.createdById,
|
|
183
|
+
status: contests.status,
|
|
184
|
+
stages: contests.stages,
|
|
185
|
+
currentStageId: contests.currentStageId,
|
|
186
|
+
startDate: contests.startDate,
|
|
187
|
+
endDate: contests.endDate,
|
|
188
|
+
judgingEndDate: contests.judgingEndDate,
|
|
189
|
+
})
|
|
190
|
+
.from(contests)
|
|
191
|
+
.where(eq(contests.id, contestId))
|
|
192
|
+
.limit(1);
|
|
193
|
+
if (!contest)
|
|
194
|
+
return fail('Contest not found');
|
|
195
|
+
if (contest.createdById !== userId && !canManage && !(await isContestEditor(db, contestId, userId))) {
|
|
196
|
+
return fail('Not authorized to manage this contest');
|
|
197
|
+
}
|
|
198
|
+
const stages = normalizeStages(contest);
|
|
199
|
+
const idx = stages.findIndex((s) => s.id === input.reviewStageId);
|
|
200
|
+
if (idx < 0)
|
|
201
|
+
return fail('Unknown stage');
|
|
202
|
+
if (stages[idx].kind !== 'review')
|
|
203
|
+
return fail('Advancement applies to review stages only');
|
|
204
|
+
const rows = await db
|
|
205
|
+
.select({ id: contestEntries.id, userId: contestEntries.userId, score: contestEntries.score, rank: contestEntries.rank, stageState: contestEntries.stageState })
|
|
206
|
+
.from(contestEntries)
|
|
207
|
+
.where(eq(contestEntries.contestId, contestId));
|
|
208
|
+
// Only the running cohort (not already eliminated) is subject to the cut.
|
|
209
|
+
const eligible = rows.filter((r) => !isEliminated(r));
|
|
210
|
+
let advancedIds;
|
|
211
|
+
if (input.mode === 'manual') {
|
|
212
|
+
const picked = new Set(input.advancedEntryIds ?? []);
|
|
213
|
+
advancedIds = new Set(eligible.filter((e) => picked.has(e.id)).map((e) => e.id));
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const n = Math.max(0, input.topN ?? 0);
|
|
217
|
+
const sorted = [...eligible].sort((a, b) => (b.score ?? -Infinity) - (a.score ?? -Infinity) ||
|
|
218
|
+
(a.rank ?? Infinity) - (b.rank ?? Infinity) ||
|
|
219
|
+
a.id.localeCompare(b.id));
|
|
220
|
+
advancedIds = new Set(sorted.slice(0, n).map((e) => e.id));
|
|
221
|
+
}
|
|
222
|
+
const nextStage = stages[idx + 1];
|
|
223
|
+
// Per-entry stage advance + the currentStageId bump must be atomic so a
|
|
224
|
+
// partial failure can't leave the cohort half-advanced against the new stage.
|
|
225
|
+
let advancedCount = 0;
|
|
226
|
+
let eliminatedCount = 0;
|
|
227
|
+
await db.transaction(async (tx) => {
|
|
228
|
+
advancedCount = 0;
|
|
229
|
+
eliminatedCount = 0;
|
|
230
|
+
for (const e of eligible) {
|
|
231
|
+
const isAdv = advancedIds.has(e.id);
|
|
232
|
+
const prior = (e.stageState ?? []).filter((s) => s.stageId !== input.reviewStageId);
|
|
233
|
+
const next = [...prior, { stageId: input.reviewStageId, status: isAdv ? 'advanced' : 'eliminated', score: e.score ?? null, rank: e.rank ?? null }];
|
|
234
|
+
await tx.update(contestEntries).set({ stageState: next }).where(eq(contestEntries.id, e.id));
|
|
235
|
+
if (isAdv)
|
|
236
|
+
advancedCount++;
|
|
237
|
+
else
|
|
238
|
+
eliminatedCount++;
|
|
239
|
+
}
|
|
240
|
+
if (nextStage) {
|
|
241
|
+
await tx.update(contests).set({ currentStageId: nextStage.id, updatedAt: new Date() }).where(eq(contests.id, contestId));
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
// Notify entrants of the outcome (non-critical, de-duped by user).
|
|
245
|
+
try {
|
|
246
|
+
const { createNotification } = await import('../notification/notification.js');
|
|
247
|
+
const [info] = await db.select({ title: contests.title, slug: contests.slug }).from(contests).where(eq(contests.id, contestId)).limit(1);
|
|
248
|
+
if (info) {
|
|
249
|
+
const nextName = nextStage?.name ?? 'the next stage';
|
|
250
|
+
const seen = new Set();
|
|
251
|
+
for (const e of eligible) {
|
|
252
|
+
if (seen.has(e.userId))
|
|
253
|
+
continue;
|
|
254
|
+
seen.add(e.userId);
|
|
255
|
+
const adv = advancedIds.has(e.id);
|
|
256
|
+
createNotification(db, {
|
|
257
|
+
userId: e.userId,
|
|
258
|
+
type: 'contest',
|
|
259
|
+
title: adv ? 'You advanced!' : 'Contest update',
|
|
260
|
+
message: adv
|
|
261
|
+
? `Your entry advanced to ${nextName} in "${info.title}".`
|
|
262
|
+
: `Your entry wasn't selected to continue in "${info.title}".`,
|
|
263
|
+
link: `/contests/${info.slug}`,
|
|
264
|
+
actorId: userId,
|
|
265
|
+
}).catch(() => { });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
/* non-critical */
|
|
271
|
+
}
|
|
272
|
+
return { advanced: true, advancedCount, eliminatedCount };
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=judging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judging.js","sourceRoot":"","sources":["../../src/contest/judging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG1E,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,CAA0B;IAC3D,OAAO,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAoD,EACpD,SAA2B;IAE3B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0EAA0E,EAAE,CAAC;IAC1G,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACpE,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,gCAAgC,GAAG,EAAE,EAAE,CAAC;QAC/G,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,8BAA8B;QACxF,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC;QACtB,QAAQ,IAAI,GAAG,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACzE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,OAAe,EACf,KAAyB,EACzB,OAAe,EACf,QAAiB,EACjB,cAAiC,EACjC,iBAA0B;IAE1B,wEAAwE;IACxE,MAAM,QAAQ,GAAG,MAAM,EAAE;SACtB,MAAM,CAAC;QACN,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,SAAS,EAAE,QAAQ,CAAC,EAAE;QACtB,SAAS,EAAE,cAAc,CAAC,MAAM;QAChC,UAAU,EAAE,cAAc,CAAC,UAAU;QACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;KACxC,CAAC;SACD,IAAI,CAAC,cAAc,CAAC;SACpB,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC9D,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;SACrC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAE9E,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;IAEzB,+EAA+E;IAC/E,2EAA2E;IAC3E,+EAA+E;IAC/E,8EAA8E;IAC9E,oDAAoD;IACpD,IAAI,iBAAiB,IAAI,GAAG,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;QAC7D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC;IAC3E,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACrE,CAAC;IAED,8EAA8E;IAC9E,mEAAmE;IACnE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,yDAAyD,EAAE,CAAC;IAC7F,CAAC;IAED,8EAA8E;IAC9E,gFAAgF;IAChF,gFAAgF;IAChF,8CAA8C;IAC9C,MAAM,UAAU,GAAG,YAAY,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,aAAa;QACzB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,cAAc,EAAE,GAAG,CAAC,cAAc;KACnC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAElF,8DAA8D;IAC9D,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACrE,CAAC;IAED,2EAA2E;IAC3E,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,EAAE;SAC3B,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC;SAChG,IAAI,CAAC,aAAa,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;SACzF,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IACvE,CAAC;IAED,+EAA+E;IAC/E,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,6CAA6C;IAC7C,IAAI,OAAe,CAAC;IACpB,IAAI,cAA4C,CAAC;IACjD,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,QAAQ,IAAI,GAAG,CAAC,eAAe,IAAI,IAAI,CAAqC,CAAC;QACzG,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACzB,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACvD,CAAC;IAED,8EAA8E;IAC9E,2EAA2E;IAC3E,OAAO,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACjC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;aACtB,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC;aACnD,IAAI,CAAC,cAAc,CAAC;aACpB,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;aACrC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEjB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,CAAsB,CAAC;QAChE,MAAM,MAAM,GAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtE,IAAI,cAAc;YAAE,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;QAC3D,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QAEtC,8DAA8D;QAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;QAChH,IAAI,WAAW,IAAI,CAAC;YAAE,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;;YAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEzB,0EAA0E;QAC1E,0EAA0E;QAC1E,wDAAwD;QACxD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7F,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM;YACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;YACnF,CAAC,CAAC,CAAC,CAAC;QAEN,MAAM,EAAE;aACL,MAAM,CAAC,cAAc,CAAC;aACtB,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;aAC7C,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAEzC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAM,EACN,SAAiB,EACjB,MAAc,EACd,KAAwB,EACxB,SAAS,GAAG,KAAK;IAEjB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;SACvB,MAAM,CAAC;QACN,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;KACxC,CAAC;SACD,IAAI,CAAC,QAAQ,CAAC;SACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;SACjC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACpG,OAAO,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,GAAG,CAAE,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAE7F,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC;SAC/J,IAAI,CAAC,cAAc,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAElD,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,IAAI,WAAwB,CAAC;IAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QACrD,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC;YAC/C,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;YAC3C,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3B,CAAC;QACF,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAElC,wEAAwE;IACxE,8EAA8E;IAC9E,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAChC,aAAa,GAAG,CAAC,CAAC;QAClB,eAAe,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,UAAoB,CAAC,CAAC,CAAE,YAAsB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACzK,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7F,IAAI,KAAK;gBAAE,aAAa,EAAE,CAAC;;gBACtB,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3H,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,mEAAmE;IACnE,IAAI,CAAC;QACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzI,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,IAAI,gBAAgB,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACjC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACnB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,kBAAkB,CAAC,EAAE,EAAE;oBACrB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB;oBAC/C,OAAO,EAAE,GAAG;wBACV,CAAC,CAAC,0BAA0B,QAAQ,QAAQ,IAAI,CAAC,KAAK,IAAI;wBAC1D,CAAC,CAAC,8CAA8C,IAAI,CAAC,KAAK,IAAI;oBAChE,IAAI,EAAE,aAAa,IAAI,CAAC,IAAI,EAAE;oBAC9B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { contests } from '@commonpub/schema';
|
|
2
|
+
import type { ContestStatus } from '@commonpub/schema';
|
|
3
|
+
import type { DB } from '../types.js';
|
|
4
|
+
import type { ContestFilters, ContestListItem, ContestDetail, ContestVisibility, ContestJudgingVisibility } from './types.js';
|
|
5
|
+
export declare function listContests(db: DB, filters?: ContestFilters, viewer?: {
|
|
6
|
+
userId: string;
|
|
7
|
+
role: string;
|
|
8
|
+
} | null): Promise<{
|
|
9
|
+
items: ContestListItem[];
|
|
10
|
+
total: number;
|
|
11
|
+
}>;
|
|
12
|
+
type ContestRow = typeof contests.$inferSelect;
|
|
13
|
+
/** Map a contest row to the API detail shape. Shared by the CRUD writers. */
|
|
14
|
+
export declare function toContestDetail(row: ContestRow): ContestDetail;
|
|
15
|
+
/**
|
|
16
|
+
* Whether `user` may view this contest. `public`/`unlisted` are viewable by
|
|
17
|
+
* anyone (unlisted is simply hidden from listings). `private` is restricted to
|
|
18
|
+
* the owner, admins, stakeholders, panel judges, and users whose role is in
|
|
19
|
+
* `visibleToRoles`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function canViewContest(db: DB, contest: {
|
|
22
|
+
id: string;
|
|
23
|
+
status?: string;
|
|
24
|
+
visibility: ContestVisibility;
|
|
25
|
+
visibleToRoles: string[] | null;
|
|
26
|
+
createdById: string;
|
|
27
|
+
}, user: {
|
|
28
|
+
id: string;
|
|
29
|
+
role: string;
|
|
30
|
+
} | null): Promise<boolean>;
|
|
31
|
+
export declare function getContestBySlug(db: DB, slug: string): Promise<ContestDetail | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Decide whether a viewer may see aggregate entry scores, honouring the
|
|
34
|
+
* contest's `judgingVisibility` setting. Pure + exhaustively testable.
|
|
35
|
+
*
|
|
36
|
+
* - Privileged viewers (owner / admin / panel judge) always see scores.
|
|
37
|
+
* - `public` → scores visible to everyone (during judging and after).
|
|
38
|
+
* - `judges-only`→ scores hidden from the public until the contest completes.
|
|
39
|
+
* - `private` → aggregate scores never exposed to the public (ranks may
|
|
40
|
+
* still be shown so winners can be announced).
|
|
41
|
+
*/
|
|
42
|
+
export declare function shouldRevealScores(visibility: ContestJudgingVisibility, status: ContestStatus, privileged: boolean): boolean;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/contest/read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAsC,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAItC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAKpB,wBAAsB,YAAY,CAChC,EAAE,EAAE,EAAE,EACN,OAAO,GAAE,cAAmB,EAC5B,MAAM,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAC/C,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA4EtD;AAED,KAAK,UAAU,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC;AAE/C,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,aAAa,CAsC9D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC7H,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACxC,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAS/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,wBAAwB,EACpC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,OAAO,GAClB,OAAO,CAKT"}
|