grain.social is a photo sharing platform built on atproto.

optionally parse exif data on upload, add exif dialogs to photos, add exif info dialog, update terms

+19
__generated__/index.ts
··· 31 31 DefsClickthroughReposter: 'app.bsky.feed.defs#clickthroughReposter', 32 32 DefsContentModeUnspecified: 'app.bsky.feed.defs#contentModeUnspecified', 33 33 } 34 + export const COM_ATPROTO_MODERATION = { 35 + DefsReasonRude: 'com.atproto.moderation.defs#reasonRude', 36 + DefsReasonSpam: 'com.atproto.moderation.defs#reasonSpam', 37 + DefsReasonOther: 'com.atproto.moderation.defs#reasonOther', 38 + DefsReasonAppeal: 'com.atproto.moderation.defs#reasonAppeal', 39 + DefsReasonSexual: 'com.atproto.moderation.defs#reasonSexual', 40 + DefsReasonViolation: 'com.atproto.moderation.defs#reasonViolation', 41 + DefsReasonMisleading: 'com.atproto.moderation.defs#reasonMisleading', 42 + } 34 43 35 44 export function createServer(options?: XrpcOptions): Server { 36 45 return new Server(options) ··· 172 181 _server: Server 173 182 gallery: SocialGrainGalleryNS 174 183 graph: SocialGrainGraphNS 184 + labeler: SocialGrainLabelerNS 175 185 actor: SocialGrainActorNS 176 186 photo: SocialGrainPhotoNS 177 187 ··· 179 189 this._server = server 180 190 this.gallery = new SocialGrainGalleryNS(server) 181 191 this.graph = new SocialGrainGraphNS(server) 192 + this.labeler = new SocialGrainLabelerNS(server) 182 193 this.actor = new SocialGrainActorNS(server) 183 194 this.photo = new SocialGrainPhotoNS(server) 184 195 } ··· 193 204 } 194 205 195 206 export class SocialGrainGraphNS { 207 + _server: Server 208 + 209 + constructor(server: Server) { 210 + this._server = server 211 + } 212 + } 213 + 214 + export class SocialGrainLabelerNS { 196 215 _server: Server 197 216 198 217 constructor(server: Server) {
+275
__generated__/lexicons.ts
··· 2527 2527 refs: ['lex:social.grain.photo.defs#photoView'], 2528 2528 }, 2529 2529 }, 2530 + labels: { 2531 + type: 'array', 2532 + items: { 2533 + type: 'ref', 2534 + ref: 'lex:com.atproto.label.defs#label', 2535 + }, 2536 + }, 2530 2537 indexedAt: { 2531 2538 type: 'string', 2532 2539 format: 'datetime', ··· 2554 2561 type: 'string', 2555 2562 maxLength: 1000, 2556 2563 }, 2564 + labels: { 2565 + type: 'union', 2566 + description: 2567 + 'Self-label values for this post. Effectively content warnings.', 2568 + refs: ['lex:com.atproto.label.defs#selfLabels'], 2569 + }, 2557 2570 createdAt: { 2558 2571 type: 'string', 2559 2572 format: 'datetime', ··· 2587 2600 }, 2588 2601 }, 2589 2602 }, 2603 + SocialGrainLabelerDefs: { 2604 + lexicon: 1, 2605 + id: 'social.grain.labeler.defs', 2606 + defs: { 2607 + labelerView: { 2608 + type: 'object', 2609 + required: ['uri', 'cid', 'creator', 'indexedAt'], 2610 + properties: { 2611 + uri: { 2612 + type: 'string', 2613 + format: 'at-uri', 2614 + }, 2615 + cid: { 2616 + type: 'string', 2617 + format: 'cid', 2618 + }, 2619 + creator: { 2620 + type: 'ref', 2621 + ref: 'lex:social.grain.actor.defs#profileView', 2622 + }, 2623 + favoriteCount: { 2624 + type: 'integer', 2625 + minimum: 0, 2626 + }, 2627 + viewer: { 2628 + type: 'ref', 2629 + ref: 'lex:social.grain.labeler.defs#labelerViewerState', 2630 + }, 2631 + indexedAt: { 2632 + type: 'string', 2633 + format: 'datetime', 2634 + }, 2635 + labels: { 2636 + type: 'array', 2637 + items: { 2638 + type: 'ref', 2639 + ref: 'lex:com.atproto.label.defs#label', 2640 + }, 2641 + }, 2642 + }, 2643 + }, 2644 + labelerViewDetailed: { 2645 + type: 'object', 2646 + required: ['uri', 'cid', 'creator', 'policies', 'indexedAt'], 2647 + properties: { 2648 + uri: { 2649 + type: 'string', 2650 + format: 'at-uri', 2651 + }, 2652 + cid: { 2653 + type: 'string', 2654 + format: 'cid', 2655 + }, 2656 + creator: { 2657 + type: 'ref', 2658 + ref: 'lex:app.bsky.actor.defs#profileView', 2659 + }, 2660 + policies: { 2661 + type: 'ref', 2662 + ref: 'lex:social.grain.actor.defs#labelerPolicies', 2663 + }, 2664 + favoriteCount: { 2665 + type: 'integer', 2666 + minimum: 0, 2667 + }, 2668 + viewer: { 2669 + type: 'ref', 2670 + ref: 'lex:social.grain.labeler.defs#labelerViewerState', 2671 + }, 2672 + indexedAt: { 2673 + type: 'string', 2674 + format: 'datetime', 2675 + }, 2676 + labels: { 2677 + type: 'array', 2678 + items: { 2679 + type: 'ref', 2680 + ref: 'lex:com.atproto.label.defs#label', 2681 + }, 2682 + }, 2683 + reasonTypes: { 2684 + description: 2685 + "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", 2686 + type: 'array', 2687 + items: { 2688 + type: 'ref', 2689 + ref: 'lex:com.atproto.moderation.defs#reasonType', 2690 + }, 2691 + }, 2692 + subjectTypes: { 2693 + description: 2694 + 'The set of subject types (account, record, etc) this service accepts reports on.', 2695 + type: 'array', 2696 + items: { 2697 + type: 'ref', 2698 + ref: 'lex:com.atproto.moderation.defs#subjectType', 2699 + }, 2700 + }, 2701 + subjectCollections: { 2702 + type: 'array', 2703 + description: 2704 + 'Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.', 2705 + items: { 2706 + type: 'string', 2707 + format: 'nsid', 2708 + }, 2709 + }, 2710 + }, 2711 + }, 2712 + labelerViewerState: { 2713 + type: 'object', 2714 + properties: { 2715 + like: { 2716 + type: 'string', 2717 + format: 'at-uri', 2718 + }, 2719 + }, 2720 + }, 2721 + labelerPolicies: { 2722 + type: 'object', 2723 + required: ['labelValues'], 2724 + properties: { 2725 + labelValues: { 2726 + type: 'array', 2727 + description: 2728 + 'The label values which this labeler publishes. May include global or custom labels.', 2729 + items: { 2730 + type: 'ref', 2731 + ref: 'lex:com.atproto.label.defs#labelValue', 2732 + }, 2733 + }, 2734 + labelValueDefinitions: { 2735 + type: 'array', 2736 + description: 2737 + 'Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.', 2738 + items: { 2739 + type: 'ref', 2740 + ref: 'lex:com.atproto.label.defs#labelValueDefinition', 2741 + }, 2742 + }, 2743 + }, 2744 + }, 2745 + }, 2746 + }, 2747 + SocialGrainLabelerService: { 2748 + lexicon: 1, 2749 + id: 'social.grain.labeler.service', 2750 + defs: { 2751 + main: { 2752 + type: 'record', 2753 + description: 'A declaration of the existence of labeler service.', 2754 + key: 'literal:self', 2755 + record: { 2756 + type: 'object', 2757 + required: ['policies', 'createdAt'], 2758 + properties: { 2759 + policies: { 2760 + type: 'ref', 2761 + ref: 'lex:app.bsky.labeler.defs#labelerPolicies', 2762 + }, 2763 + labels: { 2764 + type: 'union', 2765 + refs: ['lex:com.atproto.label.defs#selfLabels'], 2766 + }, 2767 + createdAt: { 2768 + type: 'string', 2769 + format: 'datetime', 2770 + }, 2771 + reasonTypes: { 2772 + description: 2773 + "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", 2774 + type: 'array', 2775 + items: { 2776 + type: 'ref', 2777 + ref: 'lex:com.atproto.moderation.defs#reasonType', 2778 + }, 2779 + }, 2780 + subjectTypes: { 2781 + description: 2782 + 'The set of subject types (account, record, etc) this service accepts reports on.', 2783 + type: 'array', 2784 + items: { 2785 + type: 'ref', 2786 + ref: 'lex:com.atproto.moderation.defs#subjectType', 2787 + }, 2788 + }, 2789 + subjectCollections: { 2790 + type: 'array', 2791 + description: 2792 + 'Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.', 2793 + items: { 2794 + type: 'string', 2795 + format: 'nsid', 2796 + }, 2797 + }, 2798 + }, 2799 + }, 2800 + }, 2801 + }, 2802 + }, 2590 2803 SocialGrainFavorite: { 2591 2804 lexicon: 1, 2592 2805 id: 'social.grain.favorite', ··· 2636 2849 type: 'string', 2637 2850 maxLength: 2560, 2638 2851 maxGraphemes: 256, 2852 + }, 2853 + labels: { 2854 + type: 'array', 2855 + items: { 2856 + ref: 'lex:com.atproto.label.defs#label', 2857 + type: 'ref', 2858 + }, 2639 2859 }, 2640 2860 avatar: { 2641 2861 type: 'string', ··· 3075 3295 }, 3076 3296 }, 3077 3297 }, 3298 + ComAtprotoModerationDefs: { 3299 + lexicon: 1, 3300 + id: 'com.atproto.moderation.defs', 3301 + defs: { 3302 + reasonRude: { 3303 + type: 'token', 3304 + description: 3305 + 'Rude, harassing, explicit, or otherwise unwelcoming behavior', 3306 + }, 3307 + reasonSpam: { 3308 + type: 'token', 3309 + description: 'Spam: frequent unwanted promotion, replies, mentions', 3310 + }, 3311 + reasonType: { 3312 + type: 'string', 3313 + knownValues: [ 3314 + 'com.atproto.moderation.defs#reasonSpam', 3315 + 'com.atproto.moderation.defs#reasonViolation', 3316 + 'com.atproto.moderation.defs#reasonMisleading', 3317 + 'com.atproto.moderation.defs#reasonSexual', 3318 + 'com.atproto.moderation.defs#reasonRude', 3319 + 'com.atproto.moderation.defs#reasonOther', 3320 + 'com.atproto.moderation.defs#reasonAppeal', 3321 + ], 3322 + }, 3323 + reasonOther: { 3324 + type: 'token', 3325 + description: 'Other: reports not falling under another report category', 3326 + }, 3327 + subjectType: { 3328 + type: 'string', 3329 + description: 'Tag describing a type of subject that might be reported.', 3330 + knownValues: ['account', 'record', 'chat'], 3331 + }, 3332 + reasonAppeal: { 3333 + type: 'token', 3334 + description: 'Appeal: appeal a previously taken moderation action', 3335 + }, 3336 + reasonSexual: { 3337 + type: 'token', 3338 + description: 'Unwanted or mislabeled sexual content', 3339 + }, 3340 + reasonViolation: { 3341 + type: 'token', 3342 + description: 'Direct violation of server rules, laws, terms of service', 3343 + }, 3344 + reasonMisleading: { 3345 + type: 'token', 3346 + description: 'Misleading identity, affiliation, or content', 3347 + }, 3348 + }, 3349 + }, 3078 3350 } as const satisfies Record<string, LexiconDoc> 3079 3351 export const schemas = Object.values(schemaDict) satisfies LexiconDoc[] 3080 3352 export const lexicons: Lexicons = new Lexicons(schemas) ··· 3131 3403 SocialGrainGalleryDefs: 'social.grain.gallery.defs', 3132 3404 SocialGrainGallery: 'social.grain.gallery', 3133 3405 SocialGrainGraphFollow: 'social.grain.graph.follow', 3406 + SocialGrainLabelerDefs: 'social.grain.labeler.defs', 3407 + SocialGrainLabelerService: 'social.grain.labeler.service', 3134 3408 SocialGrainFavorite: 'social.grain.favorite', 3135 3409 SocialGrainActorDefs: 'social.grain.actor.defs', 3136 3410 SocialGrainActorProfile: 'social.grain.actor.profile', ··· 3139 3413 SocialGrainPhoto: 'social.grain.photo', 3140 3414 ComAtprotoLabelDefs: 'com.atproto.label.defs', 3141 3415 ComAtprotoRepoStrongRef: 'com.atproto.repo.strongRef', 3416 + ComAtprotoModerationDefs: 'com.atproto.moderation.defs', 3142 3417 } as const
+44
__generated__/types/com/atproto/moderation/defs.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { type ValidationResult, BlobRef } from "npm:@atproto/lexicon" 5 + import { CID } from "npm:multiformats/cid" 6 + import { validate as _validate } from '../../../../lexicons.ts' 7 + import { 8 + type $Typed, 9 + is$typed as _is$typed, 10 + type OmitKey, 11 + } from '../../../../util.ts' 12 + 13 + const is$typed = _is$typed, 14 + validate = _validate 15 + const id = 'com.atproto.moderation.defs' 16 + /** Rude, harassing, explicit, or otherwise unwelcoming behavior */ 17 + export const REASONRUDE = `${id}#reasonRude` 18 + /** Spam: frequent unwanted promotion, replies, mentions */ 19 + export const REASONSPAM = `${id}#reasonSpam` 20 + 21 + export type ReasonType = 22 + | 'com.atproto.moderation.defs#reasonSpam' 23 + | 'com.atproto.moderation.defs#reasonViolation' 24 + | 'com.atproto.moderation.defs#reasonMisleading' 25 + | 'com.atproto.moderation.defs#reasonSexual' 26 + | 'com.atproto.moderation.defs#reasonRude' 27 + | 'com.atproto.moderation.defs#reasonOther' 28 + | 'com.atproto.moderation.defs#reasonAppeal' 29 + | (string & {}) 30 + 31 + /** Other: reports not falling under another report category */ 32 + export const REASONOTHER = `${id}#reasonOther` 33 + 34 + /** Tag describing a type of subject that might be reported. */ 35 + export type SubjectType = 'account' | 'record' | 'chat' | (string & {}) 36 + 37 + /** Appeal: appeal a previously taken moderation action */ 38 + export const REASONAPPEAL = `${id}#reasonAppeal` 39 + /** Unwanted or mislabeled sexual content */ 40 + export const REASONSEXUAL = `${id}#reasonSexual` 41 + /** Direct violation of server rules, laws, terms of service */ 42 + export const REASONVIOLATION = `${id}#reasonViolation` 43 + /** Misleading identity, affiliation, or content */ 44 + export const REASONMISLEADING = `${id}#reasonMisleading`
+2
__generated__/types/social/grain/actor/defs.ts
··· 9 9 is$typed as _is$typed, 10 10 type OmitKey, 11 11 } from '../../../../util.ts' 12 + import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.ts' 12 13 13 14 const is$typed = _is$typed, 14 15 validate = _validate ··· 20 21 handle: string 21 22 displayName?: string 22 23 description?: string 24 + labels?: ComAtprotoLabelDefs.Label[] 23 25 avatar?: string 24 26 createdAt?: string 25 27 }
+2
__generated__/types/social/grain/gallery.ts
··· 5 5 import { CID } from "npm:multiformats/cid" 6 6 import { validate as _validate } from '../../../lexicons.ts' 7 7 import { type $Typed, is$typed as _is$typed, type OmitKey } from '../../../util.ts' 8 + import type * as ComAtprotoLabelDefs from '../../com/atproto/label/defs.ts' 8 9 9 10 const is$typed = _is$typed, 10 11 validate = _validate ··· 14 15 $type: 'social.grain.gallery' 15 16 title: string 16 17 description?: string 18 + labels?: $Typed<ComAtprotoLabelDefs.SelfLabels> | { $type: string } 17 19 createdAt: string 18 20 [k: string]: unknown 19 21 }
+2
__generated__/types/social/grain/gallery/defs.ts
··· 11 11 } from '../../../../util.ts' 12 12 import type * as SocialGrainActorDefs from '../actor/defs.ts' 13 13 import type * as SocialGrainPhotoDefs from '../photo/defs.ts' 14 + import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.ts' 14 15 15 16 const is$typed = _is$typed, 16 17 validate = _validate ··· 23 24 creator: SocialGrainActorDefs.ProfileView 24 25 record: { [_ in string]: unknown } 25 26 items?: ($Typed<SocialGrainPhotoDefs.PhotoView> | { $type: string })[] 27 + labels?: ComAtprotoLabelDefs.Label[] 26 28 indexedAt: string 27 29 } 28 30
+101
__generated__/types/social/grain/labeler/defs.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { type ValidationResult, BlobRef } from "npm:@atproto/lexicon" 5 + import { CID } from "npm:multiformats/cid" 6 + import { validate as _validate } from '../../../../lexicons.ts' 7 + import { 8 + type $Typed, 9 + is$typed as _is$typed, 10 + type OmitKey, 11 + } from '../../../../util.ts' 12 + import type * as SocialGrainActorDefs from '../actor/defs.ts' 13 + import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.ts' 14 + import type * as AppBskyActorDefs from '../../../app/bsky/actor/defs.ts' 15 + import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.ts' 16 + 17 + const is$typed = _is$typed, 18 + validate = _validate 19 + const id = 'social.grain.labeler.defs' 20 + 21 + export interface LabelerView { 22 + $type?: 'social.grain.labeler.defs#labelerView' 23 + uri: string 24 + cid: string 25 + creator: SocialGrainActorDefs.ProfileView 26 + favoriteCount?: number 27 + viewer?: LabelerViewerState 28 + indexedAt: string 29 + labels?: ComAtprotoLabelDefs.Label[] 30 + } 31 + 32 + const hashLabelerView = 'labelerView' 33 + 34 + export function isLabelerView<V>(v: V) { 35 + return is$typed(v, id, hashLabelerView) 36 + } 37 + 38 + export function validateLabelerView<V>(v: V) { 39 + return validate<LabelerView & V>(v, id, hashLabelerView) 40 + } 41 + 42 + export interface LabelerViewDetailed { 43 + $type?: 'social.grain.labeler.defs#labelerViewDetailed' 44 + uri: string 45 + cid: string 46 + creator: AppBskyActorDefs.ProfileView 47 + policies: SocialGrainActorDefs.LabelerPolicies 48 + favoriteCount?: number 49 + viewer?: LabelerViewerState 50 + indexedAt: string 51 + labels?: ComAtprotoLabelDefs.Label[] 52 + /** The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed. */ 53 + reasonTypes?: ComAtprotoModerationDefs.ReasonType[] 54 + /** The set of subject types (account, record, etc) this service accepts reports on. */ 55 + subjectTypes?: ComAtprotoModerationDefs.SubjectType[] 56 + /** Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type. */ 57 + subjectCollections?: string[] 58 + } 59 + 60 + const hashLabelerViewDetailed = 'labelerViewDetailed' 61 + 62 + export function isLabelerViewDetailed<V>(v: V) { 63 + return is$typed(v, id, hashLabelerViewDetailed) 64 + } 65 + 66 + export function validateLabelerViewDetailed<V>(v: V) { 67 + return validate<LabelerViewDetailed & V>(v, id, hashLabelerViewDetailed) 68 + } 69 + 70 + export interface LabelerViewerState { 71 + $type?: 'social.grain.labeler.defs#labelerViewerState' 72 + like?: string 73 + } 74 + 75 + const hashLabelerViewerState = 'labelerViewerState' 76 + 77 + export function isLabelerViewerState<V>(v: V) { 78 + return is$typed(v, id, hashLabelerViewerState) 79 + } 80 + 81 + export function validateLabelerViewerState<V>(v: V) { 82 + return validate<LabelerViewerState & V>(v, id, hashLabelerViewerState) 83 + } 84 + 85 + export interface LabelerPolicies { 86 + $type?: 'social.grain.labeler.defs#labelerPolicies' 87 + /** The label values which this labeler publishes. May include global or custom labels. */ 88 + labelValues: ComAtprotoLabelDefs.LabelValue[] 89 + /** Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler. */ 90 + labelValueDefinitions?: ComAtprotoLabelDefs.LabelValueDefinition[] 91 + } 92 + 93 + const hashLabelerPolicies = 'labelerPolicies' 94 + 95 + export function isLabelerPolicies<V>(v: V) { 96 + return is$typed(v, id, hashLabelerPolicies) 97 + } 98 + 99 + export function validateLabelerPolicies<V>(v: V) { 100 + return validate<LabelerPolicies & V>(v, id, hashLabelerPolicies) 101 + }
+42
__generated__/types/social/grain/labeler/service.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { type ValidationResult, BlobRef } from "npm:@atproto/lexicon" 5 + import { CID } from "npm:multiformats/cid" 6 + import { validate as _validate } from '../../../../lexicons.ts' 7 + import { 8 + type $Typed, 9 + is$typed as _is$typed, 10 + type OmitKey, 11 + } from '../../../../util.ts' 12 + import type * as AppBskyLabelerDefs from '../../../app/bsky/labeler/defs.ts' 13 + import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.ts' 14 + import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.ts' 15 + 16 + const is$typed = _is$typed, 17 + validate = _validate 18 + const id = 'social.grain.labeler.service' 19 + 20 + export interface Record { 21 + $type: 'social.grain.labeler.service' 22 + policies: AppBskyLabelerDefs.LabelerPolicies 23 + labels?: $Typed<ComAtprotoLabelDefs.SelfLabels> | { $type: string } 24 + createdAt: string 25 + /** The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed. */ 26 + reasonTypes?: ComAtprotoModerationDefs.ReasonType[] 27 + /** The set of subject types (account, record, etc) this service accepts reports on. */ 28 + subjectTypes?: ComAtprotoModerationDefs.SubjectType[] 29 + /** Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type. */ 30 + subjectCollections?: string[] 31 + [k: string]: unknown 32 + } 33 + 34 + const hashRecord = 'main' 35 + 36 + export function isRecord<V>(v: V) { 37 + return is$typed(v, id, hashRecord) 38 + } 39 + 40 + export function validateRecord<V>(v: V) { 41 + return validate<Record & V>(v, id, hashRecord, true) 42 + }
+2 -5
deno.json
··· 2 2 "imports": { 3 3 "$lexicon/": "./__generated__/", 4 4 "@atproto/syntax": "npm:@atproto/syntax@^0.4.0", 5 - "@bigmoves/bff": "jsr:@bigmoves/bff@0.3.0-beta.32", 5 + "@bigmoves/bff": "jsr:@bigmoves/bff@0.3.0-beta.33", 6 6 "@luca/esbuild-deno-loader": "jsr:@luca/esbuild-deno-loader@^0.11.1", 7 7 "@std/http": "jsr:@std/http@^1.0.17", 8 8 "@std/path": "jsr:@std/path@^1.0.9", ··· 18 18 "tailwindcss": "npm:tailwindcss@^4.1.4", 19 19 "typed-htmx": "npm:typed-htmx@^0.3.1" 20 20 }, 21 - "patch": [ 22 - "../bff/packages/bff" 23 - ], 24 21 "tasks": { 25 22 "start": "deno run -A ./src/main.tsx", 26 23 "build": "rm -f ./static/app.esm.js.map && deno run -A build.ts", ··· 28 25 "dev:build": "deno -A --watch=src/static/ build.ts", 29 26 "dev:server": "deno run -A --env-file=.env --watch ./src/main.tsx", 30 27 "dev:tailwind": "deno run -A --node-modules-dir npm:@tailwindcss/cli -i ./src/input.css -o ./static/styles.css --watch", 31 - "sync": "deno run -A --env=.env jsr:@bigmoves/bff-cli@0.3.0-beta.30 sync --collections=social.grain.gallery,social.grain.actor.profile,social.grain.photo,social.grain.favorite,social.grain.gallery.item,social.grain.graph.follow --external-collections=app.bsky.actor.profile,app.bsky.graph.follow,sh.tangled.graph.follow,sh.tangled.actor.profile", 28 + "sync": "deno run -A --env=.env jsr:@bigmoves/bff-cli@0.3.0-beta.30 sync --collections=social.grain.gallery,social.grain.actor.profile,social.grain.photo,social.grain.photo.exif,social.grain.favorite,social.grain.gallery.item,social.grain.graph.follow --external-collections=app.bsky.actor.profile,app.bsky.graph.follow,sh.tangled.graph.follow,sh.tangled.actor.profile", 32 29 "codegen": "deno run -A jsr:@bigmoves/bff-cli@0.3.0-beta.30 lexgen" 33 30 }, 34 31 "compilerOptions": {
+13 -510
deno.lock
··· 2 2 "version": "5", 3 3 "specifiers": { 4 4 "jsr:@bigmoves/atproto-oauth-client@0.2": "0.2.0", 5 - "jsr:@bigmoves/bff@0.3.0-beta.32": "0.3.0-beta.32", 6 - "jsr:@deno/gfm@0.10": "0.10.0", 7 - "jsr:@denosaurs/emoji@0.3": "0.3.1", 5 + "jsr:@bigmoves/bff@0.3.0-beta.33": "0.3.0-beta.33", 8 6 "jsr:@luca/esbuild-deno-loader@~0.11.1": "0.11.1", 9 - "jsr:@std/assert@^1.0.12": "1.0.13", 10 7 "jsr:@std/assert@^1.0.13": "1.0.13", 11 - "jsr:@std/async@^1.0.12": "1.0.12", 12 8 "jsr:@std/bytes@^1.0.2": "1.0.6", 13 9 "jsr:@std/cache@0.2": "0.2.0", 14 - "jsr:@std/cli@^1.0.16": "1.0.19", 15 10 "jsr:@std/cli@^1.0.18": "1.0.19", 16 - "jsr:@std/data-structures@^1.0.6": "1.0.7", 17 11 "jsr:@std/encoding@^1.0.10": "1.0.10", 18 12 "jsr:@std/encoding@^1.0.5": "1.0.10", 19 13 "jsr:@std/fmt@^1.0.8": "1.0.8", 20 - "jsr:@std/fs@^1.0.16": "1.0.17", 21 14 "jsr:@std/html@^1.0.4": "1.0.4", 22 15 "jsr:@std/http@^1.0.13": "1.0.17", 23 16 "jsr:@std/http@^1.0.17": "1.0.17", ··· 29 22 "jsr:@std/path@^1.0.9": "1.1.0", 30 23 "jsr:@std/path@^1.1.0": "1.1.0", 31 24 "jsr:@std/streams@^1.0.9": "1.0.9", 32 - "jsr:@std/testing@^1.0.11": "1.0.11", 33 25 "npm:@atproto-labs/handle-resolver-node@~0.1.14": "0.1.16", 34 - "npm:@atproto-labs/simple-store@~0.1.2": "0.1.2", 35 26 "npm:@atproto/api@~0.15.7": "0.15.12", 36 27 "npm:@atproto/common@~0.4.10": "0.4.11", 37 28 "npm:@atproto/identity@~0.4.7": "0.4.8", 38 29 "npm:@atproto/jwk@0.1.4": "0.1.4", 39 - "npm:@atproto/lex-cli@*": "0.8.2", 40 30 "npm:@atproto/lexicon@*": "0.4.11", 41 31 "npm:@atproto/lexicon@~0.4.11": "0.4.11", 42 32 "npm:@atproto/oauth-client@~0.3.13": "0.3.20", 43 - "npm:@atproto/oauth-types@~0.2.4": "0.2.8", 44 33 "npm:@atproto/syntax@0.4": "0.4.0", 45 34 "npm:@atproto/xrpc-server@*": "0.7.19", 46 35 "npm:@tailwindcss/cli@*": "4.1.8", 47 - "npm:@tailwindcss/cli@^4.0.12": "4.1.8", 48 - "npm:@tailwindcss/cli@^4.1.3": "4.1.8", 49 36 "npm:@tailwindcss/cli@^4.1.4": "4.1.8", 50 - "npm:@types/node@*": "22.15.15", 51 - "npm:buffer@^6.0.3": "6.0.3", 52 37 "npm:clsx@^2.1.1": "2.1.1", 53 38 "npm:date-fns@^4.1.0": "4.1.0", 54 39 "npm:esbuild@~0.25.5": "0.25.5", 55 - "npm:exif-esm@^1.0.1": "1.0.1", 56 40 "npm:exifr@^7.1.3": "7.1.3", 57 - "npm:github-slugger@2": "2.0.0", 58 - "npm:he@^1.2.0": "1.2.0", 59 41 "npm:htmx.org@^1.9.12": "1.9.12", 60 42 "npm:hyperscript.org@~0.9.14": "0.9.14", 61 43 "npm:jose@5.9.6": "5.9.6", 62 - "npm:katex@0.16": "0.16.22", 63 - "npm:marked-alert@2": "2.1.2_marked@12.0.2", 64 - "npm:marked-footnote@^1.2.0": "1.2.4_marked@12.0.2", 65 - "npm:marked-gfm-heading-id@^3.1.0": "3.2.0_marked@12.0.2", 66 - "npm:marked@12": "12.0.2", 67 44 "npm:multiformats@*": "13.3.6", 68 45 "npm:multiformats@^13.3.2": "13.3.6", 69 46 "npm:popmotion@^11.0.5": "11.0.5", 70 47 "npm:preact-render-to-string@^6.5.13": "6.5.13_preact@10.26.8", 71 48 "npm:preact@^10.26.5": "10.26.8", 72 - "npm:prismjs@^1.29.0": "1.30.0", 73 - "npm:sanitize-html@^2.13.0": "2.17.0", 74 - "npm:sharp@~0.34.1": "0.34.1", 75 49 "npm:sortablejs@^1.15.6": "1.15.6", 76 50 "npm:tailwind-merge@^3.2.0": "3.3.0", 77 - "npm:tailwindcss@^4.0.12": "4.1.8", 78 - "npm:tailwindcss@^4.1.3": "4.1.8", 79 51 "npm:tailwindcss@^4.1.4": "4.1.8", 80 52 "npm:typed-htmx@~0.3.1": "0.3.1" 81 53 }, ··· 84 56 "integrity": "5c3ca124dd52eff51dace83790779ebe48c4b41559b799e16c8750bd415f2124", 85 57 "dependencies": [ 86 58 "npm:@atproto-labs/handle-resolver-node", 87 - "npm:@atproto-labs/simple-store", 88 59 "npm:@atproto/jwk", 89 60 "npm:@atproto/oauth-client", 90 - "npm:@atproto/oauth-types", 91 61 "npm:jose" 92 62 ] 93 63 }, ··· 99 69 "npm:tailwind-merge" 100 70 ] 101 71 }, 102 - "@bigmoves/bff@0.3.0-beta.32": { 103 - "integrity": "d33581157c6d52bd9ecccdbcb090559377de71d28137ce7fdf3882740390a389", 72 + "@bigmoves/bff@0.3.0-beta.33": { 73 + "integrity": "6e1f7ca871be05270e45742a7a6576dc1bf3247de7fa1ec966a30a93d2a79556", 104 74 "dependencies": [ 105 75 "jsr:@bigmoves/atproto-oauth-client", 106 - "jsr:@std/assert@^1.0.13", 76 + "jsr:@std/assert", 77 + "jsr:@std/cache", 107 78 "jsr:@std/fmt", 108 79 "jsr:@std/http@^1.0.13", 109 80 "jsr:@std/path@^1.0.8", ··· 120 91 "npm:tailwind-merge" 121 92 ] 122 93 }, 123 - "@deno/gfm@0.10.0": { 124 - "integrity": "51708205e3559a4aeb6afb29d07c5bfafe7941f91bb360351ef6621de9a39527", 125 - "dependencies": [ 126 - "jsr:@denosaurs/emoji", 127 - "npm:github-slugger", 128 - "npm:he", 129 - "npm:katex", 130 - "npm:marked", 131 - "npm:marked-alert", 132 - "npm:marked-footnote", 133 - "npm:marked-gfm-heading-id", 134 - "npm:prismjs", 135 - "npm:sanitize-html" 136 - ] 137 - }, 138 - "@denosaurs/emoji@0.3.1": { 139 - "integrity": "b0aed5f55dec99e83da7c9637fe0a36d1d6252b7c99deaaa3fc5dea3fcf3da8b" 140 - }, 141 94 "@luca/esbuild-deno-loader@0.11.1": { 142 95 "integrity": "dc020d16d75b591f679f6b9288b10f38bdb4f24345edb2f5732affa1d9885267", 143 96 "dependencies": [ ··· 152 105 "jsr:@std/internal" 153 106 ] 154 107 }, 155 - "@std/async@1.0.12": { 156 - "integrity": "d1bfcec459e8012846fe4e38dfc4241ab23240ecda3d8d6dfcf6d81a632e803d" 157 - }, 158 108 "@std/bytes@1.0.6": { 159 109 "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" 160 110 }, ··· 164 114 "@std/cli@1.0.19": { 165 115 "integrity": "b3601a54891f89f3f738023af11960c4e6f7a45dc76cde39a6861124cba79e88" 166 116 }, 167 - "@std/data-structures@1.0.7": { 168 - "integrity": "16932d2c8d281f65eaaa2209af2473209881e33b1ced54cd1b015e7b4cdbb0d2" 169 - }, 170 117 "@std/encoding@1.0.10": { 171 118 "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" 172 119 }, 173 120 "@std/fmt@1.0.8": { 174 121 "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" 175 122 }, 176 - "@std/fs@1.0.17": { 177 - "integrity": "1c00c632677c1158988ef7a004cb16137f870aafdb8163b9dce86ec652f3952b", 178 - "dependencies": [ 179 - "jsr:@std/path@^1.0.9" 180 - ] 181 - }, 182 123 "@std/html@1.0.4": { 183 124 "integrity": "eff3497c08164e6ada49b7f81a28b5108087033823153d065e3f89467dd3d50e" 184 125 }, 185 126 "@std/http@1.0.17": { 186 127 "integrity": "98aec8ab4080d95c21f731e3008f69c29c5012d12f1b4e553f85935db601569f", 187 128 "dependencies": [ 188 - "jsr:@std/cli@^1.0.18", 129 + "jsr:@std/cli", 189 130 "jsr:@std/encoding@^1.0.10", 190 131 "jsr:@std/fmt", 191 132 "jsr:@std/html", ··· 209 150 }, 210 151 "@std/streams@1.0.9": { 211 152 "integrity": "a9d26b1988cdd7aa7b1f4b51e1c36c1557f3f252880fa6cc5b9f37078b1a5035" 212 - }, 213 - "@std/testing@1.0.11": { 214 - "integrity": "12b3db12d34f0f385a26248933bde766c0f8c5ad8b6ab34d4d38f528ab852f48", 215 - "dependencies": [ 216 - "jsr:@std/assert@^1.0.12", 217 - "jsr:@std/async", 218 - "jsr:@std/data-structures", 219 - "jsr:@std/fs", 220 - "jsr:@std/internal", 221 - "jsr:@std/path@^1.0.8" 222 - ] 223 153 } 224 154 }, 225 155 "npm": { ··· 235 165 "dependencies": [ 236 166 "@atproto-labs/fetch", 237 167 "@atproto-labs/pipe", 238 - "@atproto-labs/simple-store@0.2.0", 168 + "@atproto-labs/simple-store", 239 169 "@atproto-labs/simple-store-memory", 240 170 "@atproto/did", 241 171 "zod" ··· 267 197 "@atproto-labs/handle-resolver@0.1.8": { 268 198 "integrity": "sha512-Y0ckccoCGDo/3g4thPkgp9QcORmc+qqEaCBCYCZYtfLIQp4775u22wd+4fyEyJP4DqoReKacninkICgRGfs3dQ==", 269 199 "dependencies": [ 270 - "@atproto-labs/simple-store@0.2.0", 200 + "@atproto-labs/simple-store", 271 201 "@atproto-labs/simple-store-memory", 272 202 "@atproto/did", 273 203 "zod" ··· 287 217 "@atproto-labs/simple-store-memory@0.1.3": { 288 218 "integrity": "sha512-jkitT9+AtU+0b28DoN92iURLaCt/q/q4yX8q6V+9LSwYlUTqKoj/5NFKvF7x6EBuG+gpUdlcycbH7e60gjOhRQ==", 289 219 "dependencies": [ 290 - "@atproto-labs/simple-store@0.2.0", 220 + "@atproto-labs/simple-store", 291 221 "lru-cache" 292 222 ] 293 - }, 294 - "@atproto-labs/simple-store@0.1.2": { 295 - "integrity": "sha512-9vTNvyPPBs44tKVFht16wGlilW8u4wpEtKwLkWbuNEh3h9TTQ8zjVhEoGZh/v73G4Otr9JUOSIq+/5+8OZD2mQ==" 296 223 }, 297 224 "@atproto-labs/simple-store@0.2.0": { 298 225 "integrity": "sha512-0bRbAlI8Ayh03wRwncAMEAyUKtZ+AuTS1jgPrfym1WVOAOiottI/ZmgccqLl6w5MbxVcClNQF7WYGKvGwGoIhA==" ··· 365 292 "zod" 366 293 ] 367 294 }, 368 - "@atproto/lex-cli@0.8.2": { 369 - "integrity": "sha512-yNQFYBV3tBBLnVrRUtUBlx/WIF4ypMFsvOsCLjA7pHL1SyW9JbczSEAoiNtoDmPc4UXCjMtXggz0ovBG8lynNA==", 370 - "dependencies": [ 371 - "@atproto/lexicon", 372 - "@atproto/syntax", 373 - "chalk", 374 - "commander@9.5.0", 375 - "prettier", 376 - "ts-morph", 377 - "yesno", 378 - "zod" 379 - ], 380 - "bin": true 381 - }, 382 295 "@atproto/lexicon@0.4.11": { 383 296 "integrity": "sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw==", 384 297 "dependencies": [ ··· 396 309 "@atproto-labs/fetch", 397 310 "@atproto-labs/handle-resolver", 398 311 "@atproto-labs/identity-resolver", 399 - "@atproto-labs/simple-store@0.2.0", 312 + "@atproto-labs/simple-store", 400 313 "@atproto-labs/simple-store-memory", 401 314 "@atproto/did", 402 315 "@atproto/jwk@0.2.0", ··· 614 527 "os": ["win32"], 615 528 "cpu": ["x64"] 616 529 }, 617 - "@img/sharp-darwin-arm64@0.34.1": { 618 - "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", 619 - "optionalDependencies": [ 620 - "@img/sharp-libvips-darwin-arm64" 621 - ], 622 - "os": ["darwin"], 623 - "cpu": ["arm64"] 624 - }, 625 - "@img/sharp-darwin-x64@0.34.1": { 626 - "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", 627 - "optionalDependencies": [ 628 - "@img/sharp-libvips-darwin-x64" 629 - ], 630 - "os": ["darwin"], 631 - "cpu": ["x64"] 632 - }, 633 - "@img/sharp-libvips-darwin-arm64@1.1.0": { 634 - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", 635 - "os": ["darwin"], 636 - "cpu": ["arm64"] 637 - }, 638 - "@img/sharp-libvips-darwin-x64@1.1.0": { 639 - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", 640 - "os": ["darwin"], 641 - "cpu": ["x64"] 642 - }, 643 - "@img/sharp-libvips-linux-arm64@1.1.0": { 644 - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", 645 - "os": ["linux"], 646 - "cpu": ["arm64"] 647 - }, 648 - "@img/sharp-libvips-linux-arm@1.1.0": { 649 - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", 650 - "os": ["linux"], 651 - "cpu": ["arm"] 652 - }, 653 - "@img/sharp-libvips-linux-ppc64@1.1.0": { 654 - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", 655 - "os": ["linux"], 656 - "cpu": ["ppc64"] 657 - }, 658 - "@img/sharp-libvips-linux-s390x@1.1.0": { 659 - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", 660 - "os": ["linux"], 661 - "cpu": ["s390x"] 662 - }, 663 - "@img/sharp-libvips-linux-x64@1.1.0": { 664 - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", 665 - "os": ["linux"], 666 - "cpu": ["x64"] 667 - }, 668 - "@img/sharp-libvips-linuxmusl-arm64@1.1.0": { 669 - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", 670 - "os": ["linux"], 671 - "cpu": ["arm64"] 672 - }, 673 - "@img/sharp-libvips-linuxmusl-x64@1.1.0": { 674 - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", 675 - "os": ["linux"], 676 - "cpu": ["x64"] 677 - }, 678 - "@img/sharp-linux-arm64@0.34.1": { 679 - "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", 680 - "optionalDependencies": [ 681 - "@img/sharp-libvips-linux-arm64" 682 - ], 683 - "os": ["linux"], 684 - "cpu": ["arm64"] 685 - }, 686 - "@img/sharp-linux-arm@0.34.1": { 687 - "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", 688 - "optionalDependencies": [ 689 - "@img/sharp-libvips-linux-arm" 690 - ], 691 - "os": ["linux"], 692 - "cpu": ["arm"] 693 - }, 694 - "@img/sharp-linux-s390x@0.34.1": { 695 - "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", 696 - "optionalDependencies": [ 697 - "@img/sharp-libvips-linux-s390x" 698 - ], 699 - "os": ["linux"], 700 - "cpu": ["s390x"] 701 - }, 702 - "@img/sharp-linux-x64@0.34.1": { 703 - "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", 704 - "optionalDependencies": [ 705 - "@img/sharp-libvips-linux-x64" 706 - ], 707 - "os": ["linux"], 708 - "cpu": ["x64"] 709 - }, 710 - "@img/sharp-linuxmusl-arm64@0.34.1": { 711 - "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", 712 - "optionalDependencies": [ 713 - "@img/sharp-libvips-linuxmusl-arm64" 714 - ], 715 - "os": ["linux"], 716 - "cpu": ["arm64"] 717 - }, 718 - "@img/sharp-linuxmusl-x64@0.34.1": { 719 - "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", 720 - "optionalDependencies": [ 721 - "@img/sharp-libvips-linuxmusl-x64" 722 - ], 723 - "os": ["linux"], 724 - "cpu": ["x64"] 725 - }, 726 - "@img/sharp-wasm32@0.34.1": { 727 - "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", 728 - "dependencies": [ 729 - "@emnapi/runtime" 730 - ], 731 - "cpu": ["wasm32"] 732 - }, 733 - "@img/sharp-win32-ia32@0.34.1": { 734 - "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", 735 - "os": ["win32"], 736 - "cpu": ["ia32"] 737 - }, 738 - "@img/sharp-win32-x64@0.34.1": { 739 - "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", 740 - "os": ["win32"], 741 - "cpu": ["x64"] 742 - }, 743 530 "@ipld/dag-cbor@7.0.3": { 744 531 "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 745 532 "dependencies": [ ··· 1005 792 ], 1006 793 "scripts": true 1007 794 }, 1008 - "@ts-morph/common@0.25.0": { 1009 - "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", 1010 - "dependencies": [ 1011 - "minimatch", 1012 - "path-browserify", 1013 - "tinyglobby" 1014 - ] 1015 - }, 1016 795 "@tybys/wasm-util@0.9.0": { 1017 796 "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", 1018 797 "dependencies": [ 1019 798 "tslib@2.8.1" 1020 799 ] 1021 800 }, 1022 - "@types/node@22.15.15": { 1023 - "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", 1024 - "dependencies": [ 1025 - "undici-types" 1026 - ] 1027 - }, 1028 - "@xmldom/xmldom@0.9.8": { 1029 - "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==" 1030 - }, 1031 801 "abort-controller@3.0.0": { 1032 802 "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1033 803 "dependencies": [ ··· 1045 815 "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 1046 816 "bin": true 1047 817 }, 1048 - "ansi-styles@4.3.0": { 1049 - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1050 - "dependencies": [ 1051 - "color-convert" 1052 - ] 1053 - }, 1054 818 "array-flatten@1.1.1": { 1055 819 "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1056 820 }, ··· 1059 823 }, 1060 824 "await-lock@2.2.2": { 1061 825 "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" 1062 - }, 1063 - "balanced-match@1.0.2": { 1064 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1065 826 }, 1066 827 "base64-js@1.5.1": { 1067 828 "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" ··· 1083 844 "unpipe" 1084 845 ] 1085 846 }, 1086 - "brace-expansion@2.0.1": { 1087 - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1088 - "dependencies": [ 1089 - "balanced-match" 1090 - ] 1091 - }, 1092 847 "braces@3.0.3": { 1093 848 "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1094 849 "dependencies": [ ··· 1148 903 "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", 1149 904 "bin": true 1150 905 }, 1151 - "chalk@4.1.2": { 1152 - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1153 - "dependencies": [ 1154 - "ansi-styles", 1155 - "supports-color" 1156 - ] 1157 - }, 1158 906 "chownr@3.0.0": { 1159 907 "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" 1160 908 }, 1161 909 "clsx@2.1.1": { 1162 910 "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" 1163 911 }, 1164 - "code-block-writer@13.0.3": { 1165 - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" 1166 - }, 1167 - "color-convert@2.0.1": { 1168 - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1169 - "dependencies": [ 1170 - "color-name" 1171 - ] 1172 - }, 1173 - "color-name@1.1.4": { 1174 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1175 - }, 1176 - "color-string@1.9.1": { 1177 - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1178 - "dependencies": [ 1179 - "color-name", 1180 - "simple-swizzle" 1181 - ] 1182 - }, 1183 - "color@4.2.3": { 1184 - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1185 - "dependencies": [ 1186 - "color-convert", 1187 - "color-string" 1188 - ] 1189 - }, 1190 912 "commander@2.20.3": { 1191 913 "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 1192 - }, 1193 - "commander@8.3.0": { 1194 - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" 1195 - }, 1196 - "commander@9.5.0": { 1197 - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" 1198 914 }, 1199 915 "content-disposition@0.5.4": { 1200 916 "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", ··· 1220 936 "ms@2.0.0" 1221 937 ] 1222 938 }, 1223 - "deepmerge@4.3.1": { 1224 - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" 1225 - }, 1226 939 "depd@2.0.0": { 1227 940 "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1228 941 }, ··· 1236 949 "detect-libc@2.0.4": { 1237 950 "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" 1238 951 }, 1239 - "dom-serializer@2.0.0": { 1240 - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 1241 - "dependencies": [ 1242 - "domelementtype", 1243 - "domhandler", 1244 - "entities" 1245 - ] 1246 - }, 1247 - "domelementtype@2.3.0": { 1248 - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" 1249 - }, 1250 - "domhandler@5.0.3": { 1251 - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1252 - "dependencies": [ 1253 - "domelementtype" 1254 - ] 1255 - }, 1256 - "domutils@3.2.2": { 1257 - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 1258 - "dependencies": [ 1259 - "dom-serializer", 1260 - "domelementtype", 1261 - "domhandler" 1262 - ] 1263 - }, 1264 952 "dunder-proto@1.0.1": { 1265 953 "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1266 954 "dependencies": [ ··· 1284 972 "graceful-fs", 1285 973 "tapable" 1286 974 ] 1287 - }, 1288 - "entities@4.5.0": { 1289 - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" 1290 975 }, 1291 976 "es-define-property@1.0.1": { 1292 977 "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" ··· 1335 1020 "escape-html@1.0.3": { 1336 1021 "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1337 1022 }, 1338 - "escape-string-regexp@4.0.0": { 1339 - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 1340 - }, 1341 1023 "etag@1.8.1": { 1342 1024 "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1343 1025 }, ··· 1346 1028 }, 1347 1029 "events@3.3.0": { 1348 1030 "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 1349 - }, 1350 - "exif-esm@1.0.1": { 1351 - "integrity": "sha512-IV4exsKAoDG7B1SpHXdfl76+8KQlq0P3H2BdCIu/KJIT2lu5sQExU6WvRJuw/LSiRHEvqxxNh2rMR1es1qS8mg==" 1352 1031 }, 1353 1032 "exifr@7.1.3": { 1354 1033 "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==" ··· 1392 1071 "fast-redact@3.5.0": { 1393 1072 "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==" 1394 1073 }, 1395 - "fdir@6.4.5_picomatch@4.0.2": { 1396 - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", 1397 - "dependencies": [ 1398 - "picomatch@4.0.2" 1399 - ], 1400 - "optionalPeers": [ 1401 - "picomatch@4.0.2" 1402 - ] 1403 - }, 1404 1074 "fill-range@7.1.1": { 1405 1075 "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1406 1076 "dependencies": [ ··· 1456 1126 "es-object-atoms" 1457 1127 ] 1458 1128 }, 1459 - "github-slugger@2.0.0": { 1460 - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" 1461 - }, 1462 1129 "gopd@1.2.0": { 1463 1130 "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 1464 1131 }, ··· 1467 1134 }, 1468 1135 "graphemer@1.4.0": { 1469 1136 "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 1470 - }, 1471 - "has-flag@4.0.0": { 1472 - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1473 1137 }, 1474 1138 "has-symbols@1.1.0": { 1475 1139 "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" ··· 1480 1144 "function-bind" 1481 1145 ] 1482 1146 }, 1483 - "he@1.2.0": { 1484 - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1485 - "bin": true 1486 - }, 1487 1147 "hey-listen@1.0.8": { 1488 1148 "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" 1489 1149 }, 1490 - "htmlparser2@8.0.2": { 1491 - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 1492 - "dependencies": [ 1493 - "domelementtype", 1494 - "domhandler", 1495 - "domutils", 1496 - "entities" 1497 - ] 1498 - }, 1499 1150 "htmx.org@1.9.12": { 1500 1151 "integrity": "sha512-VZAohXyF7xPGS52IM8d1T1283y+X4D+Owf3qY1NZ9RuBypyu9l8cGsxUMAG5fEAb/DhT7rDoJ9Hpu5/HxFD3cw==" 1501 1152 }, ··· 1535 1186 "ipaddr.js@2.2.0": { 1536 1187 "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" 1537 1188 }, 1538 - "is-arrayish@0.3.2": { 1539 - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 1540 - }, 1541 1189 "is-extglob@2.1.1": { 1542 1190 "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 1543 1191 }, ··· 1550 1198 "is-number@7.0.0": { 1551 1199 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1552 1200 }, 1553 - "is-plain-object@5.0.0": { 1554 - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" 1555 - }, 1556 1201 "iso-datestring-validator@2.2.2": { 1557 1202 "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 1558 1203 }, ··· 1563 1208 "jose@5.9.6": { 1564 1209 "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==" 1565 1210 }, 1566 - "katex@0.16.22": { 1567 - "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", 1568 - "dependencies": [ 1569 - "commander@8.3.0" 1570 - ], 1571 - "bin": true 1572 - }, 1573 1211 "lightningcss-darwin-arm64@1.30.1": { 1574 1212 "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", 1575 1213 "os": ["darwin"], ··· 1650 1288 "markdown-it-deflist@2.1.0": { 1651 1289 "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" 1652 1290 }, 1653 - "marked-alert@2.1.2_marked@12.0.2": { 1654 - "integrity": "sha512-EFNRZ08d8L/iEIPLTlQMDjvwIsj03gxWCczYTht6DCiHJIZhMk4NK5gtPY9UqAYb09eV5VGT+jD4lp396E0I+w==", 1655 - "dependencies": [ 1656 - "marked" 1657 - ] 1658 - }, 1659 - "marked-footnote@1.2.4_marked@12.0.2": { 1660 - "integrity": "sha512-DB2Kl+wFh6YwZd70qABMY6WUkG1UuyqoNTFoDfGyG79Pz24neYtLBkB+45a7o72V7gkfvbC3CGzIYFobxfMT1Q==", 1661 - "dependencies": [ 1662 - "marked" 1663 - ] 1664 - }, 1665 - "marked-gfm-heading-id@3.2.0_marked@12.0.2": { 1666 - "integrity": "sha512-Xfxpr5lXLDLY10XqzSCA9l2dDaiabQUgtYM9hw8yunyVsB/xYBRpiic6BOiY/EAJw1ik1eWr1ET1HKOAPZBhXg==", 1667 - "dependencies": [ 1668 - "github-slugger", 1669 - "marked" 1670 - ] 1671 - }, 1672 - "marked@12.0.2": { 1673 - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", 1674 - "bin": true 1675 - }, 1676 1291 "math-intrinsics@1.1.0": { 1677 1292 "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 1678 1293 }, ··· 1689 1304 "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1690 1305 "dependencies": [ 1691 1306 "braces", 1692 - "picomatch@2.3.1" 1307 + "picomatch" 1693 1308 ] 1694 1309 }, 1695 1310 "mime-db@1.52.0": { ··· 1705 1320 "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1706 1321 "bin": true 1707 1322 }, 1708 - "minimatch@9.0.5": { 1709 - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1710 - "dependencies": [ 1711 - "brace-expansion" 1712 - ] 1713 - }, 1714 1323 "minipass@7.1.2": { 1715 1324 "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" 1716 1325 }, ··· 1739 1348 "multiformats@9.9.0": { 1740 1349 "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 1741 1350 }, 1742 - "nanoid@3.3.11": { 1743 - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1744 - "bin": true 1745 - }, 1746 1351 "negotiator@0.6.3": { 1747 1352 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1748 1353 }, ··· 1768 1373 "ee-first" 1769 1374 ] 1770 1375 }, 1771 - "parse-srcset@1.0.2": { 1772 - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" 1773 - }, 1774 1376 "parseurl@1.3.3": { 1775 1377 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1776 1378 }, 1777 - "path-browserify@1.0.1": { 1778 - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 1779 - }, 1780 1379 "path-to-regexp@0.1.12": { 1781 1380 "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" 1782 1381 }, ··· 1785 1384 }, 1786 1385 "picomatch@2.3.1": { 1787 1386 "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1788 - }, 1789 - "picomatch@4.0.2": { 1790 - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" 1791 1387 }, 1792 1388 "pino-abstract-transport@1.2.0": { 1793 1389 "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", ··· 1825 1421 "tslib@2.4.0" 1826 1422 ] 1827 1423 }, 1828 - "postcss@8.5.3": { 1829 - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1830 - "dependencies": [ 1831 - "nanoid", 1832 - "picocolors", 1833 - "source-map-js" 1834 - ] 1835 - }, 1836 1424 "preact-render-to-string@6.5.13_preact@10.26.8": { 1837 1425 "integrity": "sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w==", 1838 1426 "dependencies": [ ··· 1841 1429 }, 1842 1430 "preact@10.26.8": { 1843 1431 "integrity": "sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==" 1844 - }, 1845 - "prettier@3.5.3": { 1846 - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 1847 - "bin": true 1848 - }, 1849 - "prismjs@1.30.0": { 1850 - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" 1851 1432 }, 1852 1433 "process-warning@3.0.0": { 1853 1434 "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" ··· 1908 1489 "safer-buffer@2.1.2": { 1909 1490 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1910 1491 }, 1911 - "sanitize-html@2.17.0": { 1912 - "integrity": "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==", 1913 - "dependencies": [ 1914 - "deepmerge", 1915 - "escape-string-regexp", 1916 - "htmlparser2", 1917 - "is-plain-object", 1918 - "parse-srcset", 1919 - "postcss" 1920 - ] 1921 - }, 1922 - "semver@7.7.2": { 1923 - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1924 - "bin": true 1925 - }, 1926 1492 "send@0.19.0": { 1927 1493 "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 1928 1494 "dependencies": [ ··· 1953 1519 "setprototypeof@1.2.0": { 1954 1520 "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1955 1521 }, 1956 - "sharp@0.34.1": { 1957 - "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", 1958 - "dependencies": [ 1959 - "color", 1960 - "detect-libc@2.0.4", 1961 - "semver" 1962 - ], 1963 - "optionalDependencies": [ 1964 - "@img/sharp-darwin-arm64", 1965 - "@img/sharp-darwin-x64", 1966 - "@img/sharp-libvips-darwin-arm64", 1967 - "@img/sharp-libvips-darwin-x64", 1968 - "@img/sharp-libvips-linux-arm", 1969 - "@img/sharp-libvips-linux-arm64", 1970 - "@img/sharp-libvips-linux-ppc64", 1971 - "@img/sharp-libvips-linux-s390x", 1972 - "@img/sharp-libvips-linux-x64", 1973 - "@img/sharp-libvips-linuxmusl-arm64", 1974 - "@img/sharp-libvips-linuxmusl-x64", 1975 - "@img/sharp-linux-arm", 1976 - "@img/sharp-linux-arm64", 1977 - "@img/sharp-linux-s390x", 1978 - "@img/sharp-linux-x64", 1979 - "@img/sharp-linuxmusl-arm64", 1980 - "@img/sharp-linuxmusl-x64", 1981 - "@img/sharp-wasm32", 1982 - "@img/sharp-win32-ia32", 1983 - "@img/sharp-win32-x64" 1984 - ], 1985 - "scripts": true 1986 - }, 1987 1522 "side-channel-list@1.0.0": { 1988 1523 "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1989 1524 "dependencies": [ ··· 2020 1555 "side-channel-weakmap" 2021 1556 ] 2022 1557 }, 2023 - "simple-swizzle@0.2.2": { 2024 - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 2025 - "dependencies": [ 2026 - "is-arrayish" 2027 - ] 2028 - }, 2029 1558 "sonic-boom@3.8.1": { 2030 1559 "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 2031 1560 "dependencies": [ ··· 2065 1594 "dependencies": [ 2066 1595 "hey-listen", 2067 1596 "tslib@2.4.0" 2068 - ] 2069 - }, 2070 - "supports-color@7.2.0": { 2071 - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2072 - "dependencies": [ 2073 - "has-flag" 2074 1597 ] 2075 1598 }, 2076 1599 "tailwind-merge@3.3.0": { ··· 2098 1621 "dependencies": [ 2099 1622 "@jridgewell/source-map", 2100 1623 "acorn", 2101 - "commander@2.20.3", 1624 + "commander", 2102 1625 "source-map-support" 2103 1626 ], 2104 1627 "bin": true ··· 2109 1632 "real-require" 2110 1633 ] 2111 1634 }, 2112 - "tinyglobby@0.2.14_picomatch@4.0.2": { 2113 - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 2114 - "dependencies": [ 2115 - "fdir", 2116 - "picomatch@4.0.2" 2117 - ] 2118 - }, 2119 1635 "tlds@1.259.0": { 2120 1636 "integrity": "sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw==", 2121 1637 "bin": true ··· 2128 1644 }, 2129 1645 "toidentifier@1.0.1": { 2130 1646 "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 2131 - }, 2132 - "ts-morph@24.0.0": { 2133 - "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", 2134 - "dependencies": [ 2135 - "@ts-morph/common", 2136 - "code-block-writer" 2137 - ] 2138 1647 }, 2139 1648 "tslib@2.4.0": { 2140 1649 "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" ··· 2164 1673 "multiformats@9.9.0" 2165 1674 ] 2166 1675 }, 2167 - "undici-types@6.21.0": { 2168 - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" 2169 - }, 2170 1676 "undici@6.21.3": { 2171 1677 "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==" 2172 1678 }, ··· 2185 1691 "yallist@5.0.0": { 2186 1692 "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" 2187 1693 }, 2188 - "yesno@0.4.0": { 2189 - "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==" 2190 - }, 2191 1694 "zod@3.25.51": { 2192 1695 "integrity": "sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==" 2193 1696 } 2194 1697 }, 2195 1698 "workspace": { 2196 1699 "dependencies": [ 2197 - "jsr:@bigmoves/bff@0.3.0-beta.32", 1700 + "jsr:@bigmoves/bff@0.3.0-beta.33", 2198 1701 "jsr:@luca/esbuild-deno-loader@~0.11.1", 2199 1702 "jsr:@std/http@^1.0.17", 2200 1703 "jsr:@std/path@^1.0.9",
+3 -1
lexicons.json
··· 4 4 "app.bsky.feed.post", 5 5 "app.bsky.actor.profile", 6 6 "app.bsky.actor.defs", 7 - "app.bsky.graph.follow" 7 + "app.bsky.graph.follow", 8 + "com.atproto.label.defs", 9 + "com.atproto.moderation.defs" 8 10 ] 9 11 }
+55
lexicons/com/atproto/moderation/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.moderation.defs", 4 + "defs": { 5 + "reasonRude": { 6 + "type": "token", 7 + "description": "Rude, harassing, explicit, or otherwise unwelcoming behavior" 8 + }, 9 + "reasonSpam": { 10 + "type": "token", 11 + "description": "Spam: frequent unwanted promotion, replies, mentions" 12 + }, 13 + "reasonType": { 14 + "type": "string", 15 + "knownValues": [ 16 + "com.atproto.moderation.defs#reasonSpam", 17 + "com.atproto.moderation.defs#reasonViolation", 18 + "com.atproto.moderation.defs#reasonMisleading", 19 + "com.atproto.moderation.defs#reasonSexual", 20 + "com.atproto.moderation.defs#reasonRude", 21 + "com.atproto.moderation.defs#reasonOther", 22 + "com.atproto.moderation.defs#reasonAppeal" 23 + ] 24 + }, 25 + "reasonOther": { 26 + "type": "token", 27 + "description": "Other: reports not falling under another report category" 28 + }, 29 + "subjectType": { 30 + "type": "string", 31 + "description": "Tag describing a type of subject that might be reported.", 32 + "knownValues": [ 33 + "account", 34 + "record", 35 + "chat" 36 + ] 37 + }, 38 + "reasonAppeal": { 39 + "type": "token", 40 + "description": "Appeal: appeal a previously taken moderation action" 41 + }, 42 + "reasonSexual": { 43 + "type": "token", 44 + "description": "Unwanted or mislabeled sexual content" 45 + }, 46 + "reasonViolation": { 47 + "type": "token", 48 + "description": "Direct violation of server rules, laws, terms of service" 49 + }, 50 + "reasonMisleading": { 51 + "type": "token", 52 + "description": "Misleading identity, affiliation, or content" 53 + } 54 + } 55 + }
+7
lexicons/social/grain/actor/defs.json
··· 18 18 "maxLength": 2560, 19 19 "maxGraphemes": 256 20 20 }, 21 + "labels": { 22 + "type": "array", 23 + "items": { 24 + "ref": "com.atproto.label.defs#label", 25 + "type": "ref" 26 + } 27 + }, 21 28 "avatar": { "type": "string", "format": "uri" }, 22 29 "createdAt": { "type": "string", "format": "datetime" } 23 30 }
+4
lexicons/social/grain/gallery/defs.json
··· 22 22 ] 23 23 } 24 24 }, 25 + "labels": { 26 + "type": "array", 27 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 28 + }, 25 29 "indexedAt": { "type": "string", "format": "datetime" } 26 30 } 27 31 }
+5
lexicons/social/grain/gallery/gallery.json
··· 11 11 "properties": { 12 12 "title": { "type": "string", "maxLength": 100 }, 13 13 "description": { "type": "string", "maxLength": 1000 }, 14 + "labels": { 15 + "type": "union", 16 + "description": "Self-label values for this post. Effectively content warnings.", 17 + "refs": ["com.atproto.label.defs#selfLabels"] 18 + }, 14 19 "createdAt": { "type": "string", "format": "datetime" } 15 20 } 16 21 }
+94
lexicons/social/grain/labelers/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.grain.labeler.defs", 4 + "defs": { 5 + "labelerView": { 6 + "type": "object", 7 + "required": ["uri", "cid", "creator", "indexedAt"], 8 + "properties": { 9 + "uri": { "type": "string", "format": "at-uri" }, 10 + "cid": { "type": "string", "format": "cid" }, 11 + "creator": { 12 + "type": "ref", 13 + "ref": "social.grain.actor.defs#profileView" 14 + }, 15 + "favoriteCount": { "type": "integer", "minimum": 0 }, 16 + "viewer": { "type": "ref", "ref": "#labelerViewerState" }, 17 + "indexedAt": { "type": "string", "format": "datetime" }, 18 + "labels": { 19 + "type": "array", 20 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 21 + } 22 + } 23 + }, 24 + "labelerViewDetailed": { 25 + "type": "object", 26 + "required": ["uri", "cid", "creator", "policies", "indexedAt"], 27 + "properties": { 28 + "uri": { "type": "string", "format": "at-uri" }, 29 + "cid": { "type": "string", "format": "cid" }, 30 + "creator": { "type": "ref", "ref": "app.bsky.actor.defs#profileView" }, 31 + "policies": { 32 + "type": "ref", 33 + "ref": "social.grain.actor.defs#labelerPolicies" 34 + }, 35 + "favoriteCount": { "type": "integer", "minimum": 0 }, 36 + "viewer": { "type": "ref", "ref": "#labelerViewerState" }, 37 + "indexedAt": { "type": "string", "format": "datetime" }, 38 + "labels": { 39 + "type": "array", 40 + "items": { "type": "ref", "ref": "com.atproto.label.defs#label" } 41 + }, 42 + "reasonTypes": { 43 + "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", 44 + "type": "array", 45 + "items": { 46 + "type": "ref", 47 + "ref": "com.atproto.moderation.defs#reasonType" 48 + } 49 + }, 50 + "subjectTypes": { 51 + "description": "The set of subject types (account, record, etc) this service accepts reports on.", 52 + "type": "array", 53 + "items": { 54 + "type": "ref", 55 + "ref": "com.atproto.moderation.defs#subjectType" 56 + } 57 + }, 58 + "subjectCollections": { 59 + "type": "array", 60 + "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", 61 + "items": { "type": "string", "format": "nsid" } 62 + } 63 + } 64 + }, 65 + "labelerViewerState": { 66 + "type": "object", 67 + "properties": { 68 + "like": { "type": "string", "format": "at-uri" } 69 + } 70 + }, 71 + "labelerPolicies": { 72 + "type": "object", 73 + "required": ["labelValues"], 74 + "properties": { 75 + "labelValues": { 76 + "type": "array", 77 + "description": "The label values which this labeler publishes. May include global or custom labels.", 78 + "items": { 79 + "type": "ref", 80 + "ref": "com.atproto.label.defs#labelValue" 81 + } 82 + }, 83 + "labelValueDefinitions": { 84 + "type": "array", 85 + "description": "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.", 86 + "items": { 87 + "type": "ref", 88 + "ref": "com.atproto.label.defs#labelValueDefinition" 89 + } 90 + } 91 + } 92 + } 93 + } 94 + }
+47
lexicons/social/grain/labelers/service.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.grain.labeler.service", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A declaration of the existence of labeler service.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": ["policies", "createdAt"], 12 + "properties": { 13 + "policies": { 14 + "type": "ref", 15 + "ref": "app.bsky.labeler.defs#labelerPolicies" 16 + }, 17 + "labels": { 18 + "type": "union", 19 + "refs": ["com.atproto.label.defs#selfLabels"] 20 + }, 21 + "createdAt": { "type": "string", "format": "datetime" }, 22 + "reasonTypes": { 23 + "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", 24 + "type": "array", 25 + "items": { 26 + "type": "ref", 27 + "ref": "com.atproto.moderation.defs#reasonType" 28 + } 29 + }, 30 + "subjectTypes": { 31 + "description": "The set of subject types (account, record, etc) this service accepts reports on.", 32 + "type": "array", 33 + "items": { 34 + "type": "ref", 35 + "ref": "com.atproto.moderation.defs#subjectType" 36 + } 37 + }, 38 + "subjectCollections": { 39 + "type": "array", 40 + "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.", 41 + "items": { "type": "string", "format": "nsid" } 42 + } 43 + } 44 + } 45 + } 46 + } 47 + }
+1 -1
lexicons/social/grain/photo/exif.json
··· 4 4 "defs": { 5 5 "main": { 6 6 "type": "record", 7 - "description": "Basic EXIF metadata for a photo", 7 + "description": "Basic EXIF metadata for a photo. Integers are scaled by 1000000 to accommodate decimal values and potentially other tags in the future.", 8 8 "key": "tid", 9 9 "record": { 10 10 "type": "object",
+4
services/mod/.dockerignore
··· 1 + **/node_modules 2 + **/*.db 3 + *.toml 4 + .env
+3
services/mod/.env.example
··· 1 + MOD_SERVICE_PORT=8080 2 + MOD_SERVICE_DATABASE_URL=sqlite.db 3 + MOD_SERVICE_SIGNING_KEY=your-signing-key
+11
services/mod/Dockerfile
··· 1 + FROM denoland/deno:2.3.3 2 + 3 + WORKDIR /app 4 + 5 + COPY . . 6 + 7 + RUN deno cache main.ts 8 + 9 + EXPOSE 8080 10 + 11 + CMD ["run", "-A", "main.ts"]
+103
services/mod/__generated__/index.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { 5 + createServer as createXrpcServer, 6 + Server as XrpcServer, 7 + type Options as XrpcOptions, 8 + type AuthVerifier, 9 + type StreamAuthVerifier, 10 + } from "npm:@atproto/xrpc-server" 11 + import { schemas } from './lexicons.ts' 12 + import * as ComAtprotoLabelSubscribeLabels from './types/com/atproto/label/subscribeLabels.ts' 13 + import * as ComAtprotoLabelQueryLabels from './types/com/atproto/label/queryLabels.ts' 14 + 15 + export function createServer(options?: XrpcOptions): Server { 16 + return new Server(options) 17 + } 18 + 19 + export class Server { 20 + xrpc: XrpcServer 21 + com: ComNS 22 + 23 + constructor(options?: XrpcOptions) { 24 + this.xrpc = createXrpcServer(schemas, options) 25 + this.com = new ComNS(this) 26 + } 27 + } 28 + 29 + export class ComNS { 30 + _server: Server 31 + atproto: ComAtprotoNS 32 + 33 + constructor(server: Server) { 34 + this._server = server 35 + this.atproto = new ComAtprotoNS(server) 36 + } 37 + } 38 + 39 + export class ComAtprotoNS { 40 + _server: Server 41 + label: ComAtprotoLabelNS 42 + 43 + constructor(server: Server) { 44 + this._server = server 45 + this.label = new ComAtprotoLabelNS(server) 46 + } 47 + } 48 + 49 + export class ComAtprotoLabelNS { 50 + _server: Server 51 + 52 + constructor(server: Server) { 53 + this._server = server 54 + } 55 + 56 + subscribeLabels<AV extends StreamAuthVerifier>( 57 + cfg: ConfigOf< 58 + AV, 59 + ComAtprotoLabelSubscribeLabels.Handler<ExtractAuth<AV>>, 60 + ComAtprotoLabelSubscribeLabels.HandlerReqCtx<ExtractAuth<AV>> 61 + >, 62 + ) { 63 + const nsid = 'com.atproto.label.subscribeLabels' // @ts-ignore 64 + return this._server.xrpc.streamMethod(nsid, cfg) 65 + } 66 + 67 + queryLabels<AV extends AuthVerifier>( 68 + cfg: ConfigOf< 69 + AV, 70 + ComAtprotoLabelQueryLabels.Handler<ExtractAuth<AV>>, 71 + ComAtprotoLabelQueryLabels.HandlerReqCtx<ExtractAuth<AV>> 72 + >, 73 + ) { 74 + const nsid = 'com.atproto.label.queryLabels' // @ts-ignore 75 + return this._server.xrpc.method(nsid, cfg) 76 + } 77 + } 78 + 79 + type SharedRateLimitOpts<T> = { 80 + name: string 81 + calcKey?: (ctx: T) => string | null 82 + calcPoints?: (ctx: T) => number 83 + } 84 + type RouteRateLimitOpts<T> = { 85 + durationMs: number 86 + points: number 87 + calcKey?: (ctx: T) => string | null 88 + calcPoints?: (ctx: T) => number 89 + } 90 + type HandlerOpts = { blobLimit?: number } 91 + type HandlerRateLimitOpts<T> = SharedRateLimitOpts<T> | RouteRateLimitOpts<T> 92 + type ConfigOf<Auth, Handler, ReqCtx> = 93 + | Handler 94 + | { 95 + auth?: Auth 96 + opts?: HandlerOpts 97 + rateLimit?: HandlerRateLimitOpts<ReqCtx> | HandlerRateLimitOpts<ReqCtx>[] 98 + handler: Handler 99 + } 100 + type ExtractAuth<AV extends AuthVerifier | StreamAuthVerifier> = Extract< 101 + Awaited<ReturnType<AV>>, 102 + { credentials: unknown } 103 + >
+353
services/mod/__generated__/lexicons.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { 5 + type LexiconDoc, 6 + Lexicons, 7 + ValidationError, 8 + type ValidationResult, 9 + } from "npm:@atproto/lexicon" 10 + import { type $Typed, is$typed, maybe$typed } from './util.ts' 11 + 12 + export const schemaDict = { 13 + ComAtprotoLabelSubscribeLabels: { 14 + lexicon: 1, 15 + id: 'com.atproto.label.subscribeLabels', 16 + defs: { 17 + info: { 18 + type: 'object', 19 + required: ['name'], 20 + properties: { 21 + name: { 22 + type: 'string', 23 + knownValues: ['OutdatedCursor'], 24 + }, 25 + message: { 26 + type: 'string', 27 + }, 28 + }, 29 + }, 30 + main: { 31 + type: 'subscription', 32 + errors: [ 33 + { 34 + name: 'FutureCursor', 35 + }, 36 + ], 37 + message: { 38 + schema: { 39 + refs: [ 40 + 'lex:com.atproto.label.subscribeLabels#labels', 41 + 'lex:com.atproto.label.subscribeLabels#info', 42 + ], 43 + type: 'union', 44 + }, 45 + }, 46 + parameters: { 47 + type: 'params', 48 + properties: { 49 + cursor: { 50 + type: 'integer', 51 + description: 'The last known event seq number to backfill from.', 52 + }, 53 + }, 54 + }, 55 + description: 56 + 'Subscribe to stream of labels (and negations). Public endpoint implemented by mod services. Uses same sequencing scheme as repo event stream.', 57 + }, 58 + labels: { 59 + type: 'object', 60 + required: ['seq', 'labels'], 61 + properties: { 62 + seq: { 63 + type: 'integer', 64 + }, 65 + labels: { 66 + type: 'array', 67 + items: { 68 + ref: 'lex:com.atproto.label.defs#label', 69 + type: 'ref', 70 + }, 71 + }, 72 + }, 73 + }, 74 + }, 75 + }, 76 + ComAtprotoLabelDefs: { 77 + lexicon: 1, 78 + id: 'com.atproto.label.defs', 79 + defs: { 80 + label: { 81 + type: 'object', 82 + required: ['src', 'uri', 'val', 'cts'], 83 + properties: { 84 + cid: { 85 + type: 'string', 86 + format: 'cid', 87 + description: 88 + "Optionally, CID specifying the specific version of 'uri' resource this label applies to.", 89 + }, 90 + cts: { 91 + type: 'string', 92 + format: 'datetime', 93 + description: 'Timestamp when this label was created.', 94 + }, 95 + exp: { 96 + type: 'string', 97 + format: 'datetime', 98 + description: 99 + 'Timestamp at which this label expires (no longer applies).', 100 + }, 101 + neg: { 102 + type: 'boolean', 103 + description: 104 + 'If true, this is a negation label, overwriting a previous label.', 105 + }, 106 + sig: { 107 + type: 'bytes', 108 + description: 'Signature of dag-cbor encoded label.', 109 + }, 110 + src: { 111 + type: 'string', 112 + format: 'did', 113 + description: 'DID of the actor who created this label.', 114 + }, 115 + uri: { 116 + type: 'string', 117 + format: 'uri', 118 + description: 119 + 'AT URI of the record, repository (account), or other resource that this label applies to.', 120 + }, 121 + val: { 122 + type: 'string', 123 + maxLength: 128, 124 + description: 125 + 'The short string name of the value or type of this label.', 126 + }, 127 + ver: { 128 + type: 'integer', 129 + description: 'The AT Protocol version of the label object.', 130 + }, 131 + }, 132 + description: 133 + 'Metadata tag on an atproto resource (eg, repo or record).', 134 + }, 135 + selfLabel: { 136 + type: 'object', 137 + required: ['val'], 138 + properties: { 139 + val: { 140 + type: 'string', 141 + maxLength: 128, 142 + description: 143 + 'The short string name of the value or type of this label.', 144 + }, 145 + }, 146 + description: 147 + 'Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.', 148 + }, 149 + labelValue: { 150 + type: 'string', 151 + knownValues: [ 152 + '!hide', 153 + '!no-promote', 154 + '!warn', 155 + '!no-unauthenticated', 156 + 'dmca-violation', 157 + 'doxxing', 158 + 'porn', 159 + 'sexual', 160 + 'nudity', 161 + 'nsfl', 162 + 'gore', 163 + ], 164 + }, 165 + selfLabels: { 166 + type: 'object', 167 + required: ['values'], 168 + properties: { 169 + values: { 170 + type: 'array', 171 + items: { 172 + ref: 'lex:com.atproto.label.defs#selfLabel', 173 + type: 'ref', 174 + }, 175 + maxLength: 10, 176 + }, 177 + }, 178 + description: 179 + 'Metadata tags on an atproto record, published by the author within the record.', 180 + }, 181 + labelValueDefinition: { 182 + type: 'object', 183 + required: ['identifier', 'severity', 'blurs', 'locales'], 184 + properties: { 185 + blurs: { 186 + type: 'string', 187 + description: 188 + "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", 189 + knownValues: ['content', 'media', 'none'], 190 + }, 191 + locales: { 192 + type: 'array', 193 + items: { 194 + ref: 'lex:com.atproto.label.defs#labelValueDefinitionStrings', 195 + type: 'ref', 196 + }, 197 + }, 198 + severity: { 199 + type: 'string', 200 + description: 201 + "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 202 + knownValues: ['inform', 'alert', 'none'], 203 + }, 204 + adultOnly: { 205 + type: 'boolean', 206 + description: 207 + 'Does the user need to have adult content enabled in order to configure this label?', 208 + }, 209 + identifier: { 210 + type: 'string', 211 + maxLength: 100, 212 + description: 213 + "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 214 + maxGraphemes: 100, 215 + }, 216 + defaultSetting: { 217 + type: 'string', 218 + default: 'warn', 219 + description: 'The default setting for this label.', 220 + knownValues: ['ignore', 'warn', 'hide'], 221 + }, 222 + }, 223 + description: 224 + 'Declares a label value and its expected interpretations and behaviors.', 225 + }, 226 + labelValueDefinitionStrings: { 227 + type: 'object', 228 + required: ['lang', 'name', 'description'], 229 + properties: { 230 + lang: { 231 + type: 'string', 232 + format: 'language', 233 + description: 234 + 'The code of the language these strings are written in.', 235 + }, 236 + name: { 237 + type: 'string', 238 + maxLength: 640, 239 + description: 'A short human-readable name for the label.', 240 + maxGraphemes: 64, 241 + }, 242 + description: { 243 + type: 'string', 244 + maxLength: 100000, 245 + description: 246 + 'A longer description of what the label means and why it might be applied.', 247 + maxGraphemes: 10000, 248 + }, 249 + }, 250 + description: 251 + 'Strings which describe the label in the UI, localized into a specific language.', 252 + }, 253 + }, 254 + }, 255 + ComAtprotoLabelQueryLabels: { 256 + lexicon: 1, 257 + id: 'com.atproto.label.queryLabels', 258 + defs: { 259 + main: { 260 + type: 'query', 261 + output: { 262 + schema: { 263 + type: 'object', 264 + required: ['labels'], 265 + properties: { 266 + cursor: { 267 + type: 'string', 268 + }, 269 + labels: { 270 + type: 'array', 271 + items: { 272 + ref: 'lex:com.atproto.label.defs#label', 273 + type: 'ref', 274 + }, 275 + }, 276 + }, 277 + }, 278 + encoding: 'application/json', 279 + }, 280 + parameters: { 281 + type: 'params', 282 + required: ['uriPatterns'], 283 + properties: { 284 + limit: { 285 + type: 'integer', 286 + default: 50, 287 + maximum: 250, 288 + minimum: 1, 289 + }, 290 + cursor: { 291 + type: 'string', 292 + }, 293 + sources: { 294 + type: 'array', 295 + items: { 296 + type: 'string', 297 + format: 'did', 298 + }, 299 + description: 300 + 'Optional list of label sources (DIDs) to filter on.', 301 + }, 302 + uriPatterns: { 303 + type: 'array', 304 + items: { 305 + type: 'string', 306 + }, 307 + description: 308 + "List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI.", 309 + }, 310 + }, 311 + }, 312 + description: 313 + 'Find labels relevant to the provided AT-URI patterns. Public endpoint for moderation services, though may return different or additional results with auth.', 314 + }, 315 + }, 316 + }, 317 + } as const satisfies Record<string, LexiconDoc> 318 + export const schemas = Object.values(schemaDict) satisfies LexiconDoc[] 319 + export const lexicons: Lexicons = new Lexicons(schemas) 320 + 321 + export function validate<T extends { $type: string }>( 322 + v: unknown, 323 + id: string, 324 + hash: string, 325 + requiredType: true, 326 + ): ValidationResult<T> 327 + export function validate<T extends { $type?: string }>( 328 + v: unknown, 329 + id: string, 330 + hash: string, 331 + requiredType?: false, 332 + ): ValidationResult<T> 333 + export function validate( 334 + v: unknown, 335 + id: string, 336 + hash: string, 337 + requiredType?: boolean, 338 + ): ValidationResult { 339 + return (requiredType ? is$typed : maybe$typed)(v, id, hash) 340 + ? lexicons.validate(`${id}#${hash}`, v) 341 + : { 342 + success: false, 343 + error: new ValidationError( 344 + `Must be an object with "${hash === 'main' ? id : `${id}#${hash}`}" $type property`, 345 + ), 346 + } 347 + } 348 + 349 + export const ids = { 350 + ComAtprotoLabelSubscribeLabels: 'com.atproto.label.subscribeLabels', 351 + ComAtprotoLabelDefs: 'com.atproto.label.defs', 352 + ComAtprotoLabelQueryLabels: 'com.atproto.label.queryLabels', 353 + } as const
+146
services/mod/__generated__/types/com/atproto/label/defs.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { type ValidationResult, BlobRef } from "npm:@atproto/lexicon" 5 + import { CID } from "npm:multiformats/cid" 6 + import { validate as _validate } from '../../../../lexicons.ts' 7 + import { 8 + type $Typed, 9 + is$typed as _is$typed, 10 + type OmitKey, 11 + } from '../../../../util.ts' 12 + 13 + const is$typed = _is$typed, 14 + validate = _validate 15 + const id = 'com.atproto.label.defs' 16 + 17 + /** Metadata tag on an atproto resource (eg, repo or record). */ 18 + export interface Label { 19 + $type?: 'com.atproto.label.defs#label' 20 + /** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */ 21 + cid?: string 22 + /** Timestamp when this label was created. */ 23 + cts: string 24 + /** Timestamp at which this label expires (no longer applies). */ 25 + exp?: string 26 + /** If true, this is a negation label, overwriting a previous label. */ 27 + neg?: boolean 28 + /** Signature of dag-cbor encoded label. */ 29 + sig?: Uint8Array 30 + /** DID of the actor who created this label. */ 31 + src: string 32 + /** AT URI of the record, repository (account), or other resource that this label applies to. */ 33 + uri: string 34 + /** The short string name of the value or type of this label. */ 35 + val: string 36 + /** The AT Protocol version of the label object. */ 37 + ver?: number 38 + } 39 + 40 + const hashLabel = 'label' 41 + 42 + export function isLabel<V>(v: V) { 43 + return is$typed(v, id, hashLabel) 44 + } 45 + 46 + export function validateLabel<V>(v: V) { 47 + return validate<Label & V>(v, id, hashLabel) 48 + } 49 + 50 + /** Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel. */ 51 + export interface SelfLabel { 52 + $type?: 'com.atproto.label.defs#selfLabel' 53 + /** The short string name of the value or type of this label. */ 54 + val: string 55 + } 56 + 57 + const hashSelfLabel = 'selfLabel' 58 + 59 + export function isSelfLabel<V>(v: V) { 60 + return is$typed(v, id, hashSelfLabel) 61 + } 62 + 63 + export function validateSelfLabel<V>(v: V) { 64 + return validate<SelfLabel & V>(v, id, hashSelfLabel) 65 + } 66 + 67 + export type LabelValue = 68 + | '!hide' 69 + | '!no-promote' 70 + | '!warn' 71 + | '!no-unauthenticated' 72 + | 'dmca-violation' 73 + | 'doxxing' 74 + | 'porn' 75 + | 'sexual' 76 + | 'nudity' 77 + | 'nsfl' 78 + | 'gore' 79 + | (string & {}) 80 + 81 + /** Metadata tags on an atproto record, published by the author within the record. */ 82 + export interface SelfLabels { 83 + $type?: 'com.atproto.label.defs#selfLabels' 84 + values: SelfLabel[] 85 + } 86 + 87 + const hashSelfLabels = 'selfLabels' 88 + 89 + export function isSelfLabels<V>(v: V) { 90 + return is$typed(v, id, hashSelfLabels) 91 + } 92 + 93 + export function validateSelfLabels<V>(v: V) { 94 + return validate<SelfLabels & V>(v, id, hashSelfLabels) 95 + } 96 + 97 + /** Declares a label value and its expected interpretations and behaviors. */ 98 + export interface LabelValueDefinition { 99 + $type?: 'com.atproto.label.defs#labelValueDefinition' 100 + /** What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing. */ 101 + blurs: 'content' | 'media' | 'none' | (string & {}) 102 + locales: LabelValueDefinitionStrings[] 103 + /** How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. */ 104 + severity: 'inform' | 'alert' | 'none' | (string & {}) 105 + /** Does the user need to have adult content enabled in order to configure this label? */ 106 + adultOnly?: boolean 107 + /** The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). */ 108 + identifier: string 109 + /** The default setting for this label. */ 110 + defaultSetting: 'ignore' | 'warn' | 'hide' | (string & {}) 111 + } 112 + 113 + const hashLabelValueDefinition = 'labelValueDefinition' 114 + 115 + export function isLabelValueDefinition<V>(v: V) { 116 + return is$typed(v, id, hashLabelValueDefinition) 117 + } 118 + 119 + export function validateLabelValueDefinition<V>(v: V) { 120 + return validate<LabelValueDefinition & V>(v, id, hashLabelValueDefinition) 121 + } 122 + 123 + /** Strings which describe the label in the UI, localized into a specific language. */ 124 + export interface LabelValueDefinitionStrings { 125 + $type?: 'com.atproto.label.defs#labelValueDefinitionStrings' 126 + /** The code of the language these strings are written in. */ 127 + lang: string 128 + /** A short human-readable name for the label. */ 129 + name: string 130 + /** A longer description of what the label means and why it might be applied. */ 131 + description: string 132 + } 133 + 134 + const hashLabelValueDefinitionStrings = 'labelValueDefinitionStrings' 135 + 136 + export function isLabelValueDefinitionStrings<V>(v: V) { 137 + return is$typed(v, id, hashLabelValueDefinitionStrings) 138 + } 139 + 140 + export function validateLabelValueDefinitionStrings<V>(v: V) { 141 + return validate<LabelValueDefinitionStrings & V>( 142 + v, 143 + id, 144 + hashLabelValueDefinitionStrings, 145 + ) 146 + }
+54
services/mod/__generated__/types/com/atproto/label/queryLabels.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { HandlerAuth, HandlerPipeThrough } from "npm:@atproto/xrpc-server"; 5 + import express from "npm:express"; 6 + import { validate as _validate } from "../../../../lexicons.ts"; 7 + import { is$typed as _is$typed } from "../../../../util.ts"; 8 + import type * as ComAtprotoLabelDefs from "./defs.ts"; 9 + 10 + const is$typed = _is$typed, 11 + validate = _validate; 12 + const id = "com.atproto.label.queryLabels"; 13 + 14 + export interface QueryParams { 15 + limit: number; 16 + cursor?: string; 17 + /** Optional list of label sources (DIDs) to filter on. */ 18 + sources?: string[]; 19 + /** List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI. */ 20 + uriPatterns: string[]; 21 + } 22 + 23 + export type InputSchema = undefined; 24 + 25 + export interface OutputSchema { 26 + cursor?: string; 27 + labels: ComAtprotoLabelDefs.Label[]; 28 + } 29 + 30 + export type HandlerInput = undefined; 31 + 32 + export interface HandlerSuccess { 33 + encoding: "application/json"; 34 + body: OutputSchema; 35 + headers?: { [key: string]: string }; 36 + } 37 + 38 + export interface HandlerError { 39 + status: number; 40 + message?: string; 41 + } 42 + 43 + export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough; 44 + export type HandlerReqCtx<HA extends HandlerAuth = never> = { 45 + auth: HA; 46 + params: QueryParams; 47 + input: HandlerInput; 48 + req: express.Request; 49 + res: express.Response; 50 + resetRouteRateLimits: () => Promise<void>; 51 + }; 52 + export type Handler<HA extends HandlerAuth = never> = ( 53 + ctx: HandlerReqCtx<HA>, 54 + ) => Promise<HandlerOutput> | HandlerOutput;
+68
services/mod/__generated__/types/com/atproto/label/subscribeLabels.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { type ValidationResult, BlobRef } from "npm:@atproto/lexicon" 5 + import { CID } from "npm:multiformats/cid" 6 + import { validate as _validate } from '../../../../lexicons.ts' 7 + import { 8 + type $Typed, 9 + is$typed as _is$typed, 10 + type OmitKey, 11 + } from '../../../../util.ts' 12 + import { HandlerAuth, ErrorFrame } from "npm:@atproto/xrpc-server" 13 + import { IncomingMessage } from 'node:http' 14 + import type * as ComAtprotoLabelDefs from './defs.ts' 15 + 16 + const is$typed = _is$typed, 17 + validate = _validate 18 + const id = 'com.atproto.label.subscribeLabels' 19 + 20 + export interface Info { 21 + $type?: 'com.atproto.label.subscribeLabels#info' 22 + name: 'OutdatedCursor' | (string & {}) 23 + message?: string 24 + } 25 + 26 + const hashInfo = 'info' 27 + 28 + export function isInfo<V>(v: V) { 29 + return is$typed(v, id, hashInfo) 30 + } 31 + 32 + export function validateInfo<V>(v: V) { 33 + return validate<Info & V>(v, id, hashInfo) 34 + } 35 + 36 + export interface QueryParams { 37 + /** The last known event seq number to backfill from. */ 38 + cursor?: number 39 + } 40 + 41 + export type OutputSchema = $Typed<Labels> | $Typed<Info> | { $type: string } 42 + export type HandlerError = ErrorFrame<'FutureCursor'> 43 + export type HandlerOutput = HandlerError | OutputSchema 44 + export type HandlerReqCtx<HA extends HandlerAuth = never> = { 45 + auth: HA 46 + params: QueryParams 47 + req: IncomingMessage 48 + signal: AbortSignal 49 + } 50 + export type Handler<HA extends HandlerAuth = never> = ( 51 + ctx: HandlerReqCtx<HA>, 52 + ) => AsyncIterable<HandlerOutput> 53 + 54 + export interface Labels { 55 + $type?: 'com.atproto.label.subscribeLabels#labels' 56 + seq: number 57 + labels: ComAtprotoLabelDefs.Label[] 58 + } 59 + 60 + const hashLabels = 'labels' 61 + 62 + export function isLabels<V>(v: V) { 63 + return is$typed(v, id, hashLabels) 64 + } 65 + 66 + export function validateLabels<V>(v: V) { 67 + return validate<Labels & V>(v, id, hashLabels) 68 + }
+82
services/mod/__generated__/util.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + 5 + import { type ValidationResult } from "npm:@atproto/lexicon" 6 + 7 + export type OmitKey<T, K extends keyof T> = { 8 + [K2 in keyof T as K2 extends K ? never : K2]: T[K2] 9 + } 10 + 11 + export type $Typed<V, T extends string = string> = V & { $type: T } 12 + export type Un$Typed<V extends { $type?: string }> = OmitKey<V, '$type'> 13 + 14 + export type $Type<Id extends string, Hash extends string> = Hash extends 'main' 15 + ? Id 16 + : `${Id}#${Hash}` 17 + 18 + function isObject<V>(v: V): v is V & object { 19 + return v != null && typeof v === 'object' 20 + } 21 + 22 + function is$type<Id extends string, Hash extends string>( 23 + $type: unknown, 24 + id: Id, 25 + hash: Hash, 26 + ): $type is $Type<Id, Hash> { 27 + return hash === 'main' 28 + ? $type === id 29 + : // $type === `${id}#${hash}` 30 + typeof $type === 'string' && 31 + $type.length === id.length + 1 + hash.length && 32 + $type.charCodeAt(id.length) === 35 /* '#' */ && 33 + $type.startsWith(id) && 34 + $type.endsWith(hash) 35 + } 36 + 37 + export type $TypedObject< 38 + V, 39 + Id extends string, 40 + Hash extends string, 41 + > = V extends { 42 + $type: $Type<Id, Hash> 43 + } 44 + ? V 45 + : V extends { $type?: string } 46 + ? V extends { $type?: infer T extends $Type<Id, Hash> } 47 + ? V & { $type: T } 48 + : never 49 + : V & { $type: $Type<Id, Hash> } 50 + 51 + export function is$typed<V, Id extends string, Hash extends string>( 52 + v: V, 53 + id: Id, 54 + hash: Hash, 55 + ): v is $TypedObject<V, Id, Hash> { 56 + return isObject(v) && '$type' in v && is$type(v.$type, id, hash) 57 + } 58 + 59 + export function maybe$typed<V, Id extends string, Hash extends string>( 60 + v: V, 61 + id: Id, 62 + hash: Hash, 63 + ): v is V & object & { $type?: $Type<Id, Hash> } { 64 + return ( 65 + isObject(v) && 66 + ('$type' in v ? v.$type === undefined || is$type(v.$type, id, hash) : true) 67 + ) 68 + } 69 + 70 + export type Validator<R = unknown> = (v: unknown) => ValidationResult<R> 71 + export type ValidatorParam<V extends Validator> = 72 + V extends Validator<infer R> ? R : never 73 + 74 + /** 75 + * Utility function that allows to convert a "validate*" utility function into a 76 + * type predicate. 77 + */ 78 + export function asPredicate<V extends Validator>(validate: V) { 79 + return function <T>(v: T): v is T & ValidatorParam<V> { 80 + return validate(v).success 81 + } 82 + }
+99
services/mod/bin.ts
··· 1 + import { stringifyLex } from "npm:@atproto/lexicon"; 2 + import type { LabelRow } from "./main.ts"; 3 + import { 4 + createConfig, 5 + createDb, 6 + createLabel, 7 + createModService, 8 + ModService, 9 + } from "./main.ts"; 10 + 11 + async function handleCreate( 12 + args: string[], 13 + cfg: Awaited<ReturnType<typeof createConfig>>, 14 + modService: ModService, 15 + ) { 16 + const [src, uri, val, negArg] = args; 17 + if (!src || !uri || !val) { 18 + console.error("Usage: deno run -A bin.ts create <src> <uri> <val> [neg]"); 19 + Deno.exit(1); 20 + } 21 + const neg = negArg === "true" || negArg === "1"; 22 + const doCreateLabel = createLabel(cfg, modService); 23 + await doCreateLabel({ 24 + src, 25 + uri, 26 + val, 27 + neg, 28 + cts: new Date().toISOString(), 29 + }); 30 + console.log( 31 + `Label created for src: ${src}, uri: ${uri}, val: ${val}, neg: ${neg}`, 32 + ); 33 + } 34 + 35 + function parseQueryArgs(args: string[]) { 36 + let src = ""; 37 + let val = ""; 38 + let limit = 50; 39 + let cursor = 0; 40 + const patterns: string[] = []; 41 + let i = 0; 42 + while (i < args.length) { 43 + if (args[i] === "--src" && args[i + 1]) { 44 + src = args[i + 1]; 45 + i += 2; 46 + continue; 47 + } 48 + if (args[i] === "--val" && args[i + 1]) { 49 + val = args[i + 1]; 50 + i += 2; 51 + continue; 52 + } 53 + if (args[i] === "--limit" && args[i + 1]) { 54 + limit = parseInt(args[i + 1], 10); 55 + i += 2; 56 + continue; 57 + } 58 + if (args[i] === "--cursor" && args[i + 1]) { 59 + cursor = parseInt(args[i + 1], 10); 60 + i += 2; 61 + continue; 62 + } 63 + i++; 64 + } 65 + return { src, val, limit, cursor, patterns }; 66 + } 67 + 68 + function handleQuery(args: string[], modService: ModService) { 69 + // Usage: deno run -A bin.ts query [--src <src>] [--val <val>] [--limit <n>] [--cursor <id>] 70 + const { src, val, limit, cursor, patterns } = parseQueryArgs(args); 71 + const sources = src ? [src] : []; 72 + // If val is set, filter in JS after query 73 + const { rows } = modService.getLabels({ patterns, sources, limit, cursor }); 74 + const filtered = val ? rows.filter((r: LabelRow) => r.val === val) : rows; 75 + for (const row of filtered) { 76 + console.log(stringifyLex(row)); 77 + } 78 + } 79 + 80 + async function main() { 81 + const [cmd, ...args] = Deno.args; 82 + if (!cmd || ["create", "query"].indexOf(cmd) === -1) { 83 + console.error("Usage: deno run -A bin.ts <create|query> [...args]"); 84 + Deno.exit(1); 85 + } 86 + const cfg = await createConfig(); 87 + const db = createDb(cfg); 88 + const modService = createModService(db); 89 + 90 + if (cmd === "create") { 91 + await handleCreate(args, cfg, modService); 92 + } else if (cmd === "query") { 93 + handleQuery(args, modService); 94 + } 95 + } 96 + 97 + if (import.meta.main) { 98 + main(); 99 + }
+17
services/mod/deno.json
··· 1 + { 2 + "imports": { 3 + "$lexicon/": "./__generated__/", 4 + "@atproto/common": "npm:@atproto/common@^0.4.11", 5 + "@atproto/crypto": "npm:@atproto/crypto@^0.4.4", 6 + "@atproto/lexicon": "npm:@atproto/lexicon@^0.4.11", 7 + "@std/assert": "jsr:@std/assert@^1.0.13", 8 + "uint8arrays": "npm:uint8arrays@^5.1.0" 9 + }, 10 + "tasks": { 11 + "start": "deno run -A ./main.ts", 12 + "dev": "deno run -A --watch --env=.env ./main.ts", 13 + "test": "deno test -A main.ts", 14 + "codegen": "deno run -A jsr:@bigmoves/bff-cli@0.3.0-beta.30 lexgen" 15 + }, 16 + "nodeModulesDir": "auto" 17 + }
+831
services/mod/deno.lock
··· 1 + { 2 + "version": "5", 3 + "specifiers": { 4 + "jsr:@std/assert@^1.0.13": "1.0.13", 5 + "jsr:@std/internal@^1.0.6": "1.0.8", 6 + "npm:@atproto/common@~0.4.11": "0.4.11", 7 + "npm:@atproto/crypto@~0.4.4": "0.4.4", 8 + "npm:@atproto/lex-cli@*": "0.8.2", 9 + "npm:@atproto/lexicon@*": "0.4.11", 10 + "npm:@atproto/lexicon@~0.4.11": "0.4.11", 11 + "npm:@atproto/xrpc-server@*": "0.7.19", 12 + "npm:@types/node@*": "22.15.15", 13 + "npm:multiformats@*": "9.9.0", 14 + "npm:uint8arrays@^5.1.0": "5.1.0" 15 + }, 16 + "jsr": { 17 + "@std/assert@1.0.13": { 18 + "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29", 19 + "dependencies": [ 20 + "jsr:@std/internal" 21 + ] 22 + }, 23 + "@std/internal@1.0.8": { 24 + "integrity": "fc66e846d8d38a47cffd274d80d2ca3f0de71040f855783724bb6b87f60891f5" 25 + } 26 + }, 27 + "npm": { 28 + "@atproto/common-web@0.4.2": { 29 + "integrity": "sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw==", 30 + "dependencies": [ 31 + "graphemer", 32 + "multiformats@9.9.0", 33 + "uint8arrays@3.0.0", 34 + "zod" 35 + ] 36 + }, 37 + "@atproto/common@0.4.11": { 38 + "integrity": "sha512-Knv0viYXNMfCdIE7jLUiWJKnnMfEwg+vz2epJQi8WOjqtqCFb3W/3Jn72ZiuovIfpdm13MaOiny6w2NErUQC6g==", 39 + "dependencies": [ 40 + "@atproto/common-web", 41 + "@ipld/dag-cbor", 42 + "cbor-x", 43 + "iso-datestring-validator", 44 + "multiformats@9.9.0", 45 + "pino" 46 + ] 47 + }, 48 + "@atproto/crypto@0.4.4": { 49 + "integrity": "sha512-Yq9+crJ7WQl7sxStVpHgie5Z51R05etaK9DLWYG/7bR5T4bhdcIgF6IfklLShtZwLYdVVj+K15s0BqW9a8PSDA==", 50 + "dependencies": [ 51 + "@noble/curves", 52 + "@noble/hashes", 53 + "uint8arrays@3.0.0" 54 + ] 55 + }, 56 + "@atproto/lex-cli@0.8.2": { 57 + "integrity": "sha512-yNQFYBV3tBBLnVrRUtUBlx/WIF4ypMFsvOsCLjA7pHL1SyW9JbczSEAoiNtoDmPc4UXCjMtXggz0ovBG8lynNA==", 58 + "dependencies": [ 59 + "@atproto/lexicon", 60 + "@atproto/syntax", 61 + "chalk", 62 + "commander", 63 + "prettier", 64 + "ts-morph", 65 + "yesno", 66 + "zod" 67 + ], 68 + "bin": true 69 + }, 70 + "@atproto/lexicon@0.4.11": { 71 + "integrity": "sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw==", 72 + "dependencies": [ 73 + "@atproto/common-web", 74 + "@atproto/syntax", 75 + "iso-datestring-validator", 76 + "multiformats@9.9.0", 77 + "zod" 78 + ] 79 + }, 80 + "@atproto/syntax@0.4.0": { 81 + "integrity": "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA==" 82 + }, 83 + "@atproto/xrpc-server@0.7.19": { 84 + "integrity": "sha512-YSCl/tU2NDykgDYslFSOYCr96esUgDwncFiADKL59/fyIFPLoT0qY8Uq/budpxUh0qPzjow4HHgVWESOaOpUmA==", 85 + "dependencies": [ 86 + "@atproto/common", 87 + "@atproto/crypto", 88 + "@atproto/lexicon", 89 + "@atproto/xrpc", 90 + "cbor-x", 91 + "express", 92 + "http-errors", 93 + "mime-types", 94 + "rate-limiter-flexible", 95 + "uint8arrays@3.0.0", 96 + "ws", 97 + "zod" 98 + ] 99 + }, 100 + "@atproto/xrpc@0.7.0": { 101 + "integrity": "sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw==", 102 + "dependencies": [ 103 + "@atproto/lexicon", 104 + "zod" 105 + ] 106 + }, 107 + "@cbor-extract/cbor-extract-darwin-arm64@2.2.0": { 108 + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", 109 + "os": ["darwin"], 110 + "cpu": ["arm64"] 111 + }, 112 + "@cbor-extract/cbor-extract-darwin-x64@2.2.0": { 113 + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", 114 + "os": ["darwin"], 115 + "cpu": ["x64"] 116 + }, 117 + "@cbor-extract/cbor-extract-linux-arm64@2.2.0": { 118 + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", 119 + "os": ["linux"], 120 + "cpu": ["arm64"] 121 + }, 122 + "@cbor-extract/cbor-extract-linux-arm@2.2.0": { 123 + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", 124 + "os": ["linux"], 125 + "cpu": ["arm"] 126 + }, 127 + "@cbor-extract/cbor-extract-linux-x64@2.2.0": { 128 + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", 129 + "os": ["linux"], 130 + "cpu": ["x64"] 131 + }, 132 + "@cbor-extract/cbor-extract-win32-x64@2.2.0": { 133 + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", 134 + "os": ["win32"], 135 + "cpu": ["x64"] 136 + }, 137 + "@ipld/dag-cbor@7.0.3": { 138 + "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 139 + "dependencies": [ 140 + "cborg", 141 + "multiformats@9.9.0" 142 + ] 143 + }, 144 + "@noble/curves@1.9.2": { 145 + "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", 146 + "dependencies": [ 147 + "@noble/hashes" 148 + ] 149 + }, 150 + "@noble/hashes@1.8.0": { 151 + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" 152 + }, 153 + "@ts-morph/common@0.25.0": { 154 + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", 155 + "dependencies": [ 156 + "minimatch", 157 + "path-browserify", 158 + "tinyglobby" 159 + ] 160 + }, 161 + "@types/node@22.15.15": { 162 + "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", 163 + "dependencies": [ 164 + "undici-types" 165 + ] 166 + }, 167 + "abort-controller@3.0.0": { 168 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 169 + "dependencies": [ 170 + "event-target-shim" 171 + ] 172 + }, 173 + "accepts@1.3.8": { 174 + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 175 + "dependencies": [ 176 + "mime-types", 177 + "negotiator" 178 + ] 179 + }, 180 + "ansi-styles@4.3.0": { 181 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 182 + "dependencies": [ 183 + "color-convert" 184 + ] 185 + }, 186 + "array-flatten@1.1.1": { 187 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 188 + }, 189 + "atomic-sleep@1.0.0": { 190 + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" 191 + }, 192 + "balanced-match@1.0.2": { 193 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 194 + }, 195 + "base64-js@1.5.1": { 196 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 197 + }, 198 + "body-parser@1.20.3": { 199 + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 200 + "dependencies": [ 201 + "bytes", 202 + "content-type", 203 + "debug", 204 + "depd", 205 + "destroy", 206 + "http-errors", 207 + "iconv-lite", 208 + "on-finished", 209 + "qs", 210 + "raw-body", 211 + "type-is", 212 + "unpipe" 213 + ] 214 + }, 215 + "brace-expansion@2.0.1": { 216 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 217 + "dependencies": [ 218 + "balanced-match" 219 + ] 220 + }, 221 + "buffer@6.0.3": { 222 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 223 + "dependencies": [ 224 + "base64-js", 225 + "ieee754" 226 + ] 227 + }, 228 + "bytes@3.1.2": { 229 + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 230 + }, 231 + "call-bind-apply-helpers@1.0.2": { 232 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 233 + "dependencies": [ 234 + "es-errors", 235 + "function-bind" 236 + ] 237 + }, 238 + "call-bound@1.0.4": { 239 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 240 + "dependencies": [ 241 + "call-bind-apply-helpers", 242 + "get-intrinsic" 243 + ] 244 + }, 245 + "cbor-extract@2.2.0": { 246 + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", 247 + "dependencies": [ 248 + "node-gyp-build-optional-packages" 249 + ], 250 + "optionalDependencies": [ 251 + "@cbor-extract/cbor-extract-darwin-arm64", 252 + "@cbor-extract/cbor-extract-darwin-x64", 253 + "@cbor-extract/cbor-extract-linux-arm", 254 + "@cbor-extract/cbor-extract-linux-arm64", 255 + "@cbor-extract/cbor-extract-linux-x64", 256 + "@cbor-extract/cbor-extract-win32-x64" 257 + ], 258 + "scripts": true, 259 + "bin": true 260 + }, 261 + "cbor-x@1.6.0": { 262 + "integrity": "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==", 263 + "optionalDependencies": [ 264 + "cbor-extract" 265 + ] 266 + }, 267 + "cborg@1.10.2": { 268 + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", 269 + "bin": true 270 + }, 271 + "chalk@4.1.2": { 272 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 273 + "dependencies": [ 274 + "ansi-styles", 275 + "supports-color" 276 + ] 277 + }, 278 + "code-block-writer@13.0.3": { 279 + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" 280 + }, 281 + "color-convert@2.0.1": { 282 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 283 + "dependencies": [ 284 + "color-name" 285 + ] 286 + }, 287 + "color-name@1.1.4": { 288 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 289 + }, 290 + "commander@9.5.0": { 291 + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" 292 + }, 293 + "content-disposition@0.5.4": { 294 + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 295 + "dependencies": [ 296 + "safe-buffer" 297 + ] 298 + }, 299 + "content-type@1.0.5": { 300 + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 301 + }, 302 + "cookie-signature@1.0.6": { 303 + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 304 + }, 305 + "cookie@0.7.1": { 306 + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" 307 + }, 308 + "debug@2.6.9": { 309 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 310 + "dependencies": [ 311 + "ms@2.0.0" 312 + ] 313 + }, 314 + "depd@2.0.0": { 315 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 316 + }, 317 + "destroy@1.2.0": { 318 + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 319 + }, 320 + "detect-libc@2.0.4": { 321 + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" 322 + }, 323 + "dunder-proto@1.0.1": { 324 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 325 + "dependencies": [ 326 + "call-bind-apply-helpers", 327 + "es-errors", 328 + "gopd" 329 + ] 330 + }, 331 + "ee-first@1.1.1": { 332 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 333 + }, 334 + "encodeurl@1.0.2": { 335 + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 336 + }, 337 + "encodeurl@2.0.0": { 338 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" 339 + }, 340 + "es-define-property@1.0.1": { 341 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 342 + }, 343 + "es-errors@1.3.0": { 344 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 345 + }, 346 + "es-object-atoms@1.1.1": { 347 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 348 + "dependencies": [ 349 + "es-errors" 350 + ] 351 + }, 352 + "escape-html@1.0.3": { 353 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 354 + }, 355 + "etag@1.8.1": { 356 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 357 + }, 358 + "event-target-shim@5.0.1": { 359 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 360 + }, 361 + "events@3.3.0": { 362 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 363 + }, 364 + "express@4.21.2": { 365 + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", 366 + "dependencies": [ 367 + "accepts", 368 + "array-flatten", 369 + "body-parser", 370 + "content-disposition", 371 + "content-type", 372 + "cookie", 373 + "cookie-signature", 374 + "debug", 375 + "depd", 376 + "encodeurl@2.0.0", 377 + "escape-html", 378 + "etag", 379 + "finalhandler", 380 + "fresh", 381 + "http-errors", 382 + "merge-descriptors", 383 + "methods", 384 + "on-finished", 385 + "parseurl", 386 + "path-to-regexp", 387 + "proxy-addr", 388 + "qs", 389 + "range-parser", 390 + "safe-buffer", 391 + "send", 392 + "serve-static", 393 + "setprototypeof", 394 + "statuses", 395 + "type-is", 396 + "utils-merge", 397 + "vary" 398 + ] 399 + }, 400 + "fast-redact@3.5.0": { 401 + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==" 402 + }, 403 + "fdir@6.4.5_picomatch@4.0.2": { 404 + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", 405 + "dependencies": [ 406 + "picomatch" 407 + ], 408 + "optionalPeers": [ 409 + "picomatch" 410 + ] 411 + }, 412 + "finalhandler@1.3.1": { 413 + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 414 + "dependencies": [ 415 + "debug", 416 + "encodeurl@2.0.0", 417 + "escape-html", 418 + "on-finished", 419 + "parseurl", 420 + "statuses", 421 + "unpipe" 422 + ] 423 + }, 424 + "forwarded@0.2.0": { 425 + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 426 + }, 427 + "fresh@0.5.2": { 428 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 429 + }, 430 + "function-bind@1.1.2": { 431 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 432 + }, 433 + "get-intrinsic@1.3.0": { 434 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 435 + "dependencies": [ 436 + "call-bind-apply-helpers", 437 + "es-define-property", 438 + "es-errors", 439 + "es-object-atoms", 440 + "function-bind", 441 + "get-proto", 442 + "gopd", 443 + "has-symbols", 444 + "hasown", 445 + "math-intrinsics" 446 + ] 447 + }, 448 + "get-proto@1.0.1": { 449 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 450 + "dependencies": [ 451 + "dunder-proto", 452 + "es-object-atoms" 453 + ] 454 + }, 455 + "gopd@1.2.0": { 456 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 457 + }, 458 + "graphemer@1.4.0": { 459 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 460 + }, 461 + "has-flag@4.0.0": { 462 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 463 + }, 464 + "has-symbols@1.1.0": { 465 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" 466 + }, 467 + "hasown@2.0.2": { 468 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 469 + "dependencies": [ 470 + "function-bind" 471 + ] 472 + }, 473 + "http-errors@2.0.0": { 474 + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 475 + "dependencies": [ 476 + "depd", 477 + "inherits", 478 + "setprototypeof", 479 + "statuses", 480 + "toidentifier" 481 + ] 482 + }, 483 + "iconv-lite@0.4.24": { 484 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 485 + "dependencies": [ 486 + "safer-buffer" 487 + ] 488 + }, 489 + "ieee754@1.2.1": { 490 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 491 + }, 492 + "inherits@2.0.4": { 493 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 494 + }, 495 + "ipaddr.js@1.9.1": { 496 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 497 + }, 498 + "iso-datestring-validator@2.2.2": { 499 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 500 + }, 501 + "math-intrinsics@1.1.0": { 502 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 503 + }, 504 + "media-typer@0.3.0": { 505 + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 506 + }, 507 + "merge-descriptors@1.0.3": { 508 + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" 509 + }, 510 + "methods@1.1.2": { 511 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 512 + }, 513 + "mime-db@1.52.0": { 514 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 515 + }, 516 + "mime-types@2.1.35": { 517 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 518 + "dependencies": [ 519 + "mime-db" 520 + ] 521 + }, 522 + "mime@1.6.0": { 523 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 524 + "bin": true 525 + }, 526 + "minimatch@9.0.5": { 527 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 528 + "dependencies": [ 529 + "brace-expansion" 530 + ] 531 + }, 532 + "ms@2.0.0": { 533 + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 534 + }, 535 + "ms@2.1.3": { 536 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 537 + }, 538 + "multiformats@13.3.6": { 539 + "integrity": "sha512-yakbt9cPYj8d3vi/8o/XWm61MrOILo7fsTL0qxNx6zS0Nso6K5JqqS2WV7vK/KSuDBvrW3KfCwAdAgarAgOmww==" 540 + }, 541 + "multiformats@9.9.0": { 542 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 543 + }, 544 + "negotiator@0.6.3": { 545 + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 546 + }, 547 + "node-gyp-build-optional-packages@5.1.1": { 548 + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", 549 + "dependencies": [ 550 + "detect-libc" 551 + ], 552 + "bin": true 553 + }, 554 + "object-inspect@1.13.4": { 555 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" 556 + }, 557 + "on-exit-leak-free@2.1.2": { 558 + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" 559 + }, 560 + "on-finished@2.4.1": { 561 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 562 + "dependencies": [ 563 + "ee-first" 564 + ] 565 + }, 566 + "parseurl@1.3.3": { 567 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 568 + }, 569 + "path-browserify@1.0.1": { 570 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 571 + }, 572 + "path-to-regexp@0.1.12": { 573 + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" 574 + }, 575 + "picomatch@4.0.2": { 576 + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" 577 + }, 578 + "pino-abstract-transport@1.2.0": { 579 + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", 580 + "dependencies": [ 581 + "readable-stream", 582 + "split2" 583 + ] 584 + }, 585 + "pino-std-serializers@6.2.2": { 586 + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" 587 + }, 588 + "pino@8.21.0": { 589 + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", 590 + "dependencies": [ 591 + "atomic-sleep", 592 + "fast-redact", 593 + "on-exit-leak-free", 594 + "pino-abstract-transport", 595 + "pino-std-serializers", 596 + "process-warning", 597 + "quick-format-unescaped", 598 + "real-require", 599 + "safe-stable-stringify", 600 + "sonic-boom", 601 + "thread-stream" 602 + ], 603 + "bin": true 604 + }, 605 + "prettier@3.5.3": { 606 + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 607 + "bin": true 608 + }, 609 + "process-warning@3.0.0": { 610 + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" 611 + }, 612 + "process@0.11.10": { 613 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" 614 + }, 615 + "proxy-addr@2.0.7": { 616 + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 617 + "dependencies": [ 618 + "forwarded", 619 + "ipaddr.js" 620 + ] 621 + }, 622 + "qs@6.13.0": { 623 + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 624 + "dependencies": [ 625 + "side-channel" 626 + ] 627 + }, 628 + "quick-format-unescaped@4.0.4": { 629 + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" 630 + }, 631 + "range-parser@1.2.1": { 632 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 633 + }, 634 + "rate-limiter-flexible@2.4.2": { 635 + "integrity": "sha512-rMATGGOdO1suFyf/mI5LYhts71g1sbdhmd6YvdiXO2gJnd42Tt6QS4JUKJKSWVVkMtBacm6l40FR7Trjo6Iruw==" 636 + }, 637 + "raw-body@2.5.2": { 638 + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 639 + "dependencies": [ 640 + "bytes", 641 + "http-errors", 642 + "iconv-lite", 643 + "unpipe" 644 + ] 645 + }, 646 + "readable-stream@4.7.0": { 647 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 648 + "dependencies": [ 649 + "abort-controller", 650 + "buffer", 651 + "events", 652 + "process", 653 + "string_decoder" 654 + ] 655 + }, 656 + "real-require@0.2.0": { 657 + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" 658 + }, 659 + "safe-buffer@5.2.1": { 660 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 661 + }, 662 + "safe-stable-stringify@2.5.0": { 663 + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==" 664 + }, 665 + "safer-buffer@2.1.2": { 666 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 667 + }, 668 + "send@0.19.0": { 669 + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 670 + "dependencies": [ 671 + "debug", 672 + "depd", 673 + "destroy", 674 + "encodeurl@1.0.2", 675 + "escape-html", 676 + "etag", 677 + "fresh", 678 + "http-errors", 679 + "mime", 680 + "ms@2.1.3", 681 + "on-finished", 682 + "range-parser", 683 + "statuses" 684 + ] 685 + }, 686 + "serve-static@1.16.2": { 687 + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 688 + "dependencies": [ 689 + "encodeurl@2.0.0", 690 + "escape-html", 691 + "parseurl", 692 + "send" 693 + ] 694 + }, 695 + "setprototypeof@1.2.0": { 696 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 697 + }, 698 + "side-channel-list@1.0.0": { 699 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 700 + "dependencies": [ 701 + "es-errors", 702 + "object-inspect" 703 + ] 704 + }, 705 + "side-channel-map@1.0.1": { 706 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 707 + "dependencies": [ 708 + "call-bound", 709 + "es-errors", 710 + "get-intrinsic", 711 + "object-inspect" 712 + ] 713 + }, 714 + "side-channel-weakmap@1.0.2": { 715 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 716 + "dependencies": [ 717 + "call-bound", 718 + "es-errors", 719 + "get-intrinsic", 720 + "object-inspect", 721 + "side-channel-map" 722 + ] 723 + }, 724 + "side-channel@1.1.0": { 725 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 726 + "dependencies": [ 727 + "es-errors", 728 + "object-inspect", 729 + "side-channel-list", 730 + "side-channel-map", 731 + "side-channel-weakmap" 732 + ] 733 + }, 734 + "sonic-boom@3.8.1": { 735 + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 736 + "dependencies": [ 737 + "atomic-sleep" 738 + ] 739 + }, 740 + "split2@4.2.0": { 741 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" 742 + }, 743 + "statuses@2.0.1": { 744 + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 745 + }, 746 + "string_decoder@1.3.0": { 747 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 748 + "dependencies": [ 749 + "safe-buffer" 750 + ] 751 + }, 752 + "supports-color@7.2.0": { 753 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 754 + "dependencies": [ 755 + "has-flag" 756 + ] 757 + }, 758 + "thread-stream@2.7.0": { 759 + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", 760 + "dependencies": [ 761 + "real-require" 762 + ] 763 + }, 764 + "tinyglobby@0.2.14_picomatch@4.0.2": { 765 + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 766 + "dependencies": [ 767 + "fdir", 768 + "picomatch" 769 + ] 770 + }, 771 + "toidentifier@1.0.1": { 772 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 773 + }, 774 + "ts-morph@24.0.0": { 775 + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", 776 + "dependencies": [ 777 + "@ts-morph/common", 778 + "code-block-writer" 779 + ] 780 + }, 781 + "type-is@1.6.18": { 782 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 783 + "dependencies": [ 784 + "media-typer", 785 + "mime-types" 786 + ] 787 + }, 788 + "uint8arrays@3.0.0": { 789 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 790 + "dependencies": [ 791 + "multiformats@9.9.0" 792 + ] 793 + }, 794 + "uint8arrays@5.1.0": { 795 + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", 796 + "dependencies": [ 797 + "multiformats@13.3.6" 798 + ] 799 + }, 800 + "undici-types@6.21.0": { 801 + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" 802 + }, 803 + "unpipe@1.0.0": { 804 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 805 + }, 806 + "utils-merge@1.0.1": { 807 + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 808 + }, 809 + "vary@1.1.2": { 810 + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 811 + }, 812 + "ws@8.18.2": { 813 + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==" 814 + }, 815 + "yesno@0.4.0": { 816 + "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==" 817 + }, 818 + "zod@3.25.51": { 819 + "integrity": "sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==" 820 + } 821 + }, 822 + "workspace": { 823 + "dependencies": [ 824 + "jsr:@std/assert@^1.0.13", 825 + "npm:@atproto/common@~0.4.11", 826 + "npm:@atproto/crypto@~0.4.4", 827 + "npm:@atproto/lexicon@~0.4.11", 828 + "npm:uint8arrays@^5.1.0" 829 + ] 830 + } 831 + }
+29
services/mod/fly.toml
··· 1 + # fly.toml app configuration file generated for grain-mod on 2025-06-08T23:51:19-07:00 2 + # 3 + # See https://fly.io/docs/reference/configuration/ for information about how to use this file. 4 + # 5 + 6 + app = 'grain-mod' 7 + primary_region = 'sea' 8 + 9 + [build] 10 + dockerfile = './Dockerfile' 11 + 12 + [env] 13 + MOD_SERVICE_DATABASE_URL = '/data/sqlite.db' 14 + MOD_SERVICE_PORT = '8080' 15 + 16 + [[mounts]] 17 + source = 'data' 18 + destination = '/data' 19 + 20 + [http_service] 21 + internal_port = 8080 22 + force_https = true 23 + auto_stop_machines = 'stop' 24 + auto_start_machines = true 25 + min_machines_running = 0 26 + processes = ['app'] 27 + 28 + [[vm]] 29 + size = 'shared-cpu-1x'
+7
services/mod/lexicons.json
··· 1 + { 2 + "lexicons": [ 3 + "com.atproto.label.defs", 4 + "com.atproto.label.queryLabels", 5 + "com.atproto.label.subscribeLabels" 6 + ] 7 + }
+192
services/mod/lexicons/com/atproto/label/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.defs", 4 + "defs": { 5 + "label": { 6 + "type": "object", 7 + "required": [ 8 + "src", 9 + "uri", 10 + "val", 11 + "cts" 12 + ], 13 + "properties": { 14 + "cid": { 15 + "type": "string", 16 + "format": "cid", 17 + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 18 + }, 19 + "cts": { 20 + "type": "string", 21 + "format": "datetime", 22 + "description": "Timestamp when this label was created." 23 + }, 24 + "exp": { 25 + "type": "string", 26 + "format": "datetime", 27 + "description": "Timestamp at which this label expires (no longer applies)." 28 + }, 29 + "neg": { 30 + "type": "boolean", 31 + "description": "If true, this is a negation label, overwriting a previous label." 32 + }, 33 + "sig": { 34 + "type": "bytes", 35 + "description": "Signature of dag-cbor encoded label." 36 + }, 37 + "src": { 38 + "type": "string", 39 + "format": "did", 40 + "description": "DID of the actor who created this label." 41 + }, 42 + "uri": { 43 + "type": "string", 44 + "format": "uri", 45 + "description": "AT URI of the record, repository (account), or other resource that this label applies to." 46 + }, 47 + "val": { 48 + "type": "string", 49 + "maxLength": 128, 50 + "description": "The short string name of the value or type of this label." 51 + }, 52 + "ver": { 53 + "type": "integer", 54 + "description": "The AT Protocol version of the label object." 55 + } 56 + }, 57 + "description": "Metadata tag on an atproto resource (eg, repo or record)." 58 + }, 59 + "selfLabel": { 60 + "type": "object", 61 + "required": [ 62 + "val" 63 + ], 64 + "properties": { 65 + "val": { 66 + "type": "string", 67 + "maxLength": 128, 68 + "description": "The short string name of the value or type of this label." 69 + } 70 + }, 71 + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." 72 + }, 73 + "labelValue": { 74 + "type": "string", 75 + "knownValues": [ 76 + "!hide", 77 + "!no-promote", 78 + "!warn", 79 + "!no-unauthenticated", 80 + "dmca-violation", 81 + "doxxing", 82 + "porn", 83 + "sexual", 84 + "nudity", 85 + "nsfl", 86 + "gore" 87 + ] 88 + }, 89 + "selfLabels": { 90 + "type": "object", 91 + "required": [ 92 + "values" 93 + ], 94 + "properties": { 95 + "values": { 96 + "type": "array", 97 + "items": { 98 + "ref": "#selfLabel", 99 + "type": "ref" 100 + }, 101 + "maxLength": 10 102 + } 103 + }, 104 + "description": "Metadata tags on an atproto record, published by the author within the record." 105 + }, 106 + "labelValueDefinition": { 107 + "type": "object", 108 + "required": [ 109 + "identifier", 110 + "severity", 111 + "blurs", 112 + "locales" 113 + ], 114 + "properties": { 115 + "blurs": { 116 + "type": "string", 117 + "description": "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", 118 + "knownValues": [ 119 + "content", 120 + "media", 121 + "none" 122 + ] 123 + }, 124 + "locales": { 125 + "type": "array", 126 + "items": { 127 + "ref": "#labelValueDefinitionStrings", 128 + "type": "ref" 129 + } 130 + }, 131 + "severity": { 132 + "type": "string", 133 + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 134 + "knownValues": [ 135 + "inform", 136 + "alert", 137 + "none" 138 + ] 139 + }, 140 + "adultOnly": { 141 + "type": "boolean", 142 + "description": "Does the user need to have adult content enabled in order to configure this label?" 143 + }, 144 + "identifier": { 145 + "type": "string", 146 + "maxLength": 100, 147 + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 148 + "maxGraphemes": 100 149 + }, 150 + "defaultSetting": { 151 + "type": "string", 152 + "default": "warn", 153 + "description": "The default setting for this label.", 154 + "knownValues": [ 155 + "ignore", 156 + "warn", 157 + "hide" 158 + ] 159 + } 160 + }, 161 + "description": "Declares a label value and its expected interpretations and behaviors." 162 + }, 163 + "labelValueDefinitionStrings": { 164 + "type": "object", 165 + "required": [ 166 + "lang", 167 + "name", 168 + "description" 169 + ], 170 + "properties": { 171 + "lang": { 172 + "type": "string", 173 + "format": "language", 174 + "description": "The code of the language these strings are written in." 175 + }, 176 + "name": { 177 + "type": "string", 178 + "maxLength": 640, 179 + "description": "A short human-readable name for the label.", 180 + "maxGraphemes": 64 181 + }, 182 + "description": { 183 + "type": "string", 184 + "maxLength": 100000, 185 + "description": "A longer description of what the label means and why it might be applied.", 186 + "maxGraphemes": 10000 187 + } 188 + }, 189 + "description": "Strings which describe the label in the UI, localized into a specific language." 190 + } 191 + } 192 + }
+63
services/mod/lexicons/com/atproto/label/queryLabels.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.queryLabels", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "output": { 8 + "schema": { 9 + "type": "object", 10 + "required": [ 11 + "labels" 12 + ], 13 + "properties": { 14 + "cursor": { 15 + "type": "string" 16 + }, 17 + "labels": { 18 + "type": "array", 19 + "items": { 20 + "ref": "com.atproto.label.defs#label", 21 + "type": "ref" 22 + } 23 + } 24 + } 25 + }, 26 + "encoding": "application/json" 27 + }, 28 + "parameters": { 29 + "type": "params", 30 + "required": [ 31 + "uriPatterns" 32 + ], 33 + "properties": { 34 + "limit": { 35 + "type": "integer", 36 + "default": 50, 37 + "maximum": 250, 38 + "minimum": 1 39 + }, 40 + "cursor": { 41 + "type": "string" 42 + }, 43 + "sources": { 44 + "type": "array", 45 + "items": { 46 + "type": "string", 47 + "format": "did" 48 + }, 49 + "description": "Optional list of label sources (DIDs) to filter on." 50 + }, 51 + "uriPatterns": { 52 + "type": "array", 53 + "items": { 54 + "type": "string" 55 + }, 56 + "description": "List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI." 57 + } 58 + } 59 + }, 60 + "description": "Find labels relevant to the provided AT-URI patterns. Public endpoint for moderation services, though may return different or additional results with auth." 61 + } 62 + } 63 + }
+69
services/mod/lexicons/com/atproto/label/subscribeLabels.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "com.atproto.label.subscribeLabels", 4 + "defs": { 5 + "info": { 6 + "type": "object", 7 + "required": [ 8 + "name" 9 + ], 10 + "properties": { 11 + "name": { 12 + "type": "string", 13 + "knownValues": [ 14 + "OutdatedCursor" 15 + ] 16 + }, 17 + "message": { 18 + "type": "string" 19 + } 20 + } 21 + }, 22 + "main": { 23 + "type": "subscription", 24 + "errors": [ 25 + { 26 + "name": "FutureCursor" 27 + } 28 + ], 29 + "message": { 30 + "schema": { 31 + "refs": [ 32 + "#labels", 33 + "#info" 34 + ], 35 + "type": "union" 36 + } 37 + }, 38 + "parameters": { 39 + "type": "params", 40 + "properties": { 41 + "cursor": { 42 + "type": "integer", 43 + "description": "The last known event seq number to backfill from." 44 + } 45 + } 46 + }, 47 + "description": "Subscribe to stream of labels (and negations). Public endpoint implemented by mod services. Uses same sequencing scheme as repo event stream." 48 + }, 49 + "labels": { 50 + "type": "object", 51 + "required": [ 52 + "seq", 53 + "labels" 54 + ], 55 + "properties": { 56 + "seq": { 57 + "type": "integer" 58 + }, 59 + "labels": { 60 + "type": "array", 61 + "items": { 62 + "ref": "com.atproto.label.defs#label", 63 + "type": "ref" 64 + } 65 + } 66 + } 67 + } 68 + } 69 + }
+513
services/mod/main.ts
··· 1 + import type { Label } from "$lexicon/types/com/atproto/label/defs.ts"; 2 + import type { Labels } from "$lexicon/types/com/atproto/label/subscribeLabels.ts"; 3 + import { cborEncode, noUndefinedVals } from "@atproto/common"; 4 + import { Keypair, Secp256k1Keypair } from "@atproto/crypto"; 5 + import { stringifyLex } from "@atproto/lexicon"; 6 + import { assertEquals, assertExists } from "@std/assert"; 7 + import { DatabaseSync } from "node:sqlite"; 8 + import * as ui8 from "uint8arrays"; 9 + 10 + if (import.meta.main) { 11 + const cfg = await createConfig(); 12 + const db = createDb(cfg); 13 + const modService = createModService(db); 14 + const handler = createHandler(modService); 15 + 16 + Deno.serve({ 17 + port: cfg.port, 18 + onListen() { 19 + console.log(`Listening on http://localhost:${cfg.port}`); 20 + }, 21 + onError(err) { 22 + console.error("Error occurred:", err); 23 + return new Response("Internal Server Error", { 24 + status: 500, 25 + }); 26 + }, 27 + }, handler); 28 + 29 + Deno.addSignalListener("SIGINT", () => { 30 + console.log("Shutting down server..."); 31 + Deno.exit(0); 32 + }); 33 + } 34 + 35 + type Config = { 36 + port: number; 37 + databaseUrl: string; 38 + signingKey: string; 39 + }; 40 + 41 + export async function createConfig(): Promise<Config> { 42 + return { 43 + port: Number(Deno.env.get("MOD_SERVICE_PORT")) || 8080, 44 + databaseUrl: Deno.env.get("MOD_SERVICE_DATABASE_URL") ?? ":memory:", 45 + signingKey: Deno.env.get("MOD_SERVICE_SIGNING_KEY") ?? 46 + await createSigningKey(), 47 + }; 48 + } 49 + 50 + async function createSigningKey() { 51 + const serviceKeypair = await Secp256k1Keypair.create({ exportable: true }); 52 + return ui8.toString(await serviceKeypair.export(), "hex"); 53 + } 54 + 55 + // Track all connected WebSocket clients for label subscriptions 56 + const labelSubscribers = new Set<WebSocket>(); 57 + 58 + export function broadcastLabel(label: LabelRow) { 59 + // Only broadcast if this label is active (not negated, not expired, and latest) 60 + // Gather all labels for this (src, uri, val) and check if this is the latest and not negated/expired 61 + // For simplicity, assume label is already the latest for this key 62 + if (label.exp && new Date(label.exp).getTime() < Date.now()) return; 63 + if (label.neg) return; 64 + const msg = stringifyLex({ 65 + seq: label.id, 66 + labels: [formatLabel(label)], 67 + } as Labels); 68 + for (const ws of labelSubscribers) { 69 + try { 70 + ws.send(msg); 71 + } catch (e) { 72 + console.error("Error sending label to subscriber:", e); 73 + labelSubscribers.delete(ws); 74 + } 75 + } 76 + } 77 + 78 + export async function handleSubscribeLabels( 79 + req: Request, 80 + modService: ReturnType<typeof createModService>, 81 + ): Promise<Response> { 82 + const { searchParams } = new URL(req.url); 83 + const cursorParam = searchParams.get("cursor"); 84 + const cursor = cursorParam ? parseInt(cursorParam, 10) : 0; 85 + if (cursorParam && Number.isNaN(cursor)) { 86 + return new Response( 87 + JSON.stringify({ error: "Cursor must be an integer" }), 88 + { status: 400 }, 89 + ); 90 + } 91 + const { response, socket } = Deno.upgradeWebSocket(req); 92 + // On open, send all labels after the cursor (including negations and expired) 93 + socket.onopen = () => { 94 + try { 95 + const { rows } = modService.getLabels({ 96 + patterns: [], 97 + sources: [], 98 + limit: 1000, 99 + cursor, 100 + }); 101 + // Send ALL rows, not just active (per ATProto spec) 102 + for (const row of rows) { 103 + const msg = stringifyLex({ 104 + seq: row.id, 105 + labels: [formatLabel(row)], 106 + } as Labels); 107 + socket.send(msg); 108 + } 109 + labelSubscribers.add(socket); 110 + const userAgent = req.headers.get("user-agent"); 111 + const origin = req.headers.get("origin"); 112 + console.log( 113 + `New subscriber connected, total: ${labelSubscribers.size}, user-agent: ${userAgent}, origin: ${origin}, time: ${ 114 + new Date().toISOString() 115 + }`, 116 + ); 117 + } catch (e) { 118 + console.error("Error sending initial labels:", e); 119 + socket.close(); 120 + } 121 + }; 122 + socket.onclose = () => { 123 + labelSubscribers.delete(socket); 124 + }; 125 + return response; 126 + } 127 + 128 + // Filter for active (non-negated, non-expired) labels 129 + // Used for API hydration only. For the WebSocket stream, send all labels (including negations and expired). 130 + function filterActiveLabels(labels: LabelRow[]): LabelRow[] { 131 + const now = Date.now(); 132 + const latest: Record<string, LabelRow> = {}; 133 + for (const label of labels) { 134 + if (label.exp && new Date(label.exp).getTime() < now) continue; 135 + const key = `${label.src}|${label.uri}|${label.val}`; 136 + if (!latest[key] || new Date(label.cts) > new Date(latest[key].cts)) { 137 + latest[key] = label; 138 + } 139 + } 140 + return Object.values(latest).filter((label) => !label.neg); 141 + } 142 + 143 + function createHandler( 144 + modService: ReturnType<typeof createModService>, 145 + ) { 146 + return async (req: Request): Promise<Response> => { 147 + const url = new URL(req.url); 148 + const pathname = url.pathname; 149 + 150 + if ( 151 + pathname === "/xrpc/com.atproto.label.subscribeLabels" && 152 + req.headers.get("upgrade")?.toLowerCase() === "websocket" 153 + ) { 154 + return await handleSubscribeLabels(req, modService); 155 + } else if ( 156 + req.method === "GET" && pathname === "/xrpc/com.atproto.label.queryLabels" 157 + ) { 158 + // Parse query params 159 + const uriPatternsParam = url.searchParams.getAll("uriPatterns"); 160 + const sourcesParam = url.searchParams.getAll("sources"); 161 + const cursorParam = url.searchParams.get("cursor"); 162 + const limitParam = url.searchParams.get("limit"); 163 + 164 + const uriPatterns: string[] = uriPatternsParam.length 165 + ? uriPatternsParam 166 + : []; 167 + const sources: string[] = sourcesParam.length ? sourcesParam : []; 168 + const cursor = cursorParam ? parseInt(cursorParam, 10) : 0; 169 + if (cursorParam && Number.isNaN(cursor)) { 170 + return new Response( 171 + JSON.stringify({ 172 + error: "Cursor must be an integer", 173 + }), 174 + { status: 400 }, 175 + ); 176 + } 177 + const limit = limitParam ? parseInt(limitParam, 10) : 50; 178 + if (Number.isNaN(limit) || limit < 1 || limit > 250) { 179 + return new Response( 180 + JSON.stringify({ 181 + error: "Limit must be an integer between 1 and 250", 182 + }), 183 + { status: 400 }, 184 + ); 185 + } 186 + 187 + // Handle wildcards and SQL LIKE 188 + const patterns = uriPatterns.includes("*") 189 + ? [] 190 + : uriPatterns.map((pattern) => { 191 + pattern = pattern.replace(/%/g, "").replace(/_/g, "\\_"); 192 + const starIndex = pattern.indexOf("*"); 193 + if (starIndex === -1) return pattern; 194 + if (starIndex !== pattern.length - 1) { 195 + return undefined; // Only trailing wildcards supported 196 + } 197 + return pattern.slice(0, -1) + "%"; 198 + }).filter(Boolean) as string[]; 199 + 200 + const { rows: labelRows, nextCursor } = modService.getLabels({ 201 + patterns, 202 + sources, 203 + limit, 204 + cursor, 205 + }); 206 + const activeLabels = filterActiveLabels(labelRows); 207 + const formattedRows = activeLabels.map(formatLabel); 208 + return new Response( 209 + stringifyLex({ cursor: nextCursor, labels: formattedRows }), 210 + { 211 + headers: { "content-type": "application/json" }, 212 + }, 213 + ); 214 + } else if (req.method === "GET" && pathname === "/health") { 215 + // Use the modService's DB to check health 216 + modService.getLabels({ 217 + patterns: [], 218 + sources: [], 219 + limit: 1, 220 + cursor: 0, 221 + }); 222 + return new Response(JSON.stringify({ version: "0.1.0" }), { 223 + headers: { "content-type": "application/json" }, 224 + }); 225 + } else if (pathname.startsWith("/xrpc/")) { 226 + return new Response("Method Not Implemented", { status: 501 }); 227 + } 228 + 229 + return new Response("Not Found", { status: 404 }); 230 + }; 231 + } 232 + 233 + export function createDb(cfg: Config) { 234 + const db = new DatabaseSync(cfg.databaseUrl); 235 + 236 + db.exec(` 237 + PRAGMA journal_mode = WAL; 238 + 239 + CREATE TABLE IF NOT EXISTS labels ( 240 + id INTEGER PRIMARY KEY AUTOINCREMENT, 241 + src TEXT NOT NULL, 242 + uri TEXT NOT NULL, 243 + cid TEXT, 244 + val TEXT NOT NULL, 245 + neg BOOLEAN DEFAULT FALSE, 246 + cts DATETIME NOT NULL, 247 + exp DATETIME, 248 + sig BLOB 249 + ); 250 + `); 251 + 252 + return db; 253 + } 254 + 255 + export type LabelRow = { 256 + id: number; 257 + src: string; 258 + uri: string; 259 + cid: string | null; 260 + val: string; 261 + neg: boolean; 262 + cts: string; 263 + exp: string | null; 264 + sig: Uint8Array; 265 + }; 266 + 267 + type UnsignedLabel = Omit<Label, "sig">; 268 + type SignedLabel = Label & { sig: Uint8Array }; 269 + 270 + export function createModService(db: DatabaseSync) { 271 + return { 272 + insertLabel: (label: SignedLabel) => { 273 + const result = db.prepare( 274 + `INSERT INTO labels (src, uri, cid, val, neg, cts, exp, sig) 275 + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, 276 + ).run( 277 + label.src, 278 + label.uri, 279 + label.cid ?? null, 280 + label.val, 281 + label.neg ? 1 : 0, 282 + label.cts, 283 + label.exp ?? null, 284 + label.sig, 285 + ); 286 + return result.lastInsertRowid as number; 287 + }, 288 + getLabels: (opts: { 289 + patterns: string[]; 290 + sources: string[]; 291 + limit: number; 292 + cursor: number; 293 + }): { rows: LabelRow[]; nextCursor: string } => { 294 + const { patterns, sources, limit, cursor } = opts; 295 + const conditions: string[] = []; 296 + const params: (string | number | Uint8Array | null)[] = []; 297 + if (patterns.length) { 298 + conditions.push( 299 + "(" + patterns.map(() => "uri LIKE ?").join(" OR ") + ")", 300 + ); 301 + params.push(...patterns); 302 + } 303 + if (sources.length) { 304 + conditions.push(`src IN (${sources.map(() => "?").join(", ")})`); 305 + params.push(...sources); 306 + } 307 + if (cursor) { 308 + conditions.push("id > ?"); 309 + params.push(cursor); 310 + } 311 + params.push(limit); 312 + const whereClause = conditions.length 313 + ? `WHERE ${conditions.join(" AND ")}` 314 + : ""; 315 + const sql = `SELECT * FROM labels ${whereClause} ORDER BY id ASC LIMIT ?`; 316 + const stmt = db.prepare(sql); 317 + const rows = stmt.all(...params) as unknown[]; 318 + function rowToLabelRow(row: unknown): LabelRow { 319 + if (typeof row !== "object" || row === null) { 320 + throw new Error("Invalid row"); 321 + } 322 + const r = row as Record<string, unknown>; 323 + const src = typeof r.src === "string" ? r.src : ""; 324 + const uri = typeof r.uri === "string" ? r.uri : ""; 325 + let cid: string | null = null; 326 + if (typeof r.cid === "string") cid = r.cid; 327 + const val = typeof r.val === "string" ? r.val : ""; 328 + const cts = typeof r.cts === "string" ? r.cts : ""; 329 + let exp: string | null = null; 330 + if (typeof r.exp === "string") exp = r.exp; 331 + const neg = typeof r.neg === "boolean" ? r.neg : Number(r.neg) === 1; 332 + let sig: Uint8Array; 333 + if (r.sig instanceof Uint8Array) sig = r.sig; 334 + else if (Array.isArray(r.sig)) sig = new Uint8Array(r.sig); 335 + else sig = new Uint8Array(); 336 + const id = typeof r.id === "number" ? r.id : Number(r.id); 337 + return { id, src, uri, cid, val, neg, cts, exp, sig }; 338 + } 339 + const labelRows = rows.map(rowToLabelRow); 340 + let nextCursor = "0"; 341 + if (rows.length > 0) { 342 + const lastId = (rows[rows.length - 1] as Record<string, unknown>).id; 343 + nextCursor = typeof lastId === "string" || typeof lastId === "number" 344 + ? String(lastId) 345 + : "0"; 346 + } 347 + return { rows: labelRows, nextCursor }; 348 + }, 349 + }; 350 + } 351 + 352 + export function createLabel( 353 + cfg: Config, 354 + modService: ReturnType<typeof createModService>, 355 + ) { 356 + return async ( 357 + label: UnsignedLabel, 358 + ) => { 359 + const serviceSigningKey = cfg.signingKey; 360 + if (!serviceSigningKey) { 361 + throw new Error("MOD_SERVICE_SIGNING_KEY is not set"); 362 + } 363 + const signingKey = await Secp256k1Keypair.import(serviceSigningKey); 364 + 365 + const signed = await signLabel(label, signingKey); 366 + 367 + const id = modService.insertLabel(signed); 368 + // Broadcast the label to all subscribers after insert 369 + const labelRow: LabelRow = { 370 + id: Number(id), 371 + src: signed.src, 372 + uri: signed.uri, 373 + cid: signed.cid ?? null, 374 + val: signed.val, 375 + neg: signed.neg === true, // ensure boolean 376 + cts: signed.cts, 377 + exp: signed.exp ?? null, 378 + sig: signed.sig, 379 + }; 380 + broadcastLabel(labelRow); 381 + }; 382 + } 383 + 384 + const formatLabel = (row: LabelRow): Label => { 385 + return noUndefinedVals( 386 + { 387 + ver: 1, 388 + src: row.src, 389 + uri: row.uri, 390 + cid: row.cid === "" || row.cid === null ? undefined : row.cid, 391 + val: row.val, 392 + neg: row.neg === true ? true : undefined, 393 + cts: row.cts, 394 + exp: row.exp ?? undefined, 395 + sig: row.sig ? new Uint8Array(row.sig) : undefined, 396 + } satisfies Label, 397 + ) as unknown as Label; 398 + }; 399 + 400 + const signLabel = async ( 401 + label: Label, 402 + signingKey: Keypair, 403 + ): Promise<SignedLabel> => { 404 + const { ver, src, uri, cid, val, neg, cts, exp } = label; 405 + const reformatted = noUndefinedVals( 406 + { 407 + ver: ver ?? 1, 408 + src, 409 + uri, 410 + cid, 411 + val, 412 + neg: neg === true ? true : undefined, 413 + cts, 414 + exp, 415 + } satisfies Label, 416 + ) as unknown as Label; 417 + 418 + const bytes = cborEncode(reformatted); 419 + const sig = await signingKey.sign(bytes); 420 + return { 421 + ...reformatted, 422 + sig, 423 + }; 424 + }; 425 + 426 + Deno.test("insertLabel inserts a signed label and returns an id", async () => { 427 + const cfg = await createConfig(); 428 + const db = createDb(cfg); 429 + const modService = createModService(db); 430 + 431 + const label = { 432 + src: "did:example:alice", 433 + uri: "at://did:example:bob/app.bsky.feed.post/123", 434 + val: "spam", 435 + neg: false, 436 + cts: new Date().toISOString(), 437 + sig: new Uint8Array([1, 2, 3]), 438 + }; 439 + 440 + const id = modService.insertLabel(label); 441 + assertExists(id); 442 + 443 + // Check that the label is in the database 444 + const row = db.prepare("SELECT * FROM labels WHERE id = ?").get(id); 445 + assertExists(row); 446 + assertEquals(row.src, label.src); 447 + assertEquals(row.uri, label.uri); 448 + assertEquals(row.val, label.val); 449 + assertEquals(row.neg, 0); 450 + assertEquals(row.sig, label.sig); 451 + }); 452 + 453 + Deno.test("signLabel produces a valid signature", async () => { 454 + const cfg = await createConfig(); 455 + const keyHex = cfg.signingKey; 456 + const signingKey = await Secp256k1Keypair.import(keyHex); 457 + 458 + const label: Label = { 459 + ver: 1, 460 + src: "did:example:alice", 461 + uri: "at://did:example:bob/app.bsky.feed.post/123", 462 + val: "spam", 463 + cts: new Date().toISOString(), 464 + }; 465 + 466 + const signed = await signLabel(label, signingKey); 467 + 468 + assertExists(signed.sig); 469 + assertEquals(signed.src, label.src); 470 + assertEquals(signed.uri, label.uri); 471 + assertEquals(signed.val, label.val); 472 + }); 473 + 474 + Deno.test("getLabels retrieves labels with filtering and pagination", async () => { 475 + const cfg = await createConfig(); 476 + const db = createDb(cfg); 477 + const modService = createModService(db); 478 + 479 + // Insert some test labels 480 + for (let i = 1; i <= 10; i++) { 481 + modService.insertLabel({ 482 + src: "did:example:alice", 483 + uri: `at://did:example:bob/app.bsky.feed.post/${i}`, 484 + val: i % 2 === 0 ? "spam" : "scam", 485 + neg: false, 486 + cts: new Date().toISOString(), 487 + sig: new Uint8Array([1, 2, 3]), 488 + }); 489 + } 490 + 491 + // Retrieve labels with limit and cursor 492 + const { rows, nextCursor } = modService.getLabels({ 493 + patterns: ["at://did:example:bob/app.bsky.feed.post/%"], 494 + sources: ["did:example:alice"], 495 + limit: 5, 496 + cursor: 0, 497 + }); 498 + 499 + assertEquals(rows.length, 5); 500 + assertEquals(nextCursor, "5"); 501 + 502 + // Retrieve next page 503 + const { rows: nextRows } = modService.getLabels({ 504 + patterns: ["at://did:example:bob/app.bsky.feed.post/%"], 505 + sources: ["did:example:alice"], 506 + limit: 5, 507 + cursor: parseInt(nextCursor, 10), 508 + }); 509 + 510 + assertEquals(nextRows.length, 5); 511 + }); 512 + 513 + export type ModService = ReturnType<typeof createModService>;
+10 -10
services/pds/pdsadmin-command.sh
··· 13 13 export DID="" 14 14 15 15 # make an invite code 16 - curl \ 17 - --fail \ 18 - --silent \ 19 - --show-error \ 20 - --request POST \ 21 - --header "Content-Type: application/json" \ 22 - --user "admin:${PDS_ADMIN_PASSWORD}" \ 23 - --data '{"useCount": 20}' \ 24 - "https://${PDS_HOSTNAME}/xrpc/com.atproto.server.createInviteCode" 16 + # curl \ 17 + # --fail \ 18 + # --silent \ 19 + # --show-error \ 20 + # --request POST \ 21 + # --header "Content-Type: application/json" \ 22 + # --user "admin:${PDS_ADMIN_PASSWORD}" \ 23 + # --data '{"useCount": 1}' \ 24 + # "https://${PDS_HOSTNAME}/xrpc/com.atproto.server.createInviteCode" 25 25 26 26 # delete an account 27 27 # curl \ ··· 32 32 # --header "Content-Type: application/json" \ 33 33 # --user "admin:${PDS_ADMIN_PASSWORD}" \ 34 34 # --data "{\"did\": \"${DID}\"}" \ 35 - # "https://${PDS_HOST}/xrpc/com.atproto.admin.deleteAccount" 35 + # "https://${PDS_HOSTNAME}/xrpc/com.atproto.admin.deleteAccount"
+3 -2
src/components/AltTextButton.tsx
··· 2 2 3 3 export function AltTextButton({ photoUri }: Readonly<{ photoUri: string }>) { 4 4 return ( 5 - <div 5 + <button 6 + type="button" 6 7 class="bg-zinc-950 dark:bg-zinc-950 py-[1px] px-[3px] absolute top-2 left-2 cursor-pointer flex items-center justify-center text-xs text-white font-semibold z-10" 7 8 hx-get={`/dialogs/photo/${new AtUri(photoUri).rkey}/alt`} 8 9 hx-trigger="click" ··· 11 12 _="on click halt" 12 13 > 13 14 <i class="fas fa-plus text-[10px] mr-1"></i> ALT 14 - </div> 15 + </button> 15 16 ); 16 17 }
+41
src/components/DefaultLabelerAvatar.tsx
··· 1 + type DefaultLabelerAvatarProps = Readonly<{ 2 + size?: number; 3 + backgroundColor?: string; 4 + foregroundColor?: string; 5 + class?: string; 6 + }>; 7 + 8 + export function DefaultLabelerAvatar({ 9 + size = 28, 10 + backgroundColor = "rgb(139 92 246)", // Tailwind purple-500 11 + foregroundColor = "#fff", 12 + class: classProp, 13 + }: DefaultLabelerAvatarProps) { 14 + return ( 15 + <svg 16 + width={size} 17 + height={size} 18 + viewBox="0 0 512 512" 19 + class={classProp} 20 + aria-hidden="true" 21 + > 22 + {/* Square background */} 23 + <rect 24 + x="0" 25 + y="0" 26 + width="512" 27 + height="512" 28 + rx="64" 29 + fill={backgroundColor} 30 + /> 31 + 32 + {/* Shield icon (perfectly centered) */} 33 + <g transform="translate(256, 280) scale(0.7) translate(-256, -256)"> 34 + <path 35 + fill={foregroundColor} 36 + d="M466.5 83.7 263.1 5.1c-5.9-2.2-12.3-2.2-18.2 0L45.5 83.7C36.6 87 30 95.7 30 105.3c0 198.6 114.6 289.7 221.2 325.7 4.5 1.5 9.3 1.5 13.8 0C367.4 395 482 303.9 482 105.3c0-9.6-6.6-18.3-15.5-21.6z" 37 + /> 38 + </g> 39 + </svg> 40 + ); 41 + }
+76
src/components/ExifInfoDialog.tsx
··· 1 + import { Dialog } from "@bigmoves/bff/components"; 2 + 3 + export function ExifInfoDialog() { 4 + return ( 5 + <Dialog class="z-100"> 6 + <Dialog.Content class="dark:bg-zinc-950 relative"> 7 + <Dialog.Title>EXIF Info</Dialog.Title> 8 + <Dialog.X class="fill-zinc-950 dark:fill-zinc-50" /> 9 + <div class="text-sm mt-2"> 10 + <p> 11 + When you upload photos to Grain, we extract a small set of standard 12 + EXIF metadata from each image. This information is used to help 13 + organize photos by date taken, camera make, lens make, etc. This is 14 + a list of tags we currently support. 15 + </p> 16 + <ul class="list-disc ml-6 mt-2"> 17 + <li> 18 + <b>DateTimeOriginal</b>: When the photo was taken 19 + </li> 20 + <li> 21 + <b>ExposureTime</b>: Shutter speed (e.g., 1/250s) 22 + </li> 23 + <li> 24 + <b>FNumber</b>: Aperture (f-stop) 25 + </li> 26 + <li> 27 + <b>Flash</b>: Whether the flash fired 28 + </li> 29 + <li> 30 + <b>FocalLengthIn35mmFormat</b>: Lens focal length (35mm 31 + equivalent) 32 + </li> 33 + <li> 34 + <b>ISO</b>: ISO sensitivity setting 35 + </li> 36 + <li> 37 + <b>LensMake</b>: Lens manufacturer 38 + </li> 39 + <li> 40 + <b>LensModel</b>: Lens model 41 + </li> 42 + <li> 43 + <b>Make</b>: Camera manufacturer 44 + </li> 45 + <li> 46 + <b>Model</b>: Camera model 47 + </li> 48 + </ul> 49 + <p class="mt-2"> 50 + No GPS or location data is collected, and we do not store any 51 + personally identifiable information. The EXIF data is used solely to 52 + enhance your photo organization and discovery experience on Grain. 53 + </p> 54 + <p class="mt-2"> 55 + If you want to remove EXIF data from your photo after uploading, you 56 + can delete the photo and re-upload with the "Include image metadata" 57 + checkbox unchecked. 58 + </p> 59 + <p class="mt-2"> 60 + You can learn more about the types of metadata commonly embedded in 61 + photos at{" "} 62 + <a 63 + href="https://exiv2.org/tags.html" 64 + className="text-sky-500 hover:underline" 65 + target="_blank" 66 + rel="noopener noreferrer" 67 + > 68 + exiv2.org 69 + </a> 70 + . 71 + </p> 72 + </div> 73 + </Dialog.Content> 74 + </Dialog> 75 + ); 76 + }
+28 -20
src/components/GalleryPage.tsx
··· 4 4 import { AtUri } from "@atproto/syntax"; 5 5 import { WithBffMeta } from "@bigmoves/bff"; 6 6 import { Button } from "@bigmoves/bff/components"; 7 + import { ModerationDecsion } from "../lib/moderation.ts"; 7 8 import { FavoriteButton } from "./FavoriteButton.tsx"; 8 9 import { GalleryInfo } from "./GalleryInfo.tsx"; 9 10 import { GalleryLayout } from "./GalleryLayout.tsx"; 11 + import { ModerationWrapper } from "./ModerationWrapper.tsx"; 10 12 import { ShareGalleryButton } from "./ShareGalleryButton.tsx"; 11 13 12 14 export function GalleryPage({ 13 15 gallery, 14 16 favs = [], 15 17 currentUserDid, 18 + modDecision, 16 19 }: Readonly<{ 17 20 gallery: GalleryView; 18 21 favs: WithBffMeta<Favorite>[]; 19 22 currentUserDid?: string; 23 + modDecision?: ModerationDecsion; 20 24 }>) { 21 25 const isCreator = currentUserDid === gallery.creator.did; 22 26 const isLoggedIn = !!currentUserDid; ··· 77 81 ) 78 82 : null} 79 83 </div> 80 - <GalleryLayout 81 - layoutButtons={ 82 - <> 83 - <GalleryLayout.ModeButton mode="justified" /> 84 - <GalleryLayout.ModeButton mode="masonry" /> 85 - </> 86 - } 87 - > 88 - <GalleryLayout.Container> 89 - {galleryItems?.length 90 - ? galleryItems.map((photo) => ( 91 - <GalleryLayout.Item 92 - key={photo.cid} 93 - photo={photo} 94 - gallery={gallery} 95 - /> 96 - )) 97 - : null} 98 - </GalleryLayout.Container> 99 - </GalleryLayout> 84 + { 85 + <ModerationWrapper moderationDecision={modDecision} class="mb-2"> 86 + <GalleryLayout 87 + layoutButtons={ 88 + <> 89 + <GalleryLayout.ModeButton mode="justified" /> 90 + <GalleryLayout.ModeButton mode="masonry" /> 91 + </> 92 + } 93 + > 94 + <GalleryLayout.Container> 95 + {galleryItems?.length 96 + ? galleryItems.map((photo) => ( 97 + <GalleryLayout.Item 98 + key={photo.cid} 99 + photo={photo} 100 + gallery={gallery} 101 + /> 102 + )) 103 + : null} 104 + </GalleryLayout.Container> 105 + </GalleryLayout> 106 + </ModerationWrapper> 107 + } 100 108 </div> 101 109 ); 102 110 }
+1 -1
src/components/GalleryPreviewLink.tsx
··· 16 16 gallery.creator.handle, 17 17 new AtUri(gallery.uri).rkey, 18 18 )} 19 - class={cn("flex w-full max-w-md aspect-[3/2] overflow-hidden", gap)} 19 + class={cn("flex w-full aspect-[3/2] overflow-hidden", gap)} 20 20 > 21 21 <div class="w-2/3 h-full"> 22 22 <img
+17
src/components/LabelDefinitionButton.tsx
··· 1 + export function LabelDefinitionButton( 2 + { src, val }: Readonly<{ src: string; val: string }>, 3 + ) { 4 + return ( 5 + <button 6 + type="button" 7 + class="text-sky-500 hover:underline cursor-pointer" 8 + hx-get={`/dialogs/label/${src}/${val}`} 9 + hx-trigger="click" 10 + hx-target="#layout" 11 + hx-swap="afterbegin" 12 + _="on click halt" 13 + > 14 + Learn more 15 + </button> 16 + ); 17 + }
+33
src/components/LabelDefinitionDialog.tsx
··· 1 + import { LabelValueDefinition } from "$lexicon/types/com/atproto/label/defs.ts"; 2 + import { Dialog } from "@bigmoves/bff/components"; 3 + import { profileLink } from "../utils.ts"; 4 + 5 + export function LabelDefinitionDialog({ 6 + labelValueDefinition, 7 + labelByHandle, 8 + }: Readonly<{ 9 + labelValueDefinition: LabelValueDefinition; 10 + labelByHandle: string; 11 + }>) { 12 + const enLocale = labelValueDefinition.locales?.find( 13 + (locale) => locale.lang === "en", 14 + ); 15 + return ( 16 + <Dialog id="mod-decision-dialog" class="z-100"> 17 + <Dialog.Content class="dark:bg-zinc-950 relative gap-2"> 18 + <Dialog.X class="fill-zinc-950 dark:fill-zinc-50" /> 19 + <Dialog.Title>{enLocale?.name}</Dialog.Title> 20 + <p>{enLocale?.description}</p> 21 + <p> 22 + Source:{" "} 23 + <a 24 + href={profileLink(labelByHandle)} 25 + class="text-sky-500 hover:underline" 26 + > 27 + @{labelByHandle} 28 + </a> 29 + </p> 30 + </Dialog.Content> 31 + </Dialog> 32 + ); 33 + }
+26
src/components/LabelerAvatar.tsx
··· 1 + import { ProfileView } from "$lexicon/types/social/grain/actor/defs.ts"; 2 + import { Un$Typed } from "$lexicon/util.ts"; 3 + import { cn } from "@bigmoves/bff/components"; 4 + import { DefaultLabelerAvatar } from "./DefaultLabelerAvatar.tsx"; 5 + 6 + export function LabelerAvatar({ 7 + profile, 8 + size, 9 + class: classProp, 10 + }: Readonly< 11 + { profile: Un$Typed<ProfileView>; size?: number; class?: string } 12 + >) { 13 + return ( 14 + profile.avatar 15 + ? ( 16 + <img 17 + src={profile.avatar} 18 + alt={profile.handle} 19 + title={profile.handle} 20 + class={cn("rounded-full object-cover", classProp)} 21 + style={size ? { width: size, height: size } : undefined} 22 + /> 23 + ) 24 + : <DefaultLabelerAvatar size={size} class={classProp} /> 25 + ); 26 + }
+82
src/components/ModerationWrapper.tsx
··· 1 + import { ComponentChildren } from "preact"; 2 + import { ModerationDecsion } from "../lib/moderation.ts"; 3 + import { LabelDefinitionButton } from "./LabelDefinitionButton.tsx"; 4 + 5 + type ModerationWrapperProps = Readonly<{ 6 + class?: string; 7 + moderationDecision?: ModerationDecsion; 8 + children: ComponentChildren; 9 + }>; 10 + 11 + export function ModerationWrapper({ 12 + class: classProp, 13 + moderationDecision, 14 + children, 15 + }: ModerationWrapperProps) { 16 + const id = crypto.randomUUID(); 17 + return ( 18 + moderationDecision 19 + ? ( 20 + moderationDecision.isMe 21 + ? ( 22 + <div> 23 + <button 24 + type="button" 25 + hx-get={`/dialogs/label/${moderationDecision.src}/${moderationDecision.val}`} 26 + hx-trigger="click" 27 + hx-target="#layout" 28 + hx-swap="afterbegin" 29 + _="on click halt" 30 + class="flex items-center gap-2 bg-zinc-200 dark:bg-zinc-800 p-2 text-sm mb-2" 31 + > 32 + <i class="fa fa-circle-info text-zinc-500" /> 33 + A label has been placed on this gallery 34 + </button> 35 + {children} 36 + </div> 37 + ) 38 + : ( 39 + <div 40 + id={`moderation-wrapper-${id}`} 41 + data-state="closed" 42 + class={classProp} 43 + > 44 + <div class="bg-zinc-200 dark:bg-zinc-800 p-4 w-full"> 45 + <div class="flex items-center justify-between gap-2 w-full"> 46 + <div class="flex items-center gap-2"> 47 + <i class="fa fa-circle-info text-zinc-500"></i> 48 + <span class="text-sm">{moderationDecision?.name}</span> 49 + </div> 50 + <button 51 + type="button" 52 + class="text-sm font-semibold cursor-pointer" 53 + _={` 54 + on click 55 + toggle .hidden on #mod-content-${id} 56 + if my innerText is 'Show' 57 + put 'Hide' into me 58 + then put 'open' into @data-state of #moderation-wrapper-${id} 59 + else 60 + put 'Show' into me 61 + then put 'closed' into @data-state of #moderation-wrapper-${id}`} 62 + > 63 + Show 64 + </button> 65 + </div> 66 + </div> 67 + <div class="text-sm my-2"> 68 + Labeled by @{moderationDecision?.labeledBy || "unknown"}.{" "} 69 + <LabelDefinitionButton 70 + src={moderationDecision.src} 71 + val={moderationDecision.val} 72 + /> 73 + </div> 74 + <div id={`mod-content-${id}`} class="hidden"> 75 + {children} 76 + </div> 77 + </div> 78 + ) 79 + ) 80 + : children 81 + ); 82 + }
+1 -2
src/components/PhotoDialog.tsx
··· 1 1 import { GalleryView } from "$lexicon/types/social/grain/gallery/defs.ts"; 2 2 import { PhotoView } from "$lexicon/types/social/grain/photo/defs.ts"; 3 3 import { AtUri } from "@atproto/syntax"; 4 - import { Dialog } from "https://jsr.io/@bigmoves/bff/0.3.0-beta.21/components/Dialog.tsx"; 5 - import { cn } from "../../../bff/packages/bff/components/utils.ts"; 4 + import { cn, Dialog } from "@bigmoves/bff/components"; 6 5 import { photoDialogLink } from "../utils.ts"; 7 6 8 7 export function PhotoDialog({
+9 -10
src/components/PhotoExifDialog.tsx
··· 7 7 }: Readonly<{ 8 8 photo: PhotoView; 9 9 }>) { 10 - console.log(getOrderedExifData(photo)); 11 10 return ( 12 11 <Dialog id="photo-alt-dialog" class="z-100"> 13 12 <Dialog.Content class="dark:bg-zinc-950 relative"> ··· 21 20 /> 22 21 </div> 23 22 {photo.exif && ( 24 - <div className="mt-4 text-sm"> 25 - <dl className="grid grid-cols-2 gap-x-4 gap-y-2"> 26 - {getOrderedExifData(photo).map(({ displayKey, value }) => ( 27 - <> 28 - <dt className="font-medium text-right">{displayKey}:</dt> 29 - <dd className="text-left">{String(value)}</dd> 30 - </> 31 - ))} 32 - </dl> 23 + <div className="mt-4 text-sm space-y-1"> 24 + {getOrderedExifData(photo).map(({ displayKey, value }) => ( 25 + <div key={displayKey} className="flex justify-between gap-4"> 26 + <dt className="font-medium">{displayKey}</dt> 27 + <dd className="text-right max-w-[60%] break-words"> 28 + {String(value)} 29 + </dd> 30 + </div> 31 + ))} 33 32 </div> 34 33 )} 35 34 </Dialog.Content>
+7 -2
src/components/PhotoPreview.tsx
··· 9 9 }: Readonly<{ 10 10 photo: Un$Typed<PhotoView>; 11 11 }>) { 12 + const rkey = new AtUri(photo.uri).rkey; 12 13 return ( 13 - <div class="relative aspect-square bg-zinc-200 dark:bg-zinc-900"> 14 + <div 15 + class="relative aspect-square bg-zinc-200 dark:bg-zinc-900" 16 + id={rkey} 17 + > 14 18 {photo.uri ? <AltTextButton photoUri={photo.uri} /> : null} 15 19 {photo.exif ? <PhotoExifButton photoUri={photo.uri} /> : null} 16 20 {photo.uri 17 21 ? ( 18 22 <button 19 23 type="button" 20 - hx-delete={`/actions/photo/${new AtUri(photo.uri).rkey}`} 24 + id={`delete-photo-${rkey}`} 25 + hx-delete={`/actions/photo/${rkey}`} 21 26 class="bg-zinc-950 z-10 absolute top-2 right-2 cursor-pointer size-4 flex items-center justify-center" 22 27 _="on htmx:afterOnLoad remove me.parentNode" 23 28 >
+239 -141
src/components/ProfilePage.tsx
··· 1 + import { LabelValueDefinition } from "$lexicon/types/com/atproto/label/defs.ts"; 1 2 import { ProfileView } from "$lexicon/types/social/grain/actor/defs.ts"; 2 3 import { Record as Gallery } from "$lexicon/types/social/grain/gallery.ts"; 3 4 import { GalleryView } from "$lexicon/types/social/grain/gallery/defs.ts"; 4 5 import { isPhotoView } from "$lexicon/types/social/grain/photo/defs.ts"; 5 6 import { Un$Typed } from "$lexicon/util.ts"; 6 7 import { AtUri } from "@atproto/syntax"; 8 + import { LabelerPolicies } from "@bigmoves/bff"; 7 9 import { Button, cn } from "@bigmoves/bff/components"; 8 10 import { getGalleryCameras } from "../lib/gallery.ts"; 11 + import { 12 + atprotoLabelValueDefinitions, 13 + ModerationDecsion, 14 + } from "../lib/moderation.ts"; 9 15 import type { SocialNetwork } from "../lib/timeline.ts"; 10 16 import { 11 17 bskyProfileLink, ··· 18 24 import { AvatarButton } from "./AvatarButton.tsx"; 19 25 import { CameraBadges } from "./CameraBadges.tsx"; 20 26 import { FollowButton } from "./FollowButton.tsx"; 27 + import { LabelDefinitionButton } from "./LabelDefinitionButton.tsx"; 28 + import { LabelerAvatar } from "./LabelerAvatar.tsx"; 21 29 22 - export type ProfileTabs = "favs" | "galleries"; 30 + export type ProfileTabs = "favs" | "galleries" | "labels"; 23 31 24 32 export function ProfilePage({ 25 33 followUri, ··· 31 39 selectedTab, 32 40 galleries, 33 41 galleryFavs, 42 + galleryModDecisionsMap = new Map(), 43 + isLabeler, 44 + labelerDefinitions, 34 45 }: Readonly<{ 35 46 followUri?: string; 36 47 followersCount?: number; ··· 42 53 selectedTab?: ProfileTabs; 43 54 galleries?: GalleryView[]; 44 55 galleryFavs?: GalleryView[]; 56 + galleryModDecisionsMap?: Map<string, ModerationDecsion>; 57 + isLabeler?: boolean; 58 + labelerDefinitions?: LabelerPolicies; 45 59 }>) { 46 60 const isCreator = loggedInUserDid === profile.did; 47 61 const displayName = profile.displayName || profile.handle; ··· 52 66 <div class="px-4 mb-4" id="profile-page"> 53 67 <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between my-4"> 54 68 <div class="flex flex-col mb-4"> 55 - <AvatarButton profile={profile} /> 69 + {isLabeler 70 + ? <LabelerAvatar profile={profile} size={64} /> 71 + : <AvatarButton profile={profile} />} 56 72 <p class="text-2xl font-bold">{displayName}</p> 57 73 <p class="text-zinc-600 dark:text-zinc-500">@{profile.handle}</p> 58 - <p class="space-x-1"> 59 - <a href={followersLink(profile.handle)}> 60 - <span class="font-semibold" id="followers-count"> 61 - {followersCount ?? 0} 62 - </span>{" "} 63 - <span class="text-zinc-600 dark:text-zinc-500">followers</span> 64 - </a>{" "} 65 - <a href={followingLink(profile.handle)}> 66 - <span class="font-semibold" id="following-count"> 67 - {followingCount ?? 0} 68 - </span>{" "} 69 - <span class="text-zinc-600 dark:text-zinc-500">following</span> 70 - </a>{" "} 71 - <span class="font-semibold">{galleries?.length ?? 0}</span> 72 - <span class="text-zinc-600 dark:text-zinc-500">galleries</span> 73 - </p> 74 - <CameraBadges cameras={cameras} class="mt-2" /> 74 + {!isLabeler && ( 75 + <> 76 + <p class="space-x-1"> 77 + <a href={followersLink(profile.handle)}> 78 + <span class="font-semibold" id="followers-count"> 79 + {followersCount ?? 0} 80 + </span>{" "} 81 + <span class="text-zinc-600 dark:text-zinc-500"> 82 + followers 83 + </span> 84 + </a>{" "} 85 + <a href={followingLink(profile.handle)}> 86 + <span class="font-semibold" id="following-count"> 87 + {followingCount ?? 0} 88 + </span>{" "} 89 + <span class="text-zinc-600 dark:text-zinc-500"> 90 + following 91 + </span> 92 + </a>{" "} 93 + <span class="font-semibold">{galleries?.length ?? 0}</span> 94 + <span class="text-zinc-600 dark:text-zinc-500">galleries</span> 95 + </p> 96 + <CameraBadges cameras={cameras} class="mt-2" /> 97 + </> 98 + )} 75 99 {profile.description 76 100 ? <p class="mt-2 sm:max-w-[500px]">{profile.description}</p> 77 101 : null} ··· 87 111 )} 88 112 </p> 89 113 </div> 90 - {!isCreator && loggedInUserDid 114 + {!isCreator && !isLabeler && loggedInUserDid 91 115 ? ( 92 116 <div class="flex self-start gap-2 w-full sm:w-fit flex-col sm:flex-row"> 93 117 <FollowButton ··· 139 163 role="tablist" 140 164 style={{ WebkitOverflowScrolling: "touch" }} 141 165 > 142 - <button 143 - type="button" 144 - name="tab" 145 - value="galleries" 146 - hx-get={profileLink(profile.handle)} 147 - hx-target="#profile-page" 148 - hx-swap="outerHTML" 149 - class={cn( 150 - "flex-1 min-w-[120px] py-2 px-4 cursor-pointer font-semibold", 151 - selectedTab === "galleries" && "bg-zinc-100 dark:bg-zinc-800", 166 + {isLabeler 167 + ? ( 168 + <button 169 + type="button" 170 + name="tab" 171 + value="favs" 172 + hx-get={profileLink(profile.handle)} 173 + hx-target="#profile-page" 174 + hx-swap="outerHTML" 175 + class={cn( 176 + "flex-1 min-w-[120px] py-2 px-4 cursor-pointer font-semibold", 177 + selectedTab === "labels" && "bg-zinc-100 dark:bg-zinc-800", 178 + )} 179 + role="tab" 180 + aria-selected={selectedTab === "labels"} 181 + aria-controls="tab-content" 182 + > 183 + Labels 184 + </button> 185 + ) 186 + : ( 187 + <button 188 + type="button" 189 + name="tab" 190 + value="galleries" 191 + hx-get={profileLink(profile.handle)} 192 + hx-target="#profile-page" 193 + hx-swap="outerHTML" 194 + class={cn( 195 + "flex-1 min-w-[120px] py-2 px-4 cursor-pointer font-semibold", 196 + selectedTab === "galleries" && "bg-zinc-100 dark:bg-zinc-800", 197 + )} 198 + role="tab" 199 + aria-selected={selectedTab === "galleries"} 200 + aria-controls="tab-content" 201 + > 202 + Galleries 203 + </button> 152 204 )} 153 - role="tab" 154 - aria-selected={selectedTab === "galleries"} 155 - aria-controls="tab-content" 156 - > 157 - Galleries 158 - </button> 205 + 159 206 {isCreator && ( 160 207 <button 161 208 type="button" ··· 175 222 Favs 176 223 </button> 177 224 )} 178 - { 179 - /* <button 180 - type="button" 181 - hx-get={profileLink(profile.handle)} 182 - hx-target="body" 183 - hx-swap="outerHTML" 184 - class={cn( 185 - "flex-1 min-w-[120px] py-2 px-4 cursor-pointer font-semibold", 186 - !selectedTab && "bg-zinc-100 dark:bg-zinc-800 font-semibold", 187 - )} 188 - role="tab" 189 - aria-selected={!selectedTab} 190 - aria-controls="tab-content" 191 - hx-push-url="true" 192 - > 193 - Activity 194 - </button> */ 195 - } 196 225 </div> 197 - <div id="tab-content" role="tabpanel"> 198 - {selectedTab === "galleries" 199 - ? ( 200 - <div class="grid grid-cols-1 sm:grid-cols-3 gap-2 mb-4"> 201 - {galleries?.length 202 - ? ( 203 - galleries.map((gallery) => ( 204 - <a 205 - href={galleryLink( 206 - gallery.creator.handle, 207 - new AtUri(gallery.uri).rkey, 208 - )} 209 - class="cursor-pointer relative aspect-square" 210 - > 211 - {gallery.items?.length 212 - ? ( 213 - <img 214 - src={gallery.items?.filter(isPhotoView)?.[0] 215 - ?.fullsize} 216 - alt={gallery.items?.filter(isPhotoView)?.[0]?.alt} 217 - class="w-full h-full object-cover" 218 - /> 219 - ) 220 - : ( 221 - <div class="w-full h-full bg-zinc-200 dark:bg-zinc-900" /> 222 - )} 223 - <div class="absolute bottom-0 left-0 bg-black/80 text-white p-2"> 224 - {(gallery.record as Gallery).title} 225 - </div> 226 - </a> 227 - )) 228 - ) 229 - : <p>No galleries yet.</p>} 230 - </div> 231 - ) 232 - : null} 233 - {selectedTab === "favs" 234 - ? ( 235 - <div class="grid grid-cols-1 sm:grid-cols-3 gap-2 mb-4"> 236 - {galleryFavs?.length 237 - ? ( 238 - galleryFavs.map((gallery) => ( 239 - <a 240 - href={galleryLink( 241 - gallery.creator.handle, 242 - new AtUri(gallery.uri).rkey, 243 - )} 244 - class="cursor-pointer relative aspect-square" 245 - > 246 - {gallery.items?.length 247 - ? ( 248 - <img 249 - src={gallery.items?.filter(isPhotoView)?.[0] 250 - ?.fullsize} 251 - alt={gallery.items?.filter(isPhotoView)?.[0]?.alt} 252 - class="w-full h-full object-cover" 253 - /> 254 - ) 255 - : ( 256 - <div class="w-full h-full bg-zinc-200 dark:bg-zinc-900" /> 257 - )} 258 - <div class="absolute bottom-0 left-0 bg-black/80 text-white p-2 flex items-center gap-2"> 259 - <ActorAvatar profile={gallery.creator} size={20} />{" "} 260 - {(gallery.record as Gallery).title} 261 - </div> 262 - </a> 263 - )) 264 - ) 265 - : <p>No favs yet.</p>} 226 + {selectedTab === "labels" && labelerDefinitions 227 + ? <LabelerPoliciesList defs={labelerDefinitions} /> 228 + : null} 229 + {selectedTab === "galleries" 230 + ? ( 231 + <div class="grid grid-cols-1 sm:grid-cols-3 gap-2 mb-4"> 232 + {galleries?.length 233 + ? ( 234 + galleries.map((gallery) => ( 235 + <GalleryItem 236 + key={gallery.uri} 237 + gallery={gallery} 238 + galleryModDecisionsMap={galleryModDecisionsMap} 239 + /> 240 + )) 241 + ) 242 + : <p>No galleries yet.</p>} 243 + </div> 244 + ) 245 + : null} 246 + {selectedTab === "favs" 247 + ? ( 248 + <div class="grid grid-cols-1 sm:grid-cols-3 gap-2 mb-4"> 249 + {galleryFavs?.length 250 + ? ( 251 + galleryFavs.map((gallery) => ( 252 + <GalleryFavItem 253 + key={gallery.uri} 254 + gallery={gallery} 255 + galleryModDecisionsMap={galleryModDecisionsMap} 256 + /> 257 + )) 258 + ) 259 + : <p>No favs yet.</p>} 260 + </div> 261 + ) 262 + : null} 263 + </div> 264 + ); 265 + } 266 + 267 + function LabelerPoliciesList({ defs }: Readonly<{ defs: LabelerPolicies }>) { 268 + if (!defs?.labelValues?.length) return <p>No labels yet.</p>; 269 + return ( 270 + <ul class="space-y-4 relative divide-zinc-200 dark:divide-zinc-800 divide-y"> 271 + {defs?.labelValues?.map((val) => { 272 + let def = defs?.labelValueDefinitions?.find((def) => 273 + def.identifier === val 274 + ); 275 + // Fallback to atproto definitions if not found 276 + def ??= atprotoLabelValueDefinitions[val]; 277 + if (!def) return null; 278 + return <LabelValueDefinitionListItem key={def.identifier} def={def} />; 279 + })} 280 + </ul> 281 + ); 282 + } 283 + 284 + function LabelValueDefinitionListItem({ 285 + def, 286 + }: Readonly<{ def: LabelValueDefinition }>) { 287 + const enLocale = def.locales.find((v) => v.lang === "en"); 288 + return ( 289 + <li class="flex flex-col pb-4 gap-2"> 290 + <div class="font-semibold">{enLocale?.name}</div> 291 + <div>{enLocale?.description}</div> 292 + {def.adultOnly 293 + ? ( 294 + <div class="flex items-center gap-2 text-sm"> 295 + <i class="fa fa-info-circle" />{" "} 296 + <span>Adult content is disabled.</span> 297 + </div> 298 + ) 299 + : null} 300 + <div class="text-sm"> 301 + Default setting:{" "} 302 + <span class="font-semibold"> 303 + {def.defaultSetting || "No default value set"} 304 + </span> 305 + </div> 306 + </li> 307 + ); 308 + } 309 + 310 + function GalleryItem({ 311 + gallery, 312 + galleryModDecisionsMap, 313 + }: Readonly<{ 314 + gallery: GalleryView; 315 + galleryModDecisionsMap: Map<string, ModerationDecsion>; 316 + }>) { 317 + const modDecision = galleryModDecisionsMap.get(gallery.uri); 318 + return ( 319 + <a 320 + href={galleryLink( 321 + gallery.creator.handle, 322 + new AtUri(gallery.uri).rkey, 323 + )} 324 + class="cursor-pointer relative aspect-square" 325 + > 326 + {modDecision && !modDecision.isMe 327 + ? ( 328 + <div class="w-full h-full bg-zinc-200 dark:bg-zinc-900 p-2 text-sm"> 329 + <i class="fa fa-circle-info text-zinc-500"></i> {modDecision.name} 330 + <div class="text-sm"> 331 + Labeled by @{modDecision?.labeledBy || "unknown"}.{" "} 332 + <LabelDefinitionButton 333 + src={modDecision.src} 334 + val={modDecision.val} 335 + /> 266 336 </div> 267 - ) 268 - : null} 269 - { 270 - /* {!selectedTab 271 - ? ( 272 - <ul class="space-y-4 relative divide-zinc-200 dark:divide-zinc-800 divide-y w-fit"> 273 - {timelineItems.length 274 - ? ( 275 - timelineItems.map((item) => ( 276 - <Item item={item} key={item.itemUri} /> 277 - )) 278 - ) 279 - : <li>No activity yet.</li>} 280 - </ul> 281 - ) 282 - : null} */ 283 - } 337 + </div> 338 + ) 339 + : gallery.items?.length 340 + ? ( 341 + <img 342 + src={gallery.items?.filter(isPhotoView)?.[0]?.fullsize} 343 + alt={gallery.items?.filter(isPhotoView)?.[0]?.alt} 344 + class="w-full h-full object-cover" 345 + /> 346 + ) 347 + : <div class="w-full h-full bg-zinc-200 dark:bg-zinc-900" />} 348 + <div class="absolute bottom-0 left-0 bg-black/80 text-white p-2 flex items-center gap-2"> 349 + {(gallery.record as Gallery).title} 350 + </div> 351 + </a> 352 + ); 353 + } 354 + 355 + function GalleryFavItem({ 356 + gallery, 357 + galleryModDecisionsMap, 358 + }: Readonly<{ 359 + gallery: GalleryView; 360 + galleryModDecisionsMap: Map<string, ModerationDecsion>; 361 + }>) { 362 + return ( 363 + <a 364 + href={galleryLink( 365 + gallery.creator.handle, 366 + new AtUri(gallery.uri).rkey, 367 + )} 368 + class="cursor-pointer relative aspect-square" 369 + > 370 + {gallery.items?.length 371 + ? ( 372 + <img 373 + src={gallery.items?.filter(isPhotoView)?.[0]?.fullsize} 374 + alt={gallery.items?.filter(isPhotoView)?.[0]?.alt} 375 + class="w-full h-full object-cover" 376 + /> 377 + ) 378 + : <div class="w-full h-full bg-zinc-200 dark:bg-zinc-900" />} 379 + <div class="absolute bottom-0 left-0 bg-black/80 text-white p-2 flex items-center gap-2"> 380 + <ActorAvatar profile={gallery.creator} size={20} />{" "} 381 + {(gallery.record as Gallery).title} 284 382 </div> 285 - </div> 383 + </a> 286 384 ); 287 385 }
+1 -1
src/components/Timeline.tsx
··· 93 93 </form> 94 94 ) 95 95 : null} 96 - <ul class="space-y-4 relative divide-zinc-200 dark:divide-zinc-800 divide-y w-fit"> 96 + <ul class="space-y-4 relative divide-zinc-200 dark:divide-zinc-800 divide-y sm:w-fit"> 97 97 {items.length > 0 98 98 ? items.map((item) => <Item item={item} key={item.itemUri} />) 99 99 : (
+11 -5
src/components/TimelineItem.tsx
··· 5 5 import { formatRelativeTime, galleryLink } from "../utils.ts"; 6 6 import { ActorInfo } from "./ActorInfo.tsx"; 7 7 import { GalleryPreviewLink } from "./GalleryPreviewLink.tsx"; 8 + import { ModerationWrapper } from "./ModerationWrapper.tsx"; 8 9 9 10 export function TimelineItem({ item }: Readonly<{ item: TimelineItem }>) { 10 11 return ( 11 12 <li> 12 - <div class="w-fit flex flex-col gap-4 pb-4"> 13 + <div class="flex flex-col gap-4 pb-4 max-w-md"> 13 14 <div class="flex items-center justify-between gap-2 w-full"> 14 15 <ActorInfo profile={item.actor} /> 15 16 <span class="shrink-0"> ··· 18 19 </div> 19 20 {item.gallery.items?.filter(isPhotoView).length 20 21 ? ( 21 - <GalleryPreviewLink 22 - gallery={item.gallery} 23 - /> 22 + <ModerationWrapper 23 + moderationDecision={item.modDecision} 24 + class="gap-2 sm:min-w-md" 25 + > 26 + <GalleryPreviewLink 27 + gallery={item.gallery} 28 + /> 29 + </ModerationWrapper> 24 30 ) 25 31 : null} 26 32 <p class="w-full flex items-baseline gap-1"> 27 - {item.itemType === "favorite" ? "Favorited" : "Created"}{" "} 33 + Created{" "} 28 34 <a 29 35 href={galleryLink( 30 36 item.gallery.creator.handle,
+9
src/components/UploadPage.tsx
··· 59 59 checked 60 60 /> 61 61 Include image metadata (EXIF) 62 + <button 63 + type="button" 64 + hx-get="/dialogs/exif-info" 65 + hx-target="#layout" 66 + hx-swap="afterbegin" 67 + class="cursor-pointer" 68 + > 69 + <i class="fa fa-info-circle ml-1" /> 70 + </button> 62 71 </label> 63 72 </form> 64 73 <div
+8 -10
src/legal.tsx
··· 169 169 </p> 170 170 </Section> 171 171 172 - { 173 - /* Coming soon */ 174 - /* <Section title="EXIF Metadata"> 172 + <Section title="EXIF Metadata"> 175 173 <p> 176 - We optionally collect and display EXIF metadata (excluding location) 177 - from your photos. At upload time, you can choose whether to allow this 178 - metadata to be collected. The metadata is stored according to standard 179 - AT Protocol storage mechanisms and is not retained outside the 180 - protocol or used for other purposes. 174 + We optionally collect and display EXIF metadata from your photos. At 175 + upload time, you can choose whether to allow this metadata to be 176 + collected. The metadata is stored according to standard AT Protocol 177 + storage mechanisms and is not retained outside the protocol or used 178 + for other purposes. We do not collect GPS or location data from your 179 + photos. 181 180 </p> 182 181 <p> 183 182 You can learn more about the types of metadata commonly embedded in ··· 192 191 </a> 193 192 . 194 193 </p> 195 - </Section> */ 196 - } 194 + </Section> 197 195 198 196 <Section title="Analytics"> 199 197 <p>
+19 -1
src/lib/actor.ts
··· 1 1 import { Record as BskyProfile } from "$lexicon/types/app/bsky/actor/profile.ts"; 2 + import { Label } from "$lexicon/types/com/atproto/label/defs.ts"; 2 3 import { Record as TangledProfile } from "$lexicon/types/sh/tangled/actor/profile.ts"; 3 4 import { ProfileView } from "$lexicon/types/social/grain/actor/defs.ts"; 4 5 import { Record as GrainProfile } from "$lexicon/types/social/grain/actor/profile.ts"; ··· 90 91 91 92 const galleryPhotosMap = getGalleryItemsAndPhotos(ctx, galleries); 92 93 const creator = getActorProfile(did, ctx); 94 + const labelMap = new Map<string, Label[]>(); 95 + for (const gallery of galleries) { 96 + const labels = ctx.indexService.queryLabels({ subjects: [gallery.uri] }); 97 + labelMap.set(gallery.uri, labels); 98 + } 93 99 94 100 if (!creator) return []; 95 101 96 102 return galleries.map((gallery) => 97 - galleryToView(gallery, creator, galleryPhotosMap.get(gallery.uri) ?? []) 103 + galleryToView( 104 + gallery, 105 + creator, 106 + galleryPhotosMap.get(gallery.uri) ?? [], 107 + labelMap.get(gallery.uri) ?? [], 108 + ) 98 109 ); 99 110 } 100 111 ··· 140 151 new Set(galleries.map((gallery) => gallery.did)), 141 152 ); 142 153 154 + const labelMap = new Map<string, Label[]>(); 155 + for (const gallery of galleries) { 156 + const labels = ctx.indexService.queryLabels({ subjects: [gallery.uri] }); 157 + labelMap.set(gallery.uri, labels); 158 + } 159 + 143 160 const { items: profiles } = ctx.indexService.getRecords< 144 161 WithBffMeta<GrainProfile> 145 162 >( ··· 165 182 gallery, 166 183 creator, 167 184 galleryPhotosMap.get(gallery.uri) ?? [], 185 + labelMap.get(gallery.uri) ?? [], 168 186 ); 169 187 }) 170 188 .filter((g) => g !== null);
+8 -6
src/lib/gallery.ts
··· 1 + import { Label } from "$lexicon/types/com/atproto/label/defs.ts"; 1 2 import { ProfileView } from "$lexicon/types/social/grain/actor/defs.ts"; 2 3 import { Record as Favorite } from "$lexicon/types/social/grain/favorite.ts"; 3 4 import { Record as Gallery } from "$lexicon/types/social/grain/gallery.ts"; ··· 102 103 const galleryPhotosMap = getGalleryItemsAndPhotos(ctx, [gallery]); 103 104 const profile = getActorProfile(did, ctx); 104 105 if (!profile) return null; 106 + const labels = ctx.indexService.queryLabels({ 107 + subjects: [gallery.uri], 108 + }); 105 109 return galleryToView( 106 110 gallery, 107 111 profile, 108 112 galleryPhotosMap.get(gallery.uri) ?? [], 113 + labels, 109 114 ); 110 115 } 111 116 ··· 150 155 record: WithBffMeta<Gallery>, 151 156 creator: Un$Typed<ProfileView>, 152 157 items: PhotoWithExif[], 158 + labels: Label[] = [], 153 159 ): Un$Typed<GalleryView> { 154 160 return { 155 161 uri: record.uri, ··· 159 165 items: items 160 166 ?.map((item) => itemToView(record.did, item)) 161 167 .filter(isPhotoView), 168 + labels, 162 169 indexedAt: record.indexedAt, 163 170 }; 164 171 } ··· 184 191 const cameras = new Set<string>(); 185 192 for (const photo of photos) { 186 193 if (photo.exif?.make) { 187 - // Capitalize first letter of each word for make only, leave model raw 188 - const make = photo.exif.make.charAt(0).toUpperCase() + 189 - photo.exif.make.slice(1).toLowerCase(); 190 - const model = photo.exif.model ?? ""; 191 - console.log(make, model); 192 - cameras.add(`${make} ${model}`.trim()); 194 + cameras.add(`${photo.exif.make} ${photo.exif.model}`.trim()); 193 195 } 194 196 } 195 197 return Array.from(cameras);
+104
src/lib/moderation.ts
··· 1 + import { 2 + Label, 3 + LabelValueDefinition, 4 + } from "$lexicon/types/com/atproto/label/defs.ts"; 5 + import { AtUri } from "@atproto/syntax"; 6 + import { BffContext } from "@bigmoves/bff"; 7 + import { State } from "../state.ts"; 8 + 9 + export type ModerationDecsion = { 10 + name: string; 11 + description: string; 12 + labeledBy: string; 13 + blurs: string; 14 + isMe: boolean; 15 + src: string; 16 + val: string; 17 + }; 18 + 19 + export async function moderateGallery(labels: Label[], ctx: BffContext<State>) { 20 + const did = ctx.currentUser?.did; 21 + const labelDefinitions = await ctx.getLabelerDefinitions(); 22 + 23 + for (const label of labels ?? []) { 24 + const labelSubject = new AtUri(label.uri).hostname; 25 + const labelerAtpData = await ctx.didResolver.resolveAtprotoData(label.src); 26 + // Try labelDefinitions first, then fallback to atprotoLabelValueDefinitions 27 + let defs = labelDefinitions[label.src]?.labelValueDefinitions?.filter(( 28 + def, 29 + ) => def.identifier === label.val); 30 + if ( 31 + (!defs || defs.length === 0) && atprotoLabelValueDefinitions[label.val] 32 + ) { 33 + defs = [atprotoLabelValueDefinitions[label.val]]; 34 + } 35 + if (defs && defs.length > 0) { 36 + const enLocale = defs[0].locales?.find((locale) => locale.lang === "en"); 37 + if (enLocale) { 38 + return { 39 + name: enLocale.name, 40 + description: enLocale.description, 41 + labeledBy: labelerAtpData.handle ?? label.src, 42 + blurs: defs[0].blurs ?? "", 43 + isMe: labelSubject === did, 44 + src: label.src, 45 + val: label.val, 46 + }; 47 + } 48 + } 49 + } 50 + return undefined; 51 + } 52 + 53 + export async function isLabeler(did: string, ctx: BffContext<State>) { 54 + const labelDefinitions = await ctx.getLabelerDefinitions(); 55 + return Object.keys(labelDefinitions).includes(did); 56 + } 57 + 58 + export const atprotoLabelValueDefinitions: Record< 59 + string, 60 + LabelValueDefinition 61 + > = { 62 + porn: { 63 + blurs: "media", 64 + severity: "high", 65 + identifier: "porn", 66 + adultOnly: true, 67 + defaultSetting: "hide", 68 + locales: [ 69 + { 70 + lang: "en", 71 + name: "Adult Content", 72 + description: "Explicit sexual images.", 73 + }, 74 + ], 75 + }, 76 + sexual: { 77 + blurs: "media", 78 + severity: "high", 79 + identifier: "porn", 80 + adultOnly: true, 81 + defaultSetting: "hide", 82 + locales: [ 83 + { 84 + lang: "en", 85 + name: "Sexually Suggestive", 86 + description: "Does not include nudity.", 87 + }, 88 + ], 89 + }, 90 + nudity: { 91 + blurs: "media", 92 + severity: "high", 93 + identifier: "porn", 94 + adultOnly: true, 95 + defaultSetting: "hide", 96 + locales: [ 97 + { 98 + lang: "en", 99 + name: "Non-sexual Nudity", 100 + description: "E.g. artistic nudes.", 101 + }, 102 + ], 103 + }, 104 + };
+11 -2
src/lib/photo.ts
··· 65 65 const deserializedExif = deserializeExif(exif); 66 66 return { 67 67 ...deserializedExif, 68 + make: deserializedExif.make ? formatMake(deserializedExif.make) : undefined, 68 69 fNumber: deserializedExif.fNumber 69 70 ? formatAperture(deserializedExif.fNumber) 70 71 : undefined, ··· 82 83 : undefined, 83 84 $type: "social.grain.photo.defs#exifView", 84 85 }; 86 + } 87 + 88 + function formatMake(make: string) { 89 + return make 90 + .toLowerCase() 91 + .split(" ") 92 + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) 93 + .join(" "); 85 94 } 86 95 87 96 function formatAperture(fNumber: number): string { ··· 156 165 ]; 157 166 158 167 export function getOrderedExifData(photo: PhotoView) { 159 - const exif = photo.exif || {}; 160 - const entries = Object.entries(exif) 168 + if (!photo.exif) return []; 169 + const entries = Object.entries(photo.exif) 161 170 .filter(([key]) => 162 171 tagOrder.some((tag) => tag.toLowerCase() === key.toLowerCase()) 163 172 )
+20 -9
src/lib/timeline.ts
··· 9 9 import { BffContext, QueryOptions, WithBffMeta } from "@bigmoves/bff"; 10 10 import { getActorProfile } from "./actor.ts"; 11 11 import { galleryToView, getGalleryItemsAndPhotos } from "./gallery.ts"; 12 + import { moderateGallery, ModerationDecsion } from "./moderation.ts"; 12 13 13 14 export type TimelineItemType = "gallery"; 14 15 ··· 20 21 itemUri: string; 21 22 actor: Un$Typed<ProfileView>; 22 23 gallery: GalleryView; 24 + modDecision?: ModerationDecsion; 23 25 }; 24 26 25 27 type TimelineOptions = { ··· 27 29 followingDids?: Set<string>; 28 30 }; 29 31 30 - function processGalleries( 32 + async function processGalleries( 31 33 ctx: BffContext, 32 34 options?: TimelineOptions, 33 - ): TimelineItem[] { 35 + ): Promise<TimelineItem[]> { 34 36 const items: TimelineItem[] = []; 35 37 36 38 let whereClause: QueryOptions["where"] = options?.actorDid ··· 70 72 new AtUri(gallery.uri).rkey 71 73 }`; 72 74 const galleryPhotos = galleryPhotosMap.get(galleryUri) || []; 75 + const labels = ctx.indexService.queryLabels({ 76 + subjects: [gallery.uri], 77 + }); 78 + const galleryView = galleryToView(gallery, profile, galleryPhotos, labels); 79 + 80 + let modDecision: ModerationDecsion | undefined = undefined; 81 + if (galleryView.labels?.length) { 82 + modDecision = await moderateGallery(labels, ctx); 83 + } 73 84 74 - const galleryView = galleryToView(gallery, profile, galleryPhotos); 75 85 items.push({ 76 86 itemType: "gallery", 77 87 createdAt: gallery.createdAt, 78 88 itemUri: galleryView.uri, 79 89 actor: galleryView.creator, 80 90 gallery: galleryView, 91 + modDecision, 81 92 }); 82 93 } 83 94 84 95 return items; 85 96 } 86 97 87 - function getTimelineItems( 98 + async function getTimelineItems( 88 99 ctx: BffContext, 89 100 options?: TimelineOptions, 90 - ): TimelineItem[] { 91 - const galleryItems = processGalleries(ctx, options); 101 + ): Promise<TimelineItem[]> { 102 + const galleryItems = await processGalleries(ctx, options); 92 103 return galleryItems.sort( 93 104 (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), 94 105 ); ··· 114 125 return new Set(follows.map((f) => f.subject).filter(Boolean)); 115 126 } 116 127 117 - export function getTimeline( 128 + export async function getTimeline( 118 129 ctx: BffContext, 119 130 type: "timeline" | "following", 120 131 graph: SocialNetwork, 121 - ): TimelineItem[] { 132 + ): Promise<TimelineItem[]> { 122 133 let followingDids: Set<string> | undefined = undefined; 123 134 if (type === "following") { 124 135 followingDids = getFollowingDids(graph, ctx); 125 136 } 126 - const galleryItems = processGalleries(ctx, { followingDids }); 137 + const galleryItems = await processGalleries(ctx, { followingDids }); 127 138 return galleryItems.sort( 128 139 (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), 129 140 );
+9
src/main.tsx
··· 5 5 import { PDS_HOST_URL } from "./env.ts"; 6 6 import { onError } from "./lib/errors.ts"; 7 7 import * as actionHandlers from "./routes/actions.tsx"; 8 + import { handler as communityGuidelinesHandler } from "./routes/community_guidelines.tsx"; 8 9 import * as dialogHandlers from "./routes/dialogs.tsx"; 9 10 import { handler as exploreHandler } from "./routes/explore.tsx"; 10 11 import { handler as followersHandler } from "./routes/followers.tsx"; ··· 25 26 26 27 bff({ 27 28 appName: "Grain Social", 29 + appLabelers: ["did:plc:nd45zozo34cr4pvxqu4rtr7e"], 30 + appLabelerCollection: "social.grain.labeler.service", 28 31 collections: [ 29 32 "social.grain.actor.profile", 30 33 "social.grain.gallery", ··· 71 74 route("/support/privacy", legalHandlers.privacyHandler), 72 75 route("/support/terms", legalHandlers.termsHandler), 73 76 route("/support/copyright", legalHandlers.copyrightHandler), 77 + route("/support/community-guidelines", communityGuidelinesHandler), 74 78 route("/dialogs/create-account", dialogHandlers.createAccount), 75 79 route("/dialogs/gallery/new", dialogHandlers.createGallery), 76 80 route("/dialogs/gallery/:rkey", dialogHandlers.editGallery), 77 81 route("/dialogs/gallery/:rkey/sort", dialogHandlers.sortGallery), 82 + route("/dialogs/label/:src/:val", dialogHandlers.labelValueDefinition), 78 83 route("/dialogs/profile", dialogHandlers.editProfile), 79 84 route("/dialogs/avatar/:handle", dialogHandlers.avatar), 80 85 route("/dialogs/image", dialogHandlers.image), ··· 86 91 route( 87 92 "/dialogs/photo/:rkey/exif-overlay", 88 93 dialogHandlers.photoExifOverlay, 94 + ), 95 + route( 96 + "/dialogs/exif-info", 97 + dialogHandlers.exifInfo, 89 98 ), 90 99 route( 91 100 "/dialogs/photo-select/:galleryRkey",
+123
src/routes/community_guidelines.tsx
··· 1 + import { BffContext, RouteHandler } from "@bigmoves/bff"; 2 + import { ComponentChildren } from "preact"; 3 + import { Breadcrumb } from "../components/Breadcrumb.tsx"; 4 + import { State } from "../state.ts"; 5 + 6 + export const handler: RouteHandler = ( 7 + _req, 8 + _params, 9 + ctx: BffContext<State>, 10 + ) => { 11 + ctx.state.meta = [ 12 + { title: "Community Guidelines — Grain" }, 13 + ]; 14 + return ctx.render( 15 + <div className="px-4 py-4"> 16 + <Breadcrumb 17 + items={[{ label: "support", href: "/support" }, { 18 + label: "community guidelines", 19 + }]} 20 + /> 21 + <h1 className="text-3xl font-bold mb-6 text-zinc-900 dark:text-white"> 22 + Community Guidelines 23 + </h1> 24 + <Section title="About Grain Social"> 25 + <p> 26 + Grain Social is a photo-sharing service built on the AT Protocol. 27 + These guidelines apply specifically to Grain Social. While the 28 + protocol is decentralized and supports many independent services, our 29 + focus is on fostering a respectful, creative, and safe experience 30 + within our app. 31 + </p> 32 + </Section> 33 + 34 + <Section title="Our Principles"> 35 + <ul className="list-disc pl-5 space-y-1"> 36 + <li> 37 + <strong>User choice</strong>: We are committed to empowering users 38 + with control over where their data is stored, how their content is 39 + moderated, and which algorithms power their feeds (hopefully more 40 + options soon!). 41 + </li> 42 + <li> 43 + <strong>Welcoming space</strong>: We aim to build a friendly, 44 + inclusive environment where people enjoy sharing and discovering 45 + photos. 46 + </li> 47 + <li> 48 + <strong>Evolving standards</strong>: Our policies will adapt over 49 + time based on your feedback and the needs of the community. 50 + </li> 51 + </ul> 52 + </Section> 53 + 54 + <Section title="What’s Not Allowed"> 55 + <p> 56 + Don't use Grain Social to break the law, harm others, or disrupt the 57 + network. Specifically, do not: 58 + </p> 59 + <ul className="list-disc pl-5 space-y-1"> 60 + <li>Promote hate groups or terrorism</li> 61 + <li> 62 + Share child sexual abuse material or any sexual content involving 63 + minors 64 + </li> 65 + <li>Engage in trafficking, exploitation, or predatory behavior</li> 66 + <li>Trade illegal goods or substances</li> 67 + <li>Share private personal info without consent</li> 68 + <li>Hack, phish, scam, or impersonate others</li> 69 + <li>Spam, abuse automation, or manipulate engagement</li> 70 + <li>Violate copyrights or trademarks</li> 71 + <li>Spread false or misleading election info</li> 72 + <li> 73 + Evade moderation actions (e.g., ban evasion) by creating new 74 + accounts 75 + </li> 76 + </ul> 77 + </Section> 78 + 79 + <Section title="Respect Others"> 80 + <p>We expect respectful conduct. This includes avoiding:</p> 81 + <ul className="list-disc pl-5 space-y-1"> 82 + <li>Harassment, bullying, or targeted abuse</li> 83 + <li>Hate speech or extremist content</li> 84 + <li>Threats of violence or glorification of harm</li> 85 + <li>Promotion of self-harm or suicide</li> 86 + <li>Graphic violence or non-consensual sexual content</li> 87 + <li>Misleading impersonation of individuals or organizations</li> 88 + </ul> 89 + </Section> 90 + 91 + <Section title="Reporting Violations"> 92 + <p> 93 + Help us keep the community safe. You can report photos, galleries, or 94 + accounts directly through the app (soon!) or by contacting us at{" "} 95 + <a 96 + href="mailto:support@grain.social" 97 + className="text-sky-500 underline hover:underline" 98 + > 99 + support@grain.social 100 + </a> 101 + . Our moderation team will review and take action where needed. 102 + Reports may consider off-platform context when relevant. 103 + </p> 104 + </Section> 105 + </div>, 106 + ); 107 + }; 108 + 109 + type SectionProps = { 110 + title: string; 111 + children: ComponentChildren; 112 + }; 113 + 114 + const Section = ({ title, children }: SectionProps) => ( 115 + <section className="mb-8"> 116 + <h2 className="text-xl font-bold mb-2 text-zinc-800 dark:text-zinc-100"> 117 + {title} 118 + </h2> 119 + <div className="space-y-2 text-zinc-700 dark:text-zinc-300"> 120 + {children} 121 + </div> 122 + </section> 123 + );
+41
src/routes/dialogs.tsx
··· 7 7 import { wrap } from "popmotion"; 8 8 import { AvatarDialog } from "../components/AvatarDialog.tsx"; 9 9 import { CreateAccountDialog } from "../components/CreateAccountDialog.tsx"; 10 + import { ExifInfoDialog } from "../components/ExifInfoDialog.tsx"; 10 11 import { ExifOverlayDialog } from "../components/ExifOverlayDialog.tsx"; 11 12 import { GalleryCreateEditDialog } from "../components/GalleryCreateEditDialog.tsx"; 12 13 import { GallerySortDialog } from "../components/GallerySortDialog.tsx"; 14 + import { LabelDefinitionDialog } from "../components/LabelDefinitionDialog.tsx"; 13 15 import { PhotoAltDialog } from "../components/PhotoAltDialog.tsx"; 14 16 import { PhotoDialog } from "../components/PhotoDialog.tsx"; 15 17 import { PhotoExifDialog } from "../components/PhotoExifDialog.tsx"; ··· 17 19 import { ProfileDialog } from "../components/ProfileDialog.tsx"; 18 20 import { getActorPhotos, getActorProfile } from "../lib/actor.ts"; 19 21 import { getGallery, getGalleryItemsAndPhotos } from "../lib/gallery.ts"; 22 + import { atprotoLabelValueDefinitions } from "../lib/moderation.ts"; 20 23 import { getPhoto, photoToView } from "../lib/photo.ts"; 21 24 import type { State } from "../state.ts"; 22 25 ··· 194 197 ) => { 195 198 return ctx.html(<CreateAccountDialog />); 196 199 }; 200 + 201 + export const labelValueDefinition: RouteHandler = async ( 202 + _req, 203 + params, 204 + ctx: BffContext<State>, 205 + ) => { 206 + const src = params.src; 207 + const val = params.val; 208 + const labelerDeinitionsMap = await ctx.getLabelerDefinitions(); 209 + if (!labelerDeinitionsMap) return ctx.next(); 210 + const labelValueDefinitions = labelerDeinitionsMap[src] 211 + ?.labelValueDefinitions; 212 + if (!labelValueDefinitions) return ctx.next(); 213 + 214 + let valDef = labelValueDefinitions.find((def) => def.identifier === val); 215 + if (!valDef && typeof val === "string") { 216 + valDef = atprotoLabelValueDefinitions[val]; 217 + } 218 + 219 + if (!valDef) return ctx.next(); 220 + const labelerAtpData = await ctx.didResolver.resolveAtprotoData(src); 221 + return ctx.html( 222 + <LabelDefinitionDialog 223 + labelByHandle={labelerAtpData?.handle} 224 + labelValueDefinition={valDef} 225 + />, 226 + ); 227 + }; 228 + 229 + export const exifInfo: RouteHandler = ( 230 + _req, 231 + _params, 232 + ctx: BffContext<State>, 233 + ) => { 234 + return ctx.html( 235 + <ExifInfoDialog />, 236 + ); 237 + };
+5 -1
src/routes/explore.tsx
··· 5 5 import { Input } from "@bigmoves/bff/components"; 6 6 import { ComponentChildren } from "preact"; 7 7 import { ActorAvatar } from "../components/ActorAvatar.tsx"; 8 + import { LabelerAvatar } from "../components/LabelerAvatar.tsx"; 8 9 import { profileToView } from "../lib/actor.ts"; 9 10 import { getPageMeta } from "../meta.ts"; 10 11 import type { State } from "../state.ts"; ··· 85 86 {profileViews.map((profile) => ( 86 87 <li key={profile.did}> 87 88 <a class="flex items-center" href={`/profile/${profile.handle}`}> 88 - <ActorAvatar profile={profile} size={32} class="mr-2" /> 89 + {/* @TODO remove hard-coded handler */} 90 + {profile.handle === "moderation.grain.social" 91 + ? <LabelerAvatar profile={profile} size={32} class="mr-2" /> 92 + : <ActorAvatar profile={profile} size={32} class="mr-2" />} 89 93 <div class="flex flex-col"> 90 94 <div class="font-semibold"> 91 95 {profile.displayName || profile.handle}
+13 -2
src/routes/gallery.tsx
··· 3 3 import { BffContext, RouteHandler, WithBffMeta } from "@bigmoves/bff"; 4 4 import { GalleryPage } from "../components/GalleryPage.tsx"; 5 5 import { getGallery, getGalleryFavs } from "../lib/gallery.ts"; 6 + import { moderateGallery, ModerationDecsion } from "../lib/moderation.ts"; 6 7 import { getGalleryMeta, getPageMeta } from "../meta.ts"; 7 8 import type { State } from "../state.ts"; 8 9 import { galleryLink } from "../utils.ts"; 9 10 10 - export const handler: RouteHandler = ( 11 + export const handler: RouteHandler = async ( 11 12 _req, 12 13 params, 13 14 ctx: BffContext<State>, ··· 30 31 31 32 ctx.state.scripts = ["photo_dialog.js", "masonry.js", "sortable.js"]; 32 33 34 + let modDecision: ModerationDecsion | undefined = undefined; 35 + if (gallery.labels?.length) { 36 + modDecision = await moderateGallery(gallery.labels ?? [], ctx); 37 + } 38 + 33 39 return ctx.render( 34 - <GalleryPage favs={favs} gallery={gallery} currentUserDid={did} />, 40 + <GalleryPage 41 + favs={favs} 42 + gallery={gallery} 43 + currentUserDid={did} 44 + modDecision={modDecision} 45 + />, 35 46 ); 36 47 };
+34 -3
src/routes/profile.tsx
··· 1 - import { BffContext, RouteHandler } from "@bigmoves/bff"; 1 + import { BffContext, LabelerPolicies, RouteHandler } from "@bigmoves/bff"; 2 2 import { ProfilePage, ProfileTabs } from "../components/ProfilePage.tsx"; 3 3 import { 4 4 getActorGalleries, ··· 7 7 getActorProfiles, 8 8 } from "../lib/actor.ts"; 9 9 import { getFollow, getFollowers, getFollowing } from "../lib/follow.ts"; 10 + import { 11 + isLabeler as isLabelerFn, 12 + moderateGallery, 13 + ModerationDecsion, 14 + } from "../lib/moderation.ts"; 10 15 import { type SocialNetwork } from "../lib/timeline.ts"; 11 16 import { getPageMeta } from "../meta.ts"; 12 17 import type { State } from "../state.ts"; 13 18 import { profileLink } from "../utils.ts"; 14 19 15 - export const handler: RouteHandler = ( 20 + export const handler: RouteHandler = async ( 16 21 req, 17 22 params, 18 23 ctx: BffContext<State>, ··· 31 36 const followers = getFollowers(actor.did, ctx); 32 37 const following = getFollowing(actor.did, ctx); 33 38 39 + let labelerDefinitions: LabelerPolicies | undefined = undefined; 40 + const isLabeler = await isLabelerFn(actor.did, ctx); 41 + if (isLabeler) { 42 + const labelerDefs = await ctx.getLabelerDefinitions(); 43 + labelerDefinitions = labelerDefs[actor.did] ?? []; 44 + } 45 + 46 + const galleryModDecisionsMap = new Map<string, ModerationDecsion>(); 47 + for (const gallery of galleries) { 48 + if (!gallery.labels || gallery.labels.length === 0) { 49 + continue; 50 + } 51 + const modDecision = await moderateGallery( 52 + gallery.labels ?? [], 53 + ctx, 54 + ); 55 + if (!modDecision) { 56 + continue; 57 + } 58 + galleryModDecisionsMap.set(gallery.uri, modDecision); 59 + } 60 + 34 61 if (!profile) return ctx.next(); 35 62 36 63 let followUri: string | undefined; ··· 69 96 selectedTab="favs" 70 97 galleries={galleries} 71 98 galleryFavs={galleryFavs} 99 + galleryModDecisionsMap={galleryModDecisionsMap} 72 100 />, 73 101 ); 74 102 } ··· 81 109 followUri={followUri} 82 110 loggedInUserDid={ctx.currentUser?.did} 83 111 profile={profile} 84 - selectedTab="galleries" 112 + selectedTab={isLabeler ? "labels" : "galleries"} 85 113 galleries={galleries} 114 + galleryModDecisionsMap={galleryModDecisionsMap} 115 + isLabeler={isLabeler} 116 + labelerDefinitions={labelerDefinitions} 86 117 />, 87 118 ); 88 119 };
+2 -2
src/routes/timeline.tsx
··· 6 6 import { getPageMeta } from "../meta.ts"; 7 7 import type { State } from "../state.ts"; 8 8 9 - export const handler: RouteHandler = ( 9 + export const handler: RouteHandler = async ( 10 10 req, 11 11 _params, 12 12 ctx: BffContext<State>, ··· 44 44 graph = actorProfiles[0]; 45 45 } 46 46 47 - const items = getTimeline( 47 + const items = await getTimeline( 48 48 ctx, 49 49 tab === "following" ? "following" : "timeline", 50 50 graph,
+39 -8
src/static/upload_page.ts
··· 1 1 import exifr from "exifr"; 2 2 import htmx from "htmx.org"; 3 + import hyperscript from "hyperscript.org"; 3 4 import { dataURLToBlob, doResize, readFileAsDataURL } from "./photo_manip.ts"; 4 5 import { tags as supportedTags } from "./tags.ts"; 5 6 ··· 58 59 const blob = dataURLToBlob(resized.path); 59 60 60 61 const fd = new FormData(); 61 - fd.append("file", blob, file.name); 62 + fd.append("file", blob, (file as File).name); 62 63 fd.append("width", String(resized.width)); 63 64 fd.append("height", String(resized.height)); 64 65 ··· 66 67 fd.append("exif", JSON.stringify(tags)); 67 68 } 68 69 69 - htmx.ajax("POST", "/actions/photo", { 70 - "swap": "afterbegin", 71 - "target": "#image-preview", 72 - "values": Object.fromEntries(fd), 73 - "source": formElement, 70 + const response = await fetch("/actions/photo", { 71 + method: "POST", 72 + body: fd, 74 73 }); 74 + 75 + if (!response.ok) { 76 + alert(await response.text()); 77 + return; 78 + } 79 + 80 + const html = await response.text(); 81 + const temp = document.createElement("div"); 82 + temp.innerHTML = html; 83 + const photoId = temp?.firstElementChild?.id; 84 + 85 + const preview = document.querySelector("#image-preview"); 86 + if (preview) { 87 + const firstChild = temp.firstElementChild; 88 + 89 + if (firstChild) { 90 + preview.insertBefore(firstChild, preview.firstChild); 91 + } 92 + 93 + htmx.process(preview); 94 + 95 + const deleteButton = preview.querySelector( 96 + `#delete-photo-${photoId}`, 97 + ); 98 + if (!deleteButton) { 99 + return; 100 + } 101 + htmx.process(deleteButton); 102 + hyperscript.processNode(deleteButton); 103 + } 75 104 }); 76 105 77 106 await Promise.all(uploadPromises); 78 107 79 108 // Clear the file input after upload 80 - (formElement.querySelector("input[type='file']") as HTMLInputElement)! 81 - .value = ""; 109 + const fileInput = formElement.querySelector("input[type='file']"); 110 + if (fileInput instanceof HTMLInputElement) { 111 + fileInput.value = ""; 112 + } 82 113 } 83 114 } 84 115
+11 -11
static/app.esm.js
··· 1 - var $l=Object.create;var rs=Object.defineProperty;var Jl=Object.getOwnPropertyDescriptor;var Zl=Object.getOwnPropertyNames;var eu=Object.getPrototypeOf,tu=Object.prototype.hasOwnProperty;var ns=(Qr=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(Qr,{get:(Gr,Wr)=>(typeof require<"u"?require:Gr)[Wr]}):Qr)(function(Qr){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+Qr+'" is not supported')});var Qs=(Qr,Gr)=>()=>(Gr||Qr((Gr={exports:{}}).exports,Gr),Gr.exports),ru=(Qr,Gr)=>{for(var Wr in Gr)rs(Qr,Wr,{get:Gr[Wr],enumerable:!0})},nu=(Qr,Gr,Wr,Kr)=>{if(Gr&&typeof Gr=="object"||typeof Gr=="function")for(let Yr of Zl(Gr))!tu.call(Qr,Yr)&&Yr!==Wr&&rs(Qr,Yr,{get:()=>Gr[Yr],enumerable:!(Kr=Jl(Gr,Yr))||Kr.enumerable});return Qr};var po=(Qr,Gr,Wr)=>(Wr=Qr!=null?$l(eu(Qr)):{},nu(Gr||!Qr||!Qr.__esModule?rs(Wr,"default",{value:Qr,enumerable:!0}):Wr,Qr));var mo=Qs((exports,module)=>{(function(Qr,Gr){typeof define=="function"&&define.amd?define([],Gr):typeof module=="object"&&module.exports?module.exports=Gr():Qr.htmx=Qr.htmx||Gr()})(typeof self<"u"?self:exports,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(Qr,Gr){var Wr=dr(Qr,Gr||"post");return Wr.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:!1,scrollBehavior:"smooth",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get"],selfRequestsOnly:!1,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(Qr){return new EventSource(Qr,{withCredentials:!0})},createWebSocket:function(Qr){var Gr=new WebSocket(Qr,[]);return Gr.binaryType=Q.config.wsBinaryType,Gr},version:"1.9.12"},r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R},w=["get","post","put","delete","patch"],i=w.map(function(Qr){return"[hx-"+Qr+"], [data-hx-"+Qr+"]"}).join(", "),S=e("head"),q=e("title"),H=e("svg",!0);function e(Qr,Gr){return new RegExp("<"+Qr+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+Qr+">",Gr?"gim":"im")}function d(Qr){if(Qr==null)return;let Gr=NaN;return Qr.slice(-2)=="ms"?Gr=parseFloat(Qr.slice(0,-2)):Qr.slice(-1)=="s"?Gr=parseFloat(Qr.slice(0,-1))*1e3:Qr.slice(-1)=="m"?Gr=parseFloat(Qr.slice(0,-1))*1e3*60:Gr=parseFloat(Qr),isNaN(Gr)?void 0:Gr}function ee(Qr,Gr){return Qr.getAttribute&&Qr.getAttribute(Gr)}function o(Qr,Gr){return Qr.hasAttribute&&(Qr.hasAttribute(Gr)||Qr.hasAttribute("data-"+Gr))}function te(Qr,Gr){return ee(Qr,Gr)||ee(Qr,"data-"+Gr)}function u(Qr){return Qr.parentElement}function re(){return document}function c(Qr,Gr){for(;Qr&&!Gr(Qr);)Qr=u(Qr);return Qr||null}function L(Qr,Gr,Wr){var Kr=te(Gr,Wr),Yr=te(Gr,"hx-disinherit");return Qr!==Gr&&Yr&&(Yr==="*"||Yr.split(" ").indexOf(Wr)>=0)?"unset":Kr}function ne(Qr,Gr){var Wr=null;if(c(Qr,function(Kr){return Wr=L(Qr,Kr,Gr)}),Wr!=="unset")return Wr}function h(Qr,Gr){var Wr=Qr.matches||Qr.matchesSelector||Qr.msMatchesSelector||Qr.mozMatchesSelector||Qr.webkitMatchesSelector||Qr.oMatchesSelector;return Wr&&Wr.call(Qr,Gr)}function A(Qr){var Gr=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Wr=Gr.exec(Qr);return Wr?Wr[1].toLowerCase():""}function s(Qr,Gr){for(var Wr=new DOMParser,Kr=Wr.parseFromString(Qr,"text/html"),Yr=Kr.body;Gr>0;)Gr--,Yr=Yr.firstChild;return Yr==null&&(Yr=re().createDocumentFragment()),Yr}function N(Qr){return/<body/.test(Qr)}function l(Qr){var Gr=!N(Qr),Wr=A(Qr),Kr=Qr;if(Wr==="head"&&(Kr=Kr.replace(S,"")),Q.config.useTemplateFragments&&Gr){var Yr=s("<body><template>"+Kr+"</template></body>",0),Zr=Yr.querySelector("template").content;return Q.config.allowScriptTags?oe(Zr.querySelectorAll("script"),function(tn){Q.config.inlineScriptNonce&&(tn.nonce=Q.config.inlineScriptNonce),tn.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1}):oe(Zr.querySelectorAll("script"),function(tn){_(tn)}),Zr}switch(Wr){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s("<table>"+Kr+"</table>",1);case"col":return s("<table><colgroup>"+Kr+"</colgroup></table>",2);case"tr":return s("<table><tbody>"+Kr+"</tbody></table>",2);case"td":case"th":return s("<table><tbody><tr>"+Kr+"</tr></tbody></table>",3);case"script":case"style":return s("<div>"+Kr+"</div>",1);default:return s(Kr,0)}}function ie(Qr){Qr&&Qr()}function I(Qr,Gr){return Object.prototype.toString.call(Qr)==="[object "+Gr+"]"}function k(Qr){return I(Qr,"Function")}function P(Qr){return I(Qr,"Object")}function ae(Qr){var Gr="htmx-internal-data",Wr=Qr[Gr];return Wr||(Wr=Qr[Gr]={}),Wr}function M(Qr){var Gr=[];if(Qr)for(var Wr=0;Wr<Qr.length;Wr++)Gr.push(Qr[Wr]);return Gr}function oe(Qr,Gr){if(Qr)for(var Wr=0;Wr<Qr.length;Wr++)Gr(Qr[Wr])}function X(Qr){var Gr=Qr.getBoundingClientRect(),Wr=Gr.top,Kr=Gr.bottom;return Wr<window.innerHeight&&Kr>=0}function se(Qr){return Qr.getRootNode&&Qr.getRootNode()instanceof window.ShadowRoot?re().body.contains(Qr.getRootNode().host):re().body.contains(Qr)}function D(Qr){return Qr.trim().split(/\s+/)}function le(Qr,Gr){for(var Wr in Gr)Gr.hasOwnProperty(Wr)&&(Qr[Wr]=Gr[Wr]);return Qr}function E(Qr){try{return JSON.parse(Qr)}catch(Gr){return b(Gr),null}}function U(){var Qr="htmx:localStorageTest";try{return localStorage.setItem(Qr,Qr),localStorage.removeItem(Qr),!0}catch{return!1}}function B(Qr){try{var Gr=new URL(Qr);return Gr&&(Qr=Gr.pathname+Gr.search),/^\/$/.test(Qr)||(Qr=Qr.replace(/\/+$/,"")),Qr}catch{return Qr}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(Qr){var Gr=Q.on("htmx:load",function(Wr){Qr(Wr.detail.elt)});return Gr}function V(){Q.logger=function(Qr,Gr,Wr){console&&console.log(Gr,Qr,Wr)}}function j(){Q.logger=null}function C(Qr,Gr){return Gr?Qr.querySelector(Gr):C(re(),Qr)}function f(Qr,Gr){return Gr?Qr.querySelectorAll(Gr):f(re(),Qr)}function _(Qr,Gr){Qr=p(Qr),Gr?setTimeout(function(){_(Qr),Qr=null},Gr):Qr.parentElement.removeChild(Qr)}function z(Qr,Gr,Wr){Qr=p(Qr),Wr?setTimeout(function(){z(Qr,Gr),Qr=null},Wr):Qr.classList&&Qr.classList.add(Gr)}function n(Qr,Gr,Wr){Qr=p(Qr),Wr?setTimeout(function(){n(Qr,Gr),Qr=null},Wr):Qr.classList&&(Qr.classList.remove(Gr),Qr.classList.length===0&&Qr.removeAttribute("class"))}function $(Qr,Gr){Qr=p(Qr),Qr.classList.toggle(Gr)}function W(Qr,Gr){Qr=p(Qr),oe(Qr.parentElement.children,function(Wr){n(Wr,Gr)}),z(Qr,Gr)}function v(Qr,Gr){if(Qr=p(Qr),Qr.closest)return Qr.closest(Gr);do if(Qr==null||h(Qr,Gr))return Qr;while(Qr=Qr&&u(Qr));return null}function g(Qr,Gr){return Qr.substring(0,Gr.length)===Gr}function G(Qr,Gr){return Qr.substring(Qr.length-Gr.length)===Gr}function J(Qr){var Gr=Qr.trim();return g(Gr,"<")&&G(Gr,"/>")?Gr.substring(1,Gr.length-2):Gr}function Z(Qr,Gr){return Gr.indexOf("closest ")===0?[v(Qr,J(Gr.substr(8)))]:Gr.indexOf("find ")===0?[C(Qr,J(Gr.substr(5)))]:Gr==="next"?[Qr.nextElementSibling]:Gr.indexOf("next ")===0?[K(Qr,J(Gr.substr(5)))]:Gr==="previous"?[Qr.previousElementSibling]:Gr.indexOf("previous ")===0?[Y(Qr,J(Gr.substr(9)))]:Gr==="document"?[document]:Gr==="window"?[window]:Gr==="body"?[document.body]:re().querySelectorAll(J(Gr))}var K=function(Qr,Gr){for(var Wr=re().querySelectorAll(Gr),Kr=0;Kr<Wr.length;Kr++){var Yr=Wr[Kr];if(Yr.compareDocumentPosition(Qr)===Node.DOCUMENT_POSITION_PRECEDING)return Yr}},Y=function(Qr,Gr){for(var Wr=re().querySelectorAll(Gr),Kr=Wr.length-1;Kr>=0;Kr--){var Yr=Wr[Kr];if(Yr.compareDocumentPosition(Qr)===Node.DOCUMENT_POSITION_FOLLOWING)return Yr}};function ue(Qr,Gr){return Gr?Z(Qr,Gr)[0]:Z(re().body,Qr)[0]}function p(Qr){return I(Qr,"String")?C(Qr):Qr}function ve(Qr,Gr,Wr){return k(Gr)?{target:re().body,event:Qr,listener:Gr}:{target:p(Qr),event:Gr,listener:Wr}}function de(Qr,Gr,Wr){jr(function(){var Yr=ve(Qr,Gr,Wr);Yr.target.addEventListener(Yr.event,Yr.listener)});var Kr=k(Gr);return Kr?Gr:Wr}function ge(Qr,Gr,Wr){return jr(function(){var Kr=ve(Qr,Gr,Wr);Kr.target.removeEventListener(Kr.event,Kr.listener)}),k(Gr)?Gr:Wr}var pe=re().createElement("output");function me(Qr,Gr){var Wr=ne(Qr,Gr);if(Wr){if(Wr==="this")return[xe(Qr,Gr)];var Kr=Z(Qr,Wr);return Kr.length===0?(b('The selector "'+Wr+'" on '+Gr+" returned no matches!"),[pe]):Kr}}function xe(Qr,Gr){return c(Qr,function(Wr){return te(Wr,Gr)!=null})}function ye(Qr){var Gr=ne(Qr,"hx-target");if(Gr)return Gr==="this"?xe(Qr,"hx-target"):ue(Qr,Gr);var Wr=ae(Qr);return Wr.boosted?re().body:Qr}function be(Qr){for(var Gr=Q.config.attributesToSettle,Wr=0;Wr<Gr.length;Wr++)if(Qr===Gr[Wr])return!0;return!1}function we(Qr,Gr){oe(Qr.attributes,function(Wr){!Gr.hasAttribute(Wr.name)&&be(Wr.name)&&Qr.removeAttribute(Wr.name)}),oe(Gr.attributes,function(Wr){be(Wr.name)&&Qr.setAttribute(Wr.name,Wr.value)})}function Se(Qr,Gr){for(var Wr=Fr(Gr),Kr=0;Kr<Wr.length;Kr++){var Yr=Wr[Kr];try{if(Yr.isInlineSwap(Qr))return!0}catch(Zr){b(Zr)}}return Qr==="outerHTML"}function Ee(Qr,Gr,Wr){var Kr="#"+ee(Gr,"id"),Yr="outerHTML";Qr==="true"||(Qr.indexOf(":")>0?(Yr=Qr.substr(0,Qr.indexOf(":")),Kr=Qr.substr(Qr.indexOf(":")+1,Qr.length)):Yr=Qr);var Zr=re().querySelectorAll(Kr);return Zr?(oe(Zr,function(tn){var ln,dn=Gr.cloneNode(!0);ln=re().createDocumentFragment(),ln.appendChild(dn),Se(Yr,tn)||(ln=dn);var yn={shouldSwap:!0,target:tn,fragment:ln};ce(tn,"htmx:oobBeforeSwap",yn)&&(tn=yn.target,yn.shouldSwap&&Fe(Yr,tn,tn,ln,Wr),oe(Wr.elts,function(wn){ce(wn,"htmx:oobAfterSwap",yn)}))}),Gr.parentNode.removeChild(Gr)):(Gr.parentNode.removeChild(Gr),fe(re().body,"htmx:oobErrorNoTarget",{content:Gr})),Qr}function Ce(Qr,Gr,Wr){var Kr=ne(Qr,"hx-select-oob");if(Kr)for(var Yr=Kr.split(","),Zr=0;Zr<Yr.length;Zr++){var tn=Yr[Zr].split(":",2),ln=tn[0].trim();ln.indexOf("#")===0&&(ln=ln.substring(1));var dn=tn[1]||"true",yn=Gr.querySelector("#"+ln);yn&&Ee(dn,yn,Wr)}oe(f(Gr,"[hx-swap-oob], [data-hx-swap-oob]"),function(wn){var kn=te(wn,"hx-swap-oob");kn!=null&&Ee(kn,wn,Wr)})}function Re(Qr){oe(f(Qr,"[hx-preserve], [data-hx-preserve]"),function(Gr){var Wr=te(Gr,"id"),Kr=re().getElementById(Wr);Kr!=null&&Gr.parentNode.replaceChild(Kr,Gr)})}function Te(Qr,Gr,Wr){oe(Gr.querySelectorAll("[id]"),function(Kr){var Yr=ee(Kr,"id");if(Yr&&Yr.length>0){var Zr=Yr.replace("'","\\'"),tn=Kr.tagName.replace(":","\\:"),ln=Qr.querySelector(tn+"[id='"+Zr+"']");if(ln&&ln!==Qr){var dn=Kr.cloneNode();we(Kr,ln),Wr.tasks.push(function(){we(Kr,dn)})}}})}function Oe(Qr){return function(){n(Qr,Q.config.addedClass),zt(Qr),Nt(Qr),qe(Qr),ce(Qr,"htmx:load")}}function qe(Qr){var Gr="[autofocus]",Wr=h(Qr,Gr)?Qr:Qr.querySelector(Gr);Wr?.focus()}function a(Qr,Gr,Wr,Kr){for(Te(Qr,Wr,Kr);Wr.childNodes.length>0;){var Yr=Wr.firstChild;z(Yr,Q.config.addedClass),Qr.insertBefore(Yr,Gr),Yr.nodeType!==Node.TEXT_NODE&&Yr.nodeType!==Node.COMMENT_NODE&&Kr.tasks.push(Oe(Yr))}}function He(Qr,Gr){for(var Wr=0;Wr<Qr.length;)Gr=(Gr<<5)-Gr+Qr.charCodeAt(Wr++)|0;return Gr}function Le(Qr){var Gr=0;if(Qr.attributes)for(var Wr=0;Wr<Qr.attributes.length;Wr++){var Kr=Qr.attributes[Wr];Kr.value&&(Gr=He(Kr.name,Gr),Gr=He(Kr.value,Gr))}return Gr}function Ae(Qr){var Gr=ae(Qr);if(Gr.onHandlers){for(var Wr=0;Wr<Gr.onHandlers.length;Wr++){let Kr=Gr.onHandlers[Wr];Qr.removeEventListener(Kr.event,Kr.listener)}delete Gr.onHandlers}}function Ne(Qr){var Gr=ae(Qr);Gr.timeout&&clearTimeout(Gr.timeout),Gr.webSocket&&Gr.webSocket.close(),Gr.sseEventSource&&Gr.sseEventSource.close(),Gr.listenerInfos&&oe(Gr.listenerInfos,function(Wr){Wr.on&&Wr.on.removeEventListener(Wr.trigger,Wr.listener)}),Ae(Qr),oe(Object.keys(Gr),function(Wr){delete Gr[Wr]})}function m(Qr){ce(Qr,"htmx:beforeCleanupElement"),Ne(Qr),Qr.children&&oe(Qr.children,function(Gr){m(Gr)})}function Ie(Qr,Gr,Wr){if(Qr.tagName==="BODY")return Ue(Qr,Gr,Wr);var Kr,Yr=Qr.previousSibling;for(a(u(Qr),Qr,Gr,Wr),Yr==null?Kr=u(Qr).firstChild:Kr=Yr.nextSibling,Wr.elts=Wr.elts.filter(function(Zr){return Zr!=Qr});Kr&&Kr!==Qr;)Kr.nodeType===Node.ELEMENT_NODE&&Wr.elts.push(Kr),Kr=Kr.nextElementSibling;m(Qr),u(Qr).removeChild(Qr)}function ke(Qr,Gr,Wr){return a(Qr,Qr.firstChild,Gr,Wr)}function Pe(Qr,Gr,Wr){return a(u(Qr),Qr,Gr,Wr)}function Me(Qr,Gr,Wr){return a(Qr,null,Gr,Wr)}function Xe(Qr,Gr,Wr){return a(u(Qr),Qr.nextSibling,Gr,Wr)}function De(Qr,Gr,Wr){return m(Qr),u(Qr).removeChild(Qr)}function Ue(Qr,Gr,Wr){var Kr=Qr.firstChild;if(a(Qr,Kr,Gr,Wr),Kr){for(;Kr.nextSibling;)m(Kr.nextSibling),Qr.removeChild(Kr.nextSibling);m(Kr),Qr.removeChild(Kr)}}function Be(Qr,Gr,Wr){var Kr=Wr||ne(Qr,"hx-select");if(Kr){var Yr=re().createDocumentFragment();oe(Gr.querySelectorAll(Kr),function(Zr){Yr.appendChild(Zr)}),Gr=Yr}return Gr}function Fe(Qr,Gr,Wr,Kr,Yr){switch(Qr){case"none":return;case"outerHTML":Ie(Wr,Kr,Yr);return;case"afterbegin":ke(Wr,Kr,Yr);return;case"beforebegin":Pe(Wr,Kr,Yr);return;case"beforeend":Me(Wr,Kr,Yr);return;case"afterend":Xe(Wr,Kr,Yr);return;case"delete":De(Wr,Kr,Yr);return;default:for(var Zr=Fr(Gr),tn=0;tn<Zr.length;tn++){var ln=Zr[tn];try{var dn=ln.handleSwap(Qr,Wr,Kr,Yr);if(dn){if(typeof dn.length<"u")for(var yn=0;yn<dn.length;yn++){var wn=dn[yn];wn.nodeType!==Node.TEXT_NODE&&wn.nodeType!==Node.COMMENT_NODE&&Yr.tasks.push(Oe(wn))}return}}catch(kn){b(kn)}}Qr==="innerHTML"?Ue(Wr,Kr,Yr):Fe(Q.config.defaultSwapStyle,Gr,Wr,Kr,Yr)}}function Ve(Qr){if(Qr.indexOf("<title")>-1){var Gr=Qr.replace(H,""),Wr=Gr.match(q);if(Wr)return Wr[2]}}function je(Qr,Gr,Wr,Kr,Yr,Zr){Yr.title=Ve(Kr);var tn=l(Kr);if(tn)return Ce(Wr,tn,Yr),tn=Be(Wr,tn,Zr),Re(tn),Fe(Qr,Wr,Gr,tn,Yr)}function _e(Qr,Gr,Wr){var Kr=Qr.getResponseHeader(Gr);if(Kr.indexOf("{")===0){var Yr=E(Kr);for(var Zr in Yr)if(Yr.hasOwnProperty(Zr)){var tn=Yr[Zr];P(tn)||(tn={value:tn}),ce(Wr,Zr,tn)}}else for(var ln=Kr.split(","),dn=0;dn<ln.length;dn++)ce(Wr,ln[dn].trim(),[])}var ze=/\s/,x=/[\s,]/,$e=/[_$a-zA-Z]/,We=/[_$a-zA-Z0-9]/,Ge=['"',"'","/"],Je=/[^\s]/,Ze=/[{(]/,Ke=/[})]/;function Ye(Qr){for(var Gr=[],Wr=0;Wr<Qr.length;){if($e.exec(Qr.charAt(Wr))){for(var Kr=Wr;We.exec(Qr.charAt(Wr+1));)Wr++;Gr.push(Qr.substr(Kr,Wr-Kr+1))}else if(Ge.indexOf(Qr.charAt(Wr))!==-1){var Yr=Qr.charAt(Wr),Kr=Wr;for(Wr++;Wr<Qr.length&&Qr.charAt(Wr)!==Yr;)Qr.charAt(Wr)==="\\"&&Wr++,Wr++;Gr.push(Qr.substr(Kr,Wr-Kr+1))}else{var Zr=Qr.charAt(Wr);Gr.push(Zr)}Wr++}return Gr}function Qe(Qr,Gr,Wr){return $e.exec(Qr.charAt(0))&&Qr!=="true"&&Qr!=="false"&&Qr!=="this"&&Qr!==Wr&&Gr!=="."}function et(Qr,Gr,Wr){if(Gr[0]==="["){Gr.shift();for(var Kr=1,Yr=" return (function("+Wr+"){ return (",Zr=null;Gr.length>0;){var tn=Gr[0];if(tn==="]"){if(Kr--,Kr===0){Zr===null&&(Yr=Yr+"true"),Gr.shift(),Yr+=")})";try{var ln=Tr(Qr,function(){return Function(Yr)()},function(){return!0});return ln.source=Yr,ln}catch(dn){return fe(re().body,"htmx:syntax:error",{error:dn,source:Yr}),null}}}else tn==="["&&Kr++;Qe(tn,Zr,Wr)?Yr+="(("+Wr+"."+tn+") ? ("+Wr+"."+tn+") : (window."+tn+"))":Yr=Yr+tn,Zr=Gr.shift()}}}function y(Qr,Gr){for(var Wr="";Qr.length>0&&!Gr.test(Qr[0]);)Wr+=Qr.shift();return Wr}function tt(Qr){var Gr;return Qr.length>0&&Ze.test(Qr[0])?(Qr.shift(),Gr=y(Qr,Ke).trim(),Qr.shift()):Gr=y(Qr,x),Gr}var rt="input, textarea, select";function nt(Qr,Gr,Wr){var Kr=[],Yr=Ye(Gr);do{y(Yr,Je);var Zr=Yr.length,tn=y(Yr,/[,\[\s]/);if(tn!=="")if(tn==="every"){var ln={trigger:"every"};y(Yr,Je),ln.pollInterval=d(y(Yr,/[,\[\s]/)),y(Yr,Je);var dn=et(Qr,Yr,"event");dn&&(ln.eventFilter=dn),Kr.push(ln)}else if(tn.indexOf("sse:")===0)Kr.push({trigger:"sse",sseEvent:tn.substr(4)});else{var yn={trigger:tn},dn=et(Qr,Yr,"event");for(dn&&(yn.eventFilter=dn);Yr.length>0&&Yr[0]!==",";){y(Yr,Je);var wn=Yr.shift();if(wn==="changed")yn.changed=!0;else if(wn==="once")yn.once=!0;else if(wn==="consume")yn.consume=!0;else if(wn==="delay"&&Yr[0]===":")Yr.shift(),yn.delay=d(y(Yr,x));else if(wn==="from"&&Yr[0]===":"){if(Yr.shift(),Ze.test(Yr[0]))var kn=tt(Yr);else{var kn=y(Yr,x);if(kn==="closest"||kn==="find"||kn==="next"||kn==="previous"){Yr.shift();var An=tt(Yr);An.length>0&&(kn+=" "+An)}}yn.from=kn}else wn==="target"&&Yr[0]===":"?(Yr.shift(),yn.target=tt(Yr)):wn==="throttle"&&Yr[0]===":"?(Yr.shift(),yn.throttle=d(y(Yr,x))):wn==="queue"&&Yr[0]===":"?(Yr.shift(),yn.queue=y(Yr,x)):wn==="root"&&Yr[0]===":"?(Yr.shift(),yn[wn]=tt(Yr)):wn==="threshold"&&Yr[0]===":"?(Yr.shift(),yn[wn]=y(Yr,x)):fe(Qr,"htmx:syntax:error",{token:Yr.shift()})}Kr.push(yn)}Yr.length===Zr&&fe(Qr,"htmx:syntax:error",{token:Yr.shift()}),y(Yr,Je)}while(Yr[0]===","&&Yr.shift());return Wr&&(Wr[Gr]=Kr),Kr}function it(Qr){var Gr=te(Qr,"hx-trigger"),Wr=[];if(Gr){var Kr=Q.config.triggerSpecsCache;Wr=Kr&&Kr[Gr]||nt(Qr,Gr,Kr)}return Wr.length>0?Wr:h(Qr,"form")?[{trigger:"submit"}]:h(Qr,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:h(Qr,rt)?[{trigger:"change"}]:[{trigger:"click"}]}function at(Qr){ae(Qr).cancelled=!0}function ot(Qr,Gr,Wr){var Kr=ae(Qr);Kr.timeout=setTimeout(function(){se(Qr)&&Kr.cancelled!==!0&&(ct(Wr,Qr,Wt("hx:poll:trigger",{triggerSpec:Wr,target:Qr}))||Gr(Qr),ot(Qr,Gr,Wr))},Wr.pollInterval)}function st(Qr){return location.hostname===Qr.hostname&&ee(Qr,"href")&&ee(Qr,"href").indexOf("#")!==0}function lt(Qr,Gr,Wr){if(Qr.tagName==="A"&&st(Qr)&&(Qr.target===""||Qr.target==="_self")||Qr.tagName==="FORM"){Gr.boosted=!0;var Kr,Yr;if(Qr.tagName==="A")Kr="get",Yr=ee(Qr,"href");else{var Zr=ee(Qr,"method");Kr=Zr?Zr.toLowerCase():"get",Yr=ee(Qr,"action")}Wr.forEach(function(tn){ht(Qr,function(ln,dn){if(v(ln,Q.config.disableSelector)){m(ln);return}he(Kr,Yr,ln,dn)},Gr,tn,!0)})}}function ut(Qr,Gr){return!!((Qr.type==="submit"||Qr.type==="click")&&(Gr.tagName==="FORM"||h(Gr,'input[type="submit"], button')&&v(Gr,"form")!==null||Gr.tagName==="A"&&Gr.href&&(Gr.getAttribute("href")==="#"||Gr.getAttribute("href").indexOf("#")!==0)))}function ft(Qr,Gr){return ae(Qr).boosted&&Qr.tagName==="A"&&Gr.type==="click"&&(Gr.ctrlKey||Gr.metaKey)}function ct(Qr,Gr,Wr){var Kr=Qr.eventFilter;if(Kr)try{return Kr.call(Gr,Wr)!==!0}catch(Yr){return fe(re().body,"htmx:eventFilter:error",{error:Yr,source:Kr.source}),!0}return!1}function ht(Qr,Gr,Wr,Kr,Yr){var Zr=ae(Qr),tn;Kr.from?tn=Z(Qr,Kr.from):tn=[Qr],Kr.changed&&tn.forEach(function(ln){var dn=ae(ln);dn.lastValue=ln.value}),oe(tn,function(ln){var dn=function(yn){if(!se(Qr)){ln.removeEventListener(Kr.trigger,dn);return}if(!ft(Qr,yn)&&((Yr||ut(yn,Qr))&&yn.preventDefault(),!ct(Kr,Qr,yn))){var wn=ae(yn);if(wn.triggerSpec=Kr,wn.handledFor==null&&(wn.handledFor=[]),wn.handledFor.indexOf(Qr)<0){if(wn.handledFor.push(Qr),Kr.consume&&yn.stopPropagation(),Kr.target&&yn.target&&!h(yn.target,Kr.target))return;if(Kr.once){if(Zr.triggeredOnce)return;Zr.triggeredOnce=!0}if(Kr.changed){var kn=ae(ln);if(kn.lastValue===ln.value)return;kn.lastValue=ln.value}if(Zr.delayed&&clearTimeout(Zr.delayed),Zr.throttle)return;Kr.throttle>0?Zr.throttle||(Gr(Qr,yn),Zr.throttle=setTimeout(function(){Zr.throttle=null},Kr.throttle)):Kr.delay>0?Zr.delayed=setTimeout(function(){Gr(Qr,yn)},Kr.delay):(ce(Qr,"htmx:trigger"),Gr(Qr,yn))}}};Wr.listenerInfos==null&&(Wr.listenerInfos=[]),Wr.listenerInfos.push({trigger:Kr.trigger,listener:dn,on:ln}),ln.addEventListener(Kr.trigger,dn)})}var vt=!1,dt=null;function gt(){dt||(dt=function(){vt=!0},window.addEventListener("scroll",dt),setInterval(function(){vt&&(vt=!1,oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(Qr){pt(Qr)}))},200))}function pt(Qr){if(!o(Qr,"data-hx-revealed")&&X(Qr)){Qr.setAttribute("data-hx-revealed","true");var Gr=ae(Qr);Gr.initHash?ce(Qr,"revealed"):Qr.addEventListener("htmx:afterProcessNode",function(Wr){ce(Qr,"revealed")},{once:!0})}}function mt(Qr,Gr,Wr){for(var Kr=D(Wr),Yr=0;Yr<Kr.length;Yr++){var Zr=Kr[Yr].split(/:(.+)/);Zr[0]==="connect"&&xt(Qr,Zr[1],0),Zr[0]==="send"&&bt(Qr)}}function xt(Qr,Gr,Wr){if(se(Qr)){if(Gr.indexOf("/")==0){var Kr=location.hostname+(location.port?":"+location.port:"");location.protocol=="https:"?Gr="wss://"+Kr+Gr:location.protocol=="http:"&&(Gr="ws://"+Kr+Gr)}var Yr=Q.createWebSocket(Gr);Yr.onerror=function(Zr){fe(Qr,"htmx:wsError",{error:Zr,socket:Yr}),yt(Qr)},Yr.onclose=function(Zr){if([1006,1012,1013].indexOf(Zr.code)>=0){var tn=wt(Wr);setTimeout(function(){xt(Qr,Gr,Wr+1)},tn)}},Yr.onopen=function(Zr){Wr=0},ae(Qr).webSocket=Yr,Yr.addEventListener("message",function(Zr){if(!yt(Qr)){var tn=Zr.data;R(Qr,function(An){tn=An.transformResponse(tn,null,Qr)});for(var ln=T(Qr),dn=l(tn),yn=M(dn.children),wn=0;wn<yn.length;wn++){var kn=yn[wn];Ee(te(kn,"hx-swap-oob")||"true",kn,ln)}nr(ln.tasks)}})}}function yt(Qr){if(!se(Qr))return ae(Qr).webSocket.close(),!0}function bt(Qr){var Gr=c(Qr,function(Wr){return ae(Wr).webSocket!=null});Gr?Qr.addEventListener(it(Qr)[0].trigger,function(Wr){var Kr=ae(Gr).webSocket,Yr=xr(Qr,Gr),Zr=dr(Qr,"post"),tn=Zr.errors,ln=Zr.values,dn=Hr(Qr),yn=le(ln,dn),wn=yr(yn,Qr);if(wn.HEADERS=Yr,tn&&tn.length>0){ce(Qr,"htmx:validation:halted",tn);return}Kr.send(JSON.stringify(wn)),ut(Wr,Qr)&&Wr.preventDefault()}):fe(Qr,"htmx:noWebSocketSourceError")}function wt(Qr){var Gr=Q.config.wsReconnectDelay;if(typeof Gr=="function")return Gr(Qr);if(Gr==="full-jitter"){var Wr=Math.min(Qr,6),Kr=1e3*Math.pow(2,Wr);return Kr*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(Qr,Gr,Wr){for(var Kr=D(Wr),Yr=0;Yr<Kr.length;Yr++){var Zr=Kr[Yr].split(/:(.+)/);Zr[0]==="connect"&&Et(Qr,Zr[1]),Zr[0]==="swap"&&Ct(Qr,Zr[1])}}function Et(Qr,Gr){var Wr=Q.createEventSource(Gr);Wr.onerror=function(Kr){fe(Qr,"htmx:sseError",{error:Kr,source:Wr}),Tt(Qr)},ae(Qr).sseEventSource=Wr}function Ct(Qr,Gr){var Wr=c(Qr,Ot);if(Wr){var Kr=ae(Wr).sseEventSource,Yr=function(Zr){if(!Tt(Wr)){if(!se(Qr)){Kr.removeEventListener(Gr,Yr);return}var tn=Zr.data;R(Qr,function(wn){tn=wn.transformResponse(tn,null,Qr)});var ln=wr(Qr),dn=ye(Qr),yn=T(Qr);je(ln.swapStyle,dn,Qr,tn,yn),nr(yn.tasks),ce(Qr,"htmx:sseMessage",Zr)}};ae(Qr).sseListener=Yr,Kr.addEventListener(Gr,Yr)}else fe(Qr,"htmx:noSSESourceError")}function Rt(Qr,Gr,Wr){var Kr=c(Qr,Ot);if(Kr){var Yr=ae(Kr).sseEventSource,Zr=function(){Tt(Kr)||(se(Qr)?Gr(Qr):Yr.removeEventListener(Wr,Zr))};ae(Qr).sseListener=Zr,Yr.addEventListener(Wr,Zr)}else fe(Qr,"htmx:noSSESourceError")}function Tt(Qr){if(!se(Qr))return ae(Qr).sseEventSource.close(),!0}function Ot(Qr){return ae(Qr).sseEventSource!=null}function qt(Qr,Gr,Wr,Kr){var Yr=function(){Wr.loaded||(Wr.loaded=!0,Gr(Qr))};Kr>0?setTimeout(Yr,Kr):Yr()}function Ht(Qr,Gr,Wr){var Kr=!1;return oe(w,function(Yr){if(o(Qr,"hx-"+Yr)){var Zr=te(Qr,"hx-"+Yr);Kr=!0,Gr.path=Zr,Gr.verb=Yr,Wr.forEach(function(tn){Lt(Qr,tn,Gr,function(ln,dn){if(v(ln,Q.config.disableSelector)){m(ln);return}he(Yr,Zr,ln,dn)})})}}),Kr}function Lt(Qr,Gr,Wr,Kr){if(Gr.sseEvent)Rt(Qr,Kr,Gr.sseEvent);else if(Gr.trigger==="revealed")gt(),ht(Qr,Kr,Wr,Gr),pt(Qr);else if(Gr.trigger==="intersect"){var Yr={};Gr.root&&(Yr.root=ue(Qr,Gr.root)),Gr.threshold&&(Yr.threshold=parseFloat(Gr.threshold));var Zr=new IntersectionObserver(function(tn){for(var ln=0;ln<tn.length;ln++){var dn=tn[ln];if(dn.isIntersecting){ce(Qr,"intersect");break}}},Yr);Zr.observe(Qr),ht(Qr,Kr,Wr,Gr)}else Gr.trigger==="load"?ct(Gr,Qr,Wt("load",{elt:Qr}))||qt(Qr,Kr,Wr,Gr.delay):Gr.pollInterval>0?(Wr.polling=!0,ot(Qr,Kr,Gr)):ht(Qr,Kr,Wr,Gr)}function At(Qr){if(!Qr.htmxExecuted&&Q.config.allowScriptTags&&(Qr.type==="text/javascript"||Qr.type==="module"||Qr.type==="")){var Gr=re().createElement("script");oe(Qr.attributes,function(Kr){Gr.setAttribute(Kr.name,Kr.value)}),Gr.textContent=Qr.textContent,Gr.async=!1,Q.config.inlineScriptNonce&&(Gr.nonce=Q.config.inlineScriptNonce);var Wr=Qr.parentElement;try{Wr.insertBefore(Gr,Qr)}catch(Kr){b(Kr)}finally{Qr.parentElement&&Qr.parentElement.removeChild(Qr)}}}function Nt(Qr){h(Qr,"script")&&At(Qr),oe(f(Qr,"script"),function(Gr){At(Gr)})}function It(Qr){var Gr=Qr.attributes;if(!Gr)return!1;for(var Wr=0;Wr<Gr.length;Wr++){var Kr=Gr[Wr].name;if(g(Kr,"hx-on:")||g(Kr,"data-hx-on:")||g(Kr,"hx-on-")||g(Kr,"data-hx-on-"))return!0}return!1}function kt(Qr){var Gr=null,Wr=[];if(It(Qr)&&Wr.push(Qr),document.evaluate)for(var Kr=document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]',Qr);Gr=Kr.iterateNext();)Wr.push(Gr);else if(typeof Qr.getElementsByTagName=="function")for(var Yr=Qr.getElementsByTagName("*"),Zr=0;Zr<Yr.length;Zr++)It(Yr[Zr])&&Wr.push(Yr[Zr]);return Wr}function Pt(Qr){if(Qr.querySelectorAll){var Gr=", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]",Wr=Qr.querySelectorAll(i+Gr+", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws], [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");return Wr}else return[]}function Mt(Qr){var Gr=v(Qr.target,"button, input[type='submit']"),Wr=Dt(Qr);Wr&&(Wr.lastButtonClicked=Gr)}function Xt(Qr){var Gr=Dt(Qr);Gr&&(Gr.lastButtonClicked=null)}function Dt(Qr){var Gr=v(Qr.target,"button, input[type='submit']");if(Gr){var Wr=p("#"+ee(Gr,"form"))||v(Gr,"form");if(Wr)return ae(Wr)}}function Ut(Qr){Qr.addEventListener("click",Mt),Qr.addEventListener("focusin",Mt),Qr.addEventListener("focusout",Xt)}function Bt(Qr){for(var Gr=Ye(Qr),Wr=0,Kr=0;Kr<Gr.length;Kr++){let Yr=Gr[Kr];Yr==="{"?Wr++:Yr==="}"&&Wr--}return Wr}function Ft(Qr,Gr,Wr){var Kr=ae(Qr);Array.isArray(Kr.onHandlers)||(Kr.onHandlers=[]);var Yr,Zr=function(tn){return Tr(Qr,function(){Yr||(Yr=new Function("event",Wr)),Yr.call(Qr,tn)})};Qr.addEventListener(Gr,Zr),Kr.onHandlers.push({event:Gr,listener:Zr})}function Vt(Qr){var Gr=te(Qr,"hx-on");if(Gr){for(var Wr={},Kr=Gr.split(` 2 - `),Yr=null,Zr=0;Kr.length>0;){var tn=Kr.shift(),ln=tn.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);Zr===0&&ln?(tn.split(":"),Yr=ln[1].slice(0,-1),Wr[Yr]=ln[2]):Wr[Yr]+=tn,Zr+=Bt(tn)}for(var dn in Wr)Ft(Qr,dn,Wr[dn])}}function jt(Qr){Ae(Qr);for(var Gr=0;Gr<Qr.attributes.length;Gr++){var Wr=Qr.attributes[Gr].name,Kr=Qr.attributes[Gr].value;if(g(Wr,"hx-on")||g(Wr,"data-hx-on")){var Yr=Wr.indexOf("-on")+3,Zr=Wr.slice(Yr,Yr+1);if(Zr==="-"||Zr===":"){var tn=Wr.slice(Yr+1);g(tn,":")?tn="htmx"+tn:g(tn,"-")?tn="htmx:"+tn.slice(1):g(tn,"htmx-")&&(tn="htmx:"+tn.slice(5)),Ft(Qr,tn,Kr)}}}}function _t(Qr){if(v(Qr,Q.config.disableSelector)){m(Qr);return}var Gr=ae(Qr);if(Gr.initHash!==Le(Qr)){Ne(Qr),Gr.initHash=Le(Qr),Vt(Qr),ce(Qr,"htmx:beforeProcessNode"),Qr.value&&(Gr.lastValue=Qr.value);var Wr=it(Qr),Kr=Ht(Qr,Gr,Wr);Kr||(ne(Qr,"hx-boost")==="true"?lt(Qr,Gr,Wr):o(Qr,"hx-trigger")&&Wr.forEach(function(tn){Lt(Qr,tn,Gr,function(){})})),(Qr.tagName==="FORM"||ee(Qr,"type")==="submit"&&o(Qr,"form"))&&Ut(Qr);var Yr=te(Qr,"hx-sse");Yr&&St(Qr,Gr,Yr);var Zr=te(Qr,"hx-ws");Zr&&mt(Qr,Gr,Zr),ce(Qr,"htmx:afterProcessNode")}}function zt(Qr){if(Qr=p(Qr),v(Qr,Q.config.disableSelector)){m(Qr);return}_t(Qr),oe(Pt(Qr),function(Gr){_t(Gr)}),oe(kt(Qr),jt)}function $t(Qr){return Qr.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Wt(Qr,Gr){var Wr;return window.CustomEvent&&typeof window.CustomEvent=="function"?Wr=new CustomEvent(Qr,{bubbles:!0,cancelable:!0,detail:Gr}):(Wr=re().createEvent("CustomEvent"),Wr.initCustomEvent(Qr,!0,!0,Gr)),Wr}function fe(Qr,Gr,Wr){ce(Qr,Gr,le({error:Gr},Wr))}function Gt(Qr){return Qr==="htmx:afterProcessNode"}function R(Qr,Gr){oe(Fr(Qr),function(Wr){try{Gr(Wr)}catch(Kr){b(Kr)}})}function b(Qr){console.error?console.error(Qr):console.log&&console.log("ERROR: ",Qr)}function ce(Qr,Gr,Wr){Qr=p(Qr),Wr==null&&(Wr={}),Wr.elt=Qr;var Kr=Wt(Gr,Wr);Q.logger&&!Gt(Gr)&&Q.logger(Qr,Gr,Wr),Wr.error&&(b(Wr.error),ce(Qr,"htmx:error",{errorInfo:Wr}));var Yr=Qr.dispatchEvent(Kr),Zr=$t(Gr);if(Yr&&Zr!==Gr){var tn=Wt(Zr,Kr.detail);Yr=Yr&&Qr.dispatchEvent(tn)}return R(Qr,function(ln){Yr=Yr&&ln.onEvent(Gr,Kr)!==!1&&!Kr.defaultPrevented}),Yr}var Jt=location.pathname+location.search;function Zt(){var Qr=re().querySelector("[hx-history-elt],[data-hx-history-elt]");return Qr||re().body}function Kt(Qr,Gr,Wr,Kr){if(U()){if(Q.config.historyCacheSize<=0){localStorage.removeItem("htmx-history-cache");return}Qr=B(Qr);for(var Yr=E(localStorage.getItem("htmx-history-cache"))||[],Zr=0;Zr<Yr.length;Zr++)if(Yr[Zr].url===Qr){Yr.splice(Zr,1);break}var tn={url:Qr,content:Gr,title:Wr,scroll:Kr};for(ce(re().body,"htmx:historyItemCreated",{item:tn,cache:Yr}),Yr.push(tn);Yr.length>Q.config.historyCacheSize;)Yr.shift();for(;Yr.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(Yr));break}catch(ln){fe(re().body,"htmx:historyCacheError",{cause:ln,cache:Yr}),Yr.shift()}}}function Yt(Qr){if(!U())return null;Qr=B(Qr);for(var Gr=E(localStorage.getItem("htmx-history-cache"))||[],Wr=0;Wr<Gr.length;Wr++)if(Gr[Wr].url===Qr)return Gr[Wr];return null}function Qt(Qr){var Gr=Q.config.requestClass,Wr=Qr.cloneNode(!0);return oe(f(Wr,"."+Gr),function(Kr){n(Kr,Gr)}),Wr.innerHTML}function er(){var Qr=Zt(),Gr=Jt||location.pathname+location.search,Wr;try{Wr=re().querySelector('[hx-history="false" i],[data-hx-history="false" i]')}catch{Wr=re().querySelector('[hx-history="false"],[data-hx-history="false"]')}Wr||(ce(re().body,"htmx:beforeHistorySave",{path:Gr,historyElt:Qr}),Kt(Gr,Qt(Qr),re().title,window.scrollY)),Q.config.historyEnabled&&history.replaceState({htmx:!0},re().title,window.location.href)}function tr(Qr){Q.config.getCacheBusterParam&&(Qr=Qr.replace(/org\.htmx\.cache-buster=[^&]*&?/,""),(G(Qr,"&")||G(Qr,"?"))&&(Qr=Qr.slice(0,-1))),Q.config.historyEnabled&&history.pushState({htmx:!0},"",Qr),Jt=Qr}function rr(Qr){Q.config.historyEnabled&&history.replaceState({htmx:!0},"",Qr),Jt=Qr}function nr(Qr){oe(Qr,function(Gr){Gr.call()})}function ir(Qr){var Gr=new XMLHttpRequest,Wr={path:Qr,xhr:Gr};ce(re().body,"htmx:historyCacheMiss",Wr),Gr.open("GET",Qr,!0),Gr.setRequestHeader("HX-Request","true"),Gr.setRequestHeader("HX-History-Restore-Request","true"),Gr.setRequestHeader("HX-Current-URL",re().location.href),Gr.onload=function(){if(this.status>=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",Wr);var Kr=l(this.response);Kr=Kr.querySelector("[hx-history-elt],[data-hx-history-elt]")||Kr;var Yr=Zt(),Zr=T(Yr),tn=Ve(this.response);if(tn){var ln=C("title");ln?ln.innerHTML=tn:window.document.title=tn}Ue(Yr,Kr,Zr),nr(Zr.tasks),Jt=Qr,ce(re().body,"htmx:historyRestore",{path:Qr,cacheMiss:!0,serverResponse:this.response})}else fe(re().body,"htmx:historyCacheMissLoadError",Wr)},Gr.send()}function ar(Qr){er(),Qr=Qr||location.pathname+location.search;var Gr=Yt(Qr);if(Gr){var Wr=l(Gr.content),Kr=Zt(),Yr=T(Kr);Ue(Kr,Wr,Yr),nr(Yr.tasks),document.title=Gr.title,setTimeout(function(){window.scrollTo(0,Gr.scroll)},0),Jt=Qr,ce(re().body,"htmx:historyRestore",{path:Qr,item:Gr})}else Q.config.refreshOnHistoryMiss?window.location.reload(!0):ir(Qr)}function or(Qr){var Gr=me(Qr,"hx-indicator");return Gr==null&&(Gr=[Qr]),oe(Gr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)+1,Wr.classList.add.call(Wr.classList,Q.config.requestClass)}),Gr}function sr(Qr){var Gr=me(Qr,"hx-disabled-elt");return Gr==null&&(Gr=[]),oe(Gr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)+1,Wr.setAttribute("disabled","")}),Gr}function lr(Qr,Gr){oe(Qr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)-1,Kr.requestCount===0&&Wr.classList.remove.call(Wr.classList,Q.config.requestClass)}),oe(Gr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)-1,Kr.requestCount===0&&Wr.removeAttribute("disabled")})}function ur(Qr,Gr){for(var Wr=0;Wr<Qr.length;Wr++){var Kr=Qr[Wr];if(Kr.isSameNode(Gr))return!0}return!1}function fr(Qr){return Qr.name===""||Qr.name==null||Qr.disabled||v(Qr,"fieldset[disabled]")||Qr.type==="button"||Qr.type==="submit"||Qr.tagName==="image"||Qr.tagName==="reset"||Qr.tagName==="file"?!1:Qr.type==="checkbox"||Qr.type==="radio"?Qr.checked:!0}function cr(Qr,Gr,Wr){if(Qr!=null&&Gr!=null){var Kr=Wr[Qr];Kr===void 0?Wr[Qr]=Gr:Array.isArray(Kr)?Array.isArray(Gr)?Wr[Qr]=Kr.concat(Gr):Kr.push(Gr):Array.isArray(Gr)?Wr[Qr]=[Kr].concat(Gr):Wr[Qr]=[Kr,Gr]}}function hr(Qr,Gr,Wr,Kr,Yr){if(!(Kr==null||ur(Qr,Kr))){if(Qr.push(Kr),fr(Kr)){var Zr=ee(Kr,"name"),tn=Kr.value;Kr.multiple&&Kr.tagName==="SELECT"&&(tn=M(Kr.querySelectorAll("option:checked")).map(function(dn){return dn.value})),Kr.files&&(tn=M(Kr.files)),cr(Zr,tn,Gr),Yr&&vr(Kr,Wr)}if(h(Kr,"form")){var ln=Kr.elements;oe(ln,function(dn){hr(Qr,Gr,Wr,dn,Yr)})}}}function vr(Qr,Gr){Qr.willValidate&&(ce(Qr,"htmx:validation:validate"),Qr.checkValidity()||(Gr.push({elt:Qr,message:Qr.validationMessage,validity:Qr.validity}),ce(Qr,"htmx:validation:failed",{message:Qr.validationMessage,validity:Qr.validity})))}function dr(Qr,Gr){var Wr=[],Kr={},Yr={},Zr=[],tn=ae(Qr);tn.lastButtonClicked&&!se(tn.lastButtonClicked)&&(tn.lastButtonClicked=null);var ln=h(Qr,"form")&&Qr.noValidate!==!0||te(Qr,"hx-validate")==="true";if(tn.lastButtonClicked&&(ln=ln&&tn.lastButtonClicked.formNoValidate!==!0),Gr!=="get"&&hr(Wr,Yr,Zr,v(Qr,"form"),ln),hr(Wr,Kr,Zr,Qr,ln),tn.lastButtonClicked||Qr.tagName==="BUTTON"||Qr.tagName==="INPUT"&&ee(Qr,"type")==="submit"){var dn=tn.lastButtonClicked||Qr,yn=ee(dn,"name");cr(yn,dn.value,Yr)}var wn=me(Qr,"hx-include");return oe(wn,function(kn){hr(Wr,Kr,Zr,kn,ln),h(kn,"form")||oe(kn.querySelectorAll(rt),function(An){hr(Wr,Kr,Zr,An,ln)})}),Kr=le(Kr,Yr),{errors:Zr,values:Kr}}function gr(Qr,Gr,Wr){Qr!==""&&(Qr+="&"),String(Wr)==="[object Object]"&&(Wr=JSON.stringify(Wr));var Kr=encodeURIComponent(Wr);return Qr+=encodeURIComponent(Gr)+"="+Kr,Qr}function pr(Qr){var Gr="";for(var Wr in Qr)if(Qr.hasOwnProperty(Wr)){var Kr=Qr[Wr];Array.isArray(Kr)?oe(Kr,function(Yr){Gr=gr(Gr,Wr,Yr)}):Gr=gr(Gr,Wr,Kr)}return Gr}function mr(Qr){var Gr=new FormData;for(var Wr in Qr)if(Qr.hasOwnProperty(Wr)){var Kr=Qr[Wr];Array.isArray(Kr)?oe(Kr,function(Yr){Gr.append(Wr,Yr)}):Gr.append(Wr,Kr)}return Gr}function xr(Qr,Gr,Wr){var Kr={"HX-Request":"true","HX-Trigger":ee(Qr,"id"),"HX-Trigger-Name":ee(Qr,"name"),"HX-Target":te(Gr,"id"),"HX-Current-URL":re().location.href};return Rr(Qr,"hx-headers",!1,Kr),Wr!==void 0&&(Kr["HX-Prompt"]=Wr),ae(Qr).boosted&&(Kr["HX-Boosted"]="true"),Kr}function yr(Qr,Gr){var Wr=ne(Gr,"hx-params");if(Wr){if(Wr==="none")return{};if(Wr==="*")return Qr;if(Wr.indexOf("not ")===0)return oe(Wr.substr(4).split(","),function(Yr){Yr=Yr.trim(),delete Qr[Yr]}),Qr;var Kr={};return oe(Wr.split(","),function(Yr){Yr=Yr.trim(),Kr[Yr]=Qr[Yr]}),Kr}else return Qr}function br(Qr){return ee(Qr,"href")&&ee(Qr,"href").indexOf("#")>=0}function wr(Qr,Gr){var Wr=Gr||ne(Qr,"hx-swap"),Kr={swapStyle:ae(Qr).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(Qr).boosted&&!br(Qr)&&(Kr.show="top"),Wr){var Yr=D(Wr);if(Yr.length>0)for(var Zr=0;Zr<Yr.length;Zr++){var tn=Yr[Zr];if(tn.indexOf("swap:")===0)Kr.swapDelay=d(tn.substr(5));else if(tn.indexOf("settle:")===0)Kr.settleDelay=d(tn.substr(7));else if(tn.indexOf("transition:")===0)Kr.transition=tn.substr(11)==="true";else if(tn.indexOf("ignoreTitle:")===0)Kr.ignoreTitle=tn.substr(12)==="true";else if(tn.indexOf("scroll:")===0){var ln=tn.substr(7),dn=ln.split(":"),yn=dn.pop(),wn=dn.length>0?dn.join(":"):null;Kr.scroll=yn,Kr.scrollTarget=wn}else if(tn.indexOf("show:")===0){var kn=tn.substr(5),dn=kn.split(":"),An=dn.pop(),wn=dn.length>0?dn.join(":"):null;Kr.show=An,Kr.showTarget=wn}else if(tn.indexOf("focus-scroll:")===0){var Gn=tn.substr(13);Kr.focusScroll=Gn=="true"}else Zr==0?Kr.swapStyle=tn:b("Unknown modifier in hx-swap: "+tn)}}return Kr}function Sr(Qr){return ne(Qr,"hx-encoding")==="multipart/form-data"||h(Qr,"form")&&ee(Qr,"enctype")==="multipart/form-data"}function Er(Qr,Gr,Wr){var Kr=null;return R(Gr,function(Yr){Kr==null&&(Kr=Yr.encodeParameters(Qr,Wr,Gr))}),Kr??(Sr(Gr)?mr(Wr):pr(Wr))}function T(Qr){return{tasks:[],elts:[Qr]}}function Cr(Qr,Gr){var Wr=Qr[0],Kr=Qr[Qr.length-1];if(Gr.scroll){var Yr=null;Gr.scrollTarget&&(Yr=ue(Wr,Gr.scrollTarget)),Gr.scroll==="top"&&(Wr||Yr)&&(Yr=Yr||Wr,Yr.scrollTop=0),Gr.scroll==="bottom"&&(Kr||Yr)&&(Yr=Yr||Kr,Yr.scrollTop=Yr.scrollHeight)}if(Gr.show){var Yr=null;if(Gr.showTarget){var Zr=Gr.showTarget;Gr.showTarget==="window"&&(Zr="body"),Yr=ue(Wr,Zr)}Gr.show==="top"&&(Wr||Yr)&&(Yr=Yr||Wr,Yr.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})),Gr.show==="bottom"&&(Kr||Yr)&&(Yr=Yr||Kr,Yr.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior}))}}function Rr(Qr,Gr,Wr,Kr){if(Kr==null&&(Kr={}),Qr==null)return Kr;var Yr=te(Qr,Gr);if(Yr){var Zr=Yr.trim(),tn=Wr;if(Zr==="unset")return null;Zr.indexOf("javascript:")===0?(Zr=Zr.substr(11),tn=!0):Zr.indexOf("js:")===0&&(Zr=Zr.substr(3),tn=!0),Zr.indexOf("{")!==0&&(Zr="{"+Zr+"}");var ln;tn?ln=Tr(Qr,function(){return Function("return ("+Zr+")")()},{}):ln=E(Zr);for(var dn in ln)ln.hasOwnProperty(dn)&&Kr[dn]==null&&(Kr[dn]=ln[dn])}return Rr(u(Qr),Gr,Wr,Kr)}function Tr(Qr,Gr,Wr){return Q.config.allowEval?Gr():(fe(Qr,"htmx:evalDisallowedError"),Wr)}function Or(Qr,Gr){return Rr(Qr,"hx-vars",!0,Gr)}function qr(Qr,Gr){return Rr(Qr,"hx-vals",!1,Gr)}function Hr(Qr){return le(Or(Qr),qr(Qr))}function Lr(Qr,Gr,Wr){if(Wr!==null)try{Qr.setRequestHeader(Gr,Wr)}catch{Qr.setRequestHeader(Gr,encodeURIComponent(Wr)),Qr.setRequestHeader(Gr+"-URI-AutoEncoded","true")}}function Ar(Qr){if(Qr.responseURL&&typeof URL<"u")try{var Gr=new URL(Qr.responseURL);return Gr.pathname+Gr.search}catch{fe(re().body,"htmx:badResponseUrl",{url:Qr.responseURL})}}function O(Qr,Gr){return Gr.test(Qr.getAllResponseHeaders())}function Nr(Qr,Gr,Wr){return Qr=Qr.toLowerCase(),Wr?Wr instanceof Element||I(Wr,"String")?he(Qr,Gr,null,null,{targetOverride:p(Wr),returnPromise:!0}):he(Qr,Gr,p(Wr.source),Wr.event,{handler:Wr.handler,headers:Wr.headers,values:Wr.values,targetOverride:p(Wr.target),swapOverride:Wr.swap,select:Wr.select,returnPromise:!0}):he(Qr,Gr,null,null,{returnPromise:!0})}function Ir(Qr){for(var Gr=[];Qr;)Gr.push(Qr),Qr=Qr.parentElement;return Gr}function kr(Qr,Gr,Wr){var Kr,Yr;if(typeof URL=="function"){Yr=new URL(Gr,document.location.href);var Zr=document.location.origin;Kr=Zr===Yr.origin}else Yr=Gr,Kr=g(Gr,document.location.origin);return Q.config.selfRequestsOnly&&!Kr?!1:ce(Qr,"htmx:validateUrl",le({url:Yr,sameHost:Kr},Wr))}function he(Qr,Gr,Wr,Kr,Yr,Zr){var tn=null,ln=null;if(Yr=Yr??{},Yr.returnPromise&&typeof Promise<"u")var dn=new Promise(function(gn,En){tn=gn,ln=En});Wr==null&&(Wr=re().body);var yn=Yr.handler||Mr,wn=Yr.select||null;if(!se(Wr))return ie(tn),dn;var kn=Yr.targetOverride||ye(Wr);if(kn==null||kn==pe)return fe(Wr,"htmx:targetError",{target:te(Wr,"hx-target")}),ie(ln),dn;var An=ae(Wr),Gn=An.lastButtonClicked;if(Gn){var jn=ee(Gn,"formaction");jn!=null&&(Gr=jn);var Vn=ee(Gn,"formmethod");Vn!=null&&Vn.toLowerCase()!=="dialog"&&(Qr=Vn)}var ti=ne(Wr,"hx-confirm");if(Zr===void 0){var Ti=function(gn){return he(Qr,Gr,Wr,Kr,Yr,!!gn)},fi={target:kn,elt:Wr,path:Gr,verb:Qr,triggeringEvent:Kr,etc:Yr,issueRequest:Ti,question:ti};if(ce(Wr,"htmx:confirm",fi)===!1)return ie(tn),dn}var oi=Wr,Jn=ne(Wr,"hx-sync"),mi=null,ai=!1;if(Jn){var Ui=Jn.split(":"),gi=Ui[0].trim();if(gi==="this"?oi=xe(Wr,"hx-sync"):oi=ue(Wr,gi),Jn=(Ui[1]||"drop").trim(),An=ae(oi),Jn==="drop"&&An.xhr&&An.abortable!==!0)return ie(tn),dn;if(Jn==="abort"){if(An.xhr)return ie(tn),dn;ai=!0}else if(Jn==="replace")ce(oi,"htmx:abort");else if(Jn.indexOf("queue")===0){var ri=Jn.split(" ");mi=(ri[1]||"last").trim()}}if(An.xhr)if(An.abortable)ce(oi,"htmx:abort");else{if(mi==null){if(Kr){var xn=ae(Kr);xn&&xn.triggerSpec&&xn.triggerSpec.queue&&(mi=xn.triggerSpec.queue)}mi==null&&(mi="last")}return An.queuedRequests==null&&(An.queuedRequests=[]),mi==="first"&&An.queuedRequests.length===0?An.queuedRequests.push(function(){he(Qr,Gr,Wr,Kr,Yr)}):mi==="all"?An.queuedRequests.push(function(){he(Qr,Gr,Wr,Kr,Yr)}):mi==="last"&&(An.queuedRequests=[],An.queuedRequests.push(function(){he(Qr,Gr,Wr,Kr,Yr)})),ie(tn),dn}var en=new XMLHttpRequest;An.xhr=en,An.abortable=ai;var an=function(){if(An.xhr=null,An.abortable=!1,An.queuedRequests!=null&&An.queuedRequests.length>0){var gn=An.queuedRequests.shift();gn()}},pn=ne(Wr,"hx-prompt");if(pn){var mn=prompt(pn);if(mn===null||!ce(Wr,"htmx:prompt",{prompt:mn,target:kn}))return ie(tn),an(),dn}if(ti&&!Zr&&!confirm(ti))return ie(tn),an(),dn;var Sn=xr(Wr,kn,mn);Qr!=="get"&&!Sr(Wr)&&(Sn["Content-Type"]="application/x-www-form-urlencoded"),Yr.headers&&(Sn=le(Sn,Yr.headers));var vn=dr(Wr,Qr),bn=vn.errors,hn=vn.values;Yr.values&&(hn=le(hn,Yr.values));var On=Hr(Wr),Pn=le(hn,On),Nn=yr(Pn,Wr);Q.config.getCacheBusterParam&&Qr==="get"&&(Nn["org.htmx.cache-buster"]=ee(kn,"id")||"true"),(Gr==null||Gr==="")&&(Gr=re().location.href);var Dn=Rr(Wr,"hx-request"),Ln=ae(Wr).boosted,Fn=Q.config.methodsThatUseUrlParams.indexOf(Qr)>=0,Mn={boosted:Ln,useUrlParams:Fn,parameters:Nn,unfilteredParameters:Pn,headers:Sn,target:kn,verb:Qr,errors:bn,withCredentials:Yr.credentials||Dn.credentials||Q.config.withCredentials,timeout:Yr.timeout||Dn.timeout||Q.config.timeout,path:Gr,triggeringEvent:Kr};if(!ce(Wr,"htmx:configRequest",Mn))return ie(tn),an(),dn;if(Gr=Mn.path,Qr=Mn.verb,Sn=Mn.headers,Nn=Mn.parameters,bn=Mn.errors,Fn=Mn.useUrlParams,bn&&bn.length>0)return ce(Wr,"htmx:validation:halted",Mn),ie(tn),an(),dn;var Hn=Gr.split("#"),Wn=Hn[0],zn=Hn[1],nn=Gr;if(Fn){nn=Wn;var on=Object.keys(Nn).length!==0;on&&(nn.indexOf("?")<0?nn+="?":nn+="&",nn+=pr(Nn),zn&&(nn+="#"+zn))}if(!kr(Wr,nn,Mn))return fe(Wr,"htmx:invalidPath",Mn),ie(ln),dn;if(en.open(Qr.toUpperCase(),nn,!0),en.overrideMimeType("text/html"),en.withCredentials=Mn.withCredentials,en.timeout=Mn.timeout,!Dn.noHeaders){for(var Jr in Sn)if(Sn.hasOwnProperty(Jr)){var rn=Sn[Jr];Lr(en,Jr,rn)}}var cn={xhr:en,target:kn,requestConfig:Mn,etc:Yr,boosted:Ln,select:wn,pathInfo:{requestPath:Gr,finalRequestPath:nn,anchor:zn}};if(en.onload=function(){try{var gn=Ir(Wr);if(cn.pathInfo.responsePath=Ar(en),yn(Wr,cn),lr(sn,fn),ce(Wr,"htmx:afterRequest",cn),ce(Wr,"htmx:afterOnLoad",cn),!se(Wr)){for(var En=null;gn.length>0&&En==null;){var Tn=gn.shift();se(Tn)&&(En=Tn)}En&&(ce(En,"htmx:afterRequest",cn),ce(En,"htmx:afterOnLoad",cn))}ie(tn),an()}catch(Rn){throw fe(Wr,"htmx:onLoadError",le({error:Rn},cn)),Rn}},en.onerror=function(){lr(sn,fn),fe(Wr,"htmx:afterRequest",cn),fe(Wr,"htmx:sendError",cn),ie(ln),an()},en.onabort=function(){lr(sn,fn),fe(Wr,"htmx:afterRequest",cn),fe(Wr,"htmx:sendAbort",cn),ie(ln),an()},en.ontimeout=function(){lr(sn,fn),fe(Wr,"htmx:afterRequest",cn),fe(Wr,"htmx:timeout",cn),ie(ln),an()},!ce(Wr,"htmx:beforeRequest",cn))return ie(tn),an(),dn;var sn=or(Wr),fn=sr(Wr);oe(["loadstart","loadend","progress","abort"],function(gn){oe([en,en.upload],function(En){En.addEventListener(gn,function(Tn){ce(Wr,"htmx:xhr:"+gn,{lengthComputable:Tn.lengthComputable,loaded:Tn.loaded,total:Tn.total})})})}),ce(Wr,"htmx:beforeSend",cn);var un=Fn?null:Er(en,Wr,Nn);return en.send(un),dn}function Pr(Qr,Gr){var Wr=Gr.xhr,Kr=null,Yr=null;if(O(Wr,/HX-Push:/i)?(Kr=Wr.getResponseHeader("HX-Push"),Yr="push"):O(Wr,/HX-Push-Url:/i)?(Kr=Wr.getResponseHeader("HX-Push-Url"),Yr="push"):O(Wr,/HX-Replace-Url:/i)&&(Kr=Wr.getResponseHeader("HX-Replace-Url"),Yr="replace"),Kr)return Kr==="false"?{}:{type:Yr,path:Kr};var Zr=Gr.pathInfo.finalRequestPath,tn=Gr.pathInfo.responsePath,ln=ne(Qr,"hx-push-url"),dn=ne(Qr,"hx-replace-url"),yn=ae(Qr).boosted,wn=null,kn=null;return ln?(wn="push",kn=ln):dn?(wn="replace",kn=dn):yn&&(wn="push",kn=tn||Zr),kn?kn==="false"?{}:(kn==="true"&&(kn=tn||Zr),Gr.pathInfo.anchor&&kn.indexOf("#")===-1&&(kn=kn+"#"+Gr.pathInfo.anchor),{type:wn,path:kn}):{}}function Mr(Qr,Gr){var Wr=Gr.xhr,Kr=Gr.target,Yr=Gr.etc,Zr=Gr.requestConfig,tn=Gr.select;if(ce(Qr,"htmx:beforeOnLoad",Gr)){if(O(Wr,/HX-Trigger:/i)&&_e(Wr,"HX-Trigger",Qr),O(Wr,/HX-Location:/i)){er();var ln=Wr.getResponseHeader("HX-Location"),dn;ln.indexOf("{")===0&&(dn=E(ln),ln=dn.path,delete dn.path),Nr("GET",ln,dn).then(function(){tr(ln)});return}var yn=O(Wr,/HX-Refresh:/i)&&Wr.getResponseHeader("HX-Refresh")==="true";if(O(Wr,/HX-Redirect:/i)){location.href=Wr.getResponseHeader("HX-Redirect"),yn&&location.reload();return}if(yn){location.reload();return}O(Wr,/HX-Retarget:/i)&&(Wr.getResponseHeader("HX-Retarget")==="this"?Gr.target=Qr:Gr.target=ue(Qr,Wr.getResponseHeader("HX-Retarget")));var wn=Pr(Qr,Gr),kn=Wr.status>=200&&Wr.status<400&&Wr.status!==204,An=Wr.response,Gn=Wr.status>=400,jn=Q.config.ignoreTitle,Vn=le({shouldSwap:kn,serverResponse:An,isError:Gn,ignoreTitle:jn},Gr);if(ce(Kr,"htmx:beforeSwap",Vn)){if(Kr=Vn.target,An=Vn.serverResponse,Gn=Vn.isError,jn=Vn.ignoreTitle,Gr.target=Kr,Gr.failed=Gn,Gr.successful=!Gn,Vn.shouldSwap){Wr.status===286&&at(Qr),R(Qr,function(gi){An=gi.transformResponse(An,Wr,Qr)}),wn.type&&er();var ti=Yr.swapOverride;O(Wr,/HX-Reswap:/i)&&(ti=Wr.getResponseHeader("HX-Reswap"));var dn=wr(Qr,ti);dn.hasOwnProperty("ignoreTitle")&&(jn=dn.ignoreTitle),Kr.classList.add(Q.config.swappingClass);var Ti=null,fi=null,oi=function(){try{var gi=document.activeElement,ri={};try{ri={elt:gi,start:gi?gi.selectionStart:null,end:gi?gi.selectionEnd:null}}catch{}var xn;tn&&(xn=tn),O(Wr,/HX-Reselect:/i)&&(xn=Wr.getResponseHeader("HX-Reselect")),wn.type&&(ce(re().body,"htmx:beforeHistoryUpdate",le({history:wn},Gr)),wn.type==="push"?(tr(wn.path),ce(re().body,"htmx:pushedIntoHistory",{path:wn.path})):(rr(wn.path),ce(re().body,"htmx:replacedInHistory",{path:wn.path})));var en=T(Kr);if(je(dn.swapStyle,Kr,Qr,An,en,xn),ri.elt&&!se(ri.elt)&&ee(ri.elt,"id")){var an=document.getElementById(ee(ri.elt,"id")),pn={preventScroll:dn.focusScroll!==void 0?!dn.focusScroll:!Q.config.defaultFocusScroll};if(an){if(ri.start&&an.setSelectionRange)try{an.setSelectionRange(ri.start,ri.end)}catch{}an.focus(pn)}}if(Kr.classList.remove(Q.config.swappingClass),oe(en.elts,function(vn){vn.classList&&vn.classList.add(Q.config.settlingClass),ce(vn,"htmx:afterSwap",Gr)}),O(Wr,/HX-Trigger-After-Swap:/i)){var mn=Qr;se(Qr)||(mn=re().body),_e(Wr,"HX-Trigger-After-Swap",mn)}var Sn=function(){if(oe(en.tasks,function(On){On.call()}),oe(en.elts,function(On){On.classList&&On.classList.remove(Q.config.settlingClass),ce(On,"htmx:afterSettle",Gr)}),Gr.pathInfo.anchor){var vn=re().getElementById(Gr.pathInfo.anchor);vn&&vn.scrollIntoView({block:"start",behavior:"auto"})}if(en.title&&!jn){var bn=C("title");bn?bn.innerHTML=en.title:window.document.title=en.title}if(Cr(en.elts,dn),O(Wr,/HX-Trigger-After-Settle:/i)){var hn=Qr;se(Qr)||(hn=re().body),_e(Wr,"HX-Trigger-After-Settle",hn)}ie(Ti)};dn.settleDelay>0?setTimeout(Sn,dn.settleDelay):Sn()}catch(vn){throw fe(Qr,"htmx:swapError",Gr),ie(fi),vn}},Jn=Q.config.globalViewTransitions;if(dn.hasOwnProperty("transition")&&(Jn=dn.transition),Jn&&ce(Qr,"htmx:beforeTransition",Gr)&&typeof Promise<"u"&&document.startViewTransition){var mi=new Promise(function(gi,ri){Ti=gi,fi=ri}),ai=oi;oi=function(){document.startViewTransition(function(){return ai(),mi})}}dn.swapDelay>0?setTimeout(oi,dn.swapDelay):oi()}Gn&&fe(Qr,"htmx:responseError",le({error:"Response Status Error Code "+Wr.status+" from "+Gr.pathInfo.requestPath},Gr))}}}var Xr={};function Dr(){return{init:function(Qr){return null},onEvent:function(Qr,Gr){return!0},transformResponse:function(Qr,Gr,Wr){return Qr},isInlineSwap:function(Qr){return!1},handleSwap:function(Qr,Gr,Wr,Kr){return!1},encodeParameters:function(Qr,Gr,Wr){return null}}}function Ur(Qr,Gr){Gr.init&&Gr.init(r),Xr[Qr]=le(Dr(),Gr)}function Br(Qr){delete Xr[Qr]}function Fr(Qr,Gr,Wr){if(Qr==null)return Gr;Gr==null&&(Gr=[]),Wr==null&&(Wr=[]);var Kr=te(Qr,"hx-ext");return Kr&&oe(Kr.split(","),function(Yr){if(Yr=Yr.replace(/ /g,""),Yr.slice(0,7)=="ignore:"){Wr.push(Yr.slice(7));return}if(Wr.indexOf(Yr)<0){var Zr=Xr[Yr];Zr&&Gr.indexOf(Zr)<0&&Gr.push(Zr)}}),Fr(u(Qr),Gr,Wr)}var Vr=!1;re().addEventListener("DOMContentLoaded",function(){Vr=!0});function jr(Qr){Vr||re().readyState==="complete"?Qr():re().addEventListener("DOMContentLoaded",Qr)}function _r(){Q.config.includeIndicatorStyles!==!1&&re().head.insertAdjacentHTML("beforeend","<style> ."+Q.config.indicatorClass+"{opacity:0} ."+Q.config.requestClass+" ."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+Q.config.requestClass+"."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} </style>")}function zr(){var Qr=re().querySelector('meta[name="htmx-config"]');return Qr?E(Qr.content):null}function $r(){var Qr=zr();Qr&&(Q.config=le(Q.config,Qr))}return jr(function(){$r(),_r();var Qr=re().body;zt(Qr);var Gr=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");Qr.addEventListener("htmx:abort",function(Kr){var Yr=Kr.target,Zr=ae(Yr);Zr&&Zr.xhr&&Zr.xhr.abort()});let Wr=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(Kr){Kr.state&&Kr.state.htmx?(ar(),oe(Gr,function(Yr){ce(Yr,"htmx:restored",{document:re(),triggerEvent:ce})})):Wr&&Wr(Kr)},setTimeout(function(){ce(Qr,"htmx:load",{}),Qr=null},0)}),Q}()})});var Ys=Qs((go,Ks)=>{(function(Qr,Gr){let Wr=Gr(Qr);typeof go=="object"&&typeof go.nodeName!="string"?Ks.exports=Wr:(Qr._hyperscript=Wr,"document"in Qr&&Qr._hyperscript.browserInit())})(typeof self<"u"?self:go,Qr=>{"use strict";let Gr={dynamicResolvers:[function(xn,en){if(xn==="Fixed")return Number(en).toFixed();if(xn.indexOf("Fixed:")===0){let an=xn.split(":")[1];return Number(en).toFixed(parseInt(an))}}],String:function(xn){return xn.toString?xn.toString():""+xn},Int:function(xn){return parseInt(xn)},Float:function(xn){return parseFloat(xn)},Number:function(xn){return Number(xn)},Date:function(xn){return new Date(xn)},Array:function(xn){return Array.from(xn)},JSON:function(xn){return JSON.stringify(xn)},Object:function(xn){return xn instanceof String&&(xn=xn.toString()),typeof xn=="string"?JSON.parse(xn):Object.assign({},xn)}},Wr={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:Gr};class Kr{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS","~":"TILDE"};static isValidCSSClassChar(en){return Kr.isAlpha(en)||Kr.isNumeric(en)||en==="-"||en==="_"||en===":"}static isValidCSSIDChar(en){return Kr.isAlpha(en)||Kr.isNumeric(en)||en==="-"||en==="_"||en===":"}static isWhitespace(en){return en===" "||en===" "||Kr.isNewline(en)}static positionString(en){return"[Line: "+en.line+", Column: "+en.column+"]"}static isNewline(en){return en==="\r"||en===` 3 - `}static isNumeric(en){return en>="0"&&en<="9"}static isAlpha(en){return en>="a"&&en<="z"||en>="A"&&en<="Z"}static isIdentifierChar(en,an){return en==="_"||en==="$"}static isReservedChar(en){return en==="`"||en==="^"}static isValidSingleQuoteStringStart(en){if(en.length>0){var an=en[en.length-1];if(an.type==="IDENTIFIER"||an.type==="CLASS_REF"||an.type==="ID_REF"||an.op&&(an.value===">"||an.value===")"))return!1}return!0}static tokenize(en,an){var pn=[],mn=en,Sn=0,vn=0,bn=1,hn="<START>",On=0;function Pn(){return an&&On===0}for(;Sn<mn.length;)if(un()==="-"&&gn()==="-"&&(Kr.isWhitespace(En(2))||En(2)===""||En(2)==="-")||un()==="/"&&gn()==="/"&&(Kr.isWhitespace(En(2))||En(2)===""||En(2)==="/"))Ln();else if(un()==="/"&&gn()==="*"&&(Kr.isWhitespace(En(2))||En(2)===""||En(2)==="*"))Fn();else if(Kr.isWhitespace(un()))pn.push(Bn());else if(!Rn()&&un()==="."&&(Kr.isAlpha(gn())||gn()==="{"||gn()==="-"))pn.push(Mn());else if(!Rn()&&un()==="#"&&(Kr.isAlpha(gn())||gn()==="{"))pn.push(nn());else if(un()==="["&&gn()==="@")pn.push(Hn());else if(un()==="@")pn.push(Wn());else if(un()==="*"&&Kr.isAlpha(gn()))pn.push(zn());else if(Pn()&&(Kr.isAlpha(un())||un()==="\\"))pn.push(on());else if(!Pn()&&(Kr.isAlpha(un())||Kr.isIdentifierChar(un())))pn.push(Jr());else if(Kr.isNumeric(un()))pn.push(rn());else if(!Pn()&&(un()==='"'||un()==="`"))pn.push(sn());else if(!Pn()&&un()==="'")Kr.isValidSingleQuoteStringStart(pn)?pn.push(sn()):pn.push(cn());else if(Kr.OP_TABLE[un()])hn==="$"&&un()==="{"&&On++,un()==="}"&&On--,pn.push(cn());else if(Pn()||Kr.isReservedChar(un()))pn.push(Dn("RESERVED",Tn()));else if(Sn<mn.length)throw Error("Unknown token: "+un()+" ");return new Yr(pn,[],mn);function Nn(Cn,In){var _n=Dn(Cn,In);return _n.op=!0,_n}function Dn(Cn,In){return{type:Cn,value:In||"",start:Sn,end:Sn+1,column:vn,line:bn}}function Ln(){for(;un()&&!Kr.isNewline(un());)Tn();Tn()}function Fn(){for(;un()&&!(un()==="*"&&gn()==="/");)Tn();Tn(),Tn()}function Mn(){var Cn=Dn("CLASS_REF"),In=Tn();if(un()==="{"){for(Cn.template=!0,In+=Tn();un()&&un()!=="}";)In+=Tn();if(un()!=="}")throw Error("Unterminated class reference");In+=Tn()}else for(;Kr.isValidCSSClassChar(un())||un()==="\\";)un()==="\\"&&Tn(),In+=Tn();return Cn.value=In,Cn.end=Sn,Cn}function Hn(){for(var Cn=Dn("ATTRIBUTE_REF"),In=Tn();Sn<mn.length&&un()!=="]";)In+=Tn();return un()==="]"&&(In+=Tn()),Cn.value=In,Cn.end=Sn,Cn}function Wn(){for(var Cn=Dn("ATTRIBUTE_REF"),In=Tn();Kr.isValidCSSIDChar(un());)In+=Tn();if(un()==="="){if(In+=Tn(),un()==='"'||un()==="'"){let _n=sn();In+=_n.value}else if(Kr.isAlpha(un())||Kr.isNumeric(un())||Kr.isIdentifierChar(un())){let _n=Jr();In+=_n.value}}return Cn.value=In,Cn.end=Sn,Cn}function zn(){for(var Cn=Dn("STYLE_REF"),In=Tn();Kr.isAlpha(un())||un()==="-";)In+=Tn();return Cn.value=In,Cn.end=Sn,Cn}function nn(){var Cn=Dn("ID_REF"),In=Tn();if(un()==="{"){for(Cn.template=!0,In+=Tn();un()&&un()!=="}";)In+=Tn();if(un()!=="}")throw Error("Unterminated id reference");Tn()}else for(;Kr.isValidCSSIDChar(un());)In+=Tn();return Cn.value=In,Cn.end=Sn,Cn}function on(){var Cn=Dn("IDENTIFIER"),In=Tn(),_n=In==="\\";for(_n&&(In="");(Kr.isAlpha(un())||Kr.isNumeric(un())||Kr.isIdentifierChar(un())||un()==="\\"||un()==="{"||un()==="}")&&!(un()==="$"&&_n===!1);)un()==="\\"?(_n=!0,Tn()):(_n=!1,In+=Tn());return un()==="!"&&In==="beep"&&(In+=Tn()),Cn.value=In,Cn.end=Sn,Cn}function Jr(){for(var Cn=Dn("IDENTIFIER"),In=Tn();Kr.isAlpha(un())||Kr.isNumeric(un())||Kr.isIdentifierChar(un());)In+=Tn();return un()==="!"&&In==="beep"&&(In+=Tn()),Cn.value=In,Cn.end=Sn,Cn}function rn(){for(var Cn=Dn("NUMBER"),In=Tn();Kr.isNumeric(un());)In+=Tn();for(un()==="."&&Kr.isNumeric(gn())&&(In+=Tn());Kr.isNumeric(un());)In+=Tn();for((un()==="e"||un()==="E")&&(Kr.isNumeric(gn())?In+=Tn():gn()==="-"&&(In+=Tn(),In+=Tn()));Kr.isNumeric(un());)In+=Tn();return Cn.value=In,Cn.end=Sn,Cn}function cn(){for(var Cn=Nn(),In=Tn();un()&&Kr.OP_TABLE[In+un()];)In+=Tn();return Cn.type=Kr.OP_TABLE[In],Cn.value=In,Cn.end=Sn,Cn}function sn(){var Cn=Dn("STRING"),In=Tn();Cn.template=In==="`";for(var _n="";un()&&un()!==In;)if(un()==="\\"){Tn();let Un=Tn();if(Un==="b")_n+="\b";else if(Un==="f")_n+="\f";else if(Un==="n")_n+=` 4 - `;else if(Un==="r")_n+="\r";else if(Un==="t")_n+=" ";else if(Un==="v")_n+="\v";else if(Cn.template&&Un==="$")_n+="\\$";else if(Un==="x"){let ni=fn();if(Number.isNaN(ni))throw Error("Invalid hexadecimal escape at "+Kr.positionString(Cn));_n+=String.fromCharCode(ni)}else _n+=Un}else _n+=Tn();if(un()!==In)throw Error("Unterminated string at "+Kr.positionString(Cn));return Tn(),Cn.value=_n,Cn.end=Sn,Cn}function fn(){if(!un())return NaN;let In=16*Number.parseInt(Tn(),16);return un()?(In+=Number.parseInt(Tn(),16),In):NaN}function un(){return mn.charAt(Sn)}function gn(){return mn.charAt(Sn+1)}function En(Cn=1){return mn.charAt(Sn+Cn)}function Tn(){return hn=un(),Sn++,vn++,hn}function Rn(){return Kr.isAlpha(hn)||Kr.isNumeric(hn)||hn===")"||hn==='"'||hn==="'"||hn==="`"||hn==="}"||hn==="]"}function Bn(){for(var Cn=Dn("WHITESPACE"),In="";un()&&Kr.isWhitespace(un());)Kr.isNewline(un())&&(vn=0,bn++),In+=Tn();return Cn.value=In,Cn.end=Sn,Cn}}tokenize(en,an){return Kr.tokenize(en,an)}}class Yr{constructor(en,an,pn){this.tokens=en,this.consumed=an,this.source=pn,this.consumeWhitespace()}get list(){return this.tokens}_lastConsumed=null;consumeWhitespace(){for(;this.token(0,!0).type==="WHITESPACE";)this.consumed.push(this.tokens.shift())}raiseError(en,an){Zr.raiseParseError(en,an)}requireOpToken(en){var an=this.matchOpToken(en);if(an)return an;this.raiseError(this,"Expected '"+en+"' but found '"+this.currentToken().value+"'")}matchAnyOpToken(en,an,pn){for(var mn=0;mn<arguments.length;mn++){var Sn=arguments[mn],vn=this.matchOpToken(Sn);if(vn)return vn}}matchAnyToken(en,an,pn){for(var mn=0;mn<arguments.length;mn++){var Sn=arguments[mn],vn=this.matchToken(Sn);if(vn)return vn}}matchOpToken(en){if(this.currentToken()&&this.currentToken().op&&this.currentToken().value===en)return this.consumeToken()}requireTokenType(en,an,pn,mn){var Sn=this.matchTokenType(en,an,pn,mn);if(Sn)return Sn;this.raiseError(this,"Expected one of "+JSON.stringify([en,an,pn]))}matchTokenType(en,an,pn,mn){if(this.currentToken()&&this.currentToken().type&&[en,an,pn,mn].indexOf(this.currentToken().type)>=0)return this.consumeToken()}requireToken(en,an){var pn=this.matchToken(en,an);if(pn)return pn;this.raiseError(this,"Expected '"+en+"' but found '"+this.currentToken().value+"'")}peekToken(en,an,pn){if(an=an||0,pn=pn||"IDENTIFIER",this.tokens[an]&&this.tokens[an].value===en&&this.tokens[an].type===pn)return this.tokens[an]}matchToken(en,an){if(this.follows.indexOf(en)===-1&&(an=an||"IDENTIFIER",this.currentToken()&&this.currentToken().value===en&&this.currentToken().type===an))return this.consumeToken()}consumeToken(){var en=this.tokens.shift();return this.consumed.push(en),this._lastConsumed=en,this.consumeWhitespace(),en}consumeUntil(en,an){for(var pn=[],mn=this.token(0,!0);(an==null||mn.type!==an)&&(en==null||mn.value!==en)&&mn.type!=="EOF";){var Sn=this.tokens.shift();this.consumed.push(Sn),pn.push(mn),mn=this.token(0,!0)}return this.consumeWhitespace(),pn}lastWhitespace(){return this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"?this.consumed[this.consumed.length-1].value:""}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(en,an){var pn,mn=0;do{if(!an)for(;this.tokens[mn]&&this.tokens[mn].type==="WHITESPACE";)mn++;pn=this.tokens[mn],en--,mn++}while(en>-1);return pn||{type:"EOF",value:"<<<EOF>>>"}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split(` 5 - `)[this.startToken.line-1]};follows=[];pushFollow(en){this.follows.push(en)}popFollow(){this.follows.pop()}clearFollows(){var en=this.follows;return this.follows=[],en}restoreFollows(en){this.follows=en}}class Zr{constructor(en){this.runtime=en,this.possessivesDisabled=!1,this.addGrammarElement("feature",function(an,pn,mn){if(mn.matchOpToken("(")){var Sn=an.requireElement("feature",mn);return mn.requireOpToken(")"),Sn}var vn=an.FEATURES[mn.currentToken().value||""];if(vn)return vn(an,pn,mn)}),this.addGrammarElement("command",function(an,pn,mn){if(mn.matchOpToken("(")){let bn=an.requireElement("command",mn);return mn.requireOpToken(")"),bn}var Sn=an.COMMANDS[mn.currentToken().value||""];let vn;return Sn?vn=Sn(an,pn,mn):mn.currentToken().type==="IDENTIFIER"&&(vn=an.parseElement("pseudoCommand",mn)),vn&&an.parseElement("indirectStatement",mn,vn)}),this.addGrammarElement("commandList",function(an,pn,mn){if(mn.hasMore()){var Sn=an.parseElement("command",mn);if(Sn){mn.matchToken("then");let vn=an.parseElement("commandList",mn);return vn&&(Sn.next=vn),Sn}}return{type:"emptyCommandListCommand",op:function(vn){return pn.findNext(this,vn)},execute:function(vn){return pn.unifiedExec(this,vn)}}}),this.addGrammarElement("leaf",function(an,pn,mn){var Sn=an.parseAnyOf(an.LEAF_EXPRESSIONS,mn);return Sn??an.parseElement("symbol",mn)}),this.addGrammarElement("indirectExpression",function(an,pn,mn,Sn){for(var vn=0;vn<an.INDIRECT_EXPRESSIONS.length;vn++){var bn=an.INDIRECT_EXPRESSIONS[vn];Sn.endToken=mn.lastMatch();var hn=an.parseElement(bn,mn,Sn);if(hn)return hn}return Sn}),this.addGrammarElement("indirectStatement",function(an,pn,mn,Sn){if(mn.matchToken("unless")){Sn.endToken=mn.lastMatch();var vn=an.requireElement("expression",mn),bn={type:"unlessStatementModifier",args:[vn],op:function(hn,On){return On?this.next:Sn},execute:function(hn){return pn.unifiedExec(this,hn)}};return Sn.parent=bn,bn}return Sn}),this.addGrammarElement("primaryExpression",function(an,pn,mn){var Sn=an.parseElement("leaf",mn);if(Sn)return an.parseElement("indirectExpression",mn,Sn);an.raiseParseError(mn,"Unexpected value: "+mn.currentToken().value)})}use(en){return en(this),this}GRAMMAR={};COMMANDS={};FEATURES={};LEAF_EXPRESSIONS=[];INDIRECT_EXPRESSIONS=[];initElt(en,an,pn){en.startToken=an,en.sourceFor=Yr.sourceFor,en.lineFor=Yr.lineFor,en.programSource=pn.source}parseElement(en,an,pn=void 0){var mn=this.GRAMMAR[en];if(mn){var Sn=an.currentToken(),vn=mn(this,this.runtime,an,pn);if(vn){this.initElt(vn,Sn,an),vn.endToken=vn.endToken||an.lastMatch();for(var pn=vn.root;pn!=null;)this.initElt(pn,Sn,an),pn=pn.root}return vn}}requireElement(en,an,pn,mn){var Sn=this.parseElement(en,an,mn);return Sn||Zr.raiseParseError(an,pn||"Expected "+en),Sn}parseAnyOf(en,an){for(var pn=0;pn<en.length;pn++){var mn=en[pn],Sn=this.parseElement(mn,an);if(Sn)return Sn}}addGrammarElement(en,an){this.GRAMMAR[en]=an}addCommand(en,an){var pn=en+"Command",mn=function(Sn,vn,bn){let hn=an(Sn,vn,bn);if(hn)return hn.type=pn,hn.execute=function(On){return On.meta.command=hn,vn.unifiedExec(this,On)},hn};this.GRAMMAR[pn]=mn,this.COMMANDS[en]=mn}addFeature(en,an){var pn=en+"Feature",mn=function(Sn,vn,bn){var hn=an(Sn,vn,bn);if(hn)return hn.isFeature=!0,hn.keyword=en,hn.type=pn,hn};this.GRAMMAR[pn]=mn,this.FEATURES[en]=mn}addLeafExpression(en,an){this.LEAF_EXPRESSIONS.push(en),this.addGrammarElement(en,an)}addIndirectExpression(en,an){this.INDIRECT_EXPRESSIONS.push(en),this.addGrammarElement(en,an)}static createParserContext(en){var an=en.currentToken(),pn=en.source,mn=pn.split(` 6 - `),Sn=an&&an.line?an.line-1:mn.length-1,vn=mn[Sn],bn=an&&an.line?an.column:vn.length-1;return vn+` 1 + var Jl=Object.create;var rs=Object.defineProperty;var Zl=Object.getOwnPropertyDescriptor;var eu=Object.getOwnPropertyNames;var tu=Object.getPrototypeOf,ru=Object.prototype.hasOwnProperty;var ns=(Qr=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(Qr,{get:(Gr,Wr)=>(typeof require<"u"?require:Gr)[Wr]}):Qr)(function(Qr){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+Qr+'" is not supported')});var Ys=(Qr,Gr)=>()=>(Gr||Qr((Gr={exports:{}}).exports,Gr),Gr.exports),nu=(Qr,Gr)=>{for(var Wr in Gr)rs(Qr,Wr,{get:Gr[Wr],enumerable:!0})},iu=(Qr,Gr,Wr,Kr)=>{if(Gr&&typeof Gr=="object"||typeof Gr=="function")for(let Yr of eu(Gr))!ru.call(Qr,Yr)&&Yr!==Wr&&rs(Qr,Yr,{get:()=>Gr[Yr],enumerable:!(Kr=Zl(Gr,Yr))||Kr.enumerable});return Qr};var za=(Qr,Gr,Wr)=>(Wr=Qr!=null?Jl(tu(Qr)):{},iu(Gr||!Qr||!Qr.__esModule?rs(Wr,"default",{value:Qr,enumerable:!0}):Wr,Qr));var mo=Ys((exports,module)=>{(function(Qr,Gr){typeof define=="function"&&define.amd?define([],Gr):typeof module=="object"&&module.exports?module.exports=Gr():Qr.htmx=Qr.htmx||Gr()})(typeof self<"u"?self:exports,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(Qr,Gr){var Wr=dr(Qr,Gr||"post");return Wr.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:!1,scrollBehavior:"smooth",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get"],selfRequestsOnly:!1,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(Qr){return new EventSource(Qr,{withCredentials:!0})},createWebSocket:function(Qr){var Gr=new WebSocket(Qr,[]);return Gr.binaryType=Q.config.wsBinaryType,Gr},version:"1.9.12"},r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R},w=["get","post","put","delete","patch"],i=w.map(function(Qr){return"[hx-"+Qr+"], [data-hx-"+Qr+"]"}).join(", "),S=e("head"),q=e("title"),H=e("svg",!0);function e(Qr,Gr){return new RegExp("<"+Qr+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+Qr+">",Gr?"gim":"im")}function d(Qr){if(Qr==null)return;let Gr=NaN;return Qr.slice(-2)=="ms"?Gr=parseFloat(Qr.slice(0,-2)):Qr.slice(-1)=="s"?Gr=parseFloat(Qr.slice(0,-1))*1e3:Qr.slice(-1)=="m"?Gr=parseFloat(Qr.slice(0,-1))*1e3*60:Gr=parseFloat(Qr),isNaN(Gr)?void 0:Gr}function ee(Qr,Gr){return Qr.getAttribute&&Qr.getAttribute(Gr)}function o(Qr,Gr){return Qr.hasAttribute&&(Qr.hasAttribute(Gr)||Qr.hasAttribute("data-"+Gr))}function te(Qr,Gr){return ee(Qr,Gr)||ee(Qr,"data-"+Gr)}function u(Qr){return Qr.parentElement}function re(){return document}function c(Qr,Gr){for(;Qr&&!Gr(Qr);)Qr=u(Qr);return Qr||null}function L(Qr,Gr,Wr){var Kr=te(Gr,Wr),Yr=te(Gr,"hx-disinherit");return Qr!==Gr&&Yr&&(Yr==="*"||Yr.split(" ").indexOf(Wr)>=0)?"unset":Kr}function ne(Qr,Gr){var Wr=null;if(c(Qr,function(Kr){return Wr=L(Qr,Kr,Gr)}),Wr!=="unset")return Wr}function h(Qr,Gr){var Wr=Qr.matches||Qr.matchesSelector||Qr.msMatchesSelector||Qr.mozMatchesSelector||Qr.webkitMatchesSelector||Qr.oMatchesSelector;return Wr&&Wr.call(Qr,Gr)}function A(Qr){var Gr=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Wr=Gr.exec(Qr);return Wr?Wr[1].toLowerCase():""}function s(Qr,Gr){for(var Wr=new DOMParser,Kr=Wr.parseFromString(Qr,"text/html"),Yr=Kr.body;Gr>0;)Gr--,Yr=Yr.firstChild;return Yr==null&&(Yr=re().createDocumentFragment()),Yr}function N(Qr){return/<body/.test(Qr)}function l(Qr){var Gr=!N(Qr),Wr=A(Qr),Kr=Qr;if(Wr==="head"&&(Kr=Kr.replace(S,"")),Q.config.useTemplateFragments&&Gr){var Yr=s("<body><template>"+Kr+"</template></body>",0),Zr=Yr.querySelector("template").content;return Q.config.allowScriptTags?oe(Zr.querySelectorAll("script"),function(tn){Q.config.inlineScriptNonce&&(tn.nonce=Q.config.inlineScriptNonce),tn.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1}):oe(Zr.querySelectorAll("script"),function(tn){_(tn)}),Zr}switch(Wr){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s("<table>"+Kr+"</table>",1);case"col":return s("<table><colgroup>"+Kr+"</colgroup></table>",2);case"tr":return s("<table><tbody>"+Kr+"</tbody></table>",2);case"td":case"th":return s("<table><tbody><tr>"+Kr+"</tr></tbody></table>",3);case"script":case"style":return s("<div>"+Kr+"</div>",1);default:return s(Kr,0)}}function ie(Qr){Qr&&Qr()}function I(Qr,Gr){return Object.prototype.toString.call(Qr)==="[object "+Gr+"]"}function k(Qr){return I(Qr,"Function")}function P(Qr){return I(Qr,"Object")}function ae(Qr){var Gr="htmx-internal-data",Wr=Qr[Gr];return Wr||(Wr=Qr[Gr]={}),Wr}function M(Qr){var Gr=[];if(Qr)for(var Wr=0;Wr<Qr.length;Wr++)Gr.push(Qr[Wr]);return Gr}function oe(Qr,Gr){if(Qr)for(var Wr=0;Wr<Qr.length;Wr++)Gr(Qr[Wr])}function X(Qr){var Gr=Qr.getBoundingClientRect(),Wr=Gr.top,Kr=Gr.bottom;return Wr<window.innerHeight&&Kr>=0}function se(Qr){return Qr.getRootNode&&Qr.getRootNode()instanceof window.ShadowRoot?re().body.contains(Qr.getRootNode().host):re().body.contains(Qr)}function D(Qr){return Qr.trim().split(/\s+/)}function le(Qr,Gr){for(var Wr in Gr)Gr.hasOwnProperty(Wr)&&(Qr[Wr]=Gr[Wr]);return Qr}function E(Qr){try{return JSON.parse(Qr)}catch(Gr){return b(Gr),null}}function U(){var Qr="htmx:localStorageTest";try{return localStorage.setItem(Qr,Qr),localStorage.removeItem(Qr),!0}catch{return!1}}function B(Qr){try{var Gr=new URL(Qr);return Gr&&(Qr=Gr.pathname+Gr.search),/^\/$/.test(Qr)||(Qr=Qr.replace(/\/+$/,"")),Qr}catch{return Qr}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(Qr){var Gr=Q.on("htmx:load",function(Wr){Qr(Wr.detail.elt)});return Gr}function V(){Q.logger=function(Qr,Gr,Wr){console&&console.log(Gr,Qr,Wr)}}function j(){Q.logger=null}function C(Qr,Gr){return Gr?Qr.querySelector(Gr):C(re(),Qr)}function f(Qr,Gr){return Gr?Qr.querySelectorAll(Gr):f(re(),Qr)}function _(Qr,Gr){Qr=p(Qr),Gr?setTimeout(function(){_(Qr),Qr=null},Gr):Qr.parentElement.removeChild(Qr)}function z(Qr,Gr,Wr){Qr=p(Qr),Wr?setTimeout(function(){z(Qr,Gr),Qr=null},Wr):Qr.classList&&Qr.classList.add(Gr)}function n(Qr,Gr,Wr){Qr=p(Qr),Wr?setTimeout(function(){n(Qr,Gr),Qr=null},Wr):Qr.classList&&(Qr.classList.remove(Gr),Qr.classList.length===0&&Qr.removeAttribute("class"))}function $(Qr,Gr){Qr=p(Qr),Qr.classList.toggle(Gr)}function W(Qr,Gr){Qr=p(Qr),oe(Qr.parentElement.children,function(Wr){n(Wr,Gr)}),z(Qr,Gr)}function v(Qr,Gr){if(Qr=p(Qr),Qr.closest)return Qr.closest(Gr);do if(Qr==null||h(Qr,Gr))return Qr;while(Qr=Qr&&u(Qr));return null}function g(Qr,Gr){return Qr.substring(0,Gr.length)===Gr}function G(Qr,Gr){return Qr.substring(Qr.length-Gr.length)===Gr}function J(Qr){var Gr=Qr.trim();return g(Gr,"<")&&G(Gr,"/>")?Gr.substring(1,Gr.length-2):Gr}function Z(Qr,Gr){return Gr.indexOf("closest ")===0?[v(Qr,J(Gr.substr(8)))]:Gr.indexOf("find ")===0?[C(Qr,J(Gr.substr(5)))]:Gr==="next"?[Qr.nextElementSibling]:Gr.indexOf("next ")===0?[K(Qr,J(Gr.substr(5)))]:Gr==="previous"?[Qr.previousElementSibling]:Gr.indexOf("previous ")===0?[Y(Qr,J(Gr.substr(9)))]:Gr==="document"?[document]:Gr==="window"?[window]:Gr==="body"?[document.body]:re().querySelectorAll(J(Gr))}var K=function(Qr,Gr){for(var Wr=re().querySelectorAll(Gr),Kr=0;Kr<Wr.length;Kr++){var Yr=Wr[Kr];if(Yr.compareDocumentPosition(Qr)===Node.DOCUMENT_POSITION_PRECEDING)return Yr}},Y=function(Qr,Gr){for(var Wr=re().querySelectorAll(Gr),Kr=Wr.length-1;Kr>=0;Kr--){var Yr=Wr[Kr];if(Yr.compareDocumentPosition(Qr)===Node.DOCUMENT_POSITION_FOLLOWING)return Yr}};function ue(Qr,Gr){return Gr?Z(Qr,Gr)[0]:Z(re().body,Qr)[0]}function p(Qr){return I(Qr,"String")?C(Qr):Qr}function ve(Qr,Gr,Wr){return k(Gr)?{target:re().body,event:Qr,listener:Gr}:{target:p(Qr),event:Gr,listener:Wr}}function de(Qr,Gr,Wr){jr(function(){var Yr=ve(Qr,Gr,Wr);Yr.target.addEventListener(Yr.event,Yr.listener)});var Kr=k(Gr);return Kr?Gr:Wr}function ge(Qr,Gr,Wr){return jr(function(){var Kr=ve(Qr,Gr,Wr);Kr.target.removeEventListener(Kr.event,Kr.listener)}),k(Gr)?Gr:Wr}var pe=re().createElement("output");function me(Qr,Gr){var Wr=ne(Qr,Gr);if(Wr){if(Wr==="this")return[xe(Qr,Gr)];var Kr=Z(Qr,Wr);return Kr.length===0?(b('The selector "'+Wr+'" on '+Gr+" returned no matches!"),[pe]):Kr}}function xe(Qr,Gr){return c(Qr,function(Wr){return te(Wr,Gr)!=null})}function ye(Qr){var Gr=ne(Qr,"hx-target");if(Gr)return Gr==="this"?xe(Qr,"hx-target"):ue(Qr,Gr);var Wr=ae(Qr);return Wr.boosted?re().body:Qr}function be(Qr){for(var Gr=Q.config.attributesToSettle,Wr=0;Wr<Gr.length;Wr++)if(Qr===Gr[Wr])return!0;return!1}function we(Qr,Gr){oe(Qr.attributes,function(Wr){!Gr.hasAttribute(Wr.name)&&be(Wr.name)&&Qr.removeAttribute(Wr.name)}),oe(Gr.attributes,function(Wr){be(Wr.name)&&Qr.setAttribute(Wr.name,Wr.value)})}function Se(Qr,Gr){for(var Wr=Fr(Gr),Kr=0;Kr<Wr.length;Kr++){var Yr=Wr[Kr];try{if(Yr.isInlineSwap(Qr))return!0}catch(Zr){b(Zr)}}return Qr==="outerHTML"}function Ee(Qr,Gr,Wr){var Kr="#"+ee(Gr,"id"),Yr="outerHTML";Qr==="true"||(Qr.indexOf(":")>0?(Yr=Qr.substr(0,Qr.indexOf(":")),Kr=Qr.substr(Qr.indexOf(":")+1,Qr.length)):Yr=Qr);var Zr=re().querySelectorAll(Kr);return Zr?(oe(Zr,function(tn){var ln,dn=Gr.cloneNode(!0);ln=re().createDocumentFragment(),ln.appendChild(dn),Se(Yr,tn)||(ln=dn);var yn={shouldSwap:!0,target:tn,fragment:ln};ce(tn,"htmx:oobBeforeSwap",yn)&&(tn=yn.target,yn.shouldSwap&&Fe(Yr,tn,tn,ln,Wr),oe(Wr.elts,function(Sn){ce(Sn,"htmx:oobAfterSwap",yn)}))}),Gr.parentNode.removeChild(Gr)):(Gr.parentNode.removeChild(Gr),fe(re().body,"htmx:oobErrorNoTarget",{content:Gr})),Qr}function Ce(Qr,Gr,Wr){var Kr=ne(Qr,"hx-select-oob");if(Kr)for(var Yr=Kr.split(","),Zr=0;Zr<Yr.length;Zr++){var tn=Yr[Zr].split(":",2),ln=tn[0].trim();ln.indexOf("#")===0&&(ln=ln.substring(1));var dn=tn[1]||"true",yn=Gr.querySelector("#"+ln);yn&&Ee(dn,yn,Wr)}oe(f(Gr,"[hx-swap-oob], [data-hx-swap-oob]"),function(Sn){var kn=te(Sn,"hx-swap-oob");kn!=null&&Ee(kn,Sn,Wr)})}function Re(Qr){oe(f(Qr,"[hx-preserve], [data-hx-preserve]"),function(Gr){var Wr=te(Gr,"id"),Kr=re().getElementById(Wr);Kr!=null&&Gr.parentNode.replaceChild(Kr,Gr)})}function Te(Qr,Gr,Wr){oe(Gr.querySelectorAll("[id]"),function(Kr){var Yr=ee(Kr,"id");if(Yr&&Yr.length>0){var Zr=Yr.replace("'","\\'"),tn=Kr.tagName.replace(":","\\:"),ln=Qr.querySelector(tn+"[id='"+Zr+"']");if(ln&&ln!==Qr){var dn=Kr.cloneNode();we(Kr,ln),Wr.tasks.push(function(){we(Kr,dn)})}}})}function Oe(Qr){return function(){n(Qr,Q.config.addedClass),zt(Qr),Nt(Qr),qe(Qr),ce(Qr,"htmx:load")}}function qe(Qr){var Gr="[autofocus]",Wr=h(Qr,Gr)?Qr:Qr.querySelector(Gr);Wr?.focus()}function a(Qr,Gr,Wr,Kr){for(Te(Qr,Wr,Kr);Wr.childNodes.length>0;){var Yr=Wr.firstChild;z(Yr,Q.config.addedClass),Qr.insertBefore(Yr,Gr),Yr.nodeType!==Node.TEXT_NODE&&Yr.nodeType!==Node.COMMENT_NODE&&Kr.tasks.push(Oe(Yr))}}function He(Qr,Gr){for(var Wr=0;Wr<Qr.length;)Gr=(Gr<<5)-Gr+Qr.charCodeAt(Wr++)|0;return Gr}function Le(Qr){var Gr=0;if(Qr.attributes)for(var Wr=0;Wr<Qr.attributes.length;Wr++){var Kr=Qr.attributes[Wr];Kr.value&&(Gr=He(Kr.name,Gr),Gr=He(Kr.value,Gr))}return Gr}function Ae(Qr){var Gr=ae(Qr);if(Gr.onHandlers){for(var Wr=0;Wr<Gr.onHandlers.length;Wr++){let Kr=Gr.onHandlers[Wr];Qr.removeEventListener(Kr.event,Kr.listener)}delete Gr.onHandlers}}function Ne(Qr){var Gr=ae(Qr);Gr.timeout&&clearTimeout(Gr.timeout),Gr.webSocket&&Gr.webSocket.close(),Gr.sseEventSource&&Gr.sseEventSource.close(),Gr.listenerInfos&&oe(Gr.listenerInfos,function(Wr){Wr.on&&Wr.on.removeEventListener(Wr.trigger,Wr.listener)}),Ae(Qr),oe(Object.keys(Gr),function(Wr){delete Gr[Wr]})}function m(Qr){ce(Qr,"htmx:beforeCleanupElement"),Ne(Qr),Qr.children&&oe(Qr.children,function(Gr){m(Gr)})}function Ie(Qr,Gr,Wr){if(Qr.tagName==="BODY")return Ue(Qr,Gr,Wr);var Kr,Yr=Qr.previousSibling;for(a(u(Qr),Qr,Gr,Wr),Yr==null?Kr=u(Qr).firstChild:Kr=Yr.nextSibling,Wr.elts=Wr.elts.filter(function(Zr){return Zr!=Qr});Kr&&Kr!==Qr;)Kr.nodeType===Node.ELEMENT_NODE&&Wr.elts.push(Kr),Kr=Kr.nextElementSibling;m(Qr),u(Qr).removeChild(Qr)}function ke(Qr,Gr,Wr){return a(Qr,Qr.firstChild,Gr,Wr)}function Pe(Qr,Gr,Wr){return a(u(Qr),Qr,Gr,Wr)}function Me(Qr,Gr,Wr){return a(Qr,null,Gr,Wr)}function Xe(Qr,Gr,Wr){return a(u(Qr),Qr.nextSibling,Gr,Wr)}function De(Qr,Gr,Wr){return m(Qr),u(Qr).removeChild(Qr)}function Ue(Qr,Gr,Wr){var Kr=Qr.firstChild;if(a(Qr,Kr,Gr,Wr),Kr){for(;Kr.nextSibling;)m(Kr.nextSibling),Qr.removeChild(Kr.nextSibling);m(Kr),Qr.removeChild(Kr)}}function Be(Qr,Gr,Wr){var Kr=Wr||ne(Qr,"hx-select");if(Kr){var Yr=re().createDocumentFragment();oe(Gr.querySelectorAll(Kr),function(Zr){Yr.appendChild(Zr)}),Gr=Yr}return Gr}function Fe(Qr,Gr,Wr,Kr,Yr){switch(Qr){case"none":return;case"outerHTML":Ie(Wr,Kr,Yr);return;case"afterbegin":ke(Wr,Kr,Yr);return;case"beforebegin":Pe(Wr,Kr,Yr);return;case"beforeend":Me(Wr,Kr,Yr);return;case"afterend":Xe(Wr,Kr,Yr);return;case"delete":De(Wr,Kr,Yr);return;default:for(var Zr=Fr(Gr),tn=0;tn<Zr.length;tn++){var ln=Zr[tn];try{var dn=ln.handleSwap(Qr,Wr,Kr,Yr);if(dn){if(typeof dn.length<"u")for(var yn=0;yn<dn.length;yn++){var Sn=dn[yn];Sn.nodeType!==Node.TEXT_NODE&&Sn.nodeType!==Node.COMMENT_NODE&&Yr.tasks.push(Oe(Sn))}return}}catch(kn){b(kn)}}Qr==="innerHTML"?Ue(Wr,Kr,Yr):Fe(Q.config.defaultSwapStyle,Gr,Wr,Kr,Yr)}}function Ve(Qr){if(Qr.indexOf("<title")>-1){var Gr=Qr.replace(H,""),Wr=Gr.match(q);if(Wr)return Wr[2]}}function je(Qr,Gr,Wr,Kr,Yr,Zr){Yr.title=Ve(Kr);var tn=l(Kr);if(tn)return Ce(Wr,tn,Yr),tn=Be(Wr,tn,Zr),Re(tn),Fe(Qr,Wr,Gr,tn,Yr)}function _e(Qr,Gr,Wr){var Kr=Qr.getResponseHeader(Gr);if(Kr.indexOf("{")===0){var Yr=E(Kr);for(var Zr in Yr)if(Yr.hasOwnProperty(Zr)){var tn=Yr[Zr];P(tn)||(tn={value:tn}),ce(Wr,Zr,tn)}}else for(var ln=Kr.split(","),dn=0;dn<ln.length;dn++)ce(Wr,ln[dn].trim(),[])}var ze=/\s/,x=/[\s,]/,$e=/[_$a-zA-Z]/,We=/[_$a-zA-Z0-9]/,Ge=['"',"'","/"],Je=/[^\s]/,Ze=/[{(]/,Ke=/[})]/;function Ye(Qr){for(var Gr=[],Wr=0;Wr<Qr.length;){if($e.exec(Qr.charAt(Wr))){for(var Kr=Wr;We.exec(Qr.charAt(Wr+1));)Wr++;Gr.push(Qr.substr(Kr,Wr-Kr+1))}else if(Ge.indexOf(Qr.charAt(Wr))!==-1){var Yr=Qr.charAt(Wr),Kr=Wr;for(Wr++;Wr<Qr.length&&Qr.charAt(Wr)!==Yr;)Qr.charAt(Wr)==="\\"&&Wr++,Wr++;Gr.push(Qr.substr(Kr,Wr-Kr+1))}else{var Zr=Qr.charAt(Wr);Gr.push(Zr)}Wr++}return Gr}function Qe(Qr,Gr,Wr){return $e.exec(Qr.charAt(0))&&Qr!=="true"&&Qr!=="false"&&Qr!=="this"&&Qr!==Wr&&Gr!=="."}function et(Qr,Gr,Wr){if(Gr[0]==="["){Gr.shift();for(var Kr=1,Yr=" return (function("+Wr+"){ return (",Zr=null;Gr.length>0;){var tn=Gr[0];if(tn==="]"){if(Kr--,Kr===0){Zr===null&&(Yr=Yr+"true"),Gr.shift(),Yr+=")})";try{var ln=Tr(Qr,function(){return Function(Yr)()},function(){return!0});return ln.source=Yr,ln}catch(dn){return fe(re().body,"htmx:syntax:error",{error:dn,source:Yr}),null}}}else tn==="["&&Kr++;Qe(tn,Zr,Wr)?Yr+="(("+Wr+"."+tn+") ? ("+Wr+"."+tn+") : (window."+tn+"))":Yr=Yr+tn,Zr=Gr.shift()}}}function y(Qr,Gr){for(var Wr="";Qr.length>0&&!Gr.test(Qr[0]);)Wr+=Qr.shift();return Wr}function tt(Qr){var Gr;return Qr.length>0&&Ze.test(Qr[0])?(Qr.shift(),Gr=y(Qr,Ke).trim(),Qr.shift()):Gr=y(Qr,x),Gr}var rt="input, textarea, select";function nt(Qr,Gr,Wr){var Kr=[],Yr=Ye(Gr);do{y(Yr,Je);var Zr=Yr.length,tn=y(Yr,/[,\[\s]/);if(tn!=="")if(tn==="every"){var ln={trigger:"every"};y(Yr,Je),ln.pollInterval=d(y(Yr,/[,\[\s]/)),y(Yr,Je);var dn=et(Qr,Yr,"event");dn&&(ln.eventFilter=dn),Kr.push(ln)}else if(tn.indexOf("sse:")===0)Kr.push({trigger:"sse",sseEvent:tn.substr(4)});else{var yn={trigger:tn},dn=et(Qr,Yr,"event");for(dn&&(yn.eventFilter=dn);Yr.length>0&&Yr[0]!==",";){y(Yr,Je);var Sn=Yr.shift();if(Sn==="changed")yn.changed=!0;else if(Sn==="once")yn.once=!0;else if(Sn==="consume")yn.consume=!0;else if(Sn==="delay"&&Yr[0]===":")Yr.shift(),yn.delay=d(y(Yr,x));else if(Sn==="from"&&Yr[0]===":"){if(Yr.shift(),Ze.test(Yr[0]))var kn=tt(Yr);else{var kn=y(Yr,x);if(kn==="closest"||kn==="find"||kn==="next"||kn==="previous"){Yr.shift();var An=tt(Yr);An.length>0&&(kn+=" "+An)}}yn.from=kn}else Sn==="target"&&Yr[0]===":"?(Yr.shift(),yn.target=tt(Yr)):Sn==="throttle"&&Yr[0]===":"?(Yr.shift(),yn.throttle=d(y(Yr,x))):Sn==="queue"&&Yr[0]===":"?(Yr.shift(),yn.queue=y(Yr,x)):Sn==="root"&&Yr[0]===":"?(Yr.shift(),yn[Sn]=tt(Yr)):Sn==="threshold"&&Yr[0]===":"?(Yr.shift(),yn[Sn]=y(Yr,x)):fe(Qr,"htmx:syntax:error",{token:Yr.shift()})}Kr.push(yn)}Yr.length===Zr&&fe(Qr,"htmx:syntax:error",{token:Yr.shift()}),y(Yr,Je)}while(Yr[0]===","&&Yr.shift());return Wr&&(Wr[Gr]=Kr),Kr}function it(Qr){var Gr=te(Qr,"hx-trigger"),Wr=[];if(Gr){var Kr=Q.config.triggerSpecsCache;Wr=Kr&&Kr[Gr]||nt(Qr,Gr,Kr)}return Wr.length>0?Wr:h(Qr,"form")?[{trigger:"submit"}]:h(Qr,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:h(Qr,rt)?[{trigger:"change"}]:[{trigger:"click"}]}function at(Qr){ae(Qr).cancelled=!0}function ot(Qr,Gr,Wr){var Kr=ae(Qr);Kr.timeout=setTimeout(function(){se(Qr)&&Kr.cancelled!==!0&&(ct(Wr,Qr,Wt("hx:poll:trigger",{triggerSpec:Wr,target:Qr}))||Gr(Qr),ot(Qr,Gr,Wr))},Wr.pollInterval)}function st(Qr){return location.hostname===Qr.hostname&&ee(Qr,"href")&&ee(Qr,"href").indexOf("#")!==0}function lt(Qr,Gr,Wr){if(Qr.tagName==="A"&&st(Qr)&&(Qr.target===""||Qr.target==="_self")||Qr.tagName==="FORM"){Gr.boosted=!0;var Kr,Yr;if(Qr.tagName==="A")Kr="get",Yr=ee(Qr,"href");else{var Zr=ee(Qr,"method");Kr=Zr?Zr.toLowerCase():"get",Yr=ee(Qr,"action")}Wr.forEach(function(tn){ht(Qr,function(ln,dn){if(v(ln,Q.config.disableSelector)){m(ln);return}he(Kr,Yr,ln,dn)},Gr,tn,!0)})}}function ut(Qr,Gr){return!!((Qr.type==="submit"||Qr.type==="click")&&(Gr.tagName==="FORM"||h(Gr,'input[type="submit"], button')&&v(Gr,"form")!==null||Gr.tagName==="A"&&Gr.href&&(Gr.getAttribute("href")==="#"||Gr.getAttribute("href").indexOf("#")!==0)))}function ft(Qr,Gr){return ae(Qr).boosted&&Qr.tagName==="A"&&Gr.type==="click"&&(Gr.ctrlKey||Gr.metaKey)}function ct(Qr,Gr,Wr){var Kr=Qr.eventFilter;if(Kr)try{return Kr.call(Gr,Wr)!==!0}catch(Yr){return fe(re().body,"htmx:eventFilter:error",{error:Yr,source:Kr.source}),!0}return!1}function ht(Qr,Gr,Wr,Kr,Yr){var Zr=ae(Qr),tn;Kr.from?tn=Z(Qr,Kr.from):tn=[Qr],Kr.changed&&tn.forEach(function(ln){var dn=ae(ln);dn.lastValue=ln.value}),oe(tn,function(ln){var dn=function(yn){if(!se(Qr)){ln.removeEventListener(Kr.trigger,dn);return}if(!ft(Qr,yn)&&((Yr||ut(yn,Qr))&&yn.preventDefault(),!ct(Kr,Qr,yn))){var Sn=ae(yn);if(Sn.triggerSpec=Kr,Sn.handledFor==null&&(Sn.handledFor=[]),Sn.handledFor.indexOf(Qr)<0){if(Sn.handledFor.push(Qr),Kr.consume&&yn.stopPropagation(),Kr.target&&yn.target&&!h(yn.target,Kr.target))return;if(Kr.once){if(Zr.triggeredOnce)return;Zr.triggeredOnce=!0}if(Kr.changed){var kn=ae(ln);if(kn.lastValue===ln.value)return;kn.lastValue=ln.value}if(Zr.delayed&&clearTimeout(Zr.delayed),Zr.throttle)return;Kr.throttle>0?Zr.throttle||(Gr(Qr,yn),Zr.throttle=setTimeout(function(){Zr.throttle=null},Kr.throttle)):Kr.delay>0?Zr.delayed=setTimeout(function(){Gr(Qr,yn)},Kr.delay):(ce(Qr,"htmx:trigger"),Gr(Qr,yn))}}};Wr.listenerInfos==null&&(Wr.listenerInfos=[]),Wr.listenerInfos.push({trigger:Kr.trigger,listener:dn,on:ln}),ln.addEventListener(Kr.trigger,dn)})}var vt=!1,dt=null;function gt(){dt||(dt=function(){vt=!0},window.addEventListener("scroll",dt),setInterval(function(){vt&&(vt=!1,oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(Qr){pt(Qr)}))},200))}function pt(Qr){if(!o(Qr,"data-hx-revealed")&&X(Qr)){Qr.setAttribute("data-hx-revealed","true");var Gr=ae(Qr);Gr.initHash?ce(Qr,"revealed"):Qr.addEventListener("htmx:afterProcessNode",function(Wr){ce(Qr,"revealed")},{once:!0})}}function mt(Qr,Gr,Wr){for(var Kr=D(Wr),Yr=0;Yr<Kr.length;Yr++){var Zr=Kr[Yr].split(/:(.+)/);Zr[0]==="connect"&&xt(Qr,Zr[1],0),Zr[0]==="send"&&bt(Qr)}}function xt(Qr,Gr,Wr){if(se(Qr)){if(Gr.indexOf("/")==0){var Kr=location.hostname+(location.port?":"+location.port:"");location.protocol=="https:"?Gr="wss://"+Kr+Gr:location.protocol=="http:"&&(Gr="ws://"+Kr+Gr)}var Yr=Q.createWebSocket(Gr);Yr.onerror=function(Zr){fe(Qr,"htmx:wsError",{error:Zr,socket:Yr}),yt(Qr)},Yr.onclose=function(Zr){if([1006,1012,1013].indexOf(Zr.code)>=0){var tn=wt(Wr);setTimeout(function(){xt(Qr,Gr,Wr+1)},tn)}},Yr.onopen=function(Zr){Wr=0},ae(Qr).webSocket=Yr,Yr.addEventListener("message",function(Zr){if(!yt(Qr)){var tn=Zr.data;R(Qr,function(An){tn=An.transformResponse(tn,null,Qr)});for(var ln=T(Qr),dn=l(tn),yn=M(dn.children),Sn=0;Sn<yn.length;Sn++){var kn=yn[Sn];Ee(te(kn,"hx-swap-oob")||"true",kn,ln)}nr(ln.tasks)}})}}function yt(Qr){if(!se(Qr))return ae(Qr).webSocket.close(),!0}function bt(Qr){var Gr=c(Qr,function(Wr){return ae(Wr).webSocket!=null});Gr?Qr.addEventListener(it(Qr)[0].trigger,function(Wr){var Kr=ae(Gr).webSocket,Yr=xr(Qr,Gr),Zr=dr(Qr,"post"),tn=Zr.errors,ln=Zr.values,dn=Hr(Qr),yn=le(ln,dn),Sn=yr(yn,Qr);if(Sn.HEADERS=Yr,tn&&tn.length>0){ce(Qr,"htmx:validation:halted",tn);return}Kr.send(JSON.stringify(Sn)),ut(Wr,Qr)&&Wr.preventDefault()}):fe(Qr,"htmx:noWebSocketSourceError")}function wt(Qr){var Gr=Q.config.wsReconnectDelay;if(typeof Gr=="function")return Gr(Qr);if(Gr==="full-jitter"){var Wr=Math.min(Qr,6),Kr=1e3*Math.pow(2,Wr);return Kr*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(Qr,Gr,Wr){for(var Kr=D(Wr),Yr=0;Yr<Kr.length;Yr++){var Zr=Kr[Yr].split(/:(.+)/);Zr[0]==="connect"&&Et(Qr,Zr[1]),Zr[0]==="swap"&&Ct(Qr,Zr[1])}}function Et(Qr,Gr){var Wr=Q.createEventSource(Gr);Wr.onerror=function(Kr){fe(Qr,"htmx:sseError",{error:Kr,source:Wr}),Tt(Qr)},ae(Qr).sseEventSource=Wr}function Ct(Qr,Gr){var Wr=c(Qr,Ot);if(Wr){var Kr=ae(Wr).sseEventSource,Yr=function(Zr){if(!Tt(Wr)){if(!se(Qr)){Kr.removeEventListener(Gr,Yr);return}var tn=Zr.data;R(Qr,function(Sn){tn=Sn.transformResponse(tn,null,Qr)});var ln=wr(Qr),dn=ye(Qr),yn=T(Qr);je(ln.swapStyle,dn,Qr,tn,yn),nr(yn.tasks),ce(Qr,"htmx:sseMessage",Zr)}};ae(Qr).sseListener=Yr,Kr.addEventListener(Gr,Yr)}else fe(Qr,"htmx:noSSESourceError")}function Rt(Qr,Gr,Wr){var Kr=c(Qr,Ot);if(Kr){var Yr=ae(Kr).sseEventSource,Zr=function(){Tt(Kr)||(se(Qr)?Gr(Qr):Yr.removeEventListener(Wr,Zr))};ae(Qr).sseListener=Zr,Yr.addEventListener(Wr,Zr)}else fe(Qr,"htmx:noSSESourceError")}function Tt(Qr){if(!se(Qr))return ae(Qr).sseEventSource.close(),!0}function Ot(Qr){return ae(Qr).sseEventSource!=null}function qt(Qr,Gr,Wr,Kr){var Yr=function(){Wr.loaded||(Wr.loaded=!0,Gr(Qr))};Kr>0?setTimeout(Yr,Kr):Yr()}function Ht(Qr,Gr,Wr){var Kr=!1;return oe(w,function(Yr){if(o(Qr,"hx-"+Yr)){var Zr=te(Qr,"hx-"+Yr);Kr=!0,Gr.path=Zr,Gr.verb=Yr,Wr.forEach(function(tn){Lt(Qr,tn,Gr,function(ln,dn){if(v(ln,Q.config.disableSelector)){m(ln);return}he(Yr,Zr,ln,dn)})})}}),Kr}function Lt(Qr,Gr,Wr,Kr){if(Gr.sseEvent)Rt(Qr,Kr,Gr.sseEvent);else if(Gr.trigger==="revealed")gt(),ht(Qr,Kr,Wr,Gr),pt(Qr);else if(Gr.trigger==="intersect"){var Yr={};Gr.root&&(Yr.root=ue(Qr,Gr.root)),Gr.threshold&&(Yr.threshold=parseFloat(Gr.threshold));var Zr=new IntersectionObserver(function(tn){for(var ln=0;ln<tn.length;ln++){var dn=tn[ln];if(dn.isIntersecting){ce(Qr,"intersect");break}}},Yr);Zr.observe(Qr),ht(Qr,Kr,Wr,Gr)}else Gr.trigger==="load"?ct(Gr,Qr,Wt("load",{elt:Qr}))||qt(Qr,Kr,Wr,Gr.delay):Gr.pollInterval>0?(Wr.polling=!0,ot(Qr,Kr,Gr)):ht(Qr,Kr,Wr,Gr)}function At(Qr){if(!Qr.htmxExecuted&&Q.config.allowScriptTags&&(Qr.type==="text/javascript"||Qr.type==="module"||Qr.type==="")){var Gr=re().createElement("script");oe(Qr.attributes,function(Kr){Gr.setAttribute(Kr.name,Kr.value)}),Gr.textContent=Qr.textContent,Gr.async=!1,Q.config.inlineScriptNonce&&(Gr.nonce=Q.config.inlineScriptNonce);var Wr=Qr.parentElement;try{Wr.insertBefore(Gr,Qr)}catch(Kr){b(Kr)}finally{Qr.parentElement&&Qr.parentElement.removeChild(Qr)}}}function Nt(Qr){h(Qr,"script")&&At(Qr),oe(f(Qr,"script"),function(Gr){At(Gr)})}function It(Qr){var Gr=Qr.attributes;if(!Gr)return!1;for(var Wr=0;Wr<Gr.length;Wr++){var Kr=Gr[Wr].name;if(g(Kr,"hx-on:")||g(Kr,"data-hx-on:")||g(Kr,"hx-on-")||g(Kr,"data-hx-on-"))return!0}return!1}function kt(Qr){var Gr=null,Wr=[];if(It(Qr)&&Wr.push(Qr),document.evaluate)for(var Kr=document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]',Qr);Gr=Kr.iterateNext();)Wr.push(Gr);else if(typeof Qr.getElementsByTagName=="function")for(var Yr=Qr.getElementsByTagName("*"),Zr=0;Zr<Yr.length;Zr++)It(Yr[Zr])&&Wr.push(Yr[Zr]);return Wr}function Pt(Qr){if(Qr.querySelectorAll){var Gr=", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]",Wr=Qr.querySelectorAll(i+Gr+", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws], [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");return Wr}else return[]}function Mt(Qr){var Gr=v(Qr.target,"button, input[type='submit']"),Wr=Dt(Qr);Wr&&(Wr.lastButtonClicked=Gr)}function Xt(Qr){var Gr=Dt(Qr);Gr&&(Gr.lastButtonClicked=null)}function Dt(Qr){var Gr=v(Qr.target,"button, input[type='submit']");if(Gr){var Wr=p("#"+ee(Gr,"form"))||v(Gr,"form");if(Wr)return ae(Wr)}}function Ut(Qr){Qr.addEventListener("click",Mt),Qr.addEventListener("focusin",Mt),Qr.addEventListener("focusout",Xt)}function Bt(Qr){for(var Gr=Ye(Qr),Wr=0,Kr=0;Kr<Gr.length;Kr++){let Yr=Gr[Kr];Yr==="{"?Wr++:Yr==="}"&&Wr--}return Wr}function Ft(Qr,Gr,Wr){var Kr=ae(Qr);Array.isArray(Kr.onHandlers)||(Kr.onHandlers=[]);var Yr,Zr=function(tn){return Tr(Qr,function(){Yr||(Yr=new Function("event",Wr)),Yr.call(Qr,tn)})};Qr.addEventListener(Gr,Zr),Kr.onHandlers.push({event:Gr,listener:Zr})}function Vt(Qr){var Gr=te(Qr,"hx-on");if(Gr){for(var Wr={},Kr=Gr.split(` 2 + `),Yr=null,Zr=0;Kr.length>0;){var tn=Kr.shift(),ln=tn.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);Zr===0&&ln?(tn.split(":"),Yr=ln[1].slice(0,-1),Wr[Yr]=ln[2]):Wr[Yr]+=tn,Zr+=Bt(tn)}for(var dn in Wr)Ft(Qr,dn,Wr[dn])}}function jt(Qr){Ae(Qr);for(var Gr=0;Gr<Qr.attributes.length;Gr++){var Wr=Qr.attributes[Gr].name,Kr=Qr.attributes[Gr].value;if(g(Wr,"hx-on")||g(Wr,"data-hx-on")){var Yr=Wr.indexOf("-on")+3,Zr=Wr.slice(Yr,Yr+1);if(Zr==="-"||Zr===":"){var tn=Wr.slice(Yr+1);g(tn,":")?tn="htmx"+tn:g(tn,"-")?tn="htmx:"+tn.slice(1):g(tn,"htmx-")&&(tn="htmx:"+tn.slice(5)),Ft(Qr,tn,Kr)}}}}function _t(Qr){if(v(Qr,Q.config.disableSelector)){m(Qr);return}var Gr=ae(Qr);if(Gr.initHash!==Le(Qr)){Ne(Qr),Gr.initHash=Le(Qr),Vt(Qr),ce(Qr,"htmx:beforeProcessNode"),Qr.value&&(Gr.lastValue=Qr.value);var Wr=it(Qr),Kr=Ht(Qr,Gr,Wr);Kr||(ne(Qr,"hx-boost")==="true"?lt(Qr,Gr,Wr):o(Qr,"hx-trigger")&&Wr.forEach(function(tn){Lt(Qr,tn,Gr,function(){})})),(Qr.tagName==="FORM"||ee(Qr,"type")==="submit"&&o(Qr,"form"))&&Ut(Qr);var Yr=te(Qr,"hx-sse");Yr&&St(Qr,Gr,Yr);var Zr=te(Qr,"hx-ws");Zr&&mt(Qr,Gr,Zr),ce(Qr,"htmx:afterProcessNode")}}function zt(Qr){if(Qr=p(Qr),v(Qr,Q.config.disableSelector)){m(Qr);return}_t(Qr),oe(Pt(Qr),function(Gr){_t(Gr)}),oe(kt(Qr),jt)}function $t(Qr){return Qr.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Wt(Qr,Gr){var Wr;return window.CustomEvent&&typeof window.CustomEvent=="function"?Wr=new CustomEvent(Qr,{bubbles:!0,cancelable:!0,detail:Gr}):(Wr=re().createEvent("CustomEvent"),Wr.initCustomEvent(Qr,!0,!0,Gr)),Wr}function fe(Qr,Gr,Wr){ce(Qr,Gr,le({error:Gr},Wr))}function Gt(Qr){return Qr==="htmx:afterProcessNode"}function R(Qr,Gr){oe(Fr(Qr),function(Wr){try{Gr(Wr)}catch(Kr){b(Kr)}})}function b(Qr){console.error?console.error(Qr):console.log&&console.log("ERROR: ",Qr)}function ce(Qr,Gr,Wr){Qr=p(Qr),Wr==null&&(Wr={}),Wr.elt=Qr;var Kr=Wt(Gr,Wr);Q.logger&&!Gt(Gr)&&Q.logger(Qr,Gr,Wr),Wr.error&&(b(Wr.error),ce(Qr,"htmx:error",{errorInfo:Wr}));var Yr=Qr.dispatchEvent(Kr),Zr=$t(Gr);if(Yr&&Zr!==Gr){var tn=Wt(Zr,Kr.detail);Yr=Yr&&Qr.dispatchEvent(tn)}return R(Qr,function(ln){Yr=Yr&&ln.onEvent(Gr,Kr)!==!1&&!Kr.defaultPrevented}),Yr}var Jt=location.pathname+location.search;function Zt(){var Qr=re().querySelector("[hx-history-elt],[data-hx-history-elt]");return Qr||re().body}function Kt(Qr,Gr,Wr,Kr){if(U()){if(Q.config.historyCacheSize<=0){localStorage.removeItem("htmx-history-cache");return}Qr=B(Qr);for(var Yr=E(localStorage.getItem("htmx-history-cache"))||[],Zr=0;Zr<Yr.length;Zr++)if(Yr[Zr].url===Qr){Yr.splice(Zr,1);break}var tn={url:Qr,content:Gr,title:Wr,scroll:Kr};for(ce(re().body,"htmx:historyItemCreated",{item:tn,cache:Yr}),Yr.push(tn);Yr.length>Q.config.historyCacheSize;)Yr.shift();for(;Yr.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(Yr));break}catch(ln){fe(re().body,"htmx:historyCacheError",{cause:ln,cache:Yr}),Yr.shift()}}}function Yt(Qr){if(!U())return null;Qr=B(Qr);for(var Gr=E(localStorage.getItem("htmx-history-cache"))||[],Wr=0;Wr<Gr.length;Wr++)if(Gr[Wr].url===Qr)return Gr[Wr];return null}function Qt(Qr){var Gr=Q.config.requestClass,Wr=Qr.cloneNode(!0);return oe(f(Wr,"."+Gr),function(Kr){n(Kr,Gr)}),Wr.innerHTML}function er(){var Qr=Zt(),Gr=Jt||location.pathname+location.search,Wr;try{Wr=re().querySelector('[hx-history="false" i],[data-hx-history="false" i]')}catch{Wr=re().querySelector('[hx-history="false"],[data-hx-history="false"]')}Wr||(ce(re().body,"htmx:beforeHistorySave",{path:Gr,historyElt:Qr}),Kt(Gr,Qt(Qr),re().title,window.scrollY)),Q.config.historyEnabled&&history.replaceState({htmx:!0},re().title,window.location.href)}function tr(Qr){Q.config.getCacheBusterParam&&(Qr=Qr.replace(/org\.htmx\.cache-buster=[^&]*&?/,""),(G(Qr,"&")||G(Qr,"?"))&&(Qr=Qr.slice(0,-1))),Q.config.historyEnabled&&history.pushState({htmx:!0},"",Qr),Jt=Qr}function rr(Qr){Q.config.historyEnabled&&history.replaceState({htmx:!0},"",Qr),Jt=Qr}function nr(Qr){oe(Qr,function(Gr){Gr.call()})}function ir(Qr){var Gr=new XMLHttpRequest,Wr={path:Qr,xhr:Gr};ce(re().body,"htmx:historyCacheMiss",Wr),Gr.open("GET",Qr,!0),Gr.setRequestHeader("HX-Request","true"),Gr.setRequestHeader("HX-History-Restore-Request","true"),Gr.setRequestHeader("HX-Current-URL",re().location.href),Gr.onload=function(){if(this.status>=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",Wr);var Kr=l(this.response);Kr=Kr.querySelector("[hx-history-elt],[data-hx-history-elt]")||Kr;var Yr=Zt(),Zr=T(Yr),tn=Ve(this.response);if(tn){var ln=C("title");ln?ln.innerHTML=tn:window.document.title=tn}Ue(Yr,Kr,Zr),nr(Zr.tasks),Jt=Qr,ce(re().body,"htmx:historyRestore",{path:Qr,cacheMiss:!0,serverResponse:this.response})}else fe(re().body,"htmx:historyCacheMissLoadError",Wr)},Gr.send()}function ar(Qr){er(),Qr=Qr||location.pathname+location.search;var Gr=Yt(Qr);if(Gr){var Wr=l(Gr.content),Kr=Zt(),Yr=T(Kr);Ue(Kr,Wr,Yr),nr(Yr.tasks),document.title=Gr.title,setTimeout(function(){window.scrollTo(0,Gr.scroll)},0),Jt=Qr,ce(re().body,"htmx:historyRestore",{path:Qr,item:Gr})}else Q.config.refreshOnHistoryMiss?window.location.reload(!0):ir(Qr)}function or(Qr){var Gr=me(Qr,"hx-indicator");return Gr==null&&(Gr=[Qr]),oe(Gr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)+1,Wr.classList.add.call(Wr.classList,Q.config.requestClass)}),Gr}function sr(Qr){var Gr=me(Qr,"hx-disabled-elt");return Gr==null&&(Gr=[]),oe(Gr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)+1,Wr.setAttribute("disabled","")}),Gr}function lr(Qr,Gr){oe(Qr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)-1,Kr.requestCount===0&&Wr.classList.remove.call(Wr.classList,Q.config.requestClass)}),oe(Gr,function(Wr){var Kr=ae(Wr);Kr.requestCount=(Kr.requestCount||0)-1,Kr.requestCount===0&&Wr.removeAttribute("disabled")})}function ur(Qr,Gr){for(var Wr=0;Wr<Qr.length;Wr++){var Kr=Qr[Wr];if(Kr.isSameNode(Gr))return!0}return!1}function fr(Qr){return Qr.name===""||Qr.name==null||Qr.disabled||v(Qr,"fieldset[disabled]")||Qr.type==="button"||Qr.type==="submit"||Qr.tagName==="image"||Qr.tagName==="reset"||Qr.tagName==="file"?!1:Qr.type==="checkbox"||Qr.type==="radio"?Qr.checked:!0}function cr(Qr,Gr,Wr){if(Qr!=null&&Gr!=null){var Kr=Wr[Qr];Kr===void 0?Wr[Qr]=Gr:Array.isArray(Kr)?Array.isArray(Gr)?Wr[Qr]=Kr.concat(Gr):Kr.push(Gr):Array.isArray(Gr)?Wr[Qr]=[Kr].concat(Gr):Wr[Qr]=[Kr,Gr]}}function hr(Qr,Gr,Wr,Kr,Yr){if(!(Kr==null||ur(Qr,Kr))){if(Qr.push(Kr),fr(Kr)){var Zr=ee(Kr,"name"),tn=Kr.value;Kr.multiple&&Kr.tagName==="SELECT"&&(tn=M(Kr.querySelectorAll("option:checked")).map(function(dn){return dn.value})),Kr.files&&(tn=M(Kr.files)),cr(Zr,tn,Gr),Yr&&vr(Kr,Wr)}if(h(Kr,"form")){var ln=Kr.elements;oe(ln,function(dn){hr(Qr,Gr,Wr,dn,Yr)})}}}function vr(Qr,Gr){Qr.willValidate&&(ce(Qr,"htmx:validation:validate"),Qr.checkValidity()||(Gr.push({elt:Qr,message:Qr.validationMessage,validity:Qr.validity}),ce(Qr,"htmx:validation:failed",{message:Qr.validationMessage,validity:Qr.validity})))}function dr(Qr,Gr){var Wr=[],Kr={},Yr={},Zr=[],tn=ae(Qr);tn.lastButtonClicked&&!se(tn.lastButtonClicked)&&(tn.lastButtonClicked=null);var ln=h(Qr,"form")&&Qr.noValidate!==!0||te(Qr,"hx-validate")==="true";if(tn.lastButtonClicked&&(ln=ln&&tn.lastButtonClicked.formNoValidate!==!0),Gr!=="get"&&hr(Wr,Yr,Zr,v(Qr,"form"),ln),hr(Wr,Kr,Zr,Qr,ln),tn.lastButtonClicked||Qr.tagName==="BUTTON"||Qr.tagName==="INPUT"&&ee(Qr,"type")==="submit"){var dn=tn.lastButtonClicked||Qr,yn=ee(dn,"name");cr(yn,dn.value,Yr)}var Sn=me(Qr,"hx-include");return oe(Sn,function(kn){hr(Wr,Kr,Zr,kn,ln),h(kn,"form")||oe(kn.querySelectorAll(rt),function(An){hr(Wr,Kr,Zr,An,ln)})}),Kr=le(Kr,Yr),{errors:Zr,values:Kr}}function gr(Qr,Gr,Wr){Qr!==""&&(Qr+="&"),String(Wr)==="[object Object]"&&(Wr=JSON.stringify(Wr));var Kr=encodeURIComponent(Wr);return Qr+=encodeURIComponent(Gr)+"="+Kr,Qr}function pr(Qr){var Gr="";for(var Wr in Qr)if(Qr.hasOwnProperty(Wr)){var Kr=Qr[Wr];Array.isArray(Kr)?oe(Kr,function(Yr){Gr=gr(Gr,Wr,Yr)}):Gr=gr(Gr,Wr,Kr)}return Gr}function mr(Qr){var Gr=new FormData;for(var Wr in Qr)if(Qr.hasOwnProperty(Wr)){var Kr=Qr[Wr];Array.isArray(Kr)?oe(Kr,function(Yr){Gr.append(Wr,Yr)}):Gr.append(Wr,Kr)}return Gr}function xr(Qr,Gr,Wr){var Kr={"HX-Request":"true","HX-Trigger":ee(Qr,"id"),"HX-Trigger-Name":ee(Qr,"name"),"HX-Target":te(Gr,"id"),"HX-Current-URL":re().location.href};return Rr(Qr,"hx-headers",!1,Kr),Wr!==void 0&&(Kr["HX-Prompt"]=Wr),ae(Qr).boosted&&(Kr["HX-Boosted"]="true"),Kr}function yr(Qr,Gr){var Wr=ne(Gr,"hx-params");if(Wr){if(Wr==="none")return{};if(Wr==="*")return Qr;if(Wr.indexOf("not ")===0)return oe(Wr.substr(4).split(","),function(Yr){Yr=Yr.trim(),delete Qr[Yr]}),Qr;var Kr={};return oe(Wr.split(","),function(Yr){Yr=Yr.trim(),Kr[Yr]=Qr[Yr]}),Kr}else return Qr}function br(Qr){return ee(Qr,"href")&&ee(Qr,"href").indexOf("#")>=0}function wr(Qr,Gr){var Wr=Gr||ne(Qr,"hx-swap"),Kr={swapStyle:ae(Qr).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(Qr).boosted&&!br(Qr)&&(Kr.show="top"),Wr){var Yr=D(Wr);if(Yr.length>0)for(var Zr=0;Zr<Yr.length;Zr++){var tn=Yr[Zr];if(tn.indexOf("swap:")===0)Kr.swapDelay=d(tn.substr(5));else if(tn.indexOf("settle:")===0)Kr.settleDelay=d(tn.substr(7));else if(tn.indexOf("transition:")===0)Kr.transition=tn.substr(11)==="true";else if(tn.indexOf("ignoreTitle:")===0)Kr.ignoreTitle=tn.substr(12)==="true";else if(tn.indexOf("scroll:")===0){var ln=tn.substr(7),dn=ln.split(":"),yn=dn.pop(),Sn=dn.length>0?dn.join(":"):null;Kr.scroll=yn,Kr.scrollTarget=Sn}else if(tn.indexOf("show:")===0){var kn=tn.substr(5),dn=kn.split(":"),An=dn.pop(),Sn=dn.length>0?dn.join(":"):null;Kr.show=An,Kr.showTarget=Sn}else if(tn.indexOf("focus-scroll:")===0){var Bn=tn.substr(13);Kr.focusScroll=Bn=="true"}else Zr==0?Kr.swapStyle=tn:b("Unknown modifier in hx-swap: "+tn)}}return Kr}function Sr(Qr){return ne(Qr,"hx-encoding")==="multipart/form-data"||h(Qr,"form")&&ee(Qr,"enctype")==="multipart/form-data"}function Er(Qr,Gr,Wr){var Kr=null;return R(Gr,function(Yr){Kr==null&&(Kr=Yr.encodeParameters(Qr,Wr,Gr))}),Kr??(Sr(Gr)?mr(Wr):pr(Wr))}function T(Qr){return{tasks:[],elts:[Qr]}}function Cr(Qr,Gr){var Wr=Qr[0],Kr=Qr[Qr.length-1];if(Gr.scroll){var Yr=null;Gr.scrollTarget&&(Yr=ue(Wr,Gr.scrollTarget)),Gr.scroll==="top"&&(Wr||Yr)&&(Yr=Yr||Wr,Yr.scrollTop=0),Gr.scroll==="bottom"&&(Kr||Yr)&&(Yr=Yr||Kr,Yr.scrollTop=Yr.scrollHeight)}if(Gr.show){var Yr=null;if(Gr.showTarget){var Zr=Gr.showTarget;Gr.showTarget==="window"&&(Zr="body"),Yr=ue(Wr,Zr)}Gr.show==="top"&&(Wr||Yr)&&(Yr=Yr||Wr,Yr.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})),Gr.show==="bottom"&&(Kr||Yr)&&(Yr=Yr||Kr,Yr.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior}))}}function Rr(Qr,Gr,Wr,Kr){if(Kr==null&&(Kr={}),Qr==null)return Kr;var Yr=te(Qr,Gr);if(Yr){var Zr=Yr.trim(),tn=Wr;if(Zr==="unset")return null;Zr.indexOf("javascript:")===0?(Zr=Zr.substr(11),tn=!0):Zr.indexOf("js:")===0&&(Zr=Zr.substr(3),tn=!0),Zr.indexOf("{")!==0&&(Zr="{"+Zr+"}");var ln;tn?ln=Tr(Qr,function(){return Function("return ("+Zr+")")()},{}):ln=E(Zr);for(var dn in ln)ln.hasOwnProperty(dn)&&Kr[dn]==null&&(Kr[dn]=ln[dn])}return Rr(u(Qr),Gr,Wr,Kr)}function Tr(Qr,Gr,Wr){return Q.config.allowEval?Gr():(fe(Qr,"htmx:evalDisallowedError"),Wr)}function Or(Qr,Gr){return Rr(Qr,"hx-vars",!0,Gr)}function qr(Qr,Gr){return Rr(Qr,"hx-vals",!1,Gr)}function Hr(Qr){return le(Or(Qr),qr(Qr))}function Lr(Qr,Gr,Wr){if(Wr!==null)try{Qr.setRequestHeader(Gr,Wr)}catch{Qr.setRequestHeader(Gr,encodeURIComponent(Wr)),Qr.setRequestHeader(Gr+"-URI-AutoEncoded","true")}}function Ar(Qr){if(Qr.responseURL&&typeof URL<"u")try{var Gr=new URL(Qr.responseURL);return Gr.pathname+Gr.search}catch{fe(re().body,"htmx:badResponseUrl",{url:Qr.responseURL})}}function O(Qr,Gr){return Gr.test(Qr.getAllResponseHeaders())}function Nr(Qr,Gr,Wr){return Qr=Qr.toLowerCase(),Wr?Wr instanceof Element||I(Wr,"String")?he(Qr,Gr,null,null,{targetOverride:p(Wr),returnPromise:!0}):he(Qr,Gr,p(Wr.source),Wr.event,{handler:Wr.handler,headers:Wr.headers,values:Wr.values,targetOverride:p(Wr.target),swapOverride:Wr.swap,select:Wr.select,returnPromise:!0}):he(Qr,Gr,null,null,{returnPromise:!0})}function Ir(Qr){for(var Gr=[];Qr;)Gr.push(Qr),Qr=Qr.parentElement;return Gr}function kr(Qr,Gr,Wr){var Kr,Yr;if(typeof URL=="function"){Yr=new URL(Gr,document.location.href);var Zr=document.location.origin;Kr=Zr===Yr.origin}else Yr=Gr,Kr=g(Gr,document.location.origin);return Q.config.selfRequestsOnly&&!Kr?!1:ce(Qr,"htmx:validateUrl",le({url:Yr,sameHost:Kr},Wr))}function he(Qr,Gr,Wr,Kr,Yr,Zr){var tn=null,ln=null;if(Yr=Yr??{},Yr.returnPromise&&typeof Promise<"u")var dn=new Promise(function(gn,En){tn=gn,ln=En});Wr==null&&(Wr=re().body);var yn=Yr.handler||Mr,Sn=Yr.select||null;if(!se(Wr))return ie(tn),dn;var kn=Yr.targetOverride||ye(Wr);if(kn==null||kn==pe)return fe(Wr,"htmx:targetError",{target:te(Wr,"hx-target")}),ie(ln),dn;var An=ae(Wr),Bn=An.lastButtonClicked;if(Bn){var jn=ee(Bn,"formaction");jn!=null&&(Gr=jn);var Vn=ee(Bn,"formmethod");Vn!=null&&Vn.toLowerCase()!=="dialog"&&(Qr=Vn)}var ti=ne(Wr,"hx-confirm");if(Zr===void 0){var si=function(gn){return he(Qr,Gr,Wr,Kr,Yr,!!gn)},ri={target:kn,elt:Wr,path:Gr,verb:Qr,triggeringEvent:Kr,etc:Yr,issueRequest:si,question:ti};if(ce(Wr,"htmx:confirm",ri)===!1)return ie(tn),dn}var oi=Wr,Jn=ne(Wr,"hx-sync"),gi=null,li=!1;if(Jn){var Ui=Jn.split(":"),vi=Ui[0].trim();if(vi==="this"?oi=xe(Wr,"hx-sync"):oi=ue(Wr,vi),Jn=(Ui[1]||"drop").trim(),An=ae(oi),Jn==="drop"&&An.xhr&&An.abortable!==!0)return ie(tn),dn;if(Jn==="abort"){if(An.xhr)return ie(tn),dn;li=!0}else if(Jn==="replace")ce(oi,"htmx:abort");else if(Jn.indexOf("queue")===0){var ni=Jn.split(" ");gi=(ni[1]||"last").trim()}}if(An.xhr)if(An.abortable)ce(oi,"htmx:abort");else{if(gi==null){if(Kr){var xn=ae(Kr);xn&&xn.triggerSpec&&xn.triggerSpec.queue&&(gi=xn.triggerSpec.queue)}gi==null&&(gi="last")}return An.queuedRequests==null&&(An.queuedRequests=[]),gi==="first"&&An.queuedRequests.length===0?An.queuedRequests.push(function(){he(Qr,Gr,Wr,Kr,Yr)}):gi==="all"?An.queuedRequests.push(function(){he(Qr,Gr,Wr,Kr,Yr)}):gi==="last"&&(An.queuedRequests=[],An.queuedRequests.push(function(){he(Qr,Gr,Wr,Kr,Yr)})),ie(tn),dn}var en=new XMLHttpRequest;An.xhr=en,An.abortable=li;var an=function(){if(An.xhr=null,An.abortable=!1,An.queuedRequests!=null&&An.queuedRequests.length>0){var gn=An.queuedRequests.shift();gn()}},pn=ne(Wr,"hx-prompt");if(pn){var mn=prompt(pn);if(mn===null||!ce(Wr,"htmx:prompt",{prompt:mn,target:kn}))return ie(tn),an(),dn}if(ti&&!Zr&&!confirm(ti))return ie(tn),an(),dn;var wn=xr(Wr,kn,mn);Qr!=="get"&&!Sr(Wr)&&(wn["Content-Type"]="application/x-www-form-urlencoded"),Yr.headers&&(wn=le(wn,Yr.headers));var vn=dr(Wr,Qr),bn=vn.errors,hn=vn.values;Yr.values&&(hn=le(hn,Yr.values));var On=Hr(Wr),Pn=le(hn,On),Nn=yr(Pn,Wr);Q.config.getCacheBusterParam&&Qr==="get"&&(Nn["org.htmx.cache-buster"]=ee(kn,"id")||"true"),(Gr==null||Gr==="")&&(Gr=re().location.href);var Dn=Rr(Wr,"hx-request"),Ln=ae(Wr).boosted,Fn=Q.config.methodsThatUseUrlParams.indexOf(Qr)>=0,Mn={boosted:Ln,useUrlParams:Fn,parameters:Nn,unfilteredParameters:Pn,headers:wn,target:kn,verb:Qr,errors:bn,withCredentials:Yr.credentials||Dn.credentials||Q.config.withCredentials,timeout:Yr.timeout||Dn.timeout||Q.config.timeout,path:Gr,triggeringEvent:Kr};if(!ce(Wr,"htmx:configRequest",Mn))return ie(tn),an(),dn;if(Gr=Mn.path,Qr=Mn.verb,wn=Mn.headers,Nn=Mn.parameters,bn=Mn.errors,Fn=Mn.useUrlParams,bn&&bn.length>0)return ce(Wr,"htmx:validation:halted",Mn),ie(tn),an(),dn;var Gn=Gr.split("#"),Wn=Gn[0],zn=Gn[1],nn=Gr;if(Fn){nn=Wn;var on=Object.keys(Nn).length!==0;on&&(nn.indexOf("?")<0?nn+="?":nn+="&",nn+=pr(Nn),zn&&(nn+="#"+zn))}if(!kr(Wr,nn,Mn))return fe(Wr,"htmx:invalidPath",Mn),ie(ln),dn;if(en.open(Qr.toUpperCase(),nn,!0),en.overrideMimeType("text/html"),en.withCredentials=Mn.withCredentials,en.timeout=Mn.timeout,!Dn.noHeaders){for(var Jr in wn)if(wn.hasOwnProperty(Jr)){var rn=wn[Jr];Lr(en,Jr,rn)}}var cn={xhr:en,target:kn,requestConfig:Mn,etc:Yr,boosted:Ln,select:Sn,pathInfo:{requestPath:Gr,finalRequestPath:nn,anchor:zn}};if(en.onload=function(){try{var gn=Ir(Wr);if(cn.pathInfo.responsePath=Ar(en),yn(Wr,cn),lr(sn,fn),ce(Wr,"htmx:afterRequest",cn),ce(Wr,"htmx:afterOnLoad",cn),!se(Wr)){for(var En=null;gn.length>0&&En==null;){var Tn=gn.shift();se(Tn)&&(En=Tn)}En&&(ce(En,"htmx:afterRequest",cn),ce(En,"htmx:afterOnLoad",cn))}ie(tn),an()}catch(Rn){throw fe(Wr,"htmx:onLoadError",le({error:Rn},cn)),Rn}},en.onerror=function(){lr(sn,fn),fe(Wr,"htmx:afterRequest",cn),fe(Wr,"htmx:sendError",cn),ie(ln),an()},en.onabort=function(){lr(sn,fn),fe(Wr,"htmx:afterRequest",cn),fe(Wr,"htmx:sendAbort",cn),ie(ln),an()},en.ontimeout=function(){lr(sn,fn),fe(Wr,"htmx:afterRequest",cn),fe(Wr,"htmx:timeout",cn),ie(ln),an()},!ce(Wr,"htmx:beforeRequest",cn))return ie(tn),an(),dn;var sn=or(Wr),fn=sr(Wr);oe(["loadstart","loadend","progress","abort"],function(gn){oe([en,en.upload],function(En){En.addEventListener(gn,function(Tn){ce(Wr,"htmx:xhr:"+gn,{lengthComputable:Tn.lengthComputable,loaded:Tn.loaded,total:Tn.total})})})}),ce(Wr,"htmx:beforeSend",cn);var un=Fn?null:Er(en,Wr,Nn);return en.send(un),dn}function Pr(Qr,Gr){var Wr=Gr.xhr,Kr=null,Yr=null;if(O(Wr,/HX-Push:/i)?(Kr=Wr.getResponseHeader("HX-Push"),Yr="push"):O(Wr,/HX-Push-Url:/i)?(Kr=Wr.getResponseHeader("HX-Push-Url"),Yr="push"):O(Wr,/HX-Replace-Url:/i)&&(Kr=Wr.getResponseHeader("HX-Replace-Url"),Yr="replace"),Kr)return Kr==="false"?{}:{type:Yr,path:Kr};var Zr=Gr.pathInfo.finalRequestPath,tn=Gr.pathInfo.responsePath,ln=ne(Qr,"hx-push-url"),dn=ne(Qr,"hx-replace-url"),yn=ae(Qr).boosted,Sn=null,kn=null;return ln?(Sn="push",kn=ln):dn?(Sn="replace",kn=dn):yn&&(Sn="push",kn=tn||Zr),kn?kn==="false"?{}:(kn==="true"&&(kn=tn||Zr),Gr.pathInfo.anchor&&kn.indexOf("#")===-1&&(kn=kn+"#"+Gr.pathInfo.anchor),{type:Sn,path:kn}):{}}function Mr(Qr,Gr){var Wr=Gr.xhr,Kr=Gr.target,Yr=Gr.etc,Zr=Gr.requestConfig,tn=Gr.select;if(ce(Qr,"htmx:beforeOnLoad",Gr)){if(O(Wr,/HX-Trigger:/i)&&_e(Wr,"HX-Trigger",Qr),O(Wr,/HX-Location:/i)){er();var ln=Wr.getResponseHeader("HX-Location"),dn;ln.indexOf("{")===0&&(dn=E(ln),ln=dn.path,delete dn.path),Nr("GET",ln,dn).then(function(){tr(ln)});return}var yn=O(Wr,/HX-Refresh:/i)&&Wr.getResponseHeader("HX-Refresh")==="true";if(O(Wr,/HX-Redirect:/i)){location.href=Wr.getResponseHeader("HX-Redirect"),yn&&location.reload();return}if(yn){location.reload();return}O(Wr,/HX-Retarget:/i)&&(Wr.getResponseHeader("HX-Retarget")==="this"?Gr.target=Qr:Gr.target=ue(Qr,Wr.getResponseHeader("HX-Retarget")));var Sn=Pr(Qr,Gr),kn=Wr.status>=200&&Wr.status<400&&Wr.status!==204,An=Wr.response,Bn=Wr.status>=400,jn=Q.config.ignoreTitle,Vn=le({shouldSwap:kn,serverResponse:An,isError:Bn,ignoreTitle:jn},Gr);if(ce(Kr,"htmx:beforeSwap",Vn)){if(Kr=Vn.target,An=Vn.serverResponse,Bn=Vn.isError,jn=Vn.ignoreTitle,Gr.target=Kr,Gr.failed=Bn,Gr.successful=!Bn,Vn.shouldSwap){Wr.status===286&&at(Qr),R(Qr,function(vi){An=vi.transformResponse(An,Wr,Qr)}),Sn.type&&er();var ti=Yr.swapOverride;O(Wr,/HX-Reswap:/i)&&(ti=Wr.getResponseHeader("HX-Reswap"));var dn=wr(Qr,ti);dn.hasOwnProperty("ignoreTitle")&&(jn=dn.ignoreTitle),Kr.classList.add(Q.config.swappingClass);var si=null,ri=null,oi=function(){try{var vi=document.activeElement,ni={};try{ni={elt:vi,start:vi?vi.selectionStart:null,end:vi?vi.selectionEnd:null}}catch{}var xn;tn&&(xn=tn),O(Wr,/HX-Reselect:/i)&&(xn=Wr.getResponseHeader("HX-Reselect")),Sn.type&&(ce(re().body,"htmx:beforeHistoryUpdate",le({history:Sn},Gr)),Sn.type==="push"?(tr(Sn.path),ce(re().body,"htmx:pushedIntoHistory",{path:Sn.path})):(rr(Sn.path),ce(re().body,"htmx:replacedInHistory",{path:Sn.path})));var en=T(Kr);if(je(dn.swapStyle,Kr,Qr,An,en,xn),ni.elt&&!se(ni.elt)&&ee(ni.elt,"id")){var an=document.getElementById(ee(ni.elt,"id")),pn={preventScroll:dn.focusScroll!==void 0?!dn.focusScroll:!Q.config.defaultFocusScroll};if(an){if(ni.start&&an.setSelectionRange)try{an.setSelectionRange(ni.start,ni.end)}catch{}an.focus(pn)}}if(Kr.classList.remove(Q.config.swappingClass),oe(en.elts,function(vn){vn.classList&&vn.classList.add(Q.config.settlingClass),ce(vn,"htmx:afterSwap",Gr)}),O(Wr,/HX-Trigger-After-Swap:/i)){var mn=Qr;se(Qr)||(mn=re().body),_e(Wr,"HX-Trigger-After-Swap",mn)}var wn=function(){if(oe(en.tasks,function(On){On.call()}),oe(en.elts,function(On){On.classList&&On.classList.remove(Q.config.settlingClass),ce(On,"htmx:afterSettle",Gr)}),Gr.pathInfo.anchor){var vn=re().getElementById(Gr.pathInfo.anchor);vn&&vn.scrollIntoView({block:"start",behavior:"auto"})}if(en.title&&!jn){var bn=C("title");bn?bn.innerHTML=en.title:window.document.title=en.title}if(Cr(en.elts,dn),O(Wr,/HX-Trigger-After-Settle:/i)){var hn=Qr;se(Qr)||(hn=re().body),_e(Wr,"HX-Trigger-After-Settle",hn)}ie(si)};dn.settleDelay>0?setTimeout(wn,dn.settleDelay):wn()}catch(vn){throw fe(Qr,"htmx:swapError",Gr),ie(ri),vn}},Jn=Q.config.globalViewTransitions;if(dn.hasOwnProperty("transition")&&(Jn=dn.transition),Jn&&ce(Qr,"htmx:beforeTransition",Gr)&&typeof Promise<"u"&&document.startViewTransition){var gi=new Promise(function(vi,ni){si=vi,ri=ni}),li=oi;oi=function(){document.startViewTransition(function(){return li(),gi})}}dn.swapDelay>0?setTimeout(oi,dn.swapDelay):oi()}Bn&&fe(Qr,"htmx:responseError",le({error:"Response Status Error Code "+Wr.status+" from "+Gr.pathInfo.requestPath},Gr))}}}var Xr={};function Dr(){return{init:function(Qr){return null},onEvent:function(Qr,Gr){return!0},transformResponse:function(Qr,Gr,Wr){return Qr},isInlineSwap:function(Qr){return!1},handleSwap:function(Qr,Gr,Wr,Kr){return!1},encodeParameters:function(Qr,Gr,Wr){return null}}}function Ur(Qr,Gr){Gr.init&&Gr.init(r),Xr[Qr]=le(Dr(),Gr)}function Br(Qr){delete Xr[Qr]}function Fr(Qr,Gr,Wr){if(Qr==null)return Gr;Gr==null&&(Gr=[]),Wr==null&&(Wr=[]);var Kr=te(Qr,"hx-ext");return Kr&&oe(Kr.split(","),function(Yr){if(Yr=Yr.replace(/ /g,""),Yr.slice(0,7)=="ignore:"){Wr.push(Yr.slice(7));return}if(Wr.indexOf(Yr)<0){var Zr=Xr[Yr];Zr&&Gr.indexOf(Zr)<0&&Gr.push(Zr)}}),Fr(u(Qr),Gr,Wr)}var Vr=!1;re().addEventListener("DOMContentLoaded",function(){Vr=!0});function jr(Qr){Vr||re().readyState==="complete"?Qr():re().addEventListener("DOMContentLoaded",Qr)}function _r(){Q.config.includeIndicatorStyles!==!1&&re().head.insertAdjacentHTML("beforeend","<style> ."+Q.config.indicatorClass+"{opacity:0} ."+Q.config.requestClass+" ."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+Q.config.requestClass+"."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} </style>")}function zr(){var Qr=re().querySelector('meta[name="htmx-config"]');return Qr?E(Qr.content):null}function $r(){var Qr=zr();Qr&&(Q.config=le(Q.config,Qr))}return jr(function(){$r(),_r();var Qr=re().body;zt(Qr);var Gr=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");Qr.addEventListener("htmx:abort",function(Kr){var Yr=Kr.target,Zr=ae(Yr);Zr&&Zr.xhr&&Zr.xhr.abort()});let Wr=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(Kr){Kr.state&&Kr.state.htmx?(ar(),oe(Gr,function(Yr){ce(Yr,"htmx:restored",{document:re(),triggerEvent:ce})})):Wr&&Wr(Kr)},setTimeout(function(){ce(Qr,"htmx:load",{}),Qr=null},0)}),Q}()})});var is=Ys((go,$s)=>{(function(Qr,Gr){let Wr=Gr(Qr);typeof go=="object"&&typeof go.nodeName!="string"?$s.exports=Wr:(Qr._hyperscript=Wr,"document"in Qr&&Qr._hyperscript.browserInit())})(typeof self<"u"?self:go,Qr=>{"use strict";let Gr={dynamicResolvers:[function(xn,en){if(xn==="Fixed")return Number(en).toFixed();if(xn.indexOf("Fixed:")===0){let an=xn.split(":")[1];return Number(en).toFixed(parseInt(an))}}],String:function(xn){return xn.toString?xn.toString():""+xn},Int:function(xn){return parseInt(xn)},Float:function(xn){return parseFloat(xn)},Number:function(xn){return Number(xn)},Date:function(xn){return new Date(xn)},Array:function(xn){return Array.from(xn)},JSON:function(xn){return JSON.stringify(xn)},Object:function(xn){return xn instanceof String&&(xn=xn.toString()),typeof xn=="string"?JSON.parse(xn):Object.assign({},xn)}},Wr={attributes:"_, script, data-script",defaultTransition:"all 500ms ease-in",disableSelector:"[disable-scripting], [data-disable-scripting]",hideShowStrategies:{},conversions:Gr};class Kr{static OP_TABLE={"+":"PLUS","-":"MINUS","*":"MULTIPLY","/":"DIVIDE",".":"PERIOD","..":"ELLIPSIS","\\":"BACKSLASH",":":"COLON","%":"PERCENT","|":"PIPE","!":"EXCLAMATION","?":"QUESTION","#":"POUND","&":"AMPERSAND",$:"DOLLAR",";":"SEMI",",":"COMMA","(":"L_PAREN",")":"R_PAREN","<":"L_ANG",">":"R_ANG","<=":"LTE_ANG",">=":"GTE_ANG","==":"EQ","===":"EQQ","!=":"NEQ","!==":"NEQQ","{":"L_BRACE","}":"R_BRACE","[":"L_BRACKET","]":"R_BRACKET","=":"EQUALS","~":"TILDE"};static isValidCSSClassChar(en){return Kr.isAlpha(en)||Kr.isNumeric(en)||en==="-"||en==="_"||en===":"}static isValidCSSIDChar(en){return Kr.isAlpha(en)||Kr.isNumeric(en)||en==="-"||en==="_"||en===":"}static isWhitespace(en){return en===" "||en===" "||Kr.isNewline(en)}static positionString(en){return"[Line: "+en.line+", Column: "+en.column+"]"}static isNewline(en){return en==="\r"||en===` 3 + `}static isNumeric(en){return en>="0"&&en<="9"}static isAlpha(en){return en>="a"&&en<="z"||en>="A"&&en<="Z"}static isIdentifierChar(en,an){return en==="_"||en==="$"}static isReservedChar(en){return en==="`"||en==="^"}static isValidSingleQuoteStringStart(en){if(en.length>0){var an=en[en.length-1];if(an.type==="IDENTIFIER"||an.type==="CLASS_REF"||an.type==="ID_REF"||an.op&&(an.value===">"||an.value===")"))return!1}return!0}static tokenize(en,an){var pn=[],mn=en,wn=0,vn=0,bn=1,hn="<START>",On=0;function Pn(){return an&&On===0}for(;wn<mn.length;)if(un()==="-"&&gn()==="-"&&(Kr.isWhitespace(En(2))||En(2)===""||En(2)==="-")||un()==="/"&&gn()==="/"&&(Kr.isWhitespace(En(2))||En(2)===""||En(2)==="/"))Ln();else if(un()==="/"&&gn()==="*"&&(Kr.isWhitespace(En(2))||En(2)===""||En(2)==="*"))Fn();else if(Kr.isWhitespace(un()))pn.push(Hn());else if(!Rn()&&un()==="."&&(Kr.isAlpha(gn())||gn()==="{"||gn()==="-"))pn.push(Mn());else if(!Rn()&&un()==="#"&&(Kr.isAlpha(gn())||gn()==="{"))pn.push(nn());else if(un()==="["&&gn()==="@")pn.push(Gn());else if(un()==="@")pn.push(Wn());else if(un()==="*"&&Kr.isAlpha(gn()))pn.push(zn());else if(Pn()&&(Kr.isAlpha(un())||un()==="\\"))pn.push(on());else if(!Pn()&&(Kr.isAlpha(un())||Kr.isIdentifierChar(un())))pn.push(Jr());else if(Kr.isNumeric(un()))pn.push(rn());else if(!Pn()&&(un()==='"'||un()==="`"))pn.push(sn());else if(!Pn()&&un()==="'")Kr.isValidSingleQuoteStringStart(pn)?pn.push(sn()):pn.push(cn());else if(Kr.OP_TABLE[un()])hn==="$"&&un()==="{"&&On++,un()==="}"&&On--,pn.push(cn());else if(Pn()||Kr.isReservedChar(un()))pn.push(Dn("RESERVED",Tn()));else if(wn<mn.length)throw Error("Unknown token: "+un()+" ");return new Yr(pn,[],mn);function Nn(Cn,In){var _n=Dn(Cn,In);return _n.op=!0,_n}function Dn(Cn,In){return{type:Cn,value:In||"",start:wn,end:wn+1,column:vn,line:bn}}function Ln(){for(;un()&&!Kr.isNewline(un());)Tn();Tn()}function Fn(){for(;un()&&!(un()==="*"&&gn()==="/");)Tn();Tn(),Tn()}function Mn(){var Cn=Dn("CLASS_REF"),In=Tn();if(un()==="{"){for(Cn.template=!0,In+=Tn();un()&&un()!=="}";)In+=Tn();if(un()!=="}")throw Error("Unterminated class reference");In+=Tn()}else for(;Kr.isValidCSSClassChar(un())||un()==="\\";)un()==="\\"&&Tn(),In+=Tn();return Cn.value=In,Cn.end=wn,Cn}function Gn(){for(var Cn=Dn("ATTRIBUTE_REF"),In=Tn();wn<mn.length&&un()!=="]";)In+=Tn();return un()==="]"&&(In+=Tn()),Cn.value=In,Cn.end=wn,Cn}function Wn(){for(var Cn=Dn("ATTRIBUTE_REF"),In=Tn();Kr.isValidCSSIDChar(un());)In+=Tn();if(un()==="="){if(In+=Tn(),un()==='"'||un()==="'"){let _n=sn();In+=_n.value}else if(Kr.isAlpha(un())||Kr.isNumeric(un())||Kr.isIdentifierChar(un())){let _n=Jr();In+=_n.value}}return Cn.value=In,Cn.end=wn,Cn}function zn(){for(var Cn=Dn("STYLE_REF"),In=Tn();Kr.isAlpha(un())||un()==="-";)In+=Tn();return Cn.value=In,Cn.end=wn,Cn}function nn(){var Cn=Dn("ID_REF"),In=Tn();if(un()==="{"){for(Cn.template=!0,In+=Tn();un()&&un()!=="}";)In+=Tn();if(un()!=="}")throw Error("Unterminated id reference");Tn()}else for(;Kr.isValidCSSIDChar(un());)In+=Tn();return Cn.value=In,Cn.end=wn,Cn}function on(){var Cn=Dn("IDENTIFIER"),In=Tn(),_n=In==="\\";for(_n&&(In="");(Kr.isAlpha(un())||Kr.isNumeric(un())||Kr.isIdentifierChar(un())||un()==="\\"||un()==="{"||un()==="}")&&!(un()==="$"&&_n===!1);)un()==="\\"?(_n=!0,Tn()):(_n=!1,In+=Tn());return un()==="!"&&In==="beep"&&(In+=Tn()),Cn.value=In,Cn.end=wn,Cn}function Jr(){for(var Cn=Dn("IDENTIFIER"),In=Tn();Kr.isAlpha(un())||Kr.isNumeric(un())||Kr.isIdentifierChar(un());)In+=Tn();return un()==="!"&&In==="beep"&&(In+=Tn()),Cn.value=In,Cn.end=wn,Cn}function rn(){for(var Cn=Dn("NUMBER"),In=Tn();Kr.isNumeric(un());)In+=Tn();for(un()==="."&&Kr.isNumeric(gn())&&(In+=Tn());Kr.isNumeric(un());)In+=Tn();for((un()==="e"||un()==="E")&&(Kr.isNumeric(gn())?In+=Tn():gn()==="-"&&(In+=Tn(),In+=Tn()));Kr.isNumeric(un());)In+=Tn();return Cn.value=In,Cn.end=wn,Cn}function cn(){for(var Cn=Nn(),In=Tn();un()&&Kr.OP_TABLE[In+un()];)In+=Tn();return Cn.type=Kr.OP_TABLE[In],Cn.value=In,Cn.end=wn,Cn}function sn(){var Cn=Dn("STRING"),In=Tn();Cn.template=In==="`";for(var _n="";un()&&un()!==In;)if(un()==="\\"){Tn();let Un=Tn();if(Un==="b")_n+="\b";else if(Un==="f")_n+="\f";else if(Un==="n")_n+=` 4 + `;else if(Un==="r")_n+="\r";else if(Un==="t")_n+=" ";else if(Un==="v")_n+="\v";else if(Cn.template&&Un==="$")_n+="\\$";else if(Un==="x"){let ii=fn();if(Number.isNaN(ii))throw Error("Invalid hexadecimal escape at "+Kr.positionString(Cn));_n+=String.fromCharCode(ii)}else _n+=Un}else _n+=Tn();if(un()!==In)throw Error("Unterminated string at "+Kr.positionString(Cn));return Tn(),Cn.value=_n,Cn.end=wn,Cn}function fn(){if(!un())return NaN;let In=16*Number.parseInt(Tn(),16);return un()?(In+=Number.parseInt(Tn(),16),In):NaN}function un(){return mn.charAt(wn)}function gn(){return mn.charAt(wn+1)}function En(Cn=1){return mn.charAt(wn+Cn)}function Tn(){return hn=un(),wn++,vn++,hn}function Rn(){return Kr.isAlpha(hn)||Kr.isNumeric(hn)||hn===")"||hn==='"'||hn==="'"||hn==="`"||hn==="}"||hn==="]"}function Hn(){for(var Cn=Dn("WHITESPACE"),In="";un()&&Kr.isWhitespace(un());)Kr.isNewline(un())&&(vn=0,bn++),In+=Tn();return Cn.value=In,Cn.end=wn,Cn}}tokenize(en,an){return Kr.tokenize(en,an)}}class Yr{constructor(en,an,pn){this.tokens=en,this.consumed=an,this.source=pn,this.consumeWhitespace()}get list(){return this.tokens}_lastConsumed=null;consumeWhitespace(){for(;this.token(0,!0).type==="WHITESPACE";)this.consumed.push(this.tokens.shift())}raiseError(en,an){Zr.raiseParseError(en,an)}requireOpToken(en){var an=this.matchOpToken(en);if(an)return an;this.raiseError(this,"Expected '"+en+"' but found '"+this.currentToken().value+"'")}matchAnyOpToken(en,an,pn){for(var mn=0;mn<arguments.length;mn++){var wn=arguments[mn],vn=this.matchOpToken(wn);if(vn)return vn}}matchAnyToken(en,an,pn){for(var mn=0;mn<arguments.length;mn++){var wn=arguments[mn],vn=this.matchToken(wn);if(vn)return vn}}matchOpToken(en){if(this.currentToken()&&this.currentToken().op&&this.currentToken().value===en)return this.consumeToken()}requireTokenType(en,an,pn,mn){var wn=this.matchTokenType(en,an,pn,mn);if(wn)return wn;this.raiseError(this,"Expected one of "+JSON.stringify([en,an,pn]))}matchTokenType(en,an,pn,mn){if(this.currentToken()&&this.currentToken().type&&[en,an,pn,mn].indexOf(this.currentToken().type)>=0)return this.consumeToken()}requireToken(en,an){var pn=this.matchToken(en,an);if(pn)return pn;this.raiseError(this,"Expected '"+en+"' but found '"+this.currentToken().value+"'")}peekToken(en,an,pn){if(an=an||0,pn=pn||"IDENTIFIER",this.tokens[an]&&this.tokens[an].value===en&&this.tokens[an].type===pn)return this.tokens[an]}matchToken(en,an){if(this.follows.indexOf(en)===-1&&(an=an||"IDENTIFIER",this.currentToken()&&this.currentToken().value===en&&this.currentToken().type===an))return this.consumeToken()}consumeToken(){var en=this.tokens.shift();return this.consumed.push(en),this._lastConsumed=en,this.consumeWhitespace(),en}consumeUntil(en,an){for(var pn=[],mn=this.token(0,!0);(an==null||mn.type!==an)&&(en==null||mn.value!==en)&&mn.type!=="EOF";){var wn=this.tokens.shift();this.consumed.push(wn),pn.push(mn),mn=this.token(0,!0)}return this.consumeWhitespace(),pn}lastWhitespace(){return this.consumed[this.consumed.length-1]&&this.consumed[this.consumed.length-1].type==="WHITESPACE"?this.consumed[this.consumed.length-1].value:""}consumeUntilWhitespace(){return this.consumeUntil(null,"WHITESPACE")}hasMore(){return this.tokens.length>0}token(en,an){var pn,mn=0;do{if(!an)for(;this.tokens[mn]&&this.tokens[mn].type==="WHITESPACE";)mn++;pn=this.tokens[mn],en--,mn++}while(en>-1);return pn||{type:"EOF",value:"<<<EOF>>>"}}currentToken(){return this.token(0)}lastMatch(){return this._lastConsumed}static sourceFor=function(){return this.programSource.substring(this.startToken.start,this.endToken.end)};static lineFor=function(){return this.programSource.split(` 5 + `)[this.startToken.line-1]};follows=[];pushFollow(en){this.follows.push(en)}popFollow(){this.follows.pop()}clearFollows(){var en=this.follows;return this.follows=[],en}restoreFollows(en){this.follows=en}}class Zr{constructor(en){this.runtime=en,this.possessivesDisabled=!1,this.addGrammarElement("feature",function(an,pn,mn){if(mn.matchOpToken("(")){var wn=an.requireElement("feature",mn);return mn.requireOpToken(")"),wn}var vn=an.FEATURES[mn.currentToken().value||""];if(vn)return vn(an,pn,mn)}),this.addGrammarElement("command",function(an,pn,mn){if(mn.matchOpToken("(")){let bn=an.requireElement("command",mn);return mn.requireOpToken(")"),bn}var wn=an.COMMANDS[mn.currentToken().value||""];let vn;return wn?vn=wn(an,pn,mn):mn.currentToken().type==="IDENTIFIER"&&(vn=an.parseElement("pseudoCommand",mn)),vn&&an.parseElement("indirectStatement",mn,vn)}),this.addGrammarElement("commandList",function(an,pn,mn){if(mn.hasMore()){var wn=an.parseElement("command",mn);if(wn){mn.matchToken("then");let vn=an.parseElement("commandList",mn);return vn&&(wn.next=vn),wn}}return{type:"emptyCommandListCommand",op:function(vn){return pn.findNext(this,vn)},execute:function(vn){return pn.unifiedExec(this,vn)}}}),this.addGrammarElement("leaf",function(an,pn,mn){var wn=an.parseAnyOf(an.LEAF_EXPRESSIONS,mn);return wn??an.parseElement("symbol",mn)}),this.addGrammarElement("indirectExpression",function(an,pn,mn,wn){for(var vn=0;vn<an.INDIRECT_EXPRESSIONS.length;vn++){var bn=an.INDIRECT_EXPRESSIONS[vn];wn.endToken=mn.lastMatch();var hn=an.parseElement(bn,mn,wn);if(hn)return hn}return wn}),this.addGrammarElement("indirectStatement",function(an,pn,mn,wn){if(mn.matchToken("unless")){wn.endToken=mn.lastMatch();var vn=an.requireElement("expression",mn),bn={type:"unlessStatementModifier",args:[vn],op:function(hn,On){return On?this.next:wn},execute:function(hn){return pn.unifiedExec(this,hn)}};return wn.parent=bn,bn}return wn}),this.addGrammarElement("primaryExpression",function(an,pn,mn){var wn=an.parseElement("leaf",mn);if(wn)return an.parseElement("indirectExpression",mn,wn);an.raiseParseError(mn,"Unexpected value: "+mn.currentToken().value)})}use(en){return en(this),this}GRAMMAR={};COMMANDS={};FEATURES={};LEAF_EXPRESSIONS=[];INDIRECT_EXPRESSIONS=[];initElt(en,an,pn){en.startToken=an,en.sourceFor=Yr.sourceFor,en.lineFor=Yr.lineFor,en.programSource=pn.source}parseElement(en,an,pn=void 0){var mn=this.GRAMMAR[en];if(mn){var wn=an.currentToken(),vn=mn(this,this.runtime,an,pn);if(vn){this.initElt(vn,wn,an),vn.endToken=vn.endToken||an.lastMatch();for(var pn=vn.root;pn!=null;)this.initElt(pn,wn,an),pn=pn.root}return vn}}requireElement(en,an,pn,mn){var wn=this.parseElement(en,an,mn);return wn||Zr.raiseParseError(an,pn||"Expected "+en),wn}parseAnyOf(en,an){for(var pn=0;pn<en.length;pn++){var mn=en[pn],wn=this.parseElement(mn,an);if(wn)return wn}}addGrammarElement(en,an){this.GRAMMAR[en]=an}addCommand(en,an){var pn=en+"Command",mn=function(wn,vn,bn){let hn=an(wn,vn,bn);if(hn)return hn.type=pn,hn.execute=function(On){return On.meta.command=hn,vn.unifiedExec(this,On)},hn};this.GRAMMAR[pn]=mn,this.COMMANDS[en]=mn}addFeature(en,an){var pn=en+"Feature",mn=function(wn,vn,bn){var hn=an(wn,vn,bn);if(hn)return hn.isFeature=!0,hn.keyword=en,hn.type=pn,hn};this.GRAMMAR[pn]=mn,this.FEATURES[en]=mn}addLeafExpression(en,an){this.LEAF_EXPRESSIONS.push(en),this.addGrammarElement(en,an)}addIndirectExpression(en,an){this.INDIRECT_EXPRESSIONS.push(en),this.addGrammarElement(en,an)}static createParserContext(en){var an=en.currentToken(),pn=en.source,mn=pn.split(` 6 + `),wn=an&&an.line?an.line-1:mn.length-1,vn=mn[wn],bn=an&&an.line?an.column:vn.length-1;return vn+` 7 7 `+" ".repeat(bn)+`^^ 8 8 9 9 `}static raiseParseError(en,an){an=(an||"Unexpected Token : "+en.currentToken().value)+` 10 10 11 - `+Zr.createParserContext(en);var pn=new Error(an);throw pn.tokens=en,pn}raiseParseError(en,an){Zr.raiseParseError(en,an)}parseHyperScript(en){var an=this.parseElement("hyperscript",en);if(en.hasMore()&&this.raiseParseError(en),an)return an}setParent(en,an){typeof en=="object"&&(en.parent=an,typeof an=="object"&&(an.children=an.children||new Set,an.children.add(en)),this.setParent(en.next,an))}commandStart(en){return this.COMMANDS[en.value||""]}featureStart(en){return this.FEATURES[en.value||""]}commandBoundary(en){return!!(en.value=="end"||en.value=="then"||en.value=="else"||en.value=="otherwise"||en.value==")"||this.commandStart(en)||this.featureStart(en)||en.type=="EOF")}parseStringTemplate(en){var an=[""];do if(an.push(en.lastWhitespace()),en.currentToken().value==="$"){en.consumeToken();var pn=en.matchOpToken("{");an.push(this.requireElement("expression",en)),pn&&en.requireOpToken("}"),an.push("")}else if(en.currentToken().value==="\\")en.consumeToken(),en.consumeToken();else{var mn=en.consumeToken();an[an.length-1]+=mn?mn.value:""}while(en.hasMore());return an.push(en.lastWhitespace()),an}ensureTerminated(en){let an=this.runtime;for(var pn={type:"implicitReturn",op:function(Sn){return Sn.meta.returned=!0,Sn.meta.resolve&&Sn.meta.resolve(),an.HALT},execute:function(Sn){}},mn=en;mn.next;)mn=mn.next;mn.next=pn}}class tn{constructor(en,an){this.lexer=en??new Kr,this.parser=an??new Zr(this).use(fi).use(oi),this.parser.runtime=this}matchesSelector(en,an){var pn=en.matches||en.matchesSelector||en.msMatchesSelector||en.mozMatchesSelector||en.webkitMatchesSelector||en.oMatchesSelector;return pn&&pn.call(en,an)}makeEvent(en,an){var pn;return Qr.Event&&typeof Qr.Event=="function"?(pn=new Event(en,{bubbles:!0,cancelable:!0,composed:!0}),pn.detail=an):(pn=document.createEvent("CustomEvent"),pn.initCustomEvent(en,!0,!0,an)),pn}triggerEvent(en,an,pn,mn){pn=pn||{},pn.sender=mn;var Sn=this.makeEvent(an,pn),vn=en.dispatchEvent(Sn);return vn}isArrayLike(en){return Array.isArray(en)||typeof NodeList<"u"&&(en instanceof NodeList||en instanceof HTMLCollection||en instanceof FileList)}isIterable(en){return typeof en=="object"&&Symbol.iterator in en&&typeof en[Symbol.iterator]=="function"}shouldAutoIterate(en){return en!=null&&en[Gn]||this.isArrayLike(en)}forEach(en,an){if(en!=null)if(this.isIterable(en))for(let mn of en)an(mn);else if(this.isArrayLike(en))for(var pn=0;pn<en.length;pn++)an(en[pn]);else an(en)}implicitLoop(en,an){if(this.shouldAutoIterate(en))for(let pn of en)an(pn);else an(en)}wrapArrays(en){for(var an=[],pn=0;pn<en.length;pn++){var mn=en[pn];Array.isArray(mn)?an.push(Promise.all(mn)):an.push(mn)}return an}unwrapAsyncs(en){for(var an=0;an<en.length;an++){var pn=en[an];if(pn.asyncWrapper&&(en[an]=pn.value),Array.isArray(pn))for(var mn=0;mn<pn.length;mn++){var Sn=pn[mn];Sn.asyncWrapper&&(pn[mn]=Sn.value)}}}static HALT={};HALT=tn.HALT;unifiedExec(en,an){for(;;){try{var pn=this.unifiedEval(en,an)}catch(mn){if(an.meta.handlingFinally)console.error(" Exception in finally block: ",mn),pn=tn.HALT;else if(this.registerHyperTrace(an,mn),an.meta.errorHandler&&!an.meta.handlingError){an.meta.handlingError=!0,an.locals[an.meta.errorSymbol]=mn,en=an.meta.errorHandler;continue}else an.meta.currentException=mn,pn=tn.HALT}if(pn==null){console.error(en," did not return a next element to execute! context: ",an);return}else if(pn.then){pn.then(mn=>{this.unifiedExec(mn,an)}).catch(mn=>{this.unifiedExec({op:function(){throw mn}},an)});return}else if(pn===tn.HALT)if(an.meta.finallyHandler&&!an.meta.handlingFinally)an.meta.handlingFinally=!0,en=an.meta.finallyHandler;else if(an.meta.onHalt&&an.meta.onHalt(),an.meta.currentException)if(an.meta.reject){an.meta.reject(an.meta.currentException);return}else throw an.meta.currentException;else return;else en=pn}}unifiedEval(en,an,pn){var mn=[an],Sn=!1,vn=!1;if(en.args)for(var bn=0;bn<en.args.length;bn++){var hn=en.args[bn];if(hn==null)mn.push(null);else if(Array.isArray(hn)){for(var On=[],Pn=0;Pn<hn.length;Pn++){var Nn=hn[Pn],Dn=Nn?Nn.evaluate(an):null;Dn&&(Dn.then?Sn=!0:Dn.asyncWrapper&&(vn=!0)),On.push(Dn)}mn.push(On)}else if(hn.evaluate){var Dn=hn.evaluate(an);if(Dn&&(Dn.then?Sn=!0:Dn.asyncWrapper&&(vn=!0)),mn.push(Dn),Dn){if(pn===!0)break}else if(pn===!1)break}else mn.push(hn)}return Sn?new Promise((Ln,Fn)=>{mn=this.wrapArrays(mn),Promise.all(mn).then(function(Mn){vn&&this.unwrapAsyncs(Mn);try{var Hn=en.op.apply(en,Mn);Ln(Hn)}catch(Wn){Fn(Wn)}}).catch(function(Mn){Fn(Mn)})}):(vn&&this.unwrapAsyncs(mn),en.op.apply(en,mn))}_scriptAttrs=null;getScriptAttributes(){return this._scriptAttrs==null&&(this._scriptAttrs=Wr.attributes.replace(/ /g,"").split(",")),this._scriptAttrs}getScript(en){for(var an=0;an<this.getScriptAttributes().length;an++){var pn=this.getScriptAttributes()[an];if(en.hasAttribute&&en.hasAttribute(pn))return en.getAttribute(pn)}return en instanceof HTMLScriptElement&&en.type==="text/hyperscript"?en.innerText:null}hyperscriptFeaturesMap=new WeakMap;getHyperscriptFeatures(en){var an=this.hyperscriptFeaturesMap.get(en);return typeof an>"u"&&en&&this.hyperscriptFeaturesMap.set(en,an={}),an}addFeatures(en,an){en&&(Object.assign(an.locals,this.getHyperscriptFeatures(en)),this.addFeatures(en.parentElement,an))}makeContext(en,an,pn,mn){return new kn(en,an,pn,mn,this)}getScriptSelector(){return this.getScriptAttributes().map(function(en){return"["+en+"]"}).join(", ")}convertValue(en,an){for(var pn=Gr.dynamicResolvers,mn=0;mn<pn.length;mn++){var Sn=pn[mn],vn=Sn(an,en);if(vn!==void 0)return vn}if(en==null)return null;var bn=Gr[an];if(bn)return bn(en);throw"Unknown conversion : "+an}parse(en){let an=this.lexer,pn=this.parser;var mn=an.tokenize(en);if(this.parser.commandStart(mn.currentToken())){var Sn=pn.requireElement("commandList",mn);return mn.hasMore()&&pn.raiseParseError(mn),pn.ensureTerminated(Sn),Sn}else if(pn.featureStart(mn.currentToken())){var vn=pn.requireElement("hyperscript",mn);return mn.hasMore()&&pn.raiseParseError(mn),vn}else{var bn=pn.requireElement("expression",mn);return mn.hasMore()&&pn.raiseParseError(mn),bn}}evaluateNoPromise(en,an){let pn=en.evaluate(an);if(pn.next)throw new Error(Yr.sourceFor.call(en)+" returned a Promise in a context that they are not allowed.");return pn}evaluate(en,an,pn){class mn extends EventTarget{constructor(On){super(),this.module=On}toString(){return this.module.id}}var Sn="document"in Qr?Qr.document.body:new mn(pn&&pn.module);an=Object.assign(this.makeContext(Sn,null,Sn,null),an||{});var vn=this.parse(en);if(vn.execute)return vn.execute(an),typeof an.meta.returnValue<"u"?an.meta.returnValue:an.result;return vn.apply?(vn.apply(Sn,Sn,pn),this.getHyperscriptFeatures(Sn)):vn.evaluate(an);function bn(){return{}}}processNode(en){var an=this.getScriptSelector();this.matchesSelector(en,an)&&this.initElement(en,en),en instanceof HTMLScriptElement&&en.type==="text/hyperscript"&&this.initElement(en,document.body),en.querySelectorAll&&this.forEach(en.querySelectorAll(an+", [type='text/hyperscript']"),pn=>{this.initElement(pn,pn instanceof HTMLScriptElement&&pn.type==="text/hyperscript"?document.body:pn)})}initElement(en,an){if(!(en.closest&&en.closest(Wr.disableSelector))){var pn=this.getInternalData(en);if(!pn.initialized){var mn=this.getScript(en);if(mn)try{pn.initialized=!0,pn.script=mn;let bn=this.lexer,hn=this.parser;var Sn=bn.tokenize(mn),vn=hn.parseHyperScript(Sn);if(!vn)return;vn.apply(an||en,en),setTimeout(()=>{this.triggerEvent(an||en,"load",{hyperscript:!0})},1)}catch(bn){this.triggerEvent(en,"exception",{error:bn}),console.error("hyperscript errors were found on the following element:",en,` 11 + `+Zr.createParserContext(en);var pn=new Error(an);throw pn.tokens=en,pn}raiseParseError(en,an){Zr.raiseParseError(en,an)}parseHyperScript(en){var an=this.parseElement("hyperscript",en);if(en.hasMore()&&this.raiseParseError(en),an)return an}setParent(en,an){typeof en=="object"&&(en.parent=an,typeof an=="object"&&(an.children=an.children||new Set,an.children.add(en)),this.setParent(en.next,an))}commandStart(en){return this.COMMANDS[en.value||""]}featureStart(en){return this.FEATURES[en.value||""]}commandBoundary(en){return!!(en.value=="end"||en.value=="then"||en.value=="else"||en.value=="otherwise"||en.value==")"||this.commandStart(en)||this.featureStart(en)||en.type=="EOF")}parseStringTemplate(en){var an=[""];do if(an.push(en.lastWhitespace()),en.currentToken().value==="$"){en.consumeToken();var pn=en.matchOpToken("{");an.push(this.requireElement("expression",en)),pn&&en.requireOpToken("}"),an.push("")}else if(en.currentToken().value==="\\")en.consumeToken(),en.consumeToken();else{var mn=en.consumeToken();an[an.length-1]+=mn?mn.value:""}while(en.hasMore());return an.push(en.lastWhitespace()),an}ensureTerminated(en){let an=this.runtime;for(var pn={type:"implicitReturn",op:function(wn){return wn.meta.returned=!0,wn.meta.resolve&&wn.meta.resolve(),an.HALT},execute:function(wn){}},mn=en;mn.next;)mn=mn.next;mn.next=pn}}class tn{constructor(en,an){this.lexer=en??new Kr,this.parser=an??new Zr(this).use(ri).use(oi),this.parser.runtime=this}matchesSelector(en,an){var pn=en.matches||en.matchesSelector||en.msMatchesSelector||en.mozMatchesSelector||en.webkitMatchesSelector||en.oMatchesSelector;return pn&&pn.call(en,an)}makeEvent(en,an){var pn;return Qr.Event&&typeof Qr.Event=="function"?(pn=new Event(en,{bubbles:!0,cancelable:!0,composed:!0}),pn.detail=an):(pn=document.createEvent("CustomEvent"),pn.initCustomEvent(en,!0,!0,an)),pn}triggerEvent(en,an,pn,mn){pn=pn||{},pn.sender=mn;var wn=this.makeEvent(an,pn),vn=en.dispatchEvent(wn);return vn}isArrayLike(en){return Array.isArray(en)||typeof NodeList<"u"&&(en instanceof NodeList||en instanceof HTMLCollection||en instanceof FileList)}isIterable(en){return typeof en=="object"&&Symbol.iterator in en&&typeof en[Symbol.iterator]=="function"}shouldAutoIterate(en){return en!=null&&en[Bn]||this.isArrayLike(en)}forEach(en,an){if(en!=null)if(this.isIterable(en))for(let mn of en)an(mn);else if(this.isArrayLike(en))for(var pn=0;pn<en.length;pn++)an(en[pn]);else an(en)}implicitLoop(en,an){if(this.shouldAutoIterate(en))for(let pn of en)an(pn);else an(en)}wrapArrays(en){for(var an=[],pn=0;pn<en.length;pn++){var mn=en[pn];Array.isArray(mn)?an.push(Promise.all(mn)):an.push(mn)}return an}unwrapAsyncs(en){for(var an=0;an<en.length;an++){var pn=en[an];if(pn.asyncWrapper&&(en[an]=pn.value),Array.isArray(pn))for(var mn=0;mn<pn.length;mn++){var wn=pn[mn];wn.asyncWrapper&&(pn[mn]=wn.value)}}}static HALT={};HALT=tn.HALT;unifiedExec(en,an){for(;;){try{var pn=this.unifiedEval(en,an)}catch(mn){if(an.meta.handlingFinally)console.error(" Exception in finally block: ",mn),pn=tn.HALT;else if(this.registerHyperTrace(an,mn),an.meta.errorHandler&&!an.meta.handlingError){an.meta.handlingError=!0,an.locals[an.meta.errorSymbol]=mn,en=an.meta.errorHandler;continue}else an.meta.currentException=mn,pn=tn.HALT}if(pn==null){console.error(en," did not return a next element to execute! context: ",an);return}else if(pn.then){pn.then(mn=>{this.unifiedExec(mn,an)}).catch(mn=>{this.unifiedExec({op:function(){throw mn}},an)});return}else if(pn===tn.HALT)if(an.meta.finallyHandler&&!an.meta.handlingFinally)an.meta.handlingFinally=!0,en=an.meta.finallyHandler;else if(an.meta.onHalt&&an.meta.onHalt(),an.meta.currentException)if(an.meta.reject){an.meta.reject(an.meta.currentException);return}else throw an.meta.currentException;else return;else en=pn}}unifiedEval(en,an,pn){var mn=[an],wn=!1,vn=!1;if(en.args)for(var bn=0;bn<en.args.length;bn++){var hn=en.args[bn];if(hn==null)mn.push(null);else if(Array.isArray(hn)){for(var On=[],Pn=0;Pn<hn.length;Pn++){var Nn=hn[Pn],Dn=Nn?Nn.evaluate(an):null;Dn&&(Dn.then?wn=!0:Dn.asyncWrapper&&(vn=!0)),On.push(Dn)}mn.push(On)}else if(hn.evaluate){var Dn=hn.evaluate(an);if(Dn&&(Dn.then?wn=!0:Dn.asyncWrapper&&(vn=!0)),mn.push(Dn),Dn){if(pn===!0)break}else if(pn===!1)break}else mn.push(hn)}return wn?new Promise((Ln,Fn)=>{mn=this.wrapArrays(mn),Promise.all(mn).then(function(Mn){vn&&this.unwrapAsyncs(Mn);try{var Gn=en.op.apply(en,Mn);Ln(Gn)}catch(Wn){Fn(Wn)}}).catch(function(Mn){Fn(Mn)})}):(vn&&this.unwrapAsyncs(mn),en.op.apply(en,mn))}_scriptAttrs=null;getScriptAttributes(){return this._scriptAttrs==null&&(this._scriptAttrs=Wr.attributes.replace(/ /g,"").split(",")),this._scriptAttrs}getScript(en){for(var an=0;an<this.getScriptAttributes().length;an++){var pn=this.getScriptAttributes()[an];if(en.hasAttribute&&en.hasAttribute(pn))return en.getAttribute(pn)}return en instanceof HTMLScriptElement&&en.type==="text/hyperscript"?en.innerText:null}hyperscriptFeaturesMap=new WeakMap;getHyperscriptFeatures(en){var an=this.hyperscriptFeaturesMap.get(en);return typeof an>"u"&&en&&this.hyperscriptFeaturesMap.set(en,an={}),an}addFeatures(en,an){en&&(Object.assign(an.locals,this.getHyperscriptFeatures(en)),this.addFeatures(en.parentElement,an))}makeContext(en,an,pn,mn){return new kn(en,an,pn,mn,this)}getScriptSelector(){return this.getScriptAttributes().map(function(en){return"["+en+"]"}).join(", ")}convertValue(en,an){for(var pn=Gr.dynamicResolvers,mn=0;mn<pn.length;mn++){var wn=pn[mn],vn=wn(an,en);if(vn!==void 0)return vn}if(en==null)return null;var bn=Gr[an];if(bn)return bn(en);throw"Unknown conversion : "+an}parse(en){let an=this.lexer,pn=this.parser;var mn=an.tokenize(en);if(this.parser.commandStart(mn.currentToken())){var wn=pn.requireElement("commandList",mn);return mn.hasMore()&&pn.raiseParseError(mn),pn.ensureTerminated(wn),wn}else if(pn.featureStart(mn.currentToken())){var vn=pn.requireElement("hyperscript",mn);return mn.hasMore()&&pn.raiseParseError(mn),vn}else{var bn=pn.requireElement("expression",mn);return mn.hasMore()&&pn.raiseParseError(mn),bn}}evaluateNoPromise(en,an){let pn=en.evaluate(an);if(pn.next)throw new Error(Yr.sourceFor.call(en)+" returned a Promise in a context that they are not allowed.");return pn}evaluate(en,an,pn){class mn extends EventTarget{constructor(On){super(),this.module=On}toString(){return this.module.id}}var wn="document"in Qr?Qr.document.body:new mn(pn&&pn.module);an=Object.assign(this.makeContext(wn,null,wn,null),an||{});var vn=this.parse(en);if(vn.execute)return vn.execute(an),typeof an.meta.returnValue<"u"?an.meta.returnValue:an.result;return vn.apply?(vn.apply(wn,wn,pn),this.getHyperscriptFeatures(wn)):vn.evaluate(an);function bn(){return{}}}processNode(en){var an=this.getScriptSelector();this.matchesSelector(en,an)&&this.initElement(en,en),en instanceof HTMLScriptElement&&en.type==="text/hyperscript"&&this.initElement(en,document.body),en.querySelectorAll&&this.forEach(en.querySelectorAll(an+", [type='text/hyperscript']"),pn=>{this.initElement(pn,pn instanceof HTMLScriptElement&&pn.type==="text/hyperscript"?document.body:pn)})}initElement(en,an){if(!(en.closest&&en.closest(Wr.disableSelector))){var pn=this.getInternalData(en);if(!pn.initialized){var mn=this.getScript(en);if(mn)try{pn.initialized=!0,pn.script=mn;let bn=this.lexer,hn=this.parser;var wn=bn.tokenize(mn),vn=hn.parseHyperScript(wn);if(!vn)return;vn.apply(an||en,en),setTimeout(()=>{this.triggerEvent(an||en,"load",{hyperscript:!0})},1)}catch(bn){this.triggerEvent(en,"exception",{error:bn}),console.error("hyperscript errors were found on the following element:",en,` 12 12 13 - `,bn.message,bn.stack)}}}}internalDataMap=new WeakMap;getInternalData(en){var an=this.internalDataMap.get(en);return typeof an>"u"&&this.internalDataMap.set(en,an={}),an}typeCheck(en,an,pn){if(en==null&&pn)return!0;var mn=Object.prototype.toString.call(en).slice(8,-1);return mn===an}getElementScope(en){var an=en.meta&&en.meta.owner;if(an){var pn=this.getInternalData(an),mn="elementScope";en.meta.feature&&en.meta.feature.behavior&&(mn=en.meta.feature.behavior+"Scope");var Sn=jn(pn,mn);return Sn}else return{}}isReservedWord(en){return["meta","it","result","locals","event","target","detail","sender","body"].includes(en)}isHyperscriptContext(en){return en instanceof kn}resolveSymbol(en,an,pn){if(en==="me"||en==="my"||en==="I")return an.me;if(en==="it"||en==="its"||en==="result")return an.result;if(en==="you"||en==="your"||en==="yourself")return an.you;if(pn==="global")return Qr[en];if(pn==="element"){var mn=this.getElementScope(an);return mn[en]}else{if(pn==="local")return an.locals[en];if(an.meta&&an.meta.context){var Sn=an.meta.context[en];if(typeof Sn<"u"||an.meta.context.detail&&(Sn=an.meta.context.detail[en],typeof Sn<"u"))return Sn}if(this.isHyperscriptContext(an)&&!this.isReservedWord(en))var vn=an.locals[en];else var vn=an[en];if(typeof vn<"u")return vn;var mn=this.getElementScope(an);return vn=mn[en],typeof vn<"u"?vn:Qr[en]}}setSymbol(en,an,pn,mn){if(pn==="global")Qr[en]=mn;else if(pn==="element"){var Sn=this.getElementScope(an);Sn[en]=mn}else if(pn==="local")an.locals[en]=mn;else if(this.isHyperscriptContext(an)&&!this.isReservedWord(en)&&typeof an.locals[en]<"u")an.locals[en]=mn;else{var Sn=this.getElementScope(an),vn=Sn[en];typeof vn<"u"?Sn[en]=mn:this.isHyperscriptContext(an)&&!this.isReservedWord(en)?an.locals[en]=mn:an[en]=mn}}findNext(en,an){if(en)return en.resolveNext?en.resolveNext(an):en.next?en.next:this.findNext(en.parent,an)}flatGet(en,an,pn){if(en!=null){var mn=pn(en,an);if(typeof mn<"u")return mn;if(this.shouldAutoIterate(en)){var Sn=[];for(var vn of en){var bn=pn(vn,an);Sn.push(bn)}return Sn}}}resolveProperty(en,an){return this.flatGet(en,an,(pn,mn)=>pn[mn])}resolveAttribute(en,an){return this.flatGet(en,an,(pn,mn)=>pn.getAttribute&&pn.getAttribute(mn))}resolveStyle(en,an){return this.flatGet(en,an,(pn,mn)=>pn.style&&pn.style[mn])}resolveComputedStyle(en,an){return this.flatGet(en,an,(pn,mn)=>getComputedStyle(pn).getPropertyValue(mn))}assignToNamespace(en,an,pn,mn){let Sn;typeof document<"u"&&en===document.body?Sn=Qr:Sn=this.getHyperscriptFeatures(en);for(var vn;(vn=an.shift())!==void 0;){var bn=Sn[vn];bn==null&&(bn={},Sn[vn]=bn),Sn=bn}Sn[pn]=mn}getHyperTrace(en,an){for(var pn=[],mn=en;mn.meta.caller;)mn=mn.meta.caller;if(mn.meta.traceMap)return mn.meta.traceMap.get(an,pn)}registerHyperTrace(en,an){for(var pn=[],mn=null;en!=null;)pn.push(en),mn=en,en=en.meta.caller;if(mn.meta.traceMap==null&&(mn.meta.traceMap=new Map),!mn.meta.traceMap.get(an)){var Sn={trace:pn,print:function(vn){vn=vn||console.error,vn("hypertrace /// ");for(var bn=0,hn=0;hn<pn.length;hn++)bn=Math.max(bn,pn[hn].meta.feature.displayName.length);for(var hn=0;hn<pn.length;hn++){var On=pn[hn];vn(" ->",On.meta.feature.displayName.padEnd(bn+2),"-",On.meta.owner)}}};mn.meta.traceMap.set(an,Sn)}}escapeSelector(en){return en.replace(/[:&()\[\]\/]/g,function(an){return"\\"+an})}nullCheck(en,an){if(en==null)throw new Error("'"+an.sourceFor()+"' is null")}isEmpty(en){return en==null||en.length===0}doesExist(en){if(en==null)return!1;if(this.shouldAutoIterate(en)){for(let an of en)return!0;return!1}return!0}getRootNode(en){if(en&&en instanceof Node){var an=en.getRootNode();if(an instanceof Document||an instanceof ShadowRoot)return an}return document}getEventQueueFor(en,an){let pn=this.getInternalData(en);var mn=pn.eventQueues;mn==null&&(mn=new Map,pn.eventQueues=mn);var Sn=mn.get(an);return Sn==null&&(Sn={queue:[],executing:!1},mn.set(an,Sn)),Sn}beepValueToConsole(en,an,pn){if(this.triggerEvent(en,"hyperscript:beep",{element:en,expression:an,value:pn})){var mn;pn?pn instanceof An?mn="ElementCollection":pn.constructor?mn=pn.constructor.name:mn="unknown":mn="object (null)";var Sn=pn;mn==="String"?Sn='"'+Sn+'"':pn instanceof An&&(Sn=Array.from(pn)),console.log("///_ BEEP! The expression ("+Yr.sourceFor.call(an).replace("beep! ","")+") evaluates to:",Sn,"of type "+mn)}}hyperscriptUrl="document"in Qr&&document.currentScript?document.currentScript.src:null}function ln(){return document.cookie.split("; ").map(en=>{let an=en.split("=");return{name:an[0],value:decodeURIComponent(an[1])}})}function dn(xn){document.cookie=xn+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function yn(){for(let xn of ln())dn(xn.name)}let wn=new Proxy({},{get(xn,en){if(en==="then"||en==="asyncWrapper")return null;if(en==="length")return ln().length;if(en==="clear")return dn;if(en==="clearAll")return yn;if(typeof en=="string")if(isNaN(en)){let an=document.cookie.split("; ").find(pn=>pn.startsWith(en+"="))?.split("=")[1];if(an)return decodeURIComponent(an)}else return ln()[parseInt(en)];else if(en===Symbol.iterator)return ln()[en]},set(xn,en,an){var pn=null;return typeof an=="string"?(pn=encodeURIComponent(an),pn+=";samesite=lax"):(pn=encodeURIComponent(an.value),an.expires&&(pn+=";expires="+an.maxAge),an.maxAge&&(pn+=";max-age="+an.maxAge),an.partitioned&&(pn+=";partitioned="+an.partitioned),an.path&&(pn+=";path="+an.path),an.samesite&&(pn+=";samesite="+an.path),an.secure&&(pn+=";secure="+an.path)),document.cookie=en+"="+pn,!0}});class kn{constructor(en,an,pn,mn,Sn){this.meta={parser:Sn.parser,lexer:Sn.lexer,runtime:Sn,owner:en,feature:an,iterators:{},ctx:this},this.locals={cookies:wn},this.me=pn,this.you=void 0,this.result=void 0,this.event=mn,this.target=mn?mn.target:null,this.detail=mn?mn.detail:null,this.sender=mn&&mn.detail?mn.detail.sender:null,this.body="document"in Qr?document.body:null,Sn.addFeatures(en,this)}}class An{constructor(en,an,pn){this._css=en,this.relativeToElement=an,this.escape=pn,this[Gn]=!0}get css(){return this.escape?tn.prototype.escapeSelector(this._css):this._css}get className(){return this._css.substr(1)}get id(){return this.className()}contains(en){for(let an of this)if(an.contains(en))return!0;return!1}get length(){return this.selectMatches().length}[Symbol.iterator](){return this.selectMatches()[Symbol.iterator]()}selectMatches(){return tn.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css)}}let Gn=Symbol();function jn(xn,en){var an=xn[en];if(an)return an;var pn={};return xn[en]=pn,pn}function Vn(xn){try{return JSON.parse(xn)}catch(en){return ti(en),null}}function ti(xn){console.error?console.error(xn):console.log&&console.log("ERROR: ",xn)}function Ti(xn,en){return new(xn.bind.apply(xn,[xn].concat(en)))}function fi(xn){xn.addLeafExpression("parenthesized",function(nn,on,Jr){if(Jr.matchOpToken("(")){var rn=Jr.clearFollows();try{var cn=nn.requireElement("expression",Jr)}finally{Jr.restoreFollows(rn)}return Jr.requireOpToken(")"),cn}}),xn.addLeafExpression("string",function(nn,on,Jr){var rn=Jr.matchTokenType("STRING");if(rn){var cn=rn.value,sn;if(rn.template){var fn=Kr.tokenize(cn,!0);sn=nn.parseStringTemplate(fn)}else sn=[];return{type:"string",token:rn,args:sn,op:function(un){for(var gn="",En=1;En<arguments.length;En++){var Tn=arguments[En];Tn!==void 0&&(gn+=Tn)}return gn},evaluate:function(un){return sn.length===0?cn:on.unifiedEval(this,un)}}}}),xn.addGrammarElement("nakedString",function(nn,on,Jr){if(Jr.hasMore()){var rn=Jr.consumeUntilWhitespace();return Jr.matchTokenType("WHITESPACE"),{type:"nakedString",tokens:rn,evaluate:function(cn){return rn.map(function(sn){return sn.value}).join("")}}}}),xn.addLeafExpression("number",function(nn,on,Jr){var rn=Jr.matchTokenType("NUMBER");if(rn){var cn=rn,sn=parseFloat(rn.value);return{type:"number",value:sn,numberToken:cn,evaluate:function(){return sn}}}}),xn.addLeafExpression("idRef",function(nn,on,Jr){var rn=Jr.matchTokenType("ID_REF");if(rn&&rn.value)if(rn.template){var cn=rn.value.substring(2),sn=Kr.tokenize(cn),fn=nn.requireElement("expression",sn);return{type:"idRefTemplate",args:[fn],op:function(un,gn){return on.getRootNode(un.me).getElementById(gn)},evaluate:function(un){return on.unifiedEval(this,un)}}}else{let un=rn.value.substring(1);return{type:"idRef",css:rn.value,value:un,evaluate:function(gn){return on.getRootNode(gn.me).getElementById(un)}}}}),xn.addLeafExpression("classRef",function(nn,on,Jr){var rn=Jr.matchTokenType("CLASS_REF");if(rn&&rn.value)if(rn.template){var cn=rn.value.substring(2),sn=Kr.tokenize(cn),fn=nn.requireElement("expression",sn);return{type:"classRefTemplate",args:[fn],op:function(un,gn){return new An("."+gn,un.me,!0)},evaluate:function(un){return on.unifiedEval(this,un)}}}else{let un=rn.value;return{type:"classRef",css:un,evaluate:function(gn){return new An(un,gn.me,!0)}}}});class en extends An{constructor(on,Jr,rn){super(on,Jr),this.templateParts=rn,this.elements=rn.filter(cn=>cn instanceof Element)}get css(){let on="",Jr=0;for(let rn of this.templateParts)rn instanceof Element?on+="[data-hs-query-id='"+Jr+++"']":on+=rn;return on}[Symbol.iterator](){this.elements.forEach((Jr,rn)=>Jr.dataset.hsQueryId=rn);let on=super[Symbol.iterator]();return this.elements.forEach(Jr=>Jr.removeAttribute("data-hs-query-id")),on}}xn.addLeafExpression("queryRef",function(nn,on,Jr){var rn=Jr.matchOpToken("<");if(rn){var cn=Jr.consumeUntil("/");Jr.requireOpToken("/"),Jr.requireOpToken(">");var sn=cn.map(function(En){return En.type==="STRING"?'"'+En.value+'"':En.value}).join(""),fn,un,gn;return/\$[^=]/.test(sn)&&(fn=!0,un=Kr.tokenize(sn,!0),gn=nn.parseStringTemplate(un)),{type:"queryRef",css:sn,args:gn,op:function(En,...Tn){return fn?new en(sn,En.me,Tn):new An(sn,En.me)},evaluate:function(En){return on.unifiedEval(this,En)}}}}),xn.addLeafExpression("attributeRef",function(nn,on,Jr){var rn=Jr.matchTokenType("ATTRIBUTE_REF");if(rn&&rn.value){var cn=rn.value;if(cn.indexOf("[")===0)var sn=cn.substring(2,cn.length-1);else var sn=cn.substring(1);var fn="["+sn+"]",un=sn.split("="),gn=un[0],En=un[1];return En&&En.indexOf('"')===0&&(En=En.substring(1,En.length-1)),{type:"attributeRef",name:gn,css:fn,value:En,op:function(Tn){var Rn=Tn.you||Tn.me;if(Rn)return Rn.getAttribute(gn)},evaluate:function(Tn){return on.unifiedEval(this,Tn)}}}}),xn.addLeafExpression("styleRef",function(nn,on,Jr){var rn=Jr.matchTokenType("STYLE_REF");if(rn&&rn.value){var cn=rn.value.substr(1);return cn.startsWith("computed-")?(cn=cn.substr(9),{type:"computedStyleRef",name:cn,op:function(sn){var fn=sn.you||sn.me;if(fn)return on.resolveComputedStyle(fn,cn)},evaluate:function(sn){return on.unifiedEval(this,sn)}}):{type:"styleRef",name:cn,op:function(sn){var fn=sn.you||sn.me;if(fn)return on.resolveStyle(fn,cn)},evaluate:function(sn){return on.unifiedEval(this,sn)}}}}),xn.addGrammarElement("objectKey",function(nn,on,Jr){var rn;if(rn=Jr.matchTokenType("STRING"))return{type:"objectKey",key:rn.value,evaluate:function(){return rn.value}};if(Jr.matchOpToken("[")){var cn=nn.parseElement("expression",Jr);return Jr.requireOpToken("]"),{type:"objectKey",expr:cn,args:[cn],op:function(fn,un){return un},evaluate:function(fn){return on.unifiedEval(this,fn)}}}else{var sn="";do rn=Jr.matchTokenType("IDENTIFIER")||Jr.matchOpToken("-"),rn&&(sn+=rn.value);while(rn);return{type:"objectKey",key:sn,evaluate:function(){return sn}}}}),xn.addLeafExpression("objectLiteral",function(nn,on,Jr){if(Jr.matchOpToken("{")){var rn=[],cn=[];if(!Jr.matchOpToken("}")){do{var sn=nn.requireElement("objectKey",Jr);Jr.requireOpToken(":");var fn=nn.requireElement("expression",Jr);cn.push(fn),rn.push(sn)}while(Jr.matchOpToken(",")&&!Jr.peekToken("}",0,"R_BRACE"));Jr.requireOpToken("}")}return{type:"objectLiteral",args:[rn,cn],op:function(un,gn,En){for(var Tn={},Rn=0;Rn<gn.length;Rn++)Tn[gn[Rn]]=En[Rn];return Tn},evaluate:function(un){return on.unifiedEval(this,un)}}}}),xn.addGrammarElement("nakedNamedArgumentList",function(nn,on,Jr){var rn=[],cn=[];if(Jr.currentToken().type==="IDENTIFIER")do{var sn=Jr.requireTokenType("IDENTIFIER");Jr.requireOpToken(":");var fn=nn.requireElement("expression",Jr);cn.push(fn),rn.push({name:sn,value:fn})}while(Jr.matchOpToken(","));return{type:"namedArgumentList",fields:rn,args:[cn],op:function(un,gn){for(var En={_namedArgList_:!0},Tn=0;Tn<gn.length;Tn++){var Rn=rn[Tn];En[Rn.name.value]=gn[Tn]}return En},evaluate:function(un){return on.unifiedEval(this,un)}}}),xn.addGrammarElement("namedArgumentList",function(nn,on,Jr){if(Jr.matchOpToken("(")){var rn=nn.requireElement("nakedNamedArgumentList",Jr);return Jr.requireOpToken(")"),rn}}),xn.addGrammarElement("symbol",function(nn,on,Jr){var rn="default";Jr.matchToken("global")?rn="global":Jr.matchToken("element")||Jr.matchToken("module")?(rn="element",Jr.matchOpToken("'")&&Jr.requireToken("s")):Jr.matchToken("local")&&(rn="local");let cn=Jr.matchOpToken(":"),sn=Jr.matchTokenType("IDENTIFIER");if(sn&&sn.value){var fn=sn.value;return cn&&(fn=":"+fn),rn==="default"&&(fn.indexOf("$")===0&&(rn="global"),fn.indexOf(":")===0&&(rn="element")),{type:"symbol",token:sn,scope:rn,name:fn,evaluate:function(un){return on.resolveSymbol(fn,un,rn)}}}}),xn.addGrammarElement("implicitMeTarget",function(nn,on,Jr){return{type:"implicitMeTarget",evaluate:function(rn){return rn.you||rn.me}}}),xn.addLeafExpression("boolean",function(nn,on,Jr){var rn=Jr.matchToken("true")||Jr.matchToken("false");if(!rn)return;let cn=rn.value==="true";return{type:"boolean",evaluate:function(sn){return cn}}}),xn.addLeafExpression("null",function(nn,on,Jr){if(Jr.matchToken("null"))return{type:"null",evaluate:function(rn){return null}}}),xn.addLeafExpression("arrayLiteral",function(nn,on,Jr){if(Jr.matchOpToken("[")){var rn=[];if(!Jr.matchOpToken("]")){do{var cn=nn.requireElement("expression",Jr);rn.push(cn)}while(Jr.matchOpToken(","));Jr.requireOpToken("]")}return{type:"arrayLiteral",values:rn,args:[rn],op:function(sn,fn){return fn},evaluate:function(sn){return on.unifiedEval(this,sn)}}}}),xn.addLeafExpression("blockLiteral",function(nn,on,Jr){if(Jr.matchOpToken("\\")){var rn=[],cn=Jr.matchTokenType("IDENTIFIER");if(cn)for(rn.push(cn);Jr.matchOpToken(",");)rn.push(Jr.requireTokenType("IDENTIFIER"));Jr.requireOpToken("-"),Jr.requireOpToken(">");var sn=nn.requireElement("expression",Jr);return{type:"blockLiteral",args:rn,expr:sn,evaluate:function(fn){var un=function(){for(var gn=0;gn<rn.length;gn++)fn.locals[rn[gn].value]=arguments[gn];return sn.evaluate(fn)};return un}}}}),xn.addIndirectExpression("propertyAccess",function(nn,on,Jr,rn){if(Jr.matchOpToken(".")){var cn=Jr.requireTokenType("IDENTIFIER"),sn={type:"propertyAccess",root:rn,prop:cn,args:[rn],op:function(fn,un){var gn=on.resolveProperty(un,cn.value);return gn},evaluate:function(fn){return on.unifiedEval(this,fn)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("of",function(nn,on,Jr,rn){if(Jr.matchToken("of")){for(var cn=nn.requireElement("unaryExpression",Jr),sn=null,fn=rn;fn.root;)sn=fn,fn=fn.root;fn.type!=="symbol"&&fn.type!=="attributeRef"&&fn.type!=="styleRef"&&fn.type!=="computedStyleRef"&&nn.raiseParseError(Jr,"Cannot take a property of a non-symbol: "+fn.type);var un=fn.type==="attributeRef",gn=fn.type==="styleRef"||fn.type==="computedStyleRef";if(un||gn)var En=fn;var Tn=fn.name,Rn={type:"ofExpression",prop:fn.token,root:cn,attribute:En,expression:rn,args:[cn],op:function(Bn,Cn){return un?on.resolveAttribute(Cn,Tn):gn?fn.type==="computedStyleRef"?on.resolveComputedStyle(Cn,Tn):on.resolveStyle(Cn,Tn):on.resolveProperty(Cn,Tn)},evaluate:function(Bn){return on.unifiedEval(this,Bn)}};return fn.type==="attributeRef"&&(Rn.attribute=fn),sn?(sn.root=Rn,sn.args=[Rn]):rn=Rn,nn.parseElement("indirectExpression",Jr,rn)}}),xn.addIndirectExpression("possessive",function(nn,on,Jr,rn){if(!nn.possessivesDisabled){var cn=Jr.matchOpToken("'");if(cn||rn.type==="symbol"&&(rn.name==="my"||rn.name==="its"||rn.name==="your")&&(Jr.currentToken().type==="IDENTIFIER"||Jr.currentToken().type==="ATTRIBUTE_REF"||Jr.currentToken().type==="STYLE_REF")){cn&&Jr.requireToken("s");var sn,fn,un;sn=nn.parseElement("attributeRef",Jr),sn==null&&(fn=nn.parseElement("styleRef",Jr),fn==null&&(un=Jr.requireTokenType("IDENTIFIER")));var gn={type:"possessive",root:rn,attribute:sn||fn,prop:un,args:[rn],op:function(En,Tn){if(sn)var Rn=on.resolveAttribute(Tn,sn.name);else if(fn){var Rn;fn.type==="computedStyleRef"?Rn=on.resolveComputedStyle(Tn,fn.name):Rn=on.resolveStyle(Tn,fn.name)}else var Rn=on.resolveProperty(Tn,un.value);return Rn},evaluate:function(En){return on.unifiedEval(this,En)}};return nn.parseElement("indirectExpression",Jr,gn)}}}),xn.addIndirectExpression("inExpression",function(nn,on,Jr,rn){if(Jr.matchToken("in")){var cn=nn.requireElement("unaryExpression",Jr),sn={type:"inExpression",root:rn,args:[rn,cn],op:function(fn,un,gn){var En=[];if(un.css)on.implicitLoop(gn,function(Rn){for(var Bn=Rn.querySelectorAll(un.css),Cn=0;Cn<Bn.length;Cn++)En.push(Bn[Cn])});else if(un instanceof Element){var Tn=!1;if(on.implicitLoop(gn,function(Rn){Rn.contains(un)&&(Tn=!0)}),Tn)return un}else on.implicitLoop(un,function(Rn){on.implicitLoop(gn,function(Bn){Rn===Bn&&En.push(Rn)})});return En},evaluate:function(fn){return on.unifiedEval(this,fn)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("asExpression",function(nn,on,Jr,rn){if(Jr.matchToken("as")){Jr.matchToken("a")||Jr.matchToken("an");var cn=nn.requireElement("dotOrColonPath",Jr).evaluate(),sn={type:"asExpression",root:rn,args:[rn],op:function(fn,un){return on.convertValue(un,cn)},evaluate:function(fn){return on.unifiedEval(this,fn)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("functionCall",function(nn,on,Jr,rn){if(Jr.matchOpToken("(")){var cn=[];if(!Jr.matchOpToken(")")){do cn.push(nn.requireElement("expression",Jr));while(Jr.matchOpToken(","));Jr.requireOpToken(")")}if(rn.root)var sn={type:"functionCall",root:rn,argExressions:cn,args:[rn.root,cn],op:function(fn,un,gn){on.nullCheck(un,rn.root);var En=un[rn.prop.value];return on.nullCheck(En,rn),En.hyperfunc&&gn.push(fn),En.apply(un,gn)},evaluate:function(fn){return on.unifiedEval(this,fn)}};else var sn={type:"functionCall",root:rn,argExressions:cn,args:[rn,cn],op:function(un,gn,En){on.nullCheck(gn,rn),gn.hyperfunc&&En.push(un);var Tn=gn.apply(null,En);return Tn},evaluate:function(un){return on.unifiedEval(this,un)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("attributeRefAccess",function(nn,on,Jr,rn){var cn=nn.parseElement("attributeRef",Jr);if(cn){var sn={type:"attributeRefAccess",root:rn,attribute:cn,args:[rn],op:function(fn,un){var gn=on.resolveAttribute(un,cn.name);return gn},evaluate:function(fn){return on.unifiedEval(this,fn)}};return sn}}),xn.addIndirectExpression("arrayIndex",function(nn,on,Jr,rn){if(Jr.matchOpToken("[")){var cn=!1,sn=!1,fn=null,un=null;if(Jr.matchOpToken(".."))cn=!0,fn=nn.requireElement("expression",Jr);else if(fn=nn.requireElement("expression",Jr),Jr.matchOpToken("..")){sn=!0;var gn=Jr.currentToken();gn.type!=="R_BRACKET"&&(un=nn.parseElement("expression",Jr))}Jr.requireOpToken("]");var En={type:"arrayIndex",root:rn,prop:fn,firstIndex:fn,secondIndex:un,args:[rn,fn,un],op:function(Tn,Rn,Bn,Cn){return Rn==null?null:cn?(Bn<0&&(Bn=Rn.length+Bn),Rn.slice(0,Bn+1)):sn?Cn!=null?(Cn<0&&(Cn=Rn.length+Cn),Rn.slice(Bn,Cn+1)):Rn.slice(Bn):Rn[Bn]},evaluate:function(Tn){return on.unifiedEval(this,Tn)}};return nn.parseElement("indirectExpression",Jr,En)}});var an=["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","pc","pt","px"];xn.addGrammarElement("postfixExpression",function(nn,on,Jr){var rn=nn.parseElement("negativeNumber",Jr);let cn=Jr.matchAnyToken.apply(Jr,an)||Jr.matchOpToken("%");if(cn)return{type:"stringPostfix",postfix:cn.value,args:[rn],op:function(gn,En){return""+En+cn.value},evaluate:function(gn){return on.unifiedEval(this,gn)}};var sn=null;if(Jr.matchToken("s")||Jr.matchToken("seconds")?sn=1e3:(Jr.matchToken("ms")||Jr.matchToken("milliseconds"))&&(sn=1),sn)return{type:"timeExpression",time:rn,factor:sn,args:[rn],op:function(gn,En){return En*sn},evaluate:function(gn){return on.unifiedEval(this,gn)}};if(Jr.matchOpToken(":")){var fn=Jr.requireTokenType("IDENTIFIER");if(!fn.value)return;var un=!Jr.matchOpToken("!");return{type:"typeCheck",typeName:fn,nullOk:un,args:[rn],op:function(gn,En){var Tn=on.typeCheck(En,this.typeName.value,un);if(Tn)return En;throw new Error("Typecheck failed! Expected: "+fn.value)},evaluate:function(gn){return on.unifiedEval(this,gn)}}}else return rn}),xn.addGrammarElement("logicalNot",function(nn,on,Jr){if(Jr.matchToken("not")){var rn=nn.requireElement("unaryExpression",Jr);return{type:"logicalNot",root:rn,args:[rn],op:function(cn,sn){return!sn},evaluate:function(cn){return on.unifiedEval(this,cn)}}}}),xn.addGrammarElement("noExpression",function(nn,on,Jr){if(Jr.matchToken("no")){var rn=nn.requireElement("unaryExpression",Jr);return{type:"noExpression",root:rn,args:[rn],op:function(cn,sn){return on.isEmpty(sn)},evaluate:function(cn){return on.unifiedEval(this,cn)}}}}),xn.addLeafExpression("some",function(nn,on,Jr){if(Jr.matchToken("some")){var rn=nn.requireElement("expression",Jr);return{type:"noExpression",root:rn,args:[rn],op:function(cn,sn){return!on.isEmpty(sn)},evaluate(cn){return on.unifiedEval(this,cn)}}}}),xn.addGrammarElement("negativeNumber",function(nn,on,Jr){if(Jr.matchOpToken("-")){var rn=nn.requireElement("negativeNumber",Jr);return{type:"negativeNumber",root:rn,args:[rn],op:function(cn,sn){return-1*sn},evaluate:function(cn){return on.unifiedEval(this,cn)}}}else return nn.requireElement("primaryExpression",Jr)}),xn.addGrammarElement("unaryExpression",function(nn,on,Jr){return Jr.matchToken("the"),nn.parseAnyOf(["beepExpression","logicalNot","relativePositionalExpression","positionalExpression","noExpression","postfixExpression"],Jr)}),xn.addGrammarElement("beepExpression",function(nn,on,Jr){if(Jr.matchToken("beep!")){var rn=nn.parseElement("unaryExpression",Jr);if(rn){rn.booped=!0;var cn=rn.evaluate;return rn.evaluate=function(sn){let fn=cn.apply(rn,arguments),un=sn.me;return on.beepValueToConsole(un,rn,fn),fn},rn}}});var pn=function(nn,on,Jr,rn){for(var cn=on.querySelectorAll(Jr),sn=0;sn<cn.length;sn++){var fn=cn[sn];if(fn.compareDocumentPosition(nn)===Node.DOCUMENT_POSITION_PRECEDING)return fn}if(rn)return cn[0]},mn=function(nn,on,Jr,rn){for(var cn=on.querySelectorAll(Jr),sn=cn.length-1;sn>=0;sn--){var fn=cn[sn];if(fn.compareDocumentPosition(nn)===Node.DOCUMENT_POSITION_FOLLOWING)return fn}if(rn)return cn[cn.length-1]},Sn=function(nn,on,Jr,rn){var cn=[];tn.prototype.forEach(on,function(gn){(gn.matches(Jr)||gn===nn)&&cn.push(gn)});for(var sn=0;sn<cn.length-1;sn++){var fn=cn[sn];if(fn===nn)return cn[sn+1]}if(rn){var un=cn[0];if(un&&un.matches(Jr))return un}},vn=function(nn,on,Jr,rn){return Sn(nn,Array.from(on).reverse(),Jr,rn)};xn.addGrammarElement("relativePositionalExpression",function(nn,on,Jr){var rn=Jr.matchAnyToken("next","previous");if(rn){var cn=rn.value==="next",sn=nn.parseElement("expression",Jr);if(Jr.matchToken("from")){Jr.pushFollow("in");try{var fn=nn.requireElement("unaryExpression",Jr)}finally{Jr.popFollow()}}else var fn=nn.requireElement("implicitMeTarget",Jr);var un=!1,gn;if(Jr.matchToken("in")){un=!0;var En=nn.requireElement("unaryExpression",Jr)}else Jr.matchToken("within")?gn=nn.requireElement("unaryExpression",Jr):gn=document.body;var Tn=!1;return Jr.matchToken("with")&&(Jr.requireToken("wrapping"),Tn=!0),{type:"relativePositionalExpression",from:fn,forwardSearch:cn,inSearch:un,wrapping:Tn,inElt:En,withinElt:gn,operator:rn.value,args:[sn,fn,En,gn],op:function(Rn,Bn,Cn,In,_n){var Un=Bn.css;if(Un==null)throw"Expected a CSS value to be returned by "+Yr.sourceFor.apply(sn);if(un){if(In)return cn?Sn(Cn,In,Un,Tn):vn(Cn,In,Un,Tn)}else if(_n)return cn?pn(Cn,_n,Un,Tn):mn(Cn,_n,Un,Tn)},evaluate:function(Rn){return on.unifiedEval(this,Rn)}}}}),xn.addGrammarElement("positionalExpression",function(nn,on,Jr){var rn=Jr.matchAnyToken("first","last","random");if(!rn)return;Jr.matchAnyToken("in","from","of");var cn=nn.requireElement("unaryExpression",Jr);let sn=rn.value;return{type:"positionalExpression",rhs:cn,operator:rn.value,args:[cn],op:function(fn,un){if(un&&!Array.isArray(un)&&(un.children?un=un.children:un=Array.from(un)),un){if(sn==="first")return un[0];if(sn==="last")return un[un.length-1];if(sn==="random")return un[Math.floor(Math.random()*un.length)]}},evaluate:function(fn){return on.unifiedEval(this,fn)}}}),xn.addGrammarElement("mathOperator",function(nn,on,Jr){var rn=nn.parseElement("unaryExpression",Jr),cn,sn=null;for(cn=Jr.matchAnyOpToken("+","-","*","/")||Jr.matchToken("mod");cn;){sn=sn||cn;var fn=cn.value;sn.value!==fn&&nn.raiseParseError(Jr,"You must parenthesize math operations with different operators");var un=nn.parseElement("unaryExpression",Jr);rn={type:"mathOperator",lhs:rn,rhs:un,operator:fn,args:[rn,un],op:function(gn,En,Tn){if(fn==="+")return En+Tn;if(fn==="-")return En-Tn;if(fn==="*")return En*Tn;if(fn==="/")return En/Tn;if(fn==="mod")return En%Tn},evaluate:function(gn){return on.unifiedEval(this,gn)}},cn=Jr.matchAnyOpToken("+","-","*","/")||Jr.matchToken("mod")}return rn}),xn.addGrammarElement("mathExpression",function(nn,on,Jr){return nn.parseAnyOf(["mathOperator","unaryExpression"],Jr)});function bn(nn,on,Jr){if(on.contains)return on.contains(Jr);if(on.includes)return on.includes(Jr);throw Error("The value of "+nn.sourceFor()+" does not have a contains or includes method on it")}function hn(nn,on,Jr){if(on.match)return!!on.match(Jr);if(on.matches)return on.matches(Jr);throw Error("The value of "+nn.sourceFor()+" does not have a match or matches method on it")}xn.addGrammarElement("comparisonOperator",function(nn,on,Jr){var rn=nn.parseElement("mathExpression",Jr),cn=Jr.matchAnyOpToken("<",">","<=",">=","==","===","!=","!=="),sn=cn?cn.value:null,fn=!0,un=!1;if(sn==null&&(Jr.matchToken("is")||Jr.matchToken("am")?Jr.matchToken("not")?Jr.matchToken("in")?sn="not in":Jr.matchToken("a")||Jr.matchToken("an")?(sn="not a",un=!0):Jr.matchToken("empty")?(sn="not empty",fn=!1):(Jr.matchToken("really")?sn="!==":sn="!=",Jr.matchToken("equal")&&Jr.matchToken("to")):Jr.matchToken("in")?sn="in":Jr.matchToken("a")||Jr.matchToken("an")?(sn="a",un=!0):Jr.matchToken("empty")?(sn="empty",fn=!1):Jr.matchToken("less")?(Jr.requireToken("than"),Jr.matchToken("or")?(Jr.requireToken("equal"),Jr.requireToken("to"),sn="<="):sn="<"):Jr.matchToken("greater")?(Jr.requireToken("than"),Jr.matchToken("or")?(Jr.requireToken("equal"),Jr.requireToken("to"),sn=">="):sn=">"):(Jr.matchToken("really")?sn="===":sn="==",Jr.matchToken("equal")&&Jr.matchToken("to")):Jr.matchToken("equals")?sn="==":Jr.matchToken("really")?(Jr.requireToken("equals"),sn="==="):Jr.matchToken("exist")||Jr.matchToken("exists")?(sn="exist",fn=!1):Jr.matchToken("matches")||Jr.matchToken("match")?sn="match":Jr.matchToken("contains")||Jr.matchToken("contain")?sn="contain":Jr.matchToken("includes")||Jr.matchToken("include")?sn="include":(Jr.matchToken("do")||Jr.matchToken("does"))&&(Jr.requireToken("not"),Jr.matchToken("matches")||Jr.matchToken("match")?sn="not match":Jr.matchToken("contains")||Jr.matchToken("contain")?sn="not contain":Jr.matchToken("exist")||Jr.matchToken("exist")?(sn="not exist",fn=!1):Jr.matchToken("include")?sn="not include":nn.raiseParseError(Jr,"Expected matches or contains"))),sn){var gn,En,Tn;un?(gn=Jr.requireTokenType("IDENTIFIER"),En=!Jr.matchOpToken("!")):fn&&(Tn=nn.requireElement("mathExpression",Jr),(sn==="match"||sn==="not match")&&(Tn=Tn.css?Tn.css:Tn));var Rn=rn;rn={type:"comparisonOperator",operator:sn,typeName:gn,nullOk:En,lhs:rn,rhs:Tn,args:[rn,Tn],op:function(Bn,Cn,In){if(sn==="==")return Cn==In;if(sn==="!=")return Cn!=In;if(sn==="===")return Cn===In;if(sn==="!==")return Cn!==In;if(sn==="match")return Cn!=null&&hn(Rn,Cn,In);if(sn==="not match")return Cn==null||!hn(Rn,Cn,In);if(sn==="in")return In!=null&&bn(Tn,In,Cn);if(sn==="not in")return In==null||!bn(Tn,In,Cn);if(sn==="contain")return Cn!=null&&bn(Rn,Cn,In);if(sn==="not contain")return Cn==null||!bn(Rn,Cn,In);if(sn==="include")return Cn!=null&&bn(Rn,Cn,In);if(sn==="not include")return Cn==null||!bn(Rn,Cn,In);if(sn==="===")return Cn===In;if(sn==="!==")return Cn!==In;if(sn==="<")return Cn<In;if(sn===">")return Cn>In;if(sn==="<=")return Cn<=In;if(sn===">=")return Cn>=In;if(sn==="empty")return on.isEmpty(Cn);if(sn==="not empty")return!on.isEmpty(Cn);if(sn==="exist")return on.doesExist(Cn);if(sn==="not exist")return!on.doesExist(Cn);if(sn==="a")return on.typeCheck(Cn,gn.value,En);if(sn==="not a")return!on.typeCheck(Cn,gn.value,En);throw"Unknown comparison : "+sn},evaluate:function(Bn){return on.unifiedEval(this,Bn)}}}return rn}),xn.addGrammarElement("comparisonExpression",function(nn,on,Jr){return nn.parseAnyOf(["comparisonOperator","mathExpression"],Jr)}),xn.addGrammarElement("logicalOperator",function(nn,on,Jr){var rn=nn.parseElement("comparisonExpression",Jr),cn,sn=null;for(cn=Jr.matchToken("and")||Jr.matchToken("or");cn;){sn=sn||cn,sn.value!==cn.value&&nn.raiseParseError(Jr,"You must parenthesize logical operations with different operators");var fn=nn.requireElement("comparisonExpression",Jr);let un=cn.value;rn={type:"logicalOperator",operator:un,lhs:rn,rhs:fn,args:[rn,fn],op:function(gn,En,Tn){return un==="and"?En&&Tn:En||Tn},evaluate:function(gn){return on.unifiedEval(this,gn,un==="or")}},cn=Jr.matchToken("and")||Jr.matchToken("or")}return rn}),xn.addGrammarElement("logicalExpression",function(nn,on,Jr){return nn.parseAnyOf(["logicalOperator","mathExpression"],Jr)}),xn.addGrammarElement("asyncExpression",function(nn,on,Jr){if(Jr.matchToken("async")){var rn=nn.requireElement("logicalExpression",Jr),cn={type:"asyncExpression",value:rn,evaluate:function(sn){return{asyncWrapper:!0,value:this.value.evaluate(sn)}}};return cn}else return nn.parseElement("logicalExpression",Jr)}),xn.addGrammarElement("expression",function(nn,on,Jr){return Jr.matchToken("the"),nn.parseElement("asyncExpression",Jr)}),xn.addGrammarElement("assignableExpression",function(nn,on,Jr){Jr.matchToken("the");var rn=nn.parseElement("primaryExpression",Jr);return rn&&(rn.type==="symbol"||rn.type==="ofExpression"||rn.type==="propertyAccess"||rn.type==="attributeRefAccess"||rn.type==="attributeRef"||rn.type==="styleRef"||rn.type==="arrayIndex"||rn.type==="possessive")||nn.raiseParseError(Jr,"A target expression must be writable. The expression type '"+(rn&&rn.type)+"' is not."),rn}),xn.addGrammarElement("hyperscript",function(nn,on,Jr){var rn=[];if(Jr.hasMore())for(;nn.featureStart(Jr.currentToken())||Jr.currentToken().value==="(";){var cn=nn.requireElement("feature",Jr);rn.push(cn),Jr.matchToken("end")}return{type:"hyperscript",features:rn,apply:function(sn,fn,un){for(let gn of rn)gn.install(sn,fn,un)}}});var On=function(nn){var on=[];if(nn.token(0).value==="("&&(nn.token(1).value===")"||nn.token(2).value===","||nn.token(2).value===")")){nn.matchOpToken("(");do on.push(nn.requireTokenType("IDENTIFIER"));while(nn.matchOpToken(","));nn.requireOpToken(")")}return on};xn.addFeature("on",function(nn,on,Jr){if(Jr.matchToken("on")){var rn=!1;Jr.matchToken("every")&&(rn=!0);var cn=[],sn=null;do{var fn=nn.requireElement("eventName",Jr,"Expected event name"),un=fn.evaluate();sn?sn=sn+" or "+un:sn="on "+un;var gn=On(Jr),En=null;Jr.matchOpToken("[")&&(En=nn.requireElement("expression",Jr),Jr.requireOpToken("]"));var Tn,Rn,Bn;if(Jr.currentToken().type==="NUMBER"){var Cn=Jr.consumeToken();if(!Cn.value)return;if(Tn=parseInt(Cn.value),Jr.matchToken("to")){var In=Jr.consumeToken();if(!In.value)return;Rn=parseInt(In.value)}else Jr.matchToken("and")&&(Bn=!0,Jr.requireToken("on"))}var _n,Un;if(un==="intersection"){if(_n={},Jr.matchToken("with")&&(_n.with=nn.requireElement("expression",Jr).evaluate()),Jr.matchToken("having"))do Jr.matchToken("margin")?_n.rootMargin=nn.requireElement("stringLike",Jr).evaluate():Jr.matchToken("threshold")?_n.threshold=nn.requireElement("expression",Jr).evaluate():nn.raiseParseError(Jr,"Unknown intersection config specification");while(Jr.matchToken("and"))}else if(un==="mutation")if(Un={},Jr.matchToken("of"))do if(Jr.matchToken("anything"))Un.attributes=!0,Un.subtree=!0,Un.characterData=!0,Un.childList=!0;else if(Jr.matchToken("childList"))Un.childList=!0;else if(Jr.matchToken("attributes"))Un.attributes=!0,Un.attributeOldValue=!0;else if(Jr.matchToken("subtree"))Un.subtree=!0;else if(Jr.matchToken("characterData"))Un.characterData=!0,Un.characterDataOldValue=!0;else if(Jr.currentToken().type==="ATTRIBUTE_REF"){var ni=Jr.consumeToken();Un.attributeFilter==null&&(Un.attributeFilter=[]),ni.value.indexOf("@")==0?Un.attributeFilter.push(ni.value.substring(1)):nn.raiseParseError(Jr,"Only shorthand attribute references are allowed here")}else nn.raiseParseError(Jr,"Unknown mutation config specification");while(Jr.matchToken("or"));else Un.attributes=!0,Un.characterData=!0,Un.childList=!0;var ii=null,Ri=!1;if(Jr.matchToken("from"))if(Jr.matchToken("elsewhere"))Ri=!0;else{Jr.pushFollow("or");try{ii=nn.requireElement("expression",Jr)}finally{Jr.popFollow()}ii||nn.raiseParseError(Jr,'Expected either target value or "elsewhere".')}if(ii===null&&Ri===!1&&Jr.matchToken("elsewhere")&&(Ri=!0),Jr.matchToken("in"))var Bi=nn.parseElement("unaryExpression",Jr);if(Jr.matchToken("debounced")){Jr.requireToken("at");var si=nn.requireElement("unaryExpression",Jr),ki=si.evaluate({})}else if(Jr.matchToken("throttled")){Jr.requireToken("at");var si=nn.requireElement("unaryExpression",Jr),Hi=si.evaluate({})}cn.push({execCount:0,every:rn,on:un,args:gn,filter:En,from:ii,inExpr:Bi,elsewhere:Ri,startCount:Tn,endCount:Rn,unbounded:Bn,debounceTime:ki,throttleTime:Hi,mutationSpec:Un,intersectionSpec:_n,debounced:void 0,lastExec:void 0})}while(Jr.matchToken("or"));var Ci=!0;if(!rn&&Jr.matchToken("queue"))if(Jr.matchToken("all"))var Ni=!0,Ci=!1;else if(Jr.matchToken("first"))var Ca=!0;else if(Jr.matchToken("none"))var _a=!0;else Jr.requireToken("last");var uo=nn.requireElement("commandList",Jr);nn.ensureTerminated(uo);var ts,co;if(Jr.matchToken("catch")&&(ts=Jr.requireTokenType("IDENTIFIER").value,co=nn.requireElement("commandList",Jr),nn.ensureTerminated(co)),Jr.matchToken("finally")){var Ws=nn.requireElement("commandList",Jr);nn.ensureTerminated(Ws)}var _i={displayName:sn,events:cn,start:uo,every:rn,execCount:0,errorHandler:co,errorSymbol:ts,execute:function(xi){let aa=on.getEventQueueFor(xi.me,_i);if(aa.executing&&rn===!1){if(_a||Ca&&aa.queue.length>0)return;Ci&&(aa.queue.length=0),aa.queue.push(xi);return}_i.execCount++,aa.executing=!0,xi.meta.onHalt=function(){aa.executing=!1;var Li=aa.queue.shift();Li&&setTimeout(function(){_i.execute(Li)},1)},xi.meta.reject=function(Li){console.error(Li.message?Li.message:Li);var $n=on.getHyperTrace(xi,Li);$n&&$n.print(),on.triggerEvent(xi.me,"exception",{error:Li})},uo.execute(xi)},install:function(xi,aa){for(let $n of _i.events){var Li;$n.elsewhere?Li=[document]:$n.from?Li=$n.from.evaluate(on.makeContext(xi,_i,xi,null)):Li=[xi],on.implicitLoop(Li,function(ji){var Ia=$n.on;if(ji==null){console.warn("'%s' feature ignored because target does not exists:",sn,xi);return}if($n.mutationSpec&&(Ia="hyperscript:mutation",new MutationObserver(function(pa,li){_i.executing||on.triggerEvent(ji,Ia,{mutationList:pa,observer:li})}).observe(ji,$n.mutationSpec)),$n.intersectionSpec){Ia="hyperscript:intersection";let ja=new IntersectionObserver(function(pa){for(let fo of pa){var li={observer:ja};li=Object.assign(li,fo),li.intersecting=fo.isIntersecting,on.triggerEvent(ji,Ia,li)}},$n.intersectionSpec);ja.observe(ji)}var Kl=ji.addEventListener||ji.on;Kl.call(ji,Ia,function ja(pa){if(typeof Node<"u"&&xi instanceof Node&&ji!==xi&&!xi.isConnected){ji.removeEventListener(Ia,ja);return}var li=on.makeContext(xi,_i,xi,pa);if(!($n.elsewhere&&xi.contains(pa.target))){$n.from&&(li.result=ji);for(let ho of $n.args){let Xs=li.event[ho.value];Xs!==void 0?li.locals[ho.value]=Xs:"detail"in li.event&&(li.locals[ho.value]=li.event.detail[ho.value])}if(li.meta.errorHandler=co,li.meta.errorSymbol=ts,li.meta.finallyHandler=Ws,$n.filter){var fo=li.meta.context;li.meta.context=li.event;try{var Yl=$n.filter.evaluate(li);if(!Yl)return}finally{li.meta.context=fo}}if($n.inExpr){for(var Oa=pa.target;;)if(Oa.matches&&Oa.matches($n.inExpr.css)){li.result=Oa;break}else if(Oa=Oa.parentElement,Oa==null)return}if($n.execCount++,$n.startCount){if($n.endCount){if($n.execCount<$n.startCount||$n.execCount>$n.endCount)return}else if($n.unbounded){if($n.execCount<$n.startCount)return}else if($n.execCount!==$n.startCount)return}if($n.debounceTime){$n.debounced&&clearTimeout($n.debounced),$n.debounced=setTimeout(function(){_i.execute(li)},$n.debounceTime);return}if($n.throttleTime){if($n.lastExec&&Date.now()<$n.lastExec+$n.throttleTime)return;$n.lastExec=Date.now()}_i.execute(li)}})})}}};return nn.setParent(uo,_i),_i}}),xn.addFeature("def",function(nn,on,Jr){if(Jr.matchToken("def")){var rn=nn.requireElement("dotOrColonPath",Jr),cn=rn.evaluate(),sn=cn.split("."),fn=sn.pop(),un=[];if(Jr.matchOpToken("(")&&!Jr.matchOpToken(")")){do un.push(Jr.requireTokenType("IDENTIFIER"));while(Jr.matchOpToken(","));Jr.requireOpToken(")")}var gn=nn.requireElement("commandList",Jr),En,Tn;if(Jr.matchToken("catch")&&(En=Jr.requireTokenType("IDENTIFIER").value,Tn=nn.parseElement("commandList",Jr)),Jr.matchToken("finally")){var Rn=nn.requireElement("commandList",Jr);nn.ensureTerminated(Rn)}var Bn={displayName:fn+"("+un.map(function(Cn){return Cn.value}).join(", ")+")",name:fn,args:un,start:gn,errorHandler:Tn,errorSymbol:En,finallyHandler:Rn,install:function(Cn,In){var _n=function(){var Un=on.makeContext(In,Bn,Cn,null);Un.meta.errorHandler=Tn,Un.meta.errorSymbol=En,Un.meta.finallyHandler=Rn;for(var ni=0;ni<un.length;ni++){var ii=un[ni],Ri=arguments[ni];ii&&(Un.locals[ii.value]=Ri)}Un.meta.caller=arguments[un.length],Un.meta.caller&&(Un.meta.callingCommand=Un.meta.caller.meta.command);var Bi,si=null,ki=new Promise(function(Hi,Ci){Bi=Hi,si=Ci});return gn.execute(Un),Un.meta.returned?Un.meta.returnValue:(Un.meta.resolve=Bi,Un.meta.reject=si,ki)};_n.hyperfunc=!0,_n.hypername=cn,on.assignToNamespace(Cn,sn,fn,_n)}};return nn.ensureTerminated(gn),Tn&&nn.ensureTerminated(Tn),nn.setParent(gn,Bn),Bn}}),xn.addFeature("set",function(nn,on,Jr){let rn=nn.parseElement("setCommand",Jr);if(rn){rn.target.scope!=="element"&&nn.raiseParseError(Jr,"variables declared at the feature level must be element scoped.");let cn={start:rn,install:function(sn,fn){rn&&rn.execute(on.makeContext(sn,cn,sn,null))}};return nn.ensureTerminated(rn),cn}}),xn.addFeature("init",function(nn,on,Jr){if(Jr.matchToken("init")){var rn=Jr.matchToken("immediately"),cn=nn.requireElement("commandList",Jr),sn={start:cn,install:function(fn,un){let gn=function(){cn&&cn.execute(on.makeContext(fn,sn,fn,null))};rn?gn():setTimeout(gn,0)}};return nn.ensureTerminated(cn),nn.setParent(cn,sn),sn}}),xn.addFeature("worker",function(nn,on,Jr){if(Jr.matchToken("worker")){nn.raiseParseError(Jr,"In order to use the 'worker' feature, include the _hyperscript worker plugin. See https://hyperscript.org/features/worker/ for more info.");return}}),xn.addFeature("behavior",function(nn,on,Jr){if(Jr.matchToken("behavior")){var rn=nn.requireElement("dotOrColonPath",Jr).evaluate(),cn=rn.split("."),sn=cn.pop(),fn=[];if(Jr.matchOpToken("(")&&!Jr.matchOpToken(")")){do fn.push(Jr.requireTokenType("IDENTIFIER").value);while(Jr.matchOpToken(","));Jr.requireOpToken(")")}for(var un=nn.requireElement("hyperscript",Jr),gn=0;gn<un.features.length;gn++){var En=un.features[gn];En.behavior=rn}return{install:function(Tn,Rn){on.assignToNamespace(Qr.document&&Qr.document.body,cn,sn,function(Bn,Cn,In){for(var _n=on.getInternalData(Bn),Un=jn(_n,rn+"Scope"),ni=0;ni<fn.length;ni++)Un[fn[ni]]=In[fn[ni]];un.apply(Bn,Cn)})}}}}),xn.addFeature("install",function(nn,on,Jr){if(Jr.matchToken("install")){var rn=nn.requireElement("dotOrColonPath",Jr).evaluate(),cn=rn.split("."),sn=nn.parseElement("namedArgumentList",Jr),fn;return fn={install:function(un,gn){on.unifiedEval({args:[sn],op:function(En,Tn){for(var Rn=Qr,Bn=0;Bn<cn.length;Bn++)if(Rn=Rn[cn[Bn]],typeof Rn!="object"&&typeof Rn!="function")throw new Error("No such behavior defined as "+rn);if(!(Rn instanceof Function))throw new Error(rn+" is not a behavior");Rn(un,gn,Tn)}},on.makeContext(un,fn,un,null))}}}}),xn.addGrammarElement("jsBody",function(nn,on,Jr){for(var rn=Jr.currentToken().start,cn=Jr.currentToken(),sn=[],fn="",un=!1;Jr.hasMore();){cn=Jr.consumeToken();var gn=Jr.token(0,!0);if(gn.type==="IDENTIFIER"&&gn.value==="end")break;un?cn.type==="IDENTIFIER"||cn.type==="NUMBER"?fn+=cn.value:(fn!==""&&sn.push(fn),fn="",un=!1):cn.type==="IDENTIFIER"&&cn.value==="function"&&(un=!0)}var En=cn.end+1;return{type:"jsBody",exposedFunctionNames:sn,jsSource:Jr.source.substring(rn,En)}}),xn.addFeature("js",function(nn,on,Jr){if(Jr.matchToken("js")){var rn=nn.requireElement("jsBody",Jr),cn=rn.jsSource+` 14 - return { `+rn.exposedFunctionNames.map(function(fn){return fn+":"+fn}).join(",")+" } ",sn=new Function(cn);return{jsSource:cn,function:sn,exposedFunctionNames:rn.exposedFunctionNames,install:function(){Object.assign(Qr,sn())}}}}),xn.addCommand("js",function(nn,on,Jr){if(Jr.matchToken("js")){var rn=[];if(Jr.matchOpToken("(")&&!Jr.matchOpToken(")")){do{var cn=Jr.requireTokenType("IDENTIFIER");rn.push(cn.value)}while(Jr.matchOpToken(","));Jr.requireOpToken(")")}var sn=nn.requireElement("jsBody",Jr);Jr.matchToken("end");var fn=Ti(Function,rn.concat([sn.jsSource])),un={jsSource:sn.jsSource,function:fn,inputs:rn,op:function(gn){var En=[];rn.forEach(function(Rn){En.push(on.resolveSymbol(Rn,gn,"default"))});var Tn=fn.apply(Qr,En);return Tn&&typeof Tn.then=="function"?new Promise(function(Rn){Tn.then(function(Bn){gn.result=Bn,Rn(on.findNext(this,gn))})}):(gn.result=Tn,on.findNext(this,gn))}};return un}}),xn.addCommand("async",function(nn,on,Jr){if(Jr.matchToken("async")){if(Jr.matchToken("do")){for(var rn=nn.requireElement("commandList",Jr),cn=rn;cn.next;)cn=cn.next;cn.next=on.HALT,Jr.requireToken("end")}else var rn=nn.requireElement("command",Jr);var sn={body:rn,op:function(fn){return setTimeout(function(){rn.execute(fn)}),on.findNext(this,fn)}};return nn.setParent(rn,sn),sn}}),xn.addCommand("tell",function(nn,on,Jr){var rn=Jr.currentToken();if(Jr.matchToken("tell")){var cn=nn.requireElement("expression",Jr),sn=nn.requireElement("commandList",Jr);Jr.hasMore()&&!nn.featureStart(Jr.currentToken())&&Jr.requireToken("end");var fn="tell_"+rn.start,un={value:cn,body:sn,args:[cn],resolveNext:function(gn){var En=gn.meta.iterators[fn];return En.index<En.value.length?(gn.you=En.value[En.index++],sn):(gn.you=En.originalYou,this.next?this.next:on.findNext(this.parent,gn))},op:function(gn,En){return En==null?En=[]:Array.isArray(En)||En instanceof NodeList||(En=[En]),gn.meta.iterators[fn]={originalYou:gn.you,index:0,value:En},this.resolveNext(gn)}};return nn.setParent(sn,un),un}}),xn.addCommand("wait",function(nn,on,Jr){if(Jr.matchToken("wait")){var rn;if(Jr.matchToken("for")){Jr.matchToken("a");var cn=[];do{var sn=Jr.token(0);sn.type==="NUMBER"||sn.type==="L_PAREN"?cn.push({time:nn.requireElement("expression",Jr).evaluate()}):cn.push({name:nn.requireElement("dotOrColonPath",Jr,"Expected event name").evaluate(),args:On(Jr)})}while(Jr.matchToken("or"));if(Jr.matchToken("from"))var fn=nn.requireElement("expression",Jr);return rn={event:cn,on:fn,args:[fn],op:function(gn,En){var Tn=En||gn.me;if(!(Tn instanceof EventTarget))throw new Error("Not a valid event target: "+this.on.sourceFor());return new Promise(Rn=>{var Bn=!1;for(let In of cn){var Cn=_n=>{if(gn.result=_n,In.args)for(let Un of In.args)gn.locals[Un.value]=_n[Un.value]||(_n.detail?_n.detail[Un.value]:null);Bn||(Bn=!0,Rn(on.findNext(this,gn)))};In.name?Tn.addEventListener(In.name,Cn,{once:!0}):In.time!=null&&setTimeout(Cn,In.time,In.time)}})}},rn}else{var un;return Jr.matchToken("a")?(Jr.requireToken("tick"),un=0):un=nn.requireElement("expression",Jr),rn={type:"waitCmd",time:un,args:[un],op:function(gn,En){return new Promise(Tn=>{setTimeout(()=>{Tn(on.findNext(this,gn))},En)})},execute:function(gn){return on.unifiedExec(this,gn)}},rn}}}),xn.addGrammarElement("dotOrColonPath",function(nn,on,Jr){var rn=Jr.matchTokenType("IDENTIFIER");if(rn){var cn=[rn.value],sn=Jr.matchOpToken(".")||Jr.matchOpToken(":");if(sn)do cn.push(Jr.requireTokenType("IDENTIFIER","NUMBER").value);while(Jr.matchOpToken(sn.value));return{type:"dotOrColonPath",path:cn,evaluate:function(){return cn.join(sn?sn.value:"")}}}}),xn.addGrammarElement("eventName",function(nn,on,Jr){var rn;return(rn=Jr.matchTokenType("STRING"))?{evaluate:function(){return rn.value}}:nn.parseElement("dotOrColonPath",Jr)});function Pn(nn,on,Jr,rn){var cn=on.requireElement("eventName",rn),sn=on.parseElement("namedArgumentList",rn);if(nn==="send"&&rn.matchToken("to")||nn==="trigger"&&rn.matchToken("on"))var fn=on.requireElement("expression",rn);else var fn=on.requireElement("implicitMeTarget",rn);var un={eventName:cn,details:sn,to:fn,args:[fn,cn,sn],op:function(gn,En,Tn,Rn){return Jr.nullCheck(En,fn),Jr.implicitLoop(En,function(Bn){Jr.triggerEvent(Bn,Tn,Rn,gn.me)}),Jr.findNext(un,gn)}};return un}xn.addCommand("trigger",function(nn,on,Jr){if(Jr.matchToken("trigger"))return Pn("trigger",nn,on,Jr)}),xn.addCommand("send",function(nn,on,Jr){if(Jr.matchToken("send"))return Pn("send",nn,on,Jr)});var Nn=function(nn,on,Jr,rn){if(rn)if(nn.commandBoundary(Jr.currentToken()))nn.raiseParseError(Jr,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.");else var cn=nn.requireElement("expression",Jr);var sn={value:cn,args:[cn],op:function(fn,un){var gn=fn.meta.resolve;return fn.meta.returned=!0,fn.meta.returnValue=un,gn&&(un?gn(un):gn()),on.HALT}};return sn};xn.addCommand("return",function(nn,on,Jr){if(Jr.matchToken("return"))return Nn(nn,on,Jr,!0)}),xn.addCommand("exit",function(nn,on,Jr){if(Jr.matchToken("exit"))return Nn(nn,on,Jr,!1)}),xn.addCommand("halt",function(nn,on,Jr){if(Jr.matchToken("halt")){if(Jr.matchToken("the")){Jr.requireToken("event"),Jr.matchOpToken("'")&&Jr.requireToken("s");var rn=!0}if(Jr.matchToken("bubbling"))var cn=!0;else if(Jr.matchToken("default"))var sn=!0;var fn=Nn(nn,on,Jr,!1),un={keepExecuting:!0,bubbling:cn,haltDefault:sn,exit:fn,op:function(gn){if(gn.event)return cn?gn.event.stopPropagation():(sn||gn.event.stopPropagation(),gn.event.preventDefault()),rn?on.findNext(this,gn):fn}};return un}}),xn.addCommand("log",function(nn,on,Jr){if(Jr.matchToken("log")){for(var rn=[nn.parseElement("expression",Jr)];Jr.matchOpToken(",");)rn.push(nn.requireElement("expression",Jr));if(Jr.matchToken("with"))var cn=nn.requireElement("expression",Jr);var sn={exprs:rn,withExpr:cn,args:[cn,rn],op:function(fn,un,gn){return un?un.apply(null,gn):console.log.apply(null,gn),on.findNext(this,fn)}};return sn}}),xn.addCommand("beep!",function(nn,on,Jr){if(Jr.matchToken("beep!")){for(var rn=[nn.parseElement("expression",Jr)];Jr.matchOpToken(",");)rn.push(nn.requireElement("expression",Jr));var cn={exprs:rn,args:[rn],op:function(sn,fn){for(let un=0;un<rn.length;un++){let gn=rn[un],En=fn[un];on.beepValueToConsole(sn.me,gn,En)}return on.findNext(this,sn)}};return cn}}),xn.addCommand("throw",function(nn,on,Jr){if(Jr.matchToken("throw")){var rn=nn.requireElement("expression",Jr),cn={expr:rn,args:[rn],op:function(sn,fn){throw on.registerHyperTrace(sn,fn),fn}};return cn}});var Dn=function(nn,on,Jr){var rn=nn.requireElement("expression",Jr),cn={expr:rn,args:[rn],op:function(sn,fn){return sn.result=fn,on.findNext(cn,sn)}};return cn};xn.addCommand("call",function(nn,on,Jr){if(Jr.matchToken("call")){var rn=Dn(nn,on,Jr);return rn.expr&&rn.expr.type!=="functionCall"&&nn.raiseParseError(Jr,"Must be a function invocation"),rn}}),xn.addCommand("get",function(nn,on,Jr){if(Jr.matchToken("get"))return Dn(nn,on,Jr)}),xn.addCommand("make",function(nn,on,Jr){if(Jr.matchToken("make")){Jr.matchToken("a")||Jr.matchToken("an");var rn=nn.requireElement("expression",Jr),cn=[];if(rn.type!=="queryRef"&&Jr.matchToken("from"))do cn.push(nn.requireElement("expression",Jr));while(Jr.matchOpToken(","));if(Jr.matchToken("called"))var sn=nn.requireElement("symbol",Jr);var fn;return rn.type==="queryRef"?(fn={op:function(un){for(var gn,En="div",Tn,Rn=[],Bn=/(?:(^|#|\.)([^#\. ]+))/g;gn=Bn.exec(rn.css);)gn[1]===""?En=gn[2].trim():gn[1]==="#"?Tn=gn[2].trim():Rn.push(gn[2].trim());var Cn=document.createElement(En);Tn!==void 0&&(Cn.id=Tn);for(var In=0;In<Rn.length;In++){var _n=Rn[In];Cn.classList.add(_n)}return un.result=Cn,sn&&on.setSymbol(sn.name,un,sn.scope,Cn),on.findNext(this,un)}},fn):(fn={args:[rn,cn],op:function(un,gn,En){return un.result=Ti(gn,En),sn&&on.setSymbol(sn.name,un,sn.scope,un.result),on.findNext(this,un)}},fn)}}),xn.addGrammarElement("pseudoCommand",function(nn,on,Jr){let rn=Jr.token(1);if(!(rn&&rn.op&&(rn.value==="."||rn.value==="(")))return null;for(var cn=nn.requireElement("primaryExpression",Jr),sn=cn.root,fn=cn;sn.root!=null;)fn=fn.root,sn=sn.root;if(cn.type!=="functionCall"&&nn.raiseParseError(Jr,"Pseudo-commands must be function calls"),fn.type==="functionCall"&&fn.root.root==null){if(Jr.matchAnyToken("the","to","on","with","into","from","at"))var un=nn.requireElement("expression",Jr);else if(Jr.matchToken("me"))var un=nn.requireElement("implicitMeTarget",Jr)}var gn;return un?gn={type:"pseudoCommand",root:un,argExressions:fn.argExressions,args:[un,fn.argExressions],op:function(En,Tn,Rn){on.nullCheck(Tn,un);var Bn=Tn[fn.root.name];return on.nullCheck(Bn,fn),Bn.hyperfunc&&Rn.push(En),En.result=Bn.apply(Tn,Rn),on.findNext(gn,En)},execute:function(En){return on.unifiedExec(this,En)}}:gn={type:"pseudoCommand",expr:cn,args:[cn],op:function(En,Tn){return En.result=Tn,on.findNext(gn,En)},execute:function(En){return on.unifiedExec(this,En)}},gn});var Ln=function(nn,on,Jr,rn,cn){var sn=rn.type==="symbol",fn=rn.type==="attributeRef",un=rn.type==="styleRef",gn=rn.type==="arrayIndex";!(fn||un||sn)&&rn.root==null&&nn.raiseParseError(Jr,"Can only put directly into symbols, not references");var En=null,Tn=null;if(!sn)if(fn||un){En=nn.requireElement("implicitMeTarget",Jr);var Rn=rn}else if(gn)Tn=rn.firstIndex,En=rn.root;else{Tn=rn.prop?rn.prop.value:null;var Rn=rn.attribute;En=rn.root}var Bn={target:rn,symbolWrite:sn,value:cn,args:[En,Tn,cn],op:function(Cn,In,_n,Un){return sn?on.setSymbol(rn.name,Cn,rn.scope,Un):(on.nullCheck(In,En),gn?In[_n]=Un:on.implicitLoop(In,function(ni){Rn?Rn.type==="attributeRef"?Un==null?ni.removeAttribute(Rn.name):ni.setAttribute(Rn.name,Un):ni.style[Rn.name]=Un:ni[_n]=Un})),on.findNext(this,Cn)}};return Bn};xn.addCommand("default",function(nn,on,Jr){if(Jr.matchToken("default")){var rn=nn.requireElement("assignableExpression",Jr);Jr.requireToken("to");var cn=nn.requireElement("expression",Jr),sn=Ln(nn,on,Jr,rn,cn),fn={target:rn,value:cn,setter:sn,args:[rn],op:function(un,gn){return gn?on.findNext(this,un):sn}};return sn.parent=fn,fn}}),xn.addCommand("set",function(nn,on,Jr){if(Jr.matchToken("set")){if(Jr.currentToken().type==="L_BRACE"){var rn=nn.requireElement("objectLiteral",Jr);Jr.requireToken("on");var cn=nn.requireElement("expression",Jr),sn={objectLiteral:rn,target:cn,args:[rn,cn],op:function(un,gn,En){return Object.assign(En,gn),on.findNext(this,un)}};return sn}try{Jr.pushFollow("to");var cn=nn.requireElement("assignableExpression",Jr)}finally{Jr.popFollow()}Jr.requireToken("to");var fn=nn.requireElement("expression",Jr);return Ln(nn,on,Jr,cn,fn)}}),xn.addCommand("if",function(nn,on,Jr){if(!Jr.matchToken("if"))return;var rn=nn.requireElement("expression",Jr);Jr.matchToken("then");var cn=nn.parseElement("commandList",Jr),sn=!1;let fn=Jr.matchToken("else")||Jr.matchToken("otherwise");if(fn){let En=Jr.peekToken("if");if(sn=En!=null&&En.line===fn.line,sn)var un=nn.parseElement("command",Jr);else var un=nn.parseElement("commandList",Jr)}Jr.hasMore()&&!sn&&Jr.requireToken("end");var gn={expr:rn,trueBranch:cn,falseBranch:un,args:[rn],op:function(En,Tn){return Tn?cn:un||on.findNext(this,En)}};return nn.setParent(cn,gn),nn.setParent(un,gn),gn});var Fn=function(nn,on,Jr,rn){var cn=on.currentToken(),sn;if(on.matchToken("for")||rn){var fn=on.requireTokenType("IDENTIFIER");sn=fn.value,on.requireToken("in");var un=nn.requireElement("expression",on)}else if(on.matchToken("in")){sn="it";var un=nn.requireElement("expression",on)}else if(on.matchToken("while"))var gn=nn.requireElement("expression",on);else if(on.matchToken("until")){var En=!0;if(on.matchToken("event")){var Tn=nn.requireElement("dotOrColonPath",on,"Expected event name");if(on.matchToken("from"))var Rn=nn.requireElement("expression",on)}else var gn=nn.requireElement("expression",on)}else if(!nn.commandBoundary(on.currentToken())&&on.currentToken().value!=="forever"){var Bn=nn.requireElement("expression",on);on.requireToken("times")}else{on.matchToken("forever");var Cn=!0}if(on.matchToken("index"))var fn=on.requireTokenType("IDENTIFIER"),In=fn.value;else if(on.matchToken("indexed")){on.requireToken("by");var fn=on.requireTokenType("IDENTIFIER"),In=fn.value}var _n=nn.parseElement("commandList",on);if(_n&&Tn){for(var Un=_n;Un.next;)Un=Un.next;var ni={type:"waitATick",op:function(){return new Promise(function(si){setTimeout(function(){si(Jr.findNext(ni))},0)})}};Un.next=ni}if(on.hasMore()&&on.requireToken("end"),sn==null){sn="_implicit_repeat_"+cn.start;var ii=sn}else var ii=sn+"_"+cn.start;var Ri={identifier:sn,indexIdentifier:In,slot:ii,expression:un,forever:Cn,times:Bn,until:En,event:Tn,on:Rn,whileExpr:gn,resolveNext:function(){return this},loop:_n,args:[gn,Bn],op:function(si,ki,Hi){var Ci=si.meta.iterators[ii],Ni=!1,Ca=null;if(this.forever)Ni=!0;else if(this.until)Tn?Ni=si.meta.iterators[ii].eventFired===!1:Ni=ki!==!0;else if(gn)Ni=ki;else if(Hi)Ni=Ci.index<Hi;else{var _a=Ci.iterator.next();Ni=!_a.done,Ca=_a.value}return Ni?(Ci.value?si.result=si.locals[sn]=Ca:si.result=Ci.index,In&&(si.locals[In]=Ci.index),Ci.index++,_n):(si.meta.iterators[ii]=null,Jr.findNext(this.parent,si))}};nn.setParent(_n,Ri);var Bi={name:"repeatInit",args:[un,Tn,Rn],op:function(si,ki,Hi,Ci){var Ni={index:0,value:ki,eventFired:!1};if(si.meta.iterators[ii]=Ni,ki&&ki[Symbol.iterator]&&(Ni.iterator=ki[Symbol.iterator]()),Tn){var Ca=Ci||si.me;Ca.addEventListener(Hi,function(_a){si.meta.iterators[ii].eventFired=!0},{once:!0})}return Ri},execute:function(si){return Jr.unifiedExec(this,si)}};return nn.setParent(Ri,Bi),Bi};xn.addCommand("repeat",function(nn,on,Jr){if(Jr.matchToken("repeat"))return Fn(nn,Jr,on,!1)}),xn.addCommand("for",function(nn,on,Jr){if(Jr.matchToken("for"))return Fn(nn,Jr,on,!0)}),xn.addCommand("continue",function(nn,on,Jr){if(Jr.matchToken("continue")){var rn={op:function(cn){for(var sn=this.parent;;sn=sn.parent)if(sn==null&&nn.raiseParseError(Jr,"Command `continue` cannot be used outside of a `repeat` loop."),sn.loop!=null)return sn.resolveNext(cn)}};return rn}}),xn.addCommand("break",function(nn,on,Jr){if(Jr.matchToken("break")){var rn={op:function(cn){for(var sn=this.parent;;sn=sn.parent)if(sn==null&&nn.raiseParseError(Jr,"Command `continue` cannot be used outside of a `repeat` loop."),sn.loop!=null)return on.findNext(sn.parent,cn)}};return rn}}),xn.addGrammarElement("stringLike",function(nn,on,Jr){return nn.parseAnyOf(["string","nakedString"],Jr)}),xn.addCommand("append",function(nn,on,Jr){if(Jr.matchToken("append")){var rn=null,cn=nn.requireElement("expression",Jr),sn={type:"symbol",evaluate:function(gn){return on.resolveSymbol("result",gn)}};Jr.matchToken("to")?rn=nn.requireElement("expression",Jr):rn=sn;var fn=null;(rn.type==="symbol"||rn.type==="attributeRef"||rn.root!=null)&&(fn=Ln(nn,on,Jr,rn,sn));var un={value:cn,target:rn,args:[rn,cn],op:function(gn,En,Tn){if(Array.isArray(En))return En.push(Tn),on.findNext(this,gn);if(En instanceof Element)return Tn instanceof Element?En.insertAdjacentElement("beforeend",Tn):En.insertAdjacentHTML("beforeend",Tn),on.processNode(En),on.findNext(this,gn);if(fn)return gn.result=(En||"")+Tn,fn;throw Error("Unable to append a value!")},execute:function(gn){return on.unifiedExec(this,gn)}};return fn!=null&&(fn.parent=un),un}});function Mn(nn,on,Jr){Jr.matchToken("at")||Jr.matchToken("from");let rn={includeStart:!0,includeEnd:!1};return rn.from=Jr.matchToken("start")?0:nn.requireElement("expression",Jr),(Jr.matchToken("to")||Jr.matchOpToken(".."))&&(Jr.matchToken("end")?rn.toEnd=!0:rn.to=nn.requireElement("expression",Jr)),Jr.matchToken("inclusive")?rn.includeEnd=!0:Jr.matchToken("exclusive")&&(rn.includeStart=!1),rn}class Hn{constructor(on,Jr){this.re=on,this.str=Jr}next(){let on=this.re.exec(this.str);return on===null?{done:!0}:{value:on}}}class Wn{constructor(on,Jr,rn){this.re=on,this.flags=Jr,this.str=rn}[Symbol.iterator](){return new Hn(new RegExp(this.re,this.flags),this.str)}}xn.addCommand("pick",(nn,on,Jr)=>{if(Jr.matchToken("pick")){if(Jr.matchToken("the"),Jr.matchToken("item")||Jr.matchToken("items")||Jr.matchToken("character")||Jr.matchToken("characters")){let rn=Mn(nn,on,Jr);return Jr.requireToken("from"),{args:[nn.requireElement("expression",Jr),rn.from,rn.to],op(sn,fn,un,gn){return rn.toEnd&&(gn=fn.length),rn.includeStart||un++,rn.includeEnd&&gn++,(gn==null||gn==null)&&(gn=un+1),sn.result=fn.slice(un,gn),on.findNext(this,sn)}}}if(Jr.matchToken("match")){Jr.matchToken("of");let rn=nn.parseElement("expression",Jr),cn="";return Jr.matchOpToken("|")&&(cn=Jr.requireTokenType("IDENTIFIER").value),Jr.requireToken("from"),{args:[nn.parseElement("expression",Jr),rn],op(fn,un,gn){return fn.result=new RegExp(gn,cn).exec(un),on.findNext(this,fn)}}}if(Jr.matchToken("matches")){Jr.matchToken("of");let rn=nn.parseElement("expression",Jr),cn="gu";return Jr.matchOpToken("|")&&(cn="g"+Jr.requireTokenType("IDENTIFIER").value.replace("g","")),Jr.requireToken("from"),{args:[nn.parseElement("expression",Jr),rn],op(fn,un,gn){return fn.result=new Wn(gn,cn,un),on.findNext(this,fn)}}}}}),xn.addCommand("increment",function(nn,on,Jr){if(Jr.matchToken("increment")){var rn,cn=nn.parseElement("assignableExpression",Jr);Jr.matchToken("by")&&(rn=nn.requireElement("expression",Jr));var sn={type:"implicitIncrementOp",target:cn,args:[cn,rn],op:function(fn,un,gn){un=un?parseFloat(un):0,gn=rn?parseFloat(gn):1;var En=un+gn;return fn.result=En,En},evaluate:function(fn){return on.unifiedEval(this,fn)}};return Ln(nn,on,Jr,cn,sn)}}),xn.addCommand("decrement",function(nn,on,Jr){if(Jr.matchToken("decrement")){var rn,cn=nn.parseElement("assignableExpression",Jr);Jr.matchToken("by")&&(rn=nn.requireElement("expression",Jr));var sn={type:"implicitDecrementOp",target:cn,args:[cn,rn],op:function(fn,un,gn){un=un?parseFloat(un):0,gn=rn?parseFloat(gn):1;var En=un-gn;return fn.result=En,En},evaluate:function(fn){return on.unifiedEval(this,fn)}};return Ln(nn,on,Jr,cn,sn)}});function zn(nn,on){var Jr="text",rn;return nn.matchToken("a")||nn.matchToken("an"),nn.matchToken("json")||nn.matchToken("Object")?Jr="json":nn.matchToken("response")?Jr="response":nn.matchToken("html")?Jr="html":nn.matchToken("text")||(rn=on.requireElement("dotOrColonPath",nn).evaluate()),{type:Jr,conversion:rn}}xn.addCommand("fetch",function(nn,on,Jr){if(Jr.matchToken("fetch")){var rn=nn.requireElement("stringLike",Jr);if(Jr.matchToken("as"))var cn=zn(Jr,nn);if(Jr.matchToken("with")&&Jr.currentToken().value!=="{")var sn=nn.parseElement("nakedNamedArgumentList",Jr);else var sn=nn.parseElement("objectLiteral",Jr);cn==null&&Jr.matchToken("as")&&(cn=zn(Jr,nn));var fn=cn?cn.type:"text",un=cn?cn.conversion:null,gn={url:rn,argExpressions:sn,args:[rn,sn],op:function(En,Tn,Rn){var Bn=Rn||{};Bn.sender=En.me,Bn.headers=Bn.headers||{};var Cn=new AbortController;let In=En.me.addEventListener("fetch:abort",function(){Cn.abort()},{once:!0});Bn.signal=Cn.signal,on.triggerEvent(En.me,"hyperscript:beforeFetch",Bn),on.triggerEvent(En.me,"fetch:beforeRequest",Bn),Rn=Bn;var _n=!1;return Rn.timeout&&setTimeout(function(){_n||Cn.abort()},Rn.timeout),fetch(Tn,Rn).then(function(Un){let ni={response:Un};return on.triggerEvent(En.me,"fetch:afterResponse",ni),Un=ni.response,fn==="response"?(En.result=Un,on.triggerEvent(En.me,"fetch:afterRequest",{result:Un}),_n=!0,on.findNext(gn,En)):fn==="json"?Un.json().then(function(ii){return En.result=ii,on.triggerEvent(En.me,"fetch:afterRequest",{result:ii}),_n=!0,on.findNext(gn,En)}):Un.text().then(function(ii){return un&&(ii=on.convertValue(ii,un)),fn==="html"&&(ii=on.convertValue(ii,"Fragment")),En.result=ii,on.triggerEvent(En.me,"fetch:afterRequest",{result:ii}),_n=!0,on.findNext(gn,En)})}).catch(function(Un){throw on.triggerEvent(En.me,"fetch:error",{reason:Un}),Un}).finally(function(){En.me.removeEventListener("fetch:abort",In)})}};return gn}})}function oi(xn){xn.addCommand("settle",function(vn,bn,hn){if(hn.matchToken("settle")){if(vn.commandBoundary(hn.currentToken()))var On=vn.requireElement("implicitMeTarget",hn);else var On=vn.requireElement("expression",hn);var Pn={type:"settleCmd",args:[On],op:function(Nn,Dn){bn.nullCheck(Dn,On);var Ln=null,Fn=!1,Mn=!1,Hn=new Promise(function(Wn){Ln=Wn});return Dn.addEventListener("transitionstart",function(){Mn=!0},{once:!0}),setTimeout(function(){!Mn&&!Fn&&Ln(bn.findNext(Pn,Nn))},500),Dn.addEventListener("transitionend",function(){Fn||Ln(bn.findNext(Pn,Nn))},{once:!0}),Hn},execute:function(Nn){return bn.unifiedExec(this,Nn)}};return Pn}}),xn.addCommand("add",function(vn,bn,hn){if(hn.matchToken("add")){var On=vn.parseElement("classRef",hn),Pn=null,Nn=null;if(On==null)Pn=vn.parseElement("attributeRef",hn),Pn==null&&(Nn=vn.parseElement("styleLiteral",hn),Nn==null&&vn.raiseParseError(hn,"Expected either a class reference or attribute expression"));else for(var Dn=[On];On=vn.parseElement("classRef",hn);)Dn.push(On);if(hn.matchToken("to"))var Ln=vn.requireElement("expression",hn);else var Ln=vn.requireElement("implicitMeTarget",hn);if(hn.matchToken("when")){Nn&&vn.raiseParseError(hn,"Only class and properties are supported with a when clause");var Fn=vn.requireElement("expression",hn)}return Dn?{classRefs:Dn,to:Ln,args:[Ln,Dn],op:function(Mn,Hn,Wn){return bn.nullCheck(Hn,Ln),bn.forEach(Wn,function(zn){bn.implicitLoop(Hn,function(nn){Fn?(Mn.result=nn,bn.evaluateNoPromise(Fn,Mn)?nn instanceof Element&&nn.classList.add(zn.className):nn instanceof Element&&nn.classList.remove(zn.className),Mn.result=null):nn instanceof Element&&nn.classList.add(zn.className)})}),bn.findNext(this,Mn)}}:Pn?{type:"addCmd",attributeRef:Pn,to:Ln,args:[Ln],op:function(Mn,Hn,Wn){return bn.nullCheck(Hn,Ln),bn.implicitLoop(Hn,function(zn){Fn?(Mn.result=zn,bn.evaluateNoPromise(Fn,Mn)?zn.setAttribute(Pn.name,Pn.value):zn.removeAttribute(Pn.name),Mn.result=null):zn.setAttribute(Pn.name,Pn.value)}),bn.findNext(this,Mn)},execute:function(Mn){return bn.unifiedExec(this,Mn)}}:{type:"addCmd",cssDeclaration:Nn,to:Ln,args:[Ln,Nn],op:function(Mn,Hn,Wn){return bn.nullCheck(Hn,Ln),bn.implicitLoop(Hn,function(zn){zn.style.cssText+=Wn}),bn.findNext(this,Mn)},execute:function(Mn){return bn.unifiedExec(this,Mn)}}}}),xn.addGrammarElement("styleLiteral",function(vn,bn,hn){if(hn.matchOpToken("{")){for(var On=[""],Pn=[];hn.hasMore();){if(hn.matchOpToken("\\"))hn.consumeToken();else{if(hn.matchOpToken("}"))break;if(hn.matchToken("$")){var Nn=hn.matchOpToken("{"),Dn=vn.parseElement("expression",hn);Nn&&hn.requireOpToken("}"),Pn.push(Dn),On.push("")}else{var Ln=hn.consumeToken();On[On.length-1]+=hn.source.substring(Ln.start,Ln.end)}}On[On.length-1]+=hn.lastWhitespace()}return{type:"styleLiteral",args:[Pn],op:function(Fn,Mn){var Hn="";return On.forEach(function(Wn,zn){Hn+=Wn,zn in Mn&&(Hn+=Mn[zn])}),Hn},evaluate:function(Fn){return bn.unifiedEval(this,Fn)}}}}),xn.addCommand("remove",function(vn,bn,hn){if(hn.matchToken("remove")){var On=vn.parseElement("classRef",hn),Pn=null,Nn=null;if(On==null)Pn=vn.parseElement("attributeRef",hn),Pn==null&&(Nn=vn.parseElement("expression",hn),Nn==null&&vn.raiseParseError(hn,"Expected either a class reference, attribute expression or value expression"));else for(var Dn=[On];On=vn.parseElement("classRef",hn);)Dn.push(On);if(hn.matchToken("from"))var Ln=vn.requireElement("expression",hn);else if(Nn==null)var Ln=vn.requireElement("implicitMeTarget",hn);return Nn?{elementExpr:Nn,from:Ln,args:[Nn,Ln],op:function(Fn,Mn,Hn){return bn.nullCheck(Mn,Nn),bn.implicitLoop(Mn,function(Wn){Wn.parentElement&&(Hn==null||Hn.contains(Wn))&&Wn.parentElement.removeChild(Wn)}),bn.findNext(this,Fn)}}:{classRefs:Dn,attributeRef:Pn,elementExpr:Nn,from:Ln,args:[Dn,Ln],op:function(Fn,Mn,Hn){return bn.nullCheck(Hn,Ln),Mn?bn.forEach(Mn,function(Wn){bn.implicitLoop(Hn,function(zn){zn.classList.remove(Wn.className)})}):bn.implicitLoop(Hn,function(Wn){Wn.removeAttribute(Pn.name)}),bn.findNext(this,Fn)}}}}),xn.addCommand("toggle",function(vn,bn,hn){if(hn.matchToken("toggle")){if(hn.matchAnyToken("the","my"),hn.currentToken().type==="STYLE_REF"){var On=hn.consumeToken().value.substr(1),Pn=!0,Nn=pn(vn,hn,On);if(hn.matchToken("of")){hn.pushFollow("with");try{var Dn=vn.requireElement("expression",hn)}finally{hn.popFollow()}}else var Dn=vn.requireElement("implicitMeTarget",hn)}else if(hn.matchToken("between")){var Ln=!0,Fn=vn.parseElement("classRef",hn);hn.requireToken("and");var Mn=vn.requireElement("classRef",hn)}else{var Fn=vn.parseElement("classRef",hn),Hn=null;if(Fn==null)Hn=vn.parseElement("attributeRef",hn),Hn==null&&vn.raiseParseError(hn,"Expected either a class reference or attribute expression");else for(var Wn=[Fn];Fn=vn.parseElement("classRef",hn);)Wn.push(Fn)}if(Pn!==!0)if(hn.matchToken("on"))var Dn=vn.requireElement("expression",hn);else var Dn=vn.requireElement("implicitMeTarget",hn);if(hn.matchToken("for"))var zn=vn.requireElement("expression",hn);else if(hn.matchToken("until")){var nn=vn.requireElement("dotOrColonPath",hn,"Expected event name");if(hn.matchToken("from"))var on=vn.requireElement("expression",hn)}var Jr={classRef:Fn,classRef2:Mn,classRefs:Wn,attributeRef:Hn,on:Dn,time:zn,evt:nn,from:on,toggle:function(rn,cn,sn,fn){bn.nullCheck(rn,Dn),Pn?bn.implicitLoop(rn,function(un){Nn("toggle",un)}):Ln?bn.implicitLoop(rn,function(un){un.classList.contains(cn.className)?(un.classList.remove(cn.className),un.classList.add(sn.className)):(un.classList.add(cn.className),un.classList.remove(sn.className))}):fn?bn.forEach(fn,function(un){bn.implicitLoop(rn,function(gn){gn.classList.toggle(un.className)})}):bn.implicitLoop(rn,function(un){un.hasAttribute(Hn.name)?un.removeAttribute(Hn.name):un.setAttribute(Hn.name,Hn.value)})},args:[Dn,zn,nn,on,Fn,Mn,Wn],op:function(rn,cn,sn,fn,un,gn,En,Tn){return sn?new Promise(function(Rn){Jr.toggle(cn,gn,En,Tn),setTimeout(function(){Jr.toggle(cn,gn,En,Tn),Rn(bn.findNext(Jr,rn))},sn)}):fn?new Promise(function(Rn){var Bn=un||rn.me;Bn.addEventListener(fn,function(){Jr.toggle(cn,gn,En,Tn),Rn(bn.findNext(Jr,rn))},{once:!0}),Jr.toggle(cn,gn,En,Tn)}):(this.toggle(cn,gn,En,Tn),bn.findNext(Jr,rn))}};return Jr}});var en={display:function(vn,bn,hn){if(hn)bn.style.display=hn;else if(vn==="toggle")getComputedStyle(bn).display==="none"?en.display("show",bn,hn):en.display("hide",bn,hn);else if(vn==="hide"){let On=xn.runtime.getInternalData(bn);On.originalDisplay==null&&(On.originalDisplay=bn.style.display),bn.style.display="none"}else{let On=xn.runtime.getInternalData(bn);On.originalDisplay&&On.originalDisplay!=="none"?bn.style.display=On.originalDisplay:bn.style.removeProperty("display")}},visibility:function(vn,bn,hn){hn?bn.style.visibility=hn:vn==="toggle"?getComputedStyle(bn).visibility==="hidden"?en.visibility("show",bn,hn):en.visibility("hide",bn,hn):vn==="hide"?bn.style.visibility="hidden":bn.style.visibility="visible"},opacity:function(vn,bn,hn){hn?bn.style.opacity=hn:vn==="toggle"?getComputedStyle(bn).opacity==="0"?en.opacity("show",bn,hn):en.opacity("hide",bn,hn):vn==="hide"?bn.style.opacity="0":bn.style.opacity="1"}},an=function(vn,bn,hn){var On,Pn=hn.currentToken();return Pn.value==="when"||Pn.value==="with"||vn.commandBoundary(Pn)?On=vn.parseElement("implicitMeTarget",hn):On=vn.parseElement("expression",hn),On},pn=function(vn,bn,hn){var On=Wr.defaultHideShowStrategy,Pn=en;Wr.hideShowStrategies&&(Pn=Object.assign(Pn,Wr.hideShowStrategies)),hn=hn||On||"display";var Nn=Pn[hn];return Nn==null&&vn.raiseParseError(bn,"Unknown show/hide strategy : "+hn),Nn};xn.addCommand("hide",function(vn,bn,hn){if(hn.matchToken("hide")){var On=an(vn,bn,hn),Pn=null;hn.matchToken("with")&&(Pn=hn.requireTokenType("IDENTIFIER","STYLE_REF").value,Pn.indexOf("*")===0&&(Pn=Pn.substr(1)));var Nn=pn(vn,hn,Pn);return{target:On,args:[On],op:function(Dn,Ln){return bn.nullCheck(Ln,On),bn.implicitLoop(Ln,function(Fn){Nn("hide",Fn)}),bn.findNext(this,Dn)}}}}),xn.addCommand("show",function(vn,bn,hn){if(hn.matchToken("show")){var On=an(vn,bn,hn),Pn=null;hn.matchToken("with")&&(Pn=hn.requireTokenType("IDENTIFIER","STYLE_REF").value,Pn.indexOf("*")===0&&(Pn=Pn.substr(1)));var Nn=null;if(hn.matchOpToken(":")){var Dn=hn.consumeUntilWhitespace();hn.matchTokenType("WHITESPACE"),Nn=Dn.map(function(Mn){return Mn.value}).join("")}if(hn.matchToken("when"))var Ln=vn.requireElement("expression",hn);var Fn=pn(vn,hn,Pn);return{target:On,when:Ln,args:[On],op:function(Mn,Hn){return bn.nullCheck(Hn,On),bn.implicitLoop(Hn,function(Wn){Ln?(Mn.result=Wn,bn.evaluateNoPromise(Ln,Mn)?Fn("show",Wn,Nn):Fn("hide",Wn),Mn.result=null):Fn("show",Wn,Nn)}),bn.findNext(this,Mn)}}}}),xn.addCommand("take",function(vn,bn,hn){if(hn.matchToken("take")){let Fn=null,Mn=[];for(;Fn=vn.parseElement("classRef",hn);)Mn.push(Fn);var On=null,Pn=null;let Hn=Mn.length>0;if(Hn||(On=vn.parseElement("attributeRef",hn),On==null&&vn.raiseParseError(hn,"Expected either a class reference or attribute expression"),hn.matchToken("with")&&(Pn=vn.requireElement("expression",hn))),hn.matchToken("from"))var Nn=vn.requireElement("expression",hn);if(hn.matchToken("for"))var Dn=vn.requireElement("expression",hn);else var Dn=vn.requireElement("implicitMeTarget",hn);if(Hn){var Ln={classRefs:Mn,from:Nn,forElt:Dn,args:[Mn,Nn,Dn],op:function(Wn,zn,nn,on){return bn.nullCheck(on,Dn),bn.implicitLoop(zn,function(Jr){var rn=Jr.className;nn?bn.implicitLoop(nn,function(cn){cn.classList.remove(rn)}):bn.implicitLoop(Jr,function(cn){cn.classList.remove(rn)}),bn.implicitLoop(on,function(cn){cn.classList.add(rn)})}),bn.findNext(this,Wn)}};return Ln}else{var Ln={attributeRef:On,from:Nn,forElt:Dn,args:[Nn,Dn,Pn],op:function(zn,nn,on,Jr){return bn.nullCheck(nn,Nn),bn.nullCheck(on,Dn),bn.implicitLoop(nn,function(rn){Jr?rn.setAttribute(On.name,Jr):rn.removeAttribute(On.name)}),bn.implicitLoop(on,function(rn){rn.setAttribute(On.name,On.value||"")}),bn.findNext(this,zn)}};return Ln}}});function mn(vn,bn,hn,On){if(hn!=null)var Pn=vn.resolveSymbol(hn,bn);else var Pn=bn;if(Pn instanceof Element||Pn instanceof HTMLDocument){for(;Pn.firstChild;)Pn.removeChild(Pn.firstChild);Pn.append(xn.runtime.convertValue(On,"Fragment")),vn.processNode(Pn)}else if(hn!=null)vn.setSymbol(hn,bn,null,On);else throw"Don't know how to put a value into "+typeof bn}xn.addCommand("put",function(vn,bn,hn){if(hn.matchToken("put")){var On=vn.requireElement("expression",hn),Pn=hn.matchAnyToken("into","before","after");Pn==null&&hn.matchToken("at")&&(hn.matchToken("the"),Pn=hn.matchAnyToken("start","end"),hn.requireToken("of")),Pn==null&&vn.raiseParseError(hn,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'");var Nn=vn.requireElement("expression",hn),Dn=Pn.value,Ln=!1,Fn=!1,Mn=null,Hn=null;if(Nn.type==="arrayIndex"&&Dn==="into")Ln=!0,Hn=Nn.prop,Mn=Nn.root;else if(Nn.prop&&Nn.root&&Dn==="into")Hn=Nn.prop.value,Mn=Nn.root;else if(Nn.type==="symbol"&&Dn==="into")Fn=!0,Hn=Nn.name;else if(Nn.type==="attributeRef"&&Dn==="into"){var Wn=!0;Hn=Nn.name,Mn=vn.requireElement("implicitMeTarget",hn)}else if(Nn.type==="styleRef"&&Dn==="into"){var zn=!0;Hn=Nn.name,Mn=vn.requireElement("implicitMeTarget",hn)}else if(Nn.attribute&&Dn==="into"){var Wn=Nn.attribute.type==="attributeRef",zn=Nn.attribute.type==="styleRef";Hn=Nn.attribute.name,Mn=Nn.root}else Mn=Nn;var nn={target:Nn,operation:Dn,symbolWrite:Fn,value:On,args:[Mn,Hn,On],op:function(on,Jr,rn,cn){if(Fn)mn(bn,on,rn,cn);else if(bn.nullCheck(Jr,Mn),Dn==="into")Wn?bn.implicitLoop(Jr,function(fn){fn.setAttribute(rn,cn)}):zn?bn.implicitLoop(Jr,function(fn){fn.style[rn]=cn}):Ln?Jr[rn]=cn:bn.implicitLoop(Jr,function(fn){mn(bn,fn,rn,cn)});else{var sn=Dn==="before"?Element.prototype.before:Dn==="after"?Element.prototype.after:Dn==="start"?Element.prototype.prepend:Element.prototype.append;bn.implicitLoop(Jr,function(fn){sn.call(fn,cn instanceof Node?cn:bn.convertValue(cn,"Fragment")),fn.parentElement?bn.processNode(fn.parentElement):bn.processNode(fn)})}return bn.findNext(this,on)}};return nn}});function Sn(vn,bn,hn){var On;if(hn.matchToken("the")||hn.matchToken("element")||hn.matchToken("elements")||hn.currentToken().type==="CLASS_REF"||hn.currentToken().type==="ID_REF"||hn.currentToken().op&&hn.currentToken().value==="<"){vn.possessivesDisabled=!0;try{On=vn.parseElement("expression",hn)}finally{delete vn.possessivesDisabled}hn.matchOpToken("'")&&hn.requireToken("s")}else if(hn.currentToken().type==="IDENTIFIER"&&hn.currentToken().value==="its"){var Pn=hn.matchToken("its");On={type:"pseudopossessiveIts",token:Pn,name:Pn.value,evaluate:function(Nn){return bn.resolveSymbol("it",Nn)}}}else hn.matchToken("my")||hn.matchToken("me"),On=vn.parseElement("implicitMeTarget",hn);return On}xn.addCommand("transition",function(vn,bn,hn){if(hn.matchToken("transition")){for(var On=Sn(vn,bn,hn),Pn=[],Nn=[],Dn=[],Ln=hn.currentToken();!vn.commandBoundary(Ln)&&Ln.value!=="over"&&Ln.value!=="using";){if(hn.currentToken().type==="STYLE_REF"){let zn=hn.consumeToken().value.substr(1);Pn.push({type:"styleRefValue",evaluate:function(){return zn}})}else Pn.push(vn.requireElement("stringLike",hn));hn.matchToken("from")?Nn.push(vn.requireElement("expression",hn)):Nn.push(null),hn.requireToken("to"),hn.matchToken("initial")?Dn.push({type:"initial_literal",evaluate:function(){return"initial"}}):Dn.push(vn.requireElement("expression",hn)),Ln=hn.currentToken()}if(hn.matchToken("over"))var Fn=vn.requireElement("expression",hn);else if(hn.matchToken("using"))var Mn=vn.requireElement("expression",hn);var Hn={to:Dn,args:[On,Pn,Nn,Dn,Mn,Fn],op:function(Wn,zn,nn,on,Jr,rn,cn){bn.nullCheck(zn,On);var sn=[];return bn.implicitLoop(zn,function(fn){var un=new Promise(function(gn,En){var Tn=fn.style.transition;cn?fn.style.transition="all "+cn+"ms ease-in":rn?fn.style.transition=rn:fn.style.transition=Wr.defaultTransition;for(var Rn=bn.getInternalData(fn),Bn=getComputedStyle(fn),Cn={},In=0;In<Bn.length;In++){var _n=Bn[In],Un=Bn[_n];Cn[_n]=Un}Rn.initialStyles||(Rn.initialStyles=Cn);for(var In=0;In<nn.length;In++){var ni=nn[In],ii=on[In];ii==="computed"||ii==null?fn.style[ni]=Cn[ni]:fn.style[ni]=ii}var Ri=!1,Bi=!1;fn.addEventListener("transitionend",function(){Bi||(fn.style.transition=Tn,Bi=!0,gn())},{once:!0}),fn.addEventListener("transitionstart",function(){Ri=!0},{once:!0}),setTimeout(function(){!Bi&&!Ri&&(fn.style.transition=Tn,Bi=!0,gn())},100),setTimeout(function(){for(var si=[],ki=0;ki<nn.length;ki++){var Hi=nn[ki],Ci=Jr[ki];if(Ci==="initial"){var Ni=Rn.initialStyles[Hi];fn.style[Hi]=Ni}else fn.style[Hi]=Ci}},0)});sn.push(un)}),Promise.all(sn).then(function(){return bn.findNext(Hn,Wn)})}};return Hn}}),xn.addCommand("measure",function(vn,bn,hn){if(hn.matchToken("measure")){var On=Sn(vn,bn,hn),Pn=[];if(!vn.commandBoundary(hn.currentToken()))do Pn.push(hn.matchTokenType("IDENTIFIER").value);while(hn.matchOpToken(","));return{properties:Pn,args:[On],op:function(Nn,Dn){bn.nullCheck(Dn,On),0 in Dn&&(Dn=Dn[0]);var Ln=Dn.getBoundingClientRect(),Fn={top:Dn.scrollTop,left:Dn.scrollLeft,topMax:Dn.scrollTopMax,leftMax:Dn.scrollLeftMax,height:Dn.scrollHeight,width:Dn.scrollWidth};return Nn.result={x:Ln.x,y:Ln.y,left:Ln.left,top:Ln.top,right:Ln.right,bottom:Ln.bottom,width:Ln.width,height:Ln.height,bounds:Ln,scrollLeft:Fn.left,scrollTop:Fn.top,scrollLeftMax:Fn.leftMax,scrollTopMax:Fn.topMax,scrollWidth:Fn.width,scrollHeight:Fn.height,scroll:Fn},bn.forEach(Pn,function(Mn){if(Mn in Nn.result)Nn.locals[Mn]=Nn.result[Mn];else throw"No such measurement as "+Mn}),bn.findNext(this,Nn)}}}}),xn.addLeafExpression("closestExpr",function(vn,bn,hn){if(hn.matchToken("closest")){if(hn.matchToken("parent"))var On=!0;var Pn=null;if(hn.currentToken().type==="ATTRIBUTE_REF"){var Nn=vn.requireElement("attributeRefAccess",hn,null);Pn="["+Nn.attribute.name+"]"}if(Pn==null){var Dn=vn.requireElement("expression",hn);Dn.css==null?vn.raiseParseError(hn,"Expected a CSS expression"):Pn=Dn.css}if(hn.matchToken("to"))var Ln=vn.parseElement("expression",hn);else var Ln=vn.parseElement("implicitMeTarget",hn);var Fn={type:"closestExpr",parentSearch:On,expr:Dn,css:Pn,to:Ln,args:[Ln],op:function(Mn,Hn){if(Hn==null)return null;{let Wn=[];return bn.implicitLoop(Hn,function(zn){On?Wn.push(zn.parentElement?zn.parentElement.closest(Pn):null):Wn.push(zn.closest(Pn))}),bn.shouldAutoIterate(Hn)?Wn:Wn[0]}},evaluate:function(Mn){return bn.unifiedEval(this,Mn)}};return Nn?(Nn.root=Fn,Nn.args=[Fn],Nn):Fn}}),xn.addCommand("go",function(vn,bn,hn){if(hn.matchToken("go")){if(hn.matchToken("back"))var On=!0;else if(hn.matchToken("to"),hn.matchToken("url")){var Pn=vn.requireElement("stringLike",hn),Nn=!0;if(hn.matchToken("in")){hn.requireToken("new"),hn.requireToken("window");var Dn=!0}}else{hn.matchToken("the");var Ln=hn.matchAnyToken("top","middle","bottom"),Fn=hn.matchAnyToken("left","center","right");(Ln||Fn)&&hn.requireToken("of");var Pn=vn.requireElement("unaryExpression",hn),Mn=hn.matchAnyOpToken("+","-");if(Mn){hn.pushFollow("px");try{var Hn=vn.requireElement("expression",hn)}finally{hn.popFollow()}}hn.matchToken("px");var Wn=hn.matchAnyToken("smoothly","instantly"),zn={block:"start",inline:"nearest"};Ln&&(Ln.value==="top"?zn.block="start":Ln.value==="bottom"?zn.block="end":Ln.value==="middle"&&(zn.block="center")),Fn&&(Fn.value==="left"?zn.inline="start":Fn.value==="center"?zn.inline="center":Fn.value==="right"&&(zn.inline="end")),Wn&&(Wn.value==="smoothly"?zn.behavior="smooth":Wn.value==="instantly"&&(zn.behavior="instant"))}var nn={target:Pn,args:[Pn,Hn],op:function(on,Jr,rn){return On?window.history.back():Nn?Jr&&(Dn?window.open(Jr):window.location.href=Jr):bn.implicitLoop(Jr,function(cn){if(cn===window&&(cn=document.body),Mn){let sn=cn.getBoundingClientRect(),fn=document.createElement("div"),un=Mn.value==="+"?rn:rn*-1,gn=zn.inline=="start"||zn.inline=="end"?un:0,En=zn.block=="start"||zn.block=="end"?un:0;fn.style.position="absolute",fn.style.top=sn.top+window.scrollY+En+"px",fn.style.left=sn.left+window.scrollX+gn+"px",fn.style.height=sn.height+"px",fn.style.width=sn.width+"px",fn.style.zIndex=""+Number.MIN_SAFE_INTEGER,fn.style.opacity="0",document.body.appendChild(fn),setTimeout(function(){document.body.removeChild(fn)},100),cn=fn}cn.scrollIntoView(zn)}),bn.findNext(nn,on)}};return nn}}),Wr.conversions.dynamicResolvers.push(function(vn,bn){if(!(vn==="Values"||vn.indexOf("Values:")===0))return;var hn=vn.split(":")[1],On={},Pn=xn.runtime.implicitLoop.bind(xn.runtime);if(Pn(bn,function(Ln){var Fn=Dn(Ln);if(Fn!==void 0){On[Fn.name]=Fn.value;return}if(Ln.querySelectorAll!=null){var Mn=Ln.querySelectorAll("input,select,textarea");Mn.forEach(Nn)}}),hn){if(hn==="JSON")return JSON.stringify(On);if(hn==="Form")return new URLSearchParams(On).toString();throw"Unknown conversion: "+hn}else return On;function Nn(Ln){var Fn=Dn(Ln);if(Fn!=null){if(On[Fn.name]==null){On[Fn.name]=Fn.value;return}if(Array.isArray(On[Fn.name])&&Array.isArray(Fn.value)){On[Fn.name]=[].concat(On[Fn.name],Fn.value);return}}}function Dn(Ln){try{var Fn={name:Ln.name,value:Ln.value};if(Fn.name==null||Fn.value==null||Ln.type=="radio"&&Ln.checked==!1)return;if(Ln.type=="checkbox"&&(Ln.checked==!1?Fn.value=void 0:typeof Fn.value=="string"&&(Fn.value=[Fn.value])),Ln.type=="select-multiple"){var Mn=Ln.querySelectorAll("option[selected]");Fn.value=[];for(var Hn=0;Hn<Mn.length;Hn++)Fn.value.push(Mn[Hn].value)}return Fn}catch{return}}}),Wr.conversions.HTML=function(vn){var bn=function(hn){if(hn instanceof Array)return hn.map(function(Dn){return bn(Dn)}).join("");if(hn instanceof HTMLElement)return hn.outerHTML;if(hn instanceof NodeList){for(var On="",Pn=0;Pn<hn.length;Pn++){var Nn=hn[Pn];Nn instanceof HTMLElement&&(On+=Nn.outerHTML)}return On}return hn.toString?hn.toString():""};return bn(vn)},Wr.conversions.Fragment=function(vn){var bn=document.createDocumentFragment();return xn.runtime.implicitLoop(vn,function(hn){if(hn instanceof Node)bn.append(hn);else{var On=document.createElement("template");On.innerHTML=hn,bn.append(On.content)}}),bn}}let Jn=new tn,mi=Jn.lexer,ai=Jn.parser;function Ui(xn,en){return Jn.evaluate(xn,en)}function gi(){var xn=Array.from(Qr.document.querySelectorAll("script[type='text/hyperscript'][src]"));Promise.all(xn.map(function(mn){return fetch(mn.src).then(function(Sn){return Sn.text()})})).then(mn=>mn.forEach(Sn=>ri(Sn))).then(()=>en(function(){pn(),Jn.processNode(document.documentElement),document.dispatchEvent(new Event("hyperscript:ready")),Qr.document.addEventListener("htmx:load",function(mn){Jn.processNode(mn.detail.elt)})}));function en(mn){document.readyState!=="loading"?setTimeout(mn):document.addEventListener("DOMContentLoaded",mn)}function an(){var mn=document.querySelector('meta[name="htmx-config"]');return mn?Vn(mn.content):null}function pn(){var mn=an();mn&&Object.assign(Wr,mn)}}let ri=Object.assign(Ui,{config:Wr,use(xn){xn(ri)},internals:{lexer:mi,parser:ai,runtime:Jn,Lexer:Kr,Tokens:Yr,Parser:Zr,Runtime:tn},ElementCollection:An,addFeature:ai.addFeature.bind(ai),addCommand:ai.addCommand.bind(ai),addLeafExpression:ai.addLeafExpression.bind(ai),addIndirectExpression:ai.addIndirectExpression.bind(ai),evaluate:Jn.evaluate.bind(Jn),parse:Jn.parse.bind(Jn),processNode:Jn.processNode.bind(Jn),version:"0.9.14",browserInit:gi});return ri})});var zs=po(mo()),Vs=po(Ys());function $s(Qr,Gr){var Wr=Object.keys(Qr);if(Object.getOwnPropertySymbols){var Kr=Object.getOwnPropertySymbols(Qr);Gr&&(Kr=Kr.filter(function(Yr){return Object.getOwnPropertyDescriptor(Qr,Yr).enumerable})),Wr.push.apply(Wr,Kr)}return Wr}function Qi(Qr){for(var Gr=1;Gr<arguments.length;Gr++){var Wr=arguments[Gr]!=null?arguments[Gr]:{};Gr%2?$s(Object(Wr),!0).forEach(function(Kr){iu(Qr,Kr,Wr[Kr])}):Object.getOwnPropertyDescriptors?Object.defineProperties(Qr,Object.getOwnPropertyDescriptors(Wr)):$s(Object(Wr)).forEach(function(Kr){Object.defineProperty(Qr,Kr,Object.getOwnPropertyDescriptor(Wr,Kr))})}return Qr}function To(Qr){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?To=function(Gr){return typeof Gr}:To=function(Gr){return Gr&&typeof Symbol=="function"&&Gr.constructor===Symbol&&Gr!==Symbol.prototype?"symbol":typeof Gr},To(Qr)}function iu(Qr,Gr,Wr){return Gr in Qr?Object.defineProperty(Qr,Gr,{value:Wr,enumerable:!0,configurable:!0,writable:!0}):Qr[Gr]=Wr,Qr}function ta(){return ta=Object.assign||function(Qr){for(var Gr=1;Gr<arguments.length;Gr++){var Wr=arguments[Gr];for(var Kr in Wr)Object.prototype.hasOwnProperty.call(Wr,Kr)&&(Qr[Kr]=Wr[Kr])}return Qr},ta.apply(this,arguments)}function au(Qr,Gr){if(Qr==null)return{};var Wr={},Kr=Object.keys(Qr),Yr,Zr;for(Zr=0;Zr<Kr.length;Zr++)Yr=Kr[Zr],!(Gr.indexOf(Yr)>=0)&&(Wr[Yr]=Qr[Yr]);return Wr}function ou(Qr,Gr){if(Qr==null)return{};var Wr=au(Qr,Gr),Kr,Yr;if(Object.getOwnPropertySymbols){var Zr=Object.getOwnPropertySymbols(Qr);for(Yr=0;Yr<Zr.length;Yr++)Kr=Zr[Yr],!(Gr.indexOf(Kr)>=0)&&Object.prototype.propertyIsEnumerable.call(Qr,Kr)&&(Wr[Kr]=Qr[Kr])}return Wr}var su="1.15.6";function ea(Qr){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(Qr)}var ra=ea(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Ja=ea(/Edge/i),Js=ea(/firefox/i),Xa=ea(/safari/i)&&!ea(/chrome/i)&&!ea(/android/i),vs=ea(/iP(ad|od|hone)/i),ol=ea(/chrome/i)&&ea(/android/i),sl={capture:!1,passive:!1};function ei(Qr,Gr,Wr){Qr.addEventListener(Gr,Wr,!ra&&sl)}function Zn(Qr,Gr,Wr){Qr.removeEventListener(Gr,Wr,!ra&&sl)}function Co(Qr,Gr){if(Gr){if(Gr[0]===">"&&(Gr=Gr.substring(1)),Qr)try{if(Qr.matches)return Qr.matches(Gr);if(Qr.msMatchesSelector)return Qr.msMatchesSelector(Gr);if(Qr.webkitMatchesSelector)return Qr.webkitMatchesSelector(Gr)}catch{return!1}return!1}}function ll(Qr){return Qr.host&&Qr!==document&&Qr.host.nodeType?Qr.host:Qr.parentNode}function Vi(Qr,Gr,Wr,Kr){if(Qr){Wr=Wr||document;do{if(Gr!=null&&(Gr[0]===">"?Qr.parentNode===Wr&&Co(Qr,Gr):Co(Qr,Gr))||Kr&&Qr===Wr)return Qr;if(Qr===Wr)break}while(Qr=ll(Qr))}return null}var Zs=/\s+/g;function Mi(Qr,Gr,Wr){if(Qr&&Gr)if(Qr.classList)Qr.classList[Wr?"add":"remove"](Gr);else{var Kr=(" "+Qr.className+" ").replace(Zs," ").replace(" "+Gr+" "," ");Qr.className=(Kr+(Wr?" "+Gr:"")).replace(Zs," ")}}function Xn(Qr,Gr,Wr){var Kr=Qr&&Qr.style;if(Kr){if(Wr===void 0)return document.defaultView&&document.defaultView.getComputedStyle?Wr=document.defaultView.getComputedStyle(Qr,""):Qr.currentStyle&&(Wr=Qr.currentStyle),Gr===void 0?Wr:Wr[Gr];!(Gr in Kr)&&Gr.indexOf("webkit")===-1&&(Gr="-webkit-"+Gr),Kr[Gr]=Wr+(typeof Wr=="string"?"":"px")}}function Na(Qr,Gr){var Wr="";if(typeof Qr=="string")Wr=Qr;else do{var Kr=Xn(Qr,"transform");Kr&&Kr!=="none"&&(Wr=Kr+" "+Wr)}while(!Gr&&(Qr=Qr.parentNode));var Yr=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return Yr&&new Yr(Wr)}function ul(Qr,Gr,Wr){if(Qr){var Kr=Qr.getElementsByTagName(Gr),Yr=0,Zr=Kr.length;if(Wr)for(;Yr<Zr;Yr++)Wr(Kr[Yr],Yr);return Kr}return[]}function Xi(){var Qr=document.scrollingElement;return Qr||document.documentElement}function yi(Qr,Gr,Wr,Kr,Yr){if(!(!Qr.getBoundingClientRect&&Qr!==window)){var Zr,tn,ln,dn,yn,wn,kn;if(Qr!==window&&Qr.parentNode&&Qr!==Xi()?(Zr=Qr.getBoundingClientRect(),tn=Zr.top,ln=Zr.left,dn=Zr.bottom,yn=Zr.right,wn=Zr.height,kn=Zr.width):(tn=0,ln=0,dn=window.innerHeight,yn=window.innerWidth,wn=window.innerHeight,kn=window.innerWidth),(Gr||Wr)&&Qr!==window&&(Yr=Yr||Qr.parentNode,!ra))do if(Yr&&Yr.getBoundingClientRect&&(Xn(Yr,"transform")!=="none"||Wr&&Xn(Yr,"position")!=="static")){var An=Yr.getBoundingClientRect();tn-=An.top+parseInt(Xn(Yr,"border-top-width")),ln-=An.left+parseInt(Xn(Yr,"border-left-width")),dn=tn+Zr.height,yn=ln+Zr.width;break}while(Yr=Yr.parentNode);if(Kr&&Qr!==window){var Gn=Na(Yr||Qr),jn=Gn&&Gn.a,Vn=Gn&&Gn.d;Gn&&(tn/=Vn,ln/=jn,kn/=jn,wn/=Vn,dn=tn+wn,yn=ln+kn)}return{top:tn,left:ln,bottom:dn,right:yn,width:kn,height:wn}}}function el(Qr,Gr,Wr){for(var Kr=la(Qr,!0),Yr=yi(Qr)[Gr];Kr;){var Zr=yi(Kr)[Wr],tn=void 0;if(Wr==="top"||Wr==="left"?tn=Yr>=Zr:tn=Yr<=Zr,!tn)return Kr;if(Kr===Xi())break;Kr=la(Kr,!1)}return!1}function La(Qr,Gr,Wr,Kr){for(var Yr=0,Zr=0,tn=Qr.children;Zr<tn.length;){if(tn[Zr].style.display!=="none"&&tn[Zr]!==Qn.ghost&&(Kr||tn[Zr]!==Qn.dragged)&&Vi(tn[Zr],Wr.draggable,Qr,!1)){if(Yr===Gr)return tn[Zr];Yr++}Zr++}return null}function ys(Qr,Gr){for(var Wr=Qr.lastElementChild;Wr&&(Wr===Qn.ghost||Xn(Wr,"display")==="none"||Gr&&!Co(Wr,Gr));)Wr=Wr.previousElementSibling;return Wr||null}function Gi(Qr,Gr){var Wr=0;if(!Qr||!Qr.parentNode)return-1;for(;Qr=Qr.previousElementSibling;)Qr.nodeName.toUpperCase()!=="TEMPLATE"&&Qr!==Qn.clone&&(!Gr||Co(Qr,Gr))&&Wr++;return Wr}function tl(Qr){var Gr=0,Wr=0,Kr=Xi();if(Qr)do{var Yr=Na(Qr),Zr=Yr.a,tn=Yr.d;Gr+=Qr.scrollLeft*Zr,Wr+=Qr.scrollTop*tn}while(Qr!==Kr&&(Qr=Qr.parentNode));return[Gr,Wr]}function lu(Qr,Gr){for(var Wr in Qr)if(Qr.hasOwnProperty(Wr)){for(var Kr in Gr)if(Gr.hasOwnProperty(Kr)&&Gr[Kr]===Qr[Wr][Kr])return Number(Wr)}return-1}function la(Qr,Gr){if(!Qr||!Qr.getBoundingClientRect)return Xi();var Wr=Qr,Kr=!1;do if(Wr.clientWidth<Wr.scrollWidth||Wr.clientHeight<Wr.scrollHeight){var Yr=Xn(Wr);if(Wr.clientWidth<Wr.scrollWidth&&(Yr.overflowX=="auto"||Yr.overflowX=="scroll")||Wr.clientHeight<Wr.scrollHeight&&(Yr.overflowY=="auto"||Yr.overflowY=="scroll")){if(!Wr.getBoundingClientRect||Wr===document.body)return Xi();if(Kr||Gr)return Wr;Kr=!0}}while(Wr=Wr.parentNode);return Xi()}function uu(Qr,Gr){if(Qr&&Gr)for(var Wr in Gr)Gr.hasOwnProperty(Wr)&&(Qr[Wr]=Gr[Wr]);return Qr}function is(Qr,Gr){return Math.round(Qr.top)===Math.round(Gr.top)&&Math.round(Qr.left)===Math.round(Gr.left)&&Math.round(Qr.height)===Math.round(Gr.height)&&Math.round(Qr.width)===Math.round(Gr.width)}var Qa;function cl(Qr,Gr){return function(){if(!Qa){var Wr=arguments,Kr=this;Wr.length===1?Qr.call(Kr,Wr[0]):Qr.apply(Kr,Wr),Qa=setTimeout(function(){Qa=void 0},Gr)}}}function cu(){clearTimeout(Qa),Qa=void 0}function fl(Qr,Gr,Wr){Qr.scrollLeft+=Gr,Qr.scrollTop+=Wr}function hl(Qr){var Gr=window.Polymer,Wr=window.jQuery||window.Zepto;return Gr&&Gr.dom?Gr.dom(Qr).cloneNode(!0):Wr?Wr(Qr).clone(!0)[0]:Qr.cloneNode(!0)}function dl(Qr,Gr,Wr){var Kr={};return Array.from(Qr.children).forEach(function(Yr){var Zr,tn,ln,dn;if(!(!Vi(Yr,Gr.draggable,Qr,!1)||Yr.animated||Yr===Wr)){var yn=yi(Yr);Kr.left=Math.min((Zr=Kr.left)!==null&&Zr!==void 0?Zr:1/0,yn.left),Kr.top=Math.min((tn=Kr.top)!==null&&tn!==void 0?tn:1/0,yn.top),Kr.right=Math.max((ln=Kr.right)!==null&&ln!==void 0?ln:-1/0,yn.right),Kr.bottom=Math.max((dn=Kr.bottom)!==null&&dn!==void 0?dn:-1/0,yn.bottom)}}),Kr.width=Kr.right-Kr.left,Kr.height=Kr.bottom-Kr.top,Kr.x=Kr.left,Kr.y=Kr.top,Kr}var Pi="Sortable"+new Date().getTime();function fu(){var Qr=[],Gr;return{captureAnimationState:function(){if(Qr=[],!!this.options.animation){var Kr=[].slice.call(this.el.children);Kr.forEach(function(Yr){if(!(Xn(Yr,"display")==="none"||Yr===Qn.ghost)){Qr.push({target:Yr,rect:yi(Yr)});var Zr=Qi({},Qr[Qr.length-1].rect);if(Yr.thisAnimationDuration){var tn=Na(Yr,!0);tn&&(Zr.top-=tn.f,Zr.left-=tn.e)}Yr.fromRect=Zr}})}},addAnimationState:function(Kr){Qr.push(Kr)},removeAnimationState:function(Kr){Qr.splice(lu(Qr,{target:Kr}),1)},animateAll:function(Kr){var Yr=this;if(!this.options.animation){clearTimeout(Gr),typeof Kr=="function"&&Kr();return}var Zr=!1,tn=0;Qr.forEach(function(ln){var dn=0,yn=ln.target,wn=yn.fromRect,kn=yi(yn),An=yn.prevFromRect,Gn=yn.prevToRect,jn=ln.rect,Vn=Na(yn,!0);Vn&&(kn.top-=Vn.f,kn.left-=Vn.e),yn.toRect=kn,yn.thisAnimationDuration&&is(An,kn)&&!is(wn,kn)&&(jn.top-kn.top)/(jn.left-kn.left)===(wn.top-kn.top)/(wn.left-kn.left)&&(dn=du(jn,An,Gn,Yr.options)),is(kn,wn)||(yn.prevFromRect=wn,yn.prevToRect=kn,dn||(dn=Yr.options.animation),Yr.animate(yn,jn,kn,dn)),dn&&(Zr=!0,tn=Math.max(tn,dn),clearTimeout(yn.animationResetTimer),yn.animationResetTimer=setTimeout(function(){yn.animationTime=0,yn.prevFromRect=null,yn.fromRect=null,yn.prevToRect=null,yn.thisAnimationDuration=null},dn),yn.thisAnimationDuration=dn)}),clearTimeout(Gr),Zr?Gr=setTimeout(function(){typeof Kr=="function"&&Kr()},tn):typeof Kr=="function"&&Kr(),Qr=[]},animate:function(Kr,Yr,Zr,tn){if(tn){Xn(Kr,"transition",""),Xn(Kr,"transform","");var ln=Na(this.el),dn=ln&&ln.a,yn=ln&&ln.d,wn=(Yr.left-Zr.left)/(dn||1),kn=(Yr.top-Zr.top)/(yn||1);Kr.animatingX=!!wn,Kr.animatingY=!!kn,Xn(Kr,"transform","translate3d("+wn+"px,"+kn+"px,0)"),this.forRepaintDummy=hu(Kr),Xn(Kr,"transition","transform "+tn+"ms"+(this.options.easing?" "+this.options.easing:"")),Xn(Kr,"transform","translate3d(0,0,0)"),typeof Kr.animated=="number"&&clearTimeout(Kr.animated),Kr.animated=setTimeout(function(){Xn(Kr,"transition",""),Xn(Kr,"transform",""),Kr.animated=!1,Kr.animatingX=!1,Kr.animatingY=!1},tn)}}}}function hu(Qr){return Qr.offsetWidth}function du(Qr,Gr,Wr,Kr){return Math.sqrt(Math.pow(Gr.top-Qr.top,2)+Math.pow(Gr.left-Qr.left,2))/Math.sqrt(Math.pow(Gr.top-Wr.top,2)+Math.pow(Gr.left-Wr.left,2))*Kr.animation}var Aa=[],as={initializeByDefault:!0},Za={mount:function(Gr){for(var Wr in as)as.hasOwnProperty(Wr)&&!(Wr in Gr)&&(Gr[Wr]=as[Wr]);Aa.forEach(function(Kr){if(Kr.pluginName===Gr.pluginName)throw"Sortable: Cannot mount plugin ".concat(Gr.pluginName," more than once")}),Aa.push(Gr)},pluginEvent:function(Gr,Wr,Kr){var Yr=this;this.eventCanceled=!1,Kr.cancel=function(){Yr.eventCanceled=!0};var Zr=Gr+"Global";Aa.forEach(function(tn){Wr[tn.pluginName]&&(Wr[tn.pluginName][Zr]&&Wr[tn.pluginName][Zr](Qi({sortable:Wr},Kr)),Wr.options[tn.pluginName]&&Wr[tn.pluginName][Gr]&&Wr[tn.pluginName][Gr](Qi({sortable:Wr},Kr)))})},initializePlugins:function(Gr,Wr,Kr,Yr){Aa.forEach(function(ln){var dn=ln.pluginName;if(!(!Gr.options[dn]&&!ln.initializeByDefault)){var yn=new ln(Gr,Wr,Gr.options);yn.sortable=Gr,yn.options=Gr.options,Gr[dn]=yn,ta(Kr,yn.defaults)}});for(var Zr in Gr.options)if(Gr.options.hasOwnProperty(Zr)){var tn=this.modifyOption(Gr,Zr,Gr.options[Zr]);typeof tn<"u"&&(Gr.options[Zr]=tn)}},getEventProperties:function(Gr,Wr){var Kr={};return Aa.forEach(function(Yr){typeof Yr.eventProperties=="function"&&ta(Kr,Yr.eventProperties.call(Wr[Yr.pluginName],Gr))}),Kr},modifyOption:function(Gr,Wr,Kr){var Yr;return Aa.forEach(function(Zr){Gr[Zr.pluginName]&&Zr.optionListeners&&typeof Zr.optionListeners[Wr]=="function"&&(Yr=Zr.optionListeners[Wr].call(Gr[Zr.pluginName],Kr))}),Yr}};function pu(Qr){var Gr=Qr.sortable,Wr=Qr.rootEl,Kr=Qr.name,Yr=Qr.targetEl,Zr=Qr.cloneEl,tn=Qr.toEl,ln=Qr.fromEl,dn=Qr.oldIndex,yn=Qr.newIndex,wn=Qr.oldDraggableIndex,kn=Qr.newDraggableIndex,An=Qr.originalEvent,Gn=Qr.putSortable,jn=Qr.extraEventProperties;if(Gr=Gr||Wr&&Wr[Pi],!!Gr){var Vn,ti=Gr.options,Ti="on"+Kr.charAt(0).toUpperCase()+Kr.substr(1);window.CustomEvent&&!ra&&!Ja?Vn=new CustomEvent(Kr,{bubbles:!0,cancelable:!0}):(Vn=document.createEvent("Event"),Vn.initEvent(Kr,!0,!0)),Vn.to=tn||Wr,Vn.from=ln||Wr,Vn.item=Yr||Wr,Vn.clone=Zr,Vn.oldIndex=dn,Vn.newIndex=yn,Vn.oldDraggableIndex=wn,Vn.newDraggableIndex=kn,Vn.originalEvent=An,Vn.pullMode=Gn?Gn.lastPutMode:void 0;var fi=Qi(Qi({},jn),Za.getEventProperties(Kr,Gr));for(var oi in fi)Vn[oi]=fi[oi];Wr&&Wr.dispatchEvent(Vn),ti[Ti]&&ti[Ti].call(Gr,Vn)}}var mu=["evt"],Di=function(Gr,Wr){var Kr=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},Yr=Kr.evt,Zr=ou(Kr,mu);Za.pluginEvent.bind(Qn)(Gr,Wr,Qi({dragEl:qn,parentEl:hi,ghostEl:Yn,rootEl:ui,nextEl:va,lastDownEl:xo,cloneEl:ci,cloneHidden:sa,dragStarted:za,putSortable:wi,activeSortable:Qn.active,originalEvent:Yr,oldIndex:Ra,oldDraggableIndex:Ka,newIndex:Fi,newDraggableIndex:oa,hideGhostForTarget:vl,unhideGhostForTarget:yl,cloneNowHidden:function(){sa=!0},cloneNowShown:function(){sa=!1},dispatchSortableEvent:function(ln){Oi({sortable:Wr,name:ln,originalEvent:Yr})}},Zr))};function Oi(Qr){pu(Qi({putSortable:wi,cloneEl:ci,targetEl:qn,rootEl:ui,oldIndex:Ra,oldDraggableIndex:Ka,newIndex:Fi,newDraggableIndex:oa},Qr))}var qn,hi,Yn,ui,va,xo,ci,sa,Ra,Fi,Ka,oa,vo,wi,Pa=!1,Io=!1,Oo=[],ma,zi,os,ss,rl,nl,za,Da,Ya,$a=!1,yo=!1,So,Ii,ls=[],ds=!1,Ao=[],Po=typeof document<"u",bo=vs,il=Ja||ra?"cssFloat":"float",gu=Po&&!ol&&!vs&&"draggable"in document.createElement("div"),pl=function(){if(Po){if(ra)return!1;var Qr=document.createElement("x");return Qr.style.cssText="pointer-events:auto",Qr.style.pointerEvents==="auto"}}(),ml=function(Gr,Wr){var Kr=Xn(Gr),Yr=parseInt(Kr.width)-parseInt(Kr.paddingLeft)-parseInt(Kr.paddingRight)-parseInt(Kr.borderLeftWidth)-parseInt(Kr.borderRightWidth),Zr=La(Gr,0,Wr),tn=La(Gr,1,Wr),ln=Zr&&Xn(Zr),dn=tn&&Xn(tn),yn=ln&&parseInt(ln.marginLeft)+parseInt(ln.marginRight)+yi(Zr).width,wn=dn&&parseInt(dn.marginLeft)+parseInt(dn.marginRight)+yi(tn).width;if(Kr.display==="flex")return Kr.flexDirection==="column"||Kr.flexDirection==="column-reverse"?"vertical":"horizontal";if(Kr.display==="grid")return Kr.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(Zr&&ln.float&&ln.float!=="none"){var kn=ln.float==="left"?"left":"right";return tn&&(dn.clear==="both"||dn.clear===kn)?"vertical":"horizontal"}return Zr&&(ln.display==="block"||ln.display==="flex"||ln.display==="table"||ln.display==="grid"||yn>=Yr&&Kr[il]==="none"||tn&&Kr[il]==="none"&&yn+wn>Yr)?"vertical":"horizontal"},vu=function(Gr,Wr,Kr){var Yr=Kr?Gr.left:Gr.top,Zr=Kr?Gr.right:Gr.bottom,tn=Kr?Gr.width:Gr.height,ln=Kr?Wr.left:Wr.top,dn=Kr?Wr.right:Wr.bottom,yn=Kr?Wr.width:Wr.height;return Yr===ln||Zr===dn||Yr+tn/2===ln+yn/2},yu=function(Gr,Wr){var Kr;return Oo.some(function(Yr){var Zr=Yr[Pi].options.emptyInsertThreshold;if(!(!Zr||ys(Yr))){var tn=yi(Yr),ln=Gr>=tn.left-Zr&&Gr<=tn.right+Zr,dn=Wr>=tn.top-Zr&&Wr<=tn.bottom+Zr;if(ln&&dn)return Kr=Yr}}),Kr},gl=function(Gr){function Wr(Zr,tn){return function(ln,dn,yn,wn){var kn=ln.options.group.name&&dn.options.group.name&&ln.options.group.name===dn.options.group.name;if(Zr==null&&(tn||kn))return!0;if(Zr==null||Zr===!1)return!1;if(tn&&Zr==="clone")return Zr;if(typeof Zr=="function")return Wr(Zr(ln,dn,yn,wn),tn)(ln,dn,yn,wn);var An=(tn?ln:dn).options.group.name;return Zr===!0||typeof Zr=="string"&&Zr===An||Zr.join&&Zr.indexOf(An)>-1}}var Kr={},Yr=Gr.group;(!Yr||To(Yr)!="object")&&(Yr={name:Yr}),Kr.name=Yr.name,Kr.checkPull=Wr(Yr.pull,!0),Kr.checkPut=Wr(Yr.put),Kr.revertClone=Yr.revertClone,Gr.group=Kr},vl=function(){!pl&&Yn&&Xn(Yn,"display","none")},yl=function(){!pl&&Yn&&Xn(Yn,"display","")};Po&&!ol&&document.addEventListener("click",function(Qr){if(Io)return Qr.preventDefault(),Qr.stopPropagation&&Qr.stopPropagation(),Qr.stopImmediatePropagation&&Qr.stopImmediatePropagation(),Io=!1,!1},!0);var ga=function(Gr){if(qn){Gr=Gr.touches?Gr.touches[0]:Gr;var Wr=yu(Gr.clientX,Gr.clientY);if(Wr){var Kr={};for(var Yr in Gr)Gr.hasOwnProperty(Yr)&&(Kr[Yr]=Gr[Yr]);Kr.target=Kr.rootEl=Wr,Kr.preventDefault=void 0,Kr.stopPropagation=void 0,Wr[Pi]._onDragOver(Kr)}}},bu=function(Gr){qn&&qn.parentNode[Pi]._isOutsideThisEl(Gr.target)};function Qn(Qr,Gr){if(!(Qr&&Qr.nodeType&&Qr.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(Qr));this.el=Qr,this.options=Gr=ta({},Gr),Qr[Pi]=this;var Wr={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(Qr.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return ml(Qr,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(tn,ln){tn.setData("Text",ln.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Qn.supportPointer!==!1&&"PointerEvent"in window&&(!Xa||vs),emptyInsertThreshold:5};Za.initializePlugins(this,Qr,Wr);for(var Kr in Wr)!(Kr in Gr)&&(Gr[Kr]=Wr[Kr]);gl(Gr);for(var Yr in this)Yr.charAt(0)==="_"&&typeof this[Yr]=="function"&&(this[Yr]=this[Yr].bind(this));this.nativeDraggable=Gr.forceFallback?!1:gu,this.nativeDraggable&&(this.options.touchStartThreshold=1),Gr.supportPointer?ei(Qr,"pointerdown",this._onTapStart):(ei(Qr,"mousedown",this._onTapStart),ei(Qr,"touchstart",this._onTapStart)),this.nativeDraggable&&(ei(Qr,"dragover",this),ei(Qr,"dragenter",this)),Oo.push(this.el),Gr.store&&Gr.store.get&&this.sort(Gr.store.get(this)||[]),ta(this,fu())}Qn.prototype={constructor:Qn,_isOutsideThisEl:function(Gr){!this.el.contains(Gr)&&Gr!==this.el&&(Da=null)},_getDirection:function(Gr,Wr){return typeof this.options.direction=="function"?this.options.direction.call(this,Gr,Wr,qn):this.options.direction},_onTapStart:function(Gr){if(Gr.cancelable){var Wr=this,Kr=this.el,Yr=this.options,Zr=Yr.preventOnFilter,tn=Gr.type,ln=Gr.touches&&Gr.touches[0]||Gr.pointerType&&Gr.pointerType==="touch"&&Gr,dn=(ln||Gr).target,yn=Gr.target.shadowRoot&&(Gr.path&&Gr.path[0]||Gr.composedPath&&Gr.composedPath()[0])||dn,wn=Yr.filter;if(Iu(Kr),!qn&&!(/mousedown|pointerdown/.test(tn)&&Gr.button!==0||Yr.disabled)&&!yn.isContentEditable&&!(!this.nativeDraggable&&Xa&&dn&&dn.tagName.toUpperCase()==="SELECT")&&(dn=Vi(dn,Yr.draggable,Kr,!1),!(dn&&dn.animated)&&xo!==dn)){if(Ra=Gi(dn),Ka=Gi(dn,Yr.draggable),typeof wn=="function"){if(wn.call(this,Gr,dn,this)){Oi({sortable:Wr,rootEl:yn,name:"filter",targetEl:dn,toEl:Kr,fromEl:Kr}),Di("filter",Wr,{evt:Gr}),Zr&&Gr.preventDefault();return}}else if(wn&&(wn=wn.split(",").some(function(kn){if(kn=Vi(yn,kn.trim(),Kr,!1),kn)return Oi({sortable:Wr,rootEl:kn,name:"filter",targetEl:dn,fromEl:Kr,toEl:Kr}),Di("filter",Wr,{evt:Gr}),!0}),wn)){Zr&&Gr.preventDefault();return}Yr.handle&&!Vi(yn,Yr.handle,Kr,!1)||this._prepareDragStart(Gr,ln,dn)}}},_prepareDragStart:function(Gr,Wr,Kr){var Yr=this,Zr=Yr.el,tn=Yr.options,ln=Zr.ownerDocument,dn;if(Kr&&!qn&&Kr.parentNode===Zr){var yn=yi(Kr);if(ui=Zr,qn=Kr,hi=qn.parentNode,va=qn.nextSibling,xo=Kr,vo=tn.group,Qn.dragged=qn,ma={target:qn,clientX:(Wr||Gr).clientX,clientY:(Wr||Gr).clientY},rl=ma.clientX-yn.left,nl=ma.clientY-yn.top,this._lastX=(Wr||Gr).clientX,this._lastY=(Wr||Gr).clientY,qn.style["will-change"]="all",dn=function(){if(Di("delayEnded",Yr,{evt:Gr}),Qn.eventCanceled){Yr._onDrop();return}Yr._disableDelayedDragEvents(),!Js&&Yr.nativeDraggable&&(qn.draggable=!0),Yr._triggerDragStart(Gr,Wr),Oi({sortable:Yr,name:"choose",originalEvent:Gr}),Mi(qn,tn.chosenClass,!0)},tn.ignore.split(",").forEach(function(wn){ul(qn,wn.trim(),us)}),ei(ln,"dragover",ga),ei(ln,"mousemove",ga),ei(ln,"touchmove",ga),tn.supportPointer?(ei(ln,"pointerup",Yr._onDrop),!this.nativeDraggable&&ei(ln,"pointercancel",Yr._onDrop)):(ei(ln,"mouseup",Yr._onDrop),ei(ln,"touchend",Yr._onDrop),ei(ln,"touchcancel",Yr._onDrop)),Js&&this.nativeDraggable&&(this.options.touchStartThreshold=4,qn.draggable=!0),Di("delayStart",this,{evt:Gr}),tn.delay&&(!tn.delayOnTouchOnly||Wr)&&(!this.nativeDraggable||!(Ja||ra))){if(Qn.eventCanceled){this._onDrop();return}tn.supportPointer?(ei(ln,"pointerup",Yr._disableDelayedDrag),ei(ln,"pointercancel",Yr._disableDelayedDrag)):(ei(ln,"mouseup",Yr._disableDelayedDrag),ei(ln,"touchend",Yr._disableDelayedDrag),ei(ln,"touchcancel",Yr._disableDelayedDrag)),ei(ln,"mousemove",Yr._delayedDragTouchMoveHandler),ei(ln,"touchmove",Yr._delayedDragTouchMoveHandler),tn.supportPointer&&ei(ln,"pointermove",Yr._delayedDragTouchMoveHandler),Yr._dragStartTimer=setTimeout(dn,tn.delay)}else dn()}},_delayedDragTouchMoveHandler:function(Gr){var Wr=Gr.touches?Gr.touches[0]:Gr;Math.max(Math.abs(Wr.clientX-this._lastX),Math.abs(Wr.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){qn&&us(qn),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var Gr=this.el.ownerDocument;Zn(Gr,"mouseup",this._disableDelayedDrag),Zn(Gr,"touchend",this._disableDelayedDrag),Zn(Gr,"touchcancel",this._disableDelayedDrag),Zn(Gr,"pointerup",this._disableDelayedDrag),Zn(Gr,"pointercancel",this._disableDelayedDrag),Zn(Gr,"mousemove",this._delayedDragTouchMoveHandler),Zn(Gr,"touchmove",this._delayedDragTouchMoveHandler),Zn(Gr,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(Gr,Wr){Wr=Wr||Gr.pointerType=="touch"&&Gr,!this.nativeDraggable||Wr?this.options.supportPointer?ei(document,"pointermove",this._onTouchMove):Wr?ei(document,"touchmove",this._onTouchMove):ei(document,"mousemove",this._onTouchMove):(ei(qn,"dragend",this),ei(ui,"dragstart",this._onDragStart));try{document.selection?wo(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(Gr,Wr){if(Pa=!1,ui&&qn){Di("dragStarted",this,{evt:Wr}),this.nativeDraggable&&ei(document,"dragover",bu);var Kr=this.options;!Gr&&Mi(qn,Kr.dragClass,!1),Mi(qn,Kr.ghostClass,!0),Qn.active=this,Gr&&this._appendGhost(),Oi({sortable:this,name:"start",originalEvent:Wr})}else this._nulling()},_emulateDragOver:function(){if(zi){this._lastX=zi.clientX,this._lastY=zi.clientY,vl();for(var Gr=document.elementFromPoint(zi.clientX,zi.clientY),Wr=Gr;Gr&&Gr.shadowRoot&&(Gr=Gr.shadowRoot.elementFromPoint(zi.clientX,zi.clientY),Gr!==Wr);)Wr=Gr;if(qn.parentNode[Pi]._isOutsideThisEl(Gr),Wr)do{if(Wr[Pi]){var Kr=void 0;if(Kr=Wr[Pi]._onDragOver({clientX:zi.clientX,clientY:zi.clientY,target:Gr,rootEl:Wr}),Kr&&!this.options.dragoverBubble)break}Gr=Wr}while(Wr=ll(Wr));yl()}},_onTouchMove:function(Gr){if(ma){var Wr=this.options,Kr=Wr.fallbackTolerance,Yr=Wr.fallbackOffset,Zr=Gr.touches?Gr.touches[0]:Gr,tn=Yn&&Na(Yn,!0),ln=Yn&&tn&&tn.a,dn=Yn&&tn&&tn.d,yn=bo&&Ii&&tl(Ii),wn=(Zr.clientX-ma.clientX+Yr.x)/(ln||1)+(yn?yn[0]-ls[0]:0)/(ln||1),kn=(Zr.clientY-ma.clientY+Yr.y)/(dn||1)+(yn?yn[1]-ls[1]:0)/(dn||1);if(!Qn.active&&!Pa){if(Kr&&Math.max(Math.abs(Zr.clientX-this._lastX),Math.abs(Zr.clientY-this._lastY))<Kr)return;this._onDragStart(Gr,!0)}if(Yn){tn?(tn.e+=wn-(os||0),tn.f+=kn-(ss||0)):tn={a:1,b:0,c:0,d:1,e:wn,f:kn};var An="matrix(".concat(tn.a,",").concat(tn.b,",").concat(tn.c,",").concat(tn.d,",").concat(tn.e,",").concat(tn.f,")");Xn(Yn,"webkitTransform",An),Xn(Yn,"mozTransform",An),Xn(Yn,"msTransform",An),Xn(Yn,"transform",An),os=wn,ss=kn,zi=Zr}Gr.cancelable&&Gr.preventDefault()}},_appendGhost:function(){if(!Yn){var Gr=this.options.fallbackOnBody?document.body:ui,Wr=yi(qn,!0,bo,!0,Gr),Kr=this.options;if(bo){for(Ii=Gr;Xn(Ii,"position")==="static"&&Xn(Ii,"transform")==="none"&&Ii!==document;)Ii=Ii.parentNode;Ii!==document.body&&Ii!==document.documentElement?(Ii===document&&(Ii=Xi()),Wr.top+=Ii.scrollTop,Wr.left+=Ii.scrollLeft):Ii=Xi(),ls=tl(Ii)}Yn=qn.cloneNode(!0),Mi(Yn,Kr.ghostClass,!1),Mi(Yn,Kr.fallbackClass,!0),Mi(Yn,Kr.dragClass,!0),Xn(Yn,"transition",""),Xn(Yn,"transform",""),Xn(Yn,"box-sizing","border-box"),Xn(Yn,"margin",0),Xn(Yn,"top",Wr.top),Xn(Yn,"left",Wr.left),Xn(Yn,"width",Wr.width),Xn(Yn,"height",Wr.height),Xn(Yn,"opacity","0.8"),Xn(Yn,"position",bo?"absolute":"fixed"),Xn(Yn,"zIndex","100000"),Xn(Yn,"pointerEvents","none"),Qn.ghost=Yn,Gr.appendChild(Yn),Xn(Yn,"transform-origin",rl/parseInt(Yn.style.width)*100+"% "+nl/parseInt(Yn.style.height)*100+"%")}},_onDragStart:function(Gr,Wr){var Kr=this,Yr=Gr.dataTransfer,Zr=Kr.options;if(Di("dragStart",this,{evt:Gr}),Qn.eventCanceled){this._onDrop();return}Di("setupClone",this),Qn.eventCanceled||(ci=hl(qn),ci.removeAttribute("id"),ci.draggable=!1,ci.style["will-change"]="",this._hideClone(),Mi(ci,this.options.chosenClass,!1),Qn.clone=ci),Kr.cloneId=wo(function(){Di("clone",Kr),!Qn.eventCanceled&&(Kr.options.removeCloneOnHide||ui.insertBefore(ci,qn),Kr._hideClone(),Oi({sortable:Kr,name:"clone"}))}),!Wr&&Mi(qn,Zr.dragClass,!0),Wr?(Io=!0,Kr._loopId=setInterval(Kr._emulateDragOver,50)):(Zn(document,"mouseup",Kr._onDrop),Zn(document,"touchend",Kr._onDrop),Zn(document,"touchcancel",Kr._onDrop),Yr&&(Yr.effectAllowed="move",Zr.setData&&Zr.setData.call(Kr,Yr,qn)),ei(document,"drop",Kr),Xn(qn,"transform","translateZ(0)")),Pa=!0,Kr._dragStartId=wo(Kr._dragStarted.bind(Kr,Wr,Gr)),ei(document,"selectstart",Kr),za=!0,window.getSelection().removeAllRanges(),Xa&&Xn(document.body,"user-select","none")},_onDragOver:function(Gr){var Wr=this.el,Kr=Gr.target,Yr,Zr,tn,ln=this.options,dn=ln.group,yn=Qn.active,wn=vo===dn,kn=ln.sort,An=wi||yn,Gn,jn=this,Vn=!1;if(ds)return;function ti(hn,On){Di(hn,jn,Qi({evt:Gr,isOwner:wn,axis:Gn?"vertical":"horizontal",revert:tn,dragRect:Yr,targetRect:Zr,canSort:kn,fromSortable:An,target:Kr,completed:fi,onMove:function(Nn,Dn){return Eo(ui,Wr,qn,Yr,Nn,yi(Nn),Gr,Dn)},changed:oi},On))}function Ti(){ti("dragOverAnimationCapture"),jn.captureAnimationState(),jn!==An&&An.captureAnimationState()}function fi(hn){return ti("dragOverCompleted",{insertion:hn}),hn&&(wn?yn._hideClone():yn._showClone(jn),jn!==An&&(Mi(qn,wi?wi.options.ghostClass:yn.options.ghostClass,!1),Mi(qn,ln.ghostClass,!0)),wi!==jn&&jn!==Qn.active?wi=jn:jn===Qn.active&&wi&&(wi=null),An===jn&&(jn._ignoreWhileAnimating=Kr),jn.animateAll(function(){ti("dragOverAnimationComplete"),jn._ignoreWhileAnimating=null}),jn!==An&&(An.animateAll(),An._ignoreWhileAnimating=null)),(Kr===qn&&!qn.animated||Kr===Wr&&!Kr.animated)&&(Da=null),!ln.dragoverBubble&&!Gr.rootEl&&Kr!==document&&(qn.parentNode[Pi]._isOutsideThisEl(Gr.target),!hn&&ga(Gr)),!ln.dragoverBubble&&Gr.stopPropagation&&Gr.stopPropagation(),Vn=!0}function oi(){Fi=Gi(qn),oa=Gi(qn,ln.draggable),Oi({sortable:jn,name:"change",toEl:Wr,newIndex:Fi,newDraggableIndex:oa,originalEvent:Gr})}if(Gr.preventDefault!==void 0&&Gr.cancelable&&Gr.preventDefault(),Kr=Vi(Kr,ln.draggable,Wr,!0),ti("dragOver"),Qn.eventCanceled)return Vn;if(qn.contains(Gr.target)||Kr.animated&&Kr.animatingX&&Kr.animatingY||jn._ignoreWhileAnimating===Kr)return fi(!1);if(Io=!1,yn&&!ln.disabled&&(wn?kn||(tn=hi!==ui):wi===this||(this.lastPutMode=vo.checkPull(this,yn,qn,Gr))&&dn.checkPut(this,yn,qn,Gr))){if(Gn=this._getDirection(Gr,Kr)==="vertical",Yr=yi(qn),ti("dragOverValid"),Qn.eventCanceled)return Vn;if(tn)return hi=ui,Ti(),this._hideClone(),ti("revert"),Qn.eventCanceled||(va?ui.insertBefore(qn,va):ui.appendChild(qn)),fi(!0);var Jn=ys(Wr,ln.draggable);if(!Jn||Su(Gr,Gn,this)&&!Jn.animated){if(Jn===qn)return fi(!1);if(Jn&&Wr===Gr.target&&(Kr=Jn),Kr&&(Zr=yi(Kr)),Eo(ui,Wr,qn,Yr,Kr,Zr,Gr,!!Kr)!==!1)return Ti(),Jn&&Jn.nextSibling?Wr.insertBefore(qn,Jn.nextSibling):Wr.appendChild(qn),hi=Wr,oi(),fi(!0)}else if(Jn&&xu(Gr,Gn,this)){var mi=La(Wr,0,ln,!0);if(mi===qn)return fi(!1);if(Kr=mi,Zr=yi(Kr),Eo(ui,Wr,qn,Yr,Kr,Zr,Gr,!1)!==!1)return Ti(),Wr.insertBefore(qn,mi),hi=Wr,oi(),fi(!0)}else if(Kr.parentNode===Wr){Zr=yi(Kr);var ai=0,Ui,gi=qn.parentNode!==Wr,ri=!vu(qn.animated&&qn.toRect||Yr,Kr.animated&&Kr.toRect||Zr,Gn),xn=Gn?"top":"left",en=el(Kr,"top","top")||el(qn,"top","top"),an=en?en.scrollTop:void 0;Da!==Kr&&(Ui=Zr[xn],$a=!1,yo=!ri&&ln.invertSwap||gi),ai=wu(Gr,Kr,Zr,Gn,ri?1:ln.swapThreshold,ln.invertedSwapThreshold==null?ln.swapThreshold:ln.invertedSwapThreshold,yo,Da===Kr);var pn;if(ai!==0){var mn=Gi(qn);do mn-=ai,pn=hi.children[mn];while(pn&&(Xn(pn,"display")==="none"||pn===Yn))}if(ai===0||pn===Kr)return fi(!1);Da=Kr,Ya=ai;var Sn=Kr.nextElementSibling,vn=!1;vn=ai===1;var bn=Eo(ui,Wr,qn,Yr,Kr,Zr,Gr,vn);if(bn!==!1)return(bn===1||bn===-1)&&(vn=bn===1),ds=!0,setTimeout(Tu,30),Ti(),vn&&!Sn?Wr.appendChild(qn):Kr.parentNode.insertBefore(qn,vn?Sn:Kr),en&&fl(en,0,an-en.scrollTop),hi=qn.parentNode,Ui!==void 0&&!yo&&(So=Math.abs(Ui-yi(Kr)[xn])),oi(),fi(!0)}if(Wr.contains(qn))return fi(!1)}return!1},_ignoreWhileAnimating:null,_offMoveEvents:function(){Zn(document,"mousemove",this._onTouchMove),Zn(document,"touchmove",this._onTouchMove),Zn(document,"pointermove",this._onTouchMove),Zn(document,"dragover",ga),Zn(document,"mousemove",ga),Zn(document,"touchmove",ga)},_offUpEvents:function(){var Gr=this.el.ownerDocument;Zn(Gr,"mouseup",this._onDrop),Zn(Gr,"touchend",this._onDrop),Zn(Gr,"pointerup",this._onDrop),Zn(Gr,"pointercancel",this._onDrop),Zn(Gr,"touchcancel",this._onDrop),Zn(document,"selectstart",this)},_onDrop:function(Gr){var Wr=this.el,Kr=this.options;if(Fi=Gi(qn),oa=Gi(qn,Kr.draggable),Di("drop",this,{evt:Gr}),hi=qn&&qn.parentNode,Fi=Gi(qn),oa=Gi(qn,Kr.draggable),Qn.eventCanceled){this._nulling();return}Pa=!1,yo=!1,$a=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),ps(this.cloneId),ps(this._dragStartId),this.nativeDraggable&&(Zn(document,"drop",this),Zn(Wr,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),Xa&&Xn(document.body,"user-select",""),Xn(qn,"transform",""),Gr&&(za&&(Gr.cancelable&&Gr.preventDefault(),!Kr.dropBubble&&Gr.stopPropagation()),Yn&&Yn.parentNode&&Yn.parentNode.removeChild(Yn),(ui===hi||wi&&wi.lastPutMode!=="clone")&&ci&&ci.parentNode&&ci.parentNode.removeChild(ci),qn&&(this.nativeDraggable&&Zn(qn,"dragend",this),us(qn),qn.style["will-change"]="",za&&!Pa&&Mi(qn,wi?wi.options.ghostClass:this.options.ghostClass,!1),Mi(qn,this.options.chosenClass,!1),Oi({sortable:this,name:"unchoose",toEl:hi,newIndex:null,newDraggableIndex:null,originalEvent:Gr}),ui!==hi?(Fi>=0&&(Oi({rootEl:hi,name:"add",toEl:hi,fromEl:ui,originalEvent:Gr}),Oi({sortable:this,name:"remove",toEl:hi,originalEvent:Gr}),Oi({rootEl:hi,name:"sort",toEl:hi,fromEl:ui,originalEvent:Gr}),Oi({sortable:this,name:"sort",toEl:hi,originalEvent:Gr})),wi&&wi.save()):Fi!==Ra&&Fi>=0&&(Oi({sortable:this,name:"update",toEl:hi,originalEvent:Gr}),Oi({sortable:this,name:"sort",toEl:hi,originalEvent:Gr})),Qn.active&&((Fi==null||Fi===-1)&&(Fi=Ra,oa=Ka),Oi({sortable:this,name:"end",toEl:hi,originalEvent:Gr}),this.save()))),this._nulling()},_nulling:function(){Di("nulling",this),ui=qn=hi=Yn=va=ci=xo=sa=ma=zi=za=Fi=oa=Ra=Ka=Da=Ya=wi=vo=Qn.dragged=Qn.ghost=Qn.clone=Qn.active=null,Ao.forEach(function(Gr){Gr.checked=!0}),Ao.length=os=ss=0},handleEvent:function(Gr){switch(Gr.type){case"drop":case"dragend":this._onDrop(Gr);break;case"dragenter":case"dragover":qn&&(this._onDragOver(Gr),Eu(Gr));break;case"selectstart":Gr.preventDefault();break}},toArray:function(){for(var Gr=[],Wr,Kr=this.el.children,Yr=0,Zr=Kr.length,tn=this.options;Yr<Zr;Yr++)Wr=Kr[Yr],Vi(Wr,tn.draggable,this.el,!1)&&Gr.push(Wr.getAttribute(tn.dataIdAttr)||Cu(Wr));return Gr},sort:function(Gr,Wr){var Kr={},Yr=this.el;this.toArray().forEach(function(Zr,tn){var ln=Yr.children[tn];Vi(ln,this.options.draggable,Yr,!1)&&(Kr[Zr]=ln)},this),Wr&&this.captureAnimationState(),Gr.forEach(function(Zr){Kr[Zr]&&(Yr.removeChild(Kr[Zr]),Yr.appendChild(Kr[Zr]))}),Wr&&this.animateAll()},save:function(){var Gr=this.options.store;Gr&&Gr.set&&Gr.set(this)},closest:function(Gr,Wr){return Vi(Gr,Wr||this.options.draggable,this.el,!1)},option:function(Gr,Wr){var Kr=this.options;if(Wr===void 0)return Kr[Gr];var Yr=Za.modifyOption(this,Gr,Wr);typeof Yr<"u"?Kr[Gr]=Yr:Kr[Gr]=Wr,Gr==="group"&&gl(Kr)},destroy:function(){Di("destroy",this);var Gr=this.el;Gr[Pi]=null,Zn(Gr,"mousedown",this._onTapStart),Zn(Gr,"touchstart",this._onTapStart),Zn(Gr,"pointerdown",this._onTapStart),this.nativeDraggable&&(Zn(Gr,"dragover",this),Zn(Gr,"dragenter",this)),Array.prototype.forEach.call(Gr.querySelectorAll("[draggable]"),function(Wr){Wr.removeAttribute("draggable")}),this._onDrop(),this._disableDelayedDragEvents(),Oo.splice(Oo.indexOf(this.el),1),this.el=Gr=null},_hideClone:function(){if(!sa){if(Di("hideClone",this),Qn.eventCanceled)return;Xn(ci,"display","none"),this.options.removeCloneOnHide&&ci.parentNode&&ci.parentNode.removeChild(ci),sa=!0}},_showClone:function(Gr){if(Gr.lastPutMode!=="clone"){this._hideClone();return}if(sa){if(Di("showClone",this),Qn.eventCanceled)return;qn.parentNode==ui&&!this.options.group.revertClone?ui.insertBefore(ci,qn):va?ui.insertBefore(ci,va):ui.appendChild(ci),this.options.group.revertClone&&this.animate(qn,ci),Xn(ci,"display",""),sa=!1}}};function Eu(Qr){Qr.dataTransfer&&(Qr.dataTransfer.dropEffect="move"),Qr.cancelable&&Qr.preventDefault()}function Eo(Qr,Gr,Wr,Kr,Yr,Zr,tn,ln){var dn,yn=Qr[Pi],wn=yn.options.onMove,kn;return window.CustomEvent&&!ra&&!Ja?dn=new CustomEvent("move",{bubbles:!0,cancelable:!0}):(dn=document.createEvent("Event"),dn.initEvent("move",!0,!0)),dn.to=Gr,dn.from=Qr,dn.dragged=Wr,dn.draggedRect=Kr,dn.related=Yr||Gr,dn.relatedRect=Zr||yi(Gr),dn.willInsertAfter=ln,dn.originalEvent=tn,Qr.dispatchEvent(dn),wn&&(kn=wn.call(yn,dn,tn)),kn}function us(Qr){Qr.draggable=!1}function Tu(){ds=!1}function xu(Qr,Gr,Wr){var Kr=yi(La(Wr.el,0,Wr.options,!0)),Yr=dl(Wr.el,Wr.options,Yn),Zr=10;return Gr?Qr.clientX<Yr.left-Zr||Qr.clientY<Kr.top&&Qr.clientX<Kr.right:Qr.clientY<Yr.top-Zr||Qr.clientY<Kr.bottom&&Qr.clientX<Kr.left}function Su(Qr,Gr,Wr){var Kr=yi(ys(Wr.el,Wr.options.draggable)),Yr=dl(Wr.el,Wr.options,Yn),Zr=10;return Gr?Qr.clientX>Yr.right+Zr||Qr.clientY>Kr.bottom&&Qr.clientX>Kr.left:Qr.clientY>Yr.bottom+Zr||Qr.clientX>Kr.right&&Qr.clientY>Kr.top}function wu(Qr,Gr,Wr,Kr,Yr,Zr,tn,ln){var dn=Kr?Qr.clientY:Qr.clientX,yn=Kr?Wr.height:Wr.width,wn=Kr?Wr.top:Wr.left,kn=Kr?Wr.bottom:Wr.right,An=!1;if(!tn){if(ln&&So<yn*Yr){if(!$a&&(Ya===1?dn>wn+yn*Zr/2:dn<kn-yn*Zr/2)&&($a=!0),$a)An=!0;else if(Ya===1?dn<wn+So:dn>kn-So)return-Ya}else if(dn>wn+yn*(1-Yr)/2&&dn<kn-yn*(1-Yr)/2)return ku(Gr)}return An=An||tn,An&&(dn<wn+yn*Zr/2||dn>kn-yn*Zr/2)?dn>wn+yn/2?1:-1:0}function ku(Qr){return Gi(qn)<Gi(Qr)?1:-1}function Cu(Qr){for(var Gr=Qr.tagName+Qr.className+Qr.src+Qr.href+Qr.textContent,Wr=Gr.length,Kr=0;Wr--;)Kr+=Gr.charCodeAt(Wr);return Kr.toString(36)}function Iu(Qr){Ao.length=0;for(var Gr=Qr.getElementsByTagName("input"),Wr=Gr.length;Wr--;){var Kr=Gr[Wr];Kr.checked&&Ao.push(Kr)}}function wo(Qr){return setTimeout(Qr,0)}function ps(Qr){return clearTimeout(Qr)}Po&&ei(document,"touchmove",function(Qr){(Qn.active||Pa)&&Qr.cancelable&&Qr.preventDefault()});Qn.utils={on:ei,off:Zn,css:Xn,find:ul,is:function(Gr,Wr){return!!Vi(Gr,Wr,Gr,!1)},extend:uu,throttle:cl,closest:Vi,toggleClass:Mi,clone:hl,index:Gi,nextTick:wo,cancelNextTick:ps,detectDirection:ml,getChild:La,expando:Pi};Qn.get=function(Qr){return Qr[Pi]};Qn.mount=function(){for(var Qr=arguments.length,Gr=new Array(Qr),Wr=0;Wr<Qr;Wr++)Gr[Wr]=arguments[Wr];Gr[0].constructor===Array&&(Gr=Gr[0]),Gr.forEach(function(Kr){if(!Kr.prototype||!Kr.prototype.constructor)throw"Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(Kr));Kr.utils&&(Qn.utils=Qi(Qi({},Qn.utils),Kr.utils)),Za.mount(Kr)})};Qn.create=function(Qr,Gr){return new Qn(Qr,Gr)};Qn.version=su;var vi=[],Va,ms,gs=!1,cs,fs,Do,Wa;function Ou(){function Qr(){this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0};for(var Gr in this)Gr.charAt(0)==="_"&&typeof this[Gr]=="function"&&(this[Gr]=this[Gr].bind(this))}return Qr.prototype={dragStarted:function(Wr){var Kr=Wr.originalEvent;this.sortable.nativeDraggable?ei(document,"dragover",this._handleAutoScroll):this.options.supportPointer?ei(document,"pointermove",this._handleFallbackAutoScroll):Kr.touches?ei(document,"touchmove",this._handleFallbackAutoScroll):ei(document,"mousemove",this._handleFallbackAutoScroll)},dragOverCompleted:function(Wr){var Kr=Wr.originalEvent;!this.options.dragOverBubble&&!Kr.rootEl&&this._handleAutoScroll(Kr)},drop:function(){this.sortable.nativeDraggable?Zn(document,"dragover",this._handleAutoScroll):(Zn(document,"pointermove",this._handleFallbackAutoScroll),Zn(document,"touchmove",this._handleFallbackAutoScroll),Zn(document,"mousemove",this._handleFallbackAutoScroll)),al(),ko(),cu()},nulling:function(){Do=ms=Va=gs=Wa=cs=fs=null,vi.length=0},_handleFallbackAutoScroll:function(Wr){this._handleAutoScroll(Wr,!0)},_handleAutoScroll:function(Wr,Kr){var Yr=this,Zr=(Wr.touches?Wr.touches[0]:Wr).clientX,tn=(Wr.touches?Wr.touches[0]:Wr).clientY,ln=document.elementFromPoint(Zr,tn);if(Do=Wr,Kr||this.options.forceAutoScrollFallback||Ja||ra||Xa){hs(Wr,this.options,ln,Kr);var dn=la(ln,!0);gs&&(!Wa||Zr!==cs||tn!==fs)&&(Wa&&al(),Wa=setInterval(function(){var yn=la(document.elementFromPoint(Zr,tn),!0);yn!==dn&&(dn=yn,ko()),hs(Wr,Yr.options,yn,Kr)},10),cs=Zr,fs=tn)}else{if(!this.options.bubbleScroll||la(ln,!0)===Xi()){ko();return}hs(Wr,this.options,la(ln,!1),!1)}}},ta(Qr,{pluginName:"scroll",initializeByDefault:!0})}function ko(){vi.forEach(function(Qr){clearInterval(Qr.pid)}),vi=[]}function al(){clearInterval(Wa)}var hs=cl(function(Qr,Gr,Wr,Kr){if(Gr.scroll){var Yr=(Qr.touches?Qr.touches[0]:Qr).clientX,Zr=(Qr.touches?Qr.touches[0]:Qr).clientY,tn=Gr.scrollSensitivity,ln=Gr.scrollSpeed,dn=Xi(),yn=!1,wn;ms!==Wr&&(ms=Wr,ko(),Va=Gr.scroll,wn=Gr.scrollFn,Va===!0&&(Va=la(Wr,!0)));var kn=0,An=Va;do{var Gn=An,jn=yi(Gn),Vn=jn.top,ti=jn.bottom,Ti=jn.left,fi=jn.right,oi=jn.width,Jn=jn.height,mi=void 0,ai=void 0,Ui=Gn.scrollWidth,gi=Gn.scrollHeight,ri=Xn(Gn),xn=Gn.scrollLeft,en=Gn.scrollTop;Gn===dn?(mi=oi<Ui&&(ri.overflowX==="auto"||ri.overflowX==="scroll"||ri.overflowX==="visible"),ai=Jn<gi&&(ri.overflowY==="auto"||ri.overflowY==="scroll"||ri.overflowY==="visible")):(mi=oi<Ui&&(ri.overflowX==="auto"||ri.overflowX==="scroll"),ai=Jn<gi&&(ri.overflowY==="auto"||ri.overflowY==="scroll"));var an=mi&&(Math.abs(fi-Yr)<=tn&&xn+oi<Ui)-(Math.abs(Ti-Yr)<=tn&&!!xn),pn=ai&&(Math.abs(ti-Zr)<=tn&&en+Jn<gi)-(Math.abs(Vn-Zr)<=tn&&!!en);if(!vi[kn])for(var mn=0;mn<=kn;mn++)vi[mn]||(vi[mn]={});(vi[kn].vx!=an||vi[kn].vy!=pn||vi[kn].el!==Gn)&&(vi[kn].el=Gn,vi[kn].vx=an,vi[kn].vy=pn,clearInterval(vi[kn].pid),(an!=0||pn!=0)&&(yn=!0,vi[kn].pid=setInterval(function(){Kr&&this.layer===0&&Qn.active._onTouchMove(Do);var Sn=vi[this.layer].vy?vi[this.layer].vy*ln:0,vn=vi[this.layer].vx?vi[this.layer].vx*ln:0;typeof wn=="function"&&wn.call(Qn.dragged.parentNode[Pi],vn,Sn,Qr,Do,vi[this.layer].el)!=="continue"||fl(vi[this.layer].el,vn,Sn)}.bind({layer:kn}),24))),kn++}while(Gr.bubbleScroll&&An!==dn&&(An=la(An,!1)));gs=yn}},30),bl=function(Gr){var Wr=Gr.originalEvent,Kr=Gr.putSortable,Yr=Gr.dragEl,Zr=Gr.activeSortable,tn=Gr.dispatchSortableEvent,ln=Gr.hideGhostForTarget,dn=Gr.unhideGhostForTarget;if(Wr){var yn=Kr||Zr;ln();var wn=Wr.changedTouches&&Wr.changedTouches.length?Wr.changedTouches[0]:Wr,kn=document.elementFromPoint(wn.clientX,wn.clientY);dn(),yn&&!yn.el.contains(kn)&&(tn("spill"),this.onSpill({dragEl:Yr,putSortable:Kr}))}};function bs(){}bs.prototype={startIndex:null,dragStart:function(Gr){var Wr=Gr.oldDraggableIndex;this.startIndex=Wr},onSpill:function(Gr){var Wr=Gr.dragEl,Kr=Gr.putSortable;this.sortable.captureAnimationState(),Kr&&Kr.captureAnimationState();var Yr=La(this.sortable.el,this.startIndex,this.options);Yr?this.sortable.el.insertBefore(Wr,Yr):this.sortable.el.appendChild(Wr),this.sortable.animateAll(),Kr&&Kr.animateAll()},drop:bl};ta(bs,{pluginName:"revertOnSpill"});function Es(){}Es.prototype={onSpill:function(Gr){var Wr=Gr.dragEl,Kr=Gr.putSortable,Yr=Kr||this.sortable;Yr.captureAnimationState(),Wr.parentNode&&Wr.parentNode.removeChild(Wr),Yr.animateAll()},drop:bl};ta(Es,{pluginName:"removeOnSpill"});Qn.mount(new Ou);Qn.mount(Es,bs);var El=Qn;var Ro=class{observerInitialized=!1;layoutMode;containerSelector;spacing;masonryBreakpoint;constructor(Gr={}){this.layoutMode=Gr.layoutMode??"justified",this.containerSelector=Gr.containerSelector??"#gallery-container",this.spacing=Gr.spacing??8,this.masonryBreakpoint=Gr.masonryBreakpoint??640}setLayoutMode(Gr){this.layoutMode=Gr,this.computeLayout()}computeLayout(){this.layoutMode==="masonry"?this.computeMasonry():this.computeJustified()}computeMasonry(){let Gr=document.querySelector(this.containerSelector);if(!Gr)return;let Wr=this.spacing,Kr=Gr.offsetWidth;if(Kr===0){requestAnimationFrame(()=>this.computeMasonry());return}let Yr=Kr<this.masonryBreakpoint?1:3,Zr=(Kr+Wr)/Yr-Wr,tn=new Array(Yr).fill(0);Gr.querySelectorAll(".gallery-item").forEach(dn=>{let yn=parseFloat(dn.dataset.width),wn=parseFloat(dn.dataset.height);if(!yn||!wn)return;let An=wn/yn*Zr,Gn=0;for(let ti=1;ti<Yr;ti++)tn[ti]<tn[Gn]&&(Gn=ti);let jn=(Zr+Wr)*Gn,Vn=tn[Gn];Object.assign(dn.style,{position:"absolute",width:`${Zr}px`,height:`${An}px`,left:`${jn}px`,top:`${Vn}px`}),tn[Gn]=Vn+An+Wr}),Gr.style.height=`${Math.max(...tn)}px`}computeJustified(){let Gr=document.querySelector(this.containerSelector);if(!Gr)return;let Wr=this.spacing,Kr=Gr.offsetWidth;if(Kr===0){requestAnimationFrame(()=>this.computeJustified());return}let Yr=Array.from(Gr.querySelectorAll(".gallery-item")),Zr=[],tn=0,ln=0;Yr.forEach(dn=>{Object.assign(dn.style,{position:"absolute",left:"0px",top:"0px",width:"auto",height:"auto"})});for(let dn=0;dn<Yr.length;dn++){let yn=Yr[dn],wn=parseFloat(yn.dataset.width),kn=parseFloat(yn.dataset.height);if(!wn||!kn)continue;let An=wn/kn;Zr.push({tile:yn,aspectRatio:An,imgW:wn,imgH:kn}),tn+=An;let Gn=(Kr-(Zr.length-1)*Wr)/tn;if(Gn<300||dn===Yr.length-1){let jn=0;for(let Vn of Zr){let ti=Gn*Vn.aspectRatio;Object.assign(Vn.tile.style,{position:"absolute",top:`${ln}px`,left:`${jn}px`,width:`${ti}px`,height:`${Gn}px`}),jn+=ti+Wr}ln+=Gn+Wr,Zr=[],tn=0}}Gr.style.position="relative",Gr.style.height=`${ln}px`}observe(){if(this.observerInitialized)return;this.observerInitialized=!0;let Gr=document.querySelector(this.containerSelector);if(!Gr)return;if(typeof ResizeObserver<"u"){let Kr=new ResizeObserver(()=>this.computeLayout());Gr.parentElement&&Kr.observe(Gr.parentElement)}new MutationObserver(()=>{this.computeLayout()}).observe(Gr,{childList:!0,subtree:!0})}init(Gr={}){document.addEventListener("DOMContentLoaded",()=>{document.querySelector(Gr.containerSelector??"#gallery-container")&&(this.computeLayout(),this.observe())})}};var No=class Qr{startX=0;threshold=50;observer;static initialized=!1;static id="photo-dialog";constructor(){this.observer=new MutationObserver(this.handleMutation.bind(this))}connect(){this.onTouchStart=this.onTouchStart.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this),console.log("PhotoDialog: Connected touch event handlers.")}static maybeInitForElement(Gr){if(Gr.id!==Qr.id||Qr.initialized)return;let Wr=new Qr;Wr.connect(),document&&document.body?(document.body.addEventListener("touchstart",Wr.onTouchStart),document.body.addEventListener("touchend",Wr.onTouchEnd),Wr.observe(),Qr.initialized=!0):console.warn("document.body not available for PhotoDialog event listeners")}onTouchStart(Gr){this.startX=Gr.touches[0].clientX}onTouchEnd(Gr){let Kr=Gr.changedTouches[0].clientX-this.startX;if(Math.abs(Kr)>this.threshold){let Yr=Kr>0?"swiperight":"swipeleft";Gr.target.dispatchEvent(new CustomEvent(Yr,{bubbles:!0}))}}observe(){this.observer.observe(document.body,{childList:!0,subtree:!0})}disconnect(){this.observer.disconnect(),document.body.removeEventListener("touchstart",this.onTouchStart),document.body.removeEventListener("touchend",this.onTouchEnd),Qr.initialized=!1}handleMutation(){document.getElementById(Qr.id)||(console.log("PhotoDialog not found, removing event listeners"),this.disconnect())}};var Ts={};ru(Ts,{dataURLToBlob:()=>eo,doResize:()=>to,readFileAsDataURL:()=>Ma});function Ma(Qr){return new Promise((Gr,Wr)=>{let Kr=new FileReader;Kr.onload=()=>Gr(Kr.result),Kr.onerror=Wr,Kr.readAsDataURL(Qr)})}function eo(Qr){let[Gr,Wr]=Qr.split(","),Kr=/:(.*?);/.exec(Gr);if(!Kr)throw new Error("Invalid data URL");let Yr=Kr[1],Zr=atob(Wr),tn=new Uint8Array(Zr.length);for(let ln=0;ln<Zr.length;ln++)tn[ln]=Zr.charCodeAt(ln);return new Blob([tn],{type:Yr})}function Tl(Qr){let Gr=Qr.split(",")[1];return Math.ceil(Gr.length*3/4)}function Au(Qr,Gr){return new Promise((Wr,Kr)=>{let Yr=new Image;Yr.onload=()=>{let Zr;Gr.mode==="cover"?Zr=Math.max(Gr.width/Yr.width,Gr.height/Yr.height):Gr.mode==="contain"?Zr=Math.min(Gr.width/Yr.width,Gr.height/Yr.height):Zr=1;let tn=Math.round(Yr.width*Zr),ln=Math.round(Yr.height*Zr),dn=document.createElement("canvas");dn.width=tn,dn.height=ln;let yn=dn.getContext("2d");if(!yn)return Kr(new Error("Failed to get canvas context"));yn.fillStyle="#fff",yn.fillRect(0,0,tn,ln),yn.imageSmoothingEnabled=!0,yn.imageSmoothingQuality="high",yn.drawImage(Yr,0,0,tn,ln),Wr({dataUrl:dn.toDataURL("image/jpeg",Gr.quality),width:tn,height:ln})},Yr.onerror=Zr=>Kr(Zr),Yr.src=Qr})}async function to(Qr,Gr){let Wr=null,Kr=0,Yr=101;for(;Yr-Kr>1;){let Zr=Math.round((Kr+Yr)/2),tn=await Au(Qr,{width:Gr.width,height:Gr.height,quality:Zr/100,mode:Gr.mode});Tl(tn.dataUrl)<Gr.maxSize?(Kr=Zr,Wr=tn):Yr=Zr}if(!Wr)throw new Error("Failed to compress image");return{path:Wr.dataUrl,mime:"image/jpeg",size:Tl(Wr.dataUrl),width:Wr.width,height:Wr.height}}var xl=po(mo());var Lo=class{handleAvatarImageSelect(Gr){let Wr=Gr.files?.[0];Wr&&Ma(Wr).then(Kr=>{let Yr=document.createElement("img");typeof Kr=="string"?Yr.src=Kr:(console.error("Expected dataUrl to be a string, got:",typeof Kr),Yr.src=""),Yr.className="rounded-full w-full h-full object-cover",Yr.alt="Avatar preview";let Zr=Gr.closest("form")?.querySelector("#image-preview");Zr&&(Zr.innerHTML="",Zr.appendChild(Yr))})}async updateProfile(Gr){let Wr=new FormData(Gr),Kr=Wr.get("file");if(Kr instanceof File&&Kr?.type?.startsWith?.("image/"))try{let Yr=await Ma(Kr);if(!Yr||typeof Yr!="string"){console.error("Failed to read file as data URL");return}let Zr=await to(Yr,{width:2e3,height:2e3,maxSize:1e3*1e3,mode:"contain"}),tn=eo(Zr.path);Wr.set("file",tn,Kr.name)}catch(Yr){console.error("Error resizing image:",Yr),Wr.delete("file")}xl.default.ajax("PUT","/actions/profile",{swap:"none",values:Object.fromEntries(Wr),source:Gr})}};var Yo=typeof self<"u"?self:global,so=typeof navigator<"u",Du=so&&typeof HTMLImageElement>"u",qo=!(typeof global>"u"||typeof process>"u"||!process.versions||!process.versions.node),$o=Yo.Buffer,Mo=Yo.BigInt,Jo=!!$o,Pu=Qr=>Qr;function Uo(Qr,Gr=Pu){if(qo)try{return typeof ns=="function"?Promise.resolve(Gr(ns(Qr))):import(Qr).then(Gr)}catch{console.warn(`Couldn't load ${Qr}`)}}var Fs=Yo.fetch,Ru=Qr=>Fs=Qr;if(!Yo.fetch){let Qr=Uo("http",Kr=>Kr),Gr=Uo("https",Kr=>Kr),Wr=(Kr,{headers:Yr}={})=>new Promise(async(Zr,tn)=>{let{port:ln,hostname:dn,pathname:yn,protocol:wn,search:kn}=new URL(Kr),An={method:"GET",hostname:dn,path:encodeURI(yn)+kn,headers:Yr};ln!==""&&(An.port=Number(ln));let Gn=(wn==="https:"?await Gr:await Qr).request(An,jn=>{if(jn.statusCode===301||jn.statusCode===302){let Vn=new URL(jn.headers.location,Kr).toString();return Wr(Vn,{headers:Yr}).then(Zr).catch(tn)}Zr({status:jn.statusCode,arrayBuffer:()=>new Promise(Vn=>{let ti=[];jn.on("data",Ti=>ti.push(Ti)),jn.on("end",()=>Vn(Buffer.concat(ti)))})})});Gn.on("error",tn),Gn.end()});Ru(Wr)}function Kn(Qr,Gr,Wr){return Gr in Qr?Object.defineProperty(Qr,Gr,{value:Wr,enumerable:!0,configurable:!0,writable:!0}):Qr[Gr]=Wr,Qr}var Bo=Qr=>Fl(Qr)?void 0:Qr,Nu=Qr=>Qr!==void 0;function Fl(Qr){return Qr===void 0||(Qr instanceof Map?Qr.size===0:Object.values(Qr).filter(Nu).length===0)}function Ei(Qr){let Gr=new Error(Qr);throw delete Gr.stack,Gr}function ba(Qr){return(Qr=function(Gr){for(;Gr.endsWith("\0");)Gr=Gr.slice(0,-1);return Gr}(Qr).trim())===""?void 0:Qr}function ks(Qr){let Gr=function(Wr){let Kr=0;return Wr.ifd0.enabled&&(Kr+=1024),Wr.exif.enabled&&(Kr+=2048),Wr.makerNote&&(Kr+=2048),Wr.userComment&&(Kr+=1024),Wr.gps.enabled&&(Kr+=512),Wr.interop.enabled&&(Kr+=100),Wr.ifd1.enabled&&(Kr+=1024),Kr+2048}(Qr);return Qr.jfif.enabled&&(Gr+=50),Qr.xmp.enabled&&(Gr+=2e4),Qr.iptc.enabled&&(Gr+=14e3),Qr.icc.enabled&&(Gr+=6e3),Gr}var Cs=Qr=>String.fromCharCode.apply(null,Qr),Sl=typeof TextDecoder<"u"?new TextDecoder("utf-8"):void 0;function ql(Qr){return Sl?Sl.decode(Qr):Jo?Buffer.from(Qr).toString("utf8"):decodeURIComponent(escape(Cs(Qr)))}var Ki=class Qr{static from(Gr,Wr){return Gr instanceof this&&Gr.le===Wr?Gr:new Qr(Gr,void 0,void 0,Wr)}constructor(Gr,Wr=0,Kr,Yr){if(typeof Yr=="boolean"&&(this.le=Yr),Array.isArray(Gr)&&(Gr=new Uint8Array(Gr)),Gr===0)this.byteOffset=0,this.byteLength=0;else if(Gr instanceof ArrayBuffer){Kr===void 0&&(Kr=Gr.byteLength-Wr);let Zr=new DataView(Gr,Wr,Kr);this._swapDataView(Zr)}else if(Gr instanceof Uint8Array||Gr instanceof DataView||Gr instanceof Qr){Kr===void 0&&(Kr=Gr.byteLength-Wr),(Wr+=Gr.byteOffset)+Kr>Gr.byteOffset+Gr.byteLength&&Ei("Creating view outside of available memory in ArrayBuffer");let Zr=new DataView(Gr.buffer,Wr,Kr);this._swapDataView(Zr)}else if(typeof Gr=="number"){let Zr=new DataView(new ArrayBuffer(Gr));this._swapDataView(Zr)}else Ei("Invalid input argument for BufferView: "+Gr)}_swapArrayBuffer(Gr){this._swapDataView(new DataView(Gr))}_swapBuffer(Gr){this._swapDataView(new DataView(Gr.buffer,Gr.byteOffset,Gr.byteLength))}_swapDataView(Gr){this.dataView=Gr,this.buffer=Gr.buffer,this.byteOffset=Gr.byteOffset,this.byteLength=Gr.byteLength}_lengthToEnd(Gr){return this.byteLength-Gr}set(Gr,Wr,Kr=Qr){return Gr instanceof DataView||Gr instanceof Qr?Gr=new Uint8Array(Gr.buffer,Gr.byteOffset,Gr.byteLength):Gr instanceof ArrayBuffer&&(Gr=new Uint8Array(Gr)),Gr instanceof Uint8Array||Ei("BufferView.set(): Invalid data argument."),this.toUint8().set(Gr,Wr),new Kr(this,Wr,Gr.byteLength)}subarray(Gr,Wr){return Wr=Wr||this._lengthToEnd(Gr),new Qr(this,Gr,Wr)}toUint8(){return new Uint8Array(this.buffer,this.byteOffset,this.byteLength)}getUint8Array(Gr,Wr){return new Uint8Array(this.buffer,this.byteOffset+Gr,Wr)}getString(Gr=0,Wr=this.byteLength){return ql(this.getUint8Array(Gr,Wr))}getLatin1String(Gr=0,Wr=this.byteLength){let Kr=this.getUint8Array(Gr,Wr);return Cs(Kr)}getUnicodeString(Gr=0,Wr=this.byteLength){let Kr=[];for(let Yr=0;Yr<Wr&&Gr+Yr<this.byteLength;Yr+=2)Kr.push(this.getUint16(Gr+Yr));return Cs(Kr)}getInt8(Gr){return this.dataView.getInt8(Gr)}getUint8(Gr){return this.dataView.getUint8(Gr)}getInt16(Gr,Wr=this.le){return this.dataView.getInt16(Gr,Wr)}getInt32(Gr,Wr=this.le){return this.dataView.getInt32(Gr,Wr)}getUint16(Gr,Wr=this.le){return this.dataView.getUint16(Gr,Wr)}getUint32(Gr,Wr=this.le){return this.dataView.getUint32(Gr,Wr)}getFloat32(Gr,Wr=this.le){return this.dataView.getFloat32(Gr,Wr)}getFloat64(Gr,Wr=this.le){return this.dataView.getFloat64(Gr,Wr)}getFloat(Gr,Wr=this.le){return this.dataView.getFloat32(Gr,Wr)}getDouble(Gr,Wr=this.le){return this.dataView.getFloat64(Gr,Wr)}getUintBytes(Gr,Wr,Kr){switch(Wr){case 1:return this.getUint8(Gr,Kr);case 2:return this.getUint16(Gr,Kr);case 4:return this.getUint32(Gr,Kr);case 8:return this.getUint64&&this.getUint64(Gr,Kr)}}getUint(Gr,Wr,Kr){switch(Wr){case 8:return this.getUint8(Gr,Kr);case 16:return this.getUint16(Gr,Kr);case 32:return this.getUint32(Gr,Kr);case 64:return this.getUint64&&this.getUint64(Gr,Kr)}}toString(Gr){return this.dataView.toString(Gr,this.constructor.name)}ensureChunk(){}};function Is(Qr,Gr){Ei(`${Qr} '${Gr}' was not loaded, try using full build of exifr.`)}var lo=class extends Map{constructor(Gr){super(),this.kind=Gr}get(Gr,Wr){return this.has(Gr)||Is(this.kind,Gr),Wr&&(Gr in Wr||function(Kr,Yr){Ei(`Unknown ${Kr} '${Yr}'.`)}(this.kind,Gr),Wr[Gr].enabled||Is(this.kind,Gr)),super.get(Gr)}keyList(){return Array.from(this.keys())}},Yi=new lo("file parser"),bi=new lo("segment parser"),Ji=new lo("file reader");function Lu(Qr,Gr){return typeof Qr=="string"?wl(Qr,Gr):so&&!Du&&Qr instanceof HTMLImageElement?wl(Qr.src,Gr):Qr instanceof Uint8Array||Qr instanceof ArrayBuffer||Qr instanceof DataView?new Ki(Qr):so&&Qr instanceof Blob?Os(Qr,Gr,"blob",Sa):void Ei("Invalid input argument")}function wl(Qr,Gr){return(Wr=Qr).startsWith("data:")||Wr.length>1e4?As(Qr,Gr,"base64"):qo&&Qr.includes("://")?Os(Qr,Gr,"url",xa):qo?As(Qr,Gr,"fs"):so?Os(Qr,Gr,"url",xa):void Ei("Invalid input argument");var Wr}async function Os(Qr,Gr,Wr,Kr){return Ji.has(Wr)?As(Qr,Gr,Wr):Kr?async function(Yr,Zr){let tn=await Zr(Yr);return new Ki(tn)}(Qr,Kr):void Ei(`Parser ${Wr} is not loaded`)}async function As(Qr,Gr,Wr){let Kr=new(Ji.get(Wr))(Qr,Gr);return await Kr.read(),Kr}var xa=Qr=>Fs(Qr).then(Gr=>Gr.arrayBuffer()),Sa=Qr=>new Promise((Gr,Wr)=>{let Kr=new FileReader;Kr.onloadend=()=>Gr(Kr.result||new ArrayBuffer),Kr.onerror=Wr,Kr.readAsArrayBuffer(Qr)}),Ds=class extends Map{get tagKeys(){return this.allKeys||(this.allKeys=Array.from(this.keys())),this.allKeys}get tagValues(){return this.allValues||(this.allValues=Array.from(this.values())),this.allValues}};function pi(Qr,Gr,Wr){let Kr=new Ds;for(let[Yr,Zr]of Wr)Kr.set(Yr,Zr);if(Array.isArray(Gr))for(let Yr of Gr)Qr.set(Yr,Kr);else Qr.set(Gr,Kr);return Kr}function wa(Qr,Gr,Wr){let Kr,Yr=Qr.get(Gr);for(Kr of Wr)Yr.set(Kr[0],Kr[1])}var Si=new Map,Wi=new Map,da=new Map,ua=["chunked","firstChunkSize","firstChunkSizeNode","firstChunkSizeBrowser","chunkSize","chunkLimit"],Ha=["jfif","xmp","icc","iptc","ihdr"],ka=["tiff",...Ha],di=["ifd0","ifd1","exif","gps","interop"],ca=[...ka,...di],fa=["makerNote","userComment"],Ga=["translateKeys","translateValues","reviveValues","multiSegment"],ha=[...Ga,"sanitize","mergeOutput","silentErrors"],Ho=class{get translate(){return this.translateKeys||this.translateValues||this.reviveValues}},ya=class extends Ho{get needed(){return this.enabled||this.deps.size>0}constructor(Gr,Wr,Kr,Yr){if(super(),Kn(this,"enabled",!1),Kn(this,"skip",new Set),Kn(this,"pick",new Set),Kn(this,"deps",new Set),Kn(this,"translateKeys",!1),Kn(this,"translateValues",!1),Kn(this,"reviveValues",!1),this.key=Gr,this.enabled=Wr,this.parse=this.enabled,this.applyInheritables(Yr),this.canBeFiltered=di.includes(Gr),this.canBeFiltered&&(this.dict=Si.get(Gr)),Kr!==void 0)if(Array.isArray(Kr))this.parse=this.enabled=!0,this.canBeFiltered&&Kr.length>0&&this.translateTagSet(Kr,this.pick);else if(typeof Kr=="object"){if(this.enabled=!0,this.parse=Kr.parse!==!1,this.canBeFiltered){let{pick:Zr,skip:tn}=Kr;Zr&&Zr.length>0&&this.translateTagSet(Zr,this.pick),tn&&tn.length>0&&this.translateTagSet(tn,this.skip)}this.applyInheritables(Kr)}else Kr===!0||Kr===!1?this.parse=this.enabled=Kr:Ei(`Invalid options argument: ${Kr}`)}applyInheritables(Gr){let Wr,Kr;for(Wr of Ga)Kr=Gr[Wr],Kr!==void 0&&(this[Wr]=Kr)}translateTagSet(Gr,Wr){if(this.dict){let Kr,Yr,{tagKeys:Zr,tagValues:tn}=this.dict;for(Kr of Gr)typeof Kr=="string"?(Yr=tn.indexOf(Kr),Yr===-1&&(Yr=Zr.indexOf(Number(Kr))),Yr!==-1&&Wr.add(Number(Zr[Yr]))):Wr.add(Kr)}else for(let Kr of Gr)Wr.add(Kr)}finalizeFilters(){!this.enabled&&this.deps.size>0?(this.enabled=!0,Go(this.pick,this.deps)):this.enabled&&this.pick.size>0&&Go(this.pick,this.deps)}},Ai={jfif:!1,tiff:!0,xmp:!1,icc:!1,iptc:!1,ifd0:!0,ifd1:!1,exif:!0,gps:!0,interop:!1,ihdr:void 0,makerNote:!1,userComment:!1,multiSegment:!1,skip:[],pick:[],translateKeys:!0,translateValues:!0,reviveValues:!0,sanitize:!0,mergeOutput:!0,silentErrors:!0,chunked:!0,firstChunkSize:void 0,firstChunkSizeNode:512,firstChunkSizeBrowser:65536,chunkSize:65536,chunkLimit:5},kl=new Map,ia=class extends Ho{static useCached(Gr){let Wr=kl.get(Gr);return Wr!==void 0||(Wr=new this(Gr),kl.set(Gr,Wr)),Wr}constructor(Gr){super(),Gr===!0?this.setupFromTrue():Gr===void 0?this.setupFromUndefined():Array.isArray(Gr)?this.setupFromArray(Gr):typeof Gr=="object"?this.setupFromObject(Gr):Ei(`Invalid options argument ${Gr}`),this.firstChunkSize===void 0&&(this.firstChunkSize=so?this.firstChunkSizeBrowser:this.firstChunkSizeNode),this.mergeOutput&&(this.ifd1.enabled=!1),this.filterNestedSegmentTags(),this.traverseTiffDependencyTree(),this.checkLoadedPlugins()}setupFromUndefined(){let Gr;for(Gr of ua)this[Gr]=Ai[Gr];for(Gr of ha)this[Gr]=Ai[Gr];for(Gr of fa)this[Gr]=Ai[Gr];for(Gr of ca)this[Gr]=new ya(Gr,Ai[Gr],void 0,this)}setupFromTrue(){let Gr;for(Gr of ua)this[Gr]=Ai[Gr];for(Gr of ha)this[Gr]=Ai[Gr];for(Gr of fa)this[Gr]=!0;for(Gr of ca)this[Gr]=new ya(Gr,!0,void 0,this)}setupFromArray(Gr){let Wr;for(Wr of ua)this[Wr]=Ai[Wr];for(Wr of ha)this[Wr]=Ai[Wr];for(Wr of fa)this[Wr]=Ai[Wr];for(Wr of ca)this[Wr]=new ya(Wr,!1,void 0,this);this.setupGlobalFilters(Gr,void 0,di)}setupFromObject(Gr){let Wr;for(Wr of(di.ifd0=di.ifd0||di.image,di.ifd1=di.ifd1||di.thumbnail,Object.assign(this,Gr),ua))this[Wr]=xs(Gr[Wr],Ai[Wr]);for(Wr of ha)this[Wr]=xs(Gr[Wr],Ai[Wr]);for(Wr of fa)this[Wr]=xs(Gr[Wr],Ai[Wr]);for(Wr of ka)this[Wr]=new ya(Wr,Ai[Wr],Gr[Wr],this);for(Wr of di)this[Wr]=new ya(Wr,Ai[Wr],Gr[Wr],this.tiff);this.setupGlobalFilters(Gr.pick,Gr.skip,di,ca),Gr.tiff===!0?this.batchEnableWithBool(di,!0):Gr.tiff===!1?this.batchEnableWithUserValue(di,Gr):Array.isArray(Gr.tiff)?this.setupGlobalFilters(Gr.tiff,void 0,di):typeof Gr.tiff=="object"&&this.setupGlobalFilters(Gr.tiff.pick,Gr.tiff.skip,di)}batchEnableWithBool(Gr,Wr){for(let Kr of Gr)this[Kr].enabled=Wr}batchEnableWithUserValue(Gr,Wr){for(let Kr of Gr){let Yr=Wr[Kr];this[Kr].enabled=Yr!==!1&&Yr!==void 0}}setupGlobalFilters(Gr,Wr,Kr,Yr=Kr){if(Gr&&Gr.length){for(let tn of Yr)this[tn].enabled=!1;let Zr=Cl(Gr,Kr);for(let[tn,ln]of Zr)Go(this[tn].pick,ln),this[tn].enabled=!0}else if(Wr&&Wr.length){let Zr=Cl(Wr,Kr);for(let[tn,ln]of Zr)Go(this[tn].skip,ln)}}filterNestedSegmentTags(){let{ifd0:Gr,exif:Wr,xmp:Kr,iptc:Yr,icc:Zr}=this;this.makerNote?Wr.deps.add(37500):Wr.skip.add(37500),this.userComment?Wr.deps.add(37510):Wr.skip.add(37510),Kr.enabled||Gr.skip.add(700),Yr.enabled||Gr.skip.add(33723),Zr.enabled||Gr.skip.add(34675)}traverseTiffDependencyTree(){let{ifd0:Gr,exif:Wr,gps:Kr,interop:Yr}=this;Yr.needed&&(Wr.deps.add(40965),Gr.deps.add(40965)),Wr.needed&&Gr.deps.add(34665),Kr.needed&&Gr.deps.add(34853),this.tiff.enabled=di.some(Zr=>this[Zr].enabled===!0)||this.makerNote||this.userComment;for(let Zr of di)this[Zr].finalizeFilters()}get onlyTiff(){return!Ha.map(Gr=>this[Gr].enabled).some(Gr=>Gr===!0)&&this.tiff.enabled}checkLoadedPlugins(){for(let Gr of ka)this[Gr].enabled&&!bi.has(Gr)&&Is("segment parser",Gr)}};function Cl(Qr,Gr){let Wr,Kr,Yr,Zr,tn=[];for(Yr of Gr){for(Zr of(Wr=Si.get(Yr),Kr=[],Wr))(Qr.includes(Zr[0])||Qr.includes(Zr[1]))&&Kr.push(Zr[0]);Kr.length&&tn.push([Yr,Kr])}return tn}function xs(Qr,Gr){return Qr!==void 0?Qr:Gr!==void 0?Gr:void 0}function Go(Qr,Gr){for(let Wr of Gr)Qr.add(Wr)}Kn(ia,"default",Ai);var $i=class{constructor(Gr){Kn(this,"parsers",{}),Kn(this,"output",{}),Kn(this,"errors",[]),Kn(this,"pushToErrors",Wr=>this.errors.push(Wr)),this.options=ia.useCached(Gr)}async read(Gr){this.file=await Lu(Gr,this.options)}setup(){if(this.fileParser)return;let{file:Gr}=this,Wr=Gr.getUint16(0);for(let[Kr,Yr]of Yi)if(Yr.canHandle(Gr,Wr))return this.fileParser=new Yr(this.options,this.file,this.parsers),Gr[Kr]=!0;this.file.close&&this.file.close(),Ei("Unknown file format")}async parse(){let{output:Gr,errors:Wr}=this;return this.setup(),this.options.silentErrors?(await this.executeParsers().catch(this.pushToErrors),Wr.push(...this.fileParser.errors)):await this.executeParsers(),this.file.close&&this.file.close(),this.options.silentErrors&&Wr.length>0&&(Gr.errors=Wr),Bo(Gr)}async executeParsers(){let{output:Gr}=this;await this.fileParser.parse();let Wr=Object.values(this.parsers).map(async Kr=>{let Yr=await Kr.parse();Kr.assignToOutput(Gr,Yr)});this.options.silentErrors&&(Wr=Wr.map(Kr=>Kr.catch(this.pushToErrors))),await Promise.all(Wr)}async extractThumbnail(){this.setup();let{options:Gr,file:Wr}=this,Kr=bi.get("tiff",Gr);var Yr;if(Wr.tiff?Yr={start:0,type:"tiff"}:Wr.jpeg&&(Yr=await this.fileParser.getOrFindSegment("tiff")),Yr===void 0)return;let Zr=await this.fileParser.ensureSegmentChunk(Yr),tn=this.parsers.tiff=new Kr(Zr,Gr,Wr),ln=await tn.extractThumbnail();return Wr.close&&Wr.close(),ln}};async function Zo(Qr,Gr){let Wr=new $i(Gr);return await Wr.read(Qr),Wr.parse()}var Mu=Object.freeze({__proto__:null,parse:Zo,Exifr:$i,fileParsers:Yi,segmentParsers:bi,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:pi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:di,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia}),Ua=class{constructor(Gr,Wr,Kr){Kn(this,"errors",[]),Kn(this,"ensureSegmentChunk",async Yr=>{let Zr=Yr.start,tn=Yr.size||65536;if(this.file.chunked)if(this.file.available(Zr,tn))Yr.chunk=this.file.subarray(Zr,tn);else try{Yr.chunk=await this.file.readChunk(Zr,tn)}catch(ln){Ei(`Couldn't read segment: ${JSON.stringify(Yr)}. ${ln.message}`)}else this.file.byteLength>Zr+tn?Yr.chunk=this.file.subarray(Zr,tn):Yr.size===void 0?Yr.chunk=this.file.subarray(Zr):Ei("Segment unreachable: "+JSON.stringify(Yr));return Yr.chunk}),this.extendOptions&&this.extendOptions(Gr),this.options=Gr,this.file=Wr,this.parsers=Kr}injectSegment(Gr,Wr){this.options[Gr].enabled&&this.createParser(Gr,Wr)}createParser(Gr,Wr){let Kr=new(bi.get(Gr))(Wr,this.options,this.file);return this.parsers[Gr]=Kr}createParsers(Gr){for(let Wr of Gr){let{type:Kr,chunk:Yr}=Wr,Zr=this.options[Kr];if(Zr&&Zr.enabled){let tn=this.parsers[Kr];tn&&tn.append||tn||this.createParser(Kr,Yr)}}}async readSegments(Gr){let Wr=Gr.map(this.ensureSegmentChunk);await Promise.all(Wr)}},qi=class{static findPosition(Gr,Wr){let Kr=Gr.getUint16(Wr+2)+2,Yr=typeof this.headerLength=="function"?this.headerLength(Gr,Wr,Kr):this.headerLength,Zr=Wr+Yr,tn=Kr-Yr;return{offset:Wr,length:Kr,headerLength:Yr,start:Zr,size:tn,end:Zr+tn}}static parse(Gr,Wr={}){return new this(Gr,new ia({[this.type]:Wr}),Gr).parse()}normalizeInput(Gr){return Gr instanceof Ki?Gr:new Ki(Gr)}constructor(Gr,Wr={},Kr){Kn(this,"errors",[]),Kn(this,"raw",new Map),Kn(this,"handleError",Yr=>{if(!this.options.silentErrors)throw Yr;this.errors.push(Yr.message)}),this.chunk=this.normalizeInput(Gr),this.file=Kr,this.type=this.constructor.type,this.globalOptions=this.options=Wr,this.localOptions=Wr[this.type],this.canTranslate=this.localOptions&&this.localOptions.translate}translate(){this.canTranslate&&(this.translated=this.translateBlock(this.raw,this.type))}get output(){return this.translated?this.translated:this.raw?Object.fromEntries(this.raw):void 0}translateBlock(Gr,Wr){let Kr=da.get(Wr),Yr=Wi.get(Wr),Zr=Si.get(Wr),tn=this.options[Wr],ln=tn.reviveValues&&!!Kr,dn=tn.translateValues&&!!Yr,yn=tn.translateKeys&&!!Zr,wn={};for(let[kn,An]of Gr)ln&&Kr.has(kn)?An=Kr.get(kn)(An):dn&&Yr.has(kn)&&(An=this.translateValue(An,Yr.get(kn))),yn&&Zr.has(kn)&&(kn=Zr.get(kn)||kn),wn[kn]=An;return wn}translateValue(Gr,Wr){return Wr[Gr]||Wr.DEFAULT||Gr}assignToOutput(Gr,Wr){this.assignObjectToOutput(Gr,this.constructor.type,Wr)}assignObjectToOutput(Gr,Wr,Kr){if(this.globalOptions.mergeOutput)return Object.assign(Gr,Kr);Gr[Wr]?Object.assign(Gr[Wr],Kr):Gr[Wr]=Kr}};Kn(qi,"headerLength",4),Kn(qi,"type",void 0),Kn(qi,"multiSegment",!1),Kn(qi,"canHandle",()=>!1);function Fu(Qr){return Qr===192||Qr===194||Qr===196||Qr===219||Qr===221||Qr===218||Qr===254}function qu(Qr){return Qr>=224&&Qr<=239}function Uu(Qr,Gr,Wr){for(let[Kr,Yr]of bi)if(Yr.canHandle(Qr,Gr,Wr))return Kr}var _o=class extends Ua{constructor(...Gr){super(...Gr),Kn(this,"appSegments",[]),Kn(this,"jpegSegments",[]),Kn(this,"unknownSegments",[])}static canHandle(Gr,Wr){return Wr===65496}async parse(){await this.findAppSegments(),await this.readSegments(this.appSegments),this.mergeMultiSegments(),this.createParsers(this.mergedAppSegments||this.appSegments)}setupSegmentFinderArgs(Gr){Gr===!0?(this.findAll=!0,this.wanted=new Set(bi.keyList())):(Gr=Gr===void 0?bi.keyList().filter(Wr=>this.options[Wr].enabled):Gr.filter(Wr=>this.options[Wr].enabled&&bi.has(Wr)),this.findAll=!1,this.remaining=new Set(Gr),this.wanted=new Set(Gr)),this.unfinishedMultiSegment=!1}async findAppSegments(Gr=0,Wr){this.setupSegmentFinderArgs(Wr);let{file:Kr,findAll:Yr,wanted:Zr,remaining:tn}=this;if(!Yr&&this.file.chunked&&(Yr=Array.from(Zr).some(ln=>{let dn=bi.get(ln),yn=this.options[ln];return dn.multiSegment&&yn.multiSegment}),Yr&&await this.file.readWhole()),Gr=this.findAppSegmentsInRange(Gr,Kr.byteLength),!this.options.onlyTiff&&Kr.chunked){let ln=!1;for(;tn.size>0&&!ln&&(Kr.canReadNextChunk||this.unfinishedMultiSegment);){let{nextChunkOffset:dn}=Kr,yn=this.appSegments.some(wn=>!this.file.available(wn.offset||wn.start,wn.length||wn.size));if(ln=Gr>dn&&!yn?!await Kr.readNextChunk(Gr):!await Kr.readNextChunk(dn),(Gr=this.findAppSegmentsInRange(Gr,Kr.byteLength))===void 0)return}}}findAppSegmentsInRange(Gr,Wr){Wr-=2;let Kr,Yr,Zr,tn,ln,dn,{file:yn,findAll:wn,wanted:kn,remaining:An,options:Gn}=this;for(;Gr<Wr;Gr++)if(yn.getUint8(Gr)===255){if(Kr=yn.getUint8(Gr+1),qu(Kr)){if(Yr=yn.getUint16(Gr+2),Zr=Uu(yn,Gr,Yr),Zr&&kn.has(Zr)&&(tn=bi.get(Zr),ln=tn.findPosition(yn,Gr),dn=Gn[Zr],ln.type=Zr,this.appSegments.push(ln),!wn&&(tn.multiSegment&&dn.multiSegment?(this.unfinishedMultiSegment=ln.chunkNumber<ln.chunkCount,this.unfinishedMultiSegment||An.delete(Zr)):An.delete(Zr),An.size===0)))break;Gn.recordUnknownSegments&&(ln=qi.findPosition(yn,Gr),ln.marker=Kr,this.unknownSegments.push(ln)),Gr+=Yr+1}else if(Fu(Kr)){if(Yr=yn.getUint16(Gr+2),Kr===218&&Gn.stopAfterSos!==!1)return;Gn.recordJpegSegments&&this.jpegSegments.push({offset:Gr,length:Yr,marker:Kr}),Gr+=Yr+1}}return Gr}mergeMultiSegments(){if(!this.appSegments.some(Wr=>Wr.multiSegment))return;let Gr=function(Wr,Kr){let Yr,Zr,tn,ln=new Map;for(let dn=0;dn<Wr.length;dn++)Yr=Wr[dn],Zr=Yr[Kr],ln.has(Zr)?tn=ln.get(Zr):ln.set(Zr,tn=[]),tn.push(Yr);return Array.from(ln)}(this.appSegments,"type");this.mergedAppSegments=Gr.map(([Wr,Kr])=>{let Yr=bi.get(Wr,this.options);return Yr.handleMultiSegments?{type:Wr,chunk:Yr.handleMultiSegments(Kr)}:Kr[0]})}getSegment(Gr){return this.appSegments.find(Wr=>Wr.type===Gr)}async getOrFindSegment(Gr){let Wr=this.getSegment(Gr);return Wr===void 0&&(await this.findAppSegments(0,[Gr]),Wr=this.getSegment(Gr)),Wr}};Kn(_o,"type","jpeg"),Yi.set("jpeg",_o);var Bu=[void 0,1,1,2,4,8,1,1,2,4,8,4,8,4],Ps=class extends qi{parseHeader(){var Gr=this.chunk.getUint16();Gr===18761?this.le=!0:Gr===19789&&(this.le=!1),this.chunk.le=this.le,this.headerParsed=!0}parseTags(Gr,Wr,Kr=new Map){let{pick:Yr,skip:Zr}=this.options[Wr];Yr=new Set(Yr);let tn=Yr.size>0,ln=Zr.size===0,dn=this.chunk.getUint16(Gr);Gr+=2;for(let yn=0;yn<dn;yn++){let wn=this.chunk.getUint16(Gr);if(tn){if(Yr.has(wn)&&(Kr.set(wn,this.parseTag(Gr,wn,Wr)),Yr.delete(wn),Yr.size===0))break}else!ln&&Zr.has(wn)||Kr.set(wn,this.parseTag(Gr,wn,Wr));Gr+=12}return Kr}parseTag(Gr,Wr,Kr){let{chunk:Yr}=this,Zr=Yr.getUint16(Gr+2),tn=Yr.getUint32(Gr+4),ln=Bu[Zr];if(ln*tn<=4?Gr+=8:Gr=Yr.getUint32(Gr+8),(Zr<1||Zr>13)&&Ei(`Invalid TIFF value type. block: ${Kr.toUpperCase()}, tag: ${Wr.toString(16)}, type: ${Zr}, offset ${Gr}`),Gr>Yr.byteLength&&Ei(`Invalid TIFF value offset. block: ${Kr.toUpperCase()}, tag: ${Wr.toString(16)}, type: ${Zr}, offset ${Gr} is outside of chunk size ${Yr.byteLength}`),Zr===1)return Yr.getUint8Array(Gr,tn);if(Zr===2)return ba(Yr.getString(Gr,tn));if(Zr===7)return Yr.getUint8Array(Gr,tn);if(tn===1)return this.parseTagValue(Zr,Gr);{let dn=new(function(wn){switch(wn){case 1:return Uint8Array;case 3:return Uint16Array;case 4:return Uint32Array;case 5:return Array;case 6:return Int8Array;case 8:return Int16Array;case 9:return Int32Array;case 10:return Array;case 11:return Float32Array;case 12:return Float64Array;default:return Array}}(Zr))(tn),yn=ln;for(let wn=0;wn<tn;wn++)dn[wn]=this.parseTagValue(Zr,Gr),Gr+=yn;return dn}}parseTagValue(Gr,Wr){let{chunk:Kr}=this;switch(Gr){case 1:return Kr.getUint8(Wr);case 3:return Kr.getUint16(Wr);case 4:return Kr.getUint32(Wr);case 5:return Kr.getUint32(Wr)/Kr.getUint32(Wr+4);case 6:return Kr.getInt8(Wr);case 8:return Kr.getInt16(Wr);case 9:return Kr.getInt32(Wr);case 10:return Kr.getInt32(Wr)/Kr.getInt32(Wr+4);case 11:return Kr.getFloat(Wr);case 12:return Kr.getDouble(Wr);case 13:return Kr.getUint32(Wr);default:Ei(`Invalid tiff type ${Gr}`)}}},no=class extends Ps{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===225&&Gr.getUint32(Wr+4)===1165519206&&Gr.getUint16(Wr+8)===0}async parse(){this.parseHeader();let{options:Gr}=this;return Gr.ifd0.enabled&&await this.parseIfd0Block(),Gr.exif.enabled&&await this.safeParse("parseExifBlock"),Gr.gps.enabled&&await this.safeParse("parseGpsBlock"),Gr.interop.enabled&&await this.safeParse("parseInteropBlock"),Gr.ifd1.enabled&&await this.safeParse("parseThumbnailBlock"),this.createOutput()}safeParse(Gr){let Wr=this[Gr]();return Wr.catch!==void 0&&(Wr=Wr.catch(this.handleError)),Wr}findIfd0Offset(){this.ifd0Offset===void 0&&(this.ifd0Offset=this.chunk.getUint32(4))}findIfd1Offset(){if(this.ifd1Offset===void 0){this.findIfd0Offset();let Gr=this.chunk.getUint16(this.ifd0Offset),Wr=this.ifd0Offset+2+12*Gr;this.ifd1Offset=this.chunk.getUint32(Wr)}}parseBlock(Gr,Wr){let Kr=new Map;return this[Wr]=Kr,this.parseTags(Gr,Wr,Kr),Kr}async parseIfd0Block(){if(this.ifd0)return;let{file:Gr}=this;this.findIfd0Offset(),this.ifd0Offset<8&&Ei("Malformed EXIF data"),!Gr.chunked&&this.ifd0Offset>Gr.byteLength&&Ei(`IFD0 offset points to outside of file. 15 - this.ifd0Offset: ${this.ifd0Offset}, file.byteLength: ${Gr.byteLength}`),Gr.tiff&&await Gr.ensureChunk(this.ifd0Offset,ks(this.options));let Wr=this.parseBlock(this.ifd0Offset,"ifd0");return Wr.size!==0?(this.exifOffset=Wr.get(34665),this.interopOffset=Wr.get(40965),this.gpsOffset=Wr.get(34853),this.xmp=Wr.get(700),this.iptc=Wr.get(33723),this.icc=Wr.get(34675),this.options.sanitize&&(Wr.delete(34665),Wr.delete(40965),Wr.delete(34853),Wr.delete(700),Wr.delete(33723),Wr.delete(34675)),Wr):void 0}async parseExifBlock(){if(this.exif||(this.ifd0||await this.parseIfd0Block(),this.exifOffset===void 0))return;this.file.tiff&&await this.file.ensureChunk(this.exifOffset,ks(this.options));let Gr=this.parseBlock(this.exifOffset,"exif");return this.interopOffset||(this.interopOffset=Gr.get(40965)),this.makerNote=Gr.get(37500),this.userComment=Gr.get(37510),this.options.sanitize&&(Gr.delete(40965),Gr.delete(37500),Gr.delete(37510)),this.unpack(Gr,41728),this.unpack(Gr,41729),Gr}unpack(Gr,Wr){let Kr=Gr.get(Wr);Kr&&Kr.length===1&&Gr.set(Wr,Kr[0])}async parseGpsBlock(){if(this.gps||(this.ifd0||await this.parseIfd0Block(),this.gpsOffset===void 0))return;let Gr=this.parseBlock(this.gpsOffset,"gps");return Gr&&Gr.has(2)&&Gr.has(4)&&(Gr.set("latitude",Il(...Gr.get(2),Gr.get(1))),Gr.set("longitude",Il(...Gr.get(4),Gr.get(3)))),Gr}async parseInteropBlock(){if(!this.interop&&(this.ifd0||await this.parseIfd0Block(),this.interopOffset!==void 0||this.exif||await this.parseExifBlock(),this.interopOffset!==void 0))return this.parseBlock(this.interopOffset,"interop")}async parseThumbnailBlock(Gr=!1){if(!this.ifd1&&!this.ifd1Parsed&&(!this.options.mergeOutput||Gr))return this.findIfd1Offset(),this.ifd1Offset>0&&(this.parseBlock(this.ifd1Offset,"ifd1"),this.ifd1Parsed=!0),this.ifd1}async extractThumbnail(){if(this.headerParsed||this.parseHeader(),this.ifd1Parsed||await this.parseThumbnailBlock(!0),this.ifd1===void 0)return;let Gr=this.ifd1.get(513),Wr=this.ifd1.get(514);return this.chunk.getUint8Array(Gr,Wr)}get image(){return this.ifd0}get thumbnail(){return this.ifd1}createOutput(){let Gr,Wr,Kr,Yr={};for(Wr of di)if(Gr=this[Wr],!Fl(Gr))if(Kr=this.canTranslate?this.translateBlock(Gr,Wr):Object.fromEntries(Gr),this.options.mergeOutput){if(Wr==="ifd1")continue;Object.assign(Yr,Kr)}else Yr[Wr]=Kr;return this.makerNote&&(Yr.makerNote=this.makerNote),this.userComment&&(Yr.userComment=this.userComment),Yr}assignToOutput(Gr,Wr){if(this.globalOptions.mergeOutput)Object.assign(Gr,Wr);else for(let[Kr,Yr]of Object.entries(Wr))this.assignObjectToOutput(Gr,Kr,Yr)}};function Il(Qr,Gr,Wr,Kr){var Yr=Qr+Gr/60+Wr/3600;return Kr!=="S"&&Kr!=="W"||(Yr*=-1),Yr}Kn(no,"type","tiff"),Kn(no,"headerLength",10),bi.set("tiff",no);var Hu=Object.freeze({__proto__:null,default:Mu,Exifr:$i,fileParsers:Yi,segmentParsers:bi,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:pi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:di,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia,parse:Zo}),qs={ifd0:!1,ifd1:!1,exif:!1,gps:!1,interop:!1,sanitize:!1,reviveValues:!0,translateKeys:!1,translateValues:!1,mergeOutput:!1},Us=Object.assign({},qs,{firstChunkSize:4e4,gps:[1,2,3,4]});async function Ul(Qr){let Gr=new $i(Us);await Gr.read(Qr);let Wr=await Gr.parse();if(Wr&&Wr.gps){let{latitude:Kr,longitude:Yr}=Wr.gps;return{latitude:Kr,longitude:Yr}}}var Bs=Object.assign({},qs,{tiff:!1,ifd1:!0,mergeOutput:!1});async function Bl(Qr){let Gr=new $i(Bs);await Gr.read(Qr);let Wr=await Gr.extractThumbnail();return Wr&&Jo?$o.from(Wr):Wr}async function Hl(Qr){let Gr=await this.thumbnail(Qr);if(Gr!==void 0){let Wr=new Blob([Gr]);return URL.createObjectURL(Wr)}}var Hs=Object.assign({},qs,{firstChunkSize:4e4,ifd0:[274]});async function Gs(Qr){let Gr=new $i(Hs);await Gr.read(Qr);let Wr=await Gr.parse();if(Wr&&Wr.ifd0)return Wr.ifd0[274]}var _s=Object.freeze({1:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:0,rad:0},2:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:0,rad:0},3:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:180,rad:180*Math.PI/180},4:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:180,rad:180*Math.PI/180},5:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:90,rad:90*Math.PI/180},6:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:90,rad:90*Math.PI/180},7:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:270,rad:270*Math.PI/180},8:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:270,rad:270*Math.PI/180}}),Ea=!0,Ta=!0;if(typeof navigator=="object"){let Qr=navigator.userAgent;if(Qr.includes("iPad")||Qr.includes("iPhone")){let Gr=Qr.match(/OS (\d+)_(\d+)/);if(Gr){let[,Wr,Kr]=Gr;Ea=Number(Wr)+.1*Number(Kr)<13.4,Ta=!1}}else if(Qr.includes("OS X 10")){let[,Gr]=Qr.match(/OS X 10[_.](\d+)/);Ea=Ta=Number(Gr)<15}if(Qr.includes("Chrome/")){let[,Gr]=Qr.match(/Chrome\/(\d+)/);Ea=Ta=Number(Gr)<81}else if(Qr.includes("Firefox/")){let[,Gr]=Qr.match(/Firefox\/(\d+)/);Ea=Ta=Number(Gr)<77}}async function Gl(Qr){let Gr=await Gs(Qr);return Object.assign({canvas:Ea,css:Ta},_s[Gr])}var Rs=class extends Ki{constructor(...Gr){super(...Gr),Kn(this,"ranges",new Ns),this.byteLength!==0&&this.ranges.add(0,this.byteLength)}_tryExtend(Gr,Wr,Kr){if(Gr===0&&this.byteLength===0&&Kr){let Yr=new DataView(Kr.buffer||Kr,Kr.byteOffset,Kr.byteLength);this._swapDataView(Yr)}else{let Yr=Gr+Wr;if(Yr>this.byteLength){let{dataView:Zr}=this._extend(Yr);this._swapDataView(Zr)}}}_extend(Gr){let Wr;Wr=Jo?$o.allocUnsafe(Gr):new Uint8Array(Gr);let Kr=new DataView(Wr.buffer,Wr.byteOffset,Wr.byteLength);return Wr.set(new Uint8Array(this.buffer,this.byteOffset,this.byteLength),0),{uintView:Wr,dataView:Kr}}subarray(Gr,Wr,Kr=!1){return Wr=Wr||this._lengthToEnd(Gr),Kr&&this._tryExtend(Gr,Wr),this.ranges.add(Gr,Wr),super.subarray(Gr,Wr)}set(Gr,Wr,Kr=!1){Kr&&this._tryExtend(Wr,Gr.byteLength,Gr);let Yr=super.set(Gr,Wr);return this.ranges.add(Wr,Yr.byteLength),Yr}async ensureChunk(Gr,Wr){this.chunked&&(this.ranges.available(Gr,Wr)||await this.readChunk(Gr,Wr))}available(Gr,Wr){return this.ranges.available(Gr,Wr)}},Ns=class{constructor(){Kn(this,"list",[])}get length(){return this.list.length}add(Gr,Wr,Kr=0){let Yr=Gr+Wr,Zr=this.list.filter(tn=>Ol(Gr,tn.offset,Yr)||Ol(Gr,tn.end,Yr));if(Zr.length>0){Gr=Math.min(Gr,...Zr.map(ln=>ln.offset)),Yr=Math.max(Yr,...Zr.map(ln=>ln.end)),Wr=Yr-Gr;let tn=Zr.shift();tn.offset=Gr,tn.length=Wr,tn.end=Yr,this.list=this.list.filter(ln=>!Zr.includes(ln))}else this.list.push({offset:Gr,length:Wr,end:Yr})}available(Gr,Wr){let Kr=Gr+Wr;return this.list.some(Yr=>Yr.offset<=Gr&&Kr<=Yr.end)}};function Ol(Qr,Gr,Wr){return Qr<=Gr&&Gr<=Wr}var Ba=class extends Rs{constructor(Gr,Wr){super(0),Kn(this,"chunksRead",0),this.input=Gr,this.options=Wr}async readWhole(){this.chunked=!1,await this.readChunk(this.nextChunkOffset)}async readChunked(){this.chunked=!0,await this.readChunk(0,this.options.firstChunkSize)}async readNextChunk(Gr=this.nextChunkOffset){if(this.fullyRead)return this.chunksRead++,!1;let Wr=this.options.chunkSize,Kr=await this.readChunk(Gr,Wr);return!!Kr&&Kr.byteLength===Wr}async readChunk(Gr,Wr){if(this.chunksRead++,(Wr=this.safeWrapAddress(Gr,Wr))!==0)return this._readChunk(Gr,Wr)}safeWrapAddress(Gr,Wr){return this.size!==void 0&&Gr+Wr>this.size?Math.max(0,this.size-Gr):Wr}get nextChunkOffset(){if(this.ranges.list.length!==0)return this.ranges.list[0].length}get canReadNextChunk(){return this.chunksRead<this.options.chunkLimit}get fullyRead(){return this.size!==void 0&&this.nextChunkOffset===this.size}read(){return this.options.chunked?this.readChunked():this.readWhole()}close(){}};Ji.set("blob",class extends Ba{async readWhole(){this.chunked=!1;let Qr=await Sa(this.input);this._swapArrayBuffer(Qr)}readChunked(){return this.chunked=!0,this.size=this.input.size,super.readChunked()}async _readChunk(Qr,Gr){let Wr=Gr?Qr+Gr:void 0,Kr=this.input.slice(Qr,Wr),Yr=await Sa(Kr);return this.set(Yr,Qr,!0)}});var Gu=Object.freeze({__proto__:null,default:Hu,Exifr:$i,fileParsers:Yi,segmentParsers:bi,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:pi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:di,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia,parse:Zo,gpsOnlyOptions:Us,gps:Ul,thumbnailOnlyOptions:Bs,thumbnail:Bl,thumbnailUrl:Hl,orientationOnlyOptions:Hs,orientation:Gs,rotations:_s,get rotateCanvas(){return Ea},get rotateCss(){return Ta},rotation:Gl});Ji.set("url",class extends Ba{async readWhole(){this.chunked=!1;let Qr=await xa(this.input);Qr instanceof ArrayBuffer?this._swapArrayBuffer(Qr):Qr instanceof Uint8Array&&this._swapBuffer(Qr)}async _readChunk(Qr,Gr){let Wr=Gr?Qr+Gr-1:void 0,Kr=this.options.httpHeaders||{};(Qr||Wr)&&(Kr.range=`bytes=${[Qr,Wr].join("-")}`);let Yr=await Fs(this.input,{headers:Kr}),Zr=await Yr.arrayBuffer(),tn=Zr.byteLength;if(Yr.status!==416)return tn!==Gr&&(this.size=Qr+tn),this.set(Zr,Qr,!0)}});Ki.prototype.getUint64=function(Qr){let Gr=this.getUint32(Qr),Wr=this.getUint32(Qr+4);return Gr<1048575?Gr<<32|Wr:typeof Mo!==void 0?(console.warn("Using BigInt because of type 64uint but JS can only handle 53b numbers."),Mo(Gr)<<Mo(32)|Mo(Wr)):void Ei("Trying to read 64b value but JS can only handle 53b numbers.")};var Ls=class extends Ua{parseBoxes(Gr=0){let Wr=[];for(;Gr<this.file.byteLength-4;){let Kr=this.parseBoxHead(Gr);if(Wr.push(Kr),Kr.length===0)break;Gr+=Kr.length}return Wr}parseSubBoxes(Gr){Gr.boxes=this.parseBoxes(Gr.start)}findBox(Gr,Wr){return Gr.boxes===void 0&&this.parseSubBoxes(Gr),Gr.boxes.find(Kr=>Kr.kind===Wr)}parseBoxHead(Gr){let Wr=this.file.getUint32(Gr),Kr=this.file.getString(Gr+4,4),Yr=Gr+8;return Wr===1&&(Wr=this.file.getUint64(Gr+8),Yr+=8),{offset:Gr,length:Wr,kind:Kr,start:Yr}}parseBoxFullHead(Gr){if(Gr.version!==void 0)return;let Wr=this.file.getUint32(Gr.start);Gr.version=Wr>>24,Gr.start+=4}},jo=class extends Ls{static canHandle(Gr,Wr){if(Wr!==0)return!1;let Kr=Gr.getUint16(2);if(Kr>50)return!1;let Yr=16,Zr=[];for(;Yr<Kr;)Zr.push(Gr.getString(Yr,4)),Yr+=4;return Zr.includes(this.type)}async parse(){let Gr=this.file.getUint32(0),Wr=this.parseBoxHead(Gr);for(;Wr.kind!=="meta";)Gr+=Wr.length,await this.file.ensureChunk(Gr,16),Wr=this.parseBoxHead(Gr);await this.file.ensureChunk(Wr.offset,Wr.length),this.parseBoxFullHead(Wr),this.parseSubBoxes(Wr),this.options.icc.enabled&&await this.findIcc(Wr),this.options.tiff.enabled&&await this.findExif(Wr)}async registerSegment(Gr,Wr,Kr){await this.file.ensureChunk(Wr,Kr);let Yr=this.file.subarray(Wr,Kr);this.createParser(Gr,Yr)}async findIcc(Gr){let Wr=this.findBox(Gr,"iprp");if(Wr===void 0)return;let Kr=this.findBox(Wr,"ipco");if(Kr===void 0)return;let Yr=this.findBox(Kr,"colr");Yr!==void 0&&await this.registerSegment("icc",Yr.offset+12,Yr.length)}async findExif(Gr){let Wr=this.findBox(Gr,"iinf");if(Wr===void 0)return;let Kr=this.findBox(Gr,"iloc");if(Kr===void 0)return;let Yr=this.findExifLocIdInIinf(Wr),Zr=this.findExtentInIloc(Kr,Yr);if(Zr===void 0)return;let[tn,ln]=Zr;await this.file.ensureChunk(tn,ln);let dn=4+this.file.getUint32(tn);tn+=dn,ln-=dn,await this.registerSegment("tiff",tn,ln)}findExifLocIdInIinf(Gr){this.parseBoxFullHead(Gr);let Wr,Kr,Yr,Zr,tn=Gr.start,ln=this.file.getUint16(tn);for(tn+=2;ln--;){if(Wr=this.parseBoxHead(tn),this.parseBoxFullHead(Wr),Kr=Wr.start,Wr.version>=2&&(Yr=Wr.version===3?4:2,Zr=this.file.getString(Kr+Yr+2,4),Zr==="Exif"))return this.file.getUintBytes(Kr,Yr);tn+=Wr.length}}get8bits(Gr){let Wr=this.file.getUint8(Gr);return[Wr>>4,15&Wr]}findExtentInIloc(Gr,Wr){this.parseBoxFullHead(Gr);let Kr=Gr.start,[Yr,Zr]=this.get8bits(Kr++),[tn,ln]=this.get8bits(Kr++),dn=Gr.version===2?4:2,yn=Gr.version===1||Gr.version===2?2:0,wn=ln+Yr+Zr,kn=Gr.version===2?4:2,An=this.file.getUintBytes(Kr,kn);for(Kr+=kn;An--;){let Gn=this.file.getUintBytes(Kr,dn);Kr+=dn+yn+2+tn;let jn=this.file.getUint16(Kr);if(Kr+=2,Gn===Wr)return jn>1&&console.warn(`ILOC box has more than one extent but we're only processing one 16 - Please create an issue at https://github.com/MikeKovarik/exifr with this file`),[this.file.getUintBytes(Kr+ln,Yr),this.file.getUintBytes(Kr+ln+Yr,Zr)];Kr+=jn*wn}}},zo=class extends jo{};Kn(zo,"type","heic");var Vo=class extends jo{};Kn(Vo,"type","avif"),Yi.set("heic",zo),Yi.set("avif",Vo),pi(Si,["ifd0","ifd1"],[[256,"ImageWidth"],[257,"ImageHeight"],[258,"BitsPerSample"],[259,"Compression"],[262,"PhotometricInterpretation"],[270,"ImageDescription"],[271,"Make"],[272,"Model"],[273,"StripOffsets"],[274,"Orientation"],[277,"SamplesPerPixel"],[278,"RowsPerStrip"],[279,"StripByteCounts"],[282,"XResolution"],[283,"YResolution"],[284,"PlanarConfiguration"],[296,"ResolutionUnit"],[301,"TransferFunction"],[305,"Software"],[306,"ModifyDate"],[315,"Artist"],[316,"HostComputer"],[317,"Predictor"],[318,"WhitePoint"],[319,"PrimaryChromaticities"],[513,"ThumbnailOffset"],[514,"ThumbnailLength"],[529,"YCbCrCoefficients"],[530,"YCbCrSubSampling"],[531,"YCbCrPositioning"],[532,"ReferenceBlackWhite"],[700,"ApplicationNotes"],[33432,"Copyright"],[33723,"IPTC"],[34665,"ExifIFD"],[34675,"ICC"],[34853,"GpsIFD"],[330,"SubIFD"],[40965,"InteropIFD"],[40091,"XPTitle"],[40092,"XPComment"],[40093,"XPAuthor"],[40094,"XPKeywords"],[40095,"XPSubject"]]),pi(Si,"exif",[[33434,"ExposureTime"],[33437,"FNumber"],[34850,"ExposureProgram"],[34852,"SpectralSensitivity"],[34855,"ISO"],[34858,"TimeZoneOffset"],[34859,"SelfTimerMode"],[34864,"SensitivityType"],[34865,"StandardOutputSensitivity"],[34866,"RecommendedExposureIndex"],[34867,"ISOSpeed"],[34868,"ISOSpeedLatitudeyyy"],[34869,"ISOSpeedLatitudezzz"],[36864,"ExifVersion"],[36867,"DateTimeOriginal"],[36868,"CreateDate"],[36873,"GooglePlusUploadCode"],[36880,"OffsetTime"],[36881,"OffsetTimeOriginal"],[36882,"OffsetTimeDigitized"],[37121,"ComponentsConfiguration"],[37122,"CompressedBitsPerPixel"],[37377,"ShutterSpeedValue"],[37378,"ApertureValue"],[37379,"BrightnessValue"],[37380,"ExposureCompensation"],[37381,"MaxApertureValue"],[37382,"SubjectDistance"],[37383,"MeteringMode"],[37384,"LightSource"],[37385,"Flash"],[37386,"FocalLength"],[37393,"ImageNumber"],[37394,"SecurityClassification"],[37395,"ImageHistory"],[37396,"SubjectArea"],[37500,"MakerNote"],[37510,"UserComment"],[37520,"SubSecTime"],[37521,"SubSecTimeOriginal"],[37522,"SubSecTimeDigitized"],[37888,"AmbientTemperature"],[37889,"Humidity"],[37890,"Pressure"],[37891,"WaterDepth"],[37892,"Acceleration"],[37893,"CameraElevationAngle"],[40960,"FlashpixVersion"],[40961,"ColorSpace"],[40962,"ExifImageWidth"],[40963,"ExifImageHeight"],[40964,"RelatedSoundFile"],[41483,"FlashEnergy"],[41486,"FocalPlaneXResolution"],[41487,"FocalPlaneYResolution"],[41488,"FocalPlaneResolutionUnit"],[41492,"SubjectLocation"],[41493,"ExposureIndex"],[41495,"SensingMethod"],[41728,"FileSource"],[41729,"SceneType"],[41730,"CFAPattern"],[41985,"CustomRendered"],[41986,"ExposureMode"],[41987,"WhiteBalance"],[41988,"DigitalZoomRatio"],[41989,"FocalLengthIn35mmFormat"],[41990,"SceneCaptureType"],[41991,"GainControl"],[41992,"Contrast"],[41993,"Saturation"],[41994,"Sharpness"],[41996,"SubjectDistanceRange"],[42016,"ImageUniqueID"],[42032,"OwnerName"],[42033,"SerialNumber"],[42034,"LensInfo"],[42035,"LensMake"],[42036,"LensModel"],[42037,"LensSerialNumber"],[42080,"CompositeImage"],[42081,"CompositeImageCount"],[42082,"CompositeImageExposureTimes"],[42240,"Gamma"],[59932,"Padding"],[59933,"OffsetSchema"],[65e3,"OwnerName"],[65001,"SerialNumber"],[65002,"Lens"],[65100,"RawFile"],[65101,"Converter"],[65102,"WhiteBalance"],[65105,"Exposure"],[65106,"Shadows"],[65107,"Brightness"],[65108,"Contrast"],[65109,"Saturation"],[65110,"Sharpness"],[65111,"Smoothness"],[65112,"MoireFilter"],[40965,"InteropIFD"]]),pi(Si,"gps",[[0,"GPSVersionID"],[1,"GPSLatitudeRef"],[2,"GPSLatitude"],[3,"GPSLongitudeRef"],[4,"GPSLongitude"],[5,"GPSAltitudeRef"],[6,"GPSAltitude"],[7,"GPSTimeStamp"],[8,"GPSSatellites"],[9,"GPSStatus"],[10,"GPSMeasureMode"],[11,"GPSDOP"],[12,"GPSSpeedRef"],[13,"GPSSpeed"],[14,"GPSTrackRef"],[15,"GPSTrack"],[16,"GPSImgDirectionRef"],[17,"GPSImgDirection"],[18,"GPSMapDatum"],[19,"GPSDestLatitudeRef"],[20,"GPSDestLatitude"],[21,"GPSDestLongitudeRef"],[22,"GPSDestLongitude"],[23,"GPSDestBearingRef"],[24,"GPSDestBearing"],[25,"GPSDestDistanceRef"],[26,"GPSDestDistance"],[27,"GPSProcessingMethod"],[28,"GPSAreaInformation"],[29,"GPSDateStamp"],[30,"GPSDifferential"],[31,"GPSHPositioningError"]]),pi(Wi,["ifd0","ifd1"],[[274,{1:"Horizontal (normal)",2:"Mirror horizontal",3:"Rotate 180",4:"Mirror vertical",5:"Mirror horizontal and rotate 270 CW",6:"Rotate 90 CW",7:"Mirror horizontal and rotate 90 CW",8:"Rotate 270 CW"}],[296,{1:"None",2:"inches",3:"cm"}]]);var io=pi(Wi,"exif",[[34850,{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"}],[37121,{0:"-",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}],[37383,{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"}],[37384,{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"}],[37385,{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"}],[41495,{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"}],[41728,{1:"Film Scanner",2:"Reflection Print Scanner",3:"Digital Camera"}],[41729,{1:"Directly photographed"}],[41985,{0:"Normal",1:"Custom",2:"HDR (no original saved)",3:"HDR (original saved)",4:"Original (for HDR)",6:"Panorama",7:"Portrait HDR",8:"Portrait"}],[41986,{0:"Auto",1:"Manual",2:"Auto bracket"}],[41987,{0:"Auto",1:"Manual"}],[41990,{0:"Standard",1:"Landscape",2:"Portrait",3:"Night",4:"Other"}],[41991,{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"}],[41996,{0:"Unknown",1:"Macro",2:"Close",3:"Distant"}],[42080,{0:"Unknown",1:"Not a Composite Image",2:"General Composite Image",3:"Composite Image Captured While Shooting"}]]),Al={1:"No absolute unit of measurement",2:"Inch",3:"Centimeter"};io.set(37392,Al),io.set(41488,Al);var Ss={0:"Normal",1:"Low",2:"High"};function Dl(Qr){return typeof Qr=="object"&&Qr.length!==void 0?Qr[0]:Qr}function Pl(Qr){let Gr=Array.from(Qr).slice(1);return Gr[1]>15&&(Gr=Gr.map(Wr=>String.fromCharCode(Wr))),Gr[2]!=="0"&&Gr[2]!==0||Gr.pop(),Gr.join(".")}function ws(Qr){if(typeof Qr=="string"){var[Gr,Wr,Kr,Yr,Zr,tn]=Qr.trim().split(/[-: ]/g).map(Number),ln=new Date(Gr,Wr-1,Kr);return Number.isNaN(Yr)||Number.isNaN(Zr)||Number.isNaN(tn)||(ln.setHours(Yr),ln.setMinutes(Zr),ln.setSeconds(tn)),Number.isNaN(+ln)?Qr:ln}}function ro(Qr){if(typeof Qr=="string")return Qr;let Gr=[];if(Qr[1]===0&&Qr[Qr.length-1]===0)for(let Wr=0;Wr<Qr.length;Wr+=2)Gr.push(Rl(Qr[Wr+1],Qr[Wr]));else for(let Wr=0;Wr<Qr.length;Wr+=2)Gr.push(Rl(Qr[Wr],Qr[Wr+1]));return ba(String.fromCodePoint(...Gr))}function Rl(Qr,Gr){return Qr<<8|Gr}io.set(41992,Ss),io.set(41993,Ss),io.set(41994,Ss),pi(da,["ifd0","ifd1"],[[50827,function(Qr){return typeof Qr!="string"?ql(Qr):Qr}],[306,ws],[40091,ro],[40092,ro],[40093,ro],[40094,ro],[40095,ro]]),pi(da,"exif",[[40960,Pl],[36864,Pl],[36867,ws],[36868,ws],[40962,Dl],[40963,Dl]]),pi(da,"gps",[[0,Qr=>Array.from(Qr).join(".")],[7,Qr=>Array.from(Qr).join(":")]]);var ao=class extends qi{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===225&&Gr.getUint32(Wr+4)===1752462448&&Gr.getString(Wr+4,20)==="http://ns.adobe.com/"}static headerLength(Gr,Wr){return Gr.getString(Wr+4,34)==="http://ns.adobe.com/xmp/extension/"?79:33}static findPosition(Gr,Wr){let Kr=super.findPosition(Gr,Wr);return Kr.multiSegment=Kr.extended=Kr.headerLength===79,Kr.multiSegment?(Kr.chunkCount=Gr.getUint8(Wr+72),Kr.chunkNumber=Gr.getUint8(Wr+76),Gr.getUint8(Wr+77)!==0&&Kr.chunkNumber++):(Kr.chunkCount=1/0,Kr.chunkNumber=-1),Kr}static handleMultiSegments(Gr){return Gr.map(Wr=>Wr.chunk.getString()).join("")}normalizeInput(Gr){return typeof Gr=="string"?Gr:Ki.from(Gr).getString()}parse(Gr=this.chunk){if(!this.localOptions.parse)return Gr;Gr=function(Zr){let tn={},ln={};for(let dn of Vl)tn[dn]=[],ln[dn]=0;return Zr.replace(Vu,(dn,yn,wn)=>{if(yn==="<"){let kn=++ln[wn];return tn[wn].push(kn),`${dn}#${kn}`}return`${dn}#${tn[wn].pop()}`})}(Gr);let Wr=Wo.findAll(Gr,"rdf","Description");Wr.length===0&&Wr.push(new Wo("rdf","Description",void 0,Gr));let Kr,Yr={};for(let Zr of Wr)for(let tn of Zr.properties)Kr=zu(tn.ns,Yr),_l(tn,Kr);return function(Zr){let tn;for(let ln in Zr)tn=Zr[ln]=Bo(Zr[ln]),tn===void 0&&delete Zr[ln];return Bo(Zr)}(Yr)}assignToOutput(Gr,Wr){if(this.localOptions.parse)for(let[Kr,Yr]of Object.entries(Wr))switch(Kr){case"tiff":this.assignObjectToOutput(Gr,"ifd0",Yr);break;case"exif":this.assignObjectToOutput(Gr,"exif",Yr);break;case"xmlns":break;default:this.assignObjectToOutput(Gr,Kr,Yr)}else Gr.xmp=Wr}};Kn(ao,"type","xmp"),Kn(ao,"multiSegment",!0),bi.set("xmp",ao);var Ms=class Qr{static findAll(Gr){return jl(Gr,/([a-zA-Z0-9-]+):([a-zA-Z0-9-]+)=("[^"]*"|'[^']*')/gm).map(Qr.unpackMatch)}static unpackMatch(Gr){let Wr=Gr[1],Kr=Gr[2],Yr=Gr[3].slice(1,-1);return Yr=zl(Yr),new Qr(Wr,Kr,Yr)}constructor(Gr,Wr,Kr){this.ns=Gr,this.name=Wr,this.value=Kr}serialize(){return this.value}},Wo=class Qr{static findAll(Gr,Wr,Kr){if(Wr!==void 0||Kr!==void 0){Wr=Wr||"[\\w\\d-]+",Kr=Kr||"[\\w\\d-]+";var Yr=new RegExp(`<(${Wr}):(${Kr})(#\\d+)?((\\s+?[\\w\\d-:]+=("[^"]*"|'[^']*'))*\\s*)(\\/>|>([\\s\\S]*?)<\\/\\1:\\2\\3>)`,"gm")}else Yr=/<([\w\d-]+):([\w\d-]+)(#\d+)?((\s+?[\w\d-:]+=("[^"]*"|'[^']*'))*\s*)(\/>|>([\s\S]*?)<\/\1:\2\3>)/gm;return jl(Gr,Yr).map(Qr.unpackMatch)}static unpackMatch(Gr){let Wr=Gr[1],Kr=Gr[2],Yr=Gr[4],Zr=Gr[8];return new Qr(Wr,Kr,Yr,Zr)}constructor(Gr,Wr,Kr,Yr){this.ns=Gr,this.name=Wr,this.attrString=Kr,this.innerXml=Yr,this.attrs=Ms.findAll(Kr),this.children=Qr.findAll(Yr),this.value=this.children.length===0?zl(Yr):void 0,this.properties=[...this.attrs,...this.children]}get isPrimitive(){return this.value!==void 0&&this.attrs.length===0&&this.children.length===0}get isListContainer(){return this.children.length===1&&this.children[0].isList}get isList(){let{ns:Gr,name:Wr}=this;return Gr==="rdf"&&(Wr==="Seq"||Wr==="Bag"||Wr==="Alt")}get isListItem(){return this.ns==="rdf"&&this.name==="li"}serialize(){if(this.properties.length===0&&this.value===void 0)return;if(this.isPrimitive)return this.value;if(this.isListContainer)return this.children[0].serialize();if(this.isList)return ju(this.children.map(_u));if(this.isListItem&&this.children.length===1&&this.attrs.length===0)return this.children[0].serialize();let Gr={};for(let Wr of this.properties)_l(Wr,Gr);return this.value!==void 0&&(Gr.value=this.value),Bo(Gr)}};function _l(Qr,Gr){let Wr=Qr.serialize();Wr!==void 0&&(Gr[Qr.name]=Wr)}var _u=Qr=>Qr.serialize(),ju=Qr=>Qr.length===1?Qr[0]:Qr,zu=(Qr,Gr)=>Gr[Qr]?Gr[Qr]:Gr[Qr]={};function jl(Qr,Gr){let Wr,Kr=[];if(!Qr)return Kr;for(;(Wr=Gr.exec(Qr))!==null;)Kr.push(Wr);return Kr}function zl(Qr){if(function(Kr){return Kr==null||Kr==="null"||Kr==="undefined"||Kr===""||Kr.trim()===""}(Qr))return;let Gr=Number(Qr);if(!Number.isNaN(Gr))return Gr;let Wr=Qr.toLowerCase();return Wr==="true"||Wr!=="false"&&Qr.trim()}var Vl=["rdf:li","rdf:Seq","rdf:Bag","rdf:Alt","rdf:Description"],Vu=new RegExp(`(<|\\/)(${Vl.join("|")})`,"g"),Wu=Object.freeze({__proto__:null,default:Gu,Exifr:$i,fileParsers:Yi,segmentParsers:bi,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:pi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:di,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia,parse:Zo,gpsOnlyOptions:Us,gps:Ul,thumbnailOnlyOptions:Bs,thumbnail:Bl,thumbnailUrl:Hl,orientationOnlyOptions:Hs,orientation:Gs,rotations:_s,get rotateCanvas(){return Ea},get rotateCss(){return Ta},rotation:Gl});var Nl=Uo("fs",Qr=>Qr.promises);Ji.set("fs",class extends Ba{async readWhole(){this.chunked=!1,this.fs=await Nl;let Qr=await this.fs.readFile(this.input);this._swapBuffer(Qr)}async readChunked(){this.chunked=!0,this.fs=await Nl,await this.open(),await this.readChunk(0,this.options.firstChunkSize)}async open(){this.fh===void 0&&(this.fh=await this.fs.open(this.input,"r"),this.size=(await this.fh.stat(this.input)).size)}async _readChunk(Qr,Gr){this.fh===void 0&&await this.open(),Qr+Gr>this.size&&(Gr=this.size-Qr);var Wr=this.subarray(Qr,Gr,!0);return await this.fh.read(Wr.dataView,0,Gr,Qr),Wr}async close(){if(this.fh){let Qr=this.fh;this.fh=void 0,await Qr.close()}}});Ji.set("base64",class extends Ba{constructor(...Qr){super(...Qr),this.input=this.input.replace(/^data:([^;]+);base64,/gim,""),this.size=this.input.length/4*3,this.input.endsWith("==")?this.size-=2:this.input.endsWith("=")&&(this.size-=1)}async _readChunk(Qr,Gr){let Wr,Kr,Yr=this.input;Qr===void 0?(Qr=0,Wr=0,Kr=0):(Wr=4*Math.floor(Qr/3),Kr=Qr-Wr/4*3),Gr===void 0&&(Gr=this.size);let Zr=Qr+Gr,tn=Wr+4*Math.ceil(Zr/3);Yr=Yr.slice(Wr,tn);let ln=Math.min(Gr,this.size-Qr);if(Jo){let dn=$o.from(Yr,"base64").slice(Kr,Kr+ln);return this.set(dn,Qr,!0)}{let dn=this.subarray(Qr,ln,!0),yn=atob(Yr),wn=dn.toUint8();for(let kn=0;kn<ln;kn++)wn[kn]=yn.charCodeAt(Kr+kn);return dn}}});var Xo=class extends Ua{static canHandle(Gr,Wr){return Wr===18761||Wr===19789}extendOptions(Gr){let{ifd0:Wr,xmp:Kr,iptc:Yr,icc:Zr}=Gr;Kr.enabled&&Wr.deps.add(700),Yr.enabled&&Wr.deps.add(33723),Zr.enabled&&Wr.deps.add(34675),Wr.finalizeFilters()}async parse(){let{tiff:Gr,xmp:Wr,iptc:Kr,icc:Yr}=this.options;if(Gr.enabled||Wr.enabled||Kr.enabled||Yr.enabled){let Zr=Math.max(ks(this.options),this.options.chunkSize);await this.file.ensureChunk(0,Zr),this.createParser("tiff",this.file),this.parsers.tiff.parseHeader(),await this.parsers.tiff.parseIfd0Block(),this.adaptTiffPropAsSegment("xmp"),this.adaptTiffPropAsSegment("iptc"),this.adaptTiffPropAsSegment("icc")}}adaptTiffPropAsSegment(Gr){if(this.parsers.tiff[Gr]){let Wr=this.parsers.tiff[Gr];this.injectSegment(Gr,Wr)}}};Kn(Xo,"type","tiff"),Yi.set("tiff",Xo);var Xu=Uo("zlib"),Qu=["ihdr","iccp","text","itxt","exif"],Qo=class extends Ua{constructor(...Gr){super(...Gr),Kn(this,"catchError",Wr=>this.errors.push(Wr)),Kn(this,"metaChunks",[]),Kn(this,"unknownChunks",[])}static canHandle(Gr,Wr){return Wr===35152&&Gr.getUint32(0)===2303741511&&Gr.getUint32(4)===218765834}async parse(){let{file:Gr}=this;await this.findPngChunksInRange(8,Gr.byteLength),await this.readSegments(this.metaChunks),this.findIhdr(),this.parseTextChunks(),await this.findExif().catch(this.catchError),await this.findXmp().catch(this.catchError),await this.findIcc().catch(this.catchError)}async findPngChunksInRange(Gr,Wr){let{file:Kr}=this;for(;Gr<Wr;){let Yr=Kr.getUint32(Gr),Zr=Kr.getUint32(Gr+4),tn=Kr.getString(Gr+4,4).toLowerCase(),ln=Yr+4+4+4,dn={type:tn,offset:Gr,length:ln,start:Gr+4+4,size:Yr,marker:Zr};Qu.includes(tn)?this.metaChunks.push(dn):this.unknownChunks.push(dn),Gr+=ln}}parseTextChunks(){let Gr=this.metaChunks.filter(Wr=>Wr.type==="text");for(let Wr of Gr){let[Kr,Yr]=this.file.getString(Wr.start,Wr.size).split("\0");this.injectKeyValToIhdr(Kr,Yr)}}injectKeyValToIhdr(Gr,Wr){let Kr=this.parsers.ihdr;Kr&&Kr.raw.set(Gr,Wr)}findIhdr(){let Gr=this.metaChunks.find(Wr=>Wr.type==="ihdr");Gr&&this.options.ihdr.enabled!==!1&&this.createParser("ihdr",Gr.chunk)}async findExif(){let Gr=this.metaChunks.find(Wr=>Wr.type==="exif");Gr&&this.injectSegment("tiff",Gr.chunk)}async findXmp(){let Gr=this.metaChunks.filter(Wr=>Wr.type==="itxt");for(let Wr of Gr)Wr.chunk.getString(0,17)==="XML:com.adobe.xmp"&&this.injectSegment("xmp",Wr.chunk)}async findIcc(){let Gr=this.metaChunks.find(ln=>ln.type==="iccp");if(!Gr)return;let{chunk:Wr}=Gr,Kr=Wr.getUint8Array(0,81),Yr=0;for(;Yr<80&&Kr[Yr]!==0;)Yr++;let Zr=Yr+2,tn=Wr.getString(0,Yr);if(this.injectKeyValToIhdr("ProfileName",tn),qo){let ln=await Xu,dn=Wr.getUint8Array(Zr);dn=ln.inflateSync(dn),this.injectSegment("icc",dn)}}};Kn(Qo,"type","png"),Yi.set("png",Qo),pi(Si,"interop",[[1,"InteropIndex"],[2,"InteropVersion"],[4096,"RelatedImageFileFormat"],[4097,"RelatedImageWidth"],[4098,"RelatedImageHeight"]]),wa(Si,"ifd0",[[11,"ProcessingSoftware"],[254,"SubfileType"],[255,"OldSubfileType"],[263,"Thresholding"],[264,"CellWidth"],[265,"CellLength"],[266,"FillOrder"],[269,"DocumentName"],[280,"MinSampleValue"],[281,"MaxSampleValue"],[285,"PageName"],[286,"XPosition"],[287,"YPosition"],[290,"GrayResponseUnit"],[297,"PageNumber"],[321,"HalftoneHints"],[322,"TileWidth"],[323,"TileLength"],[332,"InkSet"],[337,"TargetPrinter"],[18246,"Rating"],[18249,"RatingPercent"],[33550,"PixelScale"],[34264,"ModelTransform"],[34377,"PhotoshopSettings"],[50706,"DNGVersion"],[50707,"DNGBackwardVersion"],[50708,"UniqueCameraModel"],[50709,"LocalizedCameraModel"],[50736,"DNGLensInfo"],[50739,"ShadowScale"],[50740,"DNGPrivateData"],[33920,"IntergraphMatrix"],[33922,"ModelTiePoint"],[34118,"SEMInfo"],[34735,"GeoTiffDirectory"],[34736,"GeoTiffDoubleParams"],[34737,"GeoTiffAsciiParams"],[50341,"PrintIM"],[50721,"ColorMatrix1"],[50722,"ColorMatrix2"],[50723,"CameraCalibration1"],[50724,"CameraCalibration2"],[50725,"ReductionMatrix1"],[50726,"ReductionMatrix2"],[50727,"AnalogBalance"],[50728,"AsShotNeutral"],[50729,"AsShotWhiteXY"],[50730,"BaselineExposure"],[50731,"BaselineNoise"],[50732,"BaselineSharpness"],[50734,"LinearResponseLimit"],[50735,"CameraSerialNumber"],[50741,"MakerNoteSafety"],[50778,"CalibrationIlluminant1"],[50779,"CalibrationIlluminant2"],[50781,"RawDataUniqueID"],[50827,"OriginalRawFileName"],[50828,"OriginalRawFileData"],[50831,"AsShotICCProfile"],[50832,"AsShotPreProfileMatrix"],[50833,"CurrentICCProfile"],[50834,"CurrentPreProfileMatrix"],[50879,"ColorimetricReference"],[50885,"SRawType"],[50898,"PanasonicTitle"],[50899,"PanasonicTitle2"],[50931,"CameraCalibrationSig"],[50932,"ProfileCalibrationSig"],[50933,"ProfileIFD"],[50934,"AsShotProfileName"],[50936,"ProfileName"],[50937,"ProfileHueSatMapDims"],[50938,"ProfileHueSatMapData1"],[50939,"ProfileHueSatMapData2"],[50940,"ProfileToneCurve"],[50941,"ProfileEmbedPolicy"],[50942,"ProfileCopyright"],[50964,"ForwardMatrix1"],[50965,"ForwardMatrix2"],[50966,"PreviewApplicationName"],[50967,"PreviewApplicationVersion"],[50968,"PreviewSettingsName"],[50969,"PreviewSettingsDigest"],[50970,"PreviewColorSpace"],[50971,"PreviewDateTime"],[50972,"RawImageDigest"],[50973,"OriginalRawFileDigest"],[50981,"ProfileLookTableDims"],[50982,"ProfileLookTableData"],[51043,"TimeCodes"],[51044,"FrameRate"],[51058,"TStop"],[51081,"ReelName"],[51089,"OriginalDefaultFinalSize"],[51090,"OriginalBestQualitySize"],[51091,"OriginalDefaultCropSize"],[51105,"CameraLabel"],[51107,"ProfileHueSatMapEncoding"],[51108,"ProfileLookTableEncoding"],[51109,"BaselineExposureOffset"],[51110,"DefaultBlackRender"],[51111,"NewRawImageDigest"],[51112,"RawToPreviewGain"]]);var Ll=[[273,"StripOffsets"],[279,"StripByteCounts"],[288,"FreeOffsets"],[289,"FreeByteCounts"],[291,"GrayResponseCurve"],[292,"T4Options"],[293,"T6Options"],[300,"ColorResponseUnit"],[320,"ColorMap"],[324,"TileOffsets"],[325,"TileByteCounts"],[326,"BadFaxLines"],[327,"CleanFaxData"],[328,"ConsecutiveBadFaxLines"],[330,"SubIFD"],[333,"InkNames"],[334,"NumberofInks"],[336,"DotRange"],[338,"ExtraSamples"],[339,"SampleFormat"],[340,"SMinSampleValue"],[341,"SMaxSampleValue"],[342,"TransferRange"],[343,"ClipPath"],[344,"XClipPathUnits"],[345,"YClipPathUnits"],[346,"Indexed"],[347,"JPEGTables"],[351,"OPIProxy"],[400,"GlobalParametersIFD"],[401,"ProfileType"],[402,"FaxProfile"],[403,"CodingMethods"],[404,"VersionYear"],[405,"ModeNumber"],[433,"Decode"],[434,"DefaultImageColor"],[435,"T82Options"],[437,"JPEGTables"],[512,"JPEGProc"],[515,"JPEGRestartInterval"],[517,"JPEGLosslessPredictors"],[518,"JPEGPointTransforms"],[519,"JPEGQTables"],[520,"JPEGDCTables"],[521,"JPEGACTables"],[559,"StripRowCounts"],[999,"USPTOMiscellaneous"],[18247,"XP_DIP_XML"],[18248,"StitchInfo"],[28672,"SonyRawFileType"],[28688,"SonyToneCurve"],[28721,"VignettingCorrection"],[28722,"VignettingCorrParams"],[28724,"ChromaticAberrationCorrection"],[28725,"ChromaticAberrationCorrParams"],[28726,"DistortionCorrection"],[28727,"DistortionCorrParams"],[29895,"SonyCropTopLeft"],[29896,"SonyCropSize"],[32781,"ImageID"],[32931,"WangTag1"],[32932,"WangAnnotation"],[32933,"WangTag3"],[32934,"WangTag4"],[32953,"ImageReferencePoints"],[32954,"RegionXformTackPoint"],[32955,"WarpQuadrilateral"],[32956,"AffineTransformMat"],[32995,"Matteing"],[32996,"DataType"],[32997,"ImageDepth"],[32998,"TileDepth"],[33300,"ImageFullWidth"],[33301,"ImageFullHeight"],[33302,"TextureFormat"],[33303,"WrapModes"],[33304,"FovCot"],[33305,"MatrixWorldToScreen"],[33306,"MatrixWorldToCamera"],[33405,"Model2"],[33421,"CFARepeatPatternDim"],[33422,"CFAPattern2"],[33423,"BatteryLevel"],[33424,"KodakIFD"],[33445,"MDFileTag"],[33446,"MDScalePixel"],[33447,"MDColorTable"],[33448,"MDLabName"],[33449,"MDSampleInfo"],[33450,"MDPrepDate"],[33451,"MDPrepTime"],[33452,"MDFileUnits"],[33589,"AdventScale"],[33590,"AdventRevision"],[33628,"UIC1Tag"],[33629,"UIC2Tag"],[33630,"UIC3Tag"],[33631,"UIC4Tag"],[33918,"IntergraphPacketData"],[33919,"IntergraphFlagRegisters"],[33921,"INGRReserved"],[34016,"Site"],[34017,"ColorSequence"],[34018,"IT8Header"],[34019,"RasterPadding"],[34020,"BitsPerRunLength"],[34021,"BitsPerExtendedRunLength"],[34022,"ColorTable"],[34023,"ImageColorIndicator"],[34024,"BackgroundColorIndicator"],[34025,"ImageColorValue"],[34026,"BackgroundColorValue"],[34027,"PixelIntensityRange"],[34028,"TransparencyIndicator"],[34029,"ColorCharacterization"],[34030,"HCUsage"],[34031,"TrapIndicator"],[34032,"CMYKEquivalent"],[34152,"AFCP_IPTC"],[34232,"PixelMagicJBIGOptions"],[34263,"JPLCartoIFD"],[34306,"WB_GRGBLevels"],[34310,"LeafData"],[34687,"TIFF_FXExtensions"],[34688,"MultiProfiles"],[34689,"SharedData"],[34690,"T88Options"],[34732,"ImageLayer"],[34750,"JBIGOptions"],[34856,"Opto-ElectricConvFactor"],[34857,"Interlace"],[34908,"FaxRecvParams"],[34909,"FaxSubAddress"],[34910,"FaxRecvTime"],[34929,"FedexEDR"],[34954,"LeafSubIFD"],[37387,"FlashEnergy"],[37388,"SpatialFrequencyResponse"],[37389,"Noise"],[37390,"FocalPlaneXResolution"],[37391,"FocalPlaneYResolution"],[37392,"FocalPlaneResolutionUnit"],[37397,"ExposureIndex"],[37398,"TIFF-EPStandardID"],[37399,"SensingMethod"],[37434,"CIP3DataFile"],[37435,"CIP3Sheet"],[37436,"CIP3Side"],[37439,"StoNits"],[37679,"MSDocumentText"],[37680,"MSPropertySetStorage"],[37681,"MSDocumentTextPosition"],[37724,"ImageSourceData"],[40965,"InteropIFD"],[40976,"SamsungRawPointersOffset"],[40977,"SamsungRawPointersLength"],[41217,"SamsungRawByteOrder"],[41218,"SamsungRawUnknown"],[41484,"SpatialFrequencyResponse"],[41485,"Noise"],[41489,"ImageNumber"],[41490,"SecurityClassification"],[41491,"ImageHistory"],[41494,"TIFF-EPStandardID"],[41995,"DeviceSettingDescription"],[42112,"GDALMetadata"],[42113,"GDALNoData"],[44992,"ExpandSoftware"],[44993,"ExpandLens"],[44994,"ExpandFilm"],[44995,"ExpandFilterLens"],[44996,"ExpandScanner"],[44997,"ExpandFlashLamp"],[46275,"HasselbladRawImage"],[48129,"PixelFormat"],[48130,"Transformation"],[48131,"Uncompressed"],[48132,"ImageType"],[48256,"ImageWidth"],[48257,"ImageHeight"],[48258,"WidthResolution"],[48259,"HeightResolution"],[48320,"ImageOffset"],[48321,"ImageByteCount"],[48322,"AlphaOffset"],[48323,"AlphaByteCount"],[48324,"ImageDataDiscard"],[48325,"AlphaDataDiscard"],[50215,"OceScanjobDesc"],[50216,"OceApplicationSelector"],[50217,"OceIDNumber"],[50218,"OceImageLogic"],[50255,"Annotations"],[50459,"HasselbladExif"],[50547,"OriginalFileName"],[50560,"USPTOOriginalContentType"],[50656,"CR2CFAPattern"],[50710,"CFAPlaneColor"],[50711,"CFALayout"],[50712,"LinearizationTable"],[50713,"BlackLevelRepeatDim"],[50714,"BlackLevel"],[50715,"BlackLevelDeltaH"],[50716,"BlackLevelDeltaV"],[50717,"WhiteLevel"],[50718,"DefaultScale"],[50719,"DefaultCropOrigin"],[50720,"DefaultCropSize"],[50733,"BayerGreenSplit"],[50737,"ChromaBlurRadius"],[50738,"AntiAliasStrength"],[50752,"RawImageSegmentation"],[50780,"BestQualityScale"],[50784,"AliasLayerMetadata"],[50829,"ActiveArea"],[50830,"MaskedAreas"],[50935,"NoiseReductionApplied"],[50974,"SubTileBlockSize"],[50975,"RowInterleaveFactor"],[51008,"OpcodeList1"],[51009,"OpcodeList2"],[51022,"OpcodeList3"],[51041,"NoiseProfile"],[51114,"CacheVersion"],[51125,"DefaultUserCrop"],[51157,"NikonNEFInfo"],[65024,"KdcIFD"]];wa(Si,"ifd0",Ll),wa(Si,"exif",Ll),pi(Wi,"gps",[[23,{M:"Magnetic North",T:"True North"}],[25,{K:"Kilometers",M:"Miles",N:"Nautical Miles"}]]);var oo=class extends qi{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===224&&Gr.getUint32(Wr+4)===1246120262&&Gr.getUint8(Wr+8)===0}parse(){return this.parseTags(),this.translate(),this.output}parseTags(){this.raw=new Map([[0,this.chunk.getUint16(0)],[2,this.chunk.getUint8(2)],[3,this.chunk.getUint16(3)],[5,this.chunk.getUint16(5)],[7,this.chunk.getUint8(7)],[8,this.chunk.getUint8(8)]])}};Kn(oo,"type","jfif"),Kn(oo,"headerLength",9),bi.set("jfif",oo),pi(Si,"jfif",[[0,"JFIFVersion"],[2,"ResolutionUnit"],[3,"XResolution"],[5,"YResolution"],[7,"ThumbnailWidth"],[8,"ThumbnailHeight"]]);var Ko=class extends qi{parse(){return this.parseTags(),this.translate(),this.output}parseTags(){this.raw=new Map([[0,this.chunk.getUint32(0)],[4,this.chunk.getUint32(4)],[8,this.chunk.getUint8(8)],[9,this.chunk.getUint8(9)],[10,this.chunk.getUint8(10)],[11,this.chunk.getUint8(11)],[12,this.chunk.getUint8(12)],...Array.from(this.raw)])}};Kn(Ko,"type","ihdr"),bi.set("ihdr",Ko),pi(Si,"ihdr",[[0,"ImageWidth"],[4,"ImageHeight"],[8,"BitDepth"],[9,"ColorType"],[10,"Compression"],[11,"Filter"],[12,"Interlace"]]),pi(Wi,"ihdr",[[9,{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha",DEFAULT:"Unknown"}],[10,{0:"Deflate/Inflate",DEFAULT:"Unknown"}],[11,{0:"Adaptive",DEFAULT:"Unknown"}],[12,{0:"Noninterlaced",1:"Adam7 Interlace",DEFAULT:"Unknown"}]]);var qa=class extends qi{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===226&&Gr.getUint32(Wr+4)===1229144927}static findPosition(Gr,Wr){let Kr=super.findPosition(Gr,Wr);return Kr.chunkNumber=Gr.getUint8(Wr+16),Kr.chunkCount=Gr.getUint8(Wr+17),Kr.multiSegment=Kr.chunkCount>1,Kr}static handleMultiSegments(Gr){return function(Wr){let Kr=function(Yr){let Zr=Yr[0].constructor,tn=0;for(let yn of Yr)tn+=yn.length;let ln=new Zr(tn),dn=0;for(let yn of Yr)ln.set(yn,dn),dn+=yn.length;return ln}(Wr.map(Yr=>Yr.chunk.toUint8()));return new Ki(Kr)}(Gr)}parse(){return this.raw=new Map,this.parseHeader(),this.parseTags(),this.translate(),this.output}parseHeader(){let{raw:Gr}=this;this.chunk.byteLength<84&&Ei("ICC header is too short");for(let[Wr,Kr]of Object.entries(Ku)){Wr=parseInt(Wr,10);let Yr=Kr(this.chunk,Wr);Yr!=="\0\0\0\0"&&Gr.set(Wr,Yr)}}parseTags(){let Gr,Wr,Kr,Yr,Zr,{raw:tn}=this,ln=this.chunk.getUint32(128),dn=132,yn=this.chunk.byteLength;for(;ln--;){if(Gr=this.chunk.getString(dn,4),Wr=this.chunk.getUint32(dn+4),Kr=this.chunk.getUint32(dn+8),Yr=this.chunk.getString(Wr,4),Wr+Kr>yn)return void console.warn("reached the end of the first ICC chunk. Enable options.tiff.multiSegment to read all ICC segments.");Zr=this.parseTag(Yr,Wr,Kr),Zr!==void 0&&Zr!=="\0\0\0\0"&&tn.set(Gr,Zr),dn+=12}}parseTag(Gr,Wr,Kr){switch(Gr){case"desc":return this.parseDesc(Wr);case"mluc":return this.parseMluc(Wr);case"text":return this.parseText(Wr,Kr);case"sig ":return this.parseSig(Wr)}if(!(Wr+Kr>this.chunk.byteLength))return this.chunk.getUint8Array(Wr,Kr)}parseDesc(Gr){let Wr=this.chunk.getUint32(Gr+8)-1;return ba(this.chunk.getString(Gr+12,Wr))}parseText(Gr,Wr){return ba(this.chunk.getString(Gr+8,Wr-8))}parseSig(Gr){return ba(this.chunk.getString(Gr+8,4))}parseMluc(Gr){let{chunk:Wr}=this,Kr=Wr.getUint32(Gr+8),Yr=Wr.getUint32(Gr+12),Zr=Gr+16,tn=[];for(let ln=0;ln<Kr;ln++){let dn=Wr.getString(Zr+0,2),yn=Wr.getString(Zr+2,2),wn=Wr.getUint32(Zr+4),kn=Wr.getUint32(Zr+8)+Gr,An=ba(Wr.getUnicodeString(kn,wn));tn.push({lang:dn,country:yn,text:An}),Zr+=Yr}return Kr===1?tn[0].text:tn}translateValue(Gr,Wr){return typeof Gr=="string"?Wr[Gr]||Wr[Gr.toLowerCase()]||Gr:Wr[Gr]||Gr}};Kn(qa,"type","icc"),Kn(qa,"multiSegment",!0),Kn(qa,"headerLength",18);var Ku={4:na,8:function(Qr,Gr){return[Qr.getUint8(Gr),Qr.getUint8(Gr+1)>>4,Qr.getUint8(Gr+1)%16].map(Wr=>Wr.toString(10)).join(".")},12:na,16:na,20:na,24:function(Qr,Gr){let Wr=Qr.getUint16(Gr),Kr=Qr.getUint16(Gr+2)-1,Yr=Qr.getUint16(Gr+4),Zr=Qr.getUint16(Gr+6),tn=Qr.getUint16(Gr+8),ln=Qr.getUint16(Gr+10);return new Date(Date.UTC(Wr,Kr,Yr,Zr,tn,ln))},36:na,40:na,48:na,52:na,64:(Qr,Gr)=>Qr.getUint32(Gr),80:na};function na(Qr,Gr){return ba(Qr.getString(Gr,4))}bi.set("icc",qa),pi(Si,"icc",[[4,"ProfileCMMType"],[8,"ProfileVersion"],[12,"ProfileClass"],[16,"ColorSpaceData"],[20,"ProfileConnectionSpace"],[24,"ProfileDateTime"],[36,"ProfileFileSignature"],[40,"PrimaryPlatform"],[44,"CMMFlags"],[48,"DeviceManufacturer"],[52,"DeviceModel"],[56,"DeviceAttributes"],[64,"RenderingIntent"],[68,"ConnectionSpaceIlluminant"],[80,"ProfileCreator"],[84,"ProfileID"],["Header","ProfileHeader"],["MS00","WCSProfiles"],["bTRC","BlueTRC"],["bXYZ","BlueMatrixColumn"],["bfd","UCRBG"],["bkpt","MediaBlackPoint"],["calt","CalibrationDateTime"],["chad","ChromaticAdaptation"],["chrm","Chromaticity"],["ciis","ColorimetricIntentImageState"],["clot","ColorantTableOut"],["clro","ColorantOrder"],["clrt","ColorantTable"],["cprt","ProfileCopyright"],["crdi","CRDInfo"],["desc","ProfileDescription"],["devs","DeviceSettings"],["dmdd","DeviceModelDesc"],["dmnd","DeviceMfgDesc"],["dscm","ProfileDescriptionML"],["fpce","FocalPlaneColorimetryEstimates"],["gTRC","GreenTRC"],["gXYZ","GreenMatrixColumn"],["gamt","Gamut"],["kTRC","GrayTRC"],["lumi","Luminance"],["meas","Measurement"],["meta","Metadata"],["mmod","MakeAndModel"],["ncl2","NamedColor2"],["ncol","NamedColor"],["ndin","NativeDisplayInfo"],["pre0","Preview0"],["pre1","Preview1"],["pre2","Preview2"],["ps2i","PS2RenderingIntent"],["ps2s","PostScript2CSA"],["psd0","PostScript2CRD0"],["psd1","PostScript2CRD1"],["psd2","PostScript2CRD2"],["psd3","PostScript2CRD3"],["pseq","ProfileSequenceDesc"],["psid","ProfileSequenceIdentifier"],["psvm","PS2CRDVMSize"],["rTRC","RedTRC"],["rXYZ","RedMatrixColumn"],["resp","OutputResponse"],["rhoc","ReflectionHardcopyOrigColorimetry"],["rig0","PerceptualRenderingIntentGamut"],["rig2","SaturationRenderingIntentGamut"],["rpoc","ReflectionPrintOutputColorimetry"],["sape","SceneAppearanceEstimates"],["scoe","SceneColorimetryEstimates"],["scrd","ScreeningDesc"],["scrn","Screening"],["targ","CharTarget"],["tech","Technology"],["vcgt","VideoCardGamma"],["view","ViewingConditions"],["vued","ViewingCondDesc"],["wtpt","MediaWhitePoint"]]);var Fo={"4d2p":"Erdt Systems",AAMA:"Aamazing Technologies",ACER:"Acer",ACLT:"Acolyte Color Research",ACTI:"Actix Sytems",ADAR:"Adara Technology",ADBE:"Adobe",ADI:"ADI Systems",AGFA:"Agfa Graphics",ALMD:"Alps Electric",ALPS:"Alps Electric",ALWN:"Alwan Color Expertise",AMTI:"Amiable Technologies",AOC:"AOC International",APAG:"Apago",APPL:"Apple Computer",AST:"AST","AT&T":"AT&T",BAEL:"BARBIERI electronic",BRCO:"Barco NV",BRKP:"Breakpoint",BROT:"Brother",BULL:"Bull",BUS:"Bus Computer Systems","C-IT":"C-Itoh",CAMR:"Intel",CANO:"Canon",CARR:"Carroll Touch",CASI:"Casio",CBUS:"Colorbus PL",CEL:"Crossfield",CELx:"Crossfield",CGS:"CGS Publishing Technologies International",CHM:"Rochester Robotics",CIGL:"Colour Imaging Group, London",CITI:"Citizen",CL00:"Candela",CLIQ:"Color IQ",CMCO:"Chromaco",CMiX:"CHROMiX",COLO:"Colorgraphic Communications",COMP:"Compaq",COMp:"Compeq/Focus Technology",CONR:"Conrac Display Products",CORD:"Cordata Technologies",CPQ:"Compaq",CPRO:"ColorPro",CRN:"Cornerstone",CTX:"CTX International",CVIS:"ColorVision",CWC:"Fujitsu Laboratories",DARI:"Darius Technology",DATA:"Dataproducts",DCP:"Dry Creek Photo",DCRC:"Digital Contents Resource Center, Chung-Ang University",DELL:"Dell Computer",DIC:"Dainippon Ink and Chemicals",DICO:"Diconix",DIGI:"Digital","DL&C":"Digital Light & Color",DPLG:"Doppelganger",DS:"Dainippon Screen",DSOL:"DOOSOL",DUPN:"DuPont",EPSO:"Epson",ESKO:"Esko-Graphics",ETRI:"Electronics and Telecommunications Research Institute",EVER:"Everex Systems",EXAC:"ExactCODE",Eizo:"Eizo",FALC:"Falco Data Products",FF:"Fuji Photo Film",FFEI:"FujiFilm Electronic Imaging",FNRD:"Fnord Software",FORA:"Fora",FORE:"Forefront Technology",FP:"Fujitsu",FPA:"WayTech Development",FUJI:"Fujitsu",FX:"Fuji Xerox",GCC:"GCC Technologies",GGSL:"Global Graphics Software",GMB:"Gretagmacbeth",GMG:"GMG",GOLD:"GoldStar Technology",GOOG:"Google",GPRT:"Giantprint",GTMB:"Gretagmacbeth",GVC:"WayTech Development",GW2K:"Sony",HCI:"HCI",HDM:"Heidelberger Druckmaschinen",HERM:"Hermes",HITA:"Hitachi America",HP:"Hewlett-Packard",HTC:"Hitachi",HiTi:"HiTi Digital",IBM:"IBM",IDNT:"Scitex",IEC:"Hewlett-Packard",IIYA:"Iiyama North America",IKEG:"Ikegami Electronics",IMAG:"Image Systems",IMI:"Ingram Micro",INTC:"Intel",INTL:"N/A (INTL)",INTR:"Intra Electronics",IOCO:"Iocomm International Technology",IPS:"InfoPrint Solutions Company",IRIS:"Scitex",ISL:"Ichikawa Soft Laboratory",ITNL:"N/A (ITNL)",IVM:"IVM",IWAT:"Iwatsu Electric",Idnt:"Scitex",Inca:"Inca Digital Printers",Iris:"Scitex",JPEG:"Joint Photographic Experts Group",JSFT:"Jetsoft Development",JVC:"JVC Information Products",KART:"Scitex",KFC:"KFC Computek Components",KLH:"KLH Computers",KMHD:"Konica Minolta",KNCA:"Konica",KODA:"Kodak",KYOC:"Kyocera",Kart:"Scitex",LCAG:"Leica",LCCD:"Leeds Colour",LDAK:"Left Dakota",LEAD:"Leading Technology",LEXM:"Lexmark International",LINK:"Link Computer",LINO:"Linotronic",LITE:"Lite-On",Leaf:"Leaf",Lino:"Linotronic",MAGC:"Mag Computronic",MAGI:"MAG Innovision",MANN:"Mannesmann",MICN:"Micron Technology",MICR:"Microtek",MICV:"Microvitec",MINO:"Minolta",MITS:"Mitsubishi Electronics America",MITs:"Mitsuba",MNLT:"Minolta",MODG:"Modgraph",MONI:"Monitronix",MONS:"Monaco Systems",MORS:"Morse Technology",MOTI:"Motive Systems",MSFT:"Microsoft",MUTO:"MUTOH INDUSTRIES",Mits:"Mitsubishi Electric",NANA:"NANAO",NEC:"NEC",NEXP:"NexPress Solutions",NISS:"Nissei Sangyo America",NKON:"Nikon",NONE:"none",OCE:"Oce Technologies",OCEC:"OceColor",OKI:"Oki",OKID:"Okidata",OKIP:"Okidata",OLIV:"Olivetti",OLYM:"Olympus",ONYX:"Onyx Graphics",OPTI:"Optiquest",PACK:"Packard Bell",PANA:"Matsushita Electric Industrial",PANT:"Pantone",PBN:"Packard Bell",PFU:"PFU",PHIL:"Philips Consumer Electronics",PNTX:"HOYA",POne:"Phase One A/S",PREM:"Premier Computer Innovations",PRIN:"Princeton Graphic Systems",PRIP:"Princeton Publishing Labs",QLUX:"Hong Kong",QMS:"QMS",QPCD:"QPcard AB",QUAD:"QuadLaser",QUME:"Qume",RADI:"Radius",RDDx:"Integrated Color Solutions",RDG:"Roland DG",REDM:"REDMS Group",RELI:"Relisys",RGMS:"Rolf Gierling Multitools",RICO:"Ricoh",RNLD:"Edmund Ronald",ROYA:"Royal",RPC:"Ricoh Printing Systems",RTL:"Royal Information Electronics",SAMP:"Sampo",SAMS:"Samsung",SANT:"Jaime Santana Pomares",SCIT:"Scitex",SCRN:"Dainippon Screen",SDP:"Scitex",SEC:"Samsung",SEIK:"Seiko Instruments",SEIk:"Seikosha",SGUY:"ScanGuy.com",SHAR:"Sharp Laboratories",SICC:"International Color Consortium",SONY:"Sony",SPCL:"SpectraCal",STAR:"Star",STC:"Sampo Technology",Scit:"Scitex",Sdp:"Scitex",Sony:"Sony",TALO:"Talon Technology",TAND:"Tandy",TATU:"Tatung",TAXA:"TAXAN America",TDS:"Tokyo Denshi Sekei",TECO:"TECO Information Systems",TEGR:"Tegra",TEKT:"Tektronix",TI:"Texas Instruments",TMKR:"TypeMaker",TOSB:"Toshiba",TOSH:"Toshiba",TOTK:"TOTOKU ELECTRIC",TRIU:"Triumph",TSBT:"Toshiba",TTX:"TTX Computer Products",TVM:"TVM Professional Monitor",TW:"TW Casper",ULSX:"Ulead Systems",UNIS:"Unisys",UTZF:"Utz Fehlau & Sohn",VARI:"Varityper",VIEW:"Viewsonic",VISL:"Visual communication",VIVO:"Vivo Mobile Communication",WANG:"Wang",WLBR:"Wilbur Imaging",WTG2:"Ware To Go",WYSE:"WYSE Technology",XERX:"Xerox",XRIT:"X-Rite",ZRAN:"Zoran",Zebr:"Zebra Technologies",appl:"Apple Computer",bICC:"basICColor",berg:"bergdesign",ceyd:"Integrated Color Solutions",clsp:"MacDermid ColorSpan",ds:"Dainippon Screen",dupn:"DuPont",ffei:"FujiFilm Electronic Imaging",flux:"FluxData",iris:"Scitex",kart:"Scitex",lcms:"Little CMS",lino:"Linotronic",none:"none",ob4d:"Erdt Systems",obic:"Medigraph",quby:"Qubyx Sarl",scit:"Scitex",scrn:"Dainippon Screen",sdp:"Scitex",siwi:"SIWI GRAFIKA",yxym:"YxyMaster"},Ml={scnr:"Scanner",mntr:"Monitor",prtr:"Printer",link:"Device Link",abst:"Abstract",spac:"Color Space Conversion Profile",nmcl:"Named Color",cenc:"ColorEncodingSpace profile",mid:"MultiplexIdentification profile",mlnk:"MultiplexLink profile",mvis:"MultiplexVisualization profile",nkpf:"Nikon Input Device Profile (NON-STANDARD!)"};pi(Wi,"icc",[[4,Fo],[12,Ml],[40,Object.assign({},Fo,Ml)],[48,Fo],[80,Fo],[64,{0:"Perceptual",1:"Relative Colorimetric",2:"Saturation",3:"Absolute Colorimetric"}],["tech",{amd:"Active Matrix Display",crt:"Cathode Ray Tube Display",kpcd:"Photo CD",pmd:"Passive Matrix Display",dcam:"Digital Camera",dcpj:"Digital Cinema Projector",dmpc:"Digital Motion Picture Camera",dsub:"Dye Sublimation Printer",epho:"Electrophotographic Printer",esta:"Electrostatic Printer",flex:"Flexography",fprn:"Film Writer",fscn:"Film Scanner",grav:"Gravure",ijet:"Ink Jet Printer",imgs:"Photo Image Setter",mpfr:"Motion Picture Film Recorder",mpfs:"Motion Picture Film Scanner",offs:"Offset Lithography",pjtv:"Projection Television",rpho:"Photographic Paper Printer",rscn:"Reflective Scanner",silk:"Silkscreen",twax:"Thermal Wax Printer",vidc:"Video Camera",vidm:"Video Monitor"}]]);var Fa=class extends qi{static canHandle(Gr,Wr,Kr){return Gr.getUint8(Wr+1)===237&&Gr.getString(Wr+4,9)==="Photoshop"&&this.containsIptc8bim(Gr,Wr,Kr)!==void 0}static headerLength(Gr,Wr,Kr){let Yr,Zr=this.containsIptc8bim(Gr,Wr,Kr);if(Zr!==void 0)return Yr=Gr.getUint8(Wr+Zr+7),Yr%2!=0&&(Yr+=1),Yr===0&&(Yr=4),Zr+8+Yr}static containsIptc8bim(Gr,Wr,Kr){for(let Yr=0;Yr<Kr;Yr++)if(this.isIptcSegmentHead(Gr,Wr+Yr))return Yr}static isIptcSegmentHead(Gr,Wr){return Gr.getUint8(Wr)===56&&Gr.getUint32(Wr)===943868237&&Gr.getUint16(Wr+4)===1028}parse(){let{raw:Gr}=this,Wr=this.chunk.byteLength-1,Kr=!1;for(let Yr=0;Yr<Wr;Yr++)if(this.chunk.getUint8(Yr)===28&&this.chunk.getUint8(Yr+1)===2){Kr=!0;let Zr=this.chunk.getUint16(Yr+3),tn=this.chunk.getUint8(Yr+2),ln=this.chunk.getLatin1String(Yr+5,Zr);Gr.set(tn,this.pluralizeValue(Gr.get(tn),ln)),Yr+=4+Zr}else if(Kr)break;return this.translate(),this.output}pluralizeValue(Gr,Wr){return Gr!==void 0?Gr instanceof Array?(Gr.push(Wr),Gr):[Gr,Wr]:Wr}};Kn(Fa,"type","iptc"),Kn(Fa,"translateValues",!1),Kn(Fa,"reviveValues",!1),bi.set("iptc",Fa),pi(Si,"iptc",[[0,"ApplicationRecordVersion"],[3,"ObjectTypeReference"],[4,"ObjectAttributeReference"],[5,"ObjectName"],[7,"EditStatus"],[8,"EditorialUpdate"],[10,"Urgency"],[12,"SubjectReference"],[15,"Category"],[20,"SupplementalCategories"],[22,"FixtureIdentifier"],[25,"Keywords"],[26,"ContentLocationCode"],[27,"ContentLocationName"],[30,"ReleaseDate"],[35,"ReleaseTime"],[37,"ExpirationDate"],[38,"ExpirationTime"],[40,"SpecialInstructions"],[42,"ActionAdvised"],[45,"ReferenceService"],[47,"ReferenceDate"],[50,"ReferenceNumber"],[55,"DateCreated"],[60,"TimeCreated"],[62,"DigitalCreationDate"],[63,"DigitalCreationTime"],[65,"OriginatingProgram"],[70,"ProgramVersion"],[75,"ObjectCycle"],[80,"Byline"],[85,"BylineTitle"],[90,"City"],[92,"Sublocation"],[95,"State"],[100,"CountryCode"],[101,"Country"],[103,"OriginalTransmissionReference"],[105,"Headline"],[110,"Credit"],[115,"Source"],[116,"CopyrightNotice"],[118,"Contact"],[120,"Caption"],[121,"LocalCaption"],[122,"Writer"],[125,"RasterizedCaption"],[130,"ImageType"],[131,"ImageOrientation"],[135,"LanguageIdentifier"],[150,"AudioType"],[151,"AudioSamplingRate"],[152,"AudioSamplingResolution"],[153,"AudioDuration"],[154,"AudioOutcue"],[184,"JobID"],[185,"MasterDocumentID"],[186,"ShortDocumentID"],[187,"UniqueDocumentID"],[188,"OwnerID"],[200,"ObjectPreviewFileFormat"],[201,"ObjectPreviewFileVersion"],[202,"ObjectPreviewData"],[221,"Prefs"],[225,"ClassifyState"],[228,"SimilarityIndex"],[230,"DocumentNotes"],[231,"DocumentHistory"],[232,"ExifCameraInfo"],[255,"CatalogSets"]]),pi(Wi,"iptc",[[10,{0:"0 (reserved)",1:"1 (most urgent)",2:"2",3:"3",4:"4",5:"5 (normal urgency)",6:"6",7:"7",8:"8 (least urgent)",9:"9 (user-defined priority)"}],[75,{a:"Morning",b:"Both Morning and Evening",p:"Evening"}],[131,{L:"Landscape",P:"Portrait",S:"Square"}]]);var js=Wu;var Xl=po(mo());var Wl=["DateTimeOriginal","ExposureTime","FNumber","Flash","FocalLengthIn35mmFormat","ISO","LensMake","LensModel","Make","Model"];var es=class{async uploadPhotos(Gr){let Wr=new FormData(Gr),Kr=Wr.getAll("files")??[],Yr=Wr.get("parseExif")==="on";if(Kr.length>10){alert("You can only upload 10 photos at a time");return}let Zr=Kr.map(async tn=>{let ln,dn,yn;try{if(ln=await Ma(tn),ln===null||typeof ln!="string"){console.error("File data URL is not a string:",ln),alert("Error reading file.");return}}catch(An){console.error("Error reading file as Data URL:",An),alert("Error reading file.");return}if(Yr)try{let An=await js.parse(tn,{pick:Wl});console.log("EXIF tags:",await js.parse(tn)),dn=$u(An)}catch(An){console.error("Error reading EXIF data:",An)}try{yn=await to(ln,{width:2e3,height:2e3,maxSize:1e3*1e3,mode:"contain"})}catch(An){console.error("Error resizing image:",An),alert("Error resizing image.");return}let wn=eo(yn.path),kn=new FormData;kn.append("file",wn,tn.name),kn.append("width",String(yn.width)),kn.append("height",String(yn.height)),dn&&kn.append("exif",JSON.stringify(dn)),Xl.default.ajax("POST","/actions/photo",{swap:"afterbegin",target:"#image-preview",values:Object.fromEntries(kn),source:Gr})});await Promise.all(Zr),Gr.querySelector("input[type='file']").value=""}},Yu=1e6;function $u(Qr,Gr=Yu){let Wr={};for(let[Kr,Yr]of Object.entries(Qr)){let Zr=Kr[0].toLowerCase()+Kr.slice(1);typeof Yr=="number"?Wr[Zr]=Math.round(Yr*Gr):Array.isArray(Yr)?Wr[Zr]=Yr.map(tn=>typeof tn=="number"?Math.round(tn*Gr):tn):Yr instanceof Date?Wr[Zr]=Yr.toISOString():typeof Yr=="string"||typeof Yr=="boolean"?Wr[Zr]=Yr:Yr===void 0?Wr[Zr]=void 0:Wr[Zr]=String(Yr)}return Wr}var Ql=new Ro({layoutMode:"justified"});Ql.init();zs.default.onLoad(function(Qr){if(No.maybeInitForElement(Qr),Qr.id==="gallery-sort-dialog"){let Gr=Qr.querySelectorAll(".sortable");for(let Wr of Array.from(Gr))new El(Wr,{animation:150})}});Vs.default.browserInit();var Zi=globalThis;Zi.htmx=Zi.htmx??zs.default;Zi._hyperscript=Zi._hyperscript??Vs.default;Zi.Grain=Zi.Grain??{};Zi.Grain.uploadPage=new es;Zi.Grain.profileDialog=new Lo;Zi.Grain.galleryLayout=Ql;Zi.Grain.photoManip=Ts; 13 + `,bn.message,bn.stack)}}}}internalDataMap=new WeakMap;getInternalData(en){var an=this.internalDataMap.get(en);return typeof an>"u"&&this.internalDataMap.set(en,an={}),an}typeCheck(en,an,pn){if(en==null&&pn)return!0;var mn=Object.prototype.toString.call(en).slice(8,-1);return mn===an}getElementScope(en){var an=en.meta&&en.meta.owner;if(an){var pn=this.getInternalData(an),mn="elementScope";en.meta.feature&&en.meta.feature.behavior&&(mn=en.meta.feature.behavior+"Scope");var wn=jn(pn,mn);return wn}else return{}}isReservedWord(en){return["meta","it","result","locals","event","target","detail","sender","body"].includes(en)}isHyperscriptContext(en){return en instanceof kn}resolveSymbol(en,an,pn){if(en==="me"||en==="my"||en==="I")return an.me;if(en==="it"||en==="its"||en==="result")return an.result;if(en==="you"||en==="your"||en==="yourself")return an.you;if(pn==="global")return Qr[en];if(pn==="element"){var mn=this.getElementScope(an);return mn[en]}else{if(pn==="local")return an.locals[en];if(an.meta&&an.meta.context){var wn=an.meta.context[en];if(typeof wn<"u"||an.meta.context.detail&&(wn=an.meta.context.detail[en],typeof wn<"u"))return wn}if(this.isHyperscriptContext(an)&&!this.isReservedWord(en))var vn=an.locals[en];else var vn=an[en];if(typeof vn<"u")return vn;var mn=this.getElementScope(an);return vn=mn[en],typeof vn<"u"?vn:Qr[en]}}setSymbol(en,an,pn,mn){if(pn==="global")Qr[en]=mn;else if(pn==="element"){var wn=this.getElementScope(an);wn[en]=mn}else if(pn==="local")an.locals[en]=mn;else if(this.isHyperscriptContext(an)&&!this.isReservedWord(en)&&typeof an.locals[en]<"u")an.locals[en]=mn;else{var wn=this.getElementScope(an),vn=wn[en];typeof vn<"u"?wn[en]=mn:this.isHyperscriptContext(an)&&!this.isReservedWord(en)?an.locals[en]=mn:an[en]=mn}}findNext(en,an){if(en)return en.resolveNext?en.resolveNext(an):en.next?en.next:this.findNext(en.parent,an)}flatGet(en,an,pn){if(en!=null){var mn=pn(en,an);if(typeof mn<"u")return mn;if(this.shouldAutoIterate(en)){var wn=[];for(var vn of en){var bn=pn(vn,an);wn.push(bn)}return wn}}}resolveProperty(en,an){return this.flatGet(en,an,(pn,mn)=>pn[mn])}resolveAttribute(en,an){return this.flatGet(en,an,(pn,mn)=>pn.getAttribute&&pn.getAttribute(mn))}resolveStyle(en,an){return this.flatGet(en,an,(pn,mn)=>pn.style&&pn.style[mn])}resolveComputedStyle(en,an){return this.flatGet(en,an,(pn,mn)=>getComputedStyle(pn).getPropertyValue(mn))}assignToNamespace(en,an,pn,mn){let wn;typeof document<"u"&&en===document.body?wn=Qr:wn=this.getHyperscriptFeatures(en);for(var vn;(vn=an.shift())!==void 0;){var bn=wn[vn];bn==null&&(bn={},wn[vn]=bn),wn=bn}wn[pn]=mn}getHyperTrace(en,an){for(var pn=[],mn=en;mn.meta.caller;)mn=mn.meta.caller;if(mn.meta.traceMap)return mn.meta.traceMap.get(an,pn)}registerHyperTrace(en,an){for(var pn=[],mn=null;en!=null;)pn.push(en),mn=en,en=en.meta.caller;if(mn.meta.traceMap==null&&(mn.meta.traceMap=new Map),!mn.meta.traceMap.get(an)){var wn={trace:pn,print:function(vn){vn=vn||console.error,vn("hypertrace /// ");for(var bn=0,hn=0;hn<pn.length;hn++)bn=Math.max(bn,pn[hn].meta.feature.displayName.length);for(var hn=0;hn<pn.length;hn++){var On=pn[hn];vn(" ->",On.meta.feature.displayName.padEnd(bn+2),"-",On.meta.owner)}}};mn.meta.traceMap.set(an,wn)}}escapeSelector(en){return en.replace(/[:&()\[\]\/]/g,function(an){return"\\"+an})}nullCheck(en,an){if(en==null)throw new Error("'"+an.sourceFor()+"' is null")}isEmpty(en){return en==null||en.length===0}doesExist(en){if(en==null)return!1;if(this.shouldAutoIterate(en)){for(let an of en)return!0;return!1}return!0}getRootNode(en){if(en&&en instanceof Node){var an=en.getRootNode();if(an instanceof Document||an instanceof ShadowRoot)return an}return document}getEventQueueFor(en,an){let pn=this.getInternalData(en);var mn=pn.eventQueues;mn==null&&(mn=new Map,pn.eventQueues=mn);var wn=mn.get(an);return wn==null&&(wn={queue:[],executing:!1},mn.set(an,wn)),wn}beepValueToConsole(en,an,pn){if(this.triggerEvent(en,"hyperscript:beep",{element:en,expression:an,value:pn})){var mn;pn?pn instanceof An?mn="ElementCollection":pn.constructor?mn=pn.constructor.name:mn="unknown":mn="object (null)";var wn=pn;mn==="String"?wn='"'+wn+'"':pn instanceof An&&(wn=Array.from(pn)),console.log("///_ BEEP! The expression ("+Yr.sourceFor.call(an).replace("beep! ","")+") evaluates to:",wn,"of type "+mn)}}hyperscriptUrl="document"in Qr&&document.currentScript?document.currentScript.src:null}function ln(){return document.cookie.split("; ").map(en=>{let an=en.split("=");return{name:an[0],value:decodeURIComponent(an[1])}})}function dn(xn){document.cookie=xn+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"}function yn(){for(let xn of ln())dn(xn.name)}let Sn=new Proxy({},{get(xn,en){if(en==="then"||en==="asyncWrapper")return null;if(en==="length")return ln().length;if(en==="clear")return dn;if(en==="clearAll")return yn;if(typeof en=="string")if(isNaN(en)){let an=document.cookie.split("; ").find(pn=>pn.startsWith(en+"="))?.split("=")[1];if(an)return decodeURIComponent(an)}else return ln()[parseInt(en)];else if(en===Symbol.iterator)return ln()[en]},set(xn,en,an){var pn=null;return typeof an=="string"?(pn=encodeURIComponent(an),pn+=";samesite=lax"):(pn=encodeURIComponent(an.value),an.expires&&(pn+=";expires="+an.maxAge),an.maxAge&&(pn+=";max-age="+an.maxAge),an.partitioned&&(pn+=";partitioned="+an.partitioned),an.path&&(pn+=";path="+an.path),an.samesite&&(pn+=";samesite="+an.path),an.secure&&(pn+=";secure="+an.path)),document.cookie=en+"="+pn,!0}});class kn{constructor(en,an,pn,mn,wn){this.meta={parser:wn.parser,lexer:wn.lexer,runtime:wn,owner:en,feature:an,iterators:{},ctx:this},this.locals={cookies:Sn},this.me=pn,this.you=void 0,this.result=void 0,this.event=mn,this.target=mn?mn.target:null,this.detail=mn?mn.detail:null,this.sender=mn&&mn.detail?mn.detail.sender:null,this.body="document"in Qr?document.body:null,wn.addFeatures(en,this)}}class An{constructor(en,an,pn){this._css=en,this.relativeToElement=an,this.escape=pn,this[Bn]=!0}get css(){return this.escape?tn.prototype.escapeSelector(this._css):this._css}get className(){return this._css.substr(1)}get id(){return this.className()}contains(en){for(let an of this)if(an.contains(en))return!0;return!1}get length(){return this.selectMatches().length}[Symbol.iterator](){return this.selectMatches()[Symbol.iterator]()}selectMatches(){return tn.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css)}}let Bn=Symbol();function jn(xn,en){var an=xn[en];if(an)return an;var pn={};return xn[en]=pn,pn}function Vn(xn){try{return JSON.parse(xn)}catch(en){return ti(en),null}}function ti(xn){console.error?console.error(xn):console.log&&console.log("ERROR: ",xn)}function si(xn,en){return new(xn.bind.apply(xn,[xn].concat(en)))}function ri(xn){xn.addLeafExpression("parenthesized",function(nn,on,Jr){if(Jr.matchOpToken("(")){var rn=Jr.clearFollows();try{var cn=nn.requireElement("expression",Jr)}finally{Jr.restoreFollows(rn)}return Jr.requireOpToken(")"),cn}}),xn.addLeafExpression("string",function(nn,on,Jr){var rn=Jr.matchTokenType("STRING");if(rn){var cn=rn.value,sn;if(rn.template){var fn=Kr.tokenize(cn,!0);sn=nn.parseStringTemplate(fn)}else sn=[];return{type:"string",token:rn,args:sn,op:function(un){for(var gn="",En=1;En<arguments.length;En++){var Tn=arguments[En];Tn!==void 0&&(gn+=Tn)}return gn},evaluate:function(un){return sn.length===0?cn:on.unifiedEval(this,un)}}}}),xn.addGrammarElement("nakedString",function(nn,on,Jr){if(Jr.hasMore()){var rn=Jr.consumeUntilWhitespace();return Jr.matchTokenType("WHITESPACE"),{type:"nakedString",tokens:rn,evaluate:function(cn){return rn.map(function(sn){return sn.value}).join("")}}}}),xn.addLeafExpression("number",function(nn,on,Jr){var rn=Jr.matchTokenType("NUMBER");if(rn){var cn=rn,sn=parseFloat(rn.value);return{type:"number",value:sn,numberToken:cn,evaluate:function(){return sn}}}}),xn.addLeafExpression("idRef",function(nn,on,Jr){var rn=Jr.matchTokenType("ID_REF");if(rn&&rn.value)if(rn.template){var cn=rn.value.substring(2),sn=Kr.tokenize(cn),fn=nn.requireElement("expression",sn);return{type:"idRefTemplate",args:[fn],op:function(un,gn){return on.getRootNode(un.me).getElementById(gn)},evaluate:function(un){return on.unifiedEval(this,un)}}}else{let un=rn.value.substring(1);return{type:"idRef",css:rn.value,value:un,evaluate:function(gn){return on.getRootNode(gn.me).getElementById(un)}}}}),xn.addLeafExpression("classRef",function(nn,on,Jr){var rn=Jr.matchTokenType("CLASS_REF");if(rn&&rn.value)if(rn.template){var cn=rn.value.substring(2),sn=Kr.tokenize(cn),fn=nn.requireElement("expression",sn);return{type:"classRefTemplate",args:[fn],op:function(un,gn){return new An("."+gn,un.me,!0)},evaluate:function(un){return on.unifiedEval(this,un)}}}else{let un=rn.value;return{type:"classRef",css:un,evaluate:function(gn){return new An(un,gn.me,!0)}}}});class en extends An{constructor(on,Jr,rn){super(on,Jr),this.templateParts=rn,this.elements=rn.filter(cn=>cn instanceof Element)}get css(){let on="",Jr=0;for(let rn of this.templateParts)rn instanceof Element?on+="[data-hs-query-id='"+Jr+++"']":on+=rn;return on}[Symbol.iterator](){this.elements.forEach((Jr,rn)=>Jr.dataset.hsQueryId=rn);let on=super[Symbol.iterator]();return this.elements.forEach(Jr=>Jr.removeAttribute("data-hs-query-id")),on}}xn.addLeafExpression("queryRef",function(nn,on,Jr){var rn=Jr.matchOpToken("<");if(rn){var cn=Jr.consumeUntil("/");Jr.requireOpToken("/"),Jr.requireOpToken(">");var sn=cn.map(function(En){return En.type==="STRING"?'"'+En.value+'"':En.value}).join(""),fn,un,gn;return/\$[^=]/.test(sn)&&(fn=!0,un=Kr.tokenize(sn,!0),gn=nn.parseStringTemplate(un)),{type:"queryRef",css:sn,args:gn,op:function(En,...Tn){return fn?new en(sn,En.me,Tn):new An(sn,En.me)},evaluate:function(En){return on.unifiedEval(this,En)}}}}),xn.addLeafExpression("attributeRef",function(nn,on,Jr){var rn=Jr.matchTokenType("ATTRIBUTE_REF");if(rn&&rn.value){var cn=rn.value;if(cn.indexOf("[")===0)var sn=cn.substring(2,cn.length-1);else var sn=cn.substring(1);var fn="["+sn+"]",un=sn.split("="),gn=un[0],En=un[1];return En&&En.indexOf('"')===0&&(En=En.substring(1,En.length-1)),{type:"attributeRef",name:gn,css:fn,value:En,op:function(Tn){var Rn=Tn.you||Tn.me;if(Rn)return Rn.getAttribute(gn)},evaluate:function(Tn){return on.unifiedEval(this,Tn)}}}}),xn.addLeafExpression("styleRef",function(nn,on,Jr){var rn=Jr.matchTokenType("STYLE_REF");if(rn&&rn.value){var cn=rn.value.substr(1);return cn.startsWith("computed-")?(cn=cn.substr(9),{type:"computedStyleRef",name:cn,op:function(sn){var fn=sn.you||sn.me;if(fn)return on.resolveComputedStyle(fn,cn)},evaluate:function(sn){return on.unifiedEval(this,sn)}}):{type:"styleRef",name:cn,op:function(sn){var fn=sn.you||sn.me;if(fn)return on.resolveStyle(fn,cn)},evaluate:function(sn){return on.unifiedEval(this,sn)}}}}),xn.addGrammarElement("objectKey",function(nn,on,Jr){var rn;if(rn=Jr.matchTokenType("STRING"))return{type:"objectKey",key:rn.value,evaluate:function(){return rn.value}};if(Jr.matchOpToken("[")){var cn=nn.parseElement("expression",Jr);return Jr.requireOpToken("]"),{type:"objectKey",expr:cn,args:[cn],op:function(fn,un){return un},evaluate:function(fn){return on.unifiedEval(this,fn)}}}else{var sn="";do rn=Jr.matchTokenType("IDENTIFIER")||Jr.matchOpToken("-"),rn&&(sn+=rn.value);while(rn);return{type:"objectKey",key:sn,evaluate:function(){return sn}}}}),xn.addLeafExpression("objectLiteral",function(nn,on,Jr){if(Jr.matchOpToken("{")){var rn=[],cn=[];if(!Jr.matchOpToken("}")){do{var sn=nn.requireElement("objectKey",Jr);Jr.requireOpToken(":");var fn=nn.requireElement("expression",Jr);cn.push(fn),rn.push(sn)}while(Jr.matchOpToken(",")&&!Jr.peekToken("}",0,"R_BRACE"));Jr.requireOpToken("}")}return{type:"objectLiteral",args:[rn,cn],op:function(un,gn,En){for(var Tn={},Rn=0;Rn<gn.length;Rn++)Tn[gn[Rn]]=En[Rn];return Tn},evaluate:function(un){return on.unifiedEval(this,un)}}}}),xn.addGrammarElement("nakedNamedArgumentList",function(nn,on,Jr){var rn=[],cn=[];if(Jr.currentToken().type==="IDENTIFIER")do{var sn=Jr.requireTokenType("IDENTIFIER");Jr.requireOpToken(":");var fn=nn.requireElement("expression",Jr);cn.push(fn),rn.push({name:sn,value:fn})}while(Jr.matchOpToken(","));return{type:"namedArgumentList",fields:rn,args:[cn],op:function(un,gn){for(var En={_namedArgList_:!0},Tn=0;Tn<gn.length;Tn++){var Rn=rn[Tn];En[Rn.name.value]=gn[Tn]}return En},evaluate:function(un){return on.unifiedEval(this,un)}}}),xn.addGrammarElement("namedArgumentList",function(nn,on,Jr){if(Jr.matchOpToken("(")){var rn=nn.requireElement("nakedNamedArgumentList",Jr);return Jr.requireOpToken(")"),rn}}),xn.addGrammarElement("symbol",function(nn,on,Jr){var rn="default";Jr.matchToken("global")?rn="global":Jr.matchToken("element")||Jr.matchToken("module")?(rn="element",Jr.matchOpToken("'")&&Jr.requireToken("s")):Jr.matchToken("local")&&(rn="local");let cn=Jr.matchOpToken(":"),sn=Jr.matchTokenType("IDENTIFIER");if(sn&&sn.value){var fn=sn.value;return cn&&(fn=":"+fn),rn==="default"&&(fn.indexOf("$")===0&&(rn="global"),fn.indexOf(":")===0&&(rn="element")),{type:"symbol",token:sn,scope:rn,name:fn,evaluate:function(un){return on.resolveSymbol(fn,un,rn)}}}}),xn.addGrammarElement("implicitMeTarget",function(nn,on,Jr){return{type:"implicitMeTarget",evaluate:function(rn){return rn.you||rn.me}}}),xn.addLeafExpression("boolean",function(nn,on,Jr){var rn=Jr.matchToken("true")||Jr.matchToken("false");if(!rn)return;let cn=rn.value==="true";return{type:"boolean",evaluate:function(sn){return cn}}}),xn.addLeafExpression("null",function(nn,on,Jr){if(Jr.matchToken("null"))return{type:"null",evaluate:function(rn){return null}}}),xn.addLeafExpression("arrayLiteral",function(nn,on,Jr){if(Jr.matchOpToken("[")){var rn=[];if(!Jr.matchOpToken("]")){do{var cn=nn.requireElement("expression",Jr);rn.push(cn)}while(Jr.matchOpToken(","));Jr.requireOpToken("]")}return{type:"arrayLiteral",values:rn,args:[rn],op:function(sn,fn){return fn},evaluate:function(sn){return on.unifiedEval(this,sn)}}}}),xn.addLeafExpression("blockLiteral",function(nn,on,Jr){if(Jr.matchOpToken("\\")){var rn=[],cn=Jr.matchTokenType("IDENTIFIER");if(cn)for(rn.push(cn);Jr.matchOpToken(",");)rn.push(Jr.requireTokenType("IDENTIFIER"));Jr.requireOpToken("-"),Jr.requireOpToken(">");var sn=nn.requireElement("expression",Jr);return{type:"blockLiteral",args:rn,expr:sn,evaluate:function(fn){var un=function(){for(var gn=0;gn<rn.length;gn++)fn.locals[rn[gn].value]=arguments[gn];return sn.evaluate(fn)};return un}}}}),xn.addIndirectExpression("propertyAccess",function(nn,on,Jr,rn){if(Jr.matchOpToken(".")){var cn=Jr.requireTokenType("IDENTIFIER"),sn={type:"propertyAccess",root:rn,prop:cn,args:[rn],op:function(fn,un){var gn=on.resolveProperty(un,cn.value);return gn},evaluate:function(fn){return on.unifiedEval(this,fn)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("of",function(nn,on,Jr,rn){if(Jr.matchToken("of")){for(var cn=nn.requireElement("unaryExpression",Jr),sn=null,fn=rn;fn.root;)sn=fn,fn=fn.root;fn.type!=="symbol"&&fn.type!=="attributeRef"&&fn.type!=="styleRef"&&fn.type!=="computedStyleRef"&&nn.raiseParseError(Jr,"Cannot take a property of a non-symbol: "+fn.type);var un=fn.type==="attributeRef",gn=fn.type==="styleRef"||fn.type==="computedStyleRef";if(un||gn)var En=fn;var Tn=fn.name,Rn={type:"ofExpression",prop:fn.token,root:cn,attribute:En,expression:rn,args:[cn],op:function(Hn,Cn){return un?on.resolveAttribute(Cn,Tn):gn?fn.type==="computedStyleRef"?on.resolveComputedStyle(Cn,Tn):on.resolveStyle(Cn,Tn):on.resolveProperty(Cn,Tn)},evaluate:function(Hn){return on.unifiedEval(this,Hn)}};return fn.type==="attributeRef"&&(Rn.attribute=fn),sn?(sn.root=Rn,sn.args=[Rn]):rn=Rn,nn.parseElement("indirectExpression",Jr,rn)}}),xn.addIndirectExpression("possessive",function(nn,on,Jr,rn){if(!nn.possessivesDisabled){var cn=Jr.matchOpToken("'");if(cn||rn.type==="symbol"&&(rn.name==="my"||rn.name==="its"||rn.name==="your")&&(Jr.currentToken().type==="IDENTIFIER"||Jr.currentToken().type==="ATTRIBUTE_REF"||Jr.currentToken().type==="STYLE_REF")){cn&&Jr.requireToken("s");var sn,fn,un;sn=nn.parseElement("attributeRef",Jr),sn==null&&(fn=nn.parseElement("styleRef",Jr),fn==null&&(un=Jr.requireTokenType("IDENTIFIER")));var gn={type:"possessive",root:rn,attribute:sn||fn,prop:un,args:[rn],op:function(En,Tn){if(sn)var Rn=on.resolveAttribute(Tn,sn.name);else if(fn){var Rn;fn.type==="computedStyleRef"?Rn=on.resolveComputedStyle(Tn,fn.name):Rn=on.resolveStyle(Tn,fn.name)}else var Rn=on.resolveProperty(Tn,un.value);return Rn},evaluate:function(En){return on.unifiedEval(this,En)}};return nn.parseElement("indirectExpression",Jr,gn)}}}),xn.addIndirectExpression("inExpression",function(nn,on,Jr,rn){if(Jr.matchToken("in")){var cn=nn.requireElement("unaryExpression",Jr),sn={type:"inExpression",root:rn,args:[rn,cn],op:function(fn,un,gn){var En=[];if(un.css)on.implicitLoop(gn,function(Rn){for(var Hn=Rn.querySelectorAll(un.css),Cn=0;Cn<Hn.length;Cn++)En.push(Hn[Cn])});else if(un instanceof Element){var Tn=!1;if(on.implicitLoop(gn,function(Rn){Rn.contains(un)&&(Tn=!0)}),Tn)return un}else on.implicitLoop(un,function(Rn){on.implicitLoop(gn,function(Hn){Rn===Hn&&En.push(Rn)})});return En},evaluate:function(fn){return on.unifiedEval(this,fn)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("asExpression",function(nn,on,Jr,rn){if(Jr.matchToken("as")){Jr.matchToken("a")||Jr.matchToken("an");var cn=nn.requireElement("dotOrColonPath",Jr).evaluate(),sn={type:"asExpression",root:rn,args:[rn],op:function(fn,un){return on.convertValue(un,cn)},evaluate:function(fn){return on.unifiedEval(this,fn)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("functionCall",function(nn,on,Jr,rn){if(Jr.matchOpToken("(")){var cn=[];if(!Jr.matchOpToken(")")){do cn.push(nn.requireElement("expression",Jr));while(Jr.matchOpToken(","));Jr.requireOpToken(")")}if(rn.root)var sn={type:"functionCall",root:rn,argExressions:cn,args:[rn.root,cn],op:function(fn,un,gn){on.nullCheck(un,rn.root);var En=un[rn.prop.value];return on.nullCheck(En,rn),En.hyperfunc&&gn.push(fn),En.apply(un,gn)},evaluate:function(fn){return on.unifiedEval(this,fn)}};else var sn={type:"functionCall",root:rn,argExressions:cn,args:[rn,cn],op:function(un,gn,En){on.nullCheck(gn,rn),gn.hyperfunc&&En.push(un);var Tn=gn.apply(null,En);return Tn},evaluate:function(un){return on.unifiedEval(this,un)}};return nn.parseElement("indirectExpression",Jr,sn)}}),xn.addIndirectExpression("attributeRefAccess",function(nn,on,Jr,rn){var cn=nn.parseElement("attributeRef",Jr);if(cn){var sn={type:"attributeRefAccess",root:rn,attribute:cn,args:[rn],op:function(fn,un){var gn=on.resolveAttribute(un,cn.name);return gn},evaluate:function(fn){return on.unifiedEval(this,fn)}};return sn}}),xn.addIndirectExpression("arrayIndex",function(nn,on,Jr,rn){if(Jr.matchOpToken("[")){var cn=!1,sn=!1,fn=null,un=null;if(Jr.matchOpToken(".."))cn=!0,fn=nn.requireElement("expression",Jr);else if(fn=nn.requireElement("expression",Jr),Jr.matchOpToken("..")){sn=!0;var gn=Jr.currentToken();gn.type!=="R_BRACKET"&&(un=nn.parseElement("expression",Jr))}Jr.requireOpToken("]");var En={type:"arrayIndex",root:rn,prop:fn,firstIndex:fn,secondIndex:un,args:[rn,fn,un],op:function(Tn,Rn,Hn,Cn){return Rn==null?null:cn?(Hn<0&&(Hn=Rn.length+Hn),Rn.slice(0,Hn+1)):sn?Cn!=null?(Cn<0&&(Cn=Rn.length+Cn),Rn.slice(Hn,Cn+1)):Rn.slice(Hn):Rn[Hn]},evaluate:function(Tn){return on.unifiedEval(this,Tn)}};return nn.parseElement("indirectExpression",Jr,En)}});var an=["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","pc","pt","px"];xn.addGrammarElement("postfixExpression",function(nn,on,Jr){var rn=nn.parseElement("negativeNumber",Jr);let cn=Jr.matchAnyToken.apply(Jr,an)||Jr.matchOpToken("%");if(cn)return{type:"stringPostfix",postfix:cn.value,args:[rn],op:function(gn,En){return""+En+cn.value},evaluate:function(gn){return on.unifiedEval(this,gn)}};var sn=null;if(Jr.matchToken("s")||Jr.matchToken("seconds")?sn=1e3:(Jr.matchToken("ms")||Jr.matchToken("milliseconds"))&&(sn=1),sn)return{type:"timeExpression",time:rn,factor:sn,args:[rn],op:function(gn,En){return En*sn},evaluate:function(gn){return on.unifiedEval(this,gn)}};if(Jr.matchOpToken(":")){var fn=Jr.requireTokenType("IDENTIFIER");if(!fn.value)return;var un=!Jr.matchOpToken("!");return{type:"typeCheck",typeName:fn,nullOk:un,args:[rn],op:function(gn,En){var Tn=on.typeCheck(En,this.typeName.value,un);if(Tn)return En;throw new Error("Typecheck failed! Expected: "+fn.value)},evaluate:function(gn){return on.unifiedEval(this,gn)}}}else return rn}),xn.addGrammarElement("logicalNot",function(nn,on,Jr){if(Jr.matchToken("not")){var rn=nn.requireElement("unaryExpression",Jr);return{type:"logicalNot",root:rn,args:[rn],op:function(cn,sn){return!sn},evaluate:function(cn){return on.unifiedEval(this,cn)}}}}),xn.addGrammarElement("noExpression",function(nn,on,Jr){if(Jr.matchToken("no")){var rn=nn.requireElement("unaryExpression",Jr);return{type:"noExpression",root:rn,args:[rn],op:function(cn,sn){return on.isEmpty(sn)},evaluate:function(cn){return on.unifiedEval(this,cn)}}}}),xn.addLeafExpression("some",function(nn,on,Jr){if(Jr.matchToken("some")){var rn=nn.requireElement("expression",Jr);return{type:"noExpression",root:rn,args:[rn],op:function(cn,sn){return!on.isEmpty(sn)},evaluate(cn){return on.unifiedEval(this,cn)}}}}),xn.addGrammarElement("negativeNumber",function(nn,on,Jr){if(Jr.matchOpToken("-")){var rn=nn.requireElement("negativeNumber",Jr);return{type:"negativeNumber",root:rn,args:[rn],op:function(cn,sn){return-1*sn},evaluate:function(cn){return on.unifiedEval(this,cn)}}}else return nn.requireElement("primaryExpression",Jr)}),xn.addGrammarElement("unaryExpression",function(nn,on,Jr){return Jr.matchToken("the"),nn.parseAnyOf(["beepExpression","logicalNot","relativePositionalExpression","positionalExpression","noExpression","postfixExpression"],Jr)}),xn.addGrammarElement("beepExpression",function(nn,on,Jr){if(Jr.matchToken("beep!")){var rn=nn.parseElement("unaryExpression",Jr);if(rn){rn.booped=!0;var cn=rn.evaluate;return rn.evaluate=function(sn){let fn=cn.apply(rn,arguments),un=sn.me;return on.beepValueToConsole(un,rn,fn),fn},rn}}});var pn=function(nn,on,Jr,rn){for(var cn=on.querySelectorAll(Jr),sn=0;sn<cn.length;sn++){var fn=cn[sn];if(fn.compareDocumentPosition(nn)===Node.DOCUMENT_POSITION_PRECEDING)return fn}if(rn)return cn[0]},mn=function(nn,on,Jr,rn){for(var cn=on.querySelectorAll(Jr),sn=cn.length-1;sn>=0;sn--){var fn=cn[sn];if(fn.compareDocumentPosition(nn)===Node.DOCUMENT_POSITION_FOLLOWING)return fn}if(rn)return cn[cn.length-1]},wn=function(nn,on,Jr,rn){var cn=[];tn.prototype.forEach(on,function(gn){(gn.matches(Jr)||gn===nn)&&cn.push(gn)});for(var sn=0;sn<cn.length-1;sn++){var fn=cn[sn];if(fn===nn)return cn[sn+1]}if(rn){var un=cn[0];if(un&&un.matches(Jr))return un}},vn=function(nn,on,Jr,rn){return wn(nn,Array.from(on).reverse(),Jr,rn)};xn.addGrammarElement("relativePositionalExpression",function(nn,on,Jr){var rn=Jr.matchAnyToken("next","previous");if(rn){var cn=rn.value==="next",sn=nn.parseElement("expression",Jr);if(Jr.matchToken("from")){Jr.pushFollow("in");try{var fn=nn.requireElement("unaryExpression",Jr)}finally{Jr.popFollow()}}else var fn=nn.requireElement("implicitMeTarget",Jr);var un=!1,gn;if(Jr.matchToken("in")){un=!0;var En=nn.requireElement("unaryExpression",Jr)}else Jr.matchToken("within")?gn=nn.requireElement("unaryExpression",Jr):gn=document.body;var Tn=!1;return Jr.matchToken("with")&&(Jr.requireToken("wrapping"),Tn=!0),{type:"relativePositionalExpression",from:fn,forwardSearch:cn,inSearch:un,wrapping:Tn,inElt:En,withinElt:gn,operator:rn.value,args:[sn,fn,En,gn],op:function(Rn,Hn,Cn,In,_n){var Un=Hn.css;if(Un==null)throw"Expected a CSS value to be returned by "+Yr.sourceFor.apply(sn);if(un){if(In)return cn?wn(Cn,In,Un,Tn):vn(Cn,In,Un,Tn)}else if(_n)return cn?pn(Cn,_n,Un,Tn):mn(Cn,_n,Un,Tn)},evaluate:function(Rn){return on.unifiedEval(this,Rn)}}}}),xn.addGrammarElement("positionalExpression",function(nn,on,Jr){var rn=Jr.matchAnyToken("first","last","random");if(!rn)return;Jr.matchAnyToken("in","from","of");var cn=nn.requireElement("unaryExpression",Jr);let sn=rn.value;return{type:"positionalExpression",rhs:cn,operator:rn.value,args:[cn],op:function(fn,un){if(un&&!Array.isArray(un)&&(un.children?un=un.children:un=Array.from(un)),un){if(sn==="first")return un[0];if(sn==="last")return un[un.length-1];if(sn==="random")return un[Math.floor(Math.random()*un.length)]}},evaluate:function(fn){return on.unifiedEval(this,fn)}}}),xn.addGrammarElement("mathOperator",function(nn,on,Jr){var rn=nn.parseElement("unaryExpression",Jr),cn,sn=null;for(cn=Jr.matchAnyOpToken("+","-","*","/")||Jr.matchToken("mod");cn;){sn=sn||cn;var fn=cn.value;sn.value!==fn&&nn.raiseParseError(Jr,"You must parenthesize math operations with different operators");var un=nn.parseElement("unaryExpression",Jr);rn={type:"mathOperator",lhs:rn,rhs:un,operator:fn,args:[rn,un],op:function(gn,En,Tn){if(fn==="+")return En+Tn;if(fn==="-")return En-Tn;if(fn==="*")return En*Tn;if(fn==="/")return En/Tn;if(fn==="mod")return En%Tn},evaluate:function(gn){return on.unifiedEval(this,gn)}},cn=Jr.matchAnyOpToken("+","-","*","/")||Jr.matchToken("mod")}return rn}),xn.addGrammarElement("mathExpression",function(nn,on,Jr){return nn.parseAnyOf(["mathOperator","unaryExpression"],Jr)});function bn(nn,on,Jr){if(on.contains)return on.contains(Jr);if(on.includes)return on.includes(Jr);throw Error("The value of "+nn.sourceFor()+" does not have a contains or includes method on it")}function hn(nn,on,Jr){if(on.match)return!!on.match(Jr);if(on.matches)return on.matches(Jr);throw Error("The value of "+nn.sourceFor()+" does not have a match or matches method on it")}xn.addGrammarElement("comparisonOperator",function(nn,on,Jr){var rn=nn.parseElement("mathExpression",Jr),cn=Jr.matchAnyOpToken("<",">","<=",">=","==","===","!=","!=="),sn=cn?cn.value:null,fn=!0,un=!1;if(sn==null&&(Jr.matchToken("is")||Jr.matchToken("am")?Jr.matchToken("not")?Jr.matchToken("in")?sn="not in":Jr.matchToken("a")||Jr.matchToken("an")?(sn="not a",un=!0):Jr.matchToken("empty")?(sn="not empty",fn=!1):(Jr.matchToken("really")?sn="!==":sn="!=",Jr.matchToken("equal")&&Jr.matchToken("to")):Jr.matchToken("in")?sn="in":Jr.matchToken("a")||Jr.matchToken("an")?(sn="a",un=!0):Jr.matchToken("empty")?(sn="empty",fn=!1):Jr.matchToken("less")?(Jr.requireToken("than"),Jr.matchToken("or")?(Jr.requireToken("equal"),Jr.requireToken("to"),sn="<="):sn="<"):Jr.matchToken("greater")?(Jr.requireToken("than"),Jr.matchToken("or")?(Jr.requireToken("equal"),Jr.requireToken("to"),sn=">="):sn=">"):(Jr.matchToken("really")?sn="===":sn="==",Jr.matchToken("equal")&&Jr.matchToken("to")):Jr.matchToken("equals")?sn="==":Jr.matchToken("really")?(Jr.requireToken("equals"),sn="==="):Jr.matchToken("exist")||Jr.matchToken("exists")?(sn="exist",fn=!1):Jr.matchToken("matches")||Jr.matchToken("match")?sn="match":Jr.matchToken("contains")||Jr.matchToken("contain")?sn="contain":Jr.matchToken("includes")||Jr.matchToken("include")?sn="include":(Jr.matchToken("do")||Jr.matchToken("does"))&&(Jr.requireToken("not"),Jr.matchToken("matches")||Jr.matchToken("match")?sn="not match":Jr.matchToken("contains")||Jr.matchToken("contain")?sn="not contain":Jr.matchToken("exist")||Jr.matchToken("exist")?(sn="not exist",fn=!1):Jr.matchToken("include")?sn="not include":nn.raiseParseError(Jr,"Expected matches or contains"))),sn){var gn,En,Tn;un?(gn=Jr.requireTokenType("IDENTIFIER"),En=!Jr.matchOpToken("!")):fn&&(Tn=nn.requireElement("mathExpression",Jr),(sn==="match"||sn==="not match")&&(Tn=Tn.css?Tn.css:Tn));var Rn=rn;rn={type:"comparisonOperator",operator:sn,typeName:gn,nullOk:En,lhs:rn,rhs:Tn,args:[rn,Tn],op:function(Hn,Cn,In){if(sn==="==")return Cn==In;if(sn==="!=")return Cn!=In;if(sn==="===")return Cn===In;if(sn==="!==")return Cn!==In;if(sn==="match")return Cn!=null&&hn(Rn,Cn,In);if(sn==="not match")return Cn==null||!hn(Rn,Cn,In);if(sn==="in")return In!=null&&bn(Tn,In,Cn);if(sn==="not in")return In==null||!bn(Tn,In,Cn);if(sn==="contain")return Cn!=null&&bn(Rn,Cn,In);if(sn==="not contain")return Cn==null||!bn(Rn,Cn,In);if(sn==="include")return Cn!=null&&bn(Rn,Cn,In);if(sn==="not include")return Cn==null||!bn(Rn,Cn,In);if(sn==="===")return Cn===In;if(sn==="!==")return Cn!==In;if(sn==="<")return Cn<In;if(sn===">")return Cn>In;if(sn==="<=")return Cn<=In;if(sn===">=")return Cn>=In;if(sn==="empty")return on.isEmpty(Cn);if(sn==="not empty")return!on.isEmpty(Cn);if(sn==="exist")return on.doesExist(Cn);if(sn==="not exist")return!on.doesExist(Cn);if(sn==="a")return on.typeCheck(Cn,gn.value,En);if(sn==="not a")return!on.typeCheck(Cn,gn.value,En);throw"Unknown comparison : "+sn},evaluate:function(Hn){return on.unifiedEval(this,Hn)}}}return rn}),xn.addGrammarElement("comparisonExpression",function(nn,on,Jr){return nn.parseAnyOf(["comparisonOperator","mathExpression"],Jr)}),xn.addGrammarElement("logicalOperator",function(nn,on,Jr){var rn=nn.parseElement("comparisonExpression",Jr),cn,sn=null;for(cn=Jr.matchToken("and")||Jr.matchToken("or");cn;){sn=sn||cn,sn.value!==cn.value&&nn.raiseParseError(Jr,"You must parenthesize logical operations with different operators");var fn=nn.requireElement("comparisonExpression",Jr);let un=cn.value;rn={type:"logicalOperator",operator:un,lhs:rn,rhs:fn,args:[rn,fn],op:function(gn,En,Tn){return un==="and"?En&&Tn:En||Tn},evaluate:function(gn){return on.unifiedEval(this,gn,un==="or")}},cn=Jr.matchToken("and")||Jr.matchToken("or")}return rn}),xn.addGrammarElement("logicalExpression",function(nn,on,Jr){return nn.parseAnyOf(["logicalOperator","mathExpression"],Jr)}),xn.addGrammarElement("asyncExpression",function(nn,on,Jr){if(Jr.matchToken("async")){var rn=nn.requireElement("logicalExpression",Jr),cn={type:"asyncExpression",value:rn,evaluate:function(sn){return{asyncWrapper:!0,value:this.value.evaluate(sn)}}};return cn}else return nn.parseElement("logicalExpression",Jr)}),xn.addGrammarElement("expression",function(nn,on,Jr){return Jr.matchToken("the"),nn.parseElement("asyncExpression",Jr)}),xn.addGrammarElement("assignableExpression",function(nn,on,Jr){Jr.matchToken("the");var rn=nn.parseElement("primaryExpression",Jr);return rn&&(rn.type==="symbol"||rn.type==="ofExpression"||rn.type==="propertyAccess"||rn.type==="attributeRefAccess"||rn.type==="attributeRef"||rn.type==="styleRef"||rn.type==="arrayIndex"||rn.type==="possessive")||nn.raiseParseError(Jr,"A target expression must be writable. The expression type '"+(rn&&rn.type)+"' is not."),rn}),xn.addGrammarElement("hyperscript",function(nn,on,Jr){var rn=[];if(Jr.hasMore())for(;nn.featureStart(Jr.currentToken())||Jr.currentToken().value==="(";){var cn=nn.requireElement("feature",Jr);rn.push(cn),Jr.matchToken("end")}return{type:"hyperscript",features:rn,apply:function(sn,fn,un){for(let gn of rn)gn.install(sn,fn,un)}}});var On=function(nn){var on=[];if(nn.token(0).value==="("&&(nn.token(1).value===")"||nn.token(2).value===","||nn.token(2).value===")")){nn.matchOpToken("(");do on.push(nn.requireTokenType("IDENTIFIER"));while(nn.matchOpToken(","));nn.requireOpToken(")")}return on};xn.addFeature("on",function(nn,on,Jr){if(Jr.matchToken("on")){var rn=!1;Jr.matchToken("every")&&(rn=!0);var cn=[],sn=null;do{var fn=nn.requireElement("eventName",Jr,"Expected event name"),un=fn.evaluate();sn?sn=sn+" or "+un:sn="on "+un;var gn=On(Jr),En=null;Jr.matchOpToken("[")&&(En=nn.requireElement("expression",Jr),Jr.requireOpToken("]"));var Tn,Rn,Hn;if(Jr.currentToken().type==="NUMBER"){var Cn=Jr.consumeToken();if(!Cn.value)return;if(Tn=parseInt(Cn.value),Jr.matchToken("to")){var In=Jr.consumeToken();if(!In.value)return;Rn=parseInt(In.value)}else Jr.matchToken("and")&&(Hn=!0,Jr.requireToken("on"))}var _n,Un;if(un==="intersection"){if(_n={},Jr.matchToken("with")&&(_n.with=nn.requireElement("expression",Jr).evaluate()),Jr.matchToken("having"))do Jr.matchToken("margin")?_n.rootMargin=nn.requireElement("stringLike",Jr).evaluate():Jr.matchToken("threshold")?_n.threshold=nn.requireElement("expression",Jr).evaluate():nn.raiseParseError(Jr,"Unknown intersection config specification");while(Jr.matchToken("and"))}else if(un==="mutation")if(Un={},Jr.matchToken("of"))do if(Jr.matchToken("anything"))Un.attributes=!0,Un.subtree=!0,Un.characterData=!0,Un.childList=!0;else if(Jr.matchToken("childList"))Un.childList=!0;else if(Jr.matchToken("attributes"))Un.attributes=!0,Un.attributeOldValue=!0;else if(Jr.matchToken("subtree"))Un.subtree=!0;else if(Jr.matchToken("characterData"))Un.characterData=!0,Un.characterDataOldValue=!0;else if(Jr.currentToken().type==="ATTRIBUTE_REF"){var ii=Jr.consumeToken();Un.attributeFilter==null&&(Un.attributeFilter=[]),ii.value.indexOf("@")==0?Un.attributeFilter.push(ii.value.substring(1)):nn.raiseParseError(Jr,"Only shorthand attribute references are allowed here")}else nn.raiseParseError(Jr,"Unknown mutation config specification");while(Jr.matchToken("or"));else Un.attributes=!0,Un.characterData=!0,Un.childList=!0;var ai=null,Ri=!1;if(Jr.matchToken("from"))if(Jr.matchToken("elsewhere"))Ri=!0;else{Jr.pushFollow("or");try{ai=nn.requireElement("expression",Jr)}finally{Jr.popFollow()}ai||nn.raiseParseError(Jr,'Expected either target value or "elsewhere".')}if(ai===null&&Ri===!1&&Jr.matchToken("elsewhere")&&(Ri=!0),Jr.matchToken("in"))var Bi=nn.parseElement("unaryExpression",Jr);if(Jr.matchToken("debounced")){Jr.requireToken("at");var ui=nn.requireElement("unaryExpression",Jr),ki=ui.evaluate({})}else if(Jr.matchToken("throttled")){Jr.requireToken("at");var ui=nn.requireElement("unaryExpression",Jr),Hi=ui.evaluate({})}cn.push({execCount:0,every:rn,on:un,args:gn,filter:En,from:ai,inExpr:Bi,elsewhere:Ri,startCount:Tn,endCount:Rn,unbounded:Hn,debounceTime:ki,throttleTime:Hi,mutationSpec:Un,intersectionSpec:_n,debounced:void 0,lastExec:void 0})}while(Jr.matchToken("or"));var Ci=!0;if(!rn&&Jr.matchToken("queue"))if(Jr.matchToken("all"))var Ni=!0,Ci=!1;else if(Jr.matchToken("first"))var Ca=!0;else if(Jr.matchToken("none"))var _a=!0;else Jr.requireToken("last");var co=nn.requireElement("commandList",Jr);nn.ensureTerminated(co);var ts,fo;if(Jr.matchToken("catch")&&(ts=Jr.requireTokenType("IDENTIFIER").value,fo=nn.requireElement("commandList",Jr),nn.ensureTerminated(fo)),Jr.matchToken("finally")){var Qs=nn.requireElement("commandList",Jr);nn.ensureTerminated(Qs)}var _i={displayName:sn,events:cn,start:co,every:rn,execCount:0,errorHandler:fo,errorSymbol:ts,execute:function(xi){let aa=on.getEventQueueFor(xi.me,_i);if(aa.executing&&rn===!1){if(_a||Ca&&aa.queue.length>0)return;Ci&&(aa.queue.length=0),aa.queue.push(xi);return}_i.execCount++,aa.executing=!0,xi.meta.onHalt=function(){aa.executing=!1;var Li=aa.queue.shift();Li&&setTimeout(function(){_i.execute(Li)},1)},xi.meta.reject=function(Li){console.error(Li.message?Li.message:Li);var $n=on.getHyperTrace(xi,Li);$n&&$n.print(),on.triggerEvent(xi.me,"exception",{error:Li})},co.execute(xi)},install:function(xi,aa){for(let $n of _i.events){var Li;$n.elsewhere?Li=[document]:$n.from?Li=$n.from.evaluate(on.makeContext(xi,_i,xi,null)):Li=[xi],on.implicitLoop(Li,function(ji){var Ia=$n.on;if(ji==null){console.warn("'%s' feature ignored because target does not exists:",sn,xi);return}if($n.mutationSpec&&(Ia="hyperscript:mutation",new MutationObserver(function(pa,ci){_i.executing||on.triggerEvent(ji,Ia,{mutationList:pa,observer:ci})}).observe(ji,$n.mutationSpec)),$n.intersectionSpec){Ia="hyperscript:intersection";let ja=new IntersectionObserver(function(pa){for(let ho of pa){var ci={observer:ja};ci=Object.assign(ci,ho),ci.intersecting=ho.isIntersecting,on.triggerEvent(ji,Ia,ci)}},$n.intersectionSpec);ja.observe(ji)}var Yl=ji.addEventListener||ji.on;Yl.call(ji,Ia,function ja(pa){if(typeof Node<"u"&&xi instanceof Node&&ji!==xi&&!xi.isConnected){ji.removeEventListener(Ia,ja);return}var ci=on.makeContext(xi,_i,xi,pa);if(!($n.elsewhere&&xi.contains(pa.target))){$n.from&&(ci.result=ji);for(let po of $n.args){let Ks=ci.event[po.value];Ks!==void 0?ci.locals[po.value]=Ks:"detail"in ci.event&&(ci.locals[po.value]=ci.event.detail[po.value])}if(ci.meta.errorHandler=fo,ci.meta.errorSymbol=ts,ci.meta.finallyHandler=Qs,$n.filter){var ho=ci.meta.context;ci.meta.context=ci.event;try{var $l=$n.filter.evaluate(ci);if(!$l)return}finally{ci.meta.context=ho}}if($n.inExpr){for(var Oa=pa.target;;)if(Oa.matches&&Oa.matches($n.inExpr.css)){ci.result=Oa;break}else if(Oa=Oa.parentElement,Oa==null)return}if($n.execCount++,$n.startCount){if($n.endCount){if($n.execCount<$n.startCount||$n.execCount>$n.endCount)return}else if($n.unbounded){if($n.execCount<$n.startCount)return}else if($n.execCount!==$n.startCount)return}if($n.debounceTime){$n.debounced&&clearTimeout($n.debounced),$n.debounced=setTimeout(function(){_i.execute(ci)},$n.debounceTime);return}if($n.throttleTime){if($n.lastExec&&Date.now()<$n.lastExec+$n.throttleTime)return;$n.lastExec=Date.now()}_i.execute(ci)}})})}}};return nn.setParent(co,_i),_i}}),xn.addFeature("def",function(nn,on,Jr){if(Jr.matchToken("def")){var rn=nn.requireElement("dotOrColonPath",Jr),cn=rn.evaluate(),sn=cn.split("."),fn=sn.pop(),un=[];if(Jr.matchOpToken("(")&&!Jr.matchOpToken(")")){do un.push(Jr.requireTokenType("IDENTIFIER"));while(Jr.matchOpToken(","));Jr.requireOpToken(")")}var gn=nn.requireElement("commandList",Jr),En,Tn;if(Jr.matchToken("catch")&&(En=Jr.requireTokenType("IDENTIFIER").value,Tn=nn.parseElement("commandList",Jr)),Jr.matchToken("finally")){var Rn=nn.requireElement("commandList",Jr);nn.ensureTerminated(Rn)}var Hn={displayName:fn+"("+un.map(function(Cn){return Cn.value}).join(", ")+")",name:fn,args:un,start:gn,errorHandler:Tn,errorSymbol:En,finallyHandler:Rn,install:function(Cn,In){var _n=function(){var Un=on.makeContext(In,Hn,Cn,null);Un.meta.errorHandler=Tn,Un.meta.errorSymbol=En,Un.meta.finallyHandler=Rn;for(var ii=0;ii<un.length;ii++){var ai=un[ii],Ri=arguments[ii];ai&&(Un.locals[ai.value]=Ri)}Un.meta.caller=arguments[un.length],Un.meta.caller&&(Un.meta.callingCommand=Un.meta.caller.meta.command);var Bi,ui=null,ki=new Promise(function(Hi,Ci){Bi=Hi,ui=Ci});return gn.execute(Un),Un.meta.returned?Un.meta.returnValue:(Un.meta.resolve=Bi,Un.meta.reject=ui,ki)};_n.hyperfunc=!0,_n.hypername=cn,on.assignToNamespace(Cn,sn,fn,_n)}};return nn.ensureTerminated(gn),Tn&&nn.ensureTerminated(Tn),nn.setParent(gn,Hn),Hn}}),xn.addFeature("set",function(nn,on,Jr){let rn=nn.parseElement("setCommand",Jr);if(rn){rn.target.scope!=="element"&&nn.raiseParseError(Jr,"variables declared at the feature level must be element scoped.");let cn={start:rn,install:function(sn,fn){rn&&rn.execute(on.makeContext(sn,cn,sn,null))}};return nn.ensureTerminated(rn),cn}}),xn.addFeature("init",function(nn,on,Jr){if(Jr.matchToken("init")){var rn=Jr.matchToken("immediately"),cn=nn.requireElement("commandList",Jr),sn={start:cn,install:function(fn,un){let gn=function(){cn&&cn.execute(on.makeContext(fn,sn,fn,null))};rn?gn():setTimeout(gn,0)}};return nn.ensureTerminated(cn),nn.setParent(cn,sn),sn}}),xn.addFeature("worker",function(nn,on,Jr){if(Jr.matchToken("worker")){nn.raiseParseError(Jr,"In order to use the 'worker' feature, include the _hyperscript worker plugin. See https://hyperscript.org/features/worker/ for more info.");return}}),xn.addFeature("behavior",function(nn,on,Jr){if(Jr.matchToken("behavior")){var rn=nn.requireElement("dotOrColonPath",Jr).evaluate(),cn=rn.split("."),sn=cn.pop(),fn=[];if(Jr.matchOpToken("(")&&!Jr.matchOpToken(")")){do fn.push(Jr.requireTokenType("IDENTIFIER").value);while(Jr.matchOpToken(","));Jr.requireOpToken(")")}for(var un=nn.requireElement("hyperscript",Jr),gn=0;gn<un.features.length;gn++){var En=un.features[gn];En.behavior=rn}return{install:function(Tn,Rn){on.assignToNamespace(Qr.document&&Qr.document.body,cn,sn,function(Hn,Cn,In){for(var _n=on.getInternalData(Hn),Un=jn(_n,rn+"Scope"),ii=0;ii<fn.length;ii++)Un[fn[ii]]=In[fn[ii]];un.apply(Hn,Cn)})}}}}),xn.addFeature("install",function(nn,on,Jr){if(Jr.matchToken("install")){var rn=nn.requireElement("dotOrColonPath",Jr).evaluate(),cn=rn.split("."),sn=nn.parseElement("namedArgumentList",Jr),fn;return fn={install:function(un,gn){on.unifiedEval({args:[sn],op:function(En,Tn){for(var Rn=Qr,Hn=0;Hn<cn.length;Hn++)if(Rn=Rn[cn[Hn]],typeof Rn!="object"&&typeof Rn!="function")throw new Error("No such behavior defined as "+rn);if(!(Rn instanceof Function))throw new Error(rn+" is not a behavior");Rn(un,gn,Tn)}},on.makeContext(un,fn,un,null))}}}}),xn.addGrammarElement("jsBody",function(nn,on,Jr){for(var rn=Jr.currentToken().start,cn=Jr.currentToken(),sn=[],fn="",un=!1;Jr.hasMore();){cn=Jr.consumeToken();var gn=Jr.token(0,!0);if(gn.type==="IDENTIFIER"&&gn.value==="end")break;un?cn.type==="IDENTIFIER"||cn.type==="NUMBER"?fn+=cn.value:(fn!==""&&sn.push(fn),fn="",un=!1):cn.type==="IDENTIFIER"&&cn.value==="function"&&(un=!0)}var En=cn.end+1;return{type:"jsBody",exposedFunctionNames:sn,jsSource:Jr.source.substring(rn,En)}}),xn.addFeature("js",function(nn,on,Jr){if(Jr.matchToken("js")){var rn=nn.requireElement("jsBody",Jr),cn=rn.jsSource+` 14 + return { `+rn.exposedFunctionNames.map(function(fn){return fn+":"+fn}).join(",")+" } ",sn=new Function(cn);return{jsSource:cn,function:sn,exposedFunctionNames:rn.exposedFunctionNames,install:function(){Object.assign(Qr,sn())}}}}),xn.addCommand("js",function(nn,on,Jr){if(Jr.matchToken("js")){var rn=[];if(Jr.matchOpToken("(")&&!Jr.matchOpToken(")")){do{var cn=Jr.requireTokenType("IDENTIFIER");rn.push(cn.value)}while(Jr.matchOpToken(","));Jr.requireOpToken(")")}var sn=nn.requireElement("jsBody",Jr);Jr.matchToken("end");var fn=si(Function,rn.concat([sn.jsSource])),un={jsSource:sn.jsSource,function:fn,inputs:rn,op:function(gn){var En=[];rn.forEach(function(Rn){En.push(on.resolveSymbol(Rn,gn,"default"))});var Tn=fn.apply(Qr,En);return Tn&&typeof Tn.then=="function"?new Promise(function(Rn){Tn.then(function(Hn){gn.result=Hn,Rn(on.findNext(this,gn))})}):(gn.result=Tn,on.findNext(this,gn))}};return un}}),xn.addCommand("async",function(nn,on,Jr){if(Jr.matchToken("async")){if(Jr.matchToken("do")){for(var rn=nn.requireElement("commandList",Jr),cn=rn;cn.next;)cn=cn.next;cn.next=on.HALT,Jr.requireToken("end")}else var rn=nn.requireElement("command",Jr);var sn={body:rn,op:function(fn){return setTimeout(function(){rn.execute(fn)}),on.findNext(this,fn)}};return nn.setParent(rn,sn),sn}}),xn.addCommand("tell",function(nn,on,Jr){var rn=Jr.currentToken();if(Jr.matchToken("tell")){var cn=nn.requireElement("expression",Jr),sn=nn.requireElement("commandList",Jr);Jr.hasMore()&&!nn.featureStart(Jr.currentToken())&&Jr.requireToken("end");var fn="tell_"+rn.start,un={value:cn,body:sn,args:[cn],resolveNext:function(gn){var En=gn.meta.iterators[fn];return En.index<En.value.length?(gn.you=En.value[En.index++],sn):(gn.you=En.originalYou,this.next?this.next:on.findNext(this.parent,gn))},op:function(gn,En){return En==null?En=[]:Array.isArray(En)||En instanceof NodeList||(En=[En]),gn.meta.iterators[fn]={originalYou:gn.you,index:0,value:En},this.resolveNext(gn)}};return nn.setParent(sn,un),un}}),xn.addCommand("wait",function(nn,on,Jr){if(Jr.matchToken("wait")){var rn;if(Jr.matchToken("for")){Jr.matchToken("a");var cn=[];do{var sn=Jr.token(0);sn.type==="NUMBER"||sn.type==="L_PAREN"?cn.push({time:nn.requireElement("expression",Jr).evaluate()}):cn.push({name:nn.requireElement("dotOrColonPath",Jr,"Expected event name").evaluate(),args:On(Jr)})}while(Jr.matchToken("or"));if(Jr.matchToken("from"))var fn=nn.requireElement("expression",Jr);return rn={event:cn,on:fn,args:[fn],op:function(gn,En){var Tn=En||gn.me;if(!(Tn instanceof EventTarget))throw new Error("Not a valid event target: "+this.on.sourceFor());return new Promise(Rn=>{var Hn=!1;for(let In of cn){var Cn=_n=>{if(gn.result=_n,In.args)for(let Un of In.args)gn.locals[Un.value]=_n[Un.value]||(_n.detail?_n.detail[Un.value]:null);Hn||(Hn=!0,Rn(on.findNext(this,gn)))};In.name?Tn.addEventListener(In.name,Cn,{once:!0}):In.time!=null&&setTimeout(Cn,In.time,In.time)}})}},rn}else{var un;return Jr.matchToken("a")?(Jr.requireToken("tick"),un=0):un=nn.requireElement("expression",Jr),rn={type:"waitCmd",time:un,args:[un],op:function(gn,En){return new Promise(Tn=>{setTimeout(()=>{Tn(on.findNext(this,gn))},En)})},execute:function(gn){return on.unifiedExec(this,gn)}},rn}}}),xn.addGrammarElement("dotOrColonPath",function(nn,on,Jr){var rn=Jr.matchTokenType("IDENTIFIER");if(rn){var cn=[rn.value],sn=Jr.matchOpToken(".")||Jr.matchOpToken(":");if(sn)do cn.push(Jr.requireTokenType("IDENTIFIER","NUMBER").value);while(Jr.matchOpToken(sn.value));return{type:"dotOrColonPath",path:cn,evaluate:function(){return cn.join(sn?sn.value:"")}}}}),xn.addGrammarElement("eventName",function(nn,on,Jr){var rn;return(rn=Jr.matchTokenType("STRING"))?{evaluate:function(){return rn.value}}:nn.parseElement("dotOrColonPath",Jr)});function Pn(nn,on,Jr,rn){var cn=on.requireElement("eventName",rn),sn=on.parseElement("namedArgumentList",rn);if(nn==="send"&&rn.matchToken("to")||nn==="trigger"&&rn.matchToken("on"))var fn=on.requireElement("expression",rn);else var fn=on.requireElement("implicitMeTarget",rn);var un={eventName:cn,details:sn,to:fn,args:[fn,cn,sn],op:function(gn,En,Tn,Rn){return Jr.nullCheck(En,fn),Jr.implicitLoop(En,function(Hn){Jr.triggerEvent(Hn,Tn,Rn,gn.me)}),Jr.findNext(un,gn)}};return un}xn.addCommand("trigger",function(nn,on,Jr){if(Jr.matchToken("trigger"))return Pn("trigger",nn,on,Jr)}),xn.addCommand("send",function(nn,on,Jr){if(Jr.matchToken("send"))return Pn("send",nn,on,Jr)});var Nn=function(nn,on,Jr,rn){if(rn)if(nn.commandBoundary(Jr.currentToken()))nn.raiseParseError(Jr,"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.");else var cn=nn.requireElement("expression",Jr);var sn={value:cn,args:[cn],op:function(fn,un){var gn=fn.meta.resolve;return fn.meta.returned=!0,fn.meta.returnValue=un,gn&&(un?gn(un):gn()),on.HALT}};return sn};xn.addCommand("return",function(nn,on,Jr){if(Jr.matchToken("return"))return Nn(nn,on,Jr,!0)}),xn.addCommand("exit",function(nn,on,Jr){if(Jr.matchToken("exit"))return Nn(nn,on,Jr,!1)}),xn.addCommand("halt",function(nn,on,Jr){if(Jr.matchToken("halt")){if(Jr.matchToken("the")){Jr.requireToken("event"),Jr.matchOpToken("'")&&Jr.requireToken("s");var rn=!0}if(Jr.matchToken("bubbling"))var cn=!0;else if(Jr.matchToken("default"))var sn=!0;var fn=Nn(nn,on,Jr,!1),un={keepExecuting:!0,bubbling:cn,haltDefault:sn,exit:fn,op:function(gn){if(gn.event)return cn?gn.event.stopPropagation():(sn||gn.event.stopPropagation(),gn.event.preventDefault()),rn?on.findNext(this,gn):fn}};return un}}),xn.addCommand("log",function(nn,on,Jr){if(Jr.matchToken("log")){for(var rn=[nn.parseElement("expression",Jr)];Jr.matchOpToken(",");)rn.push(nn.requireElement("expression",Jr));if(Jr.matchToken("with"))var cn=nn.requireElement("expression",Jr);var sn={exprs:rn,withExpr:cn,args:[cn,rn],op:function(fn,un,gn){return un?un.apply(null,gn):console.log.apply(null,gn),on.findNext(this,fn)}};return sn}}),xn.addCommand("beep!",function(nn,on,Jr){if(Jr.matchToken("beep!")){for(var rn=[nn.parseElement("expression",Jr)];Jr.matchOpToken(",");)rn.push(nn.requireElement("expression",Jr));var cn={exprs:rn,args:[rn],op:function(sn,fn){for(let un=0;un<rn.length;un++){let gn=rn[un],En=fn[un];on.beepValueToConsole(sn.me,gn,En)}return on.findNext(this,sn)}};return cn}}),xn.addCommand("throw",function(nn,on,Jr){if(Jr.matchToken("throw")){var rn=nn.requireElement("expression",Jr),cn={expr:rn,args:[rn],op:function(sn,fn){throw on.registerHyperTrace(sn,fn),fn}};return cn}});var Dn=function(nn,on,Jr){var rn=nn.requireElement("expression",Jr),cn={expr:rn,args:[rn],op:function(sn,fn){return sn.result=fn,on.findNext(cn,sn)}};return cn};xn.addCommand("call",function(nn,on,Jr){if(Jr.matchToken("call")){var rn=Dn(nn,on,Jr);return rn.expr&&rn.expr.type!=="functionCall"&&nn.raiseParseError(Jr,"Must be a function invocation"),rn}}),xn.addCommand("get",function(nn,on,Jr){if(Jr.matchToken("get"))return Dn(nn,on,Jr)}),xn.addCommand("make",function(nn,on,Jr){if(Jr.matchToken("make")){Jr.matchToken("a")||Jr.matchToken("an");var rn=nn.requireElement("expression",Jr),cn=[];if(rn.type!=="queryRef"&&Jr.matchToken("from"))do cn.push(nn.requireElement("expression",Jr));while(Jr.matchOpToken(","));if(Jr.matchToken("called"))var sn=nn.requireElement("symbol",Jr);var fn;return rn.type==="queryRef"?(fn={op:function(un){for(var gn,En="div",Tn,Rn=[],Hn=/(?:(^|#|\.)([^#\. ]+))/g;gn=Hn.exec(rn.css);)gn[1]===""?En=gn[2].trim():gn[1]==="#"?Tn=gn[2].trim():Rn.push(gn[2].trim());var Cn=document.createElement(En);Tn!==void 0&&(Cn.id=Tn);for(var In=0;In<Rn.length;In++){var _n=Rn[In];Cn.classList.add(_n)}return un.result=Cn,sn&&on.setSymbol(sn.name,un,sn.scope,Cn),on.findNext(this,un)}},fn):(fn={args:[rn,cn],op:function(un,gn,En){return un.result=si(gn,En),sn&&on.setSymbol(sn.name,un,sn.scope,un.result),on.findNext(this,un)}},fn)}}),xn.addGrammarElement("pseudoCommand",function(nn,on,Jr){let rn=Jr.token(1);if(!(rn&&rn.op&&(rn.value==="."||rn.value==="(")))return null;for(var cn=nn.requireElement("primaryExpression",Jr),sn=cn.root,fn=cn;sn.root!=null;)fn=fn.root,sn=sn.root;if(cn.type!=="functionCall"&&nn.raiseParseError(Jr,"Pseudo-commands must be function calls"),fn.type==="functionCall"&&fn.root.root==null){if(Jr.matchAnyToken("the","to","on","with","into","from","at"))var un=nn.requireElement("expression",Jr);else if(Jr.matchToken("me"))var un=nn.requireElement("implicitMeTarget",Jr)}var gn;return un?gn={type:"pseudoCommand",root:un,argExressions:fn.argExressions,args:[un,fn.argExressions],op:function(En,Tn,Rn){on.nullCheck(Tn,un);var Hn=Tn[fn.root.name];return on.nullCheck(Hn,fn),Hn.hyperfunc&&Rn.push(En),En.result=Hn.apply(Tn,Rn),on.findNext(gn,En)},execute:function(En){return on.unifiedExec(this,En)}}:gn={type:"pseudoCommand",expr:cn,args:[cn],op:function(En,Tn){return En.result=Tn,on.findNext(gn,En)},execute:function(En){return on.unifiedExec(this,En)}},gn});var Ln=function(nn,on,Jr,rn,cn){var sn=rn.type==="symbol",fn=rn.type==="attributeRef",un=rn.type==="styleRef",gn=rn.type==="arrayIndex";!(fn||un||sn)&&rn.root==null&&nn.raiseParseError(Jr,"Can only put directly into symbols, not references");var En=null,Tn=null;if(!sn)if(fn||un){En=nn.requireElement("implicitMeTarget",Jr);var Rn=rn}else if(gn)Tn=rn.firstIndex,En=rn.root;else{Tn=rn.prop?rn.prop.value:null;var Rn=rn.attribute;En=rn.root}var Hn={target:rn,symbolWrite:sn,value:cn,args:[En,Tn,cn],op:function(Cn,In,_n,Un){return sn?on.setSymbol(rn.name,Cn,rn.scope,Un):(on.nullCheck(In,En),gn?In[_n]=Un:on.implicitLoop(In,function(ii){Rn?Rn.type==="attributeRef"?Un==null?ii.removeAttribute(Rn.name):ii.setAttribute(Rn.name,Un):ii.style[Rn.name]=Un:ii[_n]=Un})),on.findNext(this,Cn)}};return Hn};xn.addCommand("default",function(nn,on,Jr){if(Jr.matchToken("default")){var rn=nn.requireElement("assignableExpression",Jr);Jr.requireToken("to");var cn=nn.requireElement("expression",Jr),sn=Ln(nn,on,Jr,rn,cn),fn={target:rn,value:cn,setter:sn,args:[rn],op:function(un,gn){return gn?on.findNext(this,un):sn}};return sn.parent=fn,fn}}),xn.addCommand("set",function(nn,on,Jr){if(Jr.matchToken("set")){if(Jr.currentToken().type==="L_BRACE"){var rn=nn.requireElement("objectLiteral",Jr);Jr.requireToken("on");var cn=nn.requireElement("expression",Jr),sn={objectLiteral:rn,target:cn,args:[rn,cn],op:function(un,gn,En){return Object.assign(En,gn),on.findNext(this,un)}};return sn}try{Jr.pushFollow("to");var cn=nn.requireElement("assignableExpression",Jr)}finally{Jr.popFollow()}Jr.requireToken("to");var fn=nn.requireElement("expression",Jr);return Ln(nn,on,Jr,cn,fn)}}),xn.addCommand("if",function(nn,on,Jr){if(!Jr.matchToken("if"))return;var rn=nn.requireElement("expression",Jr);Jr.matchToken("then");var cn=nn.parseElement("commandList",Jr),sn=!1;let fn=Jr.matchToken("else")||Jr.matchToken("otherwise");if(fn){let En=Jr.peekToken("if");if(sn=En!=null&&En.line===fn.line,sn)var un=nn.parseElement("command",Jr);else var un=nn.parseElement("commandList",Jr)}Jr.hasMore()&&!sn&&Jr.requireToken("end");var gn={expr:rn,trueBranch:cn,falseBranch:un,args:[rn],op:function(En,Tn){return Tn?cn:un||on.findNext(this,En)}};return nn.setParent(cn,gn),nn.setParent(un,gn),gn});var Fn=function(nn,on,Jr,rn){var cn=on.currentToken(),sn;if(on.matchToken("for")||rn){var fn=on.requireTokenType("IDENTIFIER");sn=fn.value,on.requireToken("in");var un=nn.requireElement("expression",on)}else if(on.matchToken("in")){sn="it";var un=nn.requireElement("expression",on)}else if(on.matchToken("while"))var gn=nn.requireElement("expression",on);else if(on.matchToken("until")){var En=!0;if(on.matchToken("event")){var Tn=nn.requireElement("dotOrColonPath",on,"Expected event name");if(on.matchToken("from"))var Rn=nn.requireElement("expression",on)}else var gn=nn.requireElement("expression",on)}else if(!nn.commandBoundary(on.currentToken())&&on.currentToken().value!=="forever"){var Hn=nn.requireElement("expression",on);on.requireToken("times")}else{on.matchToken("forever");var Cn=!0}if(on.matchToken("index"))var fn=on.requireTokenType("IDENTIFIER"),In=fn.value;else if(on.matchToken("indexed")){on.requireToken("by");var fn=on.requireTokenType("IDENTIFIER"),In=fn.value}var _n=nn.parseElement("commandList",on);if(_n&&Tn){for(var Un=_n;Un.next;)Un=Un.next;var ii={type:"waitATick",op:function(){return new Promise(function(ui){setTimeout(function(){ui(Jr.findNext(ii))},0)})}};Un.next=ii}if(on.hasMore()&&on.requireToken("end"),sn==null){sn="_implicit_repeat_"+cn.start;var ai=sn}else var ai=sn+"_"+cn.start;var Ri={identifier:sn,indexIdentifier:In,slot:ai,expression:un,forever:Cn,times:Hn,until:En,event:Tn,on:Rn,whileExpr:gn,resolveNext:function(){return this},loop:_n,args:[gn,Hn],op:function(ui,ki,Hi){var Ci=ui.meta.iterators[ai],Ni=!1,Ca=null;if(this.forever)Ni=!0;else if(this.until)Tn?Ni=ui.meta.iterators[ai].eventFired===!1:Ni=ki!==!0;else if(gn)Ni=ki;else if(Hi)Ni=Ci.index<Hi;else{var _a=Ci.iterator.next();Ni=!_a.done,Ca=_a.value}return Ni?(Ci.value?ui.result=ui.locals[sn]=Ca:ui.result=Ci.index,In&&(ui.locals[In]=Ci.index),Ci.index++,_n):(ui.meta.iterators[ai]=null,Jr.findNext(this.parent,ui))}};nn.setParent(_n,Ri);var Bi={name:"repeatInit",args:[un,Tn,Rn],op:function(ui,ki,Hi,Ci){var Ni={index:0,value:ki,eventFired:!1};if(ui.meta.iterators[ai]=Ni,ki&&ki[Symbol.iterator]&&(Ni.iterator=ki[Symbol.iterator]()),Tn){var Ca=Ci||ui.me;Ca.addEventListener(Hi,function(_a){ui.meta.iterators[ai].eventFired=!0},{once:!0})}return Ri},execute:function(ui){return Jr.unifiedExec(this,ui)}};return nn.setParent(Ri,Bi),Bi};xn.addCommand("repeat",function(nn,on,Jr){if(Jr.matchToken("repeat"))return Fn(nn,Jr,on,!1)}),xn.addCommand("for",function(nn,on,Jr){if(Jr.matchToken("for"))return Fn(nn,Jr,on,!0)}),xn.addCommand("continue",function(nn,on,Jr){if(Jr.matchToken("continue")){var rn={op:function(cn){for(var sn=this.parent;;sn=sn.parent)if(sn==null&&nn.raiseParseError(Jr,"Command `continue` cannot be used outside of a `repeat` loop."),sn.loop!=null)return sn.resolveNext(cn)}};return rn}}),xn.addCommand("break",function(nn,on,Jr){if(Jr.matchToken("break")){var rn={op:function(cn){for(var sn=this.parent;;sn=sn.parent)if(sn==null&&nn.raiseParseError(Jr,"Command `continue` cannot be used outside of a `repeat` loop."),sn.loop!=null)return on.findNext(sn.parent,cn)}};return rn}}),xn.addGrammarElement("stringLike",function(nn,on,Jr){return nn.parseAnyOf(["string","nakedString"],Jr)}),xn.addCommand("append",function(nn,on,Jr){if(Jr.matchToken("append")){var rn=null,cn=nn.requireElement("expression",Jr),sn={type:"symbol",evaluate:function(gn){return on.resolveSymbol("result",gn)}};Jr.matchToken("to")?rn=nn.requireElement("expression",Jr):rn=sn;var fn=null;(rn.type==="symbol"||rn.type==="attributeRef"||rn.root!=null)&&(fn=Ln(nn,on,Jr,rn,sn));var un={value:cn,target:rn,args:[rn,cn],op:function(gn,En,Tn){if(Array.isArray(En))return En.push(Tn),on.findNext(this,gn);if(En instanceof Element)return Tn instanceof Element?En.insertAdjacentElement("beforeend",Tn):En.insertAdjacentHTML("beforeend",Tn),on.processNode(En),on.findNext(this,gn);if(fn)return gn.result=(En||"")+Tn,fn;throw Error("Unable to append a value!")},execute:function(gn){return on.unifiedExec(this,gn)}};return fn!=null&&(fn.parent=un),un}});function Mn(nn,on,Jr){Jr.matchToken("at")||Jr.matchToken("from");let rn={includeStart:!0,includeEnd:!1};return rn.from=Jr.matchToken("start")?0:nn.requireElement("expression",Jr),(Jr.matchToken("to")||Jr.matchOpToken(".."))&&(Jr.matchToken("end")?rn.toEnd=!0:rn.to=nn.requireElement("expression",Jr)),Jr.matchToken("inclusive")?rn.includeEnd=!0:Jr.matchToken("exclusive")&&(rn.includeStart=!1),rn}class Gn{constructor(on,Jr){this.re=on,this.str=Jr}next(){let on=this.re.exec(this.str);return on===null?{done:!0}:{value:on}}}class Wn{constructor(on,Jr,rn){this.re=on,this.flags=Jr,this.str=rn}[Symbol.iterator](){return new Gn(new RegExp(this.re,this.flags),this.str)}}xn.addCommand("pick",(nn,on,Jr)=>{if(Jr.matchToken("pick")){if(Jr.matchToken("the"),Jr.matchToken("item")||Jr.matchToken("items")||Jr.matchToken("character")||Jr.matchToken("characters")){let rn=Mn(nn,on,Jr);return Jr.requireToken("from"),{args:[nn.requireElement("expression",Jr),rn.from,rn.to],op(sn,fn,un,gn){return rn.toEnd&&(gn=fn.length),rn.includeStart||un++,rn.includeEnd&&gn++,(gn==null||gn==null)&&(gn=un+1),sn.result=fn.slice(un,gn),on.findNext(this,sn)}}}if(Jr.matchToken("match")){Jr.matchToken("of");let rn=nn.parseElement("expression",Jr),cn="";return Jr.matchOpToken("|")&&(cn=Jr.requireTokenType("IDENTIFIER").value),Jr.requireToken("from"),{args:[nn.parseElement("expression",Jr),rn],op(fn,un,gn){return fn.result=new RegExp(gn,cn).exec(un),on.findNext(this,fn)}}}if(Jr.matchToken("matches")){Jr.matchToken("of");let rn=nn.parseElement("expression",Jr),cn="gu";return Jr.matchOpToken("|")&&(cn="g"+Jr.requireTokenType("IDENTIFIER").value.replace("g","")),Jr.requireToken("from"),{args:[nn.parseElement("expression",Jr),rn],op(fn,un,gn){return fn.result=new Wn(gn,cn,un),on.findNext(this,fn)}}}}}),xn.addCommand("increment",function(nn,on,Jr){if(Jr.matchToken("increment")){var rn,cn=nn.parseElement("assignableExpression",Jr);Jr.matchToken("by")&&(rn=nn.requireElement("expression",Jr));var sn={type:"implicitIncrementOp",target:cn,args:[cn,rn],op:function(fn,un,gn){un=un?parseFloat(un):0,gn=rn?parseFloat(gn):1;var En=un+gn;return fn.result=En,En},evaluate:function(fn){return on.unifiedEval(this,fn)}};return Ln(nn,on,Jr,cn,sn)}}),xn.addCommand("decrement",function(nn,on,Jr){if(Jr.matchToken("decrement")){var rn,cn=nn.parseElement("assignableExpression",Jr);Jr.matchToken("by")&&(rn=nn.requireElement("expression",Jr));var sn={type:"implicitDecrementOp",target:cn,args:[cn,rn],op:function(fn,un,gn){un=un?parseFloat(un):0,gn=rn?parseFloat(gn):1;var En=un-gn;return fn.result=En,En},evaluate:function(fn){return on.unifiedEval(this,fn)}};return Ln(nn,on,Jr,cn,sn)}});function zn(nn,on){var Jr="text",rn;return nn.matchToken("a")||nn.matchToken("an"),nn.matchToken("json")||nn.matchToken("Object")?Jr="json":nn.matchToken("response")?Jr="response":nn.matchToken("html")?Jr="html":nn.matchToken("text")||(rn=on.requireElement("dotOrColonPath",nn).evaluate()),{type:Jr,conversion:rn}}xn.addCommand("fetch",function(nn,on,Jr){if(Jr.matchToken("fetch")){var rn=nn.requireElement("stringLike",Jr);if(Jr.matchToken("as"))var cn=zn(Jr,nn);if(Jr.matchToken("with")&&Jr.currentToken().value!=="{")var sn=nn.parseElement("nakedNamedArgumentList",Jr);else var sn=nn.parseElement("objectLiteral",Jr);cn==null&&Jr.matchToken("as")&&(cn=zn(Jr,nn));var fn=cn?cn.type:"text",un=cn?cn.conversion:null,gn={url:rn,argExpressions:sn,args:[rn,sn],op:function(En,Tn,Rn){var Hn=Rn||{};Hn.sender=En.me,Hn.headers=Hn.headers||{};var Cn=new AbortController;let In=En.me.addEventListener("fetch:abort",function(){Cn.abort()},{once:!0});Hn.signal=Cn.signal,on.triggerEvent(En.me,"hyperscript:beforeFetch",Hn),on.triggerEvent(En.me,"fetch:beforeRequest",Hn),Rn=Hn;var _n=!1;return Rn.timeout&&setTimeout(function(){_n||Cn.abort()},Rn.timeout),fetch(Tn,Rn).then(function(Un){let ii={response:Un};return on.triggerEvent(En.me,"fetch:afterResponse",ii),Un=ii.response,fn==="response"?(En.result=Un,on.triggerEvent(En.me,"fetch:afterRequest",{result:Un}),_n=!0,on.findNext(gn,En)):fn==="json"?Un.json().then(function(ai){return En.result=ai,on.triggerEvent(En.me,"fetch:afterRequest",{result:ai}),_n=!0,on.findNext(gn,En)}):Un.text().then(function(ai){return un&&(ai=on.convertValue(ai,un)),fn==="html"&&(ai=on.convertValue(ai,"Fragment")),En.result=ai,on.triggerEvent(En.me,"fetch:afterRequest",{result:ai}),_n=!0,on.findNext(gn,En)})}).catch(function(Un){throw on.triggerEvent(En.me,"fetch:error",{reason:Un}),Un}).finally(function(){En.me.removeEventListener("fetch:abort",In)})}};return gn}})}function oi(xn){xn.addCommand("settle",function(vn,bn,hn){if(hn.matchToken("settle")){if(vn.commandBoundary(hn.currentToken()))var On=vn.requireElement("implicitMeTarget",hn);else var On=vn.requireElement("expression",hn);var Pn={type:"settleCmd",args:[On],op:function(Nn,Dn){bn.nullCheck(Dn,On);var Ln=null,Fn=!1,Mn=!1,Gn=new Promise(function(Wn){Ln=Wn});return Dn.addEventListener("transitionstart",function(){Mn=!0},{once:!0}),setTimeout(function(){!Mn&&!Fn&&Ln(bn.findNext(Pn,Nn))},500),Dn.addEventListener("transitionend",function(){Fn||Ln(bn.findNext(Pn,Nn))},{once:!0}),Gn},execute:function(Nn){return bn.unifiedExec(this,Nn)}};return Pn}}),xn.addCommand("add",function(vn,bn,hn){if(hn.matchToken("add")){var On=vn.parseElement("classRef",hn),Pn=null,Nn=null;if(On==null)Pn=vn.parseElement("attributeRef",hn),Pn==null&&(Nn=vn.parseElement("styleLiteral",hn),Nn==null&&vn.raiseParseError(hn,"Expected either a class reference or attribute expression"));else for(var Dn=[On];On=vn.parseElement("classRef",hn);)Dn.push(On);if(hn.matchToken("to"))var Ln=vn.requireElement("expression",hn);else var Ln=vn.requireElement("implicitMeTarget",hn);if(hn.matchToken("when")){Nn&&vn.raiseParseError(hn,"Only class and properties are supported with a when clause");var Fn=vn.requireElement("expression",hn)}return Dn?{classRefs:Dn,to:Ln,args:[Ln,Dn],op:function(Mn,Gn,Wn){return bn.nullCheck(Gn,Ln),bn.forEach(Wn,function(zn){bn.implicitLoop(Gn,function(nn){Fn?(Mn.result=nn,bn.evaluateNoPromise(Fn,Mn)?nn instanceof Element&&nn.classList.add(zn.className):nn instanceof Element&&nn.classList.remove(zn.className),Mn.result=null):nn instanceof Element&&nn.classList.add(zn.className)})}),bn.findNext(this,Mn)}}:Pn?{type:"addCmd",attributeRef:Pn,to:Ln,args:[Ln],op:function(Mn,Gn,Wn){return bn.nullCheck(Gn,Ln),bn.implicitLoop(Gn,function(zn){Fn?(Mn.result=zn,bn.evaluateNoPromise(Fn,Mn)?zn.setAttribute(Pn.name,Pn.value):zn.removeAttribute(Pn.name),Mn.result=null):zn.setAttribute(Pn.name,Pn.value)}),bn.findNext(this,Mn)},execute:function(Mn){return bn.unifiedExec(this,Mn)}}:{type:"addCmd",cssDeclaration:Nn,to:Ln,args:[Ln,Nn],op:function(Mn,Gn,Wn){return bn.nullCheck(Gn,Ln),bn.implicitLoop(Gn,function(zn){zn.style.cssText+=Wn}),bn.findNext(this,Mn)},execute:function(Mn){return bn.unifiedExec(this,Mn)}}}}),xn.addGrammarElement("styleLiteral",function(vn,bn,hn){if(hn.matchOpToken("{")){for(var On=[""],Pn=[];hn.hasMore();){if(hn.matchOpToken("\\"))hn.consumeToken();else{if(hn.matchOpToken("}"))break;if(hn.matchToken("$")){var Nn=hn.matchOpToken("{"),Dn=vn.parseElement("expression",hn);Nn&&hn.requireOpToken("}"),Pn.push(Dn),On.push("")}else{var Ln=hn.consumeToken();On[On.length-1]+=hn.source.substring(Ln.start,Ln.end)}}On[On.length-1]+=hn.lastWhitespace()}return{type:"styleLiteral",args:[Pn],op:function(Fn,Mn){var Gn="";return On.forEach(function(Wn,zn){Gn+=Wn,zn in Mn&&(Gn+=Mn[zn])}),Gn},evaluate:function(Fn){return bn.unifiedEval(this,Fn)}}}}),xn.addCommand("remove",function(vn,bn,hn){if(hn.matchToken("remove")){var On=vn.parseElement("classRef",hn),Pn=null,Nn=null;if(On==null)Pn=vn.parseElement("attributeRef",hn),Pn==null&&(Nn=vn.parseElement("expression",hn),Nn==null&&vn.raiseParseError(hn,"Expected either a class reference, attribute expression or value expression"));else for(var Dn=[On];On=vn.parseElement("classRef",hn);)Dn.push(On);if(hn.matchToken("from"))var Ln=vn.requireElement("expression",hn);else if(Nn==null)var Ln=vn.requireElement("implicitMeTarget",hn);return Nn?{elementExpr:Nn,from:Ln,args:[Nn,Ln],op:function(Fn,Mn,Gn){return bn.nullCheck(Mn,Nn),bn.implicitLoop(Mn,function(Wn){Wn.parentElement&&(Gn==null||Gn.contains(Wn))&&Wn.parentElement.removeChild(Wn)}),bn.findNext(this,Fn)}}:{classRefs:Dn,attributeRef:Pn,elementExpr:Nn,from:Ln,args:[Dn,Ln],op:function(Fn,Mn,Gn){return bn.nullCheck(Gn,Ln),Mn?bn.forEach(Mn,function(Wn){bn.implicitLoop(Gn,function(zn){zn.classList.remove(Wn.className)})}):bn.implicitLoop(Gn,function(Wn){Wn.removeAttribute(Pn.name)}),bn.findNext(this,Fn)}}}}),xn.addCommand("toggle",function(vn,bn,hn){if(hn.matchToken("toggle")){if(hn.matchAnyToken("the","my"),hn.currentToken().type==="STYLE_REF"){var On=hn.consumeToken().value.substr(1),Pn=!0,Nn=pn(vn,hn,On);if(hn.matchToken("of")){hn.pushFollow("with");try{var Dn=vn.requireElement("expression",hn)}finally{hn.popFollow()}}else var Dn=vn.requireElement("implicitMeTarget",hn)}else if(hn.matchToken("between")){var Ln=!0,Fn=vn.parseElement("classRef",hn);hn.requireToken("and");var Mn=vn.requireElement("classRef",hn)}else{var Fn=vn.parseElement("classRef",hn),Gn=null;if(Fn==null)Gn=vn.parseElement("attributeRef",hn),Gn==null&&vn.raiseParseError(hn,"Expected either a class reference or attribute expression");else for(var Wn=[Fn];Fn=vn.parseElement("classRef",hn);)Wn.push(Fn)}if(Pn!==!0)if(hn.matchToken("on"))var Dn=vn.requireElement("expression",hn);else var Dn=vn.requireElement("implicitMeTarget",hn);if(hn.matchToken("for"))var zn=vn.requireElement("expression",hn);else if(hn.matchToken("until")){var nn=vn.requireElement("dotOrColonPath",hn,"Expected event name");if(hn.matchToken("from"))var on=vn.requireElement("expression",hn)}var Jr={classRef:Fn,classRef2:Mn,classRefs:Wn,attributeRef:Gn,on:Dn,time:zn,evt:nn,from:on,toggle:function(rn,cn,sn,fn){bn.nullCheck(rn,Dn),Pn?bn.implicitLoop(rn,function(un){Nn("toggle",un)}):Ln?bn.implicitLoop(rn,function(un){un.classList.contains(cn.className)?(un.classList.remove(cn.className),un.classList.add(sn.className)):(un.classList.add(cn.className),un.classList.remove(sn.className))}):fn?bn.forEach(fn,function(un){bn.implicitLoop(rn,function(gn){gn.classList.toggle(un.className)})}):bn.implicitLoop(rn,function(un){un.hasAttribute(Gn.name)?un.removeAttribute(Gn.name):un.setAttribute(Gn.name,Gn.value)})},args:[Dn,zn,nn,on,Fn,Mn,Wn],op:function(rn,cn,sn,fn,un,gn,En,Tn){return sn?new Promise(function(Rn){Jr.toggle(cn,gn,En,Tn),setTimeout(function(){Jr.toggle(cn,gn,En,Tn),Rn(bn.findNext(Jr,rn))},sn)}):fn?new Promise(function(Rn){var Hn=un||rn.me;Hn.addEventListener(fn,function(){Jr.toggle(cn,gn,En,Tn),Rn(bn.findNext(Jr,rn))},{once:!0}),Jr.toggle(cn,gn,En,Tn)}):(this.toggle(cn,gn,En,Tn),bn.findNext(Jr,rn))}};return Jr}});var en={display:function(vn,bn,hn){if(hn)bn.style.display=hn;else if(vn==="toggle")getComputedStyle(bn).display==="none"?en.display("show",bn,hn):en.display("hide",bn,hn);else if(vn==="hide"){let On=xn.runtime.getInternalData(bn);On.originalDisplay==null&&(On.originalDisplay=bn.style.display),bn.style.display="none"}else{let On=xn.runtime.getInternalData(bn);On.originalDisplay&&On.originalDisplay!=="none"?bn.style.display=On.originalDisplay:bn.style.removeProperty("display")}},visibility:function(vn,bn,hn){hn?bn.style.visibility=hn:vn==="toggle"?getComputedStyle(bn).visibility==="hidden"?en.visibility("show",bn,hn):en.visibility("hide",bn,hn):vn==="hide"?bn.style.visibility="hidden":bn.style.visibility="visible"},opacity:function(vn,bn,hn){hn?bn.style.opacity=hn:vn==="toggle"?getComputedStyle(bn).opacity==="0"?en.opacity("show",bn,hn):en.opacity("hide",bn,hn):vn==="hide"?bn.style.opacity="0":bn.style.opacity="1"}},an=function(vn,bn,hn){var On,Pn=hn.currentToken();return Pn.value==="when"||Pn.value==="with"||vn.commandBoundary(Pn)?On=vn.parseElement("implicitMeTarget",hn):On=vn.parseElement("expression",hn),On},pn=function(vn,bn,hn){var On=Wr.defaultHideShowStrategy,Pn=en;Wr.hideShowStrategies&&(Pn=Object.assign(Pn,Wr.hideShowStrategies)),hn=hn||On||"display";var Nn=Pn[hn];return Nn==null&&vn.raiseParseError(bn,"Unknown show/hide strategy : "+hn),Nn};xn.addCommand("hide",function(vn,bn,hn){if(hn.matchToken("hide")){var On=an(vn,bn,hn),Pn=null;hn.matchToken("with")&&(Pn=hn.requireTokenType("IDENTIFIER","STYLE_REF").value,Pn.indexOf("*")===0&&(Pn=Pn.substr(1)));var Nn=pn(vn,hn,Pn);return{target:On,args:[On],op:function(Dn,Ln){return bn.nullCheck(Ln,On),bn.implicitLoop(Ln,function(Fn){Nn("hide",Fn)}),bn.findNext(this,Dn)}}}}),xn.addCommand("show",function(vn,bn,hn){if(hn.matchToken("show")){var On=an(vn,bn,hn),Pn=null;hn.matchToken("with")&&(Pn=hn.requireTokenType("IDENTIFIER","STYLE_REF").value,Pn.indexOf("*")===0&&(Pn=Pn.substr(1)));var Nn=null;if(hn.matchOpToken(":")){var Dn=hn.consumeUntilWhitespace();hn.matchTokenType("WHITESPACE"),Nn=Dn.map(function(Mn){return Mn.value}).join("")}if(hn.matchToken("when"))var Ln=vn.requireElement("expression",hn);var Fn=pn(vn,hn,Pn);return{target:On,when:Ln,args:[On],op:function(Mn,Gn){return bn.nullCheck(Gn,On),bn.implicitLoop(Gn,function(Wn){Ln?(Mn.result=Wn,bn.evaluateNoPromise(Ln,Mn)?Fn("show",Wn,Nn):Fn("hide",Wn),Mn.result=null):Fn("show",Wn,Nn)}),bn.findNext(this,Mn)}}}}),xn.addCommand("take",function(vn,bn,hn){if(hn.matchToken("take")){let Fn=null,Mn=[];for(;Fn=vn.parseElement("classRef",hn);)Mn.push(Fn);var On=null,Pn=null;let Gn=Mn.length>0;if(Gn||(On=vn.parseElement("attributeRef",hn),On==null&&vn.raiseParseError(hn,"Expected either a class reference or attribute expression"),hn.matchToken("with")&&(Pn=vn.requireElement("expression",hn))),hn.matchToken("from"))var Nn=vn.requireElement("expression",hn);if(hn.matchToken("for"))var Dn=vn.requireElement("expression",hn);else var Dn=vn.requireElement("implicitMeTarget",hn);if(Gn){var Ln={classRefs:Mn,from:Nn,forElt:Dn,args:[Mn,Nn,Dn],op:function(Wn,zn,nn,on){return bn.nullCheck(on,Dn),bn.implicitLoop(zn,function(Jr){var rn=Jr.className;nn?bn.implicitLoop(nn,function(cn){cn.classList.remove(rn)}):bn.implicitLoop(Jr,function(cn){cn.classList.remove(rn)}),bn.implicitLoop(on,function(cn){cn.classList.add(rn)})}),bn.findNext(this,Wn)}};return Ln}else{var Ln={attributeRef:On,from:Nn,forElt:Dn,args:[Nn,Dn,Pn],op:function(zn,nn,on,Jr){return bn.nullCheck(nn,Nn),bn.nullCheck(on,Dn),bn.implicitLoop(nn,function(rn){Jr?rn.setAttribute(On.name,Jr):rn.removeAttribute(On.name)}),bn.implicitLoop(on,function(rn){rn.setAttribute(On.name,On.value||"")}),bn.findNext(this,zn)}};return Ln}}});function mn(vn,bn,hn,On){if(hn!=null)var Pn=vn.resolveSymbol(hn,bn);else var Pn=bn;if(Pn instanceof Element||Pn instanceof HTMLDocument){for(;Pn.firstChild;)Pn.removeChild(Pn.firstChild);Pn.append(xn.runtime.convertValue(On,"Fragment")),vn.processNode(Pn)}else if(hn!=null)vn.setSymbol(hn,bn,null,On);else throw"Don't know how to put a value into "+typeof bn}xn.addCommand("put",function(vn,bn,hn){if(hn.matchToken("put")){var On=vn.requireElement("expression",hn),Pn=hn.matchAnyToken("into","before","after");Pn==null&&hn.matchToken("at")&&(hn.matchToken("the"),Pn=hn.matchAnyToken("start","end"),hn.requireToken("of")),Pn==null&&vn.raiseParseError(hn,"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'");var Nn=vn.requireElement("expression",hn),Dn=Pn.value,Ln=!1,Fn=!1,Mn=null,Gn=null;if(Nn.type==="arrayIndex"&&Dn==="into")Ln=!0,Gn=Nn.prop,Mn=Nn.root;else if(Nn.prop&&Nn.root&&Dn==="into")Gn=Nn.prop.value,Mn=Nn.root;else if(Nn.type==="symbol"&&Dn==="into")Fn=!0,Gn=Nn.name;else if(Nn.type==="attributeRef"&&Dn==="into"){var Wn=!0;Gn=Nn.name,Mn=vn.requireElement("implicitMeTarget",hn)}else if(Nn.type==="styleRef"&&Dn==="into"){var zn=!0;Gn=Nn.name,Mn=vn.requireElement("implicitMeTarget",hn)}else if(Nn.attribute&&Dn==="into"){var Wn=Nn.attribute.type==="attributeRef",zn=Nn.attribute.type==="styleRef";Gn=Nn.attribute.name,Mn=Nn.root}else Mn=Nn;var nn={target:Nn,operation:Dn,symbolWrite:Fn,value:On,args:[Mn,Gn,On],op:function(on,Jr,rn,cn){if(Fn)mn(bn,on,rn,cn);else if(bn.nullCheck(Jr,Mn),Dn==="into")Wn?bn.implicitLoop(Jr,function(fn){fn.setAttribute(rn,cn)}):zn?bn.implicitLoop(Jr,function(fn){fn.style[rn]=cn}):Ln?Jr[rn]=cn:bn.implicitLoop(Jr,function(fn){mn(bn,fn,rn,cn)});else{var sn=Dn==="before"?Element.prototype.before:Dn==="after"?Element.prototype.after:Dn==="start"?Element.prototype.prepend:Element.prototype.append;bn.implicitLoop(Jr,function(fn){sn.call(fn,cn instanceof Node?cn:bn.convertValue(cn,"Fragment")),fn.parentElement?bn.processNode(fn.parentElement):bn.processNode(fn)})}return bn.findNext(this,on)}};return nn}});function wn(vn,bn,hn){var On;if(hn.matchToken("the")||hn.matchToken("element")||hn.matchToken("elements")||hn.currentToken().type==="CLASS_REF"||hn.currentToken().type==="ID_REF"||hn.currentToken().op&&hn.currentToken().value==="<"){vn.possessivesDisabled=!0;try{On=vn.parseElement("expression",hn)}finally{delete vn.possessivesDisabled}hn.matchOpToken("'")&&hn.requireToken("s")}else if(hn.currentToken().type==="IDENTIFIER"&&hn.currentToken().value==="its"){var Pn=hn.matchToken("its");On={type:"pseudopossessiveIts",token:Pn,name:Pn.value,evaluate:function(Nn){return bn.resolveSymbol("it",Nn)}}}else hn.matchToken("my")||hn.matchToken("me"),On=vn.parseElement("implicitMeTarget",hn);return On}xn.addCommand("transition",function(vn,bn,hn){if(hn.matchToken("transition")){for(var On=wn(vn,bn,hn),Pn=[],Nn=[],Dn=[],Ln=hn.currentToken();!vn.commandBoundary(Ln)&&Ln.value!=="over"&&Ln.value!=="using";){if(hn.currentToken().type==="STYLE_REF"){let zn=hn.consumeToken().value.substr(1);Pn.push({type:"styleRefValue",evaluate:function(){return zn}})}else Pn.push(vn.requireElement("stringLike",hn));hn.matchToken("from")?Nn.push(vn.requireElement("expression",hn)):Nn.push(null),hn.requireToken("to"),hn.matchToken("initial")?Dn.push({type:"initial_literal",evaluate:function(){return"initial"}}):Dn.push(vn.requireElement("expression",hn)),Ln=hn.currentToken()}if(hn.matchToken("over"))var Fn=vn.requireElement("expression",hn);else if(hn.matchToken("using"))var Mn=vn.requireElement("expression",hn);var Gn={to:Dn,args:[On,Pn,Nn,Dn,Mn,Fn],op:function(Wn,zn,nn,on,Jr,rn,cn){bn.nullCheck(zn,On);var sn=[];return bn.implicitLoop(zn,function(fn){var un=new Promise(function(gn,En){var Tn=fn.style.transition;cn?fn.style.transition="all "+cn+"ms ease-in":rn?fn.style.transition=rn:fn.style.transition=Wr.defaultTransition;for(var Rn=bn.getInternalData(fn),Hn=getComputedStyle(fn),Cn={},In=0;In<Hn.length;In++){var _n=Hn[In],Un=Hn[_n];Cn[_n]=Un}Rn.initialStyles||(Rn.initialStyles=Cn);for(var In=0;In<nn.length;In++){var ii=nn[In],ai=on[In];ai==="computed"||ai==null?fn.style[ii]=Cn[ii]:fn.style[ii]=ai}var Ri=!1,Bi=!1;fn.addEventListener("transitionend",function(){Bi||(fn.style.transition=Tn,Bi=!0,gn())},{once:!0}),fn.addEventListener("transitionstart",function(){Ri=!0},{once:!0}),setTimeout(function(){!Bi&&!Ri&&(fn.style.transition=Tn,Bi=!0,gn())},100),setTimeout(function(){for(var ui=[],ki=0;ki<nn.length;ki++){var Hi=nn[ki],Ci=Jr[ki];if(Ci==="initial"){var Ni=Rn.initialStyles[Hi];fn.style[Hi]=Ni}else fn.style[Hi]=Ci}},0)});sn.push(un)}),Promise.all(sn).then(function(){return bn.findNext(Gn,Wn)})}};return Gn}}),xn.addCommand("measure",function(vn,bn,hn){if(hn.matchToken("measure")){var On=wn(vn,bn,hn),Pn=[];if(!vn.commandBoundary(hn.currentToken()))do Pn.push(hn.matchTokenType("IDENTIFIER").value);while(hn.matchOpToken(","));return{properties:Pn,args:[On],op:function(Nn,Dn){bn.nullCheck(Dn,On),0 in Dn&&(Dn=Dn[0]);var Ln=Dn.getBoundingClientRect(),Fn={top:Dn.scrollTop,left:Dn.scrollLeft,topMax:Dn.scrollTopMax,leftMax:Dn.scrollLeftMax,height:Dn.scrollHeight,width:Dn.scrollWidth};return Nn.result={x:Ln.x,y:Ln.y,left:Ln.left,top:Ln.top,right:Ln.right,bottom:Ln.bottom,width:Ln.width,height:Ln.height,bounds:Ln,scrollLeft:Fn.left,scrollTop:Fn.top,scrollLeftMax:Fn.leftMax,scrollTopMax:Fn.topMax,scrollWidth:Fn.width,scrollHeight:Fn.height,scroll:Fn},bn.forEach(Pn,function(Mn){if(Mn in Nn.result)Nn.locals[Mn]=Nn.result[Mn];else throw"No such measurement as "+Mn}),bn.findNext(this,Nn)}}}}),xn.addLeafExpression("closestExpr",function(vn,bn,hn){if(hn.matchToken("closest")){if(hn.matchToken("parent"))var On=!0;var Pn=null;if(hn.currentToken().type==="ATTRIBUTE_REF"){var Nn=vn.requireElement("attributeRefAccess",hn,null);Pn="["+Nn.attribute.name+"]"}if(Pn==null){var Dn=vn.requireElement("expression",hn);Dn.css==null?vn.raiseParseError(hn,"Expected a CSS expression"):Pn=Dn.css}if(hn.matchToken("to"))var Ln=vn.parseElement("expression",hn);else var Ln=vn.parseElement("implicitMeTarget",hn);var Fn={type:"closestExpr",parentSearch:On,expr:Dn,css:Pn,to:Ln,args:[Ln],op:function(Mn,Gn){if(Gn==null)return null;{let Wn=[];return bn.implicitLoop(Gn,function(zn){On?Wn.push(zn.parentElement?zn.parentElement.closest(Pn):null):Wn.push(zn.closest(Pn))}),bn.shouldAutoIterate(Gn)?Wn:Wn[0]}},evaluate:function(Mn){return bn.unifiedEval(this,Mn)}};return Nn?(Nn.root=Fn,Nn.args=[Fn],Nn):Fn}}),xn.addCommand("go",function(vn,bn,hn){if(hn.matchToken("go")){if(hn.matchToken("back"))var On=!0;else if(hn.matchToken("to"),hn.matchToken("url")){var Pn=vn.requireElement("stringLike",hn),Nn=!0;if(hn.matchToken("in")){hn.requireToken("new"),hn.requireToken("window");var Dn=!0}}else{hn.matchToken("the");var Ln=hn.matchAnyToken("top","middle","bottom"),Fn=hn.matchAnyToken("left","center","right");(Ln||Fn)&&hn.requireToken("of");var Pn=vn.requireElement("unaryExpression",hn),Mn=hn.matchAnyOpToken("+","-");if(Mn){hn.pushFollow("px");try{var Gn=vn.requireElement("expression",hn)}finally{hn.popFollow()}}hn.matchToken("px");var Wn=hn.matchAnyToken("smoothly","instantly"),zn={block:"start",inline:"nearest"};Ln&&(Ln.value==="top"?zn.block="start":Ln.value==="bottom"?zn.block="end":Ln.value==="middle"&&(zn.block="center")),Fn&&(Fn.value==="left"?zn.inline="start":Fn.value==="center"?zn.inline="center":Fn.value==="right"&&(zn.inline="end")),Wn&&(Wn.value==="smoothly"?zn.behavior="smooth":Wn.value==="instantly"&&(zn.behavior="instant"))}var nn={target:Pn,args:[Pn,Gn],op:function(on,Jr,rn){return On?window.history.back():Nn?Jr&&(Dn?window.open(Jr):window.location.href=Jr):bn.implicitLoop(Jr,function(cn){if(cn===window&&(cn=document.body),Mn){let sn=cn.getBoundingClientRect(),fn=document.createElement("div"),un=Mn.value==="+"?rn:rn*-1,gn=zn.inline=="start"||zn.inline=="end"?un:0,En=zn.block=="start"||zn.block=="end"?un:0;fn.style.position="absolute",fn.style.top=sn.top+window.scrollY+En+"px",fn.style.left=sn.left+window.scrollX+gn+"px",fn.style.height=sn.height+"px",fn.style.width=sn.width+"px",fn.style.zIndex=""+Number.MIN_SAFE_INTEGER,fn.style.opacity="0",document.body.appendChild(fn),setTimeout(function(){document.body.removeChild(fn)},100),cn=fn}cn.scrollIntoView(zn)}),bn.findNext(nn,on)}};return nn}}),Wr.conversions.dynamicResolvers.push(function(vn,bn){if(!(vn==="Values"||vn.indexOf("Values:")===0))return;var hn=vn.split(":")[1],On={},Pn=xn.runtime.implicitLoop.bind(xn.runtime);if(Pn(bn,function(Ln){var Fn=Dn(Ln);if(Fn!==void 0){On[Fn.name]=Fn.value;return}if(Ln.querySelectorAll!=null){var Mn=Ln.querySelectorAll("input,select,textarea");Mn.forEach(Nn)}}),hn){if(hn==="JSON")return JSON.stringify(On);if(hn==="Form")return new URLSearchParams(On).toString();throw"Unknown conversion: "+hn}else return On;function Nn(Ln){var Fn=Dn(Ln);if(Fn!=null){if(On[Fn.name]==null){On[Fn.name]=Fn.value;return}if(Array.isArray(On[Fn.name])&&Array.isArray(Fn.value)){On[Fn.name]=[].concat(On[Fn.name],Fn.value);return}}}function Dn(Ln){try{var Fn={name:Ln.name,value:Ln.value};if(Fn.name==null||Fn.value==null||Ln.type=="radio"&&Ln.checked==!1)return;if(Ln.type=="checkbox"&&(Ln.checked==!1?Fn.value=void 0:typeof Fn.value=="string"&&(Fn.value=[Fn.value])),Ln.type=="select-multiple"){var Mn=Ln.querySelectorAll("option[selected]");Fn.value=[];for(var Gn=0;Gn<Mn.length;Gn++)Fn.value.push(Mn[Gn].value)}return Fn}catch{return}}}),Wr.conversions.HTML=function(vn){var bn=function(hn){if(hn instanceof Array)return hn.map(function(Dn){return bn(Dn)}).join("");if(hn instanceof HTMLElement)return hn.outerHTML;if(hn instanceof NodeList){for(var On="",Pn=0;Pn<hn.length;Pn++){var Nn=hn[Pn];Nn instanceof HTMLElement&&(On+=Nn.outerHTML)}return On}return hn.toString?hn.toString():""};return bn(vn)},Wr.conversions.Fragment=function(vn){var bn=document.createDocumentFragment();return xn.runtime.implicitLoop(vn,function(hn){if(hn instanceof Node)bn.append(hn);else{var On=document.createElement("template");On.innerHTML=hn,bn.append(On.content)}}),bn}}let Jn=new tn,gi=Jn.lexer,li=Jn.parser;function Ui(xn,en){return Jn.evaluate(xn,en)}function vi(){var xn=Array.from(Qr.document.querySelectorAll("script[type='text/hyperscript'][src]"));Promise.all(xn.map(function(mn){return fetch(mn.src).then(function(wn){return wn.text()})})).then(mn=>mn.forEach(wn=>ni(wn))).then(()=>en(function(){pn(),Jn.processNode(document.documentElement),document.dispatchEvent(new Event("hyperscript:ready")),Qr.document.addEventListener("htmx:load",function(mn){Jn.processNode(mn.detail.elt)})}));function en(mn){document.readyState!=="loading"?setTimeout(mn):document.addEventListener("DOMContentLoaded",mn)}function an(){var mn=document.querySelector('meta[name="htmx-config"]');return mn?Vn(mn.content):null}function pn(){var mn=an();mn&&Object.assign(Wr,mn)}}let ni=Object.assign(Ui,{config:Wr,use(xn){xn(ni)},internals:{lexer:gi,parser:li,runtime:Jn,Lexer:Kr,Tokens:Yr,Parser:Zr,Runtime:tn},ElementCollection:An,addFeature:li.addFeature.bind(li),addCommand:li.addCommand.bind(li),addLeafExpression:li.addLeafExpression.bind(li),addIndirectExpression:li.addIndirectExpression.bind(li),evaluate:Jn.evaluate.bind(Jn),parse:Jn.parse.bind(Jn),processNode:Jn.processNode.bind(Jn),version:"0.9.14",browserInit:vi});return ni})});var Ws=za(mo()),Xs=za(is());function Js(Qr,Gr){var Wr=Object.keys(Qr);if(Object.getOwnPropertySymbols){var Kr=Object.getOwnPropertySymbols(Qr);Gr&&(Kr=Kr.filter(function(Yr){return Object.getOwnPropertyDescriptor(Qr,Yr).enumerable})),Wr.push.apply(Wr,Kr)}return Wr}function Qi(Qr){for(var Gr=1;Gr<arguments.length;Gr++){var Wr=arguments[Gr]!=null?arguments[Gr]:{};Gr%2?Js(Object(Wr),!0).forEach(function(Kr){au(Qr,Kr,Wr[Kr])}):Object.getOwnPropertyDescriptors?Object.defineProperties(Qr,Object.getOwnPropertyDescriptors(Wr)):Js(Object(Wr)).forEach(function(Kr){Object.defineProperty(Qr,Kr,Object.getOwnPropertyDescriptor(Wr,Kr))})}return Qr}function To(Qr){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?To=function(Gr){return typeof Gr}:To=function(Gr){return Gr&&typeof Symbol=="function"&&Gr.constructor===Symbol&&Gr!==Symbol.prototype?"symbol":typeof Gr},To(Qr)}function au(Qr,Gr,Wr){return Gr in Qr?Object.defineProperty(Qr,Gr,{value:Wr,enumerable:!0,configurable:!0,writable:!0}):Qr[Gr]=Wr,Qr}function ta(){return ta=Object.assign||function(Qr){for(var Gr=1;Gr<arguments.length;Gr++){var Wr=arguments[Gr];for(var Kr in Wr)Object.prototype.hasOwnProperty.call(Wr,Kr)&&(Qr[Kr]=Wr[Kr])}return Qr},ta.apply(this,arguments)}function ou(Qr,Gr){if(Qr==null)return{};var Wr={},Kr=Object.keys(Qr),Yr,Zr;for(Zr=0;Zr<Kr.length;Zr++)Yr=Kr[Zr],!(Gr.indexOf(Yr)>=0)&&(Wr[Yr]=Qr[Yr]);return Wr}function su(Qr,Gr){if(Qr==null)return{};var Wr=ou(Qr,Gr),Kr,Yr;if(Object.getOwnPropertySymbols){var Zr=Object.getOwnPropertySymbols(Qr);for(Yr=0;Yr<Zr.length;Yr++)Kr=Zr[Yr],!(Gr.indexOf(Kr)>=0)&&Object.prototype.propertyIsEnumerable.call(Qr,Kr)&&(Wr[Kr]=Qr[Kr])}return Wr}var lu="1.15.6";function ea(Qr){if(typeof window<"u"&&window.navigator)return!!navigator.userAgent.match(Qr)}var ra=ea(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Za=ea(/Edge/i),Zs=ea(/firefox/i),Qa=ea(/safari/i)&&!ea(/chrome/i)&&!ea(/android/i),ys=ea(/iP(ad|od|hone)/i),sl=ea(/chrome/i)&&ea(/android/i),ll={capture:!1,passive:!1};function ei(Qr,Gr,Wr){Qr.addEventListener(Gr,Wr,!ra&&ll)}function Zn(Qr,Gr,Wr){Qr.removeEventListener(Gr,Wr,!ra&&ll)}function Co(Qr,Gr){if(Gr){if(Gr[0]===">"&&(Gr=Gr.substring(1)),Qr)try{if(Qr.matches)return Qr.matches(Gr);if(Qr.msMatchesSelector)return Qr.msMatchesSelector(Gr);if(Qr.webkitMatchesSelector)return Qr.webkitMatchesSelector(Gr)}catch{return!1}return!1}}function ul(Qr){return Qr.host&&Qr!==document&&Qr.host.nodeType?Qr.host:Qr.parentNode}function Vi(Qr,Gr,Wr,Kr){if(Qr){Wr=Wr||document;do{if(Gr!=null&&(Gr[0]===">"?Qr.parentNode===Wr&&Co(Qr,Gr):Co(Qr,Gr))||Kr&&Qr===Wr)return Qr;if(Qr===Wr)break}while(Qr=ul(Qr))}return null}var el=/\s+/g;function Mi(Qr,Gr,Wr){if(Qr&&Gr)if(Qr.classList)Qr.classList[Wr?"add":"remove"](Gr);else{var Kr=(" "+Qr.className+" ").replace(el," ").replace(" "+Gr+" "," ");Qr.className=(Kr+(Wr?" "+Gr:"")).replace(el," ")}}function Xn(Qr,Gr,Wr){var Kr=Qr&&Qr.style;if(Kr){if(Wr===void 0)return document.defaultView&&document.defaultView.getComputedStyle?Wr=document.defaultView.getComputedStyle(Qr,""):Qr.currentStyle&&(Wr=Qr.currentStyle),Gr===void 0?Wr:Wr[Gr];!(Gr in Kr)&&Gr.indexOf("webkit")===-1&&(Gr="-webkit-"+Gr),Kr[Gr]=Wr+(typeof Wr=="string"?"":"px")}}function Na(Qr,Gr){var Wr="";if(typeof Qr=="string")Wr=Qr;else do{var Kr=Xn(Qr,"transform");Kr&&Kr!=="none"&&(Wr=Kr+" "+Wr)}while(!Gr&&(Qr=Qr.parentNode));var Yr=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return Yr&&new Yr(Wr)}function cl(Qr,Gr,Wr){if(Qr){var Kr=Qr.getElementsByTagName(Gr),Yr=0,Zr=Kr.length;if(Wr)for(;Yr<Zr;Yr++)Wr(Kr[Yr],Yr);return Kr}return[]}function Xi(){var Qr=document.scrollingElement;return Qr||document.documentElement}function bi(Qr,Gr,Wr,Kr,Yr){if(!(!Qr.getBoundingClientRect&&Qr!==window)){var Zr,tn,ln,dn,yn,Sn,kn;if(Qr!==window&&Qr.parentNode&&Qr!==Xi()?(Zr=Qr.getBoundingClientRect(),tn=Zr.top,ln=Zr.left,dn=Zr.bottom,yn=Zr.right,Sn=Zr.height,kn=Zr.width):(tn=0,ln=0,dn=window.innerHeight,yn=window.innerWidth,Sn=window.innerHeight,kn=window.innerWidth),(Gr||Wr)&&Qr!==window&&(Yr=Yr||Qr.parentNode,!ra))do if(Yr&&Yr.getBoundingClientRect&&(Xn(Yr,"transform")!=="none"||Wr&&Xn(Yr,"position")!=="static")){var An=Yr.getBoundingClientRect();tn-=An.top+parseInt(Xn(Yr,"border-top-width")),ln-=An.left+parseInt(Xn(Yr,"border-left-width")),dn=tn+Zr.height,yn=ln+Zr.width;break}while(Yr=Yr.parentNode);if(Kr&&Qr!==window){var Bn=Na(Yr||Qr),jn=Bn&&Bn.a,Vn=Bn&&Bn.d;Bn&&(tn/=Vn,ln/=jn,kn/=jn,Sn/=Vn,dn=tn+Sn,yn=ln+kn)}return{top:tn,left:ln,bottom:dn,right:yn,width:kn,height:Sn}}}function tl(Qr,Gr,Wr){for(var Kr=la(Qr,!0),Yr=bi(Qr)[Gr];Kr;){var Zr=bi(Kr)[Wr],tn=void 0;if(Wr==="top"||Wr==="left"?tn=Yr>=Zr:tn=Yr<=Zr,!tn)return Kr;if(Kr===Xi())break;Kr=la(Kr,!1)}return!1}function La(Qr,Gr,Wr,Kr){for(var Yr=0,Zr=0,tn=Qr.children;Zr<tn.length;){if(tn[Zr].style.display!=="none"&&tn[Zr]!==Qn.ghost&&(Kr||tn[Zr]!==Qn.dragged)&&Vi(tn[Zr],Wr.draggable,Qr,!1)){if(Yr===Gr)return tn[Zr];Yr++}Zr++}return null}function bs(Qr,Gr){for(var Wr=Qr.lastElementChild;Wr&&(Wr===Qn.ghost||Xn(Wr,"display")==="none"||Gr&&!Co(Wr,Gr));)Wr=Wr.previousElementSibling;return Wr||null}function Gi(Qr,Gr){var Wr=0;if(!Qr||!Qr.parentNode)return-1;for(;Qr=Qr.previousElementSibling;)Qr.nodeName.toUpperCase()!=="TEMPLATE"&&Qr!==Qn.clone&&(!Gr||Co(Qr,Gr))&&Wr++;return Wr}function rl(Qr){var Gr=0,Wr=0,Kr=Xi();if(Qr)do{var Yr=Na(Qr),Zr=Yr.a,tn=Yr.d;Gr+=Qr.scrollLeft*Zr,Wr+=Qr.scrollTop*tn}while(Qr!==Kr&&(Qr=Qr.parentNode));return[Gr,Wr]}function uu(Qr,Gr){for(var Wr in Qr)if(Qr.hasOwnProperty(Wr)){for(var Kr in Gr)if(Gr.hasOwnProperty(Kr)&&Gr[Kr]===Qr[Wr][Kr])return Number(Wr)}return-1}function la(Qr,Gr){if(!Qr||!Qr.getBoundingClientRect)return Xi();var Wr=Qr,Kr=!1;do if(Wr.clientWidth<Wr.scrollWidth||Wr.clientHeight<Wr.scrollHeight){var Yr=Xn(Wr);if(Wr.clientWidth<Wr.scrollWidth&&(Yr.overflowX=="auto"||Yr.overflowX=="scroll")||Wr.clientHeight<Wr.scrollHeight&&(Yr.overflowY=="auto"||Yr.overflowY=="scroll")){if(!Wr.getBoundingClientRect||Wr===document.body)return Xi();if(Kr||Gr)return Wr;Kr=!0}}while(Wr=Wr.parentNode);return Xi()}function cu(Qr,Gr){if(Qr&&Gr)for(var Wr in Gr)Gr.hasOwnProperty(Wr)&&(Qr[Wr]=Gr[Wr]);return Qr}function as(Qr,Gr){return Math.round(Qr.top)===Math.round(Gr.top)&&Math.round(Qr.left)===Math.round(Gr.left)&&Math.round(Qr.height)===Math.round(Gr.height)&&Math.round(Qr.width)===Math.round(Gr.width)}var Ka;function fl(Qr,Gr){return function(){if(!Ka){var Wr=arguments,Kr=this;Wr.length===1?Qr.call(Kr,Wr[0]):Qr.apply(Kr,Wr),Ka=setTimeout(function(){Ka=void 0},Gr)}}}function fu(){clearTimeout(Ka),Ka=void 0}function hl(Qr,Gr,Wr){Qr.scrollLeft+=Gr,Qr.scrollTop+=Wr}function dl(Qr){var Gr=window.Polymer,Wr=window.jQuery||window.Zepto;return Gr&&Gr.dom?Gr.dom(Qr).cloneNode(!0):Wr?Wr(Qr).clone(!0)[0]:Qr.cloneNode(!0)}function pl(Qr,Gr,Wr){var Kr={};return Array.from(Qr.children).forEach(function(Yr){var Zr,tn,ln,dn;if(!(!Vi(Yr,Gr.draggable,Qr,!1)||Yr.animated||Yr===Wr)){var yn=bi(Yr);Kr.left=Math.min((Zr=Kr.left)!==null&&Zr!==void 0?Zr:1/0,yn.left),Kr.top=Math.min((tn=Kr.top)!==null&&tn!==void 0?tn:1/0,yn.top),Kr.right=Math.max((ln=Kr.right)!==null&&ln!==void 0?ln:-1/0,yn.right),Kr.bottom=Math.max((dn=Kr.bottom)!==null&&dn!==void 0?dn:-1/0,yn.bottom)}}),Kr.width=Kr.right-Kr.left,Kr.height=Kr.bottom-Kr.top,Kr.x=Kr.left,Kr.y=Kr.top,Kr}var Pi="Sortable"+new Date().getTime();function hu(){var Qr=[],Gr;return{captureAnimationState:function(){if(Qr=[],!!this.options.animation){var Kr=[].slice.call(this.el.children);Kr.forEach(function(Yr){if(!(Xn(Yr,"display")==="none"||Yr===Qn.ghost)){Qr.push({target:Yr,rect:bi(Yr)});var Zr=Qi({},Qr[Qr.length-1].rect);if(Yr.thisAnimationDuration){var tn=Na(Yr,!0);tn&&(Zr.top-=tn.f,Zr.left-=tn.e)}Yr.fromRect=Zr}})}},addAnimationState:function(Kr){Qr.push(Kr)},removeAnimationState:function(Kr){Qr.splice(uu(Qr,{target:Kr}),1)},animateAll:function(Kr){var Yr=this;if(!this.options.animation){clearTimeout(Gr),typeof Kr=="function"&&Kr();return}var Zr=!1,tn=0;Qr.forEach(function(ln){var dn=0,yn=ln.target,Sn=yn.fromRect,kn=bi(yn),An=yn.prevFromRect,Bn=yn.prevToRect,jn=ln.rect,Vn=Na(yn,!0);Vn&&(kn.top-=Vn.f,kn.left-=Vn.e),yn.toRect=kn,yn.thisAnimationDuration&&as(An,kn)&&!as(Sn,kn)&&(jn.top-kn.top)/(jn.left-kn.left)===(Sn.top-kn.top)/(Sn.left-kn.left)&&(dn=pu(jn,An,Bn,Yr.options)),as(kn,Sn)||(yn.prevFromRect=Sn,yn.prevToRect=kn,dn||(dn=Yr.options.animation),Yr.animate(yn,jn,kn,dn)),dn&&(Zr=!0,tn=Math.max(tn,dn),clearTimeout(yn.animationResetTimer),yn.animationResetTimer=setTimeout(function(){yn.animationTime=0,yn.prevFromRect=null,yn.fromRect=null,yn.prevToRect=null,yn.thisAnimationDuration=null},dn),yn.thisAnimationDuration=dn)}),clearTimeout(Gr),Zr?Gr=setTimeout(function(){typeof Kr=="function"&&Kr()},tn):typeof Kr=="function"&&Kr(),Qr=[]},animate:function(Kr,Yr,Zr,tn){if(tn){Xn(Kr,"transition",""),Xn(Kr,"transform","");var ln=Na(this.el),dn=ln&&ln.a,yn=ln&&ln.d,Sn=(Yr.left-Zr.left)/(dn||1),kn=(Yr.top-Zr.top)/(yn||1);Kr.animatingX=!!Sn,Kr.animatingY=!!kn,Xn(Kr,"transform","translate3d("+Sn+"px,"+kn+"px,0)"),this.forRepaintDummy=du(Kr),Xn(Kr,"transition","transform "+tn+"ms"+(this.options.easing?" "+this.options.easing:"")),Xn(Kr,"transform","translate3d(0,0,0)"),typeof Kr.animated=="number"&&clearTimeout(Kr.animated),Kr.animated=setTimeout(function(){Xn(Kr,"transition",""),Xn(Kr,"transform",""),Kr.animated=!1,Kr.animatingX=!1,Kr.animatingY=!1},tn)}}}}function du(Qr){return Qr.offsetWidth}function pu(Qr,Gr,Wr,Kr){return Math.sqrt(Math.pow(Gr.top-Qr.top,2)+Math.pow(Gr.left-Qr.left,2))/Math.sqrt(Math.pow(Gr.top-Wr.top,2)+Math.pow(Gr.left-Wr.left,2))*Kr.animation}var Aa=[],os={initializeByDefault:!0},eo={mount:function(Gr){for(var Wr in os)os.hasOwnProperty(Wr)&&!(Wr in Gr)&&(Gr[Wr]=os[Wr]);Aa.forEach(function(Kr){if(Kr.pluginName===Gr.pluginName)throw"Sortable: Cannot mount plugin ".concat(Gr.pluginName," more than once")}),Aa.push(Gr)},pluginEvent:function(Gr,Wr,Kr){var Yr=this;this.eventCanceled=!1,Kr.cancel=function(){Yr.eventCanceled=!0};var Zr=Gr+"Global";Aa.forEach(function(tn){Wr[tn.pluginName]&&(Wr[tn.pluginName][Zr]&&Wr[tn.pluginName][Zr](Qi({sortable:Wr},Kr)),Wr.options[tn.pluginName]&&Wr[tn.pluginName][Gr]&&Wr[tn.pluginName][Gr](Qi({sortable:Wr},Kr)))})},initializePlugins:function(Gr,Wr,Kr,Yr){Aa.forEach(function(ln){var dn=ln.pluginName;if(!(!Gr.options[dn]&&!ln.initializeByDefault)){var yn=new ln(Gr,Wr,Gr.options);yn.sortable=Gr,yn.options=Gr.options,Gr[dn]=yn,ta(Kr,yn.defaults)}});for(var Zr in Gr.options)if(Gr.options.hasOwnProperty(Zr)){var tn=this.modifyOption(Gr,Zr,Gr.options[Zr]);typeof tn<"u"&&(Gr.options[Zr]=tn)}},getEventProperties:function(Gr,Wr){var Kr={};return Aa.forEach(function(Yr){typeof Yr.eventProperties=="function"&&ta(Kr,Yr.eventProperties.call(Wr[Yr.pluginName],Gr))}),Kr},modifyOption:function(Gr,Wr,Kr){var Yr;return Aa.forEach(function(Zr){Gr[Zr.pluginName]&&Zr.optionListeners&&typeof Zr.optionListeners[Wr]=="function"&&(Yr=Zr.optionListeners[Wr].call(Gr[Zr.pluginName],Kr))}),Yr}};function mu(Qr){var Gr=Qr.sortable,Wr=Qr.rootEl,Kr=Qr.name,Yr=Qr.targetEl,Zr=Qr.cloneEl,tn=Qr.toEl,ln=Qr.fromEl,dn=Qr.oldIndex,yn=Qr.newIndex,Sn=Qr.oldDraggableIndex,kn=Qr.newDraggableIndex,An=Qr.originalEvent,Bn=Qr.putSortable,jn=Qr.extraEventProperties;if(Gr=Gr||Wr&&Wr[Pi],!!Gr){var Vn,ti=Gr.options,si="on"+Kr.charAt(0).toUpperCase()+Kr.substr(1);window.CustomEvent&&!ra&&!Za?Vn=new CustomEvent(Kr,{bubbles:!0,cancelable:!0}):(Vn=document.createEvent("Event"),Vn.initEvent(Kr,!0,!0)),Vn.to=tn||Wr,Vn.from=ln||Wr,Vn.item=Yr||Wr,Vn.clone=Zr,Vn.oldIndex=dn,Vn.newIndex=yn,Vn.oldDraggableIndex=Sn,Vn.newDraggableIndex=kn,Vn.originalEvent=An,Vn.pullMode=Bn?Bn.lastPutMode:void 0;var ri=Qi(Qi({},jn),eo.getEventProperties(Kr,Gr));for(var oi in ri)Vn[oi]=ri[oi];Wr&&Wr.dispatchEvent(Vn),ti[si]&&ti[si].call(Gr,Vn)}}var gu=["evt"],Di=function(Gr,Wr){var Kr=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},Yr=Kr.evt,Zr=su(Kr,gu);eo.pluginEvent.bind(Qn)(Gr,Wr,Qi({dragEl:qn,parentEl:di,ghostEl:Yn,rootEl:fi,nextEl:va,lastDownEl:xo,cloneEl:hi,cloneHidden:sa,dragStarted:Va,putSortable:wi,activeSortable:Qn.active,originalEvent:Yr,oldIndex:Ra,oldDraggableIndex:Ya,newIndex:Fi,newDraggableIndex:oa,hideGhostForTarget:yl,unhideGhostForTarget:bl,cloneNowHidden:function(){sa=!0},cloneNowShown:function(){sa=!1},dispatchSortableEvent:function(ln){Oi({sortable:Wr,name:ln,originalEvent:Yr})}},Zr))};function Oi(Qr){mu(Qi({putSortable:wi,cloneEl:hi,targetEl:qn,rootEl:fi,oldIndex:Ra,oldDraggableIndex:Ya,newIndex:Fi,newDraggableIndex:oa},Qr))}var qn,di,Yn,fi,va,xo,hi,sa,Ra,Fi,Ya,oa,vo,wi,Pa=!1,Io=!1,Oo=[],ma,zi,ss,ls,nl,il,Va,Da,$a,Ja=!1,yo=!1,So,Ii,us=[],ps=!1,Ao=[],Po=typeof document<"u",bo=ys,al=Za||ra?"cssFloat":"float",vu=Po&&!sl&&!ys&&"draggable"in document.createElement("div"),ml=function(){if(Po){if(ra)return!1;var Qr=document.createElement("x");return Qr.style.cssText="pointer-events:auto",Qr.style.pointerEvents==="auto"}}(),gl=function(Gr,Wr){var Kr=Xn(Gr),Yr=parseInt(Kr.width)-parseInt(Kr.paddingLeft)-parseInt(Kr.paddingRight)-parseInt(Kr.borderLeftWidth)-parseInt(Kr.borderRightWidth),Zr=La(Gr,0,Wr),tn=La(Gr,1,Wr),ln=Zr&&Xn(Zr),dn=tn&&Xn(tn),yn=ln&&parseInt(ln.marginLeft)+parseInt(ln.marginRight)+bi(Zr).width,Sn=dn&&parseInt(dn.marginLeft)+parseInt(dn.marginRight)+bi(tn).width;if(Kr.display==="flex")return Kr.flexDirection==="column"||Kr.flexDirection==="column-reverse"?"vertical":"horizontal";if(Kr.display==="grid")return Kr.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(Zr&&ln.float&&ln.float!=="none"){var kn=ln.float==="left"?"left":"right";return tn&&(dn.clear==="both"||dn.clear===kn)?"vertical":"horizontal"}return Zr&&(ln.display==="block"||ln.display==="flex"||ln.display==="table"||ln.display==="grid"||yn>=Yr&&Kr[al]==="none"||tn&&Kr[al]==="none"&&yn+Sn>Yr)?"vertical":"horizontal"},yu=function(Gr,Wr,Kr){var Yr=Kr?Gr.left:Gr.top,Zr=Kr?Gr.right:Gr.bottom,tn=Kr?Gr.width:Gr.height,ln=Kr?Wr.left:Wr.top,dn=Kr?Wr.right:Wr.bottom,yn=Kr?Wr.width:Wr.height;return Yr===ln||Zr===dn||Yr+tn/2===ln+yn/2},bu=function(Gr,Wr){var Kr;return Oo.some(function(Yr){var Zr=Yr[Pi].options.emptyInsertThreshold;if(!(!Zr||bs(Yr))){var tn=bi(Yr),ln=Gr>=tn.left-Zr&&Gr<=tn.right+Zr,dn=Wr>=tn.top-Zr&&Wr<=tn.bottom+Zr;if(ln&&dn)return Kr=Yr}}),Kr},vl=function(Gr){function Wr(Zr,tn){return function(ln,dn,yn,Sn){var kn=ln.options.group.name&&dn.options.group.name&&ln.options.group.name===dn.options.group.name;if(Zr==null&&(tn||kn))return!0;if(Zr==null||Zr===!1)return!1;if(tn&&Zr==="clone")return Zr;if(typeof Zr=="function")return Wr(Zr(ln,dn,yn,Sn),tn)(ln,dn,yn,Sn);var An=(tn?ln:dn).options.group.name;return Zr===!0||typeof Zr=="string"&&Zr===An||Zr.join&&Zr.indexOf(An)>-1}}var Kr={},Yr=Gr.group;(!Yr||To(Yr)!="object")&&(Yr={name:Yr}),Kr.name=Yr.name,Kr.checkPull=Wr(Yr.pull,!0),Kr.checkPut=Wr(Yr.put),Kr.revertClone=Yr.revertClone,Gr.group=Kr},yl=function(){!ml&&Yn&&Xn(Yn,"display","none")},bl=function(){!ml&&Yn&&Xn(Yn,"display","")};Po&&!sl&&document.addEventListener("click",function(Qr){if(Io)return Qr.preventDefault(),Qr.stopPropagation&&Qr.stopPropagation(),Qr.stopImmediatePropagation&&Qr.stopImmediatePropagation(),Io=!1,!1},!0);var ga=function(Gr){if(qn){Gr=Gr.touches?Gr.touches[0]:Gr;var Wr=bu(Gr.clientX,Gr.clientY);if(Wr){var Kr={};for(var Yr in Gr)Gr.hasOwnProperty(Yr)&&(Kr[Yr]=Gr[Yr]);Kr.target=Kr.rootEl=Wr,Kr.preventDefault=void 0,Kr.stopPropagation=void 0,Wr[Pi]._onDragOver(Kr)}}},Eu=function(Gr){qn&&qn.parentNode[Pi]._isOutsideThisEl(Gr.target)};function Qn(Qr,Gr){if(!(Qr&&Qr.nodeType&&Qr.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(Qr));this.el=Qr,this.options=Gr=ta({},Gr),Qr[Pi]=this;var Wr={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(Qr.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return gl(Qr,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(tn,ln){tn.setData("Text",ln.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Qn.supportPointer!==!1&&"PointerEvent"in window&&(!Qa||ys),emptyInsertThreshold:5};eo.initializePlugins(this,Qr,Wr);for(var Kr in Wr)!(Kr in Gr)&&(Gr[Kr]=Wr[Kr]);vl(Gr);for(var Yr in this)Yr.charAt(0)==="_"&&typeof this[Yr]=="function"&&(this[Yr]=this[Yr].bind(this));this.nativeDraggable=Gr.forceFallback?!1:vu,this.nativeDraggable&&(this.options.touchStartThreshold=1),Gr.supportPointer?ei(Qr,"pointerdown",this._onTapStart):(ei(Qr,"mousedown",this._onTapStart),ei(Qr,"touchstart",this._onTapStart)),this.nativeDraggable&&(ei(Qr,"dragover",this),ei(Qr,"dragenter",this)),Oo.push(this.el),Gr.store&&Gr.store.get&&this.sort(Gr.store.get(this)||[]),ta(this,hu())}Qn.prototype={constructor:Qn,_isOutsideThisEl:function(Gr){!this.el.contains(Gr)&&Gr!==this.el&&(Da=null)},_getDirection:function(Gr,Wr){return typeof this.options.direction=="function"?this.options.direction.call(this,Gr,Wr,qn):this.options.direction},_onTapStart:function(Gr){if(Gr.cancelable){var Wr=this,Kr=this.el,Yr=this.options,Zr=Yr.preventOnFilter,tn=Gr.type,ln=Gr.touches&&Gr.touches[0]||Gr.pointerType&&Gr.pointerType==="touch"&&Gr,dn=(ln||Gr).target,yn=Gr.target.shadowRoot&&(Gr.path&&Gr.path[0]||Gr.composedPath&&Gr.composedPath()[0])||dn,Sn=Yr.filter;if(Ou(Kr),!qn&&!(/mousedown|pointerdown/.test(tn)&&Gr.button!==0||Yr.disabled)&&!yn.isContentEditable&&!(!this.nativeDraggable&&Qa&&dn&&dn.tagName.toUpperCase()==="SELECT")&&(dn=Vi(dn,Yr.draggable,Kr,!1),!(dn&&dn.animated)&&xo!==dn)){if(Ra=Gi(dn),Ya=Gi(dn,Yr.draggable),typeof Sn=="function"){if(Sn.call(this,Gr,dn,this)){Oi({sortable:Wr,rootEl:yn,name:"filter",targetEl:dn,toEl:Kr,fromEl:Kr}),Di("filter",Wr,{evt:Gr}),Zr&&Gr.preventDefault();return}}else if(Sn&&(Sn=Sn.split(",").some(function(kn){if(kn=Vi(yn,kn.trim(),Kr,!1),kn)return Oi({sortable:Wr,rootEl:kn,name:"filter",targetEl:dn,fromEl:Kr,toEl:Kr}),Di("filter",Wr,{evt:Gr}),!0}),Sn)){Zr&&Gr.preventDefault();return}Yr.handle&&!Vi(yn,Yr.handle,Kr,!1)||this._prepareDragStart(Gr,ln,dn)}}},_prepareDragStart:function(Gr,Wr,Kr){var Yr=this,Zr=Yr.el,tn=Yr.options,ln=Zr.ownerDocument,dn;if(Kr&&!qn&&Kr.parentNode===Zr){var yn=bi(Kr);if(fi=Zr,qn=Kr,di=qn.parentNode,va=qn.nextSibling,xo=Kr,vo=tn.group,Qn.dragged=qn,ma={target:qn,clientX:(Wr||Gr).clientX,clientY:(Wr||Gr).clientY},nl=ma.clientX-yn.left,il=ma.clientY-yn.top,this._lastX=(Wr||Gr).clientX,this._lastY=(Wr||Gr).clientY,qn.style["will-change"]="all",dn=function(){if(Di("delayEnded",Yr,{evt:Gr}),Qn.eventCanceled){Yr._onDrop();return}Yr._disableDelayedDragEvents(),!Zs&&Yr.nativeDraggable&&(qn.draggable=!0),Yr._triggerDragStart(Gr,Wr),Oi({sortable:Yr,name:"choose",originalEvent:Gr}),Mi(qn,tn.chosenClass,!0)},tn.ignore.split(",").forEach(function(Sn){cl(qn,Sn.trim(),cs)}),ei(ln,"dragover",ga),ei(ln,"mousemove",ga),ei(ln,"touchmove",ga),tn.supportPointer?(ei(ln,"pointerup",Yr._onDrop),!this.nativeDraggable&&ei(ln,"pointercancel",Yr._onDrop)):(ei(ln,"mouseup",Yr._onDrop),ei(ln,"touchend",Yr._onDrop),ei(ln,"touchcancel",Yr._onDrop)),Zs&&this.nativeDraggable&&(this.options.touchStartThreshold=4,qn.draggable=!0),Di("delayStart",this,{evt:Gr}),tn.delay&&(!tn.delayOnTouchOnly||Wr)&&(!this.nativeDraggable||!(Za||ra))){if(Qn.eventCanceled){this._onDrop();return}tn.supportPointer?(ei(ln,"pointerup",Yr._disableDelayedDrag),ei(ln,"pointercancel",Yr._disableDelayedDrag)):(ei(ln,"mouseup",Yr._disableDelayedDrag),ei(ln,"touchend",Yr._disableDelayedDrag),ei(ln,"touchcancel",Yr._disableDelayedDrag)),ei(ln,"mousemove",Yr._delayedDragTouchMoveHandler),ei(ln,"touchmove",Yr._delayedDragTouchMoveHandler),tn.supportPointer&&ei(ln,"pointermove",Yr._delayedDragTouchMoveHandler),Yr._dragStartTimer=setTimeout(dn,tn.delay)}else dn()}},_delayedDragTouchMoveHandler:function(Gr){var Wr=Gr.touches?Gr.touches[0]:Gr;Math.max(Math.abs(Wr.clientX-this._lastX),Math.abs(Wr.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){qn&&cs(qn),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var Gr=this.el.ownerDocument;Zn(Gr,"mouseup",this._disableDelayedDrag),Zn(Gr,"touchend",this._disableDelayedDrag),Zn(Gr,"touchcancel",this._disableDelayedDrag),Zn(Gr,"pointerup",this._disableDelayedDrag),Zn(Gr,"pointercancel",this._disableDelayedDrag),Zn(Gr,"mousemove",this._delayedDragTouchMoveHandler),Zn(Gr,"touchmove",this._delayedDragTouchMoveHandler),Zn(Gr,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(Gr,Wr){Wr=Wr||Gr.pointerType=="touch"&&Gr,!this.nativeDraggable||Wr?this.options.supportPointer?ei(document,"pointermove",this._onTouchMove):Wr?ei(document,"touchmove",this._onTouchMove):ei(document,"mousemove",this._onTouchMove):(ei(qn,"dragend",this),ei(fi,"dragstart",this._onDragStart));try{document.selection?wo(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(Gr,Wr){if(Pa=!1,fi&&qn){Di("dragStarted",this,{evt:Wr}),this.nativeDraggable&&ei(document,"dragover",Eu);var Kr=this.options;!Gr&&Mi(qn,Kr.dragClass,!1),Mi(qn,Kr.ghostClass,!0),Qn.active=this,Gr&&this._appendGhost(),Oi({sortable:this,name:"start",originalEvent:Wr})}else this._nulling()},_emulateDragOver:function(){if(zi){this._lastX=zi.clientX,this._lastY=zi.clientY,yl();for(var Gr=document.elementFromPoint(zi.clientX,zi.clientY),Wr=Gr;Gr&&Gr.shadowRoot&&(Gr=Gr.shadowRoot.elementFromPoint(zi.clientX,zi.clientY),Gr!==Wr);)Wr=Gr;if(qn.parentNode[Pi]._isOutsideThisEl(Gr),Wr)do{if(Wr[Pi]){var Kr=void 0;if(Kr=Wr[Pi]._onDragOver({clientX:zi.clientX,clientY:zi.clientY,target:Gr,rootEl:Wr}),Kr&&!this.options.dragoverBubble)break}Gr=Wr}while(Wr=ul(Wr));bl()}},_onTouchMove:function(Gr){if(ma){var Wr=this.options,Kr=Wr.fallbackTolerance,Yr=Wr.fallbackOffset,Zr=Gr.touches?Gr.touches[0]:Gr,tn=Yn&&Na(Yn,!0),ln=Yn&&tn&&tn.a,dn=Yn&&tn&&tn.d,yn=bo&&Ii&&rl(Ii),Sn=(Zr.clientX-ma.clientX+Yr.x)/(ln||1)+(yn?yn[0]-us[0]:0)/(ln||1),kn=(Zr.clientY-ma.clientY+Yr.y)/(dn||1)+(yn?yn[1]-us[1]:0)/(dn||1);if(!Qn.active&&!Pa){if(Kr&&Math.max(Math.abs(Zr.clientX-this._lastX),Math.abs(Zr.clientY-this._lastY))<Kr)return;this._onDragStart(Gr,!0)}if(Yn){tn?(tn.e+=Sn-(ss||0),tn.f+=kn-(ls||0)):tn={a:1,b:0,c:0,d:1,e:Sn,f:kn};var An="matrix(".concat(tn.a,",").concat(tn.b,",").concat(tn.c,",").concat(tn.d,",").concat(tn.e,",").concat(tn.f,")");Xn(Yn,"webkitTransform",An),Xn(Yn,"mozTransform",An),Xn(Yn,"msTransform",An),Xn(Yn,"transform",An),ss=Sn,ls=kn,zi=Zr}Gr.cancelable&&Gr.preventDefault()}},_appendGhost:function(){if(!Yn){var Gr=this.options.fallbackOnBody?document.body:fi,Wr=bi(qn,!0,bo,!0,Gr),Kr=this.options;if(bo){for(Ii=Gr;Xn(Ii,"position")==="static"&&Xn(Ii,"transform")==="none"&&Ii!==document;)Ii=Ii.parentNode;Ii!==document.body&&Ii!==document.documentElement?(Ii===document&&(Ii=Xi()),Wr.top+=Ii.scrollTop,Wr.left+=Ii.scrollLeft):Ii=Xi(),us=rl(Ii)}Yn=qn.cloneNode(!0),Mi(Yn,Kr.ghostClass,!1),Mi(Yn,Kr.fallbackClass,!0),Mi(Yn,Kr.dragClass,!0),Xn(Yn,"transition",""),Xn(Yn,"transform",""),Xn(Yn,"box-sizing","border-box"),Xn(Yn,"margin",0),Xn(Yn,"top",Wr.top),Xn(Yn,"left",Wr.left),Xn(Yn,"width",Wr.width),Xn(Yn,"height",Wr.height),Xn(Yn,"opacity","0.8"),Xn(Yn,"position",bo?"absolute":"fixed"),Xn(Yn,"zIndex","100000"),Xn(Yn,"pointerEvents","none"),Qn.ghost=Yn,Gr.appendChild(Yn),Xn(Yn,"transform-origin",nl/parseInt(Yn.style.width)*100+"% "+il/parseInt(Yn.style.height)*100+"%")}},_onDragStart:function(Gr,Wr){var Kr=this,Yr=Gr.dataTransfer,Zr=Kr.options;if(Di("dragStart",this,{evt:Gr}),Qn.eventCanceled){this._onDrop();return}Di("setupClone",this),Qn.eventCanceled||(hi=dl(qn),hi.removeAttribute("id"),hi.draggable=!1,hi.style["will-change"]="",this._hideClone(),Mi(hi,this.options.chosenClass,!1),Qn.clone=hi),Kr.cloneId=wo(function(){Di("clone",Kr),!Qn.eventCanceled&&(Kr.options.removeCloneOnHide||fi.insertBefore(hi,qn),Kr._hideClone(),Oi({sortable:Kr,name:"clone"}))}),!Wr&&Mi(qn,Zr.dragClass,!0),Wr?(Io=!0,Kr._loopId=setInterval(Kr._emulateDragOver,50)):(Zn(document,"mouseup",Kr._onDrop),Zn(document,"touchend",Kr._onDrop),Zn(document,"touchcancel",Kr._onDrop),Yr&&(Yr.effectAllowed="move",Zr.setData&&Zr.setData.call(Kr,Yr,qn)),ei(document,"drop",Kr),Xn(qn,"transform","translateZ(0)")),Pa=!0,Kr._dragStartId=wo(Kr._dragStarted.bind(Kr,Wr,Gr)),ei(document,"selectstart",Kr),Va=!0,window.getSelection().removeAllRanges(),Qa&&Xn(document.body,"user-select","none")},_onDragOver:function(Gr){var Wr=this.el,Kr=Gr.target,Yr,Zr,tn,ln=this.options,dn=ln.group,yn=Qn.active,Sn=vo===dn,kn=ln.sort,An=wi||yn,Bn,jn=this,Vn=!1;if(ps)return;function ti(hn,On){Di(hn,jn,Qi({evt:Gr,isOwner:Sn,axis:Bn?"vertical":"horizontal",revert:tn,dragRect:Yr,targetRect:Zr,canSort:kn,fromSortable:An,target:Kr,completed:ri,onMove:function(Nn,Dn){return Eo(fi,Wr,qn,Yr,Nn,bi(Nn),Gr,Dn)},changed:oi},On))}function si(){ti("dragOverAnimationCapture"),jn.captureAnimationState(),jn!==An&&An.captureAnimationState()}function ri(hn){return ti("dragOverCompleted",{insertion:hn}),hn&&(Sn?yn._hideClone():yn._showClone(jn),jn!==An&&(Mi(qn,wi?wi.options.ghostClass:yn.options.ghostClass,!1),Mi(qn,ln.ghostClass,!0)),wi!==jn&&jn!==Qn.active?wi=jn:jn===Qn.active&&wi&&(wi=null),An===jn&&(jn._ignoreWhileAnimating=Kr),jn.animateAll(function(){ti("dragOverAnimationComplete"),jn._ignoreWhileAnimating=null}),jn!==An&&(An.animateAll(),An._ignoreWhileAnimating=null)),(Kr===qn&&!qn.animated||Kr===Wr&&!Kr.animated)&&(Da=null),!ln.dragoverBubble&&!Gr.rootEl&&Kr!==document&&(qn.parentNode[Pi]._isOutsideThisEl(Gr.target),!hn&&ga(Gr)),!ln.dragoverBubble&&Gr.stopPropagation&&Gr.stopPropagation(),Vn=!0}function oi(){Fi=Gi(qn),oa=Gi(qn,ln.draggable),Oi({sortable:jn,name:"change",toEl:Wr,newIndex:Fi,newDraggableIndex:oa,originalEvent:Gr})}if(Gr.preventDefault!==void 0&&Gr.cancelable&&Gr.preventDefault(),Kr=Vi(Kr,ln.draggable,Wr,!0),ti("dragOver"),Qn.eventCanceled)return Vn;if(qn.contains(Gr.target)||Kr.animated&&Kr.animatingX&&Kr.animatingY||jn._ignoreWhileAnimating===Kr)return ri(!1);if(Io=!1,yn&&!ln.disabled&&(Sn?kn||(tn=di!==fi):wi===this||(this.lastPutMode=vo.checkPull(this,yn,qn,Gr))&&dn.checkPut(this,yn,qn,Gr))){if(Bn=this._getDirection(Gr,Kr)==="vertical",Yr=bi(qn),ti("dragOverValid"),Qn.eventCanceled)return Vn;if(tn)return di=fi,si(),this._hideClone(),ti("revert"),Qn.eventCanceled||(va?fi.insertBefore(qn,va):fi.appendChild(qn)),ri(!0);var Jn=bs(Wr,ln.draggable);if(!Jn||wu(Gr,Bn,this)&&!Jn.animated){if(Jn===qn)return ri(!1);if(Jn&&Wr===Gr.target&&(Kr=Jn),Kr&&(Zr=bi(Kr)),Eo(fi,Wr,qn,Yr,Kr,Zr,Gr,!!Kr)!==!1)return si(),Jn&&Jn.nextSibling?Wr.insertBefore(qn,Jn.nextSibling):Wr.appendChild(qn),di=Wr,oi(),ri(!0)}else if(Jn&&Su(Gr,Bn,this)){var gi=La(Wr,0,ln,!0);if(gi===qn)return ri(!1);if(Kr=gi,Zr=bi(Kr),Eo(fi,Wr,qn,Yr,Kr,Zr,Gr,!1)!==!1)return si(),Wr.insertBefore(qn,gi),di=Wr,oi(),ri(!0)}else if(Kr.parentNode===Wr){Zr=bi(Kr);var li=0,Ui,vi=qn.parentNode!==Wr,ni=!yu(qn.animated&&qn.toRect||Yr,Kr.animated&&Kr.toRect||Zr,Bn),xn=Bn?"top":"left",en=tl(Kr,"top","top")||tl(qn,"top","top"),an=en?en.scrollTop:void 0;Da!==Kr&&(Ui=Zr[xn],Ja=!1,yo=!ni&&ln.invertSwap||vi),li=ku(Gr,Kr,Zr,Bn,ni?1:ln.swapThreshold,ln.invertedSwapThreshold==null?ln.swapThreshold:ln.invertedSwapThreshold,yo,Da===Kr);var pn;if(li!==0){var mn=Gi(qn);do mn-=li,pn=di.children[mn];while(pn&&(Xn(pn,"display")==="none"||pn===Yn))}if(li===0||pn===Kr)return ri(!1);Da=Kr,$a=li;var wn=Kr.nextElementSibling,vn=!1;vn=li===1;var bn=Eo(fi,Wr,qn,Yr,Kr,Zr,Gr,vn);if(bn!==!1)return(bn===1||bn===-1)&&(vn=bn===1),ps=!0,setTimeout(xu,30),si(),vn&&!wn?Wr.appendChild(qn):Kr.parentNode.insertBefore(qn,vn?wn:Kr),en&&hl(en,0,an-en.scrollTop),di=qn.parentNode,Ui!==void 0&&!yo&&(So=Math.abs(Ui-bi(Kr)[xn])),oi(),ri(!0)}if(Wr.contains(qn))return ri(!1)}return!1},_ignoreWhileAnimating:null,_offMoveEvents:function(){Zn(document,"mousemove",this._onTouchMove),Zn(document,"touchmove",this._onTouchMove),Zn(document,"pointermove",this._onTouchMove),Zn(document,"dragover",ga),Zn(document,"mousemove",ga),Zn(document,"touchmove",ga)},_offUpEvents:function(){var Gr=this.el.ownerDocument;Zn(Gr,"mouseup",this._onDrop),Zn(Gr,"touchend",this._onDrop),Zn(Gr,"pointerup",this._onDrop),Zn(Gr,"pointercancel",this._onDrop),Zn(Gr,"touchcancel",this._onDrop),Zn(document,"selectstart",this)},_onDrop:function(Gr){var Wr=this.el,Kr=this.options;if(Fi=Gi(qn),oa=Gi(qn,Kr.draggable),Di("drop",this,{evt:Gr}),di=qn&&qn.parentNode,Fi=Gi(qn),oa=Gi(qn,Kr.draggable),Qn.eventCanceled){this._nulling();return}Pa=!1,yo=!1,Ja=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),ms(this.cloneId),ms(this._dragStartId),this.nativeDraggable&&(Zn(document,"drop",this),Zn(Wr,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),Qa&&Xn(document.body,"user-select",""),Xn(qn,"transform",""),Gr&&(Va&&(Gr.cancelable&&Gr.preventDefault(),!Kr.dropBubble&&Gr.stopPropagation()),Yn&&Yn.parentNode&&Yn.parentNode.removeChild(Yn),(fi===di||wi&&wi.lastPutMode!=="clone")&&hi&&hi.parentNode&&hi.parentNode.removeChild(hi),qn&&(this.nativeDraggable&&Zn(qn,"dragend",this),cs(qn),qn.style["will-change"]="",Va&&!Pa&&Mi(qn,wi?wi.options.ghostClass:this.options.ghostClass,!1),Mi(qn,this.options.chosenClass,!1),Oi({sortable:this,name:"unchoose",toEl:di,newIndex:null,newDraggableIndex:null,originalEvent:Gr}),fi!==di?(Fi>=0&&(Oi({rootEl:di,name:"add",toEl:di,fromEl:fi,originalEvent:Gr}),Oi({sortable:this,name:"remove",toEl:di,originalEvent:Gr}),Oi({rootEl:di,name:"sort",toEl:di,fromEl:fi,originalEvent:Gr}),Oi({sortable:this,name:"sort",toEl:di,originalEvent:Gr})),wi&&wi.save()):Fi!==Ra&&Fi>=0&&(Oi({sortable:this,name:"update",toEl:di,originalEvent:Gr}),Oi({sortable:this,name:"sort",toEl:di,originalEvent:Gr})),Qn.active&&((Fi==null||Fi===-1)&&(Fi=Ra,oa=Ya),Oi({sortable:this,name:"end",toEl:di,originalEvent:Gr}),this.save()))),this._nulling()},_nulling:function(){Di("nulling",this),fi=qn=di=Yn=va=hi=xo=sa=ma=zi=Va=Fi=oa=Ra=Ya=Da=$a=wi=vo=Qn.dragged=Qn.ghost=Qn.clone=Qn.active=null,Ao.forEach(function(Gr){Gr.checked=!0}),Ao.length=ss=ls=0},handleEvent:function(Gr){switch(Gr.type){case"drop":case"dragend":this._onDrop(Gr);break;case"dragenter":case"dragover":qn&&(this._onDragOver(Gr),Tu(Gr));break;case"selectstart":Gr.preventDefault();break}},toArray:function(){for(var Gr=[],Wr,Kr=this.el.children,Yr=0,Zr=Kr.length,tn=this.options;Yr<Zr;Yr++)Wr=Kr[Yr],Vi(Wr,tn.draggable,this.el,!1)&&Gr.push(Wr.getAttribute(tn.dataIdAttr)||Iu(Wr));return Gr},sort:function(Gr,Wr){var Kr={},Yr=this.el;this.toArray().forEach(function(Zr,tn){var ln=Yr.children[tn];Vi(ln,this.options.draggable,Yr,!1)&&(Kr[Zr]=ln)},this),Wr&&this.captureAnimationState(),Gr.forEach(function(Zr){Kr[Zr]&&(Yr.removeChild(Kr[Zr]),Yr.appendChild(Kr[Zr]))}),Wr&&this.animateAll()},save:function(){var Gr=this.options.store;Gr&&Gr.set&&Gr.set(this)},closest:function(Gr,Wr){return Vi(Gr,Wr||this.options.draggable,this.el,!1)},option:function(Gr,Wr){var Kr=this.options;if(Wr===void 0)return Kr[Gr];var Yr=eo.modifyOption(this,Gr,Wr);typeof Yr<"u"?Kr[Gr]=Yr:Kr[Gr]=Wr,Gr==="group"&&vl(Kr)},destroy:function(){Di("destroy",this);var Gr=this.el;Gr[Pi]=null,Zn(Gr,"mousedown",this._onTapStart),Zn(Gr,"touchstart",this._onTapStart),Zn(Gr,"pointerdown",this._onTapStart),this.nativeDraggable&&(Zn(Gr,"dragover",this),Zn(Gr,"dragenter",this)),Array.prototype.forEach.call(Gr.querySelectorAll("[draggable]"),function(Wr){Wr.removeAttribute("draggable")}),this._onDrop(),this._disableDelayedDragEvents(),Oo.splice(Oo.indexOf(this.el),1),this.el=Gr=null},_hideClone:function(){if(!sa){if(Di("hideClone",this),Qn.eventCanceled)return;Xn(hi,"display","none"),this.options.removeCloneOnHide&&hi.parentNode&&hi.parentNode.removeChild(hi),sa=!0}},_showClone:function(Gr){if(Gr.lastPutMode!=="clone"){this._hideClone();return}if(sa){if(Di("showClone",this),Qn.eventCanceled)return;qn.parentNode==fi&&!this.options.group.revertClone?fi.insertBefore(hi,qn):va?fi.insertBefore(hi,va):fi.appendChild(hi),this.options.group.revertClone&&this.animate(qn,hi),Xn(hi,"display",""),sa=!1}}};function Tu(Qr){Qr.dataTransfer&&(Qr.dataTransfer.dropEffect="move"),Qr.cancelable&&Qr.preventDefault()}function Eo(Qr,Gr,Wr,Kr,Yr,Zr,tn,ln){var dn,yn=Qr[Pi],Sn=yn.options.onMove,kn;return window.CustomEvent&&!ra&&!Za?dn=new CustomEvent("move",{bubbles:!0,cancelable:!0}):(dn=document.createEvent("Event"),dn.initEvent("move",!0,!0)),dn.to=Gr,dn.from=Qr,dn.dragged=Wr,dn.draggedRect=Kr,dn.related=Yr||Gr,dn.relatedRect=Zr||bi(Gr),dn.willInsertAfter=ln,dn.originalEvent=tn,Qr.dispatchEvent(dn),Sn&&(kn=Sn.call(yn,dn,tn)),kn}function cs(Qr){Qr.draggable=!1}function xu(){ps=!1}function Su(Qr,Gr,Wr){var Kr=bi(La(Wr.el,0,Wr.options,!0)),Yr=pl(Wr.el,Wr.options,Yn),Zr=10;return Gr?Qr.clientX<Yr.left-Zr||Qr.clientY<Kr.top&&Qr.clientX<Kr.right:Qr.clientY<Yr.top-Zr||Qr.clientY<Kr.bottom&&Qr.clientX<Kr.left}function wu(Qr,Gr,Wr){var Kr=bi(bs(Wr.el,Wr.options.draggable)),Yr=pl(Wr.el,Wr.options,Yn),Zr=10;return Gr?Qr.clientX>Yr.right+Zr||Qr.clientY>Kr.bottom&&Qr.clientX>Kr.left:Qr.clientY>Yr.bottom+Zr||Qr.clientX>Kr.right&&Qr.clientY>Kr.top}function ku(Qr,Gr,Wr,Kr,Yr,Zr,tn,ln){var dn=Kr?Qr.clientY:Qr.clientX,yn=Kr?Wr.height:Wr.width,Sn=Kr?Wr.top:Wr.left,kn=Kr?Wr.bottom:Wr.right,An=!1;if(!tn){if(ln&&So<yn*Yr){if(!Ja&&($a===1?dn>Sn+yn*Zr/2:dn<kn-yn*Zr/2)&&(Ja=!0),Ja)An=!0;else if($a===1?dn<Sn+So:dn>kn-So)return-$a}else if(dn>Sn+yn*(1-Yr)/2&&dn<kn-yn*(1-Yr)/2)return Cu(Gr)}return An=An||tn,An&&(dn<Sn+yn*Zr/2||dn>kn-yn*Zr/2)?dn>Sn+yn/2?1:-1:0}function Cu(Qr){return Gi(qn)<Gi(Qr)?1:-1}function Iu(Qr){for(var Gr=Qr.tagName+Qr.className+Qr.src+Qr.href+Qr.textContent,Wr=Gr.length,Kr=0;Wr--;)Kr+=Gr.charCodeAt(Wr);return Kr.toString(36)}function Ou(Qr){Ao.length=0;for(var Gr=Qr.getElementsByTagName("input"),Wr=Gr.length;Wr--;){var Kr=Gr[Wr];Kr.checked&&Ao.push(Kr)}}function wo(Qr){return setTimeout(Qr,0)}function ms(Qr){return clearTimeout(Qr)}Po&&ei(document,"touchmove",function(Qr){(Qn.active||Pa)&&Qr.cancelable&&Qr.preventDefault()});Qn.utils={on:ei,off:Zn,css:Xn,find:cl,is:function(Gr,Wr){return!!Vi(Gr,Wr,Gr,!1)},extend:cu,throttle:fl,closest:Vi,toggleClass:Mi,clone:dl,index:Gi,nextTick:wo,cancelNextTick:ms,detectDirection:gl,getChild:La,expando:Pi};Qn.get=function(Qr){return Qr[Pi]};Qn.mount=function(){for(var Qr=arguments.length,Gr=new Array(Qr),Wr=0;Wr<Qr;Wr++)Gr[Wr]=arguments[Wr];Gr[0].constructor===Array&&(Gr=Gr[0]),Gr.forEach(function(Kr){if(!Kr.prototype||!Kr.prototype.constructor)throw"Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(Kr));Kr.utils&&(Qn.utils=Qi(Qi({},Qn.utils),Kr.utils)),eo.mount(Kr)})};Qn.create=function(Qr,Gr){return new Qn(Qr,Gr)};Qn.version=lu;var yi=[],Wa,gs,vs=!1,fs,hs,Do,Xa;function Au(){function Qr(){this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0};for(var Gr in this)Gr.charAt(0)==="_"&&typeof this[Gr]=="function"&&(this[Gr]=this[Gr].bind(this))}return Qr.prototype={dragStarted:function(Wr){var Kr=Wr.originalEvent;this.sortable.nativeDraggable?ei(document,"dragover",this._handleAutoScroll):this.options.supportPointer?ei(document,"pointermove",this._handleFallbackAutoScroll):Kr.touches?ei(document,"touchmove",this._handleFallbackAutoScroll):ei(document,"mousemove",this._handleFallbackAutoScroll)},dragOverCompleted:function(Wr){var Kr=Wr.originalEvent;!this.options.dragOverBubble&&!Kr.rootEl&&this._handleAutoScroll(Kr)},drop:function(){this.sortable.nativeDraggable?Zn(document,"dragover",this._handleAutoScroll):(Zn(document,"pointermove",this._handleFallbackAutoScroll),Zn(document,"touchmove",this._handleFallbackAutoScroll),Zn(document,"mousemove",this._handleFallbackAutoScroll)),ol(),ko(),fu()},nulling:function(){Do=gs=Wa=vs=Xa=fs=hs=null,yi.length=0},_handleFallbackAutoScroll:function(Wr){this._handleAutoScroll(Wr,!0)},_handleAutoScroll:function(Wr,Kr){var Yr=this,Zr=(Wr.touches?Wr.touches[0]:Wr).clientX,tn=(Wr.touches?Wr.touches[0]:Wr).clientY,ln=document.elementFromPoint(Zr,tn);if(Do=Wr,Kr||this.options.forceAutoScrollFallback||Za||ra||Qa){ds(Wr,this.options,ln,Kr);var dn=la(ln,!0);vs&&(!Xa||Zr!==fs||tn!==hs)&&(Xa&&ol(),Xa=setInterval(function(){var yn=la(document.elementFromPoint(Zr,tn),!0);yn!==dn&&(dn=yn,ko()),ds(Wr,Yr.options,yn,Kr)},10),fs=Zr,hs=tn)}else{if(!this.options.bubbleScroll||la(ln,!0)===Xi()){ko();return}ds(Wr,this.options,la(ln,!1),!1)}}},ta(Qr,{pluginName:"scroll",initializeByDefault:!0})}function ko(){yi.forEach(function(Qr){clearInterval(Qr.pid)}),yi=[]}function ol(){clearInterval(Xa)}var ds=fl(function(Qr,Gr,Wr,Kr){if(Gr.scroll){var Yr=(Qr.touches?Qr.touches[0]:Qr).clientX,Zr=(Qr.touches?Qr.touches[0]:Qr).clientY,tn=Gr.scrollSensitivity,ln=Gr.scrollSpeed,dn=Xi(),yn=!1,Sn;gs!==Wr&&(gs=Wr,ko(),Wa=Gr.scroll,Sn=Gr.scrollFn,Wa===!0&&(Wa=la(Wr,!0)));var kn=0,An=Wa;do{var Bn=An,jn=bi(Bn),Vn=jn.top,ti=jn.bottom,si=jn.left,ri=jn.right,oi=jn.width,Jn=jn.height,gi=void 0,li=void 0,Ui=Bn.scrollWidth,vi=Bn.scrollHeight,ni=Xn(Bn),xn=Bn.scrollLeft,en=Bn.scrollTop;Bn===dn?(gi=oi<Ui&&(ni.overflowX==="auto"||ni.overflowX==="scroll"||ni.overflowX==="visible"),li=Jn<vi&&(ni.overflowY==="auto"||ni.overflowY==="scroll"||ni.overflowY==="visible")):(gi=oi<Ui&&(ni.overflowX==="auto"||ni.overflowX==="scroll"),li=Jn<vi&&(ni.overflowY==="auto"||ni.overflowY==="scroll"));var an=gi&&(Math.abs(ri-Yr)<=tn&&xn+oi<Ui)-(Math.abs(si-Yr)<=tn&&!!xn),pn=li&&(Math.abs(ti-Zr)<=tn&&en+Jn<vi)-(Math.abs(Vn-Zr)<=tn&&!!en);if(!yi[kn])for(var mn=0;mn<=kn;mn++)yi[mn]||(yi[mn]={});(yi[kn].vx!=an||yi[kn].vy!=pn||yi[kn].el!==Bn)&&(yi[kn].el=Bn,yi[kn].vx=an,yi[kn].vy=pn,clearInterval(yi[kn].pid),(an!=0||pn!=0)&&(yn=!0,yi[kn].pid=setInterval(function(){Kr&&this.layer===0&&Qn.active._onTouchMove(Do);var wn=yi[this.layer].vy?yi[this.layer].vy*ln:0,vn=yi[this.layer].vx?yi[this.layer].vx*ln:0;typeof Sn=="function"&&Sn.call(Qn.dragged.parentNode[Pi],vn,wn,Qr,Do,yi[this.layer].el)!=="continue"||hl(yi[this.layer].el,vn,wn)}.bind({layer:kn}),24))),kn++}while(Gr.bubbleScroll&&An!==dn&&(An=la(An,!1)));vs=yn}},30),El=function(Gr){var Wr=Gr.originalEvent,Kr=Gr.putSortable,Yr=Gr.dragEl,Zr=Gr.activeSortable,tn=Gr.dispatchSortableEvent,ln=Gr.hideGhostForTarget,dn=Gr.unhideGhostForTarget;if(Wr){var yn=Kr||Zr;ln();var Sn=Wr.changedTouches&&Wr.changedTouches.length?Wr.changedTouches[0]:Wr,kn=document.elementFromPoint(Sn.clientX,Sn.clientY);dn(),yn&&!yn.el.contains(kn)&&(tn("spill"),this.onSpill({dragEl:Yr,putSortable:Kr}))}};function Es(){}Es.prototype={startIndex:null,dragStart:function(Gr){var Wr=Gr.oldDraggableIndex;this.startIndex=Wr},onSpill:function(Gr){var Wr=Gr.dragEl,Kr=Gr.putSortable;this.sortable.captureAnimationState(),Kr&&Kr.captureAnimationState();var Yr=La(this.sortable.el,this.startIndex,this.options);Yr?this.sortable.el.insertBefore(Wr,Yr):this.sortable.el.appendChild(Wr),this.sortable.animateAll(),Kr&&Kr.animateAll()},drop:El};ta(Es,{pluginName:"revertOnSpill"});function Ts(){}Ts.prototype={onSpill:function(Gr){var Wr=Gr.dragEl,Kr=Gr.putSortable,Yr=Kr||this.sortable;Yr.captureAnimationState(),Wr.parentNode&&Wr.parentNode.removeChild(Wr),Yr.animateAll()},drop:El};ta(Ts,{pluginName:"removeOnSpill"});Qn.mount(new Au);Qn.mount(Ts,Es);var Tl=Qn;var Ro=class{observerInitialized=!1;layoutMode;containerSelector;spacing;masonryBreakpoint;constructor(Gr={}){this.layoutMode=Gr.layoutMode??"justified",this.containerSelector=Gr.containerSelector??"#gallery-container",this.spacing=Gr.spacing??8,this.masonryBreakpoint=Gr.masonryBreakpoint??640}setLayoutMode(Gr){this.layoutMode=Gr,this.computeLayout()}computeLayout(){this.layoutMode==="masonry"?this.computeMasonry():this.computeJustified()}computeMasonry(){let Gr=document.querySelector(this.containerSelector);if(!Gr)return;let Wr=this.spacing,Kr=Gr.offsetWidth;if(Kr===0){requestAnimationFrame(()=>this.computeMasonry());return}let Yr=Kr<this.masonryBreakpoint?1:3,Zr=(Kr+Wr)/Yr-Wr,tn=new Array(Yr).fill(0);Gr.querySelectorAll(".gallery-item").forEach(dn=>{let yn=parseFloat(dn.dataset.width),Sn=parseFloat(dn.dataset.height);if(!yn||!Sn)return;let An=Sn/yn*Zr,Bn=0;for(let ti=1;ti<Yr;ti++)tn[ti]<tn[Bn]&&(Bn=ti);let jn=(Zr+Wr)*Bn,Vn=tn[Bn];Object.assign(dn.style,{position:"absolute",width:`${Zr}px`,height:`${An}px`,left:`${jn}px`,top:`${Vn}px`}),tn[Bn]=Vn+An+Wr}),Gr.style.height=`${Math.max(...tn)}px`}computeJustified(){let Gr=document.querySelector(this.containerSelector);if(!Gr)return;let Wr=this.spacing,Kr=Gr.offsetWidth;if(Kr===0){requestAnimationFrame(()=>this.computeJustified());return}let Yr=Array.from(Gr.querySelectorAll(".gallery-item")),Zr=[],tn=0,ln=0;Yr.forEach(dn=>{Object.assign(dn.style,{position:"absolute",left:"0px",top:"0px",width:"auto",height:"auto"})});for(let dn=0;dn<Yr.length;dn++){let yn=Yr[dn],Sn=parseFloat(yn.dataset.width),kn=parseFloat(yn.dataset.height);if(!Sn||!kn)continue;let An=Sn/kn;Zr.push({tile:yn,aspectRatio:An,imgW:Sn,imgH:kn}),tn+=An;let Bn=(Kr-(Zr.length-1)*Wr)/tn;if(Bn<300||dn===Yr.length-1){let jn=0;for(let Vn of Zr){let ti=Bn*Vn.aspectRatio;Object.assign(Vn.tile.style,{position:"absolute",top:`${ln}px`,left:`${jn}px`,width:`${ti}px`,height:`${Bn}px`}),jn+=ti+Wr}ln+=Bn+Wr,Zr=[],tn=0}}Gr.style.position="relative",Gr.style.height=`${ln}px`}observe(){if(this.observerInitialized)return;this.observerInitialized=!0;let Gr=document.querySelector(this.containerSelector);if(!Gr)return;if(typeof ResizeObserver<"u"){let Kr=new ResizeObserver(()=>this.computeLayout());Gr.parentElement&&Kr.observe(Gr.parentElement)}new MutationObserver(()=>{this.computeLayout()}).observe(Gr,{childList:!0,subtree:!0})}init(Gr={}){document.addEventListener("DOMContentLoaded",()=>{document.querySelector(Gr.containerSelector??"#gallery-container")&&(this.computeLayout(),this.observe())})}};var No=class Qr{startX=0;threshold=50;observer;static initialized=!1;static id="photo-dialog";constructor(){this.observer=new MutationObserver(this.handleMutation.bind(this))}connect(){this.onTouchStart=this.onTouchStart.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this),console.log("PhotoDialog: Connected touch event handlers.")}static maybeInitForElement(Gr){if(Gr.id!==Qr.id||Qr.initialized)return;let Wr=new Qr;Wr.connect(),document&&document.body?(document.body.addEventListener("touchstart",Wr.onTouchStart),document.body.addEventListener("touchend",Wr.onTouchEnd),Wr.observe(),Qr.initialized=!0):console.warn("document.body not available for PhotoDialog event listeners")}onTouchStart(Gr){this.startX=Gr.touches[0].clientX}onTouchEnd(Gr){let Kr=Gr.changedTouches[0].clientX-this.startX;if(Math.abs(Kr)>this.threshold){let Yr=Kr>0?"swiperight":"swipeleft";Gr.target.dispatchEvent(new CustomEvent(Yr,{bubbles:!0}))}}observe(){this.observer.observe(document.body,{childList:!0,subtree:!0})}disconnect(){this.observer.disconnect(),document.body.removeEventListener("touchstart",this.onTouchStart),document.body.removeEventListener("touchend",this.onTouchEnd),Qr.initialized=!1}handleMutation(){document.getElementById(Qr.id)||(console.log("PhotoDialog not found, removing event listeners"),this.disconnect())}};var xs={};nu(xs,{dataURLToBlob:()=>to,doResize:()=>ro,readFileAsDataURL:()=>Ma});function Ma(Qr){return new Promise((Gr,Wr)=>{let Kr=new FileReader;Kr.onload=()=>Gr(Kr.result),Kr.onerror=Wr,Kr.readAsDataURL(Qr)})}function to(Qr){let[Gr,Wr]=Qr.split(","),Kr=/:(.*?);/.exec(Gr);if(!Kr)throw new Error("Invalid data URL");let Yr=Kr[1],Zr=atob(Wr),tn=new Uint8Array(Zr.length);for(let ln=0;ln<Zr.length;ln++)tn[ln]=Zr.charCodeAt(ln);return new Blob([tn],{type:Yr})}function xl(Qr){let Gr=Qr.split(",")[1];return Math.ceil(Gr.length*3/4)}function Du(Qr,Gr){return new Promise((Wr,Kr)=>{let Yr=new Image;Yr.onload=()=>{let Zr;Gr.mode==="cover"?Zr=Math.max(Gr.width/Yr.width,Gr.height/Yr.height):Gr.mode==="contain"?Zr=Math.min(Gr.width/Yr.width,Gr.height/Yr.height):Zr=1;let tn=Math.round(Yr.width*Zr),ln=Math.round(Yr.height*Zr),dn=document.createElement("canvas");dn.width=tn,dn.height=ln;let yn=dn.getContext("2d");if(!yn)return Kr(new Error("Failed to get canvas context"));yn.fillStyle="#fff",yn.fillRect(0,0,tn,ln),yn.imageSmoothingEnabled=!0,yn.imageSmoothingQuality="high",yn.drawImage(Yr,0,0,tn,ln),Wr({dataUrl:dn.toDataURL("image/jpeg",Gr.quality),width:tn,height:ln})},Yr.onerror=Zr=>Kr(Zr),Yr.src=Qr})}async function ro(Qr,Gr){let Wr=null,Kr=0,Yr=101;for(;Yr-Kr>1;){let Zr=Math.round((Kr+Yr)/2),tn=await Du(Qr,{width:Gr.width,height:Gr.height,quality:Zr/100,mode:Gr.mode});xl(tn.dataUrl)<Gr.maxSize?(Kr=Zr,Wr=tn):Yr=Zr}if(!Wr)throw new Error("Failed to compress image");return{path:Wr.dataUrl,mime:"image/jpeg",size:xl(Wr.dataUrl),width:Wr.width,height:Wr.height}}var Sl=za(mo());var Lo=class{handleAvatarImageSelect(Gr){let Wr=Gr.files?.[0];Wr&&Ma(Wr).then(Kr=>{let Yr=document.createElement("img");typeof Kr=="string"?Yr.src=Kr:(console.error("Expected dataUrl to be a string, got:",typeof Kr),Yr.src=""),Yr.className="rounded-full w-full h-full object-cover",Yr.alt="Avatar preview";let Zr=Gr.closest("form")?.querySelector("#image-preview");Zr&&(Zr.innerHTML="",Zr.appendChild(Yr))})}async updateProfile(Gr){let Wr=new FormData(Gr),Kr=Wr.get("file");if(Kr instanceof File&&Kr?.type?.startsWith?.("image/"))try{let Yr=await Ma(Kr);if(!Yr||typeof Yr!="string"){console.error("Failed to read file as data URL");return}let Zr=await ro(Yr,{width:2e3,height:2e3,maxSize:1e3*1e3,mode:"contain"}),tn=to(Zr.path);Wr.set("file",tn,Kr.name)}catch(Yr){console.error("Error resizing image:",Yr),Wr.delete("file")}Sl.default.ajax("PUT","/actions/profile",{swap:"none",values:Object.fromEntries(Wr),source:Gr})}};var Yo=typeof self<"u"?self:global,lo=typeof navigator<"u",Pu=lo&&typeof HTMLImageElement>"u",qo=!(typeof global>"u"||typeof process>"u"||!process.versions||!process.versions.node),$o=Yo.Buffer,Mo=Yo.BigInt,Jo=!!$o,Ru=Qr=>Qr;function Uo(Qr,Gr=Ru){if(qo)try{return typeof ns=="function"?Promise.resolve(Gr(ns(Qr))):import(Qr).then(Gr)}catch{console.warn(`Couldn't load ${Qr}`)}}var qs=Yo.fetch,Nu=Qr=>qs=Qr;if(!Yo.fetch){let Qr=Uo("http",Kr=>Kr),Gr=Uo("https",Kr=>Kr),Wr=(Kr,{headers:Yr}={})=>new Promise(async(Zr,tn)=>{let{port:ln,hostname:dn,pathname:yn,protocol:Sn,search:kn}=new URL(Kr),An={method:"GET",hostname:dn,path:encodeURI(yn)+kn,headers:Yr};ln!==""&&(An.port=Number(ln));let Bn=(Sn==="https:"?await Gr:await Qr).request(An,jn=>{if(jn.statusCode===301||jn.statusCode===302){let Vn=new URL(jn.headers.location,Kr).toString();return Wr(Vn,{headers:Yr}).then(Zr).catch(tn)}Zr({status:jn.statusCode,arrayBuffer:()=>new Promise(Vn=>{let ti=[];jn.on("data",si=>ti.push(si)),jn.on("end",()=>Vn(Buffer.concat(ti)))})})});Bn.on("error",tn),Bn.end()});Nu(Wr)}function Kn(Qr,Gr,Wr){return Gr in Qr?Object.defineProperty(Qr,Gr,{value:Wr,enumerable:!0,configurable:!0,writable:!0}):Qr[Gr]=Wr,Qr}var Bo=Qr=>ql(Qr)?void 0:Qr,Lu=Qr=>Qr!==void 0;function ql(Qr){return Qr===void 0||(Qr instanceof Map?Qr.size===0:Object.values(Qr).filter(Lu).length===0)}function Ti(Qr){let Gr=new Error(Qr);throw delete Gr.stack,Gr}function ba(Qr){return(Qr=function(Gr){for(;Gr.endsWith("\0");)Gr=Gr.slice(0,-1);return Gr}(Qr).trim())===""?void 0:Qr}function Cs(Qr){let Gr=function(Wr){let Kr=0;return Wr.ifd0.enabled&&(Kr+=1024),Wr.exif.enabled&&(Kr+=2048),Wr.makerNote&&(Kr+=2048),Wr.userComment&&(Kr+=1024),Wr.gps.enabled&&(Kr+=512),Wr.interop.enabled&&(Kr+=100),Wr.ifd1.enabled&&(Kr+=1024),Kr+2048}(Qr);return Qr.jfif.enabled&&(Gr+=50),Qr.xmp.enabled&&(Gr+=2e4),Qr.iptc.enabled&&(Gr+=14e3),Qr.icc.enabled&&(Gr+=6e3),Gr}var Is=Qr=>String.fromCharCode.apply(null,Qr),wl=typeof TextDecoder<"u"?new TextDecoder("utf-8"):void 0;function Ul(Qr){return wl?wl.decode(Qr):Jo?Buffer.from(Qr).toString("utf8"):decodeURIComponent(escape(Is(Qr)))}var Ki=class Qr{static from(Gr,Wr){return Gr instanceof this&&Gr.le===Wr?Gr:new Qr(Gr,void 0,void 0,Wr)}constructor(Gr,Wr=0,Kr,Yr){if(typeof Yr=="boolean"&&(this.le=Yr),Array.isArray(Gr)&&(Gr=new Uint8Array(Gr)),Gr===0)this.byteOffset=0,this.byteLength=0;else if(Gr instanceof ArrayBuffer){Kr===void 0&&(Kr=Gr.byteLength-Wr);let Zr=new DataView(Gr,Wr,Kr);this._swapDataView(Zr)}else if(Gr instanceof Uint8Array||Gr instanceof DataView||Gr instanceof Qr){Kr===void 0&&(Kr=Gr.byteLength-Wr),(Wr+=Gr.byteOffset)+Kr>Gr.byteOffset+Gr.byteLength&&Ti("Creating view outside of available memory in ArrayBuffer");let Zr=new DataView(Gr.buffer,Wr,Kr);this._swapDataView(Zr)}else if(typeof Gr=="number"){let Zr=new DataView(new ArrayBuffer(Gr));this._swapDataView(Zr)}else Ti("Invalid input argument for BufferView: "+Gr)}_swapArrayBuffer(Gr){this._swapDataView(new DataView(Gr))}_swapBuffer(Gr){this._swapDataView(new DataView(Gr.buffer,Gr.byteOffset,Gr.byteLength))}_swapDataView(Gr){this.dataView=Gr,this.buffer=Gr.buffer,this.byteOffset=Gr.byteOffset,this.byteLength=Gr.byteLength}_lengthToEnd(Gr){return this.byteLength-Gr}set(Gr,Wr,Kr=Qr){return Gr instanceof DataView||Gr instanceof Qr?Gr=new Uint8Array(Gr.buffer,Gr.byteOffset,Gr.byteLength):Gr instanceof ArrayBuffer&&(Gr=new Uint8Array(Gr)),Gr instanceof Uint8Array||Ti("BufferView.set(): Invalid data argument."),this.toUint8().set(Gr,Wr),new Kr(this,Wr,Gr.byteLength)}subarray(Gr,Wr){return Wr=Wr||this._lengthToEnd(Gr),new Qr(this,Gr,Wr)}toUint8(){return new Uint8Array(this.buffer,this.byteOffset,this.byteLength)}getUint8Array(Gr,Wr){return new Uint8Array(this.buffer,this.byteOffset+Gr,Wr)}getString(Gr=0,Wr=this.byteLength){return Ul(this.getUint8Array(Gr,Wr))}getLatin1String(Gr=0,Wr=this.byteLength){let Kr=this.getUint8Array(Gr,Wr);return Is(Kr)}getUnicodeString(Gr=0,Wr=this.byteLength){let Kr=[];for(let Yr=0;Yr<Wr&&Gr+Yr<this.byteLength;Yr+=2)Kr.push(this.getUint16(Gr+Yr));return Is(Kr)}getInt8(Gr){return this.dataView.getInt8(Gr)}getUint8(Gr){return this.dataView.getUint8(Gr)}getInt16(Gr,Wr=this.le){return this.dataView.getInt16(Gr,Wr)}getInt32(Gr,Wr=this.le){return this.dataView.getInt32(Gr,Wr)}getUint16(Gr,Wr=this.le){return this.dataView.getUint16(Gr,Wr)}getUint32(Gr,Wr=this.le){return this.dataView.getUint32(Gr,Wr)}getFloat32(Gr,Wr=this.le){return this.dataView.getFloat32(Gr,Wr)}getFloat64(Gr,Wr=this.le){return this.dataView.getFloat64(Gr,Wr)}getFloat(Gr,Wr=this.le){return this.dataView.getFloat32(Gr,Wr)}getDouble(Gr,Wr=this.le){return this.dataView.getFloat64(Gr,Wr)}getUintBytes(Gr,Wr,Kr){switch(Wr){case 1:return this.getUint8(Gr,Kr);case 2:return this.getUint16(Gr,Kr);case 4:return this.getUint32(Gr,Kr);case 8:return this.getUint64&&this.getUint64(Gr,Kr)}}getUint(Gr,Wr,Kr){switch(Wr){case 8:return this.getUint8(Gr,Kr);case 16:return this.getUint16(Gr,Kr);case 32:return this.getUint32(Gr,Kr);case 64:return this.getUint64&&this.getUint64(Gr,Kr)}}toString(Gr){return this.dataView.toString(Gr,this.constructor.name)}ensureChunk(){}};function Os(Qr,Gr){Ti(`${Qr} '${Gr}' was not loaded, try using full build of exifr.`)}var uo=class extends Map{constructor(Gr){super(),this.kind=Gr}get(Gr,Wr){return this.has(Gr)||Os(this.kind,Gr),Wr&&(Gr in Wr||function(Kr,Yr){Ti(`Unknown ${Kr} '${Yr}'.`)}(this.kind,Gr),Wr[Gr].enabled||Os(this.kind,Gr)),super.get(Gr)}keyList(){return Array.from(this.keys())}},Yi=new uo("file parser"),Ei=new uo("segment parser"),Ji=new uo("file reader");function Mu(Qr,Gr){return typeof Qr=="string"?kl(Qr,Gr):lo&&!Pu&&Qr instanceof HTMLImageElement?kl(Qr.src,Gr):Qr instanceof Uint8Array||Qr instanceof ArrayBuffer||Qr instanceof DataView?new Ki(Qr):lo&&Qr instanceof Blob?As(Qr,Gr,"blob",Sa):void Ti("Invalid input argument")}function kl(Qr,Gr){return(Wr=Qr).startsWith("data:")||Wr.length>1e4?Ds(Qr,Gr,"base64"):qo&&Qr.includes("://")?As(Qr,Gr,"url",xa):qo?Ds(Qr,Gr,"fs"):lo?As(Qr,Gr,"url",xa):void Ti("Invalid input argument");var Wr}async function As(Qr,Gr,Wr,Kr){return Ji.has(Wr)?Ds(Qr,Gr,Wr):Kr?async function(Yr,Zr){let tn=await Zr(Yr);return new Ki(tn)}(Qr,Kr):void Ti(`Parser ${Wr} is not loaded`)}async function Ds(Qr,Gr,Wr){let Kr=new(Ji.get(Wr))(Qr,Gr);return await Kr.read(),Kr}var xa=Qr=>qs(Qr).then(Gr=>Gr.arrayBuffer()),Sa=Qr=>new Promise((Gr,Wr)=>{let Kr=new FileReader;Kr.onloadend=()=>Gr(Kr.result||new ArrayBuffer),Kr.onerror=Wr,Kr.readAsArrayBuffer(Qr)}),Ps=class extends Map{get tagKeys(){return this.allKeys||(this.allKeys=Array.from(this.keys())),this.allKeys}get tagValues(){return this.allValues||(this.allValues=Array.from(this.values())),this.allValues}};function mi(Qr,Gr,Wr){let Kr=new Ps;for(let[Yr,Zr]of Wr)Kr.set(Yr,Zr);if(Array.isArray(Gr))for(let Yr of Gr)Qr.set(Yr,Kr);else Qr.set(Gr,Kr);return Kr}function wa(Qr,Gr,Wr){let Kr,Yr=Qr.get(Gr);for(Kr of Wr)Yr.set(Kr[0],Kr[1])}var Si=new Map,Wi=new Map,da=new Map,ua=["chunked","firstChunkSize","firstChunkSizeNode","firstChunkSizeBrowser","chunkSize","chunkLimit"],Ha=["jfif","xmp","icc","iptc","ihdr"],ka=["tiff",...Ha],pi=["ifd0","ifd1","exif","gps","interop"],ca=[...ka,...pi],fa=["makerNote","userComment"],Ga=["translateKeys","translateValues","reviveValues","multiSegment"],ha=[...Ga,"sanitize","mergeOutput","silentErrors"],Ho=class{get translate(){return this.translateKeys||this.translateValues||this.reviveValues}},ya=class extends Ho{get needed(){return this.enabled||this.deps.size>0}constructor(Gr,Wr,Kr,Yr){if(super(),Kn(this,"enabled",!1),Kn(this,"skip",new Set),Kn(this,"pick",new Set),Kn(this,"deps",new Set),Kn(this,"translateKeys",!1),Kn(this,"translateValues",!1),Kn(this,"reviveValues",!1),this.key=Gr,this.enabled=Wr,this.parse=this.enabled,this.applyInheritables(Yr),this.canBeFiltered=pi.includes(Gr),this.canBeFiltered&&(this.dict=Si.get(Gr)),Kr!==void 0)if(Array.isArray(Kr))this.parse=this.enabled=!0,this.canBeFiltered&&Kr.length>0&&this.translateTagSet(Kr,this.pick);else if(typeof Kr=="object"){if(this.enabled=!0,this.parse=Kr.parse!==!1,this.canBeFiltered){let{pick:Zr,skip:tn}=Kr;Zr&&Zr.length>0&&this.translateTagSet(Zr,this.pick),tn&&tn.length>0&&this.translateTagSet(tn,this.skip)}this.applyInheritables(Kr)}else Kr===!0||Kr===!1?this.parse=this.enabled=Kr:Ti(`Invalid options argument: ${Kr}`)}applyInheritables(Gr){let Wr,Kr;for(Wr of Ga)Kr=Gr[Wr],Kr!==void 0&&(this[Wr]=Kr)}translateTagSet(Gr,Wr){if(this.dict){let Kr,Yr,{tagKeys:Zr,tagValues:tn}=this.dict;for(Kr of Gr)typeof Kr=="string"?(Yr=tn.indexOf(Kr),Yr===-1&&(Yr=Zr.indexOf(Number(Kr))),Yr!==-1&&Wr.add(Number(Zr[Yr]))):Wr.add(Kr)}else for(let Kr of Gr)Wr.add(Kr)}finalizeFilters(){!this.enabled&&this.deps.size>0?(this.enabled=!0,Go(this.pick,this.deps)):this.enabled&&this.pick.size>0&&Go(this.pick,this.deps)}},Ai={jfif:!1,tiff:!0,xmp:!1,icc:!1,iptc:!1,ifd0:!0,ifd1:!1,exif:!0,gps:!0,interop:!1,ihdr:void 0,makerNote:!1,userComment:!1,multiSegment:!1,skip:[],pick:[],translateKeys:!0,translateValues:!0,reviveValues:!0,sanitize:!0,mergeOutput:!0,silentErrors:!0,chunked:!0,firstChunkSize:void 0,firstChunkSizeNode:512,firstChunkSizeBrowser:65536,chunkSize:65536,chunkLimit:5},Cl=new Map,ia=class extends Ho{static useCached(Gr){let Wr=Cl.get(Gr);return Wr!==void 0||(Wr=new this(Gr),Cl.set(Gr,Wr)),Wr}constructor(Gr){super(),Gr===!0?this.setupFromTrue():Gr===void 0?this.setupFromUndefined():Array.isArray(Gr)?this.setupFromArray(Gr):typeof Gr=="object"?this.setupFromObject(Gr):Ti(`Invalid options argument ${Gr}`),this.firstChunkSize===void 0&&(this.firstChunkSize=lo?this.firstChunkSizeBrowser:this.firstChunkSizeNode),this.mergeOutput&&(this.ifd1.enabled=!1),this.filterNestedSegmentTags(),this.traverseTiffDependencyTree(),this.checkLoadedPlugins()}setupFromUndefined(){let Gr;for(Gr of ua)this[Gr]=Ai[Gr];for(Gr of ha)this[Gr]=Ai[Gr];for(Gr of fa)this[Gr]=Ai[Gr];for(Gr of ca)this[Gr]=new ya(Gr,Ai[Gr],void 0,this)}setupFromTrue(){let Gr;for(Gr of ua)this[Gr]=Ai[Gr];for(Gr of ha)this[Gr]=Ai[Gr];for(Gr of fa)this[Gr]=!0;for(Gr of ca)this[Gr]=new ya(Gr,!0,void 0,this)}setupFromArray(Gr){let Wr;for(Wr of ua)this[Wr]=Ai[Wr];for(Wr of ha)this[Wr]=Ai[Wr];for(Wr of fa)this[Wr]=Ai[Wr];for(Wr of ca)this[Wr]=new ya(Wr,!1,void 0,this);this.setupGlobalFilters(Gr,void 0,pi)}setupFromObject(Gr){let Wr;for(Wr of(pi.ifd0=pi.ifd0||pi.image,pi.ifd1=pi.ifd1||pi.thumbnail,Object.assign(this,Gr),ua))this[Wr]=Ss(Gr[Wr],Ai[Wr]);for(Wr of ha)this[Wr]=Ss(Gr[Wr],Ai[Wr]);for(Wr of fa)this[Wr]=Ss(Gr[Wr],Ai[Wr]);for(Wr of ka)this[Wr]=new ya(Wr,Ai[Wr],Gr[Wr],this);for(Wr of pi)this[Wr]=new ya(Wr,Ai[Wr],Gr[Wr],this.tiff);this.setupGlobalFilters(Gr.pick,Gr.skip,pi,ca),Gr.tiff===!0?this.batchEnableWithBool(pi,!0):Gr.tiff===!1?this.batchEnableWithUserValue(pi,Gr):Array.isArray(Gr.tiff)?this.setupGlobalFilters(Gr.tiff,void 0,pi):typeof Gr.tiff=="object"&&this.setupGlobalFilters(Gr.tiff.pick,Gr.tiff.skip,pi)}batchEnableWithBool(Gr,Wr){for(let Kr of Gr)this[Kr].enabled=Wr}batchEnableWithUserValue(Gr,Wr){for(let Kr of Gr){let Yr=Wr[Kr];this[Kr].enabled=Yr!==!1&&Yr!==void 0}}setupGlobalFilters(Gr,Wr,Kr,Yr=Kr){if(Gr&&Gr.length){for(let tn of Yr)this[tn].enabled=!1;let Zr=Il(Gr,Kr);for(let[tn,ln]of Zr)Go(this[tn].pick,ln),this[tn].enabled=!0}else if(Wr&&Wr.length){let Zr=Il(Wr,Kr);for(let[tn,ln]of Zr)Go(this[tn].skip,ln)}}filterNestedSegmentTags(){let{ifd0:Gr,exif:Wr,xmp:Kr,iptc:Yr,icc:Zr}=this;this.makerNote?Wr.deps.add(37500):Wr.skip.add(37500),this.userComment?Wr.deps.add(37510):Wr.skip.add(37510),Kr.enabled||Gr.skip.add(700),Yr.enabled||Gr.skip.add(33723),Zr.enabled||Gr.skip.add(34675)}traverseTiffDependencyTree(){let{ifd0:Gr,exif:Wr,gps:Kr,interop:Yr}=this;Yr.needed&&(Wr.deps.add(40965),Gr.deps.add(40965)),Wr.needed&&Gr.deps.add(34665),Kr.needed&&Gr.deps.add(34853),this.tiff.enabled=pi.some(Zr=>this[Zr].enabled===!0)||this.makerNote||this.userComment;for(let Zr of pi)this[Zr].finalizeFilters()}get onlyTiff(){return!Ha.map(Gr=>this[Gr].enabled).some(Gr=>Gr===!0)&&this.tiff.enabled}checkLoadedPlugins(){for(let Gr of ka)this[Gr].enabled&&!Ei.has(Gr)&&Os("segment parser",Gr)}};function Il(Qr,Gr){let Wr,Kr,Yr,Zr,tn=[];for(Yr of Gr){for(Zr of(Wr=Si.get(Yr),Kr=[],Wr))(Qr.includes(Zr[0])||Qr.includes(Zr[1]))&&Kr.push(Zr[0]);Kr.length&&tn.push([Yr,Kr])}return tn}function Ss(Qr,Gr){return Qr!==void 0?Qr:Gr!==void 0?Gr:void 0}function Go(Qr,Gr){for(let Wr of Gr)Qr.add(Wr)}Kn(ia,"default",Ai);var $i=class{constructor(Gr){Kn(this,"parsers",{}),Kn(this,"output",{}),Kn(this,"errors",[]),Kn(this,"pushToErrors",Wr=>this.errors.push(Wr)),this.options=ia.useCached(Gr)}async read(Gr){this.file=await Mu(Gr,this.options)}setup(){if(this.fileParser)return;let{file:Gr}=this,Wr=Gr.getUint16(0);for(let[Kr,Yr]of Yi)if(Yr.canHandle(Gr,Wr))return this.fileParser=new Yr(this.options,this.file,this.parsers),Gr[Kr]=!0;this.file.close&&this.file.close(),Ti("Unknown file format")}async parse(){let{output:Gr,errors:Wr}=this;return this.setup(),this.options.silentErrors?(await this.executeParsers().catch(this.pushToErrors),Wr.push(...this.fileParser.errors)):await this.executeParsers(),this.file.close&&this.file.close(),this.options.silentErrors&&Wr.length>0&&(Gr.errors=Wr),Bo(Gr)}async executeParsers(){let{output:Gr}=this;await this.fileParser.parse();let Wr=Object.values(this.parsers).map(async Kr=>{let Yr=await Kr.parse();Kr.assignToOutput(Gr,Yr)});this.options.silentErrors&&(Wr=Wr.map(Kr=>Kr.catch(this.pushToErrors))),await Promise.all(Wr)}async extractThumbnail(){this.setup();let{options:Gr,file:Wr}=this,Kr=Ei.get("tiff",Gr);var Yr;if(Wr.tiff?Yr={start:0,type:"tiff"}:Wr.jpeg&&(Yr=await this.fileParser.getOrFindSegment("tiff")),Yr===void 0)return;let Zr=await this.fileParser.ensureSegmentChunk(Yr),tn=this.parsers.tiff=new Kr(Zr,Gr,Wr),ln=await tn.extractThumbnail();return Wr.close&&Wr.close(),ln}};async function Zo(Qr,Gr){let Wr=new $i(Gr);return await Wr.read(Qr),Wr.parse()}var Fu=Object.freeze({__proto__:null,parse:Zo,Exifr:$i,fileParsers:Yi,segmentParsers:Ei,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:mi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:pi,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia}),Ua=class{constructor(Gr,Wr,Kr){Kn(this,"errors",[]),Kn(this,"ensureSegmentChunk",async Yr=>{let Zr=Yr.start,tn=Yr.size||65536;if(this.file.chunked)if(this.file.available(Zr,tn))Yr.chunk=this.file.subarray(Zr,tn);else try{Yr.chunk=await this.file.readChunk(Zr,tn)}catch(ln){Ti(`Couldn't read segment: ${JSON.stringify(Yr)}. ${ln.message}`)}else this.file.byteLength>Zr+tn?Yr.chunk=this.file.subarray(Zr,tn):Yr.size===void 0?Yr.chunk=this.file.subarray(Zr):Ti("Segment unreachable: "+JSON.stringify(Yr));return Yr.chunk}),this.extendOptions&&this.extendOptions(Gr),this.options=Gr,this.file=Wr,this.parsers=Kr}injectSegment(Gr,Wr){this.options[Gr].enabled&&this.createParser(Gr,Wr)}createParser(Gr,Wr){let Kr=new(Ei.get(Gr))(Wr,this.options,this.file);return this.parsers[Gr]=Kr}createParsers(Gr){for(let Wr of Gr){let{type:Kr,chunk:Yr}=Wr,Zr=this.options[Kr];if(Zr&&Zr.enabled){let tn=this.parsers[Kr];tn&&tn.append||tn||this.createParser(Kr,Yr)}}}async readSegments(Gr){let Wr=Gr.map(this.ensureSegmentChunk);await Promise.all(Wr)}},qi=class{static findPosition(Gr,Wr){let Kr=Gr.getUint16(Wr+2)+2,Yr=typeof this.headerLength=="function"?this.headerLength(Gr,Wr,Kr):this.headerLength,Zr=Wr+Yr,tn=Kr-Yr;return{offset:Wr,length:Kr,headerLength:Yr,start:Zr,size:tn,end:Zr+tn}}static parse(Gr,Wr={}){return new this(Gr,new ia({[this.type]:Wr}),Gr).parse()}normalizeInput(Gr){return Gr instanceof Ki?Gr:new Ki(Gr)}constructor(Gr,Wr={},Kr){Kn(this,"errors",[]),Kn(this,"raw",new Map),Kn(this,"handleError",Yr=>{if(!this.options.silentErrors)throw Yr;this.errors.push(Yr.message)}),this.chunk=this.normalizeInput(Gr),this.file=Kr,this.type=this.constructor.type,this.globalOptions=this.options=Wr,this.localOptions=Wr[this.type],this.canTranslate=this.localOptions&&this.localOptions.translate}translate(){this.canTranslate&&(this.translated=this.translateBlock(this.raw,this.type))}get output(){return this.translated?this.translated:this.raw?Object.fromEntries(this.raw):void 0}translateBlock(Gr,Wr){let Kr=da.get(Wr),Yr=Wi.get(Wr),Zr=Si.get(Wr),tn=this.options[Wr],ln=tn.reviveValues&&!!Kr,dn=tn.translateValues&&!!Yr,yn=tn.translateKeys&&!!Zr,Sn={};for(let[kn,An]of Gr)ln&&Kr.has(kn)?An=Kr.get(kn)(An):dn&&Yr.has(kn)&&(An=this.translateValue(An,Yr.get(kn))),yn&&Zr.has(kn)&&(kn=Zr.get(kn)||kn),Sn[kn]=An;return Sn}translateValue(Gr,Wr){return Wr[Gr]||Wr.DEFAULT||Gr}assignToOutput(Gr,Wr){this.assignObjectToOutput(Gr,this.constructor.type,Wr)}assignObjectToOutput(Gr,Wr,Kr){if(this.globalOptions.mergeOutput)return Object.assign(Gr,Kr);Gr[Wr]?Object.assign(Gr[Wr],Kr):Gr[Wr]=Kr}};Kn(qi,"headerLength",4),Kn(qi,"type",void 0),Kn(qi,"multiSegment",!1),Kn(qi,"canHandle",()=>!1);function qu(Qr){return Qr===192||Qr===194||Qr===196||Qr===219||Qr===221||Qr===218||Qr===254}function Uu(Qr){return Qr>=224&&Qr<=239}function Bu(Qr,Gr,Wr){for(let[Kr,Yr]of Ei)if(Yr.canHandle(Qr,Gr,Wr))return Kr}var _o=class extends Ua{constructor(...Gr){super(...Gr),Kn(this,"appSegments",[]),Kn(this,"jpegSegments",[]),Kn(this,"unknownSegments",[])}static canHandle(Gr,Wr){return Wr===65496}async parse(){await this.findAppSegments(),await this.readSegments(this.appSegments),this.mergeMultiSegments(),this.createParsers(this.mergedAppSegments||this.appSegments)}setupSegmentFinderArgs(Gr){Gr===!0?(this.findAll=!0,this.wanted=new Set(Ei.keyList())):(Gr=Gr===void 0?Ei.keyList().filter(Wr=>this.options[Wr].enabled):Gr.filter(Wr=>this.options[Wr].enabled&&Ei.has(Wr)),this.findAll=!1,this.remaining=new Set(Gr),this.wanted=new Set(Gr)),this.unfinishedMultiSegment=!1}async findAppSegments(Gr=0,Wr){this.setupSegmentFinderArgs(Wr);let{file:Kr,findAll:Yr,wanted:Zr,remaining:tn}=this;if(!Yr&&this.file.chunked&&(Yr=Array.from(Zr).some(ln=>{let dn=Ei.get(ln),yn=this.options[ln];return dn.multiSegment&&yn.multiSegment}),Yr&&await this.file.readWhole()),Gr=this.findAppSegmentsInRange(Gr,Kr.byteLength),!this.options.onlyTiff&&Kr.chunked){let ln=!1;for(;tn.size>0&&!ln&&(Kr.canReadNextChunk||this.unfinishedMultiSegment);){let{nextChunkOffset:dn}=Kr,yn=this.appSegments.some(Sn=>!this.file.available(Sn.offset||Sn.start,Sn.length||Sn.size));if(ln=Gr>dn&&!yn?!await Kr.readNextChunk(Gr):!await Kr.readNextChunk(dn),(Gr=this.findAppSegmentsInRange(Gr,Kr.byteLength))===void 0)return}}}findAppSegmentsInRange(Gr,Wr){Wr-=2;let Kr,Yr,Zr,tn,ln,dn,{file:yn,findAll:Sn,wanted:kn,remaining:An,options:Bn}=this;for(;Gr<Wr;Gr++)if(yn.getUint8(Gr)===255){if(Kr=yn.getUint8(Gr+1),Uu(Kr)){if(Yr=yn.getUint16(Gr+2),Zr=Bu(yn,Gr,Yr),Zr&&kn.has(Zr)&&(tn=Ei.get(Zr),ln=tn.findPosition(yn,Gr),dn=Bn[Zr],ln.type=Zr,this.appSegments.push(ln),!Sn&&(tn.multiSegment&&dn.multiSegment?(this.unfinishedMultiSegment=ln.chunkNumber<ln.chunkCount,this.unfinishedMultiSegment||An.delete(Zr)):An.delete(Zr),An.size===0)))break;Bn.recordUnknownSegments&&(ln=qi.findPosition(yn,Gr),ln.marker=Kr,this.unknownSegments.push(ln)),Gr+=Yr+1}else if(qu(Kr)){if(Yr=yn.getUint16(Gr+2),Kr===218&&Bn.stopAfterSos!==!1)return;Bn.recordJpegSegments&&this.jpegSegments.push({offset:Gr,length:Yr,marker:Kr}),Gr+=Yr+1}}return Gr}mergeMultiSegments(){if(!this.appSegments.some(Wr=>Wr.multiSegment))return;let Gr=function(Wr,Kr){let Yr,Zr,tn,ln=new Map;for(let dn=0;dn<Wr.length;dn++)Yr=Wr[dn],Zr=Yr[Kr],ln.has(Zr)?tn=ln.get(Zr):ln.set(Zr,tn=[]),tn.push(Yr);return Array.from(ln)}(this.appSegments,"type");this.mergedAppSegments=Gr.map(([Wr,Kr])=>{let Yr=Ei.get(Wr,this.options);return Yr.handleMultiSegments?{type:Wr,chunk:Yr.handleMultiSegments(Kr)}:Kr[0]})}getSegment(Gr){return this.appSegments.find(Wr=>Wr.type===Gr)}async getOrFindSegment(Gr){let Wr=this.getSegment(Gr);return Wr===void 0&&(await this.findAppSegments(0,[Gr]),Wr=this.getSegment(Gr)),Wr}};Kn(_o,"type","jpeg"),Yi.set("jpeg",_o);var Hu=[void 0,1,1,2,4,8,1,1,2,4,8,4,8,4],Rs=class extends qi{parseHeader(){var Gr=this.chunk.getUint16();Gr===18761?this.le=!0:Gr===19789&&(this.le=!1),this.chunk.le=this.le,this.headerParsed=!0}parseTags(Gr,Wr,Kr=new Map){let{pick:Yr,skip:Zr}=this.options[Wr];Yr=new Set(Yr);let tn=Yr.size>0,ln=Zr.size===0,dn=this.chunk.getUint16(Gr);Gr+=2;for(let yn=0;yn<dn;yn++){let Sn=this.chunk.getUint16(Gr);if(tn){if(Yr.has(Sn)&&(Kr.set(Sn,this.parseTag(Gr,Sn,Wr)),Yr.delete(Sn),Yr.size===0))break}else!ln&&Zr.has(Sn)||Kr.set(Sn,this.parseTag(Gr,Sn,Wr));Gr+=12}return Kr}parseTag(Gr,Wr,Kr){let{chunk:Yr}=this,Zr=Yr.getUint16(Gr+2),tn=Yr.getUint32(Gr+4),ln=Hu[Zr];if(ln*tn<=4?Gr+=8:Gr=Yr.getUint32(Gr+8),(Zr<1||Zr>13)&&Ti(`Invalid TIFF value type. block: ${Kr.toUpperCase()}, tag: ${Wr.toString(16)}, type: ${Zr}, offset ${Gr}`),Gr>Yr.byteLength&&Ti(`Invalid TIFF value offset. block: ${Kr.toUpperCase()}, tag: ${Wr.toString(16)}, type: ${Zr}, offset ${Gr} is outside of chunk size ${Yr.byteLength}`),Zr===1)return Yr.getUint8Array(Gr,tn);if(Zr===2)return ba(Yr.getString(Gr,tn));if(Zr===7)return Yr.getUint8Array(Gr,tn);if(tn===1)return this.parseTagValue(Zr,Gr);{let dn=new(function(Sn){switch(Sn){case 1:return Uint8Array;case 3:return Uint16Array;case 4:return Uint32Array;case 5:return Array;case 6:return Int8Array;case 8:return Int16Array;case 9:return Int32Array;case 10:return Array;case 11:return Float32Array;case 12:return Float64Array;default:return Array}}(Zr))(tn),yn=ln;for(let Sn=0;Sn<tn;Sn++)dn[Sn]=this.parseTagValue(Zr,Gr),Gr+=yn;return dn}}parseTagValue(Gr,Wr){let{chunk:Kr}=this;switch(Gr){case 1:return Kr.getUint8(Wr);case 3:return Kr.getUint16(Wr);case 4:return Kr.getUint32(Wr);case 5:return Kr.getUint32(Wr)/Kr.getUint32(Wr+4);case 6:return Kr.getInt8(Wr);case 8:return Kr.getInt16(Wr);case 9:return Kr.getInt32(Wr);case 10:return Kr.getInt32(Wr)/Kr.getInt32(Wr+4);case 11:return Kr.getFloat(Wr);case 12:return Kr.getDouble(Wr);case 13:return Kr.getUint32(Wr);default:Ti(`Invalid tiff type ${Gr}`)}}},io=class extends Rs{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===225&&Gr.getUint32(Wr+4)===1165519206&&Gr.getUint16(Wr+8)===0}async parse(){this.parseHeader();let{options:Gr}=this;return Gr.ifd0.enabled&&await this.parseIfd0Block(),Gr.exif.enabled&&await this.safeParse("parseExifBlock"),Gr.gps.enabled&&await this.safeParse("parseGpsBlock"),Gr.interop.enabled&&await this.safeParse("parseInteropBlock"),Gr.ifd1.enabled&&await this.safeParse("parseThumbnailBlock"),this.createOutput()}safeParse(Gr){let Wr=this[Gr]();return Wr.catch!==void 0&&(Wr=Wr.catch(this.handleError)),Wr}findIfd0Offset(){this.ifd0Offset===void 0&&(this.ifd0Offset=this.chunk.getUint32(4))}findIfd1Offset(){if(this.ifd1Offset===void 0){this.findIfd0Offset();let Gr=this.chunk.getUint16(this.ifd0Offset),Wr=this.ifd0Offset+2+12*Gr;this.ifd1Offset=this.chunk.getUint32(Wr)}}parseBlock(Gr,Wr){let Kr=new Map;return this[Wr]=Kr,this.parseTags(Gr,Wr,Kr),Kr}async parseIfd0Block(){if(this.ifd0)return;let{file:Gr}=this;this.findIfd0Offset(),this.ifd0Offset<8&&Ti("Malformed EXIF data"),!Gr.chunked&&this.ifd0Offset>Gr.byteLength&&Ti(`IFD0 offset points to outside of file. 15 + this.ifd0Offset: ${this.ifd0Offset}, file.byteLength: ${Gr.byteLength}`),Gr.tiff&&await Gr.ensureChunk(this.ifd0Offset,Cs(this.options));let Wr=this.parseBlock(this.ifd0Offset,"ifd0");return Wr.size!==0?(this.exifOffset=Wr.get(34665),this.interopOffset=Wr.get(40965),this.gpsOffset=Wr.get(34853),this.xmp=Wr.get(700),this.iptc=Wr.get(33723),this.icc=Wr.get(34675),this.options.sanitize&&(Wr.delete(34665),Wr.delete(40965),Wr.delete(34853),Wr.delete(700),Wr.delete(33723),Wr.delete(34675)),Wr):void 0}async parseExifBlock(){if(this.exif||(this.ifd0||await this.parseIfd0Block(),this.exifOffset===void 0))return;this.file.tiff&&await this.file.ensureChunk(this.exifOffset,Cs(this.options));let Gr=this.parseBlock(this.exifOffset,"exif");return this.interopOffset||(this.interopOffset=Gr.get(40965)),this.makerNote=Gr.get(37500),this.userComment=Gr.get(37510),this.options.sanitize&&(Gr.delete(40965),Gr.delete(37500),Gr.delete(37510)),this.unpack(Gr,41728),this.unpack(Gr,41729),Gr}unpack(Gr,Wr){let Kr=Gr.get(Wr);Kr&&Kr.length===1&&Gr.set(Wr,Kr[0])}async parseGpsBlock(){if(this.gps||(this.ifd0||await this.parseIfd0Block(),this.gpsOffset===void 0))return;let Gr=this.parseBlock(this.gpsOffset,"gps");return Gr&&Gr.has(2)&&Gr.has(4)&&(Gr.set("latitude",Ol(...Gr.get(2),Gr.get(1))),Gr.set("longitude",Ol(...Gr.get(4),Gr.get(3)))),Gr}async parseInteropBlock(){if(!this.interop&&(this.ifd0||await this.parseIfd0Block(),this.interopOffset!==void 0||this.exif||await this.parseExifBlock(),this.interopOffset!==void 0))return this.parseBlock(this.interopOffset,"interop")}async parseThumbnailBlock(Gr=!1){if(!this.ifd1&&!this.ifd1Parsed&&(!this.options.mergeOutput||Gr))return this.findIfd1Offset(),this.ifd1Offset>0&&(this.parseBlock(this.ifd1Offset,"ifd1"),this.ifd1Parsed=!0),this.ifd1}async extractThumbnail(){if(this.headerParsed||this.parseHeader(),this.ifd1Parsed||await this.parseThumbnailBlock(!0),this.ifd1===void 0)return;let Gr=this.ifd1.get(513),Wr=this.ifd1.get(514);return this.chunk.getUint8Array(Gr,Wr)}get image(){return this.ifd0}get thumbnail(){return this.ifd1}createOutput(){let Gr,Wr,Kr,Yr={};for(Wr of pi)if(Gr=this[Wr],!ql(Gr))if(Kr=this.canTranslate?this.translateBlock(Gr,Wr):Object.fromEntries(Gr),this.options.mergeOutput){if(Wr==="ifd1")continue;Object.assign(Yr,Kr)}else Yr[Wr]=Kr;return this.makerNote&&(Yr.makerNote=this.makerNote),this.userComment&&(Yr.userComment=this.userComment),Yr}assignToOutput(Gr,Wr){if(this.globalOptions.mergeOutput)Object.assign(Gr,Wr);else for(let[Kr,Yr]of Object.entries(Wr))this.assignObjectToOutput(Gr,Kr,Yr)}};function Ol(Qr,Gr,Wr,Kr){var Yr=Qr+Gr/60+Wr/3600;return Kr!=="S"&&Kr!=="W"||(Yr*=-1),Yr}Kn(io,"type","tiff"),Kn(io,"headerLength",10),Ei.set("tiff",io);var Gu=Object.freeze({__proto__:null,default:Fu,Exifr:$i,fileParsers:Yi,segmentParsers:Ei,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:mi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:pi,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia,parse:Zo}),Us={ifd0:!1,ifd1:!1,exif:!1,gps:!1,interop:!1,sanitize:!1,reviveValues:!0,translateKeys:!1,translateValues:!1,mergeOutput:!1},Bs=Object.assign({},Us,{firstChunkSize:4e4,gps:[1,2,3,4]});async function Bl(Qr){let Gr=new $i(Bs);await Gr.read(Qr);let Wr=await Gr.parse();if(Wr&&Wr.gps){let{latitude:Kr,longitude:Yr}=Wr.gps;return{latitude:Kr,longitude:Yr}}}var Hs=Object.assign({},Us,{tiff:!1,ifd1:!0,mergeOutput:!1});async function Hl(Qr){let Gr=new $i(Hs);await Gr.read(Qr);let Wr=await Gr.extractThumbnail();return Wr&&Jo?$o.from(Wr):Wr}async function Gl(Qr){let Gr=await this.thumbnail(Qr);if(Gr!==void 0){let Wr=new Blob([Gr]);return URL.createObjectURL(Wr)}}var Gs=Object.assign({},Us,{firstChunkSize:4e4,ifd0:[274]});async function _s(Qr){let Gr=new $i(Gs);await Gr.read(Qr);let Wr=await Gr.parse();if(Wr&&Wr.ifd0)return Wr.ifd0[274]}var js=Object.freeze({1:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:0,rad:0},2:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:0,rad:0},3:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:180,rad:180*Math.PI/180},4:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:180,rad:180*Math.PI/180},5:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:90,rad:90*Math.PI/180},6:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:90,rad:90*Math.PI/180},7:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:270,rad:270*Math.PI/180},8:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:270,rad:270*Math.PI/180}}),Ea=!0,Ta=!0;if(typeof navigator=="object"){let Qr=navigator.userAgent;if(Qr.includes("iPad")||Qr.includes("iPhone")){let Gr=Qr.match(/OS (\d+)_(\d+)/);if(Gr){let[,Wr,Kr]=Gr;Ea=Number(Wr)+.1*Number(Kr)<13.4,Ta=!1}}else if(Qr.includes("OS X 10")){let[,Gr]=Qr.match(/OS X 10[_.](\d+)/);Ea=Ta=Number(Gr)<15}if(Qr.includes("Chrome/")){let[,Gr]=Qr.match(/Chrome\/(\d+)/);Ea=Ta=Number(Gr)<81}else if(Qr.includes("Firefox/")){let[,Gr]=Qr.match(/Firefox\/(\d+)/);Ea=Ta=Number(Gr)<77}}async function _l(Qr){let Gr=await _s(Qr);return Object.assign({canvas:Ea,css:Ta},js[Gr])}var Ns=class extends Ki{constructor(...Gr){super(...Gr),Kn(this,"ranges",new Ls),this.byteLength!==0&&this.ranges.add(0,this.byteLength)}_tryExtend(Gr,Wr,Kr){if(Gr===0&&this.byteLength===0&&Kr){let Yr=new DataView(Kr.buffer||Kr,Kr.byteOffset,Kr.byteLength);this._swapDataView(Yr)}else{let Yr=Gr+Wr;if(Yr>this.byteLength){let{dataView:Zr}=this._extend(Yr);this._swapDataView(Zr)}}}_extend(Gr){let Wr;Wr=Jo?$o.allocUnsafe(Gr):new Uint8Array(Gr);let Kr=new DataView(Wr.buffer,Wr.byteOffset,Wr.byteLength);return Wr.set(new Uint8Array(this.buffer,this.byteOffset,this.byteLength),0),{uintView:Wr,dataView:Kr}}subarray(Gr,Wr,Kr=!1){return Wr=Wr||this._lengthToEnd(Gr),Kr&&this._tryExtend(Gr,Wr),this.ranges.add(Gr,Wr),super.subarray(Gr,Wr)}set(Gr,Wr,Kr=!1){Kr&&this._tryExtend(Wr,Gr.byteLength,Gr);let Yr=super.set(Gr,Wr);return this.ranges.add(Wr,Yr.byteLength),Yr}async ensureChunk(Gr,Wr){this.chunked&&(this.ranges.available(Gr,Wr)||await this.readChunk(Gr,Wr))}available(Gr,Wr){return this.ranges.available(Gr,Wr)}},Ls=class{constructor(){Kn(this,"list",[])}get length(){return this.list.length}add(Gr,Wr,Kr=0){let Yr=Gr+Wr,Zr=this.list.filter(tn=>Al(Gr,tn.offset,Yr)||Al(Gr,tn.end,Yr));if(Zr.length>0){Gr=Math.min(Gr,...Zr.map(ln=>ln.offset)),Yr=Math.max(Yr,...Zr.map(ln=>ln.end)),Wr=Yr-Gr;let tn=Zr.shift();tn.offset=Gr,tn.length=Wr,tn.end=Yr,this.list=this.list.filter(ln=>!Zr.includes(ln))}else this.list.push({offset:Gr,length:Wr,end:Yr})}available(Gr,Wr){let Kr=Gr+Wr;return this.list.some(Yr=>Yr.offset<=Gr&&Kr<=Yr.end)}};function Al(Qr,Gr,Wr){return Qr<=Gr&&Gr<=Wr}var Ba=class extends Ns{constructor(Gr,Wr){super(0),Kn(this,"chunksRead",0),this.input=Gr,this.options=Wr}async readWhole(){this.chunked=!1,await this.readChunk(this.nextChunkOffset)}async readChunked(){this.chunked=!0,await this.readChunk(0,this.options.firstChunkSize)}async readNextChunk(Gr=this.nextChunkOffset){if(this.fullyRead)return this.chunksRead++,!1;let Wr=this.options.chunkSize,Kr=await this.readChunk(Gr,Wr);return!!Kr&&Kr.byteLength===Wr}async readChunk(Gr,Wr){if(this.chunksRead++,(Wr=this.safeWrapAddress(Gr,Wr))!==0)return this._readChunk(Gr,Wr)}safeWrapAddress(Gr,Wr){return this.size!==void 0&&Gr+Wr>this.size?Math.max(0,this.size-Gr):Wr}get nextChunkOffset(){if(this.ranges.list.length!==0)return this.ranges.list[0].length}get canReadNextChunk(){return this.chunksRead<this.options.chunkLimit}get fullyRead(){return this.size!==void 0&&this.nextChunkOffset===this.size}read(){return this.options.chunked?this.readChunked():this.readWhole()}close(){}};Ji.set("blob",class extends Ba{async readWhole(){this.chunked=!1;let Qr=await Sa(this.input);this._swapArrayBuffer(Qr)}readChunked(){return this.chunked=!0,this.size=this.input.size,super.readChunked()}async _readChunk(Qr,Gr){let Wr=Gr?Qr+Gr:void 0,Kr=this.input.slice(Qr,Wr),Yr=await Sa(Kr);return this.set(Yr,Qr,!0)}});var _u=Object.freeze({__proto__:null,default:Gu,Exifr:$i,fileParsers:Yi,segmentParsers:Ei,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:mi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:pi,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia,parse:Zo,gpsOnlyOptions:Bs,gps:Bl,thumbnailOnlyOptions:Hs,thumbnail:Hl,thumbnailUrl:Gl,orientationOnlyOptions:Gs,orientation:_s,rotations:js,get rotateCanvas(){return Ea},get rotateCss(){return Ta},rotation:_l});Ji.set("url",class extends Ba{async readWhole(){this.chunked=!1;let Qr=await xa(this.input);Qr instanceof ArrayBuffer?this._swapArrayBuffer(Qr):Qr instanceof Uint8Array&&this._swapBuffer(Qr)}async _readChunk(Qr,Gr){let Wr=Gr?Qr+Gr-1:void 0,Kr=this.options.httpHeaders||{};(Qr||Wr)&&(Kr.range=`bytes=${[Qr,Wr].join("-")}`);let Yr=await qs(this.input,{headers:Kr}),Zr=await Yr.arrayBuffer(),tn=Zr.byteLength;if(Yr.status!==416)return tn!==Gr&&(this.size=Qr+tn),this.set(Zr,Qr,!0)}});Ki.prototype.getUint64=function(Qr){let Gr=this.getUint32(Qr),Wr=this.getUint32(Qr+4);return Gr<1048575?Gr<<32|Wr:typeof Mo!==void 0?(console.warn("Using BigInt because of type 64uint but JS can only handle 53b numbers."),Mo(Gr)<<Mo(32)|Mo(Wr)):void Ti("Trying to read 64b value but JS can only handle 53b numbers.")};var Ms=class extends Ua{parseBoxes(Gr=0){let Wr=[];for(;Gr<this.file.byteLength-4;){let Kr=this.parseBoxHead(Gr);if(Wr.push(Kr),Kr.length===0)break;Gr+=Kr.length}return Wr}parseSubBoxes(Gr){Gr.boxes=this.parseBoxes(Gr.start)}findBox(Gr,Wr){return Gr.boxes===void 0&&this.parseSubBoxes(Gr),Gr.boxes.find(Kr=>Kr.kind===Wr)}parseBoxHead(Gr){let Wr=this.file.getUint32(Gr),Kr=this.file.getString(Gr+4,4),Yr=Gr+8;return Wr===1&&(Wr=this.file.getUint64(Gr+8),Yr+=8),{offset:Gr,length:Wr,kind:Kr,start:Yr}}parseBoxFullHead(Gr){if(Gr.version!==void 0)return;let Wr=this.file.getUint32(Gr.start);Gr.version=Wr>>24,Gr.start+=4}},jo=class extends Ms{static canHandle(Gr,Wr){if(Wr!==0)return!1;let Kr=Gr.getUint16(2);if(Kr>50)return!1;let Yr=16,Zr=[];for(;Yr<Kr;)Zr.push(Gr.getString(Yr,4)),Yr+=4;return Zr.includes(this.type)}async parse(){let Gr=this.file.getUint32(0),Wr=this.parseBoxHead(Gr);for(;Wr.kind!=="meta";)Gr+=Wr.length,await this.file.ensureChunk(Gr,16),Wr=this.parseBoxHead(Gr);await this.file.ensureChunk(Wr.offset,Wr.length),this.parseBoxFullHead(Wr),this.parseSubBoxes(Wr),this.options.icc.enabled&&await this.findIcc(Wr),this.options.tiff.enabled&&await this.findExif(Wr)}async registerSegment(Gr,Wr,Kr){await this.file.ensureChunk(Wr,Kr);let Yr=this.file.subarray(Wr,Kr);this.createParser(Gr,Yr)}async findIcc(Gr){let Wr=this.findBox(Gr,"iprp");if(Wr===void 0)return;let Kr=this.findBox(Wr,"ipco");if(Kr===void 0)return;let Yr=this.findBox(Kr,"colr");Yr!==void 0&&await this.registerSegment("icc",Yr.offset+12,Yr.length)}async findExif(Gr){let Wr=this.findBox(Gr,"iinf");if(Wr===void 0)return;let Kr=this.findBox(Gr,"iloc");if(Kr===void 0)return;let Yr=this.findExifLocIdInIinf(Wr),Zr=this.findExtentInIloc(Kr,Yr);if(Zr===void 0)return;let[tn,ln]=Zr;await this.file.ensureChunk(tn,ln);let dn=4+this.file.getUint32(tn);tn+=dn,ln-=dn,await this.registerSegment("tiff",tn,ln)}findExifLocIdInIinf(Gr){this.parseBoxFullHead(Gr);let Wr,Kr,Yr,Zr,tn=Gr.start,ln=this.file.getUint16(tn);for(tn+=2;ln--;){if(Wr=this.parseBoxHead(tn),this.parseBoxFullHead(Wr),Kr=Wr.start,Wr.version>=2&&(Yr=Wr.version===3?4:2,Zr=this.file.getString(Kr+Yr+2,4),Zr==="Exif"))return this.file.getUintBytes(Kr,Yr);tn+=Wr.length}}get8bits(Gr){let Wr=this.file.getUint8(Gr);return[Wr>>4,15&Wr]}findExtentInIloc(Gr,Wr){this.parseBoxFullHead(Gr);let Kr=Gr.start,[Yr,Zr]=this.get8bits(Kr++),[tn,ln]=this.get8bits(Kr++),dn=Gr.version===2?4:2,yn=Gr.version===1||Gr.version===2?2:0,Sn=ln+Yr+Zr,kn=Gr.version===2?4:2,An=this.file.getUintBytes(Kr,kn);for(Kr+=kn;An--;){let Bn=this.file.getUintBytes(Kr,dn);Kr+=dn+yn+2+tn;let jn=this.file.getUint16(Kr);if(Kr+=2,Bn===Wr)return jn>1&&console.warn(`ILOC box has more than one extent but we're only processing one 16 + Please create an issue at https://github.com/MikeKovarik/exifr with this file`),[this.file.getUintBytes(Kr+ln,Yr),this.file.getUintBytes(Kr+ln+Yr,Zr)];Kr+=jn*Sn}}},zo=class extends jo{};Kn(zo,"type","heic");var Vo=class extends jo{};Kn(Vo,"type","avif"),Yi.set("heic",zo),Yi.set("avif",Vo),mi(Si,["ifd0","ifd1"],[[256,"ImageWidth"],[257,"ImageHeight"],[258,"BitsPerSample"],[259,"Compression"],[262,"PhotometricInterpretation"],[270,"ImageDescription"],[271,"Make"],[272,"Model"],[273,"StripOffsets"],[274,"Orientation"],[277,"SamplesPerPixel"],[278,"RowsPerStrip"],[279,"StripByteCounts"],[282,"XResolution"],[283,"YResolution"],[284,"PlanarConfiguration"],[296,"ResolutionUnit"],[301,"TransferFunction"],[305,"Software"],[306,"ModifyDate"],[315,"Artist"],[316,"HostComputer"],[317,"Predictor"],[318,"WhitePoint"],[319,"PrimaryChromaticities"],[513,"ThumbnailOffset"],[514,"ThumbnailLength"],[529,"YCbCrCoefficients"],[530,"YCbCrSubSampling"],[531,"YCbCrPositioning"],[532,"ReferenceBlackWhite"],[700,"ApplicationNotes"],[33432,"Copyright"],[33723,"IPTC"],[34665,"ExifIFD"],[34675,"ICC"],[34853,"GpsIFD"],[330,"SubIFD"],[40965,"InteropIFD"],[40091,"XPTitle"],[40092,"XPComment"],[40093,"XPAuthor"],[40094,"XPKeywords"],[40095,"XPSubject"]]),mi(Si,"exif",[[33434,"ExposureTime"],[33437,"FNumber"],[34850,"ExposureProgram"],[34852,"SpectralSensitivity"],[34855,"ISO"],[34858,"TimeZoneOffset"],[34859,"SelfTimerMode"],[34864,"SensitivityType"],[34865,"StandardOutputSensitivity"],[34866,"RecommendedExposureIndex"],[34867,"ISOSpeed"],[34868,"ISOSpeedLatitudeyyy"],[34869,"ISOSpeedLatitudezzz"],[36864,"ExifVersion"],[36867,"DateTimeOriginal"],[36868,"CreateDate"],[36873,"GooglePlusUploadCode"],[36880,"OffsetTime"],[36881,"OffsetTimeOriginal"],[36882,"OffsetTimeDigitized"],[37121,"ComponentsConfiguration"],[37122,"CompressedBitsPerPixel"],[37377,"ShutterSpeedValue"],[37378,"ApertureValue"],[37379,"BrightnessValue"],[37380,"ExposureCompensation"],[37381,"MaxApertureValue"],[37382,"SubjectDistance"],[37383,"MeteringMode"],[37384,"LightSource"],[37385,"Flash"],[37386,"FocalLength"],[37393,"ImageNumber"],[37394,"SecurityClassification"],[37395,"ImageHistory"],[37396,"SubjectArea"],[37500,"MakerNote"],[37510,"UserComment"],[37520,"SubSecTime"],[37521,"SubSecTimeOriginal"],[37522,"SubSecTimeDigitized"],[37888,"AmbientTemperature"],[37889,"Humidity"],[37890,"Pressure"],[37891,"WaterDepth"],[37892,"Acceleration"],[37893,"CameraElevationAngle"],[40960,"FlashpixVersion"],[40961,"ColorSpace"],[40962,"ExifImageWidth"],[40963,"ExifImageHeight"],[40964,"RelatedSoundFile"],[41483,"FlashEnergy"],[41486,"FocalPlaneXResolution"],[41487,"FocalPlaneYResolution"],[41488,"FocalPlaneResolutionUnit"],[41492,"SubjectLocation"],[41493,"ExposureIndex"],[41495,"SensingMethod"],[41728,"FileSource"],[41729,"SceneType"],[41730,"CFAPattern"],[41985,"CustomRendered"],[41986,"ExposureMode"],[41987,"WhiteBalance"],[41988,"DigitalZoomRatio"],[41989,"FocalLengthIn35mmFormat"],[41990,"SceneCaptureType"],[41991,"GainControl"],[41992,"Contrast"],[41993,"Saturation"],[41994,"Sharpness"],[41996,"SubjectDistanceRange"],[42016,"ImageUniqueID"],[42032,"OwnerName"],[42033,"SerialNumber"],[42034,"LensInfo"],[42035,"LensMake"],[42036,"LensModel"],[42037,"LensSerialNumber"],[42080,"CompositeImage"],[42081,"CompositeImageCount"],[42082,"CompositeImageExposureTimes"],[42240,"Gamma"],[59932,"Padding"],[59933,"OffsetSchema"],[65e3,"OwnerName"],[65001,"SerialNumber"],[65002,"Lens"],[65100,"RawFile"],[65101,"Converter"],[65102,"WhiteBalance"],[65105,"Exposure"],[65106,"Shadows"],[65107,"Brightness"],[65108,"Contrast"],[65109,"Saturation"],[65110,"Sharpness"],[65111,"Smoothness"],[65112,"MoireFilter"],[40965,"InteropIFD"]]),mi(Si,"gps",[[0,"GPSVersionID"],[1,"GPSLatitudeRef"],[2,"GPSLatitude"],[3,"GPSLongitudeRef"],[4,"GPSLongitude"],[5,"GPSAltitudeRef"],[6,"GPSAltitude"],[7,"GPSTimeStamp"],[8,"GPSSatellites"],[9,"GPSStatus"],[10,"GPSMeasureMode"],[11,"GPSDOP"],[12,"GPSSpeedRef"],[13,"GPSSpeed"],[14,"GPSTrackRef"],[15,"GPSTrack"],[16,"GPSImgDirectionRef"],[17,"GPSImgDirection"],[18,"GPSMapDatum"],[19,"GPSDestLatitudeRef"],[20,"GPSDestLatitude"],[21,"GPSDestLongitudeRef"],[22,"GPSDestLongitude"],[23,"GPSDestBearingRef"],[24,"GPSDestBearing"],[25,"GPSDestDistanceRef"],[26,"GPSDestDistance"],[27,"GPSProcessingMethod"],[28,"GPSAreaInformation"],[29,"GPSDateStamp"],[30,"GPSDifferential"],[31,"GPSHPositioningError"]]),mi(Wi,["ifd0","ifd1"],[[274,{1:"Horizontal (normal)",2:"Mirror horizontal",3:"Rotate 180",4:"Mirror vertical",5:"Mirror horizontal and rotate 270 CW",6:"Rotate 90 CW",7:"Mirror horizontal and rotate 90 CW",8:"Rotate 270 CW"}],[296,{1:"None",2:"inches",3:"cm"}]]);var ao=mi(Wi,"exif",[[34850,{0:"Not defined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"}],[37121,{0:"-",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"}],[37383,{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"}],[37384,{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"}],[37385,{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"}],[41495,{1:"Not defined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"}],[41728,{1:"Film Scanner",2:"Reflection Print Scanner",3:"Digital Camera"}],[41729,{1:"Directly photographed"}],[41985,{0:"Normal",1:"Custom",2:"HDR (no original saved)",3:"HDR (original saved)",4:"Original (for HDR)",6:"Panorama",7:"Portrait HDR",8:"Portrait"}],[41986,{0:"Auto",1:"Manual",2:"Auto bracket"}],[41987,{0:"Auto",1:"Manual"}],[41990,{0:"Standard",1:"Landscape",2:"Portrait",3:"Night",4:"Other"}],[41991,{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"}],[41996,{0:"Unknown",1:"Macro",2:"Close",3:"Distant"}],[42080,{0:"Unknown",1:"Not a Composite Image",2:"General Composite Image",3:"Composite Image Captured While Shooting"}]]),Dl={1:"No absolute unit of measurement",2:"Inch",3:"Centimeter"};ao.set(37392,Dl),ao.set(41488,Dl);var ws={0:"Normal",1:"Low",2:"High"};function Pl(Qr){return typeof Qr=="object"&&Qr.length!==void 0?Qr[0]:Qr}function Rl(Qr){let Gr=Array.from(Qr).slice(1);return Gr[1]>15&&(Gr=Gr.map(Wr=>String.fromCharCode(Wr))),Gr[2]!=="0"&&Gr[2]!==0||Gr.pop(),Gr.join(".")}function ks(Qr){if(typeof Qr=="string"){var[Gr,Wr,Kr,Yr,Zr,tn]=Qr.trim().split(/[-: ]/g).map(Number),ln=new Date(Gr,Wr-1,Kr);return Number.isNaN(Yr)||Number.isNaN(Zr)||Number.isNaN(tn)||(ln.setHours(Yr),ln.setMinutes(Zr),ln.setSeconds(tn)),Number.isNaN(+ln)?Qr:ln}}function no(Qr){if(typeof Qr=="string")return Qr;let Gr=[];if(Qr[1]===0&&Qr[Qr.length-1]===0)for(let Wr=0;Wr<Qr.length;Wr+=2)Gr.push(Nl(Qr[Wr+1],Qr[Wr]));else for(let Wr=0;Wr<Qr.length;Wr+=2)Gr.push(Nl(Qr[Wr],Qr[Wr+1]));return ba(String.fromCodePoint(...Gr))}function Nl(Qr,Gr){return Qr<<8|Gr}ao.set(41992,ws),ao.set(41993,ws),ao.set(41994,ws),mi(da,["ifd0","ifd1"],[[50827,function(Qr){return typeof Qr!="string"?Ul(Qr):Qr}],[306,ks],[40091,no],[40092,no],[40093,no],[40094,no],[40095,no]]),mi(da,"exif",[[40960,Rl],[36864,Rl],[36867,ks],[36868,ks],[40962,Pl],[40963,Pl]]),mi(da,"gps",[[0,Qr=>Array.from(Qr).join(".")],[7,Qr=>Array.from(Qr).join(":")]]);var oo=class extends qi{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===225&&Gr.getUint32(Wr+4)===1752462448&&Gr.getString(Wr+4,20)==="http://ns.adobe.com/"}static headerLength(Gr,Wr){return Gr.getString(Wr+4,34)==="http://ns.adobe.com/xmp/extension/"?79:33}static findPosition(Gr,Wr){let Kr=super.findPosition(Gr,Wr);return Kr.multiSegment=Kr.extended=Kr.headerLength===79,Kr.multiSegment?(Kr.chunkCount=Gr.getUint8(Wr+72),Kr.chunkNumber=Gr.getUint8(Wr+76),Gr.getUint8(Wr+77)!==0&&Kr.chunkNumber++):(Kr.chunkCount=1/0,Kr.chunkNumber=-1),Kr}static handleMultiSegments(Gr){return Gr.map(Wr=>Wr.chunk.getString()).join("")}normalizeInput(Gr){return typeof Gr=="string"?Gr:Ki.from(Gr).getString()}parse(Gr=this.chunk){if(!this.localOptions.parse)return Gr;Gr=function(Zr){let tn={},ln={};for(let dn of Wl)tn[dn]=[],ln[dn]=0;return Zr.replace(Wu,(dn,yn,Sn)=>{if(yn==="<"){let kn=++ln[Sn];return tn[Sn].push(kn),`${dn}#${kn}`}return`${dn}#${tn[Sn].pop()}`})}(Gr);let Wr=Wo.findAll(Gr,"rdf","Description");Wr.length===0&&Wr.push(new Wo("rdf","Description",void 0,Gr));let Kr,Yr={};for(let Zr of Wr)for(let tn of Zr.properties)Kr=Vu(tn.ns,Yr),jl(tn,Kr);return function(Zr){let tn;for(let ln in Zr)tn=Zr[ln]=Bo(Zr[ln]),tn===void 0&&delete Zr[ln];return Bo(Zr)}(Yr)}assignToOutput(Gr,Wr){if(this.localOptions.parse)for(let[Kr,Yr]of Object.entries(Wr))switch(Kr){case"tiff":this.assignObjectToOutput(Gr,"ifd0",Yr);break;case"exif":this.assignObjectToOutput(Gr,"exif",Yr);break;case"xmlns":break;default:this.assignObjectToOutput(Gr,Kr,Yr)}else Gr.xmp=Wr}};Kn(oo,"type","xmp"),Kn(oo,"multiSegment",!0),Ei.set("xmp",oo);var Fs=class Qr{static findAll(Gr){return zl(Gr,/([a-zA-Z0-9-]+):([a-zA-Z0-9-]+)=("[^"]*"|'[^']*')/gm).map(Qr.unpackMatch)}static unpackMatch(Gr){let Wr=Gr[1],Kr=Gr[2],Yr=Gr[3].slice(1,-1);return Yr=Vl(Yr),new Qr(Wr,Kr,Yr)}constructor(Gr,Wr,Kr){this.ns=Gr,this.name=Wr,this.value=Kr}serialize(){return this.value}},Wo=class Qr{static findAll(Gr,Wr,Kr){if(Wr!==void 0||Kr!==void 0){Wr=Wr||"[\\w\\d-]+",Kr=Kr||"[\\w\\d-]+";var Yr=new RegExp(`<(${Wr}):(${Kr})(#\\d+)?((\\s+?[\\w\\d-:]+=("[^"]*"|'[^']*'))*\\s*)(\\/>|>([\\s\\S]*?)<\\/\\1:\\2\\3>)`,"gm")}else Yr=/<([\w\d-]+):([\w\d-]+)(#\d+)?((\s+?[\w\d-:]+=("[^"]*"|'[^']*'))*\s*)(\/>|>([\s\S]*?)<\/\1:\2\3>)/gm;return zl(Gr,Yr).map(Qr.unpackMatch)}static unpackMatch(Gr){let Wr=Gr[1],Kr=Gr[2],Yr=Gr[4],Zr=Gr[8];return new Qr(Wr,Kr,Yr,Zr)}constructor(Gr,Wr,Kr,Yr){this.ns=Gr,this.name=Wr,this.attrString=Kr,this.innerXml=Yr,this.attrs=Fs.findAll(Kr),this.children=Qr.findAll(Yr),this.value=this.children.length===0?Vl(Yr):void 0,this.properties=[...this.attrs,...this.children]}get isPrimitive(){return this.value!==void 0&&this.attrs.length===0&&this.children.length===0}get isListContainer(){return this.children.length===1&&this.children[0].isList}get isList(){let{ns:Gr,name:Wr}=this;return Gr==="rdf"&&(Wr==="Seq"||Wr==="Bag"||Wr==="Alt")}get isListItem(){return this.ns==="rdf"&&this.name==="li"}serialize(){if(this.properties.length===0&&this.value===void 0)return;if(this.isPrimitive)return this.value;if(this.isListContainer)return this.children[0].serialize();if(this.isList)return zu(this.children.map(ju));if(this.isListItem&&this.children.length===1&&this.attrs.length===0)return this.children[0].serialize();let Gr={};for(let Wr of this.properties)jl(Wr,Gr);return this.value!==void 0&&(Gr.value=this.value),Bo(Gr)}};function jl(Qr,Gr){let Wr=Qr.serialize();Wr!==void 0&&(Gr[Qr.name]=Wr)}var ju=Qr=>Qr.serialize(),zu=Qr=>Qr.length===1?Qr[0]:Qr,Vu=(Qr,Gr)=>Gr[Qr]?Gr[Qr]:Gr[Qr]={};function zl(Qr,Gr){let Wr,Kr=[];if(!Qr)return Kr;for(;(Wr=Gr.exec(Qr))!==null;)Kr.push(Wr);return Kr}function Vl(Qr){if(function(Kr){return Kr==null||Kr==="null"||Kr==="undefined"||Kr===""||Kr.trim()===""}(Qr))return;let Gr=Number(Qr);if(!Number.isNaN(Gr))return Gr;let Wr=Qr.toLowerCase();return Wr==="true"||Wr!=="false"&&Qr.trim()}var Wl=["rdf:li","rdf:Seq","rdf:Bag","rdf:Alt","rdf:Description"],Wu=new RegExp(`(<|\\/)(${Wl.join("|")})`,"g"),Xu=Object.freeze({__proto__:null,default:_u,Exifr:$i,fileParsers:Yi,segmentParsers:Ei,fileReaders:Ji,tagKeys:Si,tagValues:Wi,tagRevivers:da,createDictionary:mi,extendDictionary:wa,fetchUrlAsArrayBuffer:xa,readBlobAsArrayBuffer:Sa,chunkedProps:ua,otherSegments:Ha,segments:ka,tiffBlocks:pi,segmentsAndBlocks:ca,tiffExtractables:fa,inheritables:Ga,allFormatters:ha,Options:ia,parse:Zo,gpsOnlyOptions:Bs,gps:Bl,thumbnailOnlyOptions:Hs,thumbnail:Hl,thumbnailUrl:Gl,orientationOnlyOptions:Gs,orientation:_s,rotations:js,get rotateCanvas(){return Ea},get rotateCss(){return Ta},rotation:_l});var Ll=Uo("fs",Qr=>Qr.promises);Ji.set("fs",class extends Ba{async readWhole(){this.chunked=!1,this.fs=await Ll;let Qr=await this.fs.readFile(this.input);this._swapBuffer(Qr)}async readChunked(){this.chunked=!0,this.fs=await Ll,await this.open(),await this.readChunk(0,this.options.firstChunkSize)}async open(){this.fh===void 0&&(this.fh=await this.fs.open(this.input,"r"),this.size=(await this.fh.stat(this.input)).size)}async _readChunk(Qr,Gr){this.fh===void 0&&await this.open(),Qr+Gr>this.size&&(Gr=this.size-Qr);var Wr=this.subarray(Qr,Gr,!0);return await this.fh.read(Wr.dataView,0,Gr,Qr),Wr}async close(){if(this.fh){let Qr=this.fh;this.fh=void 0,await Qr.close()}}});Ji.set("base64",class extends Ba{constructor(...Qr){super(...Qr),this.input=this.input.replace(/^data:([^;]+);base64,/gim,""),this.size=this.input.length/4*3,this.input.endsWith("==")?this.size-=2:this.input.endsWith("=")&&(this.size-=1)}async _readChunk(Qr,Gr){let Wr,Kr,Yr=this.input;Qr===void 0?(Qr=0,Wr=0,Kr=0):(Wr=4*Math.floor(Qr/3),Kr=Qr-Wr/4*3),Gr===void 0&&(Gr=this.size);let Zr=Qr+Gr,tn=Wr+4*Math.ceil(Zr/3);Yr=Yr.slice(Wr,tn);let ln=Math.min(Gr,this.size-Qr);if(Jo){let dn=$o.from(Yr,"base64").slice(Kr,Kr+ln);return this.set(dn,Qr,!0)}{let dn=this.subarray(Qr,ln,!0),yn=atob(Yr),Sn=dn.toUint8();for(let kn=0;kn<ln;kn++)Sn[kn]=yn.charCodeAt(Kr+kn);return dn}}});var Xo=class extends Ua{static canHandle(Gr,Wr){return Wr===18761||Wr===19789}extendOptions(Gr){let{ifd0:Wr,xmp:Kr,iptc:Yr,icc:Zr}=Gr;Kr.enabled&&Wr.deps.add(700),Yr.enabled&&Wr.deps.add(33723),Zr.enabled&&Wr.deps.add(34675),Wr.finalizeFilters()}async parse(){let{tiff:Gr,xmp:Wr,iptc:Kr,icc:Yr}=this.options;if(Gr.enabled||Wr.enabled||Kr.enabled||Yr.enabled){let Zr=Math.max(Cs(this.options),this.options.chunkSize);await this.file.ensureChunk(0,Zr),this.createParser("tiff",this.file),this.parsers.tiff.parseHeader(),await this.parsers.tiff.parseIfd0Block(),this.adaptTiffPropAsSegment("xmp"),this.adaptTiffPropAsSegment("iptc"),this.adaptTiffPropAsSegment("icc")}}adaptTiffPropAsSegment(Gr){if(this.parsers.tiff[Gr]){let Wr=this.parsers.tiff[Gr];this.injectSegment(Gr,Wr)}}};Kn(Xo,"type","tiff"),Yi.set("tiff",Xo);var Qu=Uo("zlib"),Ku=["ihdr","iccp","text","itxt","exif"],Qo=class extends Ua{constructor(...Gr){super(...Gr),Kn(this,"catchError",Wr=>this.errors.push(Wr)),Kn(this,"metaChunks",[]),Kn(this,"unknownChunks",[])}static canHandle(Gr,Wr){return Wr===35152&&Gr.getUint32(0)===2303741511&&Gr.getUint32(4)===218765834}async parse(){let{file:Gr}=this;await this.findPngChunksInRange(8,Gr.byteLength),await this.readSegments(this.metaChunks),this.findIhdr(),this.parseTextChunks(),await this.findExif().catch(this.catchError),await this.findXmp().catch(this.catchError),await this.findIcc().catch(this.catchError)}async findPngChunksInRange(Gr,Wr){let{file:Kr}=this;for(;Gr<Wr;){let Yr=Kr.getUint32(Gr),Zr=Kr.getUint32(Gr+4),tn=Kr.getString(Gr+4,4).toLowerCase(),ln=Yr+4+4+4,dn={type:tn,offset:Gr,length:ln,start:Gr+4+4,size:Yr,marker:Zr};Ku.includes(tn)?this.metaChunks.push(dn):this.unknownChunks.push(dn),Gr+=ln}}parseTextChunks(){let Gr=this.metaChunks.filter(Wr=>Wr.type==="text");for(let Wr of Gr){let[Kr,Yr]=this.file.getString(Wr.start,Wr.size).split("\0");this.injectKeyValToIhdr(Kr,Yr)}}injectKeyValToIhdr(Gr,Wr){let Kr=this.parsers.ihdr;Kr&&Kr.raw.set(Gr,Wr)}findIhdr(){let Gr=this.metaChunks.find(Wr=>Wr.type==="ihdr");Gr&&this.options.ihdr.enabled!==!1&&this.createParser("ihdr",Gr.chunk)}async findExif(){let Gr=this.metaChunks.find(Wr=>Wr.type==="exif");Gr&&this.injectSegment("tiff",Gr.chunk)}async findXmp(){let Gr=this.metaChunks.filter(Wr=>Wr.type==="itxt");for(let Wr of Gr)Wr.chunk.getString(0,17)==="XML:com.adobe.xmp"&&this.injectSegment("xmp",Wr.chunk)}async findIcc(){let Gr=this.metaChunks.find(ln=>ln.type==="iccp");if(!Gr)return;let{chunk:Wr}=Gr,Kr=Wr.getUint8Array(0,81),Yr=0;for(;Yr<80&&Kr[Yr]!==0;)Yr++;let Zr=Yr+2,tn=Wr.getString(0,Yr);if(this.injectKeyValToIhdr("ProfileName",tn),qo){let ln=await Qu,dn=Wr.getUint8Array(Zr);dn=ln.inflateSync(dn),this.injectSegment("icc",dn)}}};Kn(Qo,"type","png"),Yi.set("png",Qo),mi(Si,"interop",[[1,"InteropIndex"],[2,"InteropVersion"],[4096,"RelatedImageFileFormat"],[4097,"RelatedImageWidth"],[4098,"RelatedImageHeight"]]),wa(Si,"ifd0",[[11,"ProcessingSoftware"],[254,"SubfileType"],[255,"OldSubfileType"],[263,"Thresholding"],[264,"CellWidth"],[265,"CellLength"],[266,"FillOrder"],[269,"DocumentName"],[280,"MinSampleValue"],[281,"MaxSampleValue"],[285,"PageName"],[286,"XPosition"],[287,"YPosition"],[290,"GrayResponseUnit"],[297,"PageNumber"],[321,"HalftoneHints"],[322,"TileWidth"],[323,"TileLength"],[332,"InkSet"],[337,"TargetPrinter"],[18246,"Rating"],[18249,"RatingPercent"],[33550,"PixelScale"],[34264,"ModelTransform"],[34377,"PhotoshopSettings"],[50706,"DNGVersion"],[50707,"DNGBackwardVersion"],[50708,"UniqueCameraModel"],[50709,"LocalizedCameraModel"],[50736,"DNGLensInfo"],[50739,"ShadowScale"],[50740,"DNGPrivateData"],[33920,"IntergraphMatrix"],[33922,"ModelTiePoint"],[34118,"SEMInfo"],[34735,"GeoTiffDirectory"],[34736,"GeoTiffDoubleParams"],[34737,"GeoTiffAsciiParams"],[50341,"PrintIM"],[50721,"ColorMatrix1"],[50722,"ColorMatrix2"],[50723,"CameraCalibration1"],[50724,"CameraCalibration2"],[50725,"ReductionMatrix1"],[50726,"ReductionMatrix2"],[50727,"AnalogBalance"],[50728,"AsShotNeutral"],[50729,"AsShotWhiteXY"],[50730,"BaselineExposure"],[50731,"BaselineNoise"],[50732,"BaselineSharpness"],[50734,"LinearResponseLimit"],[50735,"CameraSerialNumber"],[50741,"MakerNoteSafety"],[50778,"CalibrationIlluminant1"],[50779,"CalibrationIlluminant2"],[50781,"RawDataUniqueID"],[50827,"OriginalRawFileName"],[50828,"OriginalRawFileData"],[50831,"AsShotICCProfile"],[50832,"AsShotPreProfileMatrix"],[50833,"CurrentICCProfile"],[50834,"CurrentPreProfileMatrix"],[50879,"ColorimetricReference"],[50885,"SRawType"],[50898,"PanasonicTitle"],[50899,"PanasonicTitle2"],[50931,"CameraCalibrationSig"],[50932,"ProfileCalibrationSig"],[50933,"ProfileIFD"],[50934,"AsShotProfileName"],[50936,"ProfileName"],[50937,"ProfileHueSatMapDims"],[50938,"ProfileHueSatMapData1"],[50939,"ProfileHueSatMapData2"],[50940,"ProfileToneCurve"],[50941,"ProfileEmbedPolicy"],[50942,"ProfileCopyright"],[50964,"ForwardMatrix1"],[50965,"ForwardMatrix2"],[50966,"PreviewApplicationName"],[50967,"PreviewApplicationVersion"],[50968,"PreviewSettingsName"],[50969,"PreviewSettingsDigest"],[50970,"PreviewColorSpace"],[50971,"PreviewDateTime"],[50972,"RawImageDigest"],[50973,"OriginalRawFileDigest"],[50981,"ProfileLookTableDims"],[50982,"ProfileLookTableData"],[51043,"TimeCodes"],[51044,"FrameRate"],[51058,"TStop"],[51081,"ReelName"],[51089,"OriginalDefaultFinalSize"],[51090,"OriginalBestQualitySize"],[51091,"OriginalDefaultCropSize"],[51105,"CameraLabel"],[51107,"ProfileHueSatMapEncoding"],[51108,"ProfileLookTableEncoding"],[51109,"BaselineExposureOffset"],[51110,"DefaultBlackRender"],[51111,"NewRawImageDigest"],[51112,"RawToPreviewGain"]]);var Ml=[[273,"StripOffsets"],[279,"StripByteCounts"],[288,"FreeOffsets"],[289,"FreeByteCounts"],[291,"GrayResponseCurve"],[292,"T4Options"],[293,"T6Options"],[300,"ColorResponseUnit"],[320,"ColorMap"],[324,"TileOffsets"],[325,"TileByteCounts"],[326,"BadFaxLines"],[327,"CleanFaxData"],[328,"ConsecutiveBadFaxLines"],[330,"SubIFD"],[333,"InkNames"],[334,"NumberofInks"],[336,"DotRange"],[338,"ExtraSamples"],[339,"SampleFormat"],[340,"SMinSampleValue"],[341,"SMaxSampleValue"],[342,"TransferRange"],[343,"ClipPath"],[344,"XClipPathUnits"],[345,"YClipPathUnits"],[346,"Indexed"],[347,"JPEGTables"],[351,"OPIProxy"],[400,"GlobalParametersIFD"],[401,"ProfileType"],[402,"FaxProfile"],[403,"CodingMethods"],[404,"VersionYear"],[405,"ModeNumber"],[433,"Decode"],[434,"DefaultImageColor"],[435,"T82Options"],[437,"JPEGTables"],[512,"JPEGProc"],[515,"JPEGRestartInterval"],[517,"JPEGLosslessPredictors"],[518,"JPEGPointTransforms"],[519,"JPEGQTables"],[520,"JPEGDCTables"],[521,"JPEGACTables"],[559,"StripRowCounts"],[999,"USPTOMiscellaneous"],[18247,"XP_DIP_XML"],[18248,"StitchInfo"],[28672,"SonyRawFileType"],[28688,"SonyToneCurve"],[28721,"VignettingCorrection"],[28722,"VignettingCorrParams"],[28724,"ChromaticAberrationCorrection"],[28725,"ChromaticAberrationCorrParams"],[28726,"DistortionCorrection"],[28727,"DistortionCorrParams"],[29895,"SonyCropTopLeft"],[29896,"SonyCropSize"],[32781,"ImageID"],[32931,"WangTag1"],[32932,"WangAnnotation"],[32933,"WangTag3"],[32934,"WangTag4"],[32953,"ImageReferencePoints"],[32954,"RegionXformTackPoint"],[32955,"WarpQuadrilateral"],[32956,"AffineTransformMat"],[32995,"Matteing"],[32996,"DataType"],[32997,"ImageDepth"],[32998,"TileDepth"],[33300,"ImageFullWidth"],[33301,"ImageFullHeight"],[33302,"TextureFormat"],[33303,"WrapModes"],[33304,"FovCot"],[33305,"MatrixWorldToScreen"],[33306,"MatrixWorldToCamera"],[33405,"Model2"],[33421,"CFARepeatPatternDim"],[33422,"CFAPattern2"],[33423,"BatteryLevel"],[33424,"KodakIFD"],[33445,"MDFileTag"],[33446,"MDScalePixel"],[33447,"MDColorTable"],[33448,"MDLabName"],[33449,"MDSampleInfo"],[33450,"MDPrepDate"],[33451,"MDPrepTime"],[33452,"MDFileUnits"],[33589,"AdventScale"],[33590,"AdventRevision"],[33628,"UIC1Tag"],[33629,"UIC2Tag"],[33630,"UIC3Tag"],[33631,"UIC4Tag"],[33918,"IntergraphPacketData"],[33919,"IntergraphFlagRegisters"],[33921,"INGRReserved"],[34016,"Site"],[34017,"ColorSequence"],[34018,"IT8Header"],[34019,"RasterPadding"],[34020,"BitsPerRunLength"],[34021,"BitsPerExtendedRunLength"],[34022,"ColorTable"],[34023,"ImageColorIndicator"],[34024,"BackgroundColorIndicator"],[34025,"ImageColorValue"],[34026,"BackgroundColorValue"],[34027,"PixelIntensityRange"],[34028,"TransparencyIndicator"],[34029,"ColorCharacterization"],[34030,"HCUsage"],[34031,"TrapIndicator"],[34032,"CMYKEquivalent"],[34152,"AFCP_IPTC"],[34232,"PixelMagicJBIGOptions"],[34263,"JPLCartoIFD"],[34306,"WB_GRGBLevels"],[34310,"LeafData"],[34687,"TIFF_FXExtensions"],[34688,"MultiProfiles"],[34689,"SharedData"],[34690,"T88Options"],[34732,"ImageLayer"],[34750,"JBIGOptions"],[34856,"Opto-ElectricConvFactor"],[34857,"Interlace"],[34908,"FaxRecvParams"],[34909,"FaxSubAddress"],[34910,"FaxRecvTime"],[34929,"FedexEDR"],[34954,"LeafSubIFD"],[37387,"FlashEnergy"],[37388,"SpatialFrequencyResponse"],[37389,"Noise"],[37390,"FocalPlaneXResolution"],[37391,"FocalPlaneYResolution"],[37392,"FocalPlaneResolutionUnit"],[37397,"ExposureIndex"],[37398,"TIFF-EPStandardID"],[37399,"SensingMethod"],[37434,"CIP3DataFile"],[37435,"CIP3Sheet"],[37436,"CIP3Side"],[37439,"StoNits"],[37679,"MSDocumentText"],[37680,"MSPropertySetStorage"],[37681,"MSDocumentTextPosition"],[37724,"ImageSourceData"],[40965,"InteropIFD"],[40976,"SamsungRawPointersOffset"],[40977,"SamsungRawPointersLength"],[41217,"SamsungRawByteOrder"],[41218,"SamsungRawUnknown"],[41484,"SpatialFrequencyResponse"],[41485,"Noise"],[41489,"ImageNumber"],[41490,"SecurityClassification"],[41491,"ImageHistory"],[41494,"TIFF-EPStandardID"],[41995,"DeviceSettingDescription"],[42112,"GDALMetadata"],[42113,"GDALNoData"],[44992,"ExpandSoftware"],[44993,"ExpandLens"],[44994,"ExpandFilm"],[44995,"ExpandFilterLens"],[44996,"ExpandScanner"],[44997,"ExpandFlashLamp"],[46275,"HasselbladRawImage"],[48129,"PixelFormat"],[48130,"Transformation"],[48131,"Uncompressed"],[48132,"ImageType"],[48256,"ImageWidth"],[48257,"ImageHeight"],[48258,"WidthResolution"],[48259,"HeightResolution"],[48320,"ImageOffset"],[48321,"ImageByteCount"],[48322,"AlphaOffset"],[48323,"AlphaByteCount"],[48324,"ImageDataDiscard"],[48325,"AlphaDataDiscard"],[50215,"OceScanjobDesc"],[50216,"OceApplicationSelector"],[50217,"OceIDNumber"],[50218,"OceImageLogic"],[50255,"Annotations"],[50459,"HasselbladExif"],[50547,"OriginalFileName"],[50560,"USPTOOriginalContentType"],[50656,"CR2CFAPattern"],[50710,"CFAPlaneColor"],[50711,"CFALayout"],[50712,"LinearizationTable"],[50713,"BlackLevelRepeatDim"],[50714,"BlackLevel"],[50715,"BlackLevelDeltaH"],[50716,"BlackLevelDeltaV"],[50717,"WhiteLevel"],[50718,"DefaultScale"],[50719,"DefaultCropOrigin"],[50720,"DefaultCropSize"],[50733,"BayerGreenSplit"],[50737,"ChromaBlurRadius"],[50738,"AntiAliasStrength"],[50752,"RawImageSegmentation"],[50780,"BestQualityScale"],[50784,"AliasLayerMetadata"],[50829,"ActiveArea"],[50830,"MaskedAreas"],[50935,"NoiseReductionApplied"],[50974,"SubTileBlockSize"],[50975,"RowInterleaveFactor"],[51008,"OpcodeList1"],[51009,"OpcodeList2"],[51022,"OpcodeList3"],[51041,"NoiseProfile"],[51114,"CacheVersion"],[51125,"DefaultUserCrop"],[51157,"NikonNEFInfo"],[65024,"KdcIFD"]];wa(Si,"ifd0",Ml),wa(Si,"exif",Ml),mi(Wi,"gps",[[23,{M:"Magnetic North",T:"True North"}],[25,{K:"Kilometers",M:"Miles",N:"Nautical Miles"}]]);var so=class extends qi{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===224&&Gr.getUint32(Wr+4)===1246120262&&Gr.getUint8(Wr+8)===0}parse(){return this.parseTags(),this.translate(),this.output}parseTags(){this.raw=new Map([[0,this.chunk.getUint16(0)],[2,this.chunk.getUint8(2)],[3,this.chunk.getUint16(3)],[5,this.chunk.getUint16(5)],[7,this.chunk.getUint8(7)],[8,this.chunk.getUint8(8)]])}};Kn(so,"type","jfif"),Kn(so,"headerLength",9),Ei.set("jfif",so),mi(Si,"jfif",[[0,"JFIFVersion"],[2,"ResolutionUnit"],[3,"XResolution"],[5,"YResolution"],[7,"ThumbnailWidth"],[8,"ThumbnailHeight"]]);var Ko=class extends qi{parse(){return this.parseTags(),this.translate(),this.output}parseTags(){this.raw=new Map([[0,this.chunk.getUint32(0)],[4,this.chunk.getUint32(4)],[8,this.chunk.getUint8(8)],[9,this.chunk.getUint8(9)],[10,this.chunk.getUint8(10)],[11,this.chunk.getUint8(11)],[12,this.chunk.getUint8(12)],...Array.from(this.raw)])}};Kn(Ko,"type","ihdr"),Ei.set("ihdr",Ko),mi(Si,"ihdr",[[0,"ImageWidth"],[4,"ImageHeight"],[8,"BitDepth"],[9,"ColorType"],[10,"Compression"],[11,"Filter"],[12,"Interlace"]]),mi(Wi,"ihdr",[[9,{0:"Grayscale",2:"RGB",3:"Palette",4:"Grayscale with Alpha",6:"RGB with Alpha",DEFAULT:"Unknown"}],[10,{0:"Deflate/Inflate",DEFAULT:"Unknown"}],[11,{0:"Adaptive",DEFAULT:"Unknown"}],[12,{0:"Noninterlaced",1:"Adam7 Interlace",DEFAULT:"Unknown"}]]);var qa=class extends qi{static canHandle(Gr,Wr){return Gr.getUint8(Wr+1)===226&&Gr.getUint32(Wr+4)===1229144927}static findPosition(Gr,Wr){let Kr=super.findPosition(Gr,Wr);return Kr.chunkNumber=Gr.getUint8(Wr+16),Kr.chunkCount=Gr.getUint8(Wr+17),Kr.multiSegment=Kr.chunkCount>1,Kr}static handleMultiSegments(Gr){return function(Wr){let Kr=function(Yr){let Zr=Yr[0].constructor,tn=0;for(let yn of Yr)tn+=yn.length;let ln=new Zr(tn),dn=0;for(let yn of Yr)ln.set(yn,dn),dn+=yn.length;return ln}(Wr.map(Yr=>Yr.chunk.toUint8()));return new Ki(Kr)}(Gr)}parse(){return this.raw=new Map,this.parseHeader(),this.parseTags(),this.translate(),this.output}parseHeader(){let{raw:Gr}=this;this.chunk.byteLength<84&&Ti("ICC header is too short");for(let[Wr,Kr]of Object.entries(Yu)){Wr=parseInt(Wr,10);let Yr=Kr(this.chunk,Wr);Yr!=="\0\0\0\0"&&Gr.set(Wr,Yr)}}parseTags(){let Gr,Wr,Kr,Yr,Zr,{raw:tn}=this,ln=this.chunk.getUint32(128),dn=132,yn=this.chunk.byteLength;for(;ln--;){if(Gr=this.chunk.getString(dn,4),Wr=this.chunk.getUint32(dn+4),Kr=this.chunk.getUint32(dn+8),Yr=this.chunk.getString(Wr,4),Wr+Kr>yn)return void console.warn("reached the end of the first ICC chunk. Enable options.tiff.multiSegment to read all ICC segments.");Zr=this.parseTag(Yr,Wr,Kr),Zr!==void 0&&Zr!=="\0\0\0\0"&&tn.set(Gr,Zr),dn+=12}}parseTag(Gr,Wr,Kr){switch(Gr){case"desc":return this.parseDesc(Wr);case"mluc":return this.parseMluc(Wr);case"text":return this.parseText(Wr,Kr);case"sig ":return this.parseSig(Wr)}if(!(Wr+Kr>this.chunk.byteLength))return this.chunk.getUint8Array(Wr,Kr)}parseDesc(Gr){let Wr=this.chunk.getUint32(Gr+8)-1;return ba(this.chunk.getString(Gr+12,Wr))}parseText(Gr,Wr){return ba(this.chunk.getString(Gr+8,Wr-8))}parseSig(Gr){return ba(this.chunk.getString(Gr+8,4))}parseMluc(Gr){let{chunk:Wr}=this,Kr=Wr.getUint32(Gr+8),Yr=Wr.getUint32(Gr+12),Zr=Gr+16,tn=[];for(let ln=0;ln<Kr;ln++){let dn=Wr.getString(Zr+0,2),yn=Wr.getString(Zr+2,2),Sn=Wr.getUint32(Zr+4),kn=Wr.getUint32(Zr+8)+Gr,An=ba(Wr.getUnicodeString(kn,Sn));tn.push({lang:dn,country:yn,text:An}),Zr+=Yr}return Kr===1?tn[0].text:tn}translateValue(Gr,Wr){return typeof Gr=="string"?Wr[Gr]||Wr[Gr.toLowerCase()]||Gr:Wr[Gr]||Gr}};Kn(qa,"type","icc"),Kn(qa,"multiSegment",!0),Kn(qa,"headerLength",18);var Yu={4:na,8:function(Qr,Gr){return[Qr.getUint8(Gr),Qr.getUint8(Gr+1)>>4,Qr.getUint8(Gr+1)%16].map(Wr=>Wr.toString(10)).join(".")},12:na,16:na,20:na,24:function(Qr,Gr){let Wr=Qr.getUint16(Gr),Kr=Qr.getUint16(Gr+2)-1,Yr=Qr.getUint16(Gr+4),Zr=Qr.getUint16(Gr+6),tn=Qr.getUint16(Gr+8),ln=Qr.getUint16(Gr+10);return new Date(Date.UTC(Wr,Kr,Yr,Zr,tn,ln))},36:na,40:na,48:na,52:na,64:(Qr,Gr)=>Qr.getUint32(Gr),80:na};function na(Qr,Gr){return ba(Qr.getString(Gr,4))}Ei.set("icc",qa),mi(Si,"icc",[[4,"ProfileCMMType"],[8,"ProfileVersion"],[12,"ProfileClass"],[16,"ColorSpaceData"],[20,"ProfileConnectionSpace"],[24,"ProfileDateTime"],[36,"ProfileFileSignature"],[40,"PrimaryPlatform"],[44,"CMMFlags"],[48,"DeviceManufacturer"],[52,"DeviceModel"],[56,"DeviceAttributes"],[64,"RenderingIntent"],[68,"ConnectionSpaceIlluminant"],[80,"ProfileCreator"],[84,"ProfileID"],["Header","ProfileHeader"],["MS00","WCSProfiles"],["bTRC","BlueTRC"],["bXYZ","BlueMatrixColumn"],["bfd","UCRBG"],["bkpt","MediaBlackPoint"],["calt","CalibrationDateTime"],["chad","ChromaticAdaptation"],["chrm","Chromaticity"],["ciis","ColorimetricIntentImageState"],["clot","ColorantTableOut"],["clro","ColorantOrder"],["clrt","ColorantTable"],["cprt","ProfileCopyright"],["crdi","CRDInfo"],["desc","ProfileDescription"],["devs","DeviceSettings"],["dmdd","DeviceModelDesc"],["dmnd","DeviceMfgDesc"],["dscm","ProfileDescriptionML"],["fpce","FocalPlaneColorimetryEstimates"],["gTRC","GreenTRC"],["gXYZ","GreenMatrixColumn"],["gamt","Gamut"],["kTRC","GrayTRC"],["lumi","Luminance"],["meas","Measurement"],["meta","Metadata"],["mmod","MakeAndModel"],["ncl2","NamedColor2"],["ncol","NamedColor"],["ndin","NativeDisplayInfo"],["pre0","Preview0"],["pre1","Preview1"],["pre2","Preview2"],["ps2i","PS2RenderingIntent"],["ps2s","PostScript2CSA"],["psd0","PostScript2CRD0"],["psd1","PostScript2CRD1"],["psd2","PostScript2CRD2"],["psd3","PostScript2CRD3"],["pseq","ProfileSequenceDesc"],["psid","ProfileSequenceIdentifier"],["psvm","PS2CRDVMSize"],["rTRC","RedTRC"],["rXYZ","RedMatrixColumn"],["resp","OutputResponse"],["rhoc","ReflectionHardcopyOrigColorimetry"],["rig0","PerceptualRenderingIntentGamut"],["rig2","SaturationRenderingIntentGamut"],["rpoc","ReflectionPrintOutputColorimetry"],["sape","SceneAppearanceEstimates"],["scoe","SceneColorimetryEstimates"],["scrd","ScreeningDesc"],["scrn","Screening"],["targ","CharTarget"],["tech","Technology"],["vcgt","VideoCardGamma"],["view","ViewingConditions"],["vued","ViewingCondDesc"],["wtpt","MediaWhitePoint"]]);var Fo={"4d2p":"Erdt Systems",AAMA:"Aamazing Technologies",ACER:"Acer",ACLT:"Acolyte Color Research",ACTI:"Actix Sytems",ADAR:"Adara Technology",ADBE:"Adobe",ADI:"ADI Systems",AGFA:"Agfa Graphics",ALMD:"Alps Electric",ALPS:"Alps Electric",ALWN:"Alwan Color Expertise",AMTI:"Amiable Technologies",AOC:"AOC International",APAG:"Apago",APPL:"Apple Computer",AST:"AST","AT&T":"AT&T",BAEL:"BARBIERI electronic",BRCO:"Barco NV",BRKP:"Breakpoint",BROT:"Brother",BULL:"Bull",BUS:"Bus Computer Systems","C-IT":"C-Itoh",CAMR:"Intel",CANO:"Canon",CARR:"Carroll Touch",CASI:"Casio",CBUS:"Colorbus PL",CEL:"Crossfield",CELx:"Crossfield",CGS:"CGS Publishing Technologies International",CHM:"Rochester Robotics",CIGL:"Colour Imaging Group, London",CITI:"Citizen",CL00:"Candela",CLIQ:"Color IQ",CMCO:"Chromaco",CMiX:"CHROMiX",COLO:"Colorgraphic Communications",COMP:"Compaq",COMp:"Compeq/Focus Technology",CONR:"Conrac Display Products",CORD:"Cordata Technologies",CPQ:"Compaq",CPRO:"ColorPro",CRN:"Cornerstone",CTX:"CTX International",CVIS:"ColorVision",CWC:"Fujitsu Laboratories",DARI:"Darius Technology",DATA:"Dataproducts",DCP:"Dry Creek Photo",DCRC:"Digital Contents Resource Center, Chung-Ang University",DELL:"Dell Computer",DIC:"Dainippon Ink and Chemicals",DICO:"Diconix",DIGI:"Digital","DL&C":"Digital Light & Color",DPLG:"Doppelganger",DS:"Dainippon Screen",DSOL:"DOOSOL",DUPN:"DuPont",EPSO:"Epson",ESKO:"Esko-Graphics",ETRI:"Electronics and Telecommunications Research Institute",EVER:"Everex Systems",EXAC:"ExactCODE",Eizo:"Eizo",FALC:"Falco Data Products",FF:"Fuji Photo Film",FFEI:"FujiFilm Electronic Imaging",FNRD:"Fnord Software",FORA:"Fora",FORE:"Forefront Technology",FP:"Fujitsu",FPA:"WayTech Development",FUJI:"Fujitsu",FX:"Fuji Xerox",GCC:"GCC Technologies",GGSL:"Global Graphics Software",GMB:"Gretagmacbeth",GMG:"GMG",GOLD:"GoldStar Technology",GOOG:"Google",GPRT:"Giantprint",GTMB:"Gretagmacbeth",GVC:"WayTech Development",GW2K:"Sony",HCI:"HCI",HDM:"Heidelberger Druckmaschinen",HERM:"Hermes",HITA:"Hitachi America",HP:"Hewlett-Packard",HTC:"Hitachi",HiTi:"HiTi Digital",IBM:"IBM",IDNT:"Scitex",IEC:"Hewlett-Packard",IIYA:"Iiyama North America",IKEG:"Ikegami Electronics",IMAG:"Image Systems",IMI:"Ingram Micro",INTC:"Intel",INTL:"N/A (INTL)",INTR:"Intra Electronics",IOCO:"Iocomm International Technology",IPS:"InfoPrint Solutions Company",IRIS:"Scitex",ISL:"Ichikawa Soft Laboratory",ITNL:"N/A (ITNL)",IVM:"IVM",IWAT:"Iwatsu Electric",Idnt:"Scitex",Inca:"Inca Digital Printers",Iris:"Scitex",JPEG:"Joint Photographic Experts Group",JSFT:"Jetsoft Development",JVC:"JVC Information Products",KART:"Scitex",KFC:"KFC Computek Components",KLH:"KLH Computers",KMHD:"Konica Minolta",KNCA:"Konica",KODA:"Kodak",KYOC:"Kyocera",Kart:"Scitex",LCAG:"Leica",LCCD:"Leeds Colour",LDAK:"Left Dakota",LEAD:"Leading Technology",LEXM:"Lexmark International",LINK:"Link Computer",LINO:"Linotronic",LITE:"Lite-On",Leaf:"Leaf",Lino:"Linotronic",MAGC:"Mag Computronic",MAGI:"MAG Innovision",MANN:"Mannesmann",MICN:"Micron Technology",MICR:"Microtek",MICV:"Microvitec",MINO:"Minolta",MITS:"Mitsubishi Electronics America",MITs:"Mitsuba",MNLT:"Minolta",MODG:"Modgraph",MONI:"Monitronix",MONS:"Monaco Systems",MORS:"Morse Technology",MOTI:"Motive Systems",MSFT:"Microsoft",MUTO:"MUTOH INDUSTRIES",Mits:"Mitsubishi Electric",NANA:"NANAO",NEC:"NEC",NEXP:"NexPress Solutions",NISS:"Nissei Sangyo America",NKON:"Nikon",NONE:"none",OCE:"Oce Technologies",OCEC:"OceColor",OKI:"Oki",OKID:"Okidata",OKIP:"Okidata",OLIV:"Olivetti",OLYM:"Olympus",ONYX:"Onyx Graphics",OPTI:"Optiquest",PACK:"Packard Bell",PANA:"Matsushita Electric Industrial",PANT:"Pantone",PBN:"Packard Bell",PFU:"PFU",PHIL:"Philips Consumer Electronics",PNTX:"HOYA",POne:"Phase One A/S",PREM:"Premier Computer Innovations",PRIN:"Princeton Graphic Systems",PRIP:"Princeton Publishing Labs",QLUX:"Hong Kong",QMS:"QMS",QPCD:"QPcard AB",QUAD:"QuadLaser",QUME:"Qume",RADI:"Radius",RDDx:"Integrated Color Solutions",RDG:"Roland DG",REDM:"REDMS Group",RELI:"Relisys",RGMS:"Rolf Gierling Multitools",RICO:"Ricoh",RNLD:"Edmund Ronald",ROYA:"Royal",RPC:"Ricoh Printing Systems",RTL:"Royal Information Electronics",SAMP:"Sampo",SAMS:"Samsung",SANT:"Jaime Santana Pomares",SCIT:"Scitex",SCRN:"Dainippon Screen",SDP:"Scitex",SEC:"Samsung",SEIK:"Seiko Instruments",SEIk:"Seikosha",SGUY:"ScanGuy.com",SHAR:"Sharp Laboratories",SICC:"International Color Consortium",SONY:"Sony",SPCL:"SpectraCal",STAR:"Star",STC:"Sampo Technology",Scit:"Scitex",Sdp:"Scitex",Sony:"Sony",TALO:"Talon Technology",TAND:"Tandy",TATU:"Tatung",TAXA:"TAXAN America",TDS:"Tokyo Denshi Sekei",TECO:"TECO Information Systems",TEGR:"Tegra",TEKT:"Tektronix",TI:"Texas Instruments",TMKR:"TypeMaker",TOSB:"Toshiba",TOSH:"Toshiba",TOTK:"TOTOKU ELECTRIC",TRIU:"Triumph",TSBT:"Toshiba",TTX:"TTX Computer Products",TVM:"TVM Professional Monitor",TW:"TW Casper",ULSX:"Ulead Systems",UNIS:"Unisys",UTZF:"Utz Fehlau & Sohn",VARI:"Varityper",VIEW:"Viewsonic",VISL:"Visual communication",VIVO:"Vivo Mobile Communication",WANG:"Wang",WLBR:"Wilbur Imaging",WTG2:"Ware To Go",WYSE:"WYSE Technology",XERX:"Xerox",XRIT:"X-Rite",ZRAN:"Zoran",Zebr:"Zebra Technologies",appl:"Apple Computer",bICC:"basICColor",berg:"bergdesign",ceyd:"Integrated Color Solutions",clsp:"MacDermid ColorSpan",ds:"Dainippon Screen",dupn:"DuPont",ffei:"FujiFilm Electronic Imaging",flux:"FluxData",iris:"Scitex",kart:"Scitex",lcms:"Little CMS",lino:"Linotronic",none:"none",ob4d:"Erdt Systems",obic:"Medigraph",quby:"Qubyx Sarl",scit:"Scitex",scrn:"Dainippon Screen",sdp:"Scitex",siwi:"SIWI GRAFIKA",yxym:"YxyMaster"},Fl={scnr:"Scanner",mntr:"Monitor",prtr:"Printer",link:"Device Link",abst:"Abstract",spac:"Color Space Conversion Profile",nmcl:"Named Color",cenc:"ColorEncodingSpace profile",mid:"MultiplexIdentification profile",mlnk:"MultiplexLink profile",mvis:"MultiplexVisualization profile",nkpf:"Nikon Input Device Profile (NON-STANDARD!)"};mi(Wi,"icc",[[4,Fo],[12,Fl],[40,Object.assign({},Fo,Fl)],[48,Fo],[80,Fo],[64,{0:"Perceptual",1:"Relative Colorimetric",2:"Saturation",3:"Absolute Colorimetric"}],["tech",{amd:"Active Matrix Display",crt:"Cathode Ray Tube Display",kpcd:"Photo CD",pmd:"Passive Matrix Display",dcam:"Digital Camera",dcpj:"Digital Cinema Projector",dmpc:"Digital Motion Picture Camera",dsub:"Dye Sublimation Printer",epho:"Electrophotographic Printer",esta:"Electrostatic Printer",flex:"Flexography",fprn:"Film Writer",fscn:"Film Scanner",grav:"Gravure",ijet:"Ink Jet Printer",imgs:"Photo Image Setter",mpfr:"Motion Picture Film Recorder",mpfs:"Motion Picture Film Scanner",offs:"Offset Lithography",pjtv:"Projection Television",rpho:"Photographic Paper Printer",rscn:"Reflective Scanner",silk:"Silkscreen",twax:"Thermal Wax Printer",vidc:"Video Camera",vidm:"Video Monitor"}]]);var Fa=class extends qi{static canHandle(Gr,Wr,Kr){return Gr.getUint8(Wr+1)===237&&Gr.getString(Wr+4,9)==="Photoshop"&&this.containsIptc8bim(Gr,Wr,Kr)!==void 0}static headerLength(Gr,Wr,Kr){let Yr,Zr=this.containsIptc8bim(Gr,Wr,Kr);if(Zr!==void 0)return Yr=Gr.getUint8(Wr+Zr+7),Yr%2!=0&&(Yr+=1),Yr===0&&(Yr=4),Zr+8+Yr}static containsIptc8bim(Gr,Wr,Kr){for(let Yr=0;Yr<Kr;Yr++)if(this.isIptcSegmentHead(Gr,Wr+Yr))return Yr}static isIptcSegmentHead(Gr,Wr){return Gr.getUint8(Wr)===56&&Gr.getUint32(Wr)===943868237&&Gr.getUint16(Wr+4)===1028}parse(){let{raw:Gr}=this,Wr=this.chunk.byteLength-1,Kr=!1;for(let Yr=0;Yr<Wr;Yr++)if(this.chunk.getUint8(Yr)===28&&this.chunk.getUint8(Yr+1)===2){Kr=!0;let Zr=this.chunk.getUint16(Yr+3),tn=this.chunk.getUint8(Yr+2),ln=this.chunk.getLatin1String(Yr+5,Zr);Gr.set(tn,this.pluralizeValue(Gr.get(tn),ln)),Yr+=4+Zr}else if(Kr)break;return this.translate(),this.output}pluralizeValue(Gr,Wr){return Gr!==void 0?Gr instanceof Array?(Gr.push(Wr),Gr):[Gr,Wr]:Wr}};Kn(Fa,"type","iptc"),Kn(Fa,"translateValues",!1),Kn(Fa,"reviveValues",!1),Ei.set("iptc",Fa),mi(Si,"iptc",[[0,"ApplicationRecordVersion"],[3,"ObjectTypeReference"],[4,"ObjectAttributeReference"],[5,"ObjectName"],[7,"EditStatus"],[8,"EditorialUpdate"],[10,"Urgency"],[12,"SubjectReference"],[15,"Category"],[20,"SupplementalCategories"],[22,"FixtureIdentifier"],[25,"Keywords"],[26,"ContentLocationCode"],[27,"ContentLocationName"],[30,"ReleaseDate"],[35,"ReleaseTime"],[37,"ExpirationDate"],[38,"ExpirationTime"],[40,"SpecialInstructions"],[42,"ActionAdvised"],[45,"ReferenceService"],[47,"ReferenceDate"],[50,"ReferenceNumber"],[55,"DateCreated"],[60,"TimeCreated"],[62,"DigitalCreationDate"],[63,"DigitalCreationTime"],[65,"OriginatingProgram"],[70,"ProgramVersion"],[75,"ObjectCycle"],[80,"Byline"],[85,"BylineTitle"],[90,"City"],[92,"Sublocation"],[95,"State"],[100,"CountryCode"],[101,"Country"],[103,"OriginalTransmissionReference"],[105,"Headline"],[110,"Credit"],[115,"Source"],[116,"CopyrightNotice"],[118,"Contact"],[120,"Caption"],[121,"LocalCaption"],[122,"Writer"],[125,"RasterizedCaption"],[130,"ImageType"],[131,"ImageOrientation"],[135,"LanguageIdentifier"],[150,"AudioType"],[151,"AudioSamplingRate"],[152,"AudioSamplingResolution"],[153,"AudioDuration"],[154,"AudioOutcue"],[184,"JobID"],[185,"MasterDocumentID"],[186,"ShortDocumentID"],[187,"UniqueDocumentID"],[188,"OwnerID"],[200,"ObjectPreviewFileFormat"],[201,"ObjectPreviewFileVersion"],[202,"ObjectPreviewData"],[221,"Prefs"],[225,"ClassifyState"],[228,"SimilarityIndex"],[230,"DocumentNotes"],[231,"DocumentHistory"],[232,"ExifCameraInfo"],[255,"CatalogSets"]]),mi(Wi,"iptc",[[10,{0:"0 (reserved)",1:"1 (most urgent)",2:"2",3:"3",4:"4",5:"5 (normal urgency)",6:"6",7:"7",8:"8 (least urgent)",9:"9 (user-defined priority)"}],[75,{a:"Morning",b:"Both Morning and Evening",p:"Evening"}],[131,{L:"Landscape",P:"Portrait",S:"Square"}]]);var zs=Xu;var Vs=za(mo()),Ql=za(is());var Xl=["DateTimeOriginal","ExposureTime","FNumber","Flash","FocalLengthIn35mmFormat","ISO","LensMake","LensModel","Make","Model"];var es=class{async uploadPhotos(Gr){let Wr=new FormData(Gr),Kr=Wr.getAll("files")??[],Yr=Wr.get("parseExif")==="on";if(Kr.length>10){alert("You can only upload 10 photos at a time");return}let Zr=Kr.map(async ln=>{let dn,yn,Sn;try{if(dn=await Ma(ln),dn===null||typeof dn!="string"){console.error("File data URL is not a string:",dn),alert("Error reading file.");return}}catch(ri){console.error("Error reading file as Data URL:",ri),alert("Error reading file.");return}if(Yr)try{let ri=await zs.parse(ln,{pick:Xl});console.log("EXIF tags:",await zs.parse(ln)),yn=Ju(ri)}catch(ri){console.error("Error reading EXIF data:",ri)}try{Sn=await ro(dn,{width:2e3,height:2e3,maxSize:1e3*1e3,mode:"contain"})}catch(ri){console.error("Error resizing image:",ri),alert("Error resizing image.");return}let kn=to(Sn.path),An=new FormData;An.append("file",kn,ln.name),An.append("width",String(Sn.width)),An.append("height",String(Sn.height)),yn&&An.append("exif",JSON.stringify(yn));let Bn=await fetch("/actions/photo",{method:"POST",body:An});if(!Bn.ok){alert(await Bn.text());return}let jn=await Bn.text(),Vn=document.createElement("div");Vn.innerHTML=jn;let ti=Vn?.firstElementChild?.id,si=document.querySelector("#image-preview");if(si){let ri=Vn.firstElementChild;ri&&si.insertBefore(ri,si.firstChild),Vs.default.process(si);let oi=si.querySelector(`#delete-photo-${ti}`);if(!oi)return;Vs.default.process(oi),Ql.default.processNode(oi)}});await Promise.all(Zr);let tn=Gr.querySelector("input[type='file']");tn instanceof HTMLInputElement&&(tn.value="")}},$u=1e6;function Ju(Qr,Gr=$u){let Wr={};for(let[Kr,Yr]of Object.entries(Qr)){let Zr=Kr[0].toLowerCase()+Kr.slice(1);typeof Yr=="number"?Wr[Zr]=Math.round(Yr*Gr):Array.isArray(Yr)?Wr[Zr]=Yr.map(tn=>typeof tn=="number"?Math.round(tn*Gr):tn):Yr instanceof Date?Wr[Zr]=Yr.toISOString():typeof Yr=="string"||typeof Yr=="boolean"?Wr[Zr]=Yr:Yr===void 0?Wr[Zr]=void 0:Wr[Zr]=String(Yr)}return Wr}var Kl=new Ro({layoutMode:"justified"});Kl.init();Ws.default.onLoad(function(Qr){if(No.maybeInitForElement(Qr),Qr.id==="gallery-sort-dialog"){let Gr=Qr.querySelectorAll(".sortable");for(let Wr of Array.from(Gr))new Tl(Wr,{animation:150})}});Xs.default.browserInit();var Zi=globalThis;Zi.htmx=Zi.htmx??Ws.default;Zi._hyperscript=Zi._hyperscript??Xs.default;Zi.Grain=Zi.Grain??{};Zi.Grain.uploadPage=new es;Zi.Grain.profileDialog=new Lo;Zi.Grain.galleryLayout=Kl;Zi.Grain.photoManip=xs; 17 17 /*! Bundled license information: 18 18 19 19 sortablejs/modular/sortable.esm.js:
+53 -6
static/styles.css
··· 13 13 --color-zinc-100: oklch(96.7% 0.001 286.375); 14 14 --color-zinc-200: oklch(92% 0.004 286.32); 15 15 --color-zinc-300: oklch(87.1% 0.006 286.286); 16 + --color-zinc-400: oklch(70.5% 0.015 286.067); 16 17 --color-zinc-500: oklch(55.2% 0.016 285.938); 17 18 --color-zinc-600: oklch(44.2% 0.017 285.786); 18 19 --color-zinc-700: oklch(37% 0.013 285.805); ··· 294 295 max-width: 96rem; 295 296 } 296 297 } 297 - .-m-1 { 298 - margin: calc(var(--spacing) * -1); 299 - } 300 298 .-m-2 { 301 299 margin: calc(var(--spacing) * -2); 302 300 } ··· 357 355 .ml-0 { 358 356 margin-left: calc(var(--spacing) * 0); 359 357 } 358 + .ml-1 { 359 + margin-left: calc(var(--spacing) * 1); 360 + } 361 + .ml-6 { 362 + margin-left: calc(var(--spacing) * 6); 363 + } 360 364 .block { 361 365 display: block; 362 366 } ··· 394 398 .h-0 { 395 399 height: calc(var(--spacing) * 0); 396 400 } 401 + .h-1 { 402 + height: calc(var(--spacing) * 1); 403 + } 397 404 .h-1\/2 { 398 405 height: calc(1/2 * 100%); 399 406 } ··· 420 427 } 421 428 .h-full { 422 429 height: 100%; 423 - } 424 - .max-h-\[calc\(100vh-100px\)\] { 425 - max-height: calc(100vh - 100px); 426 430 } 427 431 .min-h-screen { 428 432 min-height: 100vh; 429 433 } 434 + .w-1 { 435 + width: calc(var(--spacing) * 1); 436 + } 430 437 .w-1\/3 { 431 438 width: calc(1/3 * 100%); 439 + } 440 + .w-2 { 441 + width: calc(var(--spacing) * 2); 432 442 } 433 443 .w-2\/3 { 434 444 width: calc(2/3 * 100%); ··· 460 470 .max-w-5xl { 461 471 max-width: var(--container-5xl); 462 472 } 473 + .max-w-\[60\%\] { 474 + max-width: 60%; 475 + } 463 476 .max-w-\[200px\] { 464 477 max-width: 200px; 465 478 } ··· 484 497 .flex-1 { 485 498 flex: 1; 486 499 } 500 + .flex-shrink { 501 + flex-shrink: 1; 502 + } 487 503 .shrink-0 { 488 504 flex-shrink: 0; 489 505 } 506 + .border-collapse { 507 + border-collapse: collapse; 508 + } 490 509 .transform { 491 510 transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); 492 511 } ··· 498 517 } 499 518 .resize { 500 519 resize: both; 520 + } 521 + .list-disc { 522 + list-style-type: disc; 501 523 } 502 524 .grid-cols-1 { 503 525 grid-template-columns: repeat(1, minmax(0, 1fr)); ··· 543 565 } 544 566 .gap-4 { 545 567 gap: calc(var(--spacing) * 4); 568 + } 569 + .space-y-1 { 570 + :where(& > :not(:last-child)) { 571 + --tw-space-y-reverse: 0; 572 + margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse)); 573 + margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse))); 574 + } 546 575 } 547 576 .space-y-2 { 548 577 :where(& > :not(:last-child)) { ··· 726 755 .pl-2 { 727 756 padding-left: calc(var(--spacing) * 2); 728 757 } 758 + .pl-5 { 759 + padding-left: calc(var(--spacing) * 5); 760 + } 729 761 .text-center { 730 762 text-align: center; 731 763 } ··· 836 868 .ring-sky-500 { 837 869 --tw-ring-color: var(--color-sky-500); 838 870 } 871 + .outline { 872 + outline-style: var(--tw-outline-style); 873 + outline-width: 1px; 874 + } 839 875 .invert { 840 876 --tw-invert: invert(100%); 841 877 filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); ··· 987 1023 min-width: 120px; 988 1024 } 989 1025 } 1026 + .sm\:min-w-md { 1027 + @media (width >= 40rem) { 1028 + min-width: var(--container-md); 1029 + } 1030 + } 990 1031 .sm\:grid-cols-3 { 991 1032 @media (width >= 40rem) { 992 1033 grid-template-columns: repeat(3, minmax(0, 1fr)); ··· 1229 1270 inherits: false; 1230 1271 initial-value: 0 0 #0000; 1231 1272 } 1273 + @property --tw-outline-style { 1274 + syntax: "*"; 1275 + inherits: false; 1276 + initial-value: solid; 1277 + } 1232 1278 @property --tw-blur { 1233 1279 syntax: "*"; 1234 1280 inherits: false; ··· 1313 1359 --tw-ring-offset-width: 0px; 1314 1360 --tw-ring-offset-color: #fff; 1315 1361 --tw-ring-offset-shadow: 0 0 #0000; 1362 + --tw-outline-style: solid; 1316 1363 --tw-blur: initial; 1317 1364 --tw-brightness: initial; 1318 1365 --tw-contrast: initial;