From ea5656d792ab8e416c841851112b5892465287e5 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Fri, 3 Oct 2025 15:24:32 +0530 Subject: [PATCH 01/30] Added basic controller, logger, and db --- .gitignore | 2 + README.md | 10 ++ leetcode-wrapper.sln | 36 ++++++ {1kosmos => leetcode/1kosmos}/all.csv | 0 .../1kosmos}/more-than-six-months.csv | 0 {6sense => leetcode/6sense}/all.csv | 0 .../6sense}/more-than-six-months.csv | 0 {6sense => leetcode/6sense}/six-months.csv | 0 {accelya => leetcode/accelya}/all.csv | 0 .../accelya}/more-than-six-months.csv | 0 {accenture => leetcode/accenture}/all.csv | 0 .../accenture}/more-than-six-months.csv | 0 .../accenture}/six-months.csv | 0 {accolite => leetcode/accolite}/all.csv | 0 .../accolite}/more-than-six-months.csv | 0 .../accolite}/six-months.csv | 0 .../accolite}/thirty-days.csv | 0 .../accolite}/three-months.csv | 0 {acko => leetcode/acko}/all.csv | 0 .../acko}/more-than-six-months.csv | 0 {acorns => leetcode/acorns}/all.csv | 0 {activision => leetcode/activision}/all.csv | 0 .../activision}/more-than-six-months.csv | 0 .../activision}/six-months.csv | 0 {addepar => leetcode/addepar}/all.csv | 0 .../addepar}/more-than-six-months.csv | 0 {adobe => leetcode/adobe}/all.csv | 0 .../adobe}/more-than-six-months.csv | 0 {adobe => leetcode/adobe}/six-months.csv | 0 {adobe => leetcode/adobe}/thirty-days.csv | 0 {adobe => leetcode/adobe}/three-months.csv | 0 {adp => leetcode/adp}/all.csv | 0 {adp => leetcode/adp}/six-months.csv | 0 {aetion => leetcode/aetion}/all.csv | 0 .../aetion}/more-than-six-months.csv | 0 {affinity => leetcode/affinity}/all.csv | 0 .../affinity}/more-than-six-months.csv | 0 {affirm => leetcode/affirm}/all.csv | 0 .../affirm}/more-than-six-months.csv | 0 {affirm => leetcode/affirm}/six-months.csv | 0 {affirm => leetcode/affirm}/three-months.csv | 0 {agoda => leetcode/agoda}/all.csv | 0 .../agoda}/more-than-six-months.csv | 0 {agoda => leetcode/agoda}/six-months.csv | 0 {agoda => leetcode/agoda}/three-months.csv | 0 {airbnb => leetcode/airbnb}/all.csv | 0 .../airbnb}/more-than-six-months.csv | 0 {airbnb => leetcode/airbnb}/six-months.csv | 0 {airbnb => leetcode/airbnb}/thirty-days.csv | 0 {airbnb => leetcode/airbnb}/three-months.csv | 0 {airbus => leetcode/airbus}/all.csv | 0 .../airbus}/more-than-six-months.csv | 0 {airbus => leetcode/airbus}/six-months.csv | 0 {airbus => leetcode/airbus}/three-months.csv | 0 {airtel => leetcode/airtel}/all.csv | 0 .../airtel}/more-than-six-months.csv | 0 {airtel => leetcode/airtel}/six-months.csv | 0 {airwallex => leetcode/airwallex}/all.csv | 0 .../airwallex}/more-than-six-months.csv | 0 {akamai => leetcode/akamai}/all.csv | 0 .../akamai}/more-than-six-months.csv | 0 .../akuna-capital}/all.csv | 0 .../akuna-capital}/more-than-six-months.csv | 0 .../akuna-capital}/six-months.csv | 0 .../akuna-capital}/three-months.csv | 0 {alibaba => leetcode/alibaba}/all.csv | 0 .../alibaba}/more-than-six-months.csv | 0 {allincall => leetcode/allincall}/all.csv | 0 .../allincall}/more-than-six-months.csv | 0 {alphagrep => leetcode/alphagrep}/all.csv | 0 .../alphagrep}/more-than-six-months.csv | 0 {alphonso => leetcode/alphonso}/all.csv | 0 .../alphonso}/more-than-six-months.csv | 0 {alten => leetcode/alten}/all.csv | 0 {altimetrik => leetcode/altimetrik}/all.csv | 0 .../altimetrik}/more-than-six-months.csv | 0 {amadeus => leetcode/amadeus}/all.csv | 0 .../amadeus}/more-than-six-months.csv | 0 {amazon => leetcode/amazon}/all.csv | 0 .../amazon}/more-than-six-months.csv | 0 {amazon => leetcode/amazon}/six-months.csv | 0 {amazon => leetcode/amazon}/thirty-days.csv | 0 {amazon => leetcode/amazon}/three-months.csv | 0 {amd => leetcode/amd}/all.csv | 0 .../amd}/more-than-six-months.csv | 0 {amd => leetcode/amd}/six-months.csv | 0 {amdocs => leetcode/amdocs}/all.csv | 0 .../amdocs}/more-than-six-months.csv | 0 .../american-airlines}/all.csv | 0 .../american-express}/all.csv | 0 .../more-than-six-months.csv | 0 .../american-express}/six-months.csv | 0 .../american-express}/three-months.csv | 0 {amplitude => leetcode/amplitude}/all.csv | 0 .../analytics-quotient}/all.csv | 0 .../more-than-six-months.csv | 0 {andela => leetcode/andela}/all.csv | 0 .../andela}/more-than-six-months.csv | 0 {anduril => leetcode/anduril}/all.csv | 0 .../anduril}/more-than-six-months.csv | 0 {anduril => leetcode/anduril}/six-months.csv | 0 {anduril => leetcode/anduril}/thirty-days.csv | 0 .../anduril}/three-months.csv | 0 {anthropic => leetcode/anthropic}/all.csv | 0 .../anthropic}/more-than-six-months.csv | 0 .../anthropic}/six-months.csv | 0 .../anthropic}/thirty-days.csv | 0 .../anthropic}/three-months.csv | 0 {anyscale => leetcode/anyscale}/all.csv | 0 .../anyscale}/more-than-six-months.csv | 0 .../anyscale}/six-months.csv | 0 {aon => leetcode/aon}/all.csv | 0 .../aon}/more-than-six-months.csv | 0 {apna => leetcode/apna}/all.csv | 0 .../apna}/more-than-six-months.csv | 0 {apolloio => leetcode/apolloio}/all.csv | 0 .../apolloio}/more-than-six-months.csv | 0 {appdynamics => leetcode/appdynamics}/all.csv | 0 .../appdynamics}/more-than-six-months.csv | 0 {appfolio => leetcode/appfolio}/all.csv | 0 .../appfolio}/more-than-six-months.csv | 0 {apple => leetcode/apple}/all.csv | 0 .../apple}/more-than-six-months.csv | 0 {apple => leetcode/apple}/six-months.csv | 0 {apple => leetcode/apple}/thirty-days.csv | 0 {apple => leetcode/apple}/three-months.csv | 0 .../applied-intuition}/all.csv | 0 .../more-than-six-months.csv | 0 .../applied-intuition}/six-months.csv | 0 .../applied-intuition}/thirty-days.csv | 0 .../applied-intuition}/three-months.csv | 0 {applovin => leetcode/applovin}/all.csv | 0 .../applovin}/more-than-six-months.csv | 0 {appviewx => leetcode/appviewx}/all.csv | 0 .../appviewx}/more-than-six-months.csv | 0 .../aqr-capital-management-llc}/all.csv | 0 .../more-than-six-months.csv | 0 {arcesium => leetcode/arcesium}/all.csv | 0 .../arcesium}/more-than-six-months.csv | 0 {argo-ai => leetcode/argo-ai}/all.csv | 0 {argo-ai => leetcode/argo-ai}/six-months.csv | 0 .../argo-ai}/three-months.csv | 0 .../arista-networks}/all.csv | 0 .../arista-networks}/more-than-six-months.csv | 0 .../arista-networks}/six-months.csv | 0 .../arista-networks}/three-months.csv | 0 {arm => leetcode/arm}/all.csv | 0 .../arm}/more-than-six-months.csv | 0 {asana => leetcode/asana}/all.csv | 0 .../asana}/more-than-six-months.csv | 0 {asana => leetcode/asana}/six-months.csv | 0 {ascend => leetcode/ascend}/all.csv | 0 .../ascend}/more-than-six-months.csv | 0 {asus => leetcode/asus}/all.csv | 0 .../asus}/more-than-six-months.csv | 0 {at-t => leetcode/at-t}/all.csv | 0 {at-t => leetcode/at-t}/six-months.csv | 0 .../athenahealth}/all.csv | 0 .../athenahealth}/more-than-six-months.csv | 0 .../athenahealth}/six-months.csv | 0 .../athenahealth}/three-months.csv | 0 {atlassian => leetcode/atlassian}/all.csv | 0 .../atlassian}/more-than-six-months.csv | 0 .../atlassian}/six-months.csv | 0 .../atlassian}/thirty-days.csv | 0 .../atlassian}/three-months.csv | 0 {attentive => leetcode/attentive}/all.csv | 0 .../attentive}/more-than-six-months.csv | 0 .../attentive}/six-months.csv | 0 .../attentive}/three-months.csv | 0 {audible => leetcode/audible}/all.csv | 0 .../audible}/more-than-six-months.csv | 0 {auriga => leetcode/auriga}/all.csv | 0 .../auriga}/more-than-six-months.csv | 0 {aurora => leetcode/aurora}/all.csv | 0 .../aurora}/more-than-six-months.csv | 0 {aurora => leetcode/aurora}/six-months.csv | 0 {aurora => leetcode/aurora}/three-months.csv | 0 {autodesk => leetcode/autodesk}/all.csv | 0 .../autodesk}/more-than-six-months.csv | 0 .../autodesk}/six-months.csv | 0 .../autodesk}/thirty-days.csv | 0 .../autodesk}/three-months.csv | 0 {avalara => leetcode/avalara}/all.csv | 0 .../avalara}/more-than-six-months.csv | 0 {avito => leetcode/avito}/all.csv | 0 .../avito}/more-than-six-months.csv | 0 {avito => leetcode/avito}/six-months.csv | 0 {axis-bank => leetcode/axis-bank}/all.csv | 0 .../axis-bank}/six-months.csv | 0 {axon => leetcode/axon}/all.csv | 0 .../axon}/more-than-six-months.csv | 0 {axon => leetcode/axon}/six-months.csv | 0 {axon => leetcode/axon}/thirty-days.csv | 0 {axon => leetcode/axon}/three-months.csv | 0 {baidu => leetcode/baidu}/all.csv | 0 .../baidu}/more-than-six-months.csv | 0 .../bank-of-america}/all.csv | 0 .../bank-of-america}/more-than-six-months.csv | 0 {barclays => leetcode/barclays}/all.csv | 0 .../barclays}/more-than-six-months.csv | 0 .../barclays}/six-months.csv | 0 {bcg => leetcode/bcg}/all.csv | 0 {bcg => leetcode/bcg}/six-months.csv | 0 .../bentley-systems}/all.csv | 0 .../bentley-systems}/more-than-six-months.csv | 0 {bharatpe => leetcode/bharatpe}/all.csv | 0 .../bharatpe}/more-than-six-months.csv | 0 {bidgely => leetcode/bidgely}/all.csv | 0 .../bidgely}/more-than-six-months.csv | 0 {billcom => leetcode/billcom}/all.csv | 0 .../billcom}/more-than-six-months.csv | 0 {bitgo => leetcode/bitgo}/all.csv | 0 .../bitgo}/more-than-six-months.csv | 0 {bitgo => leetcode/bitgo}/six-months.csv | 0 {bitgo => leetcode/bitgo}/three-months.csv | 0 {blackbuck => leetcode/blackbuck}/all.csv | 0 .../blackbuck}/more-than-six-months.csv | 0 {blackrock => leetcode/blackrock}/all.csv | 0 .../blackrock}/more-than-six-months.csv | 0 .../blackrock}/six-months.csv | 0 .../blackrock}/three-months.csv | 0 {blackstone => leetcode/blackstone}/all.csv | 0 .../blackstone}/more-than-six-months.csv | 0 {blend => leetcode/blend}/all.csv | 0 .../blend}/more-than-six-months.csv | 0 {blend => leetcode/blend}/six-months.csv | 0 {blinkit => leetcode/blinkit}/all.csv | 0 .../blinkit}/more-than-six-months.csv | 0 {blizzard => leetcode/blizzard}/all.csv | 0 .../blizzard}/more-than-six-months.csv | 0 {bloomberg => leetcode/bloomberg}/all.csv | 0 .../bloomberg}/more-than-six-months.csv | 0 .../bloomberg}/six-months.csv | 0 .../bloomberg}/thirty-days.csv | 0 .../bloomberg}/three-months.csv | 0 {bloomreach => leetcode/bloomreach}/all.csv | 0 .../bloomreach}/more-than-six-months.csv | 0 {blue-origin => leetcode/blue-origin}/all.csv | 0 .../blue-origin}/more-than-six-months.csv | 0 {blue-yonder => leetcode/blue-yonder}/all.csv | 0 .../blue-yonder}/more-than-six-months.csv | 0 {bnp-paribas => leetcode/bnp-paribas}/all.csv | 0 .../bnp-paribas}/more-than-six-months.csv | 0 {bny-mellon => leetcode/bny-mellon}/all.csv | 0 .../bny-mellon}/more-than-six-months.csv | 0 .../bny-mellon}/six-months.csv | 0 {boeing => leetcode/boeing}/all.csv | 0 .../boeing}/more-than-six-months.csv | 0 {bolt => leetcode/bolt}/all.csv | 0 .../bolt}/more-than-six-months.csv | 0 {bolt => leetcode/bolt}/six-months.csv | 0 {bookingcom => leetcode/bookingcom}/all.csv | 0 .../bookingcom}/more-than-six-months.csv | 0 .../bookingcom}/six-months.csv | 0 {bosch => leetcode/bosch}/all.csv | 0 .../bosch}/more-than-six-months.csv | 0 {box => leetcode/box}/all.csv | 0 .../box}/more-than-six-months.csv | 0 {box => leetcode/box}/six-months.csv | 0 {box => leetcode/box}/three-months.csv | 0 {bp => leetcode/bp}/all.csv | 0 {bp => leetcode/bp}/more-than-six-months.csv | 0 {braze => leetcode/braze}/all.csv | 0 .../braze}/more-than-six-months.csv | 0 {brex => leetcode/brex}/all.csv | 0 .../brex}/more-than-six-months.csv | 0 .../bridgewater-associates}/all.csv | 0 .../more-than-six-months.csv | 0 {brillio => leetcode/brillio}/all.csv | 0 {broadcom => leetcode/broadcom}/all.csv | 0 .../broadcom}/more-than-six-months.csv | 0 .../browserstack}/all.csv | 0 {bt-group => leetcode/bt-group}/all.csv | 0 .../bt-group}/more-than-six-months.csv | 0 {buyhatke => leetcode/buyhatke}/all.csv | 0 .../buyhatke}/more-than-six-months.csv | 0 {bytedance => leetcode/bytedance}/all.csv | 0 .../bytedance}/more-than-six-months.csv | 0 .../bytedance}/six-months.csv | 0 .../bytedance}/three-months.csv | 0 {c3-ai => leetcode/c3-ai}/all.csv | 0 {c3-ai => leetcode/c3-ai}/six-months.csv | 0 {c3-ai => leetcode/c3-ai}/three-months.csv | 0 {caastle => leetcode/caastle}/all.csv | 0 .../caastle}/more-than-six-months.csv | 0 {cadence => leetcode/cadence}/all.csv | 0 .../cadence}/more-than-six-months.csv | 0 {cadence => leetcode/cadence}/six-months.csv | 0 {canonical => leetcode/canonical}/all.csv | 0 .../canonical}/more-than-six-months.csv | 0 .../canonical}/six-months.csv | 0 {canva => leetcode/canva}/all.csv | 0 .../canva}/more-than-six-months.csv | 0 {canva => leetcode/canva}/six-months.csv | 0 {capgemini => leetcode/capgemini}/all.csv | 0 .../capgemini}/more-than-six-months.csv | 0 .../capgemini}/six-months.csv | 0 .../capgemini}/three-months.csv | 0 {capital-one => leetcode/capital-one}/all.csv | 0 .../capital-one}/more-than-six-months.csv | 0 .../capital-one}/six-months.csv | 0 .../capital-one}/thirty-days.csv | 0 .../capital-one}/three-months.csv | 0 {careem => leetcode/careem}/all.csv | 0 .../careem}/more-than-six-months.csv | 0 {careem => leetcode/careem}/six-months.csv | 0 {careem => leetcode/careem}/thirty-days.csv | 0 {careem => leetcode/careem}/three-months.csv | 0 {cars24 => leetcode/cars24}/all.csv | 0 .../cars24}/more-than-six-months.csv | 0 {carwale => leetcode/carwale}/all.csv | 0 .../carwale}/more-than-six-months.csv | 0 {cashfree => leetcode/cashfree}/all.csv | 0 .../cashfree}/more-than-six-months.csv | 0 {caterpillar => leetcode/caterpillar}/all.csv | 0 {cedcoss => leetcode/cedcoss}/all.csv | 0 .../cedcoss}/more-than-six-months.csv | 0 {celigo => leetcode/celigo}/all.csv | 0 .../celigo}/more-than-six-months.csv | 0 {chalo => leetcode/chalo}/all.csv | 0 .../chalo}/more-than-six-months.csv | 0 {chargebee => leetcode/chargebee}/all.csv | 0 .../chargebee}/six-months.csv | 0 {chewy => leetcode/chewy}/all.csv | 0 .../chewy}/more-than-six-months.csv | 0 {chime => leetcode/chime}/all.csv | 0 .../chime}/more-than-six-months.csv | 0 {chronus => leetcode/chronus}/all.csv | 0 .../chronus}/more-than-six-months.csv | 0 {chubb => leetcode/chubb}/all.csv | 0 .../chubb}/more-than-six-months.csv | 0 {ciena => leetcode/ciena}/all.csv | 0 .../ciena}/more-than-six-months.csv | 0 {circle => leetcode/circle}/all.csv | 0 .../circle}/more-than-six-months.csv | 0 {cisco => leetcode/cisco}/all.csv | 0 .../cisco}/more-than-six-months.csv | 0 {cisco => leetcode/cisco}/six-months.csv | 0 {cisco => leetcode/cisco}/thirty-days.csv | 0 {cisco => leetcode/cisco}/three-months.csv | 0 {citadel => leetcode/citadel}/all.csv | 0 .../citadel}/more-than-six-months.csv | 0 {citadel => leetcode/citadel}/six-months.csv | 0 {citadel => leetcode/citadel}/thirty-days.csv | 0 .../citadel}/three-months.csv | 0 {citi => leetcode/citi}/all.csv | 0 .../citi}/more-than-six-months.csv | 0 {citrix => leetcode/citrix}/all.csv | 0 .../citrix}/more-than-six-months.csv | 0 {clari => leetcode/clari}/all.csv | 0 .../clari}/more-than-six-months.csv | 0 {cleartax => leetcode/cleartax}/all.csv | 0 .../cleartax}/more-than-six-months.csv | 0 {cleartrip => leetcode/cleartrip}/all.csv | 0 .../cleartrip}/more-than-six-months.csv | 0 .../cleartrip}/six-months.csv | 0 {cloudera => leetcode/cloudera}/all.csv | 0 .../cloudera}/more-than-six-months.csv | 0 {cloudflare => leetcode/cloudflare}/all.csv | 0 .../cloudflare}/more-than-six-months.csv | 0 .../cloudflare}/six-months.csv | 0 .../cloudflare}/thirty-days.csv | 0 .../cloudflare}/three-months.csv | 0 {clumio => leetcode/clumio}/all.csv | 0 .../clumio}/more-than-six-months.csv | 0 {clutter => leetcode/clutter}/all.csv | 0 .../clutter}/more-than-six-months.csv | 0 {cme-group => leetcode/cme-group}/all.csv | 0 .../cme-group}/more-than-six-months.csv | 0 .../cme-group}/six-months.csv | 0 .../cme-group}/thirty-days.csv | 0 .../cme-group}/three-months.csv | 0 .../cockroach-labs}/all.csv | 0 .../cockroach-labs}/more-than-six-months.csv | 0 .../cockroach-labs}/six-months.csv | 0 .../cockroach-labs}/thirty-days.csv | 0 .../cockroach-labs}/three-months.csv | 0 {code-studio => leetcode/code-studio}/all.csv | 0 .../code-studio}/more-than-six-months.csv | 0 {codingmart => leetcode/codingmart}/all.csv | 0 .../codingmart}/more-than-six-months.csv | 0 {cognizant => leetcode/cognizant}/all.csv | 0 .../cognizant}/more-than-six-months.csv | 0 .../cognizant}/six-months.csv | 0 .../cognizant}/three-months.csv | 0 {cohesity => leetcode/cohesity}/all.csv | 0 .../cohesity}/more-than-six-months.csv | 0 .../cohesity}/six-months.csv | 0 .../cohesity}/thirty-days.csv | 0 .../cohesity}/three-months.csv | 0 {coinbase => leetcode/coinbase}/all.csv | 0 .../coinbase}/more-than-six-months.csv | 0 .../coinbase}/six-months.csv | 0 .../coinbase}/thirty-days.csv | 0 .../coinbase}/three-months.csv | 0 {coindcx => leetcode/coindcx}/all.csv | 0 .../coindcx}/more-than-six-months.csv | 0 {coindcx => leetcode/coindcx}/six-months.csv | 0 {comcast => leetcode/comcast}/all.csv | 0 .../comcast}/more-than-six-months.csv | 0 {comcast => leetcode/comcast}/six-months.csv | 0 {commvault => leetcode/commvault}/all.csv | 0 .../commvault}/more-than-six-months.csv | 0 {compass => leetcode/compass}/all.csv | 0 .../compass}/more-than-six-months.csv | 0 {compass => leetcode/compass}/six-months.csv | 0 {confluent => leetcode/confluent}/all.csv | 0 .../confluent}/more-than-six-months.csv | 0 .../confluent}/six-months.csv | 0 .../confluent}/thirty-days.csv | 0 .../confluent}/three-months.csv | 0 {consultadd => leetcode/consultadd}/all.csv | 0 .../consultadd}/more-than-six-months.csv | 0 {couchbase => leetcode/couchbase}/all.csv | 0 .../couchbase}/more-than-six-months.csv | 0 .../couchbase}/six-months.csv | 0 {coupang => leetcode/coupang}/all.csv | 0 .../coupang}/more-than-six-months.csv | 0 {coupang => leetcode/coupang}/six-months.csv | 0 .../coupang}/three-months.csv | 0 {coursera => leetcode/coursera}/all.csv | 0 .../coursera}/more-than-six-months.csv | 0 .../coursera}/six-months.csv | 0 .../coursera}/three-months.csv | 0 {coveo => leetcode/coveo}/all.csv | 0 .../coveo}/more-than-six-months.csv | 0 {cred => leetcode/cred}/all.csv | 0 {cred => leetcode/cred}/six-months.csv | 0 {cred => leetcode/cred}/thirty-days.csv | 0 {cred => leetcode/cred}/three-months.csv | 0 .../credit-karma}/all.csv | 0 .../credit-karma}/more-than-six-months.csv | 0 {criteo => leetcode/criteo}/all.csv | 0 .../criteo}/more-than-six-months.csv | 0 {criteo => leetcode/criteo}/six-months.csv | 0 {criteo => leetcode/criteo}/three-months.csv | 0 {crowdstrike => leetcode/crowdstrike}/all.csv | 0 .../crowdstrike}/more-than-six-months.csv | 0 .../crowdstrike}/six-months.csv | 0 .../crowdstrike}/three-months.csv | 0 .../cruise-automation}/all.csv | 0 .../more-than-six-months.csv | 0 .../cruise-automation}/six-months.csv | 0 {ctc => leetcode/ctc}/all.csv | 0 .../ctc}/more-than-six-months.csv | 0 {curefit => leetcode/curefit}/all.csv | 0 .../curefit}/more-than-six-months.csv | 0 {cvent => leetcode/cvent}/all.csv | 0 .../cvent}/more-than-six-months.csv | 0 {cyntexa => leetcode/cyntexa}/all.csv | 0 .../cyntexa}/more-than-six-months.csv | 0 {cyware => leetcode/cyware}/all.csv | 0 .../cyware}/more-than-six-months.csv | 0 {dailyhunt => leetcode/dailyhunt}/all.csv | 0 .../dailyhunt}/more-than-six-months.csv | 0 {darwinbox => leetcode/darwinbox}/all.csv | 0 .../darwinbox}/more-than-six-months.csv | 0 .../darwinbox}/six-months.csv | 0 .../darwinbox}/thirty-days.csv | 0 .../darwinbox}/three-months.csv | 0 .../dassault-sysetmes}/all.csv | 0 .../more-than-six-months.csv | 0 {databricks => leetcode/databricks}/all.csv | 0 .../databricks}/more-than-six-months.csv | 0 .../databricks}/six-months.csv | 0 .../databricks}/thirty-days.csv | 0 .../databricks}/three-months.csv | 0 {datadog => leetcode/datadog}/all.csv | 0 .../datadog}/more-than-six-months.csv | 0 {datadog => leetcode/datadog}/six-months.csv | 0 .../datadog}/three-months.csv | 0 {dataminr => leetcode/dataminr}/all.csv | 0 .../dataminr}/more-than-six-months.csv | 0 {de-shaw => leetcode/de-shaw}/all.csv | 0 .../de-shaw}/more-than-six-months.csv | 0 {de-shaw => leetcode/de-shaw}/six-months.csv | 0 {de-shaw => leetcode/de-shaw}/thirty-days.csv | 0 .../de-shaw}/three-months.csv | 0 {deepmind => leetcode/deepmind}/all.csv | 0 .../deepmind}/more-than-six-months.csv | 0 {delhivery => leetcode/delhivery}/all.csv | 0 .../delhivery}/more-than-six-months.csv | 0 {deliveroo => leetcode/deliveroo}/all.csv | 0 .../deliveroo}/more-than-six-months.csv | 0 {dell => leetcode/dell}/all.csv | 0 .../dell}/more-than-six-months.csv | 0 {dell => leetcode/dell}/six-months.csv | 0 {dell => leetcode/dell}/three-months.csv | 0 {deloitte => leetcode/deloitte}/all.csv | 0 .../deloitte}/more-than-six-months.csv | 0 .../deloitte}/six-months.csv | 0 .../deloitte}/thirty-days.csv | 0 .../deloitte}/three-months.csv | 0 {deltax => leetcode/deltax}/all.csv | 0 .../deltax}/more-than-six-months.csv | 0 .../deutsche-bank}/all.csv | 0 .../deutsche-bank}/more-than-six-months.csv | 0 {devrev => leetcode/devrev}/all.csv | 0 .../devrev}/more-than-six-months.csv | 0 {devsinc => leetcode/devsinc}/all.csv | 0 .../devsinc}/more-than-six-months.csv | 0 {devtron => leetcode/devtron}/all.csv | 0 .../devtron}/more-than-six-months.csv | 0 {dialpad => leetcode/dialpad}/all.csv | 0 {dialpad => leetcode/dialpad}/six-months.csv | 0 {didi => leetcode/didi}/all.csv | 0 .../didi}/more-than-six-months.csv | 0 {directi => leetcode/directi}/all.csv | 0 .../directi}/more-than-six-months.csv | 0 {discord => leetcode/discord}/all.csv | 0 .../discord}/more-than-six-months.csv | 0 {disney => leetcode/disney}/all.csv | 0 .../disney}/more-than-six-months.csv | 0 {disney => leetcode/disney}/six-months.csv | 0 {dji => leetcode/dji}/all.csv | 0 {docusign => leetcode/docusign}/all.csv | 0 .../docusign}/more-than-six-months.csv | 0 .../docusign}/six-months.csv | 0 .../docusign}/thirty-days.csv | 0 .../docusign}/three-months.csv | 0 {doordash => leetcode/doordash}/all.csv | 0 .../doordash}/more-than-six-months.csv | 0 .../doordash}/six-months.csv | 0 .../doordash}/thirty-days.csv | 0 .../doordash}/three-months.csv | 0 {dp-world => leetcode/dp-world}/all.csv | 0 .../dp-world}/more-than-six-months.csv | 0 .../dp-world}/six-months.csv | 0 {drawbridge => leetcode/drawbridge}/all.csv | 0 .../drawbridge}/more-than-six-months.csv | 0 {dream11 => leetcode/dream11}/all.csv | 0 .../dream11}/more-than-six-months.csv | 0 {dream11 => leetcode/dream11}/six-months.csv | 0 .../dream11}/three-months.csv | 0 {dropbox => leetcode/dropbox}/all.csv | 0 .../dropbox}/more-than-six-months.csv | 0 {dropbox => leetcode/dropbox}/six-months.csv | 0 .../dropbox}/three-months.csv | 0 {druva => leetcode/druva}/all.csv | 0 .../druva}/more-than-six-months.csv | 0 {drw => leetcode/drw}/all.csv | 0 .../drw}/more-than-six-months.csv | 0 {drw => leetcode/drw}/six-months.csv | 0 {dtcc => leetcode/dtcc}/all.csv | 0 .../dtcc}/more-than-six-months.csv | 0 {dunzo => leetcode/dunzo}/all.csv | 0 .../dunzo}/more-than-six-months.csv | 0 {duolingo => leetcode/duolingo}/all.csv | 0 .../duolingo}/more-than-six-months.csv | 0 .../duolingo}/six-months.csv | 0 {dxc => leetcode/dxc}/all.csv | 0 .../dxc}/more-than-six-months.csv | 0 {earnin => leetcode/earnin}/all.csv | 0 .../earnin}/more-than-six-months.csv | 0 {ebay => leetcode/ebay}/all.csv | 0 .../ebay}/more-than-six-months.csv | 0 {ebay => leetcode/ebay}/six-months.csv | 0 {ebay => leetcode/ebay}/thirty-days.csv | 0 {ebay => leetcode/ebay}/three-months.csv | 0 {edelweiss => leetcode/edelweiss}/all.csv | 0 .../edelweiss}/more-than-six-months.csv | 0 {elbit => leetcode/elbit}/all.csv | 0 .../elbit}/more-than-six-months.csv | 0 .../electronic-arts}/all.csv | 0 .../electronic-arts}/more-than-six-months.csv | 0 {elitmus => leetcode/elitmus}/all.csv | 0 .../elitmus}/more-than-six-months.csv | 0 {envoy => leetcode/envoy}/all.csv | 0 .../envoy}/more-than-six-months.csv | 0 .../epam-systems}/all.csv | 0 .../epam-systems}/more-than-six-months.csv | 0 .../epam-systems}/six-months.csv | 0 .../epam-systems}/three-months.csv | 0 {epic-games => leetcode/epic-games}/all.csv | 0 .../epic-games}/more-than-six-months.csv | 0 .../epic-systems}/all.csv | 0 .../epic-systems}/more-than-six-months.csv | 0 .../epic-systems}/six-months.csv | 0 .../epic-systems}/three-months.csv | 0 {epifi => leetcode/epifi}/all.csv | 0 {ericsson => leetcode/ericsson}/all.csv | 0 .../ericsson}/more-than-six-months.csv | 0 {etsy => leetcode/etsy}/all.csv | 0 .../etsy}/more-than-six-months.csv | 0 {etsy => leetcode/etsy}/six-months.csv | 0 {expedia => leetcode/expedia}/all.csv | 0 .../expedia}/more-than-six-months.csv | 0 {expedia => leetcode/expedia}/six-months.csv | 0 {ey => leetcode/ey}/all.csv | 0 {ey => leetcode/ey}/more-than-six-months.csv | 0 {f5-networks => leetcode/f5-networks}/all.csv | 0 .../f5-networks}/more-than-six-months.csv | 0 {facebook => leetcode/facebook}/all.csv | 0 .../facebook}/more-than-six-months.csv | 0 .../facebook}/six-months.csv | 0 .../facebook}/thirty-days.csv | 0 .../facebook}/three-months.csv | 0 {factset => leetcode/factset}/all.csv | 0 .../factset}/more-than-six-months.csv | 0 {factwise => leetcode/factwise}/all.csv | 0 {faire => leetcode/faire}/all.csv | 0 .../faire}/more-than-six-months.csv | 0 {faire => leetcode/faire}/six-months.csv | 0 {faire => leetcode/faire}/thirty-days.csv | 0 {faire => leetcode/faire}/three-months.csv | 0 {fallible => leetcode/fallible}/all.csv | 0 .../fallible}/more-than-six-months.csv | 0 {fastenal => leetcode/fastenal}/all.csv | 0 .../fastenal}/more-than-six-months.csv | 0 {fico => leetcode/fico}/all.csv | 0 .../fico}/more-than-six-months.csv | 0 {fidelity => leetcode/fidelity}/all.csv | 0 .../fidelity}/more-than-six-months.csv | 0 {fidessa => leetcode/fidessa}/all.csv | 0 {fiverr => leetcode/fiverr}/all.csv | 0 .../fiverr}/more-than-six-months.csv | 0 .../flatiron-health}/all.csv | 0 .../flatiron-health}/more-than-six-months.csv | 0 .../flatiron-health}/six-months.csv | 0 .../flatiron-health}/thirty-days.csv | 0 .../flatiron-health}/three-months.csv | 0 {fleetx => leetcode/fleetx}/all.csv | 0 .../fleetx}/more-than-six-months.csv | 0 {flexera => leetcode/flexera}/all.csv | 0 .../flexera}/more-than-six-months.csv | 0 {flexport => leetcode/flexport}/all.csv | 0 .../flexport}/more-than-six-months.csv | 0 .../flexport}/six-months.csv | 0 .../flexport}/three-months.csv | 0 {flipkart => leetcode/flipkart}/all.csv | 0 .../flipkart}/more-than-six-months.csv | 0 .../flipkart}/six-months.csv | 0 .../flipkart}/three-months.csv | 0 {ford => leetcode/ford}/all.csv | 0 .../ford}/more-than-six-months.csv | 0 {fortinet => leetcode/fortinet}/all.csv | 0 .../fortinet}/more-than-six-months.csv | 0 .../fortinet}/six-months.csv | 0 .../fortinet}/three-months.csv | 0 {forusall => leetcode/forusall}/all.csv | 0 .../forusall}/more-than-six-months.csv | 0 {fourkites => leetcode/fourkites}/all.csv | 0 .../fourkites}/more-than-six-months.csv | 0 {fpt => leetcode/fpt}/all.csv | 0 .../fpt}/more-than-six-months.csv | 0 .../fractal-analytics}/all.csv | 0 .../more-than-six-months.csv | 0 .../fractal-analytics}/six-months.csv | 0 .../fractal-analytics}/thirty-days.csv | 0 .../fractal-analytics}/three-months.csv | 0 {freecharge => leetcode/freecharge}/all.csv | 0 .../freecharge}/more-than-six-months.csv | 0 .../freecharge}/six-months.csv | 0 {freshworks => leetcode/freshworks}/all.csv | 0 .../freshworks}/more-than-six-months.csv | 0 {fynd => leetcode/fynd}/all.csv | 0 {gainsight => leetcode/gainsight}/all.csv | 0 .../gainsight}/more-than-six-months.csv | 0 {gameskraft => leetcode/gameskraft}/all.csv | 0 .../gameskraft}/more-than-six-months.csv | 0 {garena => leetcode/garena}/all.csv | 0 .../garena}/more-than-six-months.csv | 0 {garmin => leetcode/garmin}/all.csv | 0 .../garmin}/more-than-six-months.csv | 0 {garmin => leetcode/garmin}/six-months.csv | 0 {garmin => leetcode/garmin}/three-months.csv | 0 {gartner => leetcode/gartner}/all.csv | 0 .../gartner}/more-than-six-months.csv | 0 {gartner => leetcode/gartner}/six-months.csv | 0 {ge-digital => leetcode/ge-digital}/all.csv | 0 .../ge-digital}/more-than-six-months.csv | 0 .../ge-healthcare}/all.csv | 0 .../ge-healthcare}/more-than-six-months.csv | 0 {geico => leetcode/geico}/all.csv | 0 .../geico}/more-than-six-months.csv | 0 {geico => leetcode/geico}/six-months.csv | 0 {geico => leetcode/geico}/three-months.csv | 0 .../general-electric}/all.csv | 0 .../more-than-six-months.csv | 0 .../general-motors}/all.csv | 0 .../general-motors}/more-than-six-months.csv | 0 .../general-motors}/six-months.csv | 0 .../general-motors}/thirty-days.csv | 0 .../general-motors}/three-months.csv | 0 {genpact => leetcode/genpact}/all.csv | 0 .../genpact}/more-than-six-months.csv | 0 {gilt-groupe => leetcode/gilt-groupe}/all.csv | 0 .../gilt-groupe}/more-than-six-months.csv | 0 {github => leetcode/github}/all.csv | 0 {github => leetcode/github}/six-months.csv | 0 {glassdoor => leetcode/glassdoor}/all.csv | 0 .../glassdoor}/more-than-six-months.csv | 0 {globallogic => leetcode/globallogic}/all.csv | 0 .../globallogic}/more-than-six-months.csv | 0 .../globallogic}/six-months.csv | 0 {globant => leetcode/globant}/all.csv | 0 .../globant}/more-than-six-months.csv | 0 {glovo => leetcode/glovo}/all.csv | 0 {glovo => leetcode/glovo}/six-months.csv | 0 {godaddy => leetcode/godaddy}/all.csv | 0 .../godaddy}/more-than-six-months.csv | 0 {gojek => leetcode/gojek}/all.csv | 0 .../gojek}/more-than-six-months.csv | 0 .../goldman-sachs}/all.csv | 0 .../goldman-sachs}/more-than-six-months.csv | 0 .../goldman-sachs}/six-months.csv | 0 .../goldman-sachs}/thirty-days.csv | 0 .../goldman-sachs}/three-months.csv | 0 {google => leetcode/google}/all.csv | 0 .../google}/more-than-six-months.csv | 0 {google => leetcode/google}/six-months.csv | 0 {google => leetcode/google}/thirty-days.csv | 0 {google => leetcode/google}/three-months.csv | 0 {gopuff => leetcode/gopuff}/all.csv | 0 {gopuff => leetcode/gopuff}/six-months.csv | 0 {grab => leetcode/grab}/all.csv | 0 .../grab}/more-than-six-months.csv | 0 {grab => leetcode/grab}/six-months.csv | 0 {grab => leetcode/grab}/thirty-days.csv | 0 {grab => leetcode/grab}/three-months.csv | 0 {grammarly => leetcode/grammarly}/all.csv | 0 .../grammarly}/more-than-six-months.csv | 0 .../grammarly}/six-months.csv | 0 .../grammarly}/thirty-days.csv | 0 .../grammarly}/three-months.csv | 0 {graviton => leetcode/graviton}/all.csv | 0 .../graviton}/more-than-six-months.csv | 0 .../grid-dynamics}/all.csv | 0 .../grid-dynamics}/more-than-six-months.csv | 0 {groupon => leetcode/groupon}/all.csv | 0 .../groupon}/more-than-six-months.csv | 0 {groww => leetcode/groww}/all.csv | 0 .../groww}/more-than-six-months.csv | 0 {grubhub => leetcode/grubhub}/all.csv | 0 .../grubhub}/more-than-six-months.csv | 0 {gsa-capital => leetcode/gsa-capital}/all.csv | 0 .../gsa-capital}/more-than-six-months.csv | 0 {gsn-games => leetcode/gsn-games}/all.csv | 0 .../gsn-games}/more-than-six-months.csv | 0 {guidewire => leetcode/guidewire}/all.csv | 0 .../guidewire}/more-than-six-months.csv | 0 .../guidewire}/six-months.csv | 0 .../guidewire}/thirty-days.csv | 0 .../guidewire}/three-months.csv | 0 {gusto => leetcode/gusto}/all.csv | 0 .../gusto}/more-than-six-months.csv | 0 {gusto => leetcode/gusto}/six-months.csv | 0 {gusto => leetcode/gusto}/three-months.csv | 0 {harman => leetcode/harman}/all.csv | 0 .../harman}/more-than-six-months.csv | 0 {harness => leetcode/harness}/all.csv | 0 .../harness}/more-than-six-months.csv | 0 {hashedin => leetcode/hashedin}/all.csv | 0 .../hashedin}/more-than-six-months.csv | 0 .../hashedin}/six-months.csv | 0 .../hashedin}/three-months.csv | 0 {hbo => leetcode/hbo}/all.csv | 0 .../hbo}/more-than-six-months.csv | 0 {hcl => leetcode/hcl}/all.csv | 0 .../hcl}/more-than-six-months.csv | 0 {hcl => leetcode/hcl}/six-months.csv | 0 {heb => leetcode/heb}/all.csv | 0 .../heb}/more-than-six-months.csv | 0 {helix => leetcode/helix}/all.csv | 0 .../helix}/more-than-six-months.csv | 0 {hertz => leetcode/hertz}/all.csv | 0 .../hertz}/more-than-six-months.csv | 0 {highspot => leetcode/highspot}/all.csv | 0 .../highspot}/more-than-six-months.csv | 0 {hilabs => leetcode/hilabs}/all.csv | 0 .../hilabs}/more-than-six-months.csv | 0 {hive => leetcode/hive}/all.csv | 0 .../hive}/more-than-six-months.csv | 0 {hiver => leetcode/hiver}/all.csv | 0 .../hiver}/more-than-six-months.csv | 0 {honey => leetcode/honey}/all.csv | 0 {honeywell => leetcode/honeywell}/all.csv | 0 .../honeywell}/more-than-six-months.csv | 0 {hopper => leetcode/hopper}/all.csv | 0 {hopper => leetcode/hopper}/six-months.csv | 0 {hopper => leetcode/hopper}/three-months.csv | 0 {hotstar => leetcode/hotstar}/all.csv | 0 .../hotstar}/more-than-six-months.csv | 0 {houzz => leetcode/houzz}/all.csv | 0 .../houzz}/more-than-six-months.csv | 0 {hp => leetcode/hp}/all.csv | 0 {hp => leetcode/hp}/more-than-six-months.csv | 0 {hpe => leetcode/hpe}/all.csv | 0 .../hpe}/more-than-six-months.csv | 0 {hrt => leetcode/hrt}/all.csv | 0 .../hrt}/more-than-six-months.csv | 0 {hsbc => leetcode/hsbc}/all.csv | 0 .../hsbc}/more-than-six-months.csv | 0 {hsbc => leetcode/hsbc}/six-months.csv | 0 {hsbc => leetcode/hsbc}/three-months.csv | 0 {huawei => leetcode/huawei}/all.csv | 0 .../huawei}/more-than-six-months.csv | 0 {hubspot => leetcode/hubspot}/all.csv | 0 .../hubspot}/more-than-six-months.csv | 0 {hubspot => leetcode/hubspot}/six-months.csv | 0 .../hubspot}/three-months.csv | 0 {hulu => leetcode/hulu}/all.csv | 0 .../hulu}/more-than-six-months.csv | 0 {hyperverge => leetcode/hyperverge}/all.csv | 0 .../hyperverge}/more-than-six-months.csv | 0 {ibm => leetcode/ibm}/all.csv | 0 .../ibm}/more-than-six-months.csv | 0 {ibm => leetcode/ibm}/six-months.csv | 0 {ibm => leetcode/ibm}/thirty-days.csv | 0 {ibm => leetcode/ibm}/three-months.csv | 0 {iit-bombay => leetcode/iit-bombay}/all.csv | 0 .../iit-bombay}/more-than-six-months.csv | 0 {imc => leetcode/imc}/all.csv | 0 .../imc}/more-than-six-months.csv | 0 .../impact-analytics}/all.csv | 0 .../more-than-six-months.csv | 0 {increff => leetcode/increff}/all.csv | 0 .../increff}/more-than-six-months.csv | 0 {indeed => leetcode/indeed}/all.csv | 0 .../indeed}/more-than-six-months.csv | 0 {indmoney => leetcode/indmoney}/all.csv | 0 .../indmoney}/more-than-six-months.csv | 0 {info-edge => leetcode/info-edge}/all.csv | 0 .../info-edge}/more-than-six-months.csv | 0 .../info-edge}/six-months.csv | 0 {informatica => leetcode/informatica}/all.csv | 0 .../informatica}/more-than-six-months.csv | 0 {infosys => leetcode/infosys}/all.csv | 0 .../infosys}/more-than-six-months.csv | 0 {infosys => leetcode/infosys}/six-months.csv | 0 {infosys => leetcode/infosys}/thirty-days.csv | 0 .../infosys}/three-months.csv | 0 {inmobi => leetcode/inmobi}/all.csv | 0 .../inmobi}/more-than-six-months.csv | 0 {innovaccer => leetcode/innovaccer}/all.csv | 0 .../innovaccer}/more-than-six-months.csv | 0 .../innovaccer}/six-months.csv | 0 {instabase => leetcode/instabase}/all.csv | 0 .../instabase}/more-than-six-months.csv | 0 {instacart => leetcode/instacart}/all.csv | 0 .../instacart}/more-than-six-months.csv | 0 .../instacart}/six-months.csv | 0 .../instacart}/thirty-days.csv | 0 .../instacart}/three-months.csv | 0 {intel => leetcode/intel}/all.csv | 0 .../intel}/more-than-six-months.csv | 0 {intel => leetcode/intel}/six-months.csv | 0 .../interactive-brokers}/all.csv | 0 .../more-than-six-months.csv | 0 {intercom => leetcode/intercom}/all.csv | 0 .../intercom}/more-than-six-months.csv | 0 .../intercom}/six-months.csv | 0 {intuit => leetcode/intuit}/all.csv | 0 .../intuit}/more-than-six-months.csv | 0 {intuit => leetcode/intuit}/six-months.csv | 0 {intuit => leetcode/intuit}/thirty-days.csv | 0 {intuit => leetcode/intuit}/three-months.csv | 0 {ion => leetcode/ion}/all.csv | 0 .../ion}/more-than-six-months.csv | 0 {ivp => leetcode/ivp}/all.csv | 0 .../ivp}/more-than-six-months.csv | 0 {ixigo => leetcode/ixigo}/all.csv | 0 .../ixigo}/more-than-six-months.csv | 0 {ixl => leetcode/ixl}/all.csv | 0 .../ixl}/more-than-six-months.csv | 0 {ixl => leetcode/ixl}/six-months.csv | 0 {ixl => leetcode/ixl}/three-months.csv | 0 {jane-street => leetcode/jane-street}/all.csv | 0 .../jane-street}/more-than-six-months.csv | 0 {jd => leetcode/jd}/all.csv | 0 {jd => leetcode/jd}/six-months.csv | 0 {jeavio => leetcode/jeavio}/all.csv | 0 .../jeavio}/more-than-six-months.csv | 0 {jetbrains => leetcode/jetbrains}/all.csv | 0 .../jetbrains}/more-than-six-months.csv | 0 {jingchi => leetcode/jingchi}/all.csv | 0 .../jingchi}/more-than-six-months.csv | 0 {jio => leetcode/jio}/all.csv | 0 .../jio}/more-than-six-months.csv | 0 .../josh-technology}/all.csv | 0 .../josh-technology}/more-than-six-months.csv | 0 .../josh-technology}/six-months.csv | 0 .../josh-technology}/thirty-days.csv | 0 .../josh-technology}/three-months.csv | 0 {jpmorgan => leetcode/jpmorgan}/all.csv | 0 .../jpmorgan}/more-than-six-months.csv | 0 .../jpmorgan}/six-months.csv | 0 .../jpmorgan}/thirty-days.csv | 0 .../jpmorgan}/three-months.csv | 0 {jtg => leetcode/jtg}/all.csv | 0 .../jtg}/more-than-six-months.csv | 0 .../jump-trading}/all.csv | 0 .../jump-trading}/more-than-six-months.csv | 0 .../jump-trading}/six-months.csv | 0 .../junglee-games}/all.csv | 0 .../junglee-games}/more-than-six-months.csv | 0 {juniper => leetcode/juniper}/all.csv | 0 .../juniper}/more-than-six-months.csv | 0 {juspay => leetcode/juspay}/all.csv | 0 .../juspay}/more-than-six-months.csv | 0 {juspay => leetcode/juspay}/six-months.csv | 0 {juspay => leetcode/juspay}/three-months.csv | 0 {justworks => leetcode/justworks}/all.csv | 0 .../justworks}/more-than-six-months.csv | 0 {kakao => leetcode/kakao}/all.csv | 0 .../kakao}/more-than-six-months.csv | 0 {karat => leetcode/karat}/all.csv | 0 .../karat}/more-than-six-months.csv | 0 {karat => leetcode/karat}/six-months.csv | 0 {karat => leetcode/karat}/thirty-days.csv | 0 {karat => leetcode/karat}/three-months.csv | 0 {keeptruckin => leetcode/keeptruckin}/all.csv | 0 .../keeptruckin}/more-than-six-months.csv | 0 .../keeptruckin}/six-months.csv | 0 .../keeptruckin}/three-months.csv | 0 {kla-tencor => leetcode/kla-tencor}/all.csv | 0 .../kla-tencor}/more-than-six-months.csv | 0 .../kla-tencor}/six-months.csv | 0 {kla => leetcode/kla}/all.csv | 0 .../kla}/more-than-six-months.csv | 0 {kla => leetcode/kla}/six-months.csv | 0 {kla => leetcode/kla}/thirty-days.csv | 0 {kla => leetcode/kla}/three-months.csv | 0 {komprise => leetcode/komprise}/all.csv | 0 .../komprise}/more-than-six-months.csv | 0 .../kotak-mahindra-bank}/all.csv | 0 .../more-than-six-months.csv | 0 {kpit => leetcode/kpit}/all.csv | 0 .../kpit}/more-than-six-months.csv | 0 {kpmg => leetcode/kpmg}/all.csv | 0 {kpmg => leetcode/kpmg}/six-months.csv | 0 {lacework => leetcode/lacework}/all.csv | 0 .../lacework}/more-than-six-months.csv | 0 .../larsen-toubro}/all.csv | 0 .../larsen-toubro}/more-than-six-months.csv | 0 {leap-motion => leetcode/leap-motion}/all.csv | 0 .../leap-motion}/more-than-six-months.csv | 0 {lendingkart => leetcode/lendingkart}/all.csv | 0 {lenskart => leetcode/lenskart}/all.csv | 0 .../lenskart}/more-than-six-months.csv | 0 .../lg-electronics}/all.csv | 0 .../lg-electronics}/more-than-six-months.csv | 0 .../lg-electronics}/six-months.csv | 0 {licious => leetcode/licious}/all.csv | 0 .../licious}/more-than-six-months.csv | 0 {liftoff => leetcode/liftoff}/all.csv | 0 .../liftoff}/more-than-six-months.csv | 0 {liftoff => leetcode/liftoff}/six-months.csv | 0 .../liftoff}/three-months.csv | 0 {lime => leetcode/lime}/all.csv | 0 .../lime}/more-than-six-months.csv | 0 {lime => leetcode/lime}/six-months.csv | 0 {line => leetcode/line}/all.csv | 0 .../line}/more-than-six-months.csv | 0 {line => leetcode/line}/six-months.csv | 0 {line => leetcode/line}/three-months.csv | 0 {linkedin => leetcode/linkedin}/all.csv | 0 .../linkedin}/more-than-six-months.csv | 0 .../linkedin}/six-months.csv | 0 .../linkedin}/thirty-days.csv | 0 .../linkedin}/three-months.csv | 0 {liveramp => leetcode/liveramp}/all.csv | 0 .../liveramp}/more-than-six-months.csv | 0 {livspace => leetcode/livspace}/all.csv | 0 .../livspace}/six-months.csv | 0 .../livspace}/three-months.csv | 0 {lowe => leetcode/lowe}/all.csv | 0 .../lowe}/more-than-six-months.csv | 0 {lti => leetcode/lti}/all.csv | 0 .../lti}/more-than-six-months.csv | 0 {lucid => leetcode/lucid}/all.csv | 0 .../lucid}/more-than-six-months.csv | 0 {lucid => leetcode/lucid}/six-months.csv | 0 {lucid => leetcode/lucid}/thirty-days.csv | 0 {lucid => leetcode/lucid}/three-months.csv | 0 {luxoft => leetcode/luxoft}/all.csv | 0 .../luxoft}/more-than-six-months.csv | 0 {luxoft => leetcode/luxoft}/six-months.csv | 0 {lyft => leetcode/lyft}/all.csv | 0 .../lyft}/more-than-six-months.csv | 0 {lyft => leetcode/lyft}/six-months.csv | 0 {lyft => leetcode/lyft}/thirty-days.csv | 0 {lyft => leetcode/lyft}/three-months.csv | 0 .../machine-zone}/all.csv | 0 .../machine-zone}/more-than-six-months.csv | 0 {machinezone => leetcode/machinezone}/all.csv | 0 .../machinezone}/more-than-six-months.csv | 0 {maersk => leetcode/maersk}/all.csv | 0 .../maersk}/more-than-six-months.csv | 0 {makemytrip => leetcode/makemytrip}/all.csv | 0 .../makemytrip}/more-than-six-months.csv | 0 {mapbox => leetcode/mapbox}/all.csv | 0 .../maq-software}/all.csv | 0 .../maq-software}/more-than-six-months.csv | 0 {marqeta => leetcode/marqeta}/all.csv | 0 .../marqeta}/more-than-six-months.csv | 0 {marqeta => leetcode/marqeta}/six-months.csv | 0 {marqeta => leetcode/marqeta}/thirty-days.csv | 0 .../marqeta}/three-months.csv | 0 {mastercard => leetcode/mastercard}/all.csv | 0 .../mastercard}/more-than-six-months.csv | 0 .../mastercard}/six-months.csv | 0 .../mastercard}/three-months.csv | 0 {mathworks => leetcode/mathworks}/all.csv | 0 .../mathworks}/more-than-six-months.csv | 0 .../mathworks}/six-months.csv | 0 .../mathworks}/three-months.csv | 0 {mcafee => leetcode/mcafee}/all.csv | 0 .../mcafee}/more-than-six-months.csv | 0 {mckinsey => leetcode/mckinsey}/all.csv | 0 .../mckinsey}/more-than-six-months.csv | 0 {medianet => leetcode/medianet}/all.csv | 0 .../medianet}/more-than-six-months.csv | 0 .../medianet}/six-months.csv | 0 .../medianet}/thirty-days.csv | 0 .../medianet}/three-months.csv | 0 {meesho => leetcode/meesho}/all.csv | 0 .../meesho}/more-than-six-months.csv | 0 {meesho => leetcode/meesho}/six-months.csv | 0 {meesho => leetcode/meesho}/thirty-days.csv | 0 {meesho => leetcode/meesho}/three-months.csv | 0 {meituan => leetcode/meituan}/all.csv | 0 .../meituan}/more-than-six-months.csv | 0 {mercari => leetcode/mercari}/all.csv | 0 .../mercari}/more-than-six-months.csv | 0 {micro1 => leetcode/micro1}/all.csv | 0 .../micro1}/more-than-six-months.csv | 0 {microsoft => leetcode/microsoft}/all.csv | 0 .../microsoft}/more-than-six-months.csv | 0 .../microsoft}/six-months.csv | 0 .../microsoft}/thirty-days.csv | 0 .../microsoft}/three-months.csv | 0 .../microstrategy}/all.csv | 0 .../microstrategy}/more-than-six-months.csv | 0 {millennium => leetcode/millennium}/all.csv | 0 .../millennium}/more-than-six-months.csv | 0 .../millennium}/six-months.csv | 0 {mindtickle => leetcode/mindtickle}/all.csv | 0 .../mindtickle}/more-than-six-months.csv | 0 {mindtree => leetcode/mindtree}/all.csv | 0 .../mindtree}/more-than-six-months.csv | 0 {miro => leetcode/miro}/all.csv | 0 .../miro}/more-than-six-months.csv | 0 {mishipay => leetcode/mishipay}/all.csv | 0 .../mishipay}/more-than-six-months.csv | 0 {mitsogo => leetcode/mitsogo}/all.csv | 0 .../mitsogo}/more-than-six-months.csv | 0 {mixpanel => leetcode/mixpanel}/all.csv | 0 .../mixpanel}/more-than-six-months.csv | 0 .../mixpanel}/six-months.csv | 0 .../mixpanel}/three-months.csv | 0 {mobileye => leetcode/mobileye}/all.csv | 0 .../mobileye}/more-than-six-months.csv | 0 {mobisy => leetcode/mobisy}/all.csv | 0 .../mobisy}/more-than-six-months.csv | 0 {moengage => leetcode/moengage}/all.csv | 0 .../moengage}/more-than-six-months.csv | 0 {moloco => leetcode/moloco}/all.csv | 0 .../moloco}/more-than-six-months.csv | 0 {moloco => leetcode/moloco}/six-months.csv | 0 {moneylion => leetcode/moneylion}/all.csv | 0 .../moneylion}/more-than-six-months.csv | 0 {mongodb => leetcode/mongodb}/all.csv | 0 .../mongodb}/more-than-six-months.csv | 0 {mongodb => leetcode/mongodb}/six-months.csv | 0 .../mongodb}/three-months.csv | 0 .../morgan-stanley}/all.csv | 0 .../morgan-stanley}/more-than-six-months.csv | 0 .../morgan-stanley}/six-months.csv | 0 .../morgan-stanley}/three-months.csv | 0 {motorola => leetcode/motorola}/all.csv | 0 .../motorola}/more-than-six-months.csv | 0 {mountblue => leetcode/mountblue}/all.csv | 0 .../mountblue}/more-than-six-months.csv | 0 {moveworks => leetcode/moveworks}/all.csv | 0 .../moveworks}/more-than-six-months.csv | 0 .../moveworks}/six-months.csv | 0 .../moveworks}/three-months.csv | 0 {msci => leetcode/msci}/all.csv | 0 .../msci}/more-than-six-months.csv | 0 {mts => leetcode/mts}/all.csv | 0 .../mts}/more-than-six-months.csv | 0 {murex => leetcode/murex}/all.csv | 0 .../murex}/more-than-six-months.csv | 0 {mykaarma => leetcode/mykaarma}/all.csv | 0 .../mykaarma}/more-than-six-months.csv | 0 {myntra => leetcode/myntra}/all.csv | 0 .../myntra}/more-than-six-months.csv | 0 {myntra => leetcode/myntra}/six-months.csv | 0 {nagarro => leetcode/nagarro}/all.csv | 0 .../nagarro}/more-than-six-months.csv | 0 .../national-instruments}/all.csv | 0 .../more-than-six-months.csv | 0 .../all.csv | 0 .../more-than-six-months.csv | 0 {navan => leetcode/navan}/all.csv | 0 .../navan}/more-than-six-months.csv | 0 {navan => leetcode/navan}/six-months.csv | 0 {navan => leetcode/navan}/three-months.csv | 0 {naver => leetcode/naver}/all.csv | 0 .../naver}/more-than-six-months.csv | 0 {navi => leetcode/navi}/all.csv | 0 .../navi}/more-than-six-months.csv | 0 {ncr => leetcode/ncr}/all.csv | 0 .../ncr}/more-than-six-months.csv | 0 {nerdwallet => leetcode/nerdwallet}/all.csv | 0 {netapp => leetcode/netapp}/all.csv | 0 .../netapp}/more-than-six-months.csv | 0 {netapp => leetcode/netapp}/six-months.csv | 0 .../netcracker-technology}/all.csv | 0 .../netcracker-technology}/six-months.csv | 0 .../netcracker-technology}/three-months.csv | 0 {netease => leetcode/netease}/all.csv | 0 .../netease}/more-than-six-months.csv | 0 {netflix => leetcode/netflix}/all.csv | 0 .../netflix}/more-than-six-months.csv | 0 {netflix => leetcode/netflix}/six-months.csv | 0 {netflix => leetcode/netflix}/thirty-days.csv | 0 .../netflix}/three-months.csv | 0 {netskope => leetcode/netskope}/all.csv | 0 .../netskope}/more-than-six-months.csv | 0 .../netskope}/six-months.csv | 0 {netsuite => leetcode/netsuite}/all.csv | 0 .../netsuite}/more-than-six-months.csv | 0 {newsbreak => leetcode/newsbreak}/all.csv | 0 .../newsbreak}/six-months.csv | 0 .../newsbreak}/three-months.csv | 0 {nextdoor => leetcode/nextdoor}/all.csv | 0 .../nextdoor}/more-than-six-months.csv | 0 .../nextdoor}/six-months.csv | 0 {nextjump => leetcode/nextjump}/all.csv | 0 .../nextjump}/more-than-six-months.csv | 0 {nference => leetcode/nference}/all.csv | 0 .../nference}/more-than-six-months.csv | 0 {niantic => leetcode/niantic}/all.csv | 0 .../niantic}/more-than-six-months.csv | 0 {nielsen => leetcode/nielsen}/all.csv | 0 .../nielsen}/more-than-six-months.csv | 0 {nike => leetcode/nike}/all.csv | 0 .../nike}/more-than-six-months.csv | 0 {nike => leetcode/nike}/six-months.csv | 0 {nike => leetcode/nike}/thirty-days.csv | 0 {nike => leetcode/nike}/three-months.csv | 0 {ninjacart => leetcode/ninjacart}/all.csv | 0 .../ninjacart}/more-than-six-months.csv | 0 {nokia => leetcode/nokia}/all.csv | 0 .../nokia}/more-than-six-months.csv | 0 {nordstrom => leetcode/nordstrom}/all.csv | 0 .../nordstrom}/more-than-six-months.csv | 0 .../nordstrom}/six-months.csv | 0 .../nordstrom}/three-months.csv | 0 {notion => leetcode/notion}/all.csv | 0 .../notion}/more-than-six-months.csv | 0 {npci => leetcode/npci}/all.csv | 0 .../npci}/more-than-six-months.csv | 0 {nuro => leetcode/nuro}/all.csv | 0 .../nuro}/more-than-six-months.csv | 0 {nuro => leetcode/nuro}/six-months.csv | 0 {nuro => leetcode/nuro}/thirty-days.csv | 0 {nuro => leetcode/nuro}/three-months.csv | 0 {nutanix => leetcode/nutanix}/all.csv | 0 .../nutanix}/more-than-six-months.csv | 0 {nutanix => leetcode/nutanix}/six-months.csv | 0 {nutanix => leetcode/nutanix}/thirty-days.csv | 0 .../nutanix}/three-months.csv | 0 {nvidia => leetcode/nvidia}/all.csv | 0 .../nvidia}/more-than-six-months.csv | 0 {nvidia => leetcode/nvidia}/six-months.csv | 0 {nvidia => leetcode/nvidia}/thirty-days.csv | 0 {nvidia => leetcode/nvidia}/three-months.csv | 0 {nykaa => leetcode/nykaa}/all.csv | 0 .../nykaa}/more-than-six-months.csv | 0 {nykaa => leetcode/nykaa}/six-months.csv | 0 {observeai => leetcode/observeai}/all.csv | 0 .../observeai}/more-than-six-months.csv | 0 .../observeai}/six-months.csv | 0 {odoo => leetcode/odoo}/all.csv | 0 .../odoo}/more-than-six-months.csv | 0 {okta => leetcode/okta}/all.csv | 0 .../okta}/more-than-six-months.csv | 0 {okx => leetcode/okx}/all.csv | 0 .../okx}/more-than-six-months.csv | 0 {ola => leetcode/ola}/all.csv | 0 .../ola}/more-than-six-months.csv | 0 {olx => leetcode/olx}/all.csv | 0 {olx => leetcode/olx}/six-months.csv | 0 {openai => leetcode/openai}/all.csv | 0 .../openai}/more-than-six-months.csv | 0 {openai => leetcode/openai}/six-months.csv | 0 {openai => leetcode/openai}/three-months.csv | 0 {opendoor => leetcode/opendoor}/all.csv | 0 .../opendoor}/more-than-six-months.csv | 0 {opentext => leetcode/opentext}/all.csv | 0 .../opentext}/more-than-six-months.csv | 0 {oppo => leetcode/oppo}/all.csv | 0 {optiver => leetcode/optiver}/all.csv | 0 .../optiver}/more-than-six-months.csv | 0 {optum => leetcode/optum}/all.csv | 0 .../optum}/more-than-six-months.csv | 0 {oracle => leetcode/oracle}/all.csv | 0 .../oracle}/more-than-six-months.csv | 0 {oracle => leetcode/oracle}/six-months.csv | 0 {oracle => leetcode/oracle}/thirty-days.csv | 0 {oracle => leetcode/oracle}/three-months.csv | 0 .../oscar-health}/all.csv | 0 .../oscar-health}/more-than-six-months.csv | 0 .../oscar-health}/six-months.csv | 0 .../oscar-health}/thirty-days.csv | 0 .../oscar-health}/three-months.csv | 0 {otterai => leetcode/otterai}/all.csv | 0 .../otterai}/more-than-six-months.csv | 0 {oyo => leetcode/oyo}/all.csv | 0 .../oyo}/more-than-six-months.csv | 0 {oyo => leetcode/oyo}/six-months.csv | 0 {oyo => leetcode/oyo}/three-months.csv | 0 {ozon => leetcode/ozon}/all.csv | 0 .../ozon}/more-than-six-months.csv | 0 {ozon => leetcode/ozon}/six-months.csv | 0 {ozon => leetcode/ozon}/three-months.csv | 0 .../palantir-technologies}/all.csv | 0 .../more-than-six-months.csv | 0 .../palantir-technologies}/six-months.csv | 0 .../palantir-technologies}/three-months.csv | 0 .../palo-alto-networks}/all.csv | 0 .../more-than-six-months.csv | 0 .../palo-alto-networks}/six-months.csv | 0 .../palo-alto-networks}/three-months.csv | 0 {park => leetcode/park}/all.csv | 0 .../park}/more-than-six-months.csv | 0 {patreon => leetcode/patreon}/all.csv | 0 .../patreon}/more-than-six-months.csv | 0 {patreon => leetcode/patreon}/six-months.csv | 0 {paycom => leetcode/paycom}/all.csv | 0 .../paycom}/more-than-six-months.csv | 0 {paypal => leetcode/paypal}/all.csv | 0 .../paypal}/more-than-six-months.csv | 0 {paypal => leetcode/paypal}/six-months.csv | 0 {paypal => leetcode/paypal}/thirty-days.csv | 0 {paypal => leetcode/paypal}/three-months.csv | 0 {paypay => leetcode/paypay}/all.csv | 0 .../paypay}/more-than-six-months.csv | 0 {paypay => leetcode/paypay}/six-months.csv | 0 {paypay => leetcode/paypay}/three-months.csv | 0 {paytm => leetcode/paytm}/all.csv | 0 .../paytm}/more-than-six-months.csv | 0 {paytm => leetcode/paytm}/six-months.csv | 0 {payu => leetcode/payu}/all.csv | 0 .../payu}/more-than-six-months.csv | 0 {peak6 => leetcode/peak6}/all.csv | 0 {pega => leetcode/pega}/all.csv | 0 {peloton => leetcode/peloton}/all.csv | 0 .../peloton}/more-than-six-months.csv | 0 .../persistent-systems}/all.csv | 0 .../more-than-six-months.csv | 0 .../persistent-systems}/six-months.csv | 0 {philips => leetcode/philips}/all.csv | 0 {philips => leetcode/philips}/six-months.csv | 0 {phonepe => leetcode/phonepe}/all.csv | 0 .../phonepe}/more-than-six-months.csv | 0 {phonepe => leetcode/phonepe}/six-months.csv | 0 {phonepe => leetcode/phonepe}/thirty-days.csv | 0 .../phonepe}/three-months.csv | 0 {pickrr => leetcode/pickrr}/all.csv | 0 .../pickrr}/more-than-six-months.csv | 0 {pinterest => leetcode/pinterest}/all.csv | 0 .../pinterest}/more-than-six-months.csv | 0 .../pinterest}/six-months.csv | 0 .../pinterest}/thirty-days.csv | 0 .../pinterest}/three-months.csv | 0 {plaid => leetcode/plaid}/all.csv | 0 {plaid => leetcode/plaid}/six-months.csv | 0 {plaid => leetcode/plaid}/three-months.csv | 0 {pocket-gems => leetcode/pocket-gems}/all.csv | 0 .../pocket-gems}/more-than-six-months.csv | 0 {point72 => leetcode/point72}/all.csv | 0 .../point72}/more-than-six-months.csv | 0 {polar => leetcode/polar}/all.csv | 0 .../polar}/more-than-six-months.csv | 0 {ponyai => leetcode/ponyai}/all.csv | 0 .../ponyai}/more-than-six-months.csv | 0 {pornhub => leetcode/pornhub}/all.csv | 0 .../pornhub}/more-than-six-months.csv | 0 {porter => leetcode/porter}/all.csv | 0 .../porter}/more-than-six-months.csv | 0 {poshmark => leetcode/poshmark}/all.csv | 0 .../poshmark}/more-than-six-months.csv | 0 {postman => leetcode/postman}/all.csv | 0 {postmates => leetcode/postmates}/all.csv | 0 .../postmates}/more-than-six-months.csv | 0 {poynt => leetcode/poynt}/all.csv | 0 .../poynt}/more-than-six-months.csv | 0 {practo => leetcode/practo}/all.csv | 0 .../practo}/more-than-six-months.csv | 0 .../publicis-sapient}/all.csv | 0 .../more-than-six-months.csv | 0 .../publicis-sapient}/six-months.csv | 0 {pubmatic => leetcode/pubmatic}/all.csv | 0 .../pubmatic}/more-than-six-months.csv | 0 .../pure-storage}/all.csv | 0 .../pure-storage}/more-than-six-months.csv | 0 .../pure-storage}/six-months.csv | 0 .../pure-storage}/three-months.csv | 0 {pure => leetcode/pure}/all.csv | 0 {pure => leetcode/pure}/six-months.csv | 0 {purplle => leetcode/purplle}/all.csv | 0 .../purplle}/more-than-six-months.csv | 0 {pwc => leetcode/pwc}/all.csv | 0 .../pwc}/more-than-six-months.csv | 0 {pwc => leetcode/pwc}/six-months.csv | 0 {qburst => leetcode/qburst}/all.csv | 0 .../qburst}/more-than-six-months.csv | 0 {qualcomm => leetcode/qualcomm}/all.csv | 0 .../qualcomm}/more-than-six-months.csv | 0 .../qualcomm}/six-months.csv | 0 .../qualcomm}/three-months.csv | 0 {qualtrics => leetcode/qualtrics}/all.csv | 0 .../qualtrics}/more-than-six-months.csv | 0 .../qualtrics}/six-months.csv | 0 {qualys => leetcode/qualys}/all.csv | 0 .../qualys}/more-than-six-months.csv | 0 {quantcast => leetcode/quantcast}/all.csv | 0 .../quantcast}/six-months.csv | 0 .../quantcast}/three-months.csv | 0 {quince => leetcode/quince}/all.csv | 0 .../quince}/more-than-six-months.csv | 0 {quince => leetcode/quince}/six-months.csv | 0 {quince => leetcode/quince}/thirty-days.csv | 0 {quince => leetcode/quince}/three-months.csv | 0 {qumulo => leetcode/qumulo}/all.csv | 0 .../qumulo}/more-than-six-months.csv | 0 {quora => leetcode/quora}/all.csv | 0 .../quora}/more-than-six-months.csv | 0 {quora => leetcode/quora}/six-months.csv | 0 {quora => leetcode/quora}/three-months.csv | 0 {rackspace => leetcode/rackspace}/all.csv | 0 .../rackspace}/more-than-six-months.csv | 0 {radius => leetcode/radius}/all.csv | 0 .../radius}/more-than-six-months.csv | 0 {rakuten => leetcode/rakuten}/all.csv | 0 .../rakuten}/more-than-six-months.csv | 0 {rakuten => leetcode/rakuten}/six-months.csv | 0 {rakuten => leetcode/rakuten}/thirty-days.csv | 0 .../rakuten}/three-months.csv | 0 {ramp-2 => leetcode/ramp-2}/all.csv | 0 .../ramp-2}/more-than-six-months.csv | 0 {ramp-2 => leetcode/ramp-2}/six-months.csv | 0 {ramp-2 => leetcode/ramp-2}/three-months.csv | 0 {razorpay => leetcode/razorpay}/all.csv | 0 .../razorpay}/more-than-six-months.csv | 0 .../razorpay}/six-months.csv | 0 {rbc => leetcode/rbc}/all.csv | 0 .../rbc}/more-than-six-months.csv | 0 {rbc => leetcode/rbc}/six-months.csv | 0 {redbus => leetcode/redbus}/all.csv | 0 .../redbus}/more-than-six-months.csv | 0 {reddit => leetcode/reddit}/all.csv | 0 .../reddit}/more-than-six-months.csv | 0 {reddit => leetcode/reddit}/six-months.csv | 0 {redfin => leetcode/redfin}/all.csv | 0 {redfin => leetcode/redfin}/six-months.csv | 0 {remitly => leetcode/remitly}/all.csv | 0 .../remitly}/more-than-six-months.csv | 0 {remitly => leetcode/remitly}/six-months.csv | 0 .../remitly}/three-months.csv | 0 {retailmenot => leetcode/retailmenot}/all.csv | 0 .../retailmenot}/more-than-six-months.csv | 0 {revolut => leetcode/revolut}/all.csv | 0 .../revolut}/more-than-six-months.csv | 0 {revolut => leetcode/revolut}/six-months.csv | 0 .../revolut}/three-months.csv | 0 {riot-games => leetcode/riot-games}/all.csv | 0 .../riot-games}/more-than-six-months.csv | 0 .../riot-games}/six-months.csv | 0 {ripple => leetcode/ripple}/all.csv | 0 .../ripple}/more-than-six-months.csv | 0 {ripple => leetcode/ripple}/six-months.csv | 0 {ripple => leetcode/ripple}/three-months.csv | 0 {rippling => leetcode/rippling}/all.csv | 0 .../rippling}/more-than-six-months.csv | 0 .../rippling}/six-months.csv | 0 {rivian => leetcode/rivian}/all.csv | 0 .../rivian}/more-than-six-months.csv | 0 {rivian => leetcode/rivian}/six-months.csv | 0 {rivian => leetcode/rivian}/three-months.csv | 0 {robinhood => leetcode/robinhood}/all.csv | 0 .../robinhood}/more-than-six-months.csv | 0 .../robinhood}/six-months.csv | 0 .../robinhood}/three-months.csv | 0 {roblox => leetcode/roblox}/all.csv | 0 .../roblox}/more-than-six-months.csv | 0 {roblox => leetcode/roblox}/six-months.csv | 0 {roblox => leetcode/roblox}/thirty-days.csv | 0 {roblox => leetcode/roblox}/three-months.csv | 0 {roche => leetcode/roche}/all.csv | 0 .../roche}/more-than-six-months.csv | 0 {rokt => leetcode/rokt}/all.csv | 0 .../rokt}/more-than-six-months.csv | 0 {rokt => leetcode/rokt}/six-months.csv | 0 {roku => leetcode/roku}/all.csv | 0 .../roku}/more-than-six-months.csv | 0 {roku => leetcode/roku}/six-months.csv | 0 {roku => leetcode/roku}/three-months.csv | 0 {rubrik => leetcode/rubrik}/all.csv | 0 .../rubrik}/more-than-six-months.csv | 0 {rubrik => leetcode/rubrik}/six-months.csv | 0 {rubrik => leetcode/rubrik}/three-months.csv | 0 {salesforce => leetcode/salesforce}/all.csv | 0 .../salesforce}/more-than-six-months.csv | 0 .../salesforce}/six-months.csv | 0 .../salesforce}/thirty-days.csv | 0 .../salesforce}/three-months.csv | 0 {sambanova => leetcode/sambanova}/all.csv | 0 {samsara => leetcode/samsara}/all.csv | 0 .../samsara}/more-than-six-months.csv | 0 {samsara => leetcode/samsara}/six-months.csv | 0 {samsung => leetcode/samsung}/all.csv | 0 .../samsung}/more-than-six-months.csv | 0 {samsung => leetcode/samsung}/six-months.csv | 0 .../samsung}/three-months.csv | 0 {sap => leetcode/sap}/all.csv | 0 .../sap}/more-than-six-months.csv | 0 {sap => leetcode/sap}/six-months.csv | 0 {sap => leetcode/sap}/three-months.csv | 0 {scale-ai => leetcode/scale-ai}/all.csv | 0 .../scale-ai}/more-than-six-months.csv | 0 .../schneider-electric}/all.csv | 0 .../more-than-six-months.csv | 0 {schrodinger => leetcode/schrodinger}/all.csv | 0 .../schrodinger}/more-than-six-months.csv | 0 {sentry => leetcode/sentry}/all.csv | 0 .../sentry}/more-than-six-months.csv | 0 {servicenow => leetcode/servicenow}/all.csv | 0 .../servicenow}/more-than-six-months.csv | 0 .../servicenow}/six-months.csv | 0 .../servicenow}/three-months.csv | 0 {sharechat => leetcode/sharechat}/all.csv | 0 .../sharechat}/more-than-six-months.csv | 0 .../shift-technology}/all.csv | 0 .../more-than-six-months.csv | 0 {shipsy => leetcode/shipsy}/all.csv | 0 .../shipsy}/more-than-six-months.csv | 0 {shopee => leetcode/shopee}/all.csv | 0 .../shopee}/more-than-six-months.csv | 0 {shopee => leetcode/shopee}/six-months.csv | 0 {shopify => leetcode/shopify}/all.csv | 0 .../shopify}/more-than-six-months.csv | 0 {shopify => leetcode/shopify}/six-months.csv | 0 .../shopify}/three-months.csv | 0 {siemens => leetcode/siemens}/all.csv | 0 .../siemens}/more-than-six-months.csv | 0 {siemens => leetcode/siemens}/six-months.csv | 0 {sig => leetcode/sig}/all.csv | 0 .../sig}/more-than-six-months.csv | 0 {sig => leetcode/sig}/six-months.csv | 0 {sigmoid => leetcode/sigmoid}/all.csv | 0 .../sigmoid}/more-than-six-months.csv | 0 {sigmoid => leetcode/sigmoid}/six-months.csv | 0 .../sigmoid}/three-months.csv | 0 {singlestore => leetcode/singlestore}/all.csv | 0 .../singlestore}/more-than-six-months.csv | 0 {sixt => leetcode/sixt}/all.csv | 0 .../sixt}/more-than-six-months.csv | 0 {slice => leetcode/slice}/all.csv | 0 .../slice}/more-than-six-months.csv | 0 {smartnews => leetcode/smartnews}/all.csv | 0 .../smartnews}/more-than-six-months.csv | 0 {smartsheet => leetcode/smartsheet}/all.csv | 0 .../smartsheet}/more-than-six-months.csv | 0 {snapchat => leetcode/snapchat}/all.csv | 0 .../snapchat}/more-than-six-months.csv | 0 .../snapchat}/six-months.csv | 0 .../snapchat}/three-months.csv | 0 {snapdeal => leetcode/snapdeal}/all.csv | 0 .../snapdeal}/more-than-six-months.csv | 0 {snowflake => leetcode/snowflake}/all.csv | 0 .../snowflake}/more-than-six-months.csv | 0 .../snowflake}/six-months.csv | 0 .../snowflake}/thirty-days.csv | 0 .../snowflake}/three-months.csv | 0 .../societe-generale}/all.csv | 0 .../more-than-six-months.csv | 0 {sofi => leetcode/sofi}/all.csv | 0 .../sofi}/more-than-six-months.csv | 0 {sofi => leetcode/sofi}/six-months.csv | 0 {sofi => leetcode/sofi}/three-months.csv | 0 {software-ag => leetcode/software-ag}/all.csv | 0 .../software-ag}/more-than-six-months.csv | 0 {softwire => leetcode/softwire}/all.csv | 0 .../softwire}/more-than-six-months.csv | 0 .../softwire}/six-months.csv | 0 {sony => leetcode/sony}/all.csv | 0 .../sony}/more-than-six-months.csv | 0 {soti => leetcode/soti}/all.csv | 0 .../soti}/more-than-six-months.csv | 0 {soundhound => leetcode/soundhound}/all.csv | 0 .../soundhound}/more-than-six-months.csv | 0 {spacex => leetcode/spacex}/all.csv | 0 .../spacex}/more-than-six-months.csv | 0 {spinny => leetcode/spinny}/all.csv | 0 .../spinny}/more-than-six-months.csv | 0 {spinny => leetcode/spinny}/six-months.csv | 0 {spinny => leetcode/spinny}/three-months.csv | 0 {splunk => leetcode/splunk}/all.csv | 0 .../splunk}/more-than-six-months.csv | 0 {splunk => leetcode/splunk}/six-months.csv | 0 {spotify => leetcode/spotify}/all.csv | 0 .../spotify}/more-than-six-months.csv | 0 {spotify => leetcode/spotify}/six-months.csv | 0 {spotify => leetcode/spotify}/thirty-days.csv | 0 .../spotify}/three-months.csv | 0 {sprinklr => leetcode/sprinklr}/all.csv | 0 .../sprinklr}/more-than-six-months.csv | 0 {square => leetcode/square}/all.csv | 0 .../square}/more-than-six-months.csv | 0 {square => leetcode/square}/six-months.csv | 0 .../squarepoint-capital}/all.csv | 0 .../more-than-six-months.csv | 0 .../squarepoint-capital}/six-months.csv | 0 {squarespace => leetcode/squarespace}/all.csv | 0 .../squarespace}/more-than-six-months.csv | 0 .../squarespace}/six-months.csv | 0 .../squarespace}/three-months.csv | 0 {src => leetcode/src}/main/java/Main.java | 0 {src => leetcode/src}/main/java/Scraper.java | 0 .../main/java/model/ProblemStatement.java | 0 {stackadapt => leetcode/stackadapt}/all.csv | 0 .../stackadapt}/more-than-six-months.csv | 0 {stackline => leetcode/stackline}/all.csv | 0 .../stackline}/more-than-six-months.csv | 0 .../stackline}/six-months.csv | 0 {starbucks => leetcode/starbucks}/all.csv | 0 .../starbucks}/six-months.csv | 0 .../starbucks}/three-months.csv | 0 {state-farm => leetcode/state-farm}/all.csv | 0 .../state-farm}/six-months.csv | 0 {strava => leetcode/strava}/all.csv | 0 .../strava}/more-than-six-months.csv | 0 {stripe => leetcode/stripe}/all.csv | 0 .../stripe}/more-than-six-months.csv | 0 {stripe => leetcode/stripe}/six-months.csv | 0 {stripe => leetcode/stripe}/thirty-days.csv | 0 {stripe => leetcode/stripe}/three-months.csv | 0 {sumologic => leetcode/sumologic}/all.csv | 0 .../sumologic}/more-than-six-months.csv | 0 .../susquehanna-international-group}/all.csv | 0 {swiggy => leetcode/swiggy}/all.csv | 0 .../swiggy}/more-than-six-months.csv | 0 {swiggy => leetcode/swiggy}/six-months.csv | 0 {swiggy => leetcode/swiggy}/thirty-days.csv | 0 {swiggy => leetcode/swiggy}/three-months.csv | 0 {syfe => leetcode/syfe}/all.csv | 0 .../syfe}/more-than-six-months.csv | 0 {synology => leetcode/synology}/all.csv | 0 .../synology}/more-than-six-months.csv | 0 {synopsys => leetcode/synopsys}/all.csv | 0 .../synopsys}/more-than-six-months.csv | 0 {ta-digital => leetcode/ta-digital}/all.csv | 0 .../ta-digital}/more-than-six-months.csv | 0 {tableau => leetcode/tableau}/all.csv | 0 .../tableau}/more-than-six-months.csv | 0 .../tally-solutions}/all.csv | 0 .../tally-solutions}/more-than-six-months.csv | 0 {tanium => leetcode/tanium}/all.csv | 0 .../tanium}/more-than-six-months.csv | 0 {tanium => leetcode/tanium}/six-months.csv | 0 {target => leetcode/target}/all.csv | 0 .../target}/more-than-six-months.csv | 0 {tcs => leetcode/tcs}/all.csv | 0 .../tcs}/more-than-six-months.csv | 0 {tcs => leetcode/tcs}/six-months.csv | 0 {tcs => leetcode/tcs}/thirty-days.csv | 0 {tcs => leetcode/tcs}/three-months.csv | 0 .../tech-mahindra}/all.csv | 0 .../tech-mahindra}/more-than-six-months.csv | 0 {tekion => leetcode/tekion}/all.csv | 0 .../tekion}/more-than-six-months.csv | 0 {tekion => leetcode/tekion}/six-months.csv | 0 {tekion => leetcode/tekion}/three-months.csv | 0 {tencent => leetcode/tencent}/all.csv | 0 .../tencent}/more-than-six-months.csv | 0 {tencent => leetcode/tencent}/six-months.csv | 0 .../tencent}/three-months.csv | 0 {teradata => leetcode/teradata}/all.csv | 0 .../teradata}/more-than-six-months.csv | 0 {tesco => leetcode/tesco}/all.csv | 0 .../tesco}/more-than-six-months.csv | 0 {tesco => leetcode/tesco}/six-months.csv | 0 {tesla => leetcode/tesla}/all.csv | 0 .../tesla}/more-than-six-months.csv | 0 {tesla => leetcode/tesla}/six-months.csv | 0 {tesla => leetcode/tesla}/three-months.csv | 0 .../texas-instruments}/all.csv | 0 .../more-than-six-months.csv | 0 .../the-trade-desk}/all.csv | 0 .../the-trade-desk}/more-than-six-months.csv | 0 .../the-trade-desk}/six-months.csv | 0 .../thomson-reuters}/all.csv | 0 .../thomson-reuters}/more-than-six-months.csv | 0 {thoughtspot => leetcode/thoughtspot}/all.csv | 0 .../thoughtspot}/more-than-six-months.csv | 0 .../thoughtworks}/all.csv | 0 .../thoughtworks}/more-than-six-months.csv | 0 .../thousandeyes}/all.csv | 0 .../thousandeyes}/more-than-six-months.csv | 0 {thumbtack => leetcode/thumbtack}/all.csv | 0 .../thumbtack}/more-than-six-months.csv | 0 {tiaa => leetcode/tiaa}/all.csv | 0 .../tiaa}/more-than-six-months.csv | 0 .../tiger-analytics}/all.csv | 0 .../tiger-analytics}/more-than-six-months.csv | 0 .../tiger-analytics}/six-months.csv | 0 .../tiger-analytics}/three-months.csv | 0 {tiktok => leetcode/tiktok}/all.csv | 0 .../tiktok}/more-than-six-months.csv | 0 {tiktok => leetcode/tiktok}/six-months.csv | 0 {tiktok => leetcode/tiktok}/thirty-days.csv | 0 {tiktok => leetcode/tiktok}/three-months.csv | 0 {tinder => leetcode/tinder}/all.csv | 0 .../tinder}/more-than-six-months.csv | 0 {tinkoff => leetcode/tinkoff}/all.csv | 0 .../tinkoff}/more-than-six-months.csv | 0 {toast => leetcode/toast}/all.csv | 0 .../toast}/more-than-six-months.csv | 0 {toast => leetcode/toast}/six-months.csv | 0 {toast => leetcode/toast}/three-months.csv | 0 {tokopedia => leetcode/tokopedia}/all.csv | 0 .../tokopedia}/more-than-six-months.csv | 0 {tomtom => leetcode/tomtom}/all.csv | 0 .../tomtom}/more-than-six-months.csv | 0 {tomtom => leetcode/tomtom}/six-months.csv | 0 {toptal => leetcode/toptal}/all.csv | 0 .../toptal}/more-than-six-months.csv | 0 .../tower-research}/all.csv | 0 .../tower-research}/more-than-six-months.csv | 0 {tracxn => leetcode/tracxn}/all.csv | 0 {tracxn => leetcode/tracxn}/six-months.csv | 0 {traveloka => leetcode/traveloka}/all.csv | 0 .../traveloka}/more-than-six-months.csv | 0 .../traveloka}/six-months.csv | 0 {trexquant => leetcode/trexquant}/all.csv | 0 .../trexquant}/more-than-six-months.csv | 0 {trilogy => leetcode/trilogy}/all.csv | 0 .../trilogy}/more-than-six-months.csv | 0 {trilogy => leetcode/trilogy}/six-months.csv | 0 {trilogy => leetcode/trilogy}/thirty-days.csv | 0 .../trilogy}/three-months.csv | 0 {tripadvisor => leetcode/tripadvisor}/all.csv | 0 .../tripadvisor}/more-than-six-months.csv | 0 .../tripadvisor}/six-months.csv | 0 {triplebyte => leetcode/triplebyte}/all.csv | 0 .../triplebyte}/more-than-six-months.csv | 0 {turing => leetcode/turing}/all.csv | 0 .../turing}/more-than-six-months.csv | 0 {turing => leetcode/turing}/six-months.csv | 0 {turing => leetcode/turing}/three-months.csv | 0 {turo => leetcode/turo}/all.csv | 0 .../turo}/more-than-six-months.csv | 0 {turvo => leetcode/turvo}/all.csv | 0 .../turvo}/more-than-six-months.csv | 0 {tusimple => leetcode/tusimple}/all.csv | 0 .../tusimple}/more-than-six-months.csv | 0 {twilio => leetcode/twilio}/all.csv | 0 .../twilio}/more-than-six-months.csv | 0 {twitch => leetcode/twitch}/all.csv | 0 .../twitch}/more-than-six-months.csv | 0 {twitch => leetcode/twitch}/six-months.csv | 0 {twitch => leetcode/twitch}/three-months.csv | 0 {twitter => leetcode/twitter}/all.csv | 0 .../twitter}/more-than-six-months.csv | 0 {two-sigma => leetcode/two-sigma}/all.csv | 0 .../two-sigma}/more-than-six-months.csv | 0 .../two-sigma}/six-months.csv | 0 {uber => leetcode/uber}/all.csv | 0 .../uber}/more-than-six-months.csv | 0 {uber => leetcode/uber}/six-months.csv | 0 {uber => leetcode/uber}/thirty-days.csv | 0 {uber => leetcode/uber}/three-months.csv | 0 {ubisoft => leetcode/ubisoft}/all.csv | 0 {ubs => leetcode/ubs}/all.csv | 0 .../ubs}/more-than-six-months.csv | 0 {ubs => leetcode/ubs}/six-months.csv | 0 {uipath => leetcode/uipath}/all.csv | 0 .../uipath}/more-than-six-months.csv | 0 {uipath => leetcode/uipath}/six-months.csv | 0 {uipath => leetcode/uipath}/three-months.csv | 0 {ukg => leetcode/ukg}/all.csv | 0 .../ukg}/more-than-six-months.csv | 0 {ukg => leetcode/ukg}/six-months.csv | 0 {ukg => leetcode/ukg}/three-months.csv | 0 {unbxd => leetcode/unbxd}/all.csv | 0 .../unbxd}/more-than-six-months.csv | 0 {unity => leetcode/unity}/all.csv | 0 .../unity}/more-than-six-months.csv | 0 {unstop => leetcode/unstop}/all.csv | 0 .../unstop}/more-than-six-months.csv | 0 {upstart => leetcode/upstart}/all.csv | 0 .../upstart}/more-than-six-months.csv | 0 {upstart => leetcode/upstart}/six-months.csv | 0 .../upstart}/three-months.csv | 0 {upstox => leetcode/upstox}/all.csv | 0 .../urban-company}/all.csv | 0 .../urban-company}/more-than-six-months.csv | 0 {usaa => leetcode/usaa}/all.csv | 0 .../usaa}/more-than-six-months.csv | 0 {ust => leetcode/ust}/all.csv | 0 .../ust}/more-than-six-months.csv | 0 {valve => leetcode/valve}/all.csv | 0 .../valve}/more-than-six-months.csv | 0 {valve => leetcode/valve}/six-months.csv | 0 {vanguard => leetcode/vanguard}/all.csv | 0 .../vanguard}/more-than-six-months.csv | 0 {veeva => leetcode/veeva}/all.csv | 0 .../veeva}/more-than-six-months.csv | 0 {verily => leetcode/verily}/all.csv | 0 .../verily}/more-than-six-months.csv | 0 {verily => leetcode/verily}/six-months.csv | 0 {veritas => leetcode/veritas}/all.csv | 0 .../veritas}/more-than-six-months.csv | 0 {verizon => leetcode/verizon}/all.csv | 0 .../verizon}/more-than-six-months.csv | 0 {verizon => leetcode/verizon}/six-months.csv | 0 {verkada => leetcode/verkada}/all.csv | 0 .../verkada}/more-than-six-months.csv | 0 {verkada => leetcode/verkada}/six-months.csv | 0 .../verkada}/three-months.csv | 0 {viasat => leetcode/viasat}/all.csv | 0 .../viasat}/more-than-six-months.csv | 0 {viasat => leetcode/viasat}/six-months.csv | 0 {vimeo => leetcode/vimeo}/all.csv | 0 .../vimeo}/more-than-six-months.csv | 0 {vimeo => leetcode/vimeo}/six-months.csv | 0 {vimeo => leetcode/vimeo}/three-months.csv | 0 {virtu => leetcode/virtu}/all.csv | 0 .../virtu}/more-than-six-months.csv | 0 {virtu => leetcode/virtu}/six-months.csv | 0 {virtu => leetcode/virtu}/three-months.csv | 0 {virtusa => leetcode/virtusa}/all.csv | 0 .../virtusa}/more-than-six-months.csv | 0 {visa => leetcode/visa}/all.csv | 0 .../visa}/more-than-six-months.csv | 0 {visa => leetcode/visa}/six-months.csv | 0 {visa => leetcode/visa}/three-months.csv | 0 {vk => leetcode/vk}/all.csv | 0 {vk => leetcode/vk}/more-than-six-months.csv | 0 {vk => leetcode/vk}/six-months.csv | 0 {vk => leetcode/vk}/three-months.csv | 0 {vmware => leetcode/vmware}/all.csv | 0 .../vmware}/more-than-six-months.csv | 0 .../walmart-labs}/all.csv | 0 .../walmart-labs}/more-than-six-months.csv | 0 .../walmart-labs}/six-months.csv | 0 .../walmart-labs}/thirty-days.csv | 0 .../walmart-labs}/three-months.csv | 0 {warnermedia => leetcode/warnermedia}/all.csv | 0 .../warnermedia}/more-than-six-months.csv | 0 .../warnermedia}/six-months.csv | 0 .../warnermedia}/three-months.csv | 0 {watchguard => leetcode/watchguard}/all.csv | 0 .../watchguard}/more-than-six-months.csv | 0 {wayfair => leetcode/wayfair}/all.csv | 0 .../wayfair}/more-than-six-months.csv | 0 {wayfair => leetcode/wayfair}/six-months.csv | 0 {waymo => leetcode/waymo}/all.csv | 0 .../waymo}/more-than-six-months.csv | 0 {waymo => leetcode/waymo}/six-months.csv | 0 {waymo => leetcode/waymo}/three-months.csv | 0 {wayve => leetcode/wayve}/all.csv | 0 .../wayve}/more-than-six-months.csv | 0 {wealthfront => leetcode/wealthfront}/all.csv | 0 .../wealthfront}/more-than-six-months.csv | 0 {wells-fargo => leetcode/wells-fargo}/all.csv | 0 .../wells-fargo}/more-than-six-months.csv | 0 {weride => leetcode/weride}/all.csv | 0 .../weride}/more-than-six-months.csv | 0 {weride => leetcode/weride}/six-months.csv | 0 {weride => leetcode/weride}/three-months.csv | 0 .../western-digital}/all.csv | 0 .../western-digital}/six-months.csv | 0 {whatfix => leetcode/whatfix}/all.csv | 0 .../whatfix}/more-than-six-months.csv | 0 {whatnot => leetcode/whatnot}/all.csv | 0 .../whatnot}/more-than-six-months.csv | 0 {whatnot => leetcode/whatnot}/six-months.csv | 0 .../whatnot}/three-months.csv | 0 {winzo => leetcode/winzo}/all.csv | 0 .../winzo}/more-than-six-months.csv | 0 {wipro => leetcode/wipro}/all.csv | 0 .../wipro}/more-than-six-months.csv | 0 {wipro => leetcode/wipro}/six-months.csv | 0 {wipro => leetcode/wipro}/three-months.csv | 0 {wise => leetcode/wise}/all.csv | 0 .../wise}/more-than-six-months.csv | 0 {wish => leetcode/wish}/all.csv | 0 .../wish}/more-than-six-months.csv | 0 {wissen => leetcode/wissen}/all.csv | 0 .../wissen}/more-than-six-months.csv | 0 {wissen => leetcode/wissen}/six-months.csv | 0 {wissen => leetcode/wissen}/three-months.csv | 0 {wix => leetcode/wix}/all.csv | 0 .../wix}/more-than-six-months.csv | 0 {wix => leetcode/wix}/six-months.csv | 0 {wix => leetcode/wix}/three-months.csv | 0 {workday => leetcode/workday}/all.csv | 0 .../workday}/more-than-six-months.csv | 0 {workday => leetcode/workday}/six-months.csv | 0 .../workday}/three-months.csv | 0 .../works-applications}/all.csv | 0 .../more-than-six-months.csv | 0 {worldquant => leetcode/worldquant}/all.csv | 0 .../worldquant}/more-than-six-months.csv | 0 .../worldquant}/six-months.csv | 0 .../worldquant}/three-months.csv | 0 .../woven-by-toyota}/all.csv | 0 .../woven-by-toyota}/six-months.csv | 0 {xiaomi => leetcode/xiaomi}/all.csv | 0 {xing => leetcode/xing}/all.csv | 0 .../xing}/more-than-six-months.csv | 0 {yahoo => leetcode/yahoo}/all.csv | 0 .../yahoo}/more-than-six-months.csv | 0 {yahoo => leetcode/yahoo}/six-months.csv | 0 {yahoo => leetcode/yahoo}/three-months.csv | 0 {yandex => leetcode/yandex}/all.csv | 0 .../yandex}/more-than-six-months.csv | 0 {yandex => leetcode/yandex}/six-months.csv | 0 {yandex => leetcode/yandex}/thirty-days.csv | 0 {yandex => leetcode/yandex}/three-months.csv | 0 {yatra => leetcode/yatra}/all.csv | 0 .../yatra}/more-than-six-months.csv | 0 {yelp => leetcode/yelp}/all.csv | 0 .../yelp}/more-than-six-months.csv | 0 {yelp => leetcode/yelp}/six-months.csv | 0 {yelp => leetcode/yelp}/three-months.csv | 0 {yext => leetcode/yext}/all.csv | 0 .../yext}/more-than-six-months.csv | 0 {zalando => leetcode/zalando}/all.csv | 0 .../zalando}/more-than-six-months.csv | 0 {zappos => leetcode/zappos}/all.csv | 0 .../zappos}/more-than-six-months.csv | 0 {zemoso => leetcode/zemoso}/all.csv | 0 .../zemoso}/more-than-six-months.csv | 0 {zendesk => leetcode/zendesk}/all.csv | 0 .../zendesk}/more-than-six-months.csv | 0 {zenefits => leetcode/zenefits}/all.csv | 0 .../zenefits}/more-than-six-months.csv | 0 {zepto => leetcode/zepto}/all.csv | 0 .../zepto}/more-than-six-months.csv | 0 {zepto => leetcode/zepto}/six-months.csv | 0 {zeta-suite => leetcode/zeta-suite}/all.csv | 0 .../zeta-suite}/more-than-six-months.csv | 0 {zeta => leetcode/zeta}/all.csv | 0 .../zeta}/more-than-six-months.csv | 0 {zeta => leetcode/zeta}/six-months.csv | 0 {zeta => leetcode/zeta}/thirty-days.csv | 0 {zeta => leetcode/zeta}/three-months.csv | 0 {zillow => leetcode/zillow}/all.csv | 0 .../zillow}/more-than-six-months.csv | 0 {zip => leetcode/zip}/all.csv | 0 .../zip}/more-than-six-months.csv | 0 {zip => leetcode/zip}/six-months.csv | 0 {zip => leetcode/zip}/three-months.csv | 0 .../ziprecruiter}/all.csv | 0 .../ziprecruiter}/more-than-six-months.csv | 0 {zluri => leetcode/zluri}/all.csv | 0 .../zluri}/more-than-six-months.csv | 0 {zoho => leetcode/zoho}/all.csv | 0 .../zoho}/more-than-six-months.csv | 0 {zoho => leetcode/zoho}/six-months.csv | 0 {zoho => leetcode/zoho}/thirty-days.csv | 0 {zoho => leetcode/zoho}/three-months.csv | 0 {zomato => leetcode/zomato}/all.csv | 0 .../zomato}/more-than-six-months.csv | 0 {zomato => leetcode/zomato}/six-months.csv | 0 {zomato => leetcode/zomato}/three-months.csv | 0 {zoom => leetcode/zoom}/all.csv | 0 .../zoom}/more-than-six-months.csv | 0 {zoox => leetcode/zoox}/all.csv | 0 .../zoox}/more-than-six-months.csv | 0 {zoox => leetcode/zoox}/six-months.csv | 0 {zoox => leetcode/zoox}/three-months.csv | 0 {zopsmart => leetcode/zopsmart}/all.csv | 0 .../zopsmart}/more-than-six-months.csv | 0 .../zopsmart}/six-months.csv | 0 .../zopsmart}/three-months.csv | 0 .../zs-associates}/all.csv | 0 .../zs-associates}/more-than-six-months.csv | 0 .../zs-associates}/six-months.csv | 0 .../zs-associates}/three-months.csv | 0 {zscaler => leetcode/zscaler}/all.csv | 0 .../zscaler}/more-than-six-months.csv | 0 {zscaler => leetcode/zscaler}/six-months.csv | 0 .../zscaler}/three-months.csv | 0 {zynga => leetcode/zynga}/all.csv | 0 .../zynga}/more-than-six-months.csv | 0 src/Backend/AppContext.cs | 19 ++++ src/Backend/Backend.csproj | 21 ++++ src/Backend/Backend.http | 6 + src/Backend/Controllers/ProblemsController.cs | 46 ++++++++ src/Backend/Models/Internal/Problem.cs | 0 src/Backend/Models/Public/Problem.cs | 1 + src/Backend/Models/Public/QueryParam.cs | 11 ++ src/Backend/Operations/DataProvider.cs | 71 ++++++++++++ src/Backend/Operations/IFilter.cs | 7 ++ src/Backend/Operations/ProblemFilter.cs | 43 +++++++ src/Backend/Program.cs | 83 ++++++++++++++ src/Backend/Properties/launchSettings.json | 41 +++++++ src/Backend/appsettings.Development.json | 8 ++ src/Backend/appsettings.json | 24 ++++ src/Common/Common.csproj | 10 ++ src/Common/Models/Problem.cs | 58 ++++++++++ src/Common/Models/ProblemSchema.cs | 44 ++++++++ src/Common/Program.cs | 9 ++ src/Synchronizer/Helper.cs | 49 ++++++++ src/Synchronizer/ProblemsProcessor.cs | 106 ++++++++++++++++++ src/Synchronizer/Program.cs | 83 ++++++++++++++ src/Synchronizer/Synchronizer.csproj | 20 ++++ 1916 files changed, 808 insertions(+) create mode 100644 leetcode-wrapper.sln rename {1kosmos => leetcode/1kosmos}/all.csv (100%) rename {1kosmos => leetcode/1kosmos}/more-than-six-months.csv (100%) rename {6sense => leetcode/6sense}/all.csv (100%) rename {6sense => leetcode/6sense}/more-than-six-months.csv (100%) rename {6sense => leetcode/6sense}/six-months.csv (100%) rename {accelya => leetcode/accelya}/all.csv (100%) rename {accelya => leetcode/accelya}/more-than-six-months.csv (100%) rename {accenture => leetcode/accenture}/all.csv (100%) rename {accenture => leetcode/accenture}/more-than-six-months.csv (100%) rename {accenture => leetcode/accenture}/six-months.csv (100%) rename {accolite => leetcode/accolite}/all.csv (100%) rename {accolite => leetcode/accolite}/more-than-six-months.csv (100%) rename {accolite => leetcode/accolite}/six-months.csv (100%) rename {accolite => leetcode/accolite}/thirty-days.csv (100%) rename {accolite => leetcode/accolite}/three-months.csv (100%) rename {acko => leetcode/acko}/all.csv (100%) rename {acko => leetcode/acko}/more-than-six-months.csv (100%) rename {acorns => leetcode/acorns}/all.csv (100%) rename {activision => leetcode/activision}/all.csv (100%) rename {activision => leetcode/activision}/more-than-six-months.csv (100%) rename {activision => leetcode/activision}/six-months.csv (100%) rename {addepar => leetcode/addepar}/all.csv (100%) rename {addepar => leetcode/addepar}/more-than-six-months.csv (100%) rename {adobe => leetcode/adobe}/all.csv (100%) rename {adobe => leetcode/adobe}/more-than-six-months.csv (100%) rename {adobe => leetcode/adobe}/six-months.csv (100%) rename {adobe => leetcode/adobe}/thirty-days.csv (100%) rename {adobe => leetcode/adobe}/three-months.csv (100%) rename {adp => leetcode/adp}/all.csv (100%) rename {adp => leetcode/adp}/six-months.csv (100%) rename {aetion => leetcode/aetion}/all.csv (100%) rename {aetion => leetcode/aetion}/more-than-six-months.csv (100%) rename {affinity => leetcode/affinity}/all.csv (100%) rename {affinity => leetcode/affinity}/more-than-six-months.csv (100%) rename {affirm => leetcode/affirm}/all.csv (100%) rename {affirm => leetcode/affirm}/more-than-six-months.csv (100%) rename {affirm => leetcode/affirm}/six-months.csv (100%) rename {affirm => leetcode/affirm}/three-months.csv (100%) rename {agoda => leetcode/agoda}/all.csv (100%) rename {agoda => leetcode/agoda}/more-than-six-months.csv (100%) rename {agoda => leetcode/agoda}/six-months.csv (100%) rename {agoda => leetcode/agoda}/three-months.csv (100%) rename {airbnb => leetcode/airbnb}/all.csv (100%) rename {airbnb => leetcode/airbnb}/more-than-six-months.csv (100%) rename {airbnb => leetcode/airbnb}/six-months.csv (100%) rename {airbnb => leetcode/airbnb}/thirty-days.csv (100%) rename {airbnb => leetcode/airbnb}/three-months.csv (100%) rename {airbus => leetcode/airbus}/all.csv (100%) rename {airbus => leetcode/airbus}/more-than-six-months.csv (100%) rename {airbus => leetcode/airbus}/six-months.csv (100%) rename {airbus => leetcode/airbus}/three-months.csv (100%) rename {airtel => leetcode/airtel}/all.csv (100%) rename {airtel => leetcode/airtel}/more-than-six-months.csv (100%) rename {airtel => leetcode/airtel}/six-months.csv (100%) rename {airwallex => leetcode/airwallex}/all.csv (100%) rename {airwallex => leetcode/airwallex}/more-than-six-months.csv (100%) rename {akamai => leetcode/akamai}/all.csv (100%) rename {akamai => leetcode/akamai}/more-than-six-months.csv (100%) rename {akuna-capital => leetcode/akuna-capital}/all.csv (100%) rename {akuna-capital => leetcode/akuna-capital}/more-than-six-months.csv (100%) rename {akuna-capital => leetcode/akuna-capital}/six-months.csv (100%) rename {akuna-capital => leetcode/akuna-capital}/three-months.csv (100%) rename {alibaba => leetcode/alibaba}/all.csv (100%) rename {alibaba => leetcode/alibaba}/more-than-six-months.csv (100%) rename {allincall => leetcode/allincall}/all.csv (100%) rename {allincall => leetcode/allincall}/more-than-six-months.csv (100%) rename {alphagrep => leetcode/alphagrep}/all.csv (100%) rename {alphagrep => leetcode/alphagrep}/more-than-six-months.csv (100%) rename {alphonso => leetcode/alphonso}/all.csv (100%) rename {alphonso => leetcode/alphonso}/more-than-six-months.csv (100%) rename {alten => leetcode/alten}/all.csv (100%) rename {altimetrik => leetcode/altimetrik}/all.csv (100%) rename {altimetrik => leetcode/altimetrik}/more-than-six-months.csv (100%) rename {amadeus => leetcode/amadeus}/all.csv (100%) rename {amadeus => leetcode/amadeus}/more-than-six-months.csv (100%) rename {amazon => leetcode/amazon}/all.csv (100%) rename {amazon => leetcode/amazon}/more-than-six-months.csv (100%) rename {amazon => leetcode/amazon}/six-months.csv (100%) rename {amazon => leetcode/amazon}/thirty-days.csv (100%) rename {amazon => leetcode/amazon}/three-months.csv (100%) rename {amd => leetcode/amd}/all.csv (100%) rename {amd => leetcode/amd}/more-than-six-months.csv (100%) rename {amd => leetcode/amd}/six-months.csv (100%) rename {amdocs => leetcode/amdocs}/all.csv (100%) rename {amdocs => leetcode/amdocs}/more-than-six-months.csv (100%) rename {american-airlines => leetcode/american-airlines}/all.csv (100%) rename {american-express => leetcode/american-express}/all.csv (100%) rename {american-express => leetcode/american-express}/more-than-six-months.csv (100%) rename {american-express => leetcode/american-express}/six-months.csv (100%) rename {american-express => leetcode/american-express}/three-months.csv (100%) rename {amplitude => leetcode/amplitude}/all.csv (100%) rename {analytics-quotient => leetcode/analytics-quotient}/all.csv (100%) rename {analytics-quotient => leetcode/analytics-quotient}/more-than-six-months.csv (100%) rename {andela => leetcode/andela}/all.csv (100%) rename {andela => leetcode/andela}/more-than-six-months.csv (100%) rename {anduril => leetcode/anduril}/all.csv (100%) rename {anduril => leetcode/anduril}/more-than-six-months.csv (100%) rename {anduril => leetcode/anduril}/six-months.csv (100%) rename {anduril => leetcode/anduril}/thirty-days.csv (100%) rename {anduril => leetcode/anduril}/three-months.csv (100%) rename {anthropic => leetcode/anthropic}/all.csv (100%) rename {anthropic => leetcode/anthropic}/more-than-six-months.csv (100%) rename {anthropic => leetcode/anthropic}/six-months.csv (100%) rename {anthropic => leetcode/anthropic}/thirty-days.csv (100%) rename {anthropic => leetcode/anthropic}/three-months.csv (100%) rename {anyscale => leetcode/anyscale}/all.csv (100%) rename {anyscale => leetcode/anyscale}/more-than-six-months.csv (100%) rename {anyscale => leetcode/anyscale}/six-months.csv (100%) rename {aon => leetcode/aon}/all.csv (100%) rename {aon => leetcode/aon}/more-than-six-months.csv (100%) rename {apna => leetcode/apna}/all.csv (100%) rename {apna => leetcode/apna}/more-than-six-months.csv (100%) rename {apolloio => leetcode/apolloio}/all.csv (100%) rename {apolloio => leetcode/apolloio}/more-than-six-months.csv (100%) rename {appdynamics => leetcode/appdynamics}/all.csv (100%) rename {appdynamics => leetcode/appdynamics}/more-than-six-months.csv (100%) rename {appfolio => leetcode/appfolio}/all.csv (100%) rename {appfolio => leetcode/appfolio}/more-than-six-months.csv (100%) rename {apple => leetcode/apple}/all.csv (100%) rename {apple => leetcode/apple}/more-than-six-months.csv (100%) rename {apple => leetcode/apple}/six-months.csv (100%) rename {apple => leetcode/apple}/thirty-days.csv (100%) rename {apple => leetcode/apple}/three-months.csv (100%) rename {applied-intuition => leetcode/applied-intuition}/all.csv (100%) rename {applied-intuition => leetcode/applied-intuition}/more-than-six-months.csv (100%) rename {applied-intuition => leetcode/applied-intuition}/six-months.csv (100%) rename {applied-intuition => leetcode/applied-intuition}/thirty-days.csv (100%) rename {applied-intuition => leetcode/applied-intuition}/three-months.csv (100%) rename {applovin => leetcode/applovin}/all.csv (100%) rename {applovin => leetcode/applovin}/more-than-six-months.csv (100%) rename {appviewx => leetcode/appviewx}/all.csv (100%) rename {appviewx => leetcode/appviewx}/more-than-six-months.csv (100%) rename {aqr-capital-management-llc => leetcode/aqr-capital-management-llc}/all.csv (100%) rename {aqr-capital-management-llc => leetcode/aqr-capital-management-llc}/more-than-six-months.csv (100%) rename {arcesium => leetcode/arcesium}/all.csv (100%) rename {arcesium => leetcode/arcesium}/more-than-six-months.csv (100%) rename {argo-ai => leetcode/argo-ai}/all.csv (100%) rename {argo-ai => leetcode/argo-ai}/six-months.csv (100%) rename {argo-ai => leetcode/argo-ai}/three-months.csv (100%) rename {arista-networks => leetcode/arista-networks}/all.csv (100%) rename {arista-networks => leetcode/arista-networks}/more-than-six-months.csv (100%) rename {arista-networks => leetcode/arista-networks}/six-months.csv (100%) rename {arista-networks => leetcode/arista-networks}/three-months.csv (100%) rename {arm => leetcode/arm}/all.csv (100%) rename {arm => leetcode/arm}/more-than-six-months.csv (100%) rename {asana => leetcode/asana}/all.csv (100%) rename {asana => leetcode/asana}/more-than-six-months.csv (100%) rename {asana => leetcode/asana}/six-months.csv (100%) rename {ascend => leetcode/ascend}/all.csv (100%) rename {ascend => leetcode/ascend}/more-than-six-months.csv (100%) rename {asus => leetcode/asus}/all.csv (100%) rename {asus => leetcode/asus}/more-than-six-months.csv (100%) rename {at-t => leetcode/at-t}/all.csv (100%) rename {at-t => leetcode/at-t}/six-months.csv (100%) rename {athenahealth => leetcode/athenahealth}/all.csv (100%) rename {athenahealth => leetcode/athenahealth}/more-than-six-months.csv (100%) rename {athenahealth => leetcode/athenahealth}/six-months.csv (100%) rename {athenahealth => leetcode/athenahealth}/three-months.csv (100%) rename {atlassian => leetcode/atlassian}/all.csv (100%) rename {atlassian => leetcode/atlassian}/more-than-six-months.csv (100%) rename {atlassian => leetcode/atlassian}/six-months.csv (100%) rename {atlassian => leetcode/atlassian}/thirty-days.csv (100%) rename {atlassian => leetcode/atlassian}/three-months.csv (100%) rename {attentive => leetcode/attentive}/all.csv (100%) rename {attentive => leetcode/attentive}/more-than-six-months.csv (100%) rename {attentive => leetcode/attentive}/six-months.csv (100%) rename {attentive => leetcode/attentive}/three-months.csv (100%) rename {audible => leetcode/audible}/all.csv (100%) rename {audible => leetcode/audible}/more-than-six-months.csv (100%) rename {auriga => leetcode/auriga}/all.csv (100%) rename {auriga => leetcode/auriga}/more-than-six-months.csv (100%) rename {aurora => leetcode/aurora}/all.csv (100%) rename {aurora => leetcode/aurora}/more-than-six-months.csv (100%) rename {aurora => leetcode/aurora}/six-months.csv (100%) rename {aurora => leetcode/aurora}/three-months.csv (100%) rename {autodesk => leetcode/autodesk}/all.csv (100%) rename {autodesk => leetcode/autodesk}/more-than-six-months.csv (100%) rename {autodesk => leetcode/autodesk}/six-months.csv (100%) rename {autodesk => leetcode/autodesk}/thirty-days.csv (100%) rename {autodesk => leetcode/autodesk}/three-months.csv (100%) rename {avalara => leetcode/avalara}/all.csv (100%) rename {avalara => leetcode/avalara}/more-than-six-months.csv (100%) rename {avito => leetcode/avito}/all.csv (100%) rename {avito => leetcode/avito}/more-than-six-months.csv (100%) rename {avito => leetcode/avito}/six-months.csv (100%) rename {axis-bank => leetcode/axis-bank}/all.csv (100%) rename {axis-bank => leetcode/axis-bank}/six-months.csv (100%) rename {axon => leetcode/axon}/all.csv (100%) rename {axon => leetcode/axon}/more-than-six-months.csv (100%) rename {axon => leetcode/axon}/six-months.csv (100%) rename {axon => leetcode/axon}/thirty-days.csv (100%) rename {axon => leetcode/axon}/three-months.csv (100%) rename {baidu => leetcode/baidu}/all.csv (100%) rename {baidu => leetcode/baidu}/more-than-six-months.csv (100%) rename {bank-of-america => leetcode/bank-of-america}/all.csv (100%) rename {bank-of-america => leetcode/bank-of-america}/more-than-six-months.csv (100%) rename {barclays => leetcode/barclays}/all.csv (100%) rename {barclays => leetcode/barclays}/more-than-six-months.csv (100%) rename {barclays => leetcode/barclays}/six-months.csv (100%) rename {bcg => leetcode/bcg}/all.csv (100%) rename {bcg => leetcode/bcg}/six-months.csv (100%) rename {bentley-systems => leetcode/bentley-systems}/all.csv (100%) rename {bentley-systems => leetcode/bentley-systems}/more-than-six-months.csv (100%) rename {bharatpe => leetcode/bharatpe}/all.csv (100%) rename {bharatpe => leetcode/bharatpe}/more-than-six-months.csv (100%) rename {bidgely => leetcode/bidgely}/all.csv (100%) rename {bidgely => leetcode/bidgely}/more-than-six-months.csv (100%) rename {billcom => leetcode/billcom}/all.csv (100%) rename {billcom => leetcode/billcom}/more-than-six-months.csv (100%) rename {bitgo => leetcode/bitgo}/all.csv (100%) rename {bitgo => leetcode/bitgo}/more-than-six-months.csv (100%) rename {bitgo => leetcode/bitgo}/six-months.csv (100%) rename {bitgo => leetcode/bitgo}/three-months.csv (100%) rename {blackbuck => leetcode/blackbuck}/all.csv (100%) rename {blackbuck => leetcode/blackbuck}/more-than-six-months.csv (100%) rename {blackrock => leetcode/blackrock}/all.csv (100%) rename {blackrock => leetcode/blackrock}/more-than-six-months.csv (100%) rename {blackrock => leetcode/blackrock}/six-months.csv (100%) rename {blackrock => leetcode/blackrock}/three-months.csv (100%) rename {blackstone => leetcode/blackstone}/all.csv (100%) rename {blackstone => leetcode/blackstone}/more-than-six-months.csv (100%) rename {blend => leetcode/blend}/all.csv (100%) rename {blend => leetcode/blend}/more-than-six-months.csv (100%) rename {blend => leetcode/blend}/six-months.csv (100%) rename {blinkit => leetcode/blinkit}/all.csv (100%) rename {blinkit => leetcode/blinkit}/more-than-six-months.csv (100%) rename {blizzard => leetcode/blizzard}/all.csv (100%) rename {blizzard => leetcode/blizzard}/more-than-six-months.csv (100%) rename {bloomberg => leetcode/bloomberg}/all.csv (100%) rename {bloomberg => leetcode/bloomberg}/more-than-six-months.csv (100%) rename {bloomberg => leetcode/bloomberg}/six-months.csv (100%) rename {bloomberg => leetcode/bloomberg}/thirty-days.csv (100%) rename {bloomberg => leetcode/bloomberg}/three-months.csv (100%) rename {bloomreach => leetcode/bloomreach}/all.csv (100%) rename {bloomreach => leetcode/bloomreach}/more-than-six-months.csv (100%) rename {blue-origin => leetcode/blue-origin}/all.csv (100%) rename {blue-origin => leetcode/blue-origin}/more-than-six-months.csv (100%) rename {blue-yonder => leetcode/blue-yonder}/all.csv (100%) rename {blue-yonder => leetcode/blue-yonder}/more-than-six-months.csv (100%) rename {bnp-paribas => leetcode/bnp-paribas}/all.csv (100%) rename {bnp-paribas => leetcode/bnp-paribas}/more-than-six-months.csv (100%) rename {bny-mellon => leetcode/bny-mellon}/all.csv (100%) rename {bny-mellon => leetcode/bny-mellon}/more-than-six-months.csv (100%) rename {bny-mellon => leetcode/bny-mellon}/six-months.csv (100%) rename {boeing => leetcode/boeing}/all.csv (100%) rename {boeing => leetcode/boeing}/more-than-six-months.csv (100%) rename {bolt => leetcode/bolt}/all.csv (100%) rename {bolt => leetcode/bolt}/more-than-six-months.csv (100%) rename {bolt => leetcode/bolt}/six-months.csv (100%) rename {bookingcom => leetcode/bookingcom}/all.csv (100%) rename {bookingcom => leetcode/bookingcom}/more-than-six-months.csv (100%) rename {bookingcom => leetcode/bookingcom}/six-months.csv (100%) rename {bosch => leetcode/bosch}/all.csv (100%) rename {bosch => leetcode/bosch}/more-than-six-months.csv (100%) rename {box => leetcode/box}/all.csv (100%) rename {box => leetcode/box}/more-than-six-months.csv (100%) rename {box => leetcode/box}/six-months.csv (100%) rename {box => leetcode/box}/three-months.csv (100%) rename {bp => leetcode/bp}/all.csv (100%) rename {bp => leetcode/bp}/more-than-six-months.csv (100%) rename {braze => leetcode/braze}/all.csv (100%) rename {braze => leetcode/braze}/more-than-six-months.csv (100%) rename {brex => leetcode/brex}/all.csv (100%) rename {brex => leetcode/brex}/more-than-six-months.csv (100%) rename {bridgewater-associates => leetcode/bridgewater-associates}/all.csv (100%) rename {bridgewater-associates => leetcode/bridgewater-associates}/more-than-six-months.csv (100%) rename {brillio => leetcode/brillio}/all.csv (100%) rename {broadcom => leetcode/broadcom}/all.csv (100%) rename {broadcom => leetcode/broadcom}/more-than-six-months.csv (100%) rename {browserstack => leetcode/browserstack}/all.csv (100%) rename {bt-group => leetcode/bt-group}/all.csv (100%) rename {bt-group => leetcode/bt-group}/more-than-six-months.csv (100%) rename {buyhatke => leetcode/buyhatke}/all.csv (100%) rename {buyhatke => leetcode/buyhatke}/more-than-six-months.csv (100%) rename {bytedance => leetcode/bytedance}/all.csv (100%) rename {bytedance => leetcode/bytedance}/more-than-six-months.csv (100%) rename {bytedance => leetcode/bytedance}/six-months.csv (100%) rename {bytedance => leetcode/bytedance}/three-months.csv (100%) rename {c3-ai => leetcode/c3-ai}/all.csv (100%) rename {c3-ai => leetcode/c3-ai}/six-months.csv (100%) rename {c3-ai => leetcode/c3-ai}/three-months.csv (100%) rename {caastle => leetcode/caastle}/all.csv (100%) rename {caastle => leetcode/caastle}/more-than-six-months.csv (100%) rename {cadence => leetcode/cadence}/all.csv (100%) rename {cadence => leetcode/cadence}/more-than-six-months.csv (100%) rename {cadence => leetcode/cadence}/six-months.csv (100%) rename {canonical => leetcode/canonical}/all.csv (100%) rename {canonical => leetcode/canonical}/more-than-six-months.csv (100%) rename {canonical => leetcode/canonical}/six-months.csv (100%) rename {canva => leetcode/canva}/all.csv (100%) rename {canva => leetcode/canva}/more-than-six-months.csv (100%) rename {canva => leetcode/canva}/six-months.csv (100%) rename {capgemini => leetcode/capgemini}/all.csv (100%) rename {capgemini => leetcode/capgemini}/more-than-six-months.csv (100%) rename {capgemini => leetcode/capgemini}/six-months.csv (100%) rename {capgemini => leetcode/capgemini}/three-months.csv (100%) rename {capital-one => leetcode/capital-one}/all.csv (100%) rename {capital-one => leetcode/capital-one}/more-than-six-months.csv (100%) rename {capital-one => leetcode/capital-one}/six-months.csv (100%) rename {capital-one => leetcode/capital-one}/thirty-days.csv (100%) rename {capital-one => leetcode/capital-one}/three-months.csv (100%) rename {careem => leetcode/careem}/all.csv (100%) rename {careem => leetcode/careem}/more-than-six-months.csv (100%) rename {careem => leetcode/careem}/six-months.csv (100%) rename {careem => leetcode/careem}/thirty-days.csv (100%) rename {careem => leetcode/careem}/three-months.csv (100%) rename {cars24 => leetcode/cars24}/all.csv (100%) rename {cars24 => leetcode/cars24}/more-than-six-months.csv (100%) rename {carwale => leetcode/carwale}/all.csv (100%) rename {carwale => leetcode/carwale}/more-than-six-months.csv (100%) rename {cashfree => leetcode/cashfree}/all.csv (100%) rename {cashfree => leetcode/cashfree}/more-than-six-months.csv (100%) rename {caterpillar => leetcode/caterpillar}/all.csv (100%) rename {cedcoss => leetcode/cedcoss}/all.csv (100%) rename {cedcoss => leetcode/cedcoss}/more-than-six-months.csv (100%) rename {celigo => leetcode/celigo}/all.csv (100%) rename {celigo => leetcode/celigo}/more-than-six-months.csv (100%) rename {chalo => leetcode/chalo}/all.csv (100%) rename {chalo => leetcode/chalo}/more-than-six-months.csv (100%) rename {chargebee => leetcode/chargebee}/all.csv (100%) rename {chargebee => leetcode/chargebee}/six-months.csv (100%) rename {chewy => leetcode/chewy}/all.csv (100%) rename {chewy => leetcode/chewy}/more-than-six-months.csv (100%) rename {chime => leetcode/chime}/all.csv (100%) rename {chime => leetcode/chime}/more-than-six-months.csv (100%) rename {chronus => leetcode/chronus}/all.csv (100%) rename {chronus => leetcode/chronus}/more-than-six-months.csv (100%) rename {chubb => leetcode/chubb}/all.csv (100%) rename {chubb => leetcode/chubb}/more-than-six-months.csv (100%) rename {ciena => leetcode/ciena}/all.csv (100%) rename {ciena => leetcode/ciena}/more-than-six-months.csv (100%) rename {circle => leetcode/circle}/all.csv (100%) rename {circle => leetcode/circle}/more-than-six-months.csv (100%) rename {cisco => leetcode/cisco}/all.csv (100%) rename {cisco => leetcode/cisco}/more-than-six-months.csv (100%) rename {cisco => leetcode/cisco}/six-months.csv (100%) rename {cisco => leetcode/cisco}/thirty-days.csv (100%) rename {cisco => leetcode/cisco}/three-months.csv (100%) rename {citadel => leetcode/citadel}/all.csv (100%) rename {citadel => leetcode/citadel}/more-than-six-months.csv (100%) rename {citadel => leetcode/citadel}/six-months.csv (100%) rename {citadel => leetcode/citadel}/thirty-days.csv (100%) rename {citadel => leetcode/citadel}/three-months.csv (100%) rename {citi => leetcode/citi}/all.csv (100%) rename {citi => leetcode/citi}/more-than-six-months.csv (100%) rename {citrix => leetcode/citrix}/all.csv (100%) rename {citrix => leetcode/citrix}/more-than-six-months.csv (100%) rename {clari => leetcode/clari}/all.csv (100%) rename {clari => leetcode/clari}/more-than-six-months.csv (100%) rename {cleartax => leetcode/cleartax}/all.csv (100%) rename {cleartax => leetcode/cleartax}/more-than-six-months.csv (100%) rename {cleartrip => leetcode/cleartrip}/all.csv (100%) rename {cleartrip => leetcode/cleartrip}/more-than-six-months.csv (100%) rename {cleartrip => leetcode/cleartrip}/six-months.csv (100%) rename {cloudera => leetcode/cloudera}/all.csv (100%) rename {cloudera => leetcode/cloudera}/more-than-six-months.csv (100%) rename {cloudflare => leetcode/cloudflare}/all.csv (100%) rename {cloudflare => leetcode/cloudflare}/more-than-six-months.csv (100%) rename {cloudflare => leetcode/cloudflare}/six-months.csv (100%) rename {cloudflare => leetcode/cloudflare}/thirty-days.csv (100%) rename {cloudflare => leetcode/cloudflare}/three-months.csv (100%) rename {clumio => leetcode/clumio}/all.csv (100%) rename {clumio => leetcode/clumio}/more-than-six-months.csv (100%) rename {clutter => leetcode/clutter}/all.csv (100%) rename {clutter => leetcode/clutter}/more-than-six-months.csv (100%) rename {cme-group => leetcode/cme-group}/all.csv (100%) rename {cme-group => leetcode/cme-group}/more-than-six-months.csv (100%) rename {cme-group => leetcode/cme-group}/six-months.csv (100%) rename {cme-group => leetcode/cme-group}/thirty-days.csv (100%) rename {cme-group => leetcode/cme-group}/three-months.csv (100%) rename {cockroach-labs => leetcode/cockroach-labs}/all.csv (100%) rename {cockroach-labs => leetcode/cockroach-labs}/more-than-six-months.csv (100%) rename {cockroach-labs => leetcode/cockroach-labs}/six-months.csv (100%) rename {cockroach-labs => leetcode/cockroach-labs}/thirty-days.csv (100%) rename {cockroach-labs => leetcode/cockroach-labs}/three-months.csv (100%) rename {code-studio => leetcode/code-studio}/all.csv (100%) rename {code-studio => leetcode/code-studio}/more-than-six-months.csv (100%) rename {codingmart => leetcode/codingmart}/all.csv (100%) rename {codingmart => leetcode/codingmart}/more-than-six-months.csv (100%) rename {cognizant => leetcode/cognizant}/all.csv (100%) rename {cognizant => leetcode/cognizant}/more-than-six-months.csv (100%) rename {cognizant => leetcode/cognizant}/six-months.csv (100%) rename {cognizant => leetcode/cognizant}/three-months.csv (100%) rename {cohesity => leetcode/cohesity}/all.csv (100%) rename {cohesity => leetcode/cohesity}/more-than-six-months.csv (100%) rename {cohesity => leetcode/cohesity}/six-months.csv (100%) rename {cohesity => leetcode/cohesity}/thirty-days.csv (100%) rename {cohesity => leetcode/cohesity}/three-months.csv (100%) rename {coinbase => leetcode/coinbase}/all.csv (100%) rename {coinbase => leetcode/coinbase}/more-than-six-months.csv (100%) rename {coinbase => leetcode/coinbase}/six-months.csv (100%) rename {coinbase => leetcode/coinbase}/thirty-days.csv (100%) rename {coinbase => leetcode/coinbase}/three-months.csv (100%) rename {coindcx => leetcode/coindcx}/all.csv (100%) rename {coindcx => leetcode/coindcx}/more-than-six-months.csv (100%) rename {coindcx => leetcode/coindcx}/six-months.csv (100%) rename {comcast => leetcode/comcast}/all.csv (100%) rename {comcast => leetcode/comcast}/more-than-six-months.csv (100%) rename {comcast => leetcode/comcast}/six-months.csv (100%) rename {commvault => leetcode/commvault}/all.csv (100%) rename {commvault => leetcode/commvault}/more-than-six-months.csv (100%) rename {compass => leetcode/compass}/all.csv (100%) rename {compass => leetcode/compass}/more-than-six-months.csv (100%) rename {compass => leetcode/compass}/six-months.csv (100%) rename {confluent => leetcode/confluent}/all.csv (100%) rename {confluent => leetcode/confluent}/more-than-six-months.csv (100%) rename {confluent => leetcode/confluent}/six-months.csv (100%) rename {confluent => leetcode/confluent}/thirty-days.csv (100%) rename {confluent => leetcode/confluent}/three-months.csv (100%) rename {consultadd => leetcode/consultadd}/all.csv (100%) rename {consultadd => leetcode/consultadd}/more-than-six-months.csv (100%) rename {couchbase => leetcode/couchbase}/all.csv (100%) rename {couchbase => leetcode/couchbase}/more-than-six-months.csv (100%) rename {couchbase => leetcode/couchbase}/six-months.csv (100%) rename {coupang => leetcode/coupang}/all.csv (100%) rename {coupang => leetcode/coupang}/more-than-six-months.csv (100%) rename {coupang => leetcode/coupang}/six-months.csv (100%) rename {coupang => leetcode/coupang}/three-months.csv (100%) rename {coursera => leetcode/coursera}/all.csv (100%) rename {coursera => leetcode/coursera}/more-than-six-months.csv (100%) rename {coursera => leetcode/coursera}/six-months.csv (100%) rename {coursera => leetcode/coursera}/three-months.csv (100%) rename {coveo => leetcode/coveo}/all.csv (100%) rename {coveo => leetcode/coveo}/more-than-six-months.csv (100%) rename {cred => leetcode/cred}/all.csv (100%) rename {cred => leetcode/cred}/six-months.csv (100%) rename {cred => leetcode/cred}/thirty-days.csv (100%) rename {cred => leetcode/cred}/three-months.csv (100%) rename {credit-karma => leetcode/credit-karma}/all.csv (100%) rename {credit-karma => leetcode/credit-karma}/more-than-six-months.csv (100%) rename {criteo => leetcode/criteo}/all.csv (100%) rename {criteo => leetcode/criteo}/more-than-six-months.csv (100%) rename {criteo => leetcode/criteo}/six-months.csv (100%) rename {criteo => leetcode/criteo}/three-months.csv (100%) rename {crowdstrike => leetcode/crowdstrike}/all.csv (100%) rename {crowdstrike => leetcode/crowdstrike}/more-than-six-months.csv (100%) rename {crowdstrike => leetcode/crowdstrike}/six-months.csv (100%) rename {crowdstrike => leetcode/crowdstrike}/three-months.csv (100%) rename {cruise-automation => leetcode/cruise-automation}/all.csv (100%) rename {cruise-automation => leetcode/cruise-automation}/more-than-six-months.csv (100%) rename {cruise-automation => leetcode/cruise-automation}/six-months.csv (100%) rename {ctc => leetcode/ctc}/all.csv (100%) rename {ctc => leetcode/ctc}/more-than-six-months.csv (100%) rename {curefit => leetcode/curefit}/all.csv (100%) rename {curefit => leetcode/curefit}/more-than-six-months.csv (100%) rename {cvent => leetcode/cvent}/all.csv (100%) rename {cvent => leetcode/cvent}/more-than-six-months.csv (100%) rename {cyntexa => leetcode/cyntexa}/all.csv (100%) rename {cyntexa => leetcode/cyntexa}/more-than-six-months.csv (100%) rename {cyware => leetcode/cyware}/all.csv (100%) rename {cyware => leetcode/cyware}/more-than-six-months.csv (100%) rename {dailyhunt => leetcode/dailyhunt}/all.csv (100%) rename {dailyhunt => leetcode/dailyhunt}/more-than-six-months.csv (100%) rename {darwinbox => leetcode/darwinbox}/all.csv (100%) rename {darwinbox => leetcode/darwinbox}/more-than-six-months.csv (100%) rename {darwinbox => leetcode/darwinbox}/six-months.csv (100%) rename {darwinbox => leetcode/darwinbox}/thirty-days.csv (100%) rename {darwinbox => leetcode/darwinbox}/three-months.csv (100%) rename {dassault-sysetmes => leetcode/dassault-sysetmes}/all.csv (100%) rename {dassault-sysetmes => leetcode/dassault-sysetmes}/more-than-six-months.csv (100%) rename {databricks => leetcode/databricks}/all.csv (100%) rename {databricks => leetcode/databricks}/more-than-six-months.csv (100%) rename {databricks => leetcode/databricks}/six-months.csv (100%) rename {databricks => leetcode/databricks}/thirty-days.csv (100%) rename {databricks => leetcode/databricks}/three-months.csv (100%) rename {datadog => leetcode/datadog}/all.csv (100%) rename {datadog => leetcode/datadog}/more-than-six-months.csv (100%) rename {datadog => leetcode/datadog}/six-months.csv (100%) rename {datadog => leetcode/datadog}/three-months.csv (100%) rename {dataminr => leetcode/dataminr}/all.csv (100%) rename {dataminr => leetcode/dataminr}/more-than-six-months.csv (100%) rename {de-shaw => leetcode/de-shaw}/all.csv (100%) rename {de-shaw => leetcode/de-shaw}/more-than-six-months.csv (100%) rename {de-shaw => leetcode/de-shaw}/six-months.csv (100%) rename {de-shaw => leetcode/de-shaw}/thirty-days.csv (100%) rename {de-shaw => leetcode/de-shaw}/three-months.csv (100%) rename {deepmind => leetcode/deepmind}/all.csv (100%) rename {deepmind => leetcode/deepmind}/more-than-six-months.csv (100%) rename {delhivery => leetcode/delhivery}/all.csv (100%) rename {delhivery => leetcode/delhivery}/more-than-six-months.csv (100%) rename {deliveroo => leetcode/deliveroo}/all.csv (100%) rename {deliveroo => leetcode/deliveroo}/more-than-six-months.csv (100%) rename {dell => leetcode/dell}/all.csv (100%) rename {dell => leetcode/dell}/more-than-six-months.csv (100%) rename {dell => leetcode/dell}/six-months.csv (100%) rename {dell => leetcode/dell}/three-months.csv (100%) rename {deloitte => leetcode/deloitte}/all.csv (100%) rename {deloitte => leetcode/deloitte}/more-than-six-months.csv (100%) rename {deloitte => leetcode/deloitte}/six-months.csv (100%) rename {deloitte => leetcode/deloitte}/thirty-days.csv (100%) rename {deloitte => leetcode/deloitte}/three-months.csv (100%) rename {deltax => leetcode/deltax}/all.csv (100%) rename {deltax => leetcode/deltax}/more-than-six-months.csv (100%) rename {deutsche-bank => leetcode/deutsche-bank}/all.csv (100%) rename {deutsche-bank => leetcode/deutsche-bank}/more-than-six-months.csv (100%) rename {devrev => leetcode/devrev}/all.csv (100%) rename {devrev => leetcode/devrev}/more-than-six-months.csv (100%) rename {devsinc => leetcode/devsinc}/all.csv (100%) rename {devsinc => leetcode/devsinc}/more-than-six-months.csv (100%) rename {devtron => leetcode/devtron}/all.csv (100%) rename {devtron => leetcode/devtron}/more-than-six-months.csv (100%) rename {dialpad => leetcode/dialpad}/all.csv (100%) rename {dialpad => leetcode/dialpad}/six-months.csv (100%) rename {didi => leetcode/didi}/all.csv (100%) rename {didi => leetcode/didi}/more-than-six-months.csv (100%) rename {directi => leetcode/directi}/all.csv (100%) rename {directi => leetcode/directi}/more-than-six-months.csv (100%) rename {discord => leetcode/discord}/all.csv (100%) rename {discord => leetcode/discord}/more-than-six-months.csv (100%) rename {disney => leetcode/disney}/all.csv (100%) rename {disney => leetcode/disney}/more-than-six-months.csv (100%) rename {disney => leetcode/disney}/six-months.csv (100%) rename {dji => leetcode/dji}/all.csv (100%) rename {docusign => leetcode/docusign}/all.csv (100%) rename {docusign => leetcode/docusign}/more-than-six-months.csv (100%) rename {docusign => leetcode/docusign}/six-months.csv (100%) rename {docusign => leetcode/docusign}/thirty-days.csv (100%) rename {docusign => leetcode/docusign}/three-months.csv (100%) rename {doordash => leetcode/doordash}/all.csv (100%) rename {doordash => leetcode/doordash}/more-than-six-months.csv (100%) rename {doordash => leetcode/doordash}/six-months.csv (100%) rename {doordash => leetcode/doordash}/thirty-days.csv (100%) rename {doordash => leetcode/doordash}/three-months.csv (100%) rename {dp-world => leetcode/dp-world}/all.csv (100%) rename {dp-world => leetcode/dp-world}/more-than-six-months.csv (100%) rename {dp-world => leetcode/dp-world}/six-months.csv (100%) rename {drawbridge => leetcode/drawbridge}/all.csv (100%) rename {drawbridge => leetcode/drawbridge}/more-than-six-months.csv (100%) rename {dream11 => leetcode/dream11}/all.csv (100%) rename {dream11 => leetcode/dream11}/more-than-six-months.csv (100%) rename {dream11 => leetcode/dream11}/six-months.csv (100%) rename {dream11 => leetcode/dream11}/three-months.csv (100%) rename {dropbox => leetcode/dropbox}/all.csv (100%) rename {dropbox => leetcode/dropbox}/more-than-six-months.csv (100%) rename {dropbox => leetcode/dropbox}/six-months.csv (100%) rename {dropbox => leetcode/dropbox}/three-months.csv (100%) rename {druva => leetcode/druva}/all.csv (100%) rename {druva => leetcode/druva}/more-than-six-months.csv (100%) rename {drw => leetcode/drw}/all.csv (100%) rename {drw => leetcode/drw}/more-than-six-months.csv (100%) rename {drw => leetcode/drw}/six-months.csv (100%) rename {dtcc => leetcode/dtcc}/all.csv (100%) rename {dtcc => leetcode/dtcc}/more-than-six-months.csv (100%) rename {dunzo => leetcode/dunzo}/all.csv (100%) rename {dunzo => leetcode/dunzo}/more-than-six-months.csv (100%) rename {duolingo => leetcode/duolingo}/all.csv (100%) rename {duolingo => leetcode/duolingo}/more-than-six-months.csv (100%) rename {duolingo => leetcode/duolingo}/six-months.csv (100%) rename {dxc => leetcode/dxc}/all.csv (100%) rename {dxc => leetcode/dxc}/more-than-six-months.csv (100%) rename {earnin => leetcode/earnin}/all.csv (100%) rename {earnin => leetcode/earnin}/more-than-six-months.csv (100%) rename {ebay => leetcode/ebay}/all.csv (100%) rename {ebay => leetcode/ebay}/more-than-six-months.csv (100%) rename {ebay => leetcode/ebay}/six-months.csv (100%) rename {ebay => leetcode/ebay}/thirty-days.csv (100%) rename {ebay => leetcode/ebay}/three-months.csv (100%) rename {edelweiss => leetcode/edelweiss}/all.csv (100%) rename {edelweiss => leetcode/edelweiss}/more-than-six-months.csv (100%) rename {elbit => leetcode/elbit}/all.csv (100%) rename {elbit => leetcode/elbit}/more-than-six-months.csv (100%) rename {electronic-arts => leetcode/electronic-arts}/all.csv (100%) rename {electronic-arts => leetcode/electronic-arts}/more-than-six-months.csv (100%) rename {elitmus => leetcode/elitmus}/all.csv (100%) rename {elitmus => leetcode/elitmus}/more-than-six-months.csv (100%) rename {envoy => leetcode/envoy}/all.csv (100%) rename {envoy => leetcode/envoy}/more-than-six-months.csv (100%) rename {epam-systems => leetcode/epam-systems}/all.csv (100%) rename {epam-systems => leetcode/epam-systems}/more-than-six-months.csv (100%) rename {epam-systems => leetcode/epam-systems}/six-months.csv (100%) rename {epam-systems => leetcode/epam-systems}/three-months.csv (100%) rename {epic-games => leetcode/epic-games}/all.csv (100%) rename {epic-games => leetcode/epic-games}/more-than-six-months.csv (100%) rename {epic-systems => leetcode/epic-systems}/all.csv (100%) rename {epic-systems => leetcode/epic-systems}/more-than-six-months.csv (100%) rename {epic-systems => leetcode/epic-systems}/six-months.csv (100%) rename {epic-systems => leetcode/epic-systems}/three-months.csv (100%) rename {epifi => leetcode/epifi}/all.csv (100%) rename {ericsson => leetcode/ericsson}/all.csv (100%) rename {ericsson => leetcode/ericsson}/more-than-six-months.csv (100%) rename {etsy => leetcode/etsy}/all.csv (100%) rename {etsy => leetcode/etsy}/more-than-six-months.csv (100%) rename {etsy => leetcode/etsy}/six-months.csv (100%) rename {expedia => leetcode/expedia}/all.csv (100%) rename {expedia => leetcode/expedia}/more-than-six-months.csv (100%) rename {expedia => leetcode/expedia}/six-months.csv (100%) rename {ey => leetcode/ey}/all.csv (100%) rename {ey => leetcode/ey}/more-than-six-months.csv (100%) rename {f5-networks => leetcode/f5-networks}/all.csv (100%) rename {f5-networks => leetcode/f5-networks}/more-than-six-months.csv (100%) rename {facebook => leetcode/facebook}/all.csv (100%) rename {facebook => leetcode/facebook}/more-than-six-months.csv (100%) rename {facebook => leetcode/facebook}/six-months.csv (100%) rename {facebook => leetcode/facebook}/thirty-days.csv (100%) rename {facebook => leetcode/facebook}/three-months.csv (100%) rename {factset => leetcode/factset}/all.csv (100%) rename {factset => leetcode/factset}/more-than-six-months.csv (100%) rename {factwise => leetcode/factwise}/all.csv (100%) rename {faire => leetcode/faire}/all.csv (100%) rename {faire => leetcode/faire}/more-than-six-months.csv (100%) rename {faire => leetcode/faire}/six-months.csv (100%) rename {faire => leetcode/faire}/thirty-days.csv (100%) rename {faire => leetcode/faire}/three-months.csv (100%) rename {fallible => leetcode/fallible}/all.csv (100%) rename {fallible => leetcode/fallible}/more-than-six-months.csv (100%) rename {fastenal => leetcode/fastenal}/all.csv (100%) rename {fastenal => leetcode/fastenal}/more-than-six-months.csv (100%) rename {fico => leetcode/fico}/all.csv (100%) rename {fico => leetcode/fico}/more-than-six-months.csv (100%) rename {fidelity => leetcode/fidelity}/all.csv (100%) rename {fidelity => leetcode/fidelity}/more-than-six-months.csv (100%) rename {fidessa => leetcode/fidessa}/all.csv (100%) rename {fiverr => leetcode/fiverr}/all.csv (100%) rename {fiverr => leetcode/fiverr}/more-than-six-months.csv (100%) rename {flatiron-health => leetcode/flatiron-health}/all.csv (100%) rename {flatiron-health => leetcode/flatiron-health}/more-than-six-months.csv (100%) rename {flatiron-health => leetcode/flatiron-health}/six-months.csv (100%) rename {flatiron-health => leetcode/flatiron-health}/thirty-days.csv (100%) rename {flatiron-health => leetcode/flatiron-health}/three-months.csv (100%) rename {fleetx => leetcode/fleetx}/all.csv (100%) rename {fleetx => leetcode/fleetx}/more-than-six-months.csv (100%) rename {flexera => leetcode/flexera}/all.csv (100%) rename {flexera => leetcode/flexera}/more-than-six-months.csv (100%) rename {flexport => leetcode/flexport}/all.csv (100%) rename {flexport => leetcode/flexport}/more-than-six-months.csv (100%) rename {flexport => leetcode/flexport}/six-months.csv (100%) rename {flexport => leetcode/flexport}/three-months.csv (100%) rename {flipkart => leetcode/flipkart}/all.csv (100%) rename {flipkart => leetcode/flipkart}/more-than-six-months.csv (100%) rename {flipkart => leetcode/flipkart}/six-months.csv (100%) rename {flipkart => leetcode/flipkart}/three-months.csv (100%) rename {ford => leetcode/ford}/all.csv (100%) rename {ford => leetcode/ford}/more-than-six-months.csv (100%) rename {fortinet => leetcode/fortinet}/all.csv (100%) rename {fortinet => leetcode/fortinet}/more-than-six-months.csv (100%) rename {fortinet => leetcode/fortinet}/six-months.csv (100%) rename {fortinet => leetcode/fortinet}/three-months.csv (100%) rename {forusall => leetcode/forusall}/all.csv (100%) rename {forusall => leetcode/forusall}/more-than-six-months.csv (100%) rename {fourkites => leetcode/fourkites}/all.csv (100%) rename {fourkites => leetcode/fourkites}/more-than-six-months.csv (100%) rename {fpt => leetcode/fpt}/all.csv (100%) rename {fpt => leetcode/fpt}/more-than-six-months.csv (100%) rename {fractal-analytics => leetcode/fractal-analytics}/all.csv (100%) rename {fractal-analytics => leetcode/fractal-analytics}/more-than-six-months.csv (100%) rename {fractal-analytics => leetcode/fractal-analytics}/six-months.csv (100%) rename {fractal-analytics => leetcode/fractal-analytics}/thirty-days.csv (100%) rename {fractal-analytics => leetcode/fractal-analytics}/three-months.csv (100%) rename {freecharge => leetcode/freecharge}/all.csv (100%) rename {freecharge => leetcode/freecharge}/more-than-six-months.csv (100%) rename {freecharge => leetcode/freecharge}/six-months.csv (100%) rename {freshworks => leetcode/freshworks}/all.csv (100%) rename {freshworks => leetcode/freshworks}/more-than-six-months.csv (100%) rename {fynd => leetcode/fynd}/all.csv (100%) rename {gainsight => leetcode/gainsight}/all.csv (100%) rename {gainsight => leetcode/gainsight}/more-than-six-months.csv (100%) rename {gameskraft => leetcode/gameskraft}/all.csv (100%) rename {gameskraft => leetcode/gameskraft}/more-than-six-months.csv (100%) rename {garena => leetcode/garena}/all.csv (100%) rename {garena => leetcode/garena}/more-than-six-months.csv (100%) rename {garmin => leetcode/garmin}/all.csv (100%) rename {garmin => leetcode/garmin}/more-than-six-months.csv (100%) rename {garmin => leetcode/garmin}/six-months.csv (100%) rename {garmin => leetcode/garmin}/three-months.csv (100%) rename {gartner => leetcode/gartner}/all.csv (100%) rename {gartner => leetcode/gartner}/more-than-six-months.csv (100%) rename {gartner => leetcode/gartner}/six-months.csv (100%) rename {ge-digital => leetcode/ge-digital}/all.csv (100%) rename {ge-digital => leetcode/ge-digital}/more-than-six-months.csv (100%) rename {ge-healthcare => leetcode/ge-healthcare}/all.csv (100%) rename {ge-healthcare => leetcode/ge-healthcare}/more-than-six-months.csv (100%) rename {geico => leetcode/geico}/all.csv (100%) rename {geico => leetcode/geico}/more-than-six-months.csv (100%) rename {geico => leetcode/geico}/six-months.csv (100%) rename {geico => leetcode/geico}/three-months.csv (100%) rename {general-electric => leetcode/general-electric}/all.csv (100%) rename {general-electric => leetcode/general-electric}/more-than-six-months.csv (100%) rename {general-motors => leetcode/general-motors}/all.csv (100%) rename {general-motors => leetcode/general-motors}/more-than-six-months.csv (100%) rename {general-motors => leetcode/general-motors}/six-months.csv (100%) rename {general-motors => leetcode/general-motors}/thirty-days.csv (100%) rename {general-motors => leetcode/general-motors}/three-months.csv (100%) rename {genpact => leetcode/genpact}/all.csv (100%) rename {genpact => leetcode/genpact}/more-than-six-months.csv (100%) rename {gilt-groupe => leetcode/gilt-groupe}/all.csv (100%) rename {gilt-groupe => leetcode/gilt-groupe}/more-than-six-months.csv (100%) rename {github => leetcode/github}/all.csv (100%) rename {github => leetcode/github}/six-months.csv (100%) rename {glassdoor => leetcode/glassdoor}/all.csv (100%) rename {glassdoor => leetcode/glassdoor}/more-than-six-months.csv (100%) rename {globallogic => leetcode/globallogic}/all.csv (100%) rename {globallogic => leetcode/globallogic}/more-than-six-months.csv (100%) rename {globallogic => leetcode/globallogic}/six-months.csv (100%) rename {globant => leetcode/globant}/all.csv (100%) rename {globant => leetcode/globant}/more-than-six-months.csv (100%) rename {glovo => leetcode/glovo}/all.csv (100%) rename {glovo => leetcode/glovo}/six-months.csv (100%) rename {godaddy => leetcode/godaddy}/all.csv (100%) rename {godaddy => leetcode/godaddy}/more-than-six-months.csv (100%) rename {gojek => leetcode/gojek}/all.csv (100%) rename {gojek => leetcode/gojek}/more-than-six-months.csv (100%) rename {goldman-sachs => leetcode/goldman-sachs}/all.csv (100%) rename {goldman-sachs => leetcode/goldman-sachs}/more-than-six-months.csv (100%) rename {goldman-sachs => leetcode/goldman-sachs}/six-months.csv (100%) rename {goldman-sachs => leetcode/goldman-sachs}/thirty-days.csv (100%) rename {goldman-sachs => leetcode/goldman-sachs}/three-months.csv (100%) rename {google => leetcode/google}/all.csv (100%) rename {google => leetcode/google}/more-than-six-months.csv (100%) rename {google => leetcode/google}/six-months.csv (100%) rename {google => leetcode/google}/thirty-days.csv (100%) rename {google => leetcode/google}/three-months.csv (100%) rename {gopuff => leetcode/gopuff}/all.csv (100%) rename {gopuff => leetcode/gopuff}/six-months.csv (100%) rename {grab => leetcode/grab}/all.csv (100%) rename {grab => leetcode/grab}/more-than-six-months.csv (100%) rename {grab => leetcode/grab}/six-months.csv (100%) rename {grab => leetcode/grab}/thirty-days.csv (100%) rename {grab => leetcode/grab}/three-months.csv (100%) rename {grammarly => leetcode/grammarly}/all.csv (100%) rename {grammarly => leetcode/grammarly}/more-than-six-months.csv (100%) rename {grammarly => leetcode/grammarly}/six-months.csv (100%) rename {grammarly => leetcode/grammarly}/thirty-days.csv (100%) rename {grammarly => leetcode/grammarly}/three-months.csv (100%) rename {graviton => leetcode/graviton}/all.csv (100%) rename {graviton => leetcode/graviton}/more-than-six-months.csv (100%) rename {grid-dynamics => leetcode/grid-dynamics}/all.csv (100%) rename {grid-dynamics => leetcode/grid-dynamics}/more-than-six-months.csv (100%) rename {groupon => leetcode/groupon}/all.csv (100%) rename {groupon => leetcode/groupon}/more-than-six-months.csv (100%) rename {groww => leetcode/groww}/all.csv (100%) rename {groww => leetcode/groww}/more-than-six-months.csv (100%) rename {grubhub => leetcode/grubhub}/all.csv (100%) rename {grubhub => leetcode/grubhub}/more-than-six-months.csv (100%) rename {gsa-capital => leetcode/gsa-capital}/all.csv (100%) rename {gsa-capital => leetcode/gsa-capital}/more-than-six-months.csv (100%) rename {gsn-games => leetcode/gsn-games}/all.csv (100%) rename {gsn-games => leetcode/gsn-games}/more-than-six-months.csv (100%) rename {guidewire => leetcode/guidewire}/all.csv (100%) rename {guidewire => leetcode/guidewire}/more-than-six-months.csv (100%) rename {guidewire => leetcode/guidewire}/six-months.csv (100%) rename {guidewire => leetcode/guidewire}/thirty-days.csv (100%) rename {guidewire => leetcode/guidewire}/three-months.csv (100%) rename {gusto => leetcode/gusto}/all.csv (100%) rename {gusto => leetcode/gusto}/more-than-six-months.csv (100%) rename {gusto => leetcode/gusto}/six-months.csv (100%) rename {gusto => leetcode/gusto}/three-months.csv (100%) rename {harman => leetcode/harman}/all.csv (100%) rename {harman => leetcode/harman}/more-than-six-months.csv (100%) rename {harness => leetcode/harness}/all.csv (100%) rename {harness => leetcode/harness}/more-than-six-months.csv (100%) rename {hashedin => leetcode/hashedin}/all.csv (100%) rename {hashedin => leetcode/hashedin}/more-than-six-months.csv (100%) rename {hashedin => leetcode/hashedin}/six-months.csv (100%) rename {hashedin => leetcode/hashedin}/three-months.csv (100%) rename {hbo => leetcode/hbo}/all.csv (100%) rename {hbo => leetcode/hbo}/more-than-six-months.csv (100%) rename {hcl => leetcode/hcl}/all.csv (100%) rename {hcl => leetcode/hcl}/more-than-six-months.csv (100%) rename {hcl => leetcode/hcl}/six-months.csv (100%) rename {heb => leetcode/heb}/all.csv (100%) rename {heb => leetcode/heb}/more-than-six-months.csv (100%) rename {helix => leetcode/helix}/all.csv (100%) rename {helix => leetcode/helix}/more-than-six-months.csv (100%) rename {hertz => leetcode/hertz}/all.csv (100%) rename {hertz => leetcode/hertz}/more-than-six-months.csv (100%) rename {highspot => leetcode/highspot}/all.csv (100%) rename {highspot => leetcode/highspot}/more-than-six-months.csv (100%) rename {hilabs => leetcode/hilabs}/all.csv (100%) rename {hilabs => leetcode/hilabs}/more-than-six-months.csv (100%) rename {hive => leetcode/hive}/all.csv (100%) rename {hive => leetcode/hive}/more-than-six-months.csv (100%) rename {hiver => leetcode/hiver}/all.csv (100%) rename {hiver => leetcode/hiver}/more-than-six-months.csv (100%) rename {honey => leetcode/honey}/all.csv (100%) rename {honeywell => leetcode/honeywell}/all.csv (100%) rename {honeywell => leetcode/honeywell}/more-than-six-months.csv (100%) rename {hopper => leetcode/hopper}/all.csv (100%) rename {hopper => leetcode/hopper}/six-months.csv (100%) rename {hopper => leetcode/hopper}/three-months.csv (100%) rename {hotstar => leetcode/hotstar}/all.csv (100%) rename {hotstar => leetcode/hotstar}/more-than-six-months.csv (100%) rename {houzz => leetcode/houzz}/all.csv (100%) rename {houzz => leetcode/houzz}/more-than-six-months.csv (100%) rename {hp => leetcode/hp}/all.csv (100%) rename {hp => leetcode/hp}/more-than-six-months.csv (100%) rename {hpe => leetcode/hpe}/all.csv (100%) rename {hpe => leetcode/hpe}/more-than-six-months.csv (100%) rename {hrt => leetcode/hrt}/all.csv (100%) rename {hrt => leetcode/hrt}/more-than-six-months.csv (100%) rename {hsbc => leetcode/hsbc}/all.csv (100%) rename {hsbc => leetcode/hsbc}/more-than-six-months.csv (100%) rename {hsbc => leetcode/hsbc}/six-months.csv (100%) rename {hsbc => leetcode/hsbc}/three-months.csv (100%) rename {huawei => leetcode/huawei}/all.csv (100%) rename {huawei => leetcode/huawei}/more-than-six-months.csv (100%) rename {hubspot => leetcode/hubspot}/all.csv (100%) rename {hubspot => leetcode/hubspot}/more-than-six-months.csv (100%) rename {hubspot => leetcode/hubspot}/six-months.csv (100%) rename {hubspot => leetcode/hubspot}/three-months.csv (100%) rename {hulu => leetcode/hulu}/all.csv (100%) rename {hulu => leetcode/hulu}/more-than-six-months.csv (100%) rename {hyperverge => leetcode/hyperverge}/all.csv (100%) rename {hyperverge => leetcode/hyperverge}/more-than-six-months.csv (100%) rename {ibm => leetcode/ibm}/all.csv (100%) rename {ibm => leetcode/ibm}/more-than-six-months.csv (100%) rename {ibm => leetcode/ibm}/six-months.csv (100%) rename {ibm => leetcode/ibm}/thirty-days.csv (100%) rename {ibm => leetcode/ibm}/three-months.csv (100%) rename {iit-bombay => leetcode/iit-bombay}/all.csv (100%) rename {iit-bombay => leetcode/iit-bombay}/more-than-six-months.csv (100%) rename {imc => leetcode/imc}/all.csv (100%) rename {imc => leetcode/imc}/more-than-six-months.csv (100%) rename {impact-analytics => leetcode/impact-analytics}/all.csv (100%) rename {impact-analytics => leetcode/impact-analytics}/more-than-six-months.csv (100%) rename {increff => leetcode/increff}/all.csv (100%) rename {increff => leetcode/increff}/more-than-six-months.csv (100%) rename {indeed => leetcode/indeed}/all.csv (100%) rename {indeed => leetcode/indeed}/more-than-six-months.csv (100%) rename {indmoney => leetcode/indmoney}/all.csv (100%) rename {indmoney => leetcode/indmoney}/more-than-six-months.csv (100%) rename {info-edge => leetcode/info-edge}/all.csv (100%) rename {info-edge => leetcode/info-edge}/more-than-six-months.csv (100%) rename {info-edge => leetcode/info-edge}/six-months.csv (100%) rename {informatica => leetcode/informatica}/all.csv (100%) rename {informatica => leetcode/informatica}/more-than-six-months.csv (100%) rename {infosys => leetcode/infosys}/all.csv (100%) rename {infosys => leetcode/infosys}/more-than-six-months.csv (100%) rename {infosys => leetcode/infosys}/six-months.csv (100%) rename {infosys => leetcode/infosys}/thirty-days.csv (100%) rename {infosys => leetcode/infosys}/three-months.csv (100%) rename {inmobi => leetcode/inmobi}/all.csv (100%) rename {inmobi => leetcode/inmobi}/more-than-six-months.csv (100%) rename {innovaccer => leetcode/innovaccer}/all.csv (100%) rename {innovaccer => leetcode/innovaccer}/more-than-six-months.csv (100%) rename {innovaccer => leetcode/innovaccer}/six-months.csv (100%) rename {instabase => leetcode/instabase}/all.csv (100%) rename {instabase => leetcode/instabase}/more-than-six-months.csv (100%) rename {instacart => leetcode/instacart}/all.csv (100%) rename {instacart => leetcode/instacart}/more-than-six-months.csv (100%) rename {instacart => leetcode/instacart}/six-months.csv (100%) rename {instacart => leetcode/instacart}/thirty-days.csv (100%) rename {instacart => leetcode/instacart}/three-months.csv (100%) rename {intel => leetcode/intel}/all.csv (100%) rename {intel => leetcode/intel}/more-than-six-months.csv (100%) rename {intel => leetcode/intel}/six-months.csv (100%) rename {interactive-brokers => leetcode/interactive-brokers}/all.csv (100%) rename {interactive-brokers => leetcode/interactive-brokers}/more-than-six-months.csv (100%) rename {intercom => leetcode/intercom}/all.csv (100%) rename {intercom => leetcode/intercom}/more-than-six-months.csv (100%) rename {intercom => leetcode/intercom}/six-months.csv (100%) rename {intuit => leetcode/intuit}/all.csv (100%) rename {intuit => leetcode/intuit}/more-than-six-months.csv (100%) rename {intuit => leetcode/intuit}/six-months.csv (100%) rename {intuit => leetcode/intuit}/thirty-days.csv (100%) rename {intuit => leetcode/intuit}/three-months.csv (100%) rename {ion => leetcode/ion}/all.csv (100%) rename {ion => leetcode/ion}/more-than-six-months.csv (100%) rename {ivp => leetcode/ivp}/all.csv (100%) rename {ivp => leetcode/ivp}/more-than-six-months.csv (100%) rename {ixigo => leetcode/ixigo}/all.csv (100%) rename {ixigo => leetcode/ixigo}/more-than-six-months.csv (100%) rename {ixl => leetcode/ixl}/all.csv (100%) rename {ixl => leetcode/ixl}/more-than-six-months.csv (100%) rename {ixl => leetcode/ixl}/six-months.csv (100%) rename {ixl => leetcode/ixl}/three-months.csv (100%) rename {jane-street => leetcode/jane-street}/all.csv (100%) rename {jane-street => leetcode/jane-street}/more-than-six-months.csv (100%) rename {jd => leetcode/jd}/all.csv (100%) rename {jd => leetcode/jd}/six-months.csv (100%) rename {jeavio => leetcode/jeavio}/all.csv (100%) rename {jeavio => leetcode/jeavio}/more-than-six-months.csv (100%) rename {jetbrains => leetcode/jetbrains}/all.csv (100%) rename {jetbrains => leetcode/jetbrains}/more-than-six-months.csv (100%) rename {jingchi => leetcode/jingchi}/all.csv (100%) rename {jingchi => leetcode/jingchi}/more-than-six-months.csv (100%) rename {jio => leetcode/jio}/all.csv (100%) rename {jio => leetcode/jio}/more-than-six-months.csv (100%) rename {josh-technology => leetcode/josh-technology}/all.csv (100%) rename {josh-technology => leetcode/josh-technology}/more-than-six-months.csv (100%) rename {josh-technology => leetcode/josh-technology}/six-months.csv (100%) rename {josh-technology => leetcode/josh-technology}/thirty-days.csv (100%) rename {josh-technology => leetcode/josh-technology}/three-months.csv (100%) rename {jpmorgan => leetcode/jpmorgan}/all.csv (100%) rename {jpmorgan => leetcode/jpmorgan}/more-than-six-months.csv (100%) rename {jpmorgan => leetcode/jpmorgan}/six-months.csv (100%) rename {jpmorgan => leetcode/jpmorgan}/thirty-days.csv (100%) rename {jpmorgan => leetcode/jpmorgan}/three-months.csv (100%) rename {jtg => leetcode/jtg}/all.csv (100%) rename {jtg => leetcode/jtg}/more-than-six-months.csv (100%) rename {jump-trading => leetcode/jump-trading}/all.csv (100%) rename {jump-trading => leetcode/jump-trading}/more-than-six-months.csv (100%) rename {jump-trading => leetcode/jump-trading}/six-months.csv (100%) rename {junglee-games => leetcode/junglee-games}/all.csv (100%) rename {junglee-games => leetcode/junglee-games}/more-than-six-months.csv (100%) rename {juniper => leetcode/juniper}/all.csv (100%) rename {juniper => leetcode/juniper}/more-than-six-months.csv (100%) rename {juspay => leetcode/juspay}/all.csv (100%) rename {juspay => leetcode/juspay}/more-than-six-months.csv (100%) rename {juspay => leetcode/juspay}/six-months.csv (100%) rename {juspay => leetcode/juspay}/three-months.csv (100%) rename {justworks => leetcode/justworks}/all.csv (100%) rename {justworks => leetcode/justworks}/more-than-six-months.csv (100%) rename {kakao => leetcode/kakao}/all.csv (100%) rename {kakao => leetcode/kakao}/more-than-six-months.csv (100%) rename {karat => leetcode/karat}/all.csv (100%) rename {karat => leetcode/karat}/more-than-six-months.csv (100%) rename {karat => leetcode/karat}/six-months.csv (100%) rename {karat => leetcode/karat}/thirty-days.csv (100%) rename {karat => leetcode/karat}/three-months.csv (100%) rename {keeptruckin => leetcode/keeptruckin}/all.csv (100%) rename {keeptruckin => leetcode/keeptruckin}/more-than-six-months.csv (100%) rename {keeptruckin => leetcode/keeptruckin}/six-months.csv (100%) rename {keeptruckin => leetcode/keeptruckin}/three-months.csv (100%) rename {kla-tencor => leetcode/kla-tencor}/all.csv (100%) rename {kla-tencor => leetcode/kla-tencor}/more-than-six-months.csv (100%) rename {kla-tencor => leetcode/kla-tencor}/six-months.csv (100%) rename {kla => leetcode/kla}/all.csv (100%) rename {kla => leetcode/kla}/more-than-six-months.csv (100%) rename {kla => leetcode/kla}/six-months.csv (100%) rename {kla => leetcode/kla}/thirty-days.csv (100%) rename {kla => leetcode/kla}/three-months.csv (100%) rename {komprise => leetcode/komprise}/all.csv (100%) rename {komprise => leetcode/komprise}/more-than-six-months.csv (100%) rename {kotak-mahindra-bank => leetcode/kotak-mahindra-bank}/all.csv (100%) rename {kotak-mahindra-bank => leetcode/kotak-mahindra-bank}/more-than-six-months.csv (100%) rename {kpit => leetcode/kpit}/all.csv (100%) rename {kpit => leetcode/kpit}/more-than-six-months.csv (100%) rename {kpmg => leetcode/kpmg}/all.csv (100%) rename {kpmg => leetcode/kpmg}/six-months.csv (100%) rename {lacework => leetcode/lacework}/all.csv (100%) rename {lacework => leetcode/lacework}/more-than-six-months.csv (100%) rename {larsen-toubro => leetcode/larsen-toubro}/all.csv (100%) rename {larsen-toubro => leetcode/larsen-toubro}/more-than-six-months.csv (100%) rename {leap-motion => leetcode/leap-motion}/all.csv (100%) rename {leap-motion => leetcode/leap-motion}/more-than-six-months.csv (100%) rename {lendingkart => leetcode/lendingkart}/all.csv (100%) rename {lenskart => leetcode/lenskart}/all.csv (100%) rename {lenskart => leetcode/lenskart}/more-than-six-months.csv (100%) rename {lg-electronics => leetcode/lg-electronics}/all.csv (100%) rename {lg-electronics => leetcode/lg-electronics}/more-than-six-months.csv (100%) rename {lg-electronics => leetcode/lg-electronics}/six-months.csv (100%) rename {licious => leetcode/licious}/all.csv (100%) rename {licious => leetcode/licious}/more-than-six-months.csv (100%) rename {liftoff => leetcode/liftoff}/all.csv (100%) rename {liftoff => leetcode/liftoff}/more-than-six-months.csv (100%) rename {liftoff => leetcode/liftoff}/six-months.csv (100%) rename {liftoff => leetcode/liftoff}/three-months.csv (100%) rename {lime => leetcode/lime}/all.csv (100%) rename {lime => leetcode/lime}/more-than-six-months.csv (100%) rename {lime => leetcode/lime}/six-months.csv (100%) rename {line => leetcode/line}/all.csv (100%) rename {line => leetcode/line}/more-than-six-months.csv (100%) rename {line => leetcode/line}/six-months.csv (100%) rename {line => leetcode/line}/three-months.csv (100%) rename {linkedin => leetcode/linkedin}/all.csv (100%) rename {linkedin => leetcode/linkedin}/more-than-six-months.csv (100%) rename {linkedin => leetcode/linkedin}/six-months.csv (100%) rename {linkedin => leetcode/linkedin}/thirty-days.csv (100%) rename {linkedin => leetcode/linkedin}/three-months.csv (100%) rename {liveramp => leetcode/liveramp}/all.csv (100%) rename {liveramp => leetcode/liveramp}/more-than-six-months.csv (100%) rename {livspace => leetcode/livspace}/all.csv (100%) rename {livspace => leetcode/livspace}/six-months.csv (100%) rename {livspace => leetcode/livspace}/three-months.csv (100%) rename {lowe => leetcode/lowe}/all.csv (100%) rename {lowe => leetcode/lowe}/more-than-six-months.csv (100%) rename {lti => leetcode/lti}/all.csv (100%) rename {lti => leetcode/lti}/more-than-six-months.csv (100%) rename {lucid => leetcode/lucid}/all.csv (100%) rename {lucid => leetcode/lucid}/more-than-six-months.csv (100%) rename {lucid => leetcode/lucid}/six-months.csv (100%) rename {lucid => leetcode/lucid}/thirty-days.csv (100%) rename {lucid => leetcode/lucid}/three-months.csv (100%) rename {luxoft => leetcode/luxoft}/all.csv (100%) rename {luxoft => leetcode/luxoft}/more-than-six-months.csv (100%) rename {luxoft => leetcode/luxoft}/six-months.csv (100%) rename {lyft => leetcode/lyft}/all.csv (100%) rename {lyft => leetcode/lyft}/more-than-six-months.csv (100%) rename {lyft => leetcode/lyft}/six-months.csv (100%) rename {lyft => leetcode/lyft}/thirty-days.csv (100%) rename {lyft => leetcode/lyft}/three-months.csv (100%) rename {machine-zone => leetcode/machine-zone}/all.csv (100%) rename {machine-zone => leetcode/machine-zone}/more-than-six-months.csv (100%) rename {machinezone => leetcode/machinezone}/all.csv (100%) rename {machinezone => leetcode/machinezone}/more-than-six-months.csv (100%) rename {maersk => leetcode/maersk}/all.csv (100%) rename {maersk => leetcode/maersk}/more-than-six-months.csv (100%) rename {makemytrip => leetcode/makemytrip}/all.csv (100%) rename {makemytrip => leetcode/makemytrip}/more-than-six-months.csv (100%) rename {mapbox => leetcode/mapbox}/all.csv (100%) rename {maq-software => leetcode/maq-software}/all.csv (100%) rename {maq-software => leetcode/maq-software}/more-than-six-months.csv (100%) rename {marqeta => leetcode/marqeta}/all.csv (100%) rename {marqeta => leetcode/marqeta}/more-than-six-months.csv (100%) rename {marqeta => leetcode/marqeta}/six-months.csv (100%) rename {marqeta => leetcode/marqeta}/thirty-days.csv (100%) rename {marqeta => leetcode/marqeta}/three-months.csv (100%) rename {mastercard => leetcode/mastercard}/all.csv (100%) rename {mastercard => leetcode/mastercard}/more-than-six-months.csv (100%) rename {mastercard => leetcode/mastercard}/six-months.csv (100%) rename {mastercard => leetcode/mastercard}/three-months.csv (100%) rename {mathworks => leetcode/mathworks}/all.csv (100%) rename {mathworks => leetcode/mathworks}/more-than-six-months.csv (100%) rename {mathworks => leetcode/mathworks}/six-months.csv (100%) rename {mathworks => leetcode/mathworks}/three-months.csv (100%) rename {mcafee => leetcode/mcafee}/all.csv (100%) rename {mcafee => leetcode/mcafee}/more-than-six-months.csv (100%) rename {mckinsey => leetcode/mckinsey}/all.csv (100%) rename {mckinsey => leetcode/mckinsey}/more-than-six-months.csv (100%) rename {medianet => leetcode/medianet}/all.csv (100%) rename {medianet => leetcode/medianet}/more-than-six-months.csv (100%) rename {medianet => leetcode/medianet}/six-months.csv (100%) rename {medianet => leetcode/medianet}/thirty-days.csv (100%) rename {medianet => leetcode/medianet}/three-months.csv (100%) rename {meesho => leetcode/meesho}/all.csv (100%) rename {meesho => leetcode/meesho}/more-than-six-months.csv (100%) rename {meesho => leetcode/meesho}/six-months.csv (100%) rename {meesho => leetcode/meesho}/thirty-days.csv (100%) rename {meesho => leetcode/meesho}/three-months.csv (100%) rename {meituan => leetcode/meituan}/all.csv (100%) rename {meituan => leetcode/meituan}/more-than-six-months.csv (100%) rename {mercari => leetcode/mercari}/all.csv (100%) rename {mercari => leetcode/mercari}/more-than-six-months.csv (100%) rename {micro1 => leetcode/micro1}/all.csv (100%) rename {micro1 => leetcode/micro1}/more-than-six-months.csv (100%) rename {microsoft => leetcode/microsoft}/all.csv (100%) rename {microsoft => leetcode/microsoft}/more-than-six-months.csv (100%) rename {microsoft => leetcode/microsoft}/six-months.csv (100%) rename {microsoft => leetcode/microsoft}/thirty-days.csv (100%) rename {microsoft => leetcode/microsoft}/three-months.csv (100%) rename {microstrategy => leetcode/microstrategy}/all.csv (100%) rename {microstrategy => leetcode/microstrategy}/more-than-six-months.csv (100%) rename {millennium => leetcode/millennium}/all.csv (100%) rename {millennium => leetcode/millennium}/more-than-six-months.csv (100%) rename {millennium => leetcode/millennium}/six-months.csv (100%) rename {mindtickle => leetcode/mindtickle}/all.csv (100%) rename {mindtickle => leetcode/mindtickle}/more-than-six-months.csv (100%) rename {mindtree => leetcode/mindtree}/all.csv (100%) rename {mindtree => leetcode/mindtree}/more-than-six-months.csv (100%) rename {miro => leetcode/miro}/all.csv (100%) rename {miro => leetcode/miro}/more-than-six-months.csv (100%) rename {mishipay => leetcode/mishipay}/all.csv (100%) rename {mishipay => leetcode/mishipay}/more-than-six-months.csv (100%) rename {mitsogo => leetcode/mitsogo}/all.csv (100%) rename {mitsogo => leetcode/mitsogo}/more-than-six-months.csv (100%) rename {mixpanel => leetcode/mixpanel}/all.csv (100%) rename {mixpanel => leetcode/mixpanel}/more-than-six-months.csv (100%) rename {mixpanel => leetcode/mixpanel}/six-months.csv (100%) rename {mixpanel => leetcode/mixpanel}/three-months.csv (100%) rename {mobileye => leetcode/mobileye}/all.csv (100%) rename {mobileye => leetcode/mobileye}/more-than-six-months.csv (100%) rename {mobisy => leetcode/mobisy}/all.csv (100%) rename {mobisy => leetcode/mobisy}/more-than-six-months.csv (100%) rename {moengage => leetcode/moengage}/all.csv (100%) rename {moengage => leetcode/moengage}/more-than-six-months.csv (100%) rename {moloco => leetcode/moloco}/all.csv (100%) rename {moloco => leetcode/moloco}/more-than-six-months.csv (100%) rename {moloco => leetcode/moloco}/six-months.csv (100%) rename {moneylion => leetcode/moneylion}/all.csv (100%) rename {moneylion => leetcode/moneylion}/more-than-six-months.csv (100%) rename {mongodb => leetcode/mongodb}/all.csv (100%) rename {mongodb => leetcode/mongodb}/more-than-six-months.csv (100%) rename {mongodb => leetcode/mongodb}/six-months.csv (100%) rename {mongodb => leetcode/mongodb}/three-months.csv (100%) rename {morgan-stanley => leetcode/morgan-stanley}/all.csv (100%) rename {morgan-stanley => leetcode/morgan-stanley}/more-than-six-months.csv (100%) rename {morgan-stanley => leetcode/morgan-stanley}/six-months.csv (100%) rename {morgan-stanley => leetcode/morgan-stanley}/three-months.csv (100%) rename {motorola => leetcode/motorola}/all.csv (100%) rename {motorola => leetcode/motorola}/more-than-six-months.csv (100%) rename {mountblue => leetcode/mountblue}/all.csv (100%) rename {mountblue => leetcode/mountblue}/more-than-six-months.csv (100%) rename {moveworks => leetcode/moveworks}/all.csv (100%) rename {moveworks => leetcode/moveworks}/more-than-six-months.csv (100%) rename {moveworks => leetcode/moveworks}/six-months.csv (100%) rename {moveworks => leetcode/moveworks}/three-months.csv (100%) rename {msci => leetcode/msci}/all.csv (100%) rename {msci => leetcode/msci}/more-than-six-months.csv (100%) rename {mts => leetcode/mts}/all.csv (100%) rename {mts => leetcode/mts}/more-than-six-months.csv (100%) rename {murex => leetcode/murex}/all.csv (100%) rename {murex => leetcode/murex}/more-than-six-months.csv (100%) rename {mykaarma => leetcode/mykaarma}/all.csv (100%) rename {mykaarma => leetcode/mykaarma}/more-than-six-months.csv (100%) rename {myntra => leetcode/myntra}/all.csv (100%) rename {myntra => leetcode/myntra}/more-than-six-months.csv (100%) rename {myntra => leetcode/myntra}/six-months.csv (100%) rename {nagarro => leetcode/nagarro}/all.csv (100%) rename {nagarro => leetcode/nagarro}/more-than-six-months.csv (100%) rename {national-instruments => leetcode/national-instruments}/all.csv (100%) rename {national-instruments => leetcode/national-instruments}/more-than-six-months.csv (100%) rename {national-payments-coorperation-india => leetcode/national-payments-coorperation-india}/all.csv (100%) rename {national-payments-coorperation-india => leetcode/national-payments-coorperation-india}/more-than-six-months.csv (100%) rename {navan => leetcode/navan}/all.csv (100%) rename {navan => leetcode/navan}/more-than-six-months.csv (100%) rename {navan => leetcode/navan}/six-months.csv (100%) rename {navan => leetcode/navan}/three-months.csv (100%) rename {naver => leetcode/naver}/all.csv (100%) rename {naver => leetcode/naver}/more-than-six-months.csv (100%) rename {navi => leetcode/navi}/all.csv (100%) rename {navi => leetcode/navi}/more-than-six-months.csv (100%) rename {ncr => leetcode/ncr}/all.csv (100%) rename {ncr => leetcode/ncr}/more-than-six-months.csv (100%) rename {nerdwallet => leetcode/nerdwallet}/all.csv (100%) rename {netapp => leetcode/netapp}/all.csv (100%) rename {netapp => leetcode/netapp}/more-than-six-months.csv (100%) rename {netapp => leetcode/netapp}/six-months.csv (100%) rename {netcracker-technology => leetcode/netcracker-technology}/all.csv (100%) rename {netcracker-technology => leetcode/netcracker-technology}/six-months.csv (100%) rename {netcracker-technology => leetcode/netcracker-technology}/three-months.csv (100%) rename {netease => leetcode/netease}/all.csv (100%) rename {netease => leetcode/netease}/more-than-six-months.csv (100%) rename {netflix => leetcode/netflix}/all.csv (100%) rename {netflix => leetcode/netflix}/more-than-six-months.csv (100%) rename {netflix => leetcode/netflix}/six-months.csv (100%) rename {netflix => leetcode/netflix}/thirty-days.csv (100%) rename {netflix => leetcode/netflix}/three-months.csv (100%) rename {netskope => leetcode/netskope}/all.csv (100%) rename {netskope => leetcode/netskope}/more-than-six-months.csv (100%) rename {netskope => leetcode/netskope}/six-months.csv (100%) rename {netsuite => leetcode/netsuite}/all.csv (100%) rename {netsuite => leetcode/netsuite}/more-than-six-months.csv (100%) rename {newsbreak => leetcode/newsbreak}/all.csv (100%) rename {newsbreak => leetcode/newsbreak}/six-months.csv (100%) rename {newsbreak => leetcode/newsbreak}/three-months.csv (100%) rename {nextdoor => leetcode/nextdoor}/all.csv (100%) rename {nextdoor => leetcode/nextdoor}/more-than-six-months.csv (100%) rename {nextdoor => leetcode/nextdoor}/six-months.csv (100%) rename {nextjump => leetcode/nextjump}/all.csv (100%) rename {nextjump => leetcode/nextjump}/more-than-six-months.csv (100%) rename {nference => leetcode/nference}/all.csv (100%) rename {nference => leetcode/nference}/more-than-six-months.csv (100%) rename {niantic => leetcode/niantic}/all.csv (100%) rename {niantic => leetcode/niantic}/more-than-six-months.csv (100%) rename {nielsen => leetcode/nielsen}/all.csv (100%) rename {nielsen => leetcode/nielsen}/more-than-six-months.csv (100%) rename {nike => leetcode/nike}/all.csv (100%) rename {nike => leetcode/nike}/more-than-six-months.csv (100%) rename {nike => leetcode/nike}/six-months.csv (100%) rename {nike => leetcode/nike}/thirty-days.csv (100%) rename {nike => leetcode/nike}/three-months.csv (100%) rename {ninjacart => leetcode/ninjacart}/all.csv (100%) rename {ninjacart => leetcode/ninjacart}/more-than-six-months.csv (100%) rename {nokia => leetcode/nokia}/all.csv (100%) rename {nokia => leetcode/nokia}/more-than-six-months.csv (100%) rename {nordstrom => leetcode/nordstrom}/all.csv (100%) rename {nordstrom => leetcode/nordstrom}/more-than-six-months.csv (100%) rename {nordstrom => leetcode/nordstrom}/six-months.csv (100%) rename {nordstrom => leetcode/nordstrom}/three-months.csv (100%) rename {notion => leetcode/notion}/all.csv (100%) rename {notion => leetcode/notion}/more-than-six-months.csv (100%) rename {npci => leetcode/npci}/all.csv (100%) rename {npci => leetcode/npci}/more-than-six-months.csv (100%) rename {nuro => leetcode/nuro}/all.csv (100%) rename {nuro => leetcode/nuro}/more-than-six-months.csv (100%) rename {nuro => leetcode/nuro}/six-months.csv (100%) rename {nuro => leetcode/nuro}/thirty-days.csv (100%) rename {nuro => leetcode/nuro}/three-months.csv (100%) rename {nutanix => leetcode/nutanix}/all.csv (100%) rename {nutanix => leetcode/nutanix}/more-than-six-months.csv (100%) rename {nutanix => leetcode/nutanix}/six-months.csv (100%) rename {nutanix => leetcode/nutanix}/thirty-days.csv (100%) rename {nutanix => leetcode/nutanix}/three-months.csv (100%) rename {nvidia => leetcode/nvidia}/all.csv (100%) rename {nvidia => leetcode/nvidia}/more-than-six-months.csv (100%) rename {nvidia => leetcode/nvidia}/six-months.csv (100%) rename {nvidia => leetcode/nvidia}/thirty-days.csv (100%) rename {nvidia => leetcode/nvidia}/three-months.csv (100%) rename {nykaa => leetcode/nykaa}/all.csv (100%) rename {nykaa => leetcode/nykaa}/more-than-six-months.csv (100%) rename {nykaa => leetcode/nykaa}/six-months.csv (100%) rename {observeai => leetcode/observeai}/all.csv (100%) rename {observeai => leetcode/observeai}/more-than-six-months.csv (100%) rename {observeai => leetcode/observeai}/six-months.csv (100%) rename {odoo => leetcode/odoo}/all.csv (100%) rename {odoo => leetcode/odoo}/more-than-six-months.csv (100%) rename {okta => leetcode/okta}/all.csv (100%) rename {okta => leetcode/okta}/more-than-six-months.csv (100%) rename {okx => leetcode/okx}/all.csv (100%) rename {okx => leetcode/okx}/more-than-six-months.csv (100%) rename {ola => leetcode/ola}/all.csv (100%) rename {ola => leetcode/ola}/more-than-six-months.csv (100%) rename {olx => leetcode/olx}/all.csv (100%) rename {olx => leetcode/olx}/six-months.csv (100%) rename {openai => leetcode/openai}/all.csv (100%) rename {openai => leetcode/openai}/more-than-six-months.csv (100%) rename {openai => leetcode/openai}/six-months.csv (100%) rename {openai => leetcode/openai}/three-months.csv (100%) rename {opendoor => leetcode/opendoor}/all.csv (100%) rename {opendoor => leetcode/opendoor}/more-than-six-months.csv (100%) rename {opentext => leetcode/opentext}/all.csv (100%) rename {opentext => leetcode/opentext}/more-than-six-months.csv (100%) rename {oppo => leetcode/oppo}/all.csv (100%) rename {optiver => leetcode/optiver}/all.csv (100%) rename {optiver => leetcode/optiver}/more-than-six-months.csv (100%) rename {optum => leetcode/optum}/all.csv (100%) rename {optum => leetcode/optum}/more-than-six-months.csv (100%) rename {oracle => leetcode/oracle}/all.csv (100%) rename {oracle => leetcode/oracle}/more-than-six-months.csv (100%) rename {oracle => leetcode/oracle}/six-months.csv (100%) rename {oracle => leetcode/oracle}/thirty-days.csv (100%) rename {oracle => leetcode/oracle}/three-months.csv (100%) rename {oscar-health => leetcode/oscar-health}/all.csv (100%) rename {oscar-health => leetcode/oscar-health}/more-than-six-months.csv (100%) rename {oscar-health => leetcode/oscar-health}/six-months.csv (100%) rename {oscar-health => leetcode/oscar-health}/thirty-days.csv (100%) rename {oscar-health => leetcode/oscar-health}/three-months.csv (100%) rename {otterai => leetcode/otterai}/all.csv (100%) rename {otterai => leetcode/otterai}/more-than-six-months.csv (100%) rename {oyo => leetcode/oyo}/all.csv (100%) rename {oyo => leetcode/oyo}/more-than-six-months.csv (100%) rename {oyo => leetcode/oyo}/six-months.csv (100%) rename {oyo => leetcode/oyo}/three-months.csv (100%) rename {ozon => leetcode/ozon}/all.csv (100%) rename {ozon => leetcode/ozon}/more-than-six-months.csv (100%) rename {ozon => leetcode/ozon}/six-months.csv (100%) rename {ozon => leetcode/ozon}/three-months.csv (100%) rename {palantir-technologies => leetcode/palantir-technologies}/all.csv (100%) rename {palantir-technologies => leetcode/palantir-technologies}/more-than-six-months.csv (100%) rename {palantir-technologies => leetcode/palantir-technologies}/six-months.csv (100%) rename {palantir-technologies => leetcode/palantir-technologies}/three-months.csv (100%) rename {palo-alto-networks => leetcode/palo-alto-networks}/all.csv (100%) rename {palo-alto-networks => leetcode/palo-alto-networks}/more-than-six-months.csv (100%) rename {palo-alto-networks => leetcode/palo-alto-networks}/six-months.csv (100%) rename {palo-alto-networks => leetcode/palo-alto-networks}/three-months.csv (100%) rename {park => leetcode/park}/all.csv (100%) rename {park => leetcode/park}/more-than-six-months.csv (100%) rename {patreon => leetcode/patreon}/all.csv (100%) rename {patreon => leetcode/patreon}/more-than-six-months.csv (100%) rename {patreon => leetcode/patreon}/six-months.csv (100%) rename {paycom => leetcode/paycom}/all.csv (100%) rename {paycom => leetcode/paycom}/more-than-six-months.csv (100%) rename {paypal => leetcode/paypal}/all.csv (100%) rename {paypal => leetcode/paypal}/more-than-six-months.csv (100%) rename {paypal => leetcode/paypal}/six-months.csv (100%) rename {paypal => leetcode/paypal}/thirty-days.csv (100%) rename {paypal => leetcode/paypal}/three-months.csv (100%) rename {paypay => leetcode/paypay}/all.csv (100%) rename {paypay => leetcode/paypay}/more-than-six-months.csv (100%) rename {paypay => leetcode/paypay}/six-months.csv (100%) rename {paypay => leetcode/paypay}/three-months.csv (100%) rename {paytm => leetcode/paytm}/all.csv (100%) rename {paytm => leetcode/paytm}/more-than-six-months.csv (100%) rename {paytm => leetcode/paytm}/six-months.csv (100%) rename {payu => leetcode/payu}/all.csv (100%) rename {payu => leetcode/payu}/more-than-six-months.csv (100%) rename {peak6 => leetcode/peak6}/all.csv (100%) rename {pega => leetcode/pega}/all.csv (100%) rename {peloton => leetcode/peloton}/all.csv (100%) rename {peloton => leetcode/peloton}/more-than-six-months.csv (100%) rename {persistent-systems => leetcode/persistent-systems}/all.csv (100%) rename {persistent-systems => leetcode/persistent-systems}/more-than-six-months.csv (100%) rename {persistent-systems => leetcode/persistent-systems}/six-months.csv (100%) rename {philips => leetcode/philips}/all.csv (100%) rename {philips => leetcode/philips}/six-months.csv (100%) rename {phonepe => leetcode/phonepe}/all.csv (100%) rename {phonepe => leetcode/phonepe}/more-than-six-months.csv (100%) rename {phonepe => leetcode/phonepe}/six-months.csv (100%) rename {phonepe => leetcode/phonepe}/thirty-days.csv (100%) rename {phonepe => leetcode/phonepe}/three-months.csv (100%) rename {pickrr => leetcode/pickrr}/all.csv (100%) rename {pickrr => leetcode/pickrr}/more-than-six-months.csv (100%) rename {pinterest => leetcode/pinterest}/all.csv (100%) rename {pinterest => leetcode/pinterest}/more-than-six-months.csv (100%) rename {pinterest => leetcode/pinterest}/six-months.csv (100%) rename {pinterest => leetcode/pinterest}/thirty-days.csv (100%) rename {pinterest => leetcode/pinterest}/three-months.csv (100%) rename {plaid => leetcode/plaid}/all.csv (100%) rename {plaid => leetcode/plaid}/six-months.csv (100%) rename {plaid => leetcode/plaid}/three-months.csv (100%) rename {pocket-gems => leetcode/pocket-gems}/all.csv (100%) rename {pocket-gems => leetcode/pocket-gems}/more-than-six-months.csv (100%) rename {point72 => leetcode/point72}/all.csv (100%) rename {point72 => leetcode/point72}/more-than-six-months.csv (100%) rename {polar => leetcode/polar}/all.csv (100%) rename {polar => leetcode/polar}/more-than-six-months.csv (100%) rename {ponyai => leetcode/ponyai}/all.csv (100%) rename {ponyai => leetcode/ponyai}/more-than-six-months.csv (100%) rename {pornhub => leetcode/pornhub}/all.csv (100%) rename {pornhub => leetcode/pornhub}/more-than-six-months.csv (100%) rename {porter => leetcode/porter}/all.csv (100%) rename {porter => leetcode/porter}/more-than-six-months.csv (100%) rename {poshmark => leetcode/poshmark}/all.csv (100%) rename {poshmark => leetcode/poshmark}/more-than-six-months.csv (100%) rename {postman => leetcode/postman}/all.csv (100%) rename {postmates => leetcode/postmates}/all.csv (100%) rename {postmates => leetcode/postmates}/more-than-six-months.csv (100%) rename {poynt => leetcode/poynt}/all.csv (100%) rename {poynt => leetcode/poynt}/more-than-six-months.csv (100%) rename {practo => leetcode/practo}/all.csv (100%) rename {practo => leetcode/practo}/more-than-six-months.csv (100%) rename {publicis-sapient => leetcode/publicis-sapient}/all.csv (100%) rename {publicis-sapient => leetcode/publicis-sapient}/more-than-six-months.csv (100%) rename {publicis-sapient => leetcode/publicis-sapient}/six-months.csv (100%) rename {pubmatic => leetcode/pubmatic}/all.csv (100%) rename {pubmatic => leetcode/pubmatic}/more-than-six-months.csv (100%) rename {pure-storage => leetcode/pure-storage}/all.csv (100%) rename {pure-storage => leetcode/pure-storage}/more-than-six-months.csv (100%) rename {pure-storage => leetcode/pure-storage}/six-months.csv (100%) rename {pure-storage => leetcode/pure-storage}/three-months.csv (100%) rename {pure => leetcode/pure}/all.csv (100%) rename {pure => leetcode/pure}/six-months.csv (100%) rename {purplle => leetcode/purplle}/all.csv (100%) rename {purplle => leetcode/purplle}/more-than-six-months.csv (100%) rename {pwc => leetcode/pwc}/all.csv (100%) rename {pwc => leetcode/pwc}/more-than-six-months.csv (100%) rename {pwc => leetcode/pwc}/six-months.csv (100%) rename {qburst => leetcode/qburst}/all.csv (100%) rename {qburst => leetcode/qburst}/more-than-six-months.csv (100%) rename {qualcomm => leetcode/qualcomm}/all.csv (100%) rename {qualcomm => leetcode/qualcomm}/more-than-six-months.csv (100%) rename {qualcomm => leetcode/qualcomm}/six-months.csv (100%) rename {qualcomm => leetcode/qualcomm}/three-months.csv (100%) rename {qualtrics => leetcode/qualtrics}/all.csv (100%) rename {qualtrics => leetcode/qualtrics}/more-than-six-months.csv (100%) rename {qualtrics => leetcode/qualtrics}/six-months.csv (100%) rename {qualys => leetcode/qualys}/all.csv (100%) rename {qualys => leetcode/qualys}/more-than-six-months.csv (100%) rename {quantcast => leetcode/quantcast}/all.csv (100%) rename {quantcast => leetcode/quantcast}/six-months.csv (100%) rename {quantcast => leetcode/quantcast}/three-months.csv (100%) rename {quince => leetcode/quince}/all.csv (100%) rename {quince => leetcode/quince}/more-than-six-months.csv (100%) rename {quince => leetcode/quince}/six-months.csv (100%) rename {quince => leetcode/quince}/thirty-days.csv (100%) rename {quince => leetcode/quince}/three-months.csv (100%) rename {qumulo => leetcode/qumulo}/all.csv (100%) rename {qumulo => leetcode/qumulo}/more-than-six-months.csv (100%) rename {quora => leetcode/quora}/all.csv (100%) rename {quora => leetcode/quora}/more-than-six-months.csv (100%) rename {quora => leetcode/quora}/six-months.csv (100%) rename {quora => leetcode/quora}/three-months.csv (100%) rename {rackspace => leetcode/rackspace}/all.csv (100%) rename {rackspace => leetcode/rackspace}/more-than-six-months.csv (100%) rename {radius => leetcode/radius}/all.csv (100%) rename {radius => leetcode/radius}/more-than-six-months.csv (100%) rename {rakuten => leetcode/rakuten}/all.csv (100%) rename {rakuten => leetcode/rakuten}/more-than-six-months.csv (100%) rename {rakuten => leetcode/rakuten}/six-months.csv (100%) rename {rakuten => leetcode/rakuten}/thirty-days.csv (100%) rename {rakuten => leetcode/rakuten}/three-months.csv (100%) rename {ramp-2 => leetcode/ramp-2}/all.csv (100%) rename {ramp-2 => leetcode/ramp-2}/more-than-six-months.csv (100%) rename {ramp-2 => leetcode/ramp-2}/six-months.csv (100%) rename {ramp-2 => leetcode/ramp-2}/three-months.csv (100%) rename {razorpay => leetcode/razorpay}/all.csv (100%) rename {razorpay => leetcode/razorpay}/more-than-six-months.csv (100%) rename {razorpay => leetcode/razorpay}/six-months.csv (100%) rename {rbc => leetcode/rbc}/all.csv (100%) rename {rbc => leetcode/rbc}/more-than-six-months.csv (100%) rename {rbc => leetcode/rbc}/six-months.csv (100%) rename {redbus => leetcode/redbus}/all.csv (100%) rename {redbus => leetcode/redbus}/more-than-six-months.csv (100%) rename {reddit => leetcode/reddit}/all.csv (100%) rename {reddit => leetcode/reddit}/more-than-six-months.csv (100%) rename {reddit => leetcode/reddit}/six-months.csv (100%) rename {redfin => leetcode/redfin}/all.csv (100%) rename {redfin => leetcode/redfin}/six-months.csv (100%) rename {remitly => leetcode/remitly}/all.csv (100%) rename {remitly => leetcode/remitly}/more-than-six-months.csv (100%) rename {remitly => leetcode/remitly}/six-months.csv (100%) rename {remitly => leetcode/remitly}/three-months.csv (100%) rename {retailmenot => leetcode/retailmenot}/all.csv (100%) rename {retailmenot => leetcode/retailmenot}/more-than-six-months.csv (100%) rename {revolut => leetcode/revolut}/all.csv (100%) rename {revolut => leetcode/revolut}/more-than-six-months.csv (100%) rename {revolut => leetcode/revolut}/six-months.csv (100%) rename {revolut => leetcode/revolut}/three-months.csv (100%) rename {riot-games => leetcode/riot-games}/all.csv (100%) rename {riot-games => leetcode/riot-games}/more-than-six-months.csv (100%) rename {riot-games => leetcode/riot-games}/six-months.csv (100%) rename {ripple => leetcode/ripple}/all.csv (100%) rename {ripple => leetcode/ripple}/more-than-six-months.csv (100%) rename {ripple => leetcode/ripple}/six-months.csv (100%) rename {ripple => leetcode/ripple}/three-months.csv (100%) rename {rippling => leetcode/rippling}/all.csv (100%) rename {rippling => leetcode/rippling}/more-than-six-months.csv (100%) rename {rippling => leetcode/rippling}/six-months.csv (100%) rename {rivian => leetcode/rivian}/all.csv (100%) rename {rivian => leetcode/rivian}/more-than-six-months.csv (100%) rename {rivian => leetcode/rivian}/six-months.csv (100%) rename {rivian => leetcode/rivian}/three-months.csv (100%) rename {robinhood => leetcode/robinhood}/all.csv (100%) rename {robinhood => leetcode/robinhood}/more-than-six-months.csv (100%) rename {robinhood => leetcode/robinhood}/six-months.csv (100%) rename {robinhood => leetcode/robinhood}/three-months.csv (100%) rename {roblox => leetcode/roblox}/all.csv (100%) rename {roblox => leetcode/roblox}/more-than-six-months.csv (100%) rename {roblox => leetcode/roblox}/six-months.csv (100%) rename {roblox => leetcode/roblox}/thirty-days.csv (100%) rename {roblox => leetcode/roblox}/three-months.csv (100%) rename {roche => leetcode/roche}/all.csv (100%) rename {roche => leetcode/roche}/more-than-six-months.csv (100%) rename {rokt => leetcode/rokt}/all.csv (100%) rename {rokt => leetcode/rokt}/more-than-six-months.csv (100%) rename {rokt => leetcode/rokt}/six-months.csv (100%) rename {roku => leetcode/roku}/all.csv (100%) rename {roku => leetcode/roku}/more-than-six-months.csv (100%) rename {roku => leetcode/roku}/six-months.csv (100%) rename {roku => leetcode/roku}/three-months.csv (100%) rename {rubrik => leetcode/rubrik}/all.csv (100%) rename {rubrik => leetcode/rubrik}/more-than-six-months.csv (100%) rename {rubrik => leetcode/rubrik}/six-months.csv (100%) rename {rubrik => leetcode/rubrik}/three-months.csv (100%) rename {salesforce => leetcode/salesforce}/all.csv (100%) rename {salesforce => leetcode/salesforce}/more-than-six-months.csv (100%) rename {salesforce => leetcode/salesforce}/six-months.csv (100%) rename {salesforce => leetcode/salesforce}/thirty-days.csv (100%) rename {salesforce => leetcode/salesforce}/three-months.csv (100%) rename {sambanova => leetcode/sambanova}/all.csv (100%) rename {samsara => leetcode/samsara}/all.csv (100%) rename {samsara => leetcode/samsara}/more-than-six-months.csv (100%) rename {samsara => leetcode/samsara}/six-months.csv (100%) rename {samsung => leetcode/samsung}/all.csv (100%) rename {samsung => leetcode/samsung}/more-than-six-months.csv (100%) rename {samsung => leetcode/samsung}/six-months.csv (100%) rename {samsung => leetcode/samsung}/three-months.csv (100%) rename {sap => leetcode/sap}/all.csv (100%) rename {sap => leetcode/sap}/more-than-six-months.csv (100%) rename {sap => leetcode/sap}/six-months.csv (100%) rename {sap => leetcode/sap}/three-months.csv (100%) rename {scale-ai => leetcode/scale-ai}/all.csv (100%) rename {scale-ai => leetcode/scale-ai}/more-than-six-months.csv (100%) rename {schneider-electric => leetcode/schneider-electric}/all.csv (100%) rename {schneider-electric => leetcode/schneider-electric}/more-than-six-months.csv (100%) rename {schrodinger => leetcode/schrodinger}/all.csv (100%) rename {schrodinger => leetcode/schrodinger}/more-than-six-months.csv (100%) rename {sentry => leetcode/sentry}/all.csv (100%) rename {sentry => leetcode/sentry}/more-than-six-months.csv (100%) rename {servicenow => leetcode/servicenow}/all.csv (100%) rename {servicenow => leetcode/servicenow}/more-than-six-months.csv (100%) rename {servicenow => leetcode/servicenow}/six-months.csv (100%) rename {servicenow => leetcode/servicenow}/three-months.csv (100%) rename {sharechat => leetcode/sharechat}/all.csv (100%) rename {sharechat => leetcode/sharechat}/more-than-six-months.csv (100%) rename {shift-technology => leetcode/shift-technology}/all.csv (100%) rename {shift-technology => leetcode/shift-technology}/more-than-six-months.csv (100%) rename {shipsy => leetcode/shipsy}/all.csv (100%) rename {shipsy => leetcode/shipsy}/more-than-six-months.csv (100%) rename {shopee => leetcode/shopee}/all.csv (100%) rename {shopee => leetcode/shopee}/more-than-six-months.csv (100%) rename {shopee => leetcode/shopee}/six-months.csv (100%) rename {shopify => leetcode/shopify}/all.csv (100%) rename {shopify => leetcode/shopify}/more-than-six-months.csv (100%) rename {shopify => leetcode/shopify}/six-months.csv (100%) rename {shopify => leetcode/shopify}/three-months.csv (100%) rename {siemens => leetcode/siemens}/all.csv (100%) rename {siemens => leetcode/siemens}/more-than-six-months.csv (100%) rename {siemens => leetcode/siemens}/six-months.csv (100%) rename {sig => leetcode/sig}/all.csv (100%) rename {sig => leetcode/sig}/more-than-six-months.csv (100%) rename {sig => leetcode/sig}/six-months.csv (100%) rename {sigmoid => leetcode/sigmoid}/all.csv (100%) rename {sigmoid => leetcode/sigmoid}/more-than-six-months.csv (100%) rename {sigmoid => leetcode/sigmoid}/six-months.csv (100%) rename {sigmoid => leetcode/sigmoid}/three-months.csv (100%) rename {singlestore => leetcode/singlestore}/all.csv (100%) rename {singlestore => leetcode/singlestore}/more-than-six-months.csv (100%) rename {sixt => leetcode/sixt}/all.csv (100%) rename {sixt => leetcode/sixt}/more-than-six-months.csv (100%) rename {slice => leetcode/slice}/all.csv (100%) rename {slice => leetcode/slice}/more-than-six-months.csv (100%) rename {smartnews => leetcode/smartnews}/all.csv (100%) rename {smartnews => leetcode/smartnews}/more-than-six-months.csv (100%) rename {smartsheet => leetcode/smartsheet}/all.csv (100%) rename {smartsheet => leetcode/smartsheet}/more-than-six-months.csv (100%) rename {snapchat => leetcode/snapchat}/all.csv (100%) rename {snapchat => leetcode/snapchat}/more-than-six-months.csv (100%) rename {snapchat => leetcode/snapchat}/six-months.csv (100%) rename {snapchat => leetcode/snapchat}/three-months.csv (100%) rename {snapdeal => leetcode/snapdeal}/all.csv (100%) rename {snapdeal => leetcode/snapdeal}/more-than-six-months.csv (100%) rename {snowflake => leetcode/snowflake}/all.csv (100%) rename {snowflake => leetcode/snowflake}/more-than-six-months.csv (100%) rename {snowflake => leetcode/snowflake}/six-months.csv (100%) rename {snowflake => leetcode/snowflake}/thirty-days.csv (100%) rename {snowflake => leetcode/snowflake}/three-months.csv (100%) rename {societe-generale => leetcode/societe-generale}/all.csv (100%) rename {societe-generale => leetcode/societe-generale}/more-than-six-months.csv (100%) rename {sofi => leetcode/sofi}/all.csv (100%) rename {sofi => leetcode/sofi}/more-than-six-months.csv (100%) rename {sofi => leetcode/sofi}/six-months.csv (100%) rename {sofi => leetcode/sofi}/three-months.csv (100%) rename {software-ag => leetcode/software-ag}/all.csv (100%) rename {software-ag => leetcode/software-ag}/more-than-six-months.csv (100%) rename {softwire => leetcode/softwire}/all.csv (100%) rename {softwire => leetcode/softwire}/more-than-six-months.csv (100%) rename {softwire => leetcode/softwire}/six-months.csv (100%) rename {sony => leetcode/sony}/all.csv (100%) rename {sony => leetcode/sony}/more-than-six-months.csv (100%) rename {soti => leetcode/soti}/all.csv (100%) rename {soti => leetcode/soti}/more-than-six-months.csv (100%) rename {soundhound => leetcode/soundhound}/all.csv (100%) rename {soundhound => leetcode/soundhound}/more-than-six-months.csv (100%) rename {spacex => leetcode/spacex}/all.csv (100%) rename {spacex => leetcode/spacex}/more-than-six-months.csv (100%) rename {spinny => leetcode/spinny}/all.csv (100%) rename {spinny => leetcode/spinny}/more-than-six-months.csv (100%) rename {spinny => leetcode/spinny}/six-months.csv (100%) rename {spinny => leetcode/spinny}/three-months.csv (100%) rename {splunk => leetcode/splunk}/all.csv (100%) rename {splunk => leetcode/splunk}/more-than-six-months.csv (100%) rename {splunk => leetcode/splunk}/six-months.csv (100%) rename {spotify => leetcode/spotify}/all.csv (100%) rename {spotify => leetcode/spotify}/more-than-six-months.csv (100%) rename {spotify => leetcode/spotify}/six-months.csv (100%) rename {spotify => leetcode/spotify}/thirty-days.csv (100%) rename {spotify => leetcode/spotify}/three-months.csv (100%) rename {sprinklr => leetcode/sprinklr}/all.csv (100%) rename {sprinklr => leetcode/sprinklr}/more-than-six-months.csv (100%) rename {square => leetcode/square}/all.csv (100%) rename {square => leetcode/square}/more-than-six-months.csv (100%) rename {square => leetcode/square}/six-months.csv (100%) rename {squarepoint-capital => leetcode/squarepoint-capital}/all.csv (100%) rename {squarepoint-capital => leetcode/squarepoint-capital}/more-than-six-months.csv (100%) rename {squarepoint-capital => leetcode/squarepoint-capital}/six-months.csv (100%) rename {squarespace => leetcode/squarespace}/all.csv (100%) rename {squarespace => leetcode/squarespace}/more-than-six-months.csv (100%) rename {squarespace => leetcode/squarespace}/six-months.csv (100%) rename {squarespace => leetcode/squarespace}/three-months.csv (100%) rename {src => leetcode/src}/main/java/Main.java (100%) rename {src => leetcode/src}/main/java/Scraper.java (100%) rename {src => leetcode/src}/main/java/model/ProblemStatement.java (100%) rename {stackadapt => leetcode/stackadapt}/all.csv (100%) rename {stackadapt => leetcode/stackadapt}/more-than-six-months.csv (100%) rename {stackline => leetcode/stackline}/all.csv (100%) rename {stackline => leetcode/stackline}/more-than-six-months.csv (100%) rename {stackline => leetcode/stackline}/six-months.csv (100%) rename {starbucks => leetcode/starbucks}/all.csv (100%) rename {starbucks => leetcode/starbucks}/six-months.csv (100%) rename {starbucks => leetcode/starbucks}/three-months.csv (100%) rename {state-farm => leetcode/state-farm}/all.csv (100%) rename {state-farm => leetcode/state-farm}/six-months.csv (100%) rename {strava => leetcode/strava}/all.csv (100%) rename {strava => leetcode/strava}/more-than-six-months.csv (100%) rename {stripe => leetcode/stripe}/all.csv (100%) rename {stripe => leetcode/stripe}/more-than-six-months.csv (100%) rename {stripe => leetcode/stripe}/six-months.csv (100%) rename {stripe => leetcode/stripe}/thirty-days.csv (100%) rename {stripe => leetcode/stripe}/three-months.csv (100%) rename {sumologic => leetcode/sumologic}/all.csv (100%) rename {sumologic => leetcode/sumologic}/more-than-six-months.csv (100%) rename {susquehanna-international-group => leetcode/susquehanna-international-group}/all.csv (100%) rename {swiggy => leetcode/swiggy}/all.csv (100%) rename {swiggy => leetcode/swiggy}/more-than-six-months.csv (100%) rename {swiggy => leetcode/swiggy}/six-months.csv (100%) rename {swiggy => leetcode/swiggy}/thirty-days.csv (100%) rename {swiggy => leetcode/swiggy}/three-months.csv (100%) rename {syfe => leetcode/syfe}/all.csv (100%) rename {syfe => leetcode/syfe}/more-than-six-months.csv (100%) rename {synology => leetcode/synology}/all.csv (100%) rename {synology => leetcode/synology}/more-than-six-months.csv (100%) rename {synopsys => leetcode/synopsys}/all.csv (100%) rename {synopsys => leetcode/synopsys}/more-than-six-months.csv (100%) rename {ta-digital => leetcode/ta-digital}/all.csv (100%) rename {ta-digital => leetcode/ta-digital}/more-than-six-months.csv (100%) rename {tableau => leetcode/tableau}/all.csv (100%) rename {tableau => leetcode/tableau}/more-than-six-months.csv (100%) rename {tally-solutions => leetcode/tally-solutions}/all.csv (100%) rename {tally-solutions => leetcode/tally-solutions}/more-than-six-months.csv (100%) rename {tanium => leetcode/tanium}/all.csv (100%) rename {tanium => leetcode/tanium}/more-than-six-months.csv (100%) rename {tanium => leetcode/tanium}/six-months.csv (100%) rename {target => leetcode/target}/all.csv (100%) rename {target => leetcode/target}/more-than-six-months.csv (100%) rename {tcs => leetcode/tcs}/all.csv (100%) rename {tcs => leetcode/tcs}/more-than-six-months.csv (100%) rename {tcs => leetcode/tcs}/six-months.csv (100%) rename {tcs => leetcode/tcs}/thirty-days.csv (100%) rename {tcs => leetcode/tcs}/three-months.csv (100%) rename {tech-mahindra => leetcode/tech-mahindra}/all.csv (100%) rename {tech-mahindra => leetcode/tech-mahindra}/more-than-six-months.csv (100%) rename {tekion => leetcode/tekion}/all.csv (100%) rename {tekion => leetcode/tekion}/more-than-six-months.csv (100%) rename {tekion => leetcode/tekion}/six-months.csv (100%) rename {tekion => leetcode/tekion}/three-months.csv (100%) rename {tencent => leetcode/tencent}/all.csv (100%) rename {tencent => leetcode/tencent}/more-than-six-months.csv (100%) rename {tencent => leetcode/tencent}/six-months.csv (100%) rename {tencent => leetcode/tencent}/three-months.csv (100%) rename {teradata => leetcode/teradata}/all.csv (100%) rename {teradata => leetcode/teradata}/more-than-six-months.csv (100%) rename {tesco => leetcode/tesco}/all.csv (100%) rename {tesco => leetcode/tesco}/more-than-six-months.csv (100%) rename {tesco => leetcode/tesco}/six-months.csv (100%) rename {tesla => leetcode/tesla}/all.csv (100%) rename {tesla => leetcode/tesla}/more-than-six-months.csv (100%) rename {tesla => leetcode/tesla}/six-months.csv (100%) rename {tesla => leetcode/tesla}/three-months.csv (100%) rename {texas-instruments => leetcode/texas-instruments}/all.csv (100%) rename {texas-instruments => leetcode/texas-instruments}/more-than-six-months.csv (100%) rename {the-trade-desk => leetcode/the-trade-desk}/all.csv (100%) rename {the-trade-desk => leetcode/the-trade-desk}/more-than-six-months.csv (100%) rename {the-trade-desk => leetcode/the-trade-desk}/six-months.csv (100%) rename {thomson-reuters => leetcode/thomson-reuters}/all.csv (100%) rename {thomson-reuters => leetcode/thomson-reuters}/more-than-six-months.csv (100%) rename {thoughtspot => leetcode/thoughtspot}/all.csv (100%) rename {thoughtspot => leetcode/thoughtspot}/more-than-six-months.csv (100%) rename {thoughtworks => leetcode/thoughtworks}/all.csv (100%) rename {thoughtworks => leetcode/thoughtworks}/more-than-six-months.csv (100%) rename {thousandeyes => leetcode/thousandeyes}/all.csv (100%) rename {thousandeyes => leetcode/thousandeyes}/more-than-six-months.csv (100%) rename {thumbtack => leetcode/thumbtack}/all.csv (100%) rename {thumbtack => leetcode/thumbtack}/more-than-six-months.csv (100%) rename {tiaa => leetcode/tiaa}/all.csv (100%) rename {tiaa => leetcode/tiaa}/more-than-six-months.csv (100%) rename {tiger-analytics => leetcode/tiger-analytics}/all.csv (100%) rename {tiger-analytics => leetcode/tiger-analytics}/more-than-six-months.csv (100%) rename {tiger-analytics => leetcode/tiger-analytics}/six-months.csv (100%) rename {tiger-analytics => leetcode/tiger-analytics}/three-months.csv (100%) rename {tiktok => leetcode/tiktok}/all.csv (100%) rename {tiktok => leetcode/tiktok}/more-than-six-months.csv (100%) rename {tiktok => leetcode/tiktok}/six-months.csv (100%) rename {tiktok => leetcode/tiktok}/thirty-days.csv (100%) rename {tiktok => leetcode/tiktok}/three-months.csv (100%) rename {tinder => leetcode/tinder}/all.csv (100%) rename {tinder => leetcode/tinder}/more-than-six-months.csv (100%) rename {tinkoff => leetcode/tinkoff}/all.csv (100%) rename {tinkoff => leetcode/tinkoff}/more-than-six-months.csv (100%) rename {toast => leetcode/toast}/all.csv (100%) rename {toast => leetcode/toast}/more-than-six-months.csv (100%) rename {toast => leetcode/toast}/six-months.csv (100%) rename {toast => leetcode/toast}/three-months.csv (100%) rename {tokopedia => leetcode/tokopedia}/all.csv (100%) rename {tokopedia => leetcode/tokopedia}/more-than-six-months.csv (100%) rename {tomtom => leetcode/tomtom}/all.csv (100%) rename {tomtom => leetcode/tomtom}/more-than-six-months.csv (100%) rename {tomtom => leetcode/tomtom}/six-months.csv (100%) rename {toptal => leetcode/toptal}/all.csv (100%) rename {toptal => leetcode/toptal}/more-than-six-months.csv (100%) rename {tower-research => leetcode/tower-research}/all.csv (100%) rename {tower-research => leetcode/tower-research}/more-than-six-months.csv (100%) rename {tracxn => leetcode/tracxn}/all.csv (100%) rename {tracxn => leetcode/tracxn}/six-months.csv (100%) rename {traveloka => leetcode/traveloka}/all.csv (100%) rename {traveloka => leetcode/traveloka}/more-than-six-months.csv (100%) rename {traveloka => leetcode/traveloka}/six-months.csv (100%) rename {trexquant => leetcode/trexquant}/all.csv (100%) rename {trexquant => leetcode/trexquant}/more-than-six-months.csv (100%) rename {trilogy => leetcode/trilogy}/all.csv (100%) rename {trilogy => leetcode/trilogy}/more-than-six-months.csv (100%) rename {trilogy => leetcode/trilogy}/six-months.csv (100%) rename {trilogy => leetcode/trilogy}/thirty-days.csv (100%) rename {trilogy => leetcode/trilogy}/three-months.csv (100%) rename {tripadvisor => leetcode/tripadvisor}/all.csv (100%) rename {tripadvisor => leetcode/tripadvisor}/more-than-six-months.csv (100%) rename {tripadvisor => leetcode/tripadvisor}/six-months.csv (100%) rename {triplebyte => leetcode/triplebyte}/all.csv (100%) rename {triplebyte => leetcode/triplebyte}/more-than-six-months.csv (100%) rename {turing => leetcode/turing}/all.csv (100%) rename {turing => leetcode/turing}/more-than-six-months.csv (100%) rename {turing => leetcode/turing}/six-months.csv (100%) rename {turing => leetcode/turing}/three-months.csv (100%) rename {turo => leetcode/turo}/all.csv (100%) rename {turo => leetcode/turo}/more-than-six-months.csv (100%) rename {turvo => leetcode/turvo}/all.csv (100%) rename {turvo => leetcode/turvo}/more-than-six-months.csv (100%) rename {tusimple => leetcode/tusimple}/all.csv (100%) rename {tusimple => leetcode/tusimple}/more-than-six-months.csv (100%) rename {twilio => leetcode/twilio}/all.csv (100%) rename {twilio => leetcode/twilio}/more-than-six-months.csv (100%) rename {twitch => leetcode/twitch}/all.csv (100%) rename {twitch => leetcode/twitch}/more-than-six-months.csv (100%) rename {twitch => leetcode/twitch}/six-months.csv (100%) rename {twitch => leetcode/twitch}/three-months.csv (100%) rename {twitter => leetcode/twitter}/all.csv (100%) rename {twitter => leetcode/twitter}/more-than-six-months.csv (100%) rename {two-sigma => leetcode/two-sigma}/all.csv (100%) rename {two-sigma => leetcode/two-sigma}/more-than-six-months.csv (100%) rename {two-sigma => leetcode/two-sigma}/six-months.csv (100%) rename {uber => leetcode/uber}/all.csv (100%) rename {uber => leetcode/uber}/more-than-six-months.csv (100%) rename {uber => leetcode/uber}/six-months.csv (100%) rename {uber => leetcode/uber}/thirty-days.csv (100%) rename {uber => leetcode/uber}/three-months.csv (100%) rename {ubisoft => leetcode/ubisoft}/all.csv (100%) rename {ubs => leetcode/ubs}/all.csv (100%) rename {ubs => leetcode/ubs}/more-than-six-months.csv (100%) rename {ubs => leetcode/ubs}/six-months.csv (100%) rename {uipath => leetcode/uipath}/all.csv (100%) rename {uipath => leetcode/uipath}/more-than-six-months.csv (100%) rename {uipath => leetcode/uipath}/six-months.csv (100%) rename {uipath => leetcode/uipath}/three-months.csv (100%) rename {ukg => leetcode/ukg}/all.csv (100%) rename {ukg => leetcode/ukg}/more-than-six-months.csv (100%) rename {ukg => leetcode/ukg}/six-months.csv (100%) rename {ukg => leetcode/ukg}/three-months.csv (100%) rename {unbxd => leetcode/unbxd}/all.csv (100%) rename {unbxd => leetcode/unbxd}/more-than-six-months.csv (100%) rename {unity => leetcode/unity}/all.csv (100%) rename {unity => leetcode/unity}/more-than-six-months.csv (100%) rename {unstop => leetcode/unstop}/all.csv (100%) rename {unstop => leetcode/unstop}/more-than-six-months.csv (100%) rename {upstart => leetcode/upstart}/all.csv (100%) rename {upstart => leetcode/upstart}/more-than-six-months.csv (100%) rename {upstart => leetcode/upstart}/six-months.csv (100%) rename {upstart => leetcode/upstart}/three-months.csv (100%) rename {upstox => leetcode/upstox}/all.csv (100%) rename {urban-company => leetcode/urban-company}/all.csv (100%) rename {urban-company => leetcode/urban-company}/more-than-six-months.csv (100%) rename {usaa => leetcode/usaa}/all.csv (100%) rename {usaa => leetcode/usaa}/more-than-six-months.csv (100%) rename {ust => leetcode/ust}/all.csv (100%) rename {ust => leetcode/ust}/more-than-six-months.csv (100%) rename {valve => leetcode/valve}/all.csv (100%) rename {valve => leetcode/valve}/more-than-six-months.csv (100%) rename {valve => leetcode/valve}/six-months.csv (100%) rename {vanguard => leetcode/vanguard}/all.csv (100%) rename {vanguard => leetcode/vanguard}/more-than-six-months.csv (100%) rename {veeva => leetcode/veeva}/all.csv (100%) rename {veeva => leetcode/veeva}/more-than-six-months.csv (100%) rename {verily => leetcode/verily}/all.csv (100%) rename {verily => leetcode/verily}/more-than-six-months.csv (100%) rename {verily => leetcode/verily}/six-months.csv (100%) rename {veritas => leetcode/veritas}/all.csv (100%) rename {veritas => leetcode/veritas}/more-than-six-months.csv (100%) rename {verizon => leetcode/verizon}/all.csv (100%) rename {verizon => leetcode/verizon}/more-than-six-months.csv (100%) rename {verizon => leetcode/verizon}/six-months.csv (100%) rename {verkada => leetcode/verkada}/all.csv (100%) rename {verkada => leetcode/verkada}/more-than-six-months.csv (100%) rename {verkada => leetcode/verkada}/six-months.csv (100%) rename {verkada => leetcode/verkada}/three-months.csv (100%) rename {viasat => leetcode/viasat}/all.csv (100%) rename {viasat => leetcode/viasat}/more-than-six-months.csv (100%) rename {viasat => leetcode/viasat}/six-months.csv (100%) rename {vimeo => leetcode/vimeo}/all.csv (100%) rename {vimeo => leetcode/vimeo}/more-than-six-months.csv (100%) rename {vimeo => leetcode/vimeo}/six-months.csv (100%) rename {vimeo => leetcode/vimeo}/three-months.csv (100%) rename {virtu => leetcode/virtu}/all.csv (100%) rename {virtu => leetcode/virtu}/more-than-six-months.csv (100%) rename {virtu => leetcode/virtu}/six-months.csv (100%) rename {virtu => leetcode/virtu}/three-months.csv (100%) rename {virtusa => leetcode/virtusa}/all.csv (100%) rename {virtusa => leetcode/virtusa}/more-than-six-months.csv (100%) rename {visa => leetcode/visa}/all.csv (100%) rename {visa => leetcode/visa}/more-than-six-months.csv (100%) rename {visa => leetcode/visa}/six-months.csv (100%) rename {visa => leetcode/visa}/three-months.csv (100%) rename {vk => leetcode/vk}/all.csv (100%) rename {vk => leetcode/vk}/more-than-six-months.csv (100%) rename {vk => leetcode/vk}/six-months.csv (100%) rename {vk => leetcode/vk}/three-months.csv (100%) rename {vmware => leetcode/vmware}/all.csv (100%) rename {vmware => leetcode/vmware}/more-than-six-months.csv (100%) rename {walmart-labs => leetcode/walmart-labs}/all.csv (100%) rename {walmart-labs => leetcode/walmart-labs}/more-than-six-months.csv (100%) rename {walmart-labs => leetcode/walmart-labs}/six-months.csv (100%) rename {walmart-labs => leetcode/walmart-labs}/thirty-days.csv (100%) rename {walmart-labs => leetcode/walmart-labs}/three-months.csv (100%) rename {warnermedia => leetcode/warnermedia}/all.csv (100%) rename {warnermedia => leetcode/warnermedia}/more-than-six-months.csv (100%) rename {warnermedia => leetcode/warnermedia}/six-months.csv (100%) rename {warnermedia => leetcode/warnermedia}/three-months.csv (100%) rename {watchguard => leetcode/watchguard}/all.csv (100%) rename {watchguard => leetcode/watchguard}/more-than-six-months.csv (100%) rename {wayfair => leetcode/wayfair}/all.csv (100%) rename {wayfair => leetcode/wayfair}/more-than-six-months.csv (100%) rename {wayfair => leetcode/wayfair}/six-months.csv (100%) rename {waymo => leetcode/waymo}/all.csv (100%) rename {waymo => leetcode/waymo}/more-than-six-months.csv (100%) rename {waymo => leetcode/waymo}/six-months.csv (100%) rename {waymo => leetcode/waymo}/three-months.csv (100%) rename {wayve => leetcode/wayve}/all.csv (100%) rename {wayve => leetcode/wayve}/more-than-six-months.csv (100%) rename {wealthfront => leetcode/wealthfront}/all.csv (100%) rename {wealthfront => leetcode/wealthfront}/more-than-six-months.csv (100%) rename {wells-fargo => leetcode/wells-fargo}/all.csv (100%) rename {wells-fargo => leetcode/wells-fargo}/more-than-six-months.csv (100%) rename {weride => leetcode/weride}/all.csv (100%) rename {weride => leetcode/weride}/more-than-six-months.csv (100%) rename {weride => leetcode/weride}/six-months.csv (100%) rename {weride => leetcode/weride}/three-months.csv (100%) rename {western-digital => leetcode/western-digital}/all.csv (100%) rename {western-digital => leetcode/western-digital}/six-months.csv (100%) rename {whatfix => leetcode/whatfix}/all.csv (100%) rename {whatfix => leetcode/whatfix}/more-than-six-months.csv (100%) rename {whatnot => leetcode/whatnot}/all.csv (100%) rename {whatnot => leetcode/whatnot}/more-than-six-months.csv (100%) rename {whatnot => leetcode/whatnot}/six-months.csv (100%) rename {whatnot => leetcode/whatnot}/three-months.csv (100%) rename {winzo => leetcode/winzo}/all.csv (100%) rename {winzo => leetcode/winzo}/more-than-six-months.csv (100%) rename {wipro => leetcode/wipro}/all.csv (100%) rename {wipro => leetcode/wipro}/more-than-six-months.csv (100%) rename {wipro => leetcode/wipro}/six-months.csv (100%) rename {wipro => leetcode/wipro}/three-months.csv (100%) rename {wise => leetcode/wise}/all.csv (100%) rename {wise => leetcode/wise}/more-than-six-months.csv (100%) rename {wish => leetcode/wish}/all.csv (100%) rename {wish => leetcode/wish}/more-than-six-months.csv (100%) rename {wissen => leetcode/wissen}/all.csv (100%) rename {wissen => leetcode/wissen}/more-than-six-months.csv (100%) rename {wissen => leetcode/wissen}/six-months.csv (100%) rename {wissen => leetcode/wissen}/three-months.csv (100%) rename {wix => leetcode/wix}/all.csv (100%) rename {wix => leetcode/wix}/more-than-six-months.csv (100%) rename {wix => leetcode/wix}/six-months.csv (100%) rename {wix => leetcode/wix}/three-months.csv (100%) rename {workday => leetcode/workday}/all.csv (100%) rename {workday => leetcode/workday}/more-than-six-months.csv (100%) rename {workday => leetcode/workday}/six-months.csv (100%) rename {workday => leetcode/workday}/three-months.csv (100%) rename {works-applications => leetcode/works-applications}/all.csv (100%) rename {works-applications => leetcode/works-applications}/more-than-six-months.csv (100%) rename {worldquant => leetcode/worldquant}/all.csv (100%) rename {worldquant => leetcode/worldquant}/more-than-six-months.csv (100%) rename {worldquant => leetcode/worldquant}/six-months.csv (100%) rename {worldquant => leetcode/worldquant}/three-months.csv (100%) rename {woven-by-toyota => leetcode/woven-by-toyota}/all.csv (100%) rename {woven-by-toyota => leetcode/woven-by-toyota}/six-months.csv (100%) rename {xiaomi => leetcode/xiaomi}/all.csv (100%) rename {xing => leetcode/xing}/all.csv (100%) rename {xing => leetcode/xing}/more-than-six-months.csv (100%) rename {yahoo => leetcode/yahoo}/all.csv (100%) rename {yahoo => leetcode/yahoo}/more-than-six-months.csv (100%) rename {yahoo => leetcode/yahoo}/six-months.csv (100%) rename {yahoo => leetcode/yahoo}/three-months.csv (100%) rename {yandex => leetcode/yandex}/all.csv (100%) rename {yandex => leetcode/yandex}/more-than-six-months.csv (100%) rename {yandex => leetcode/yandex}/six-months.csv (100%) rename {yandex => leetcode/yandex}/thirty-days.csv (100%) rename {yandex => leetcode/yandex}/three-months.csv (100%) rename {yatra => leetcode/yatra}/all.csv (100%) rename {yatra => leetcode/yatra}/more-than-six-months.csv (100%) rename {yelp => leetcode/yelp}/all.csv (100%) rename {yelp => leetcode/yelp}/more-than-six-months.csv (100%) rename {yelp => leetcode/yelp}/six-months.csv (100%) rename {yelp => leetcode/yelp}/three-months.csv (100%) rename {yext => leetcode/yext}/all.csv (100%) rename {yext => leetcode/yext}/more-than-six-months.csv (100%) rename {zalando => leetcode/zalando}/all.csv (100%) rename {zalando => leetcode/zalando}/more-than-six-months.csv (100%) rename {zappos => leetcode/zappos}/all.csv (100%) rename {zappos => leetcode/zappos}/more-than-six-months.csv (100%) rename {zemoso => leetcode/zemoso}/all.csv (100%) rename {zemoso => leetcode/zemoso}/more-than-six-months.csv (100%) rename {zendesk => leetcode/zendesk}/all.csv (100%) rename {zendesk => leetcode/zendesk}/more-than-six-months.csv (100%) rename {zenefits => leetcode/zenefits}/all.csv (100%) rename {zenefits => leetcode/zenefits}/more-than-six-months.csv (100%) rename {zepto => leetcode/zepto}/all.csv (100%) rename {zepto => leetcode/zepto}/more-than-six-months.csv (100%) rename {zepto => leetcode/zepto}/six-months.csv (100%) rename {zeta-suite => leetcode/zeta-suite}/all.csv (100%) rename {zeta-suite => leetcode/zeta-suite}/more-than-six-months.csv (100%) rename {zeta => leetcode/zeta}/all.csv (100%) rename {zeta => leetcode/zeta}/more-than-six-months.csv (100%) rename {zeta => leetcode/zeta}/six-months.csv (100%) rename {zeta => leetcode/zeta}/thirty-days.csv (100%) rename {zeta => leetcode/zeta}/three-months.csv (100%) rename {zillow => leetcode/zillow}/all.csv (100%) rename {zillow => leetcode/zillow}/more-than-six-months.csv (100%) rename {zip => leetcode/zip}/all.csv (100%) rename {zip => leetcode/zip}/more-than-six-months.csv (100%) rename {zip => leetcode/zip}/six-months.csv (100%) rename {zip => leetcode/zip}/three-months.csv (100%) rename {ziprecruiter => leetcode/ziprecruiter}/all.csv (100%) rename {ziprecruiter => leetcode/ziprecruiter}/more-than-six-months.csv (100%) rename {zluri => leetcode/zluri}/all.csv (100%) rename {zluri => leetcode/zluri}/more-than-six-months.csv (100%) rename {zoho => leetcode/zoho}/all.csv (100%) rename {zoho => leetcode/zoho}/more-than-six-months.csv (100%) rename {zoho => leetcode/zoho}/six-months.csv (100%) rename {zoho => leetcode/zoho}/thirty-days.csv (100%) rename {zoho => leetcode/zoho}/three-months.csv (100%) rename {zomato => leetcode/zomato}/all.csv (100%) rename {zomato => leetcode/zomato}/more-than-six-months.csv (100%) rename {zomato => leetcode/zomato}/six-months.csv (100%) rename {zomato => leetcode/zomato}/three-months.csv (100%) rename {zoom => leetcode/zoom}/all.csv (100%) rename {zoom => leetcode/zoom}/more-than-six-months.csv (100%) rename {zoox => leetcode/zoox}/all.csv (100%) rename {zoox => leetcode/zoox}/more-than-six-months.csv (100%) rename {zoox => leetcode/zoox}/six-months.csv (100%) rename {zoox => leetcode/zoox}/three-months.csv (100%) rename {zopsmart => leetcode/zopsmart}/all.csv (100%) rename {zopsmart => leetcode/zopsmart}/more-than-six-months.csv (100%) rename {zopsmart => leetcode/zopsmart}/six-months.csv (100%) rename {zopsmart => leetcode/zopsmart}/three-months.csv (100%) rename {zs-associates => leetcode/zs-associates}/all.csv (100%) rename {zs-associates => leetcode/zs-associates}/more-than-six-months.csv (100%) rename {zs-associates => leetcode/zs-associates}/six-months.csv (100%) rename {zs-associates => leetcode/zs-associates}/three-months.csv (100%) rename {zscaler => leetcode/zscaler}/all.csv (100%) rename {zscaler => leetcode/zscaler}/more-than-six-months.csv (100%) rename {zscaler => leetcode/zscaler}/six-months.csv (100%) rename {zscaler => leetcode/zscaler}/three-months.csv (100%) rename {zynga => leetcode/zynga}/all.csv (100%) rename {zynga => leetcode/zynga}/more-than-six-months.csv (100%) create mode 100644 src/Backend/AppContext.cs create mode 100644 src/Backend/Backend.csproj create mode 100644 src/Backend/Backend.http create mode 100644 src/Backend/Controllers/ProblemsController.cs create mode 100644 src/Backend/Models/Internal/Problem.cs create mode 100644 src/Backend/Models/Public/Problem.cs create mode 100644 src/Backend/Models/Public/QueryParam.cs create mode 100644 src/Backend/Operations/DataProvider.cs create mode 100644 src/Backend/Operations/IFilter.cs create mode 100644 src/Backend/Operations/ProblemFilter.cs create mode 100644 src/Backend/Program.cs create mode 100644 src/Backend/Properties/launchSettings.json create mode 100644 src/Backend/appsettings.Development.json create mode 100644 src/Backend/appsettings.json create mode 100644 src/Common/Common.csproj create mode 100644 src/Common/Models/Problem.cs create mode 100644 src/Common/Models/ProblemSchema.cs create mode 100644 src/Common/Program.cs create mode 100644 src/Synchronizer/Helper.cs create mode 100644 src/Synchronizer/ProblemsProcessor.cs create mode 100644 src/Synchronizer/Program.cs create mode 100644 src/Synchronizer/Synchronizer.csproj diff --git a/.gitignore b/.gitignore index 824a26c..6020982 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ local.properties .settings/ .loadpath .recommenders +obj/ +ZTest/ # External tool builders .externalToolBuilders/ diff --git a/README.md b/README.md index 50f27e6..c15cd2f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +# Wrapper around the leetcode data scrapping + +How to start server: +``` +cd /src/Backend +dotnet run --ApplicationSettings:CosmosDbPrimaryKey --ApplicationInsights:ConnectionString +``` + +--- + # Leetcode Companywise Interview Questions ![leetcode-companywise-interview-questions](https://socialify.git.ci/snehasishroy/leetcode-companywise-interview-questions/image?description=1&font=JetBrains+Mono&forks=1&language=1&name=1&owner=1&pattern=Solid&stargazers=1&theme=Dark) diff --git a/leetcode-wrapper.sln b/leetcode-wrapper.sln new file mode 100644 index 0000000..356a8cc --- /dev/null +++ b/leetcode-wrapper.sln @@ -0,0 +1,36 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "src\Backend\Backend.csproj", "{1A54C3FC-900B-AAEA-3502-101EF4241700}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Synchronizer", "src\Synchronizer\Synchronizer.csproj", "{ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1A54C3FC-900B-AAEA-3502-101EF4241700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A54C3FC-900B-AAEA-3502-101EF4241700}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A54C3FC-900B-AAEA-3502-101EF4241700}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A54C3FC-900B-AAEA-3502-101EF4241700}.Release|Any CPU.Build.0 = Release|Any CPU + {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1A54C3FC-900B-AAEA-3502-101EF4241700} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4616E715-EE81-4855-918C-DC915A5305C3} + EndGlobalSection +EndGlobal diff --git a/1kosmos/all.csv b/leetcode/1kosmos/all.csv similarity index 100% rename from 1kosmos/all.csv rename to leetcode/1kosmos/all.csv diff --git a/1kosmos/more-than-six-months.csv b/leetcode/1kosmos/more-than-six-months.csv similarity index 100% rename from 1kosmos/more-than-six-months.csv rename to leetcode/1kosmos/more-than-six-months.csv diff --git a/6sense/all.csv b/leetcode/6sense/all.csv similarity index 100% rename from 6sense/all.csv rename to leetcode/6sense/all.csv diff --git a/6sense/more-than-six-months.csv b/leetcode/6sense/more-than-six-months.csv similarity index 100% rename from 6sense/more-than-six-months.csv rename to leetcode/6sense/more-than-six-months.csv diff --git a/6sense/six-months.csv b/leetcode/6sense/six-months.csv similarity index 100% rename from 6sense/six-months.csv rename to leetcode/6sense/six-months.csv diff --git a/accelya/all.csv b/leetcode/accelya/all.csv similarity index 100% rename from accelya/all.csv rename to leetcode/accelya/all.csv diff --git a/accelya/more-than-six-months.csv b/leetcode/accelya/more-than-six-months.csv similarity index 100% rename from accelya/more-than-six-months.csv rename to leetcode/accelya/more-than-six-months.csv diff --git a/accenture/all.csv b/leetcode/accenture/all.csv similarity index 100% rename from accenture/all.csv rename to leetcode/accenture/all.csv diff --git a/accenture/more-than-six-months.csv b/leetcode/accenture/more-than-six-months.csv similarity index 100% rename from accenture/more-than-six-months.csv rename to leetcode/accenture/more-than-six-months.csv diff --git a/accenture/six-months.csv b/leetcode/accenture/six-months.csv similarity index 100% rename from accenture/six-months.csv rename to leetcode/accenture/six-months.csv diff --git a/accolite/all.csv b/leetcode/accolite/all.csv similarity index 100% rename from accolite/all.csv rename to leetcode/accolite/all.csv diff --git a/accolite/more-than-six-months.csv b/leetcode/accolite/more-than-six-months.csv similarity index 100% rename from accolite/more-than-six-months.csv rename to leetcode/accolite/more-than-six-months.csv diff --git a/accolite/six-months.csv b/leetcode/accolite/six-months.csv similarity index 100% rename from accolite/six-months.csv rename to leetcode/accolite/six-months.csv diff --git a/accolite/thirty-days.csv b/leetcode/accolite/thirty-days.csv similarity index 100% rename from accolite/thirty-days.csv rename to leetcode/accolite/thirty-days.csv diff --git a/accolite/three-months.csv b/leetcode/accolite/three-months.csv similarity index 100% rename from accolite/three-months.csv rename to leetcode/accolite/three-months.csv diff --git a/acko/all.csv b/leetcode/acko/all.csv similarity index 100% rename from acko/all.csv rename to leetcode/acko/all.csv diff --git a/acko/more-than-six-months.csv b/leetcode/acko/more-than-six-months.csv similarity index 100% rename from acko/more-than-six-months.csv rename to leetcode/acko/more-than-six-months.csv diff --git a/acorns/all.csv b/leetcode/acorns/all.csv similarity index 100% rename from acorns/all.csv rename to leetcode/acorns/all.csv diff --git a/activision/all.csv b/leetcode/activision/all.csv similarity index 100% rename from activision/all.csv rename to leetcode/activision/all.csv diff --git a/activision/more-than-six-months.csv b/leetcode/activision/more-than-six-months.csv similarity index 100% rename from activision/more-than-six-months.csv rename to leetcode/activision/more-than-six-months.csv diff --git a/activision/six-months.csv b/leetcode/activision/six-months.csv similarity index 100% rename from activision/six-months.csv rename to leetcode/activision/six-months.csv diff --git a/addepar/all.csv b/leetcode/addepar/all.csv similarity index 100% rename from addepar/all.csv rename to leetcode/addepar/all.csv diff --git a/addepar/more-than-six-months.csv b/leetcode/addepar/more-than-six-months.csv similarity index 100% rename from addepar/more-than-six-months.csv rename to leetcode/addepar/more-than-six-months.csv diff --git a/adobe/all.csv b/leetcode/adobe/all.csv similarity index 100% rename from adobe/all.csv rename to leetcode/adobe/all.csv diff --git a/adobe/more-than-six-months.csv b/leetcode/adobe/more-than-six-months.csv similarity index 100% rename from adobe/more-than-six-months.csv rename to leetcode/adobe/more-than-six-months.csv diff --git a/adobe/six-months.csv b/leetcode/adobe/six-months.csv similarity index 100% rename from adobe/six-months.csv rename to leetcode/adobe/six-months.csv diff --git a/adobe/thirty-days.csv b/leetcode/adobe/thirty-days.csv similarity index 100% rename from adobe/thirty-days.csv rename to leetcode/adobe/thirty-days.csv diff --git a/adobe/three-months.csv b/leetcode/adobe/three-months.csv similarity index 100% rename from adobe/three-months.csv rename to leetcode/adobe/three-months.csv diff --git a/adp/all.csv b/leetcode/adp/all.csv similarity index 100% rename from adp/all.csv rename to leetcode/adp/all.csv diff --git a/adp/six-months.csv b/leetcode/adp/six-months.csv similarity index 100% rename from adp/six-months.csv rename to leetcode/adp/six-months.csv diff --git a/aetion/all.csv b/leetcode/aetion/all.csv similarity index 100% rename from aetion/all.csv rename to leetcode/aetion/all.csv diff --git a/aetion/more-than-six-months.csv b/leetcode/aetion/more-than-six-months.csv similarity index 100% rename from aetion/more-than-six-months.csv rename to leetcode/aetion/more-than-six-months.csv diff --git a/affinity/all.csv b/leetcode/affinity/all.csv similarity index 100% rename from affinity/all.csv rename to leetcode/affinity/all.csv diff --git a/affinity/more-than-six-months.csv b/leetcode/affinity/more-than-six-months.csv similarity index 100% rename from affinity/more-than-six-months.csv rename to leetcode/affinity/more-than-six-months.csv diff --git a/affirm/all.csv b/leetcode/affirm/all.csv similarity index 100% rename from affirm/all.csv rename to leetcode/affirm/all.csv diff --git a/affirm/more-than-six-months.csv b/leetcode/affirm/more-than-six-months.csv similarity index 100% rename from affirm/more-than-six-months.csv rename to leetcode/affirm/more-than-six-months.csv diff --git a/affirm/six-months.csv b/leetcode/affirm/six-months.csv similarity index 100% rename from affirm/six-months.csv rename to leetcode/affirm/six-months.csv diff --git a/affirm/three-months.csv b/leetcode/affirm/three-months.csv similarity index 100% rename from affirm/three-months.csv rename to leetcode/affirm/three-months.csv diff --git a/agoda/all.csv b/leetcode/agoda/all.csv similarity index 100% rename from agoda/all.csv rename to leetcode/agoda/all.csv diff --git a/agoda/more-than-six-months.csv b/leetcode/agoda/more-than-six-months.csv similarity index 100% rename from agoda/more-than-six-months.csv rename to leetcode/agoda/more-than-six-months.csv diff --git a/agoda/six-months.csv b/leetcode/agoda/six-months.csv similarity index 100% rename from agoda/six-months.csv rename to leetcode/agoda/six-months.csv diff --git a/agoda/three-months.csv b/leetcode/agoda/three-months.csv similarity index 100% rename from agoda/three-months.csv rename to leetcode/agoda/three-months.csv diff --git a/airbnb/all.csv b/leetcode/airbnb/all.csv similarity index 100% rename from airbnb/all.csv rename to leetcode/airbnb/all.csv diff --git a/airbnb/more-than-six-months.csv b/leetcode/airbnb/more-than-six-months.csv similarity index 100% rename from airbnb/more-than-six-months.csv rename to leetcode/airbnb/more-than-six-months.csv diff --git a/airbnb/six-months.csv b/leetcode/airbnb/six-months.csv similarity index 100% rename from airbnb/six-months.csv rename to leetcode/airbnb/six-months.csv diff --git a/airbnb/thirty-days.csv b/leetcode/airbnb/thirty-days.csv similarity index 100% rename from airbnb/thirty-days.csv rename to leetcode/airbnb/thirty-days.csv diff --git a/airbnb/three-months.csv b/leetcode/airbnb/three-months.csv similarity index 100% rename from airbnb/three-months.csv rename to leetcode/airbnb/three-months.csv diff --git a/airbus/all.csv b/leetcode/airbus/all.csv similarity index 100% rename from airbus/all.csv rename to leetcode/airbus/all.csv diff --git a/airbus/more-than-six-months.csv b/leetcode/airbus/more-than-six-months.csv similarity index 100% rename from airbus/more-than-six-months.csv rename to leetcode/airbus/more-than-six-months.csv diff --git a/airbus/six-months.csv b/leetcode/airbus/six-months.csv similarity index 100% rename from airbus/six-months.csv rename to leetcode/airbus/six-months.csv diff --git a/airbus/three-months.csv b/leetcode/airbus/three-months.csv similarity index 100% rename from airbus/three-months.csv rename to leetcode/airbus/three-months.csv diff --git a/airtel/all.csv b/leetcode/airtel/all.csv similarity index 100% rename from airtel/all.csv rename to leetcode/airtel/all.csv diff --git a/airtel/more-than-six-months.csv b/leetcode/airtel/more-than-six-months.csv similarity index 100% rename from airtel/more-than-six-months.csv rename to leetcode/airtel/more-than-six-months.csv diff --git a/airtel/six-months.csv b/leetcode/airtel/six-months.csv similarity index 100% rename from airtel/six-months.csv rename to leetcode/airtel/six-months.csv diff --git a/airwallex/all.csv b/leetcode/airwallex/all.csv similarity index 100% rename from airwallex/all.csv rename to leetcode/airwallex/all.csv diff --git a/airwallex/more-than-six-months.csv b/leetcode/airwallex/more-than-six-months.csv similarity index 100% rename from airwallex/more-than-six-months.csv rename to leetcode/airwallex/more-than-six-months.csv diff --git a/akamai/all.csv b/leetcode/akamai/all.csv similarity index 100% rename from akamai/all.csv rename to leetcode/akamai/all.csv diff --git a/akamai/more-than-six-months.csv b/leetcode/akamai/more-than-six-months.csv similarity index 100% rename from akamai/more-than-six-months.csv rename to leetcode/akamai/more-than-six-months.csv diff --git a/akuna-capital/all.csv b/leetcode/akuna-capital/all.csv similarity index 100% rename from akuna-capital/all.csv rename to leetcode/akuna-capital/all.csv diff --git a/akuna-capital/more-than-six-months.csv b/leetcode/akuna-capital/more-than-six-months.csv similarity index 100% rename from akuna-capital/more-than-six-months.csv rename to leetcode/akuna-capital/more-than-six-months.csv diff --git a/akuna-capital/six-months.csv b/leetcode/akuna-capital/six-months.csv similarity index 100% rename from akuna-capital/six-months.csv rename to leetcode/akuna-capital/six-months.csv diff --git a/akuna-capital/three-months.csv b/leetcode/akuna-capital/three-months.csv similarity index 100% rename from akuna-capital/three-months.csv rename to leetcode/akuna-capital/three-months.csv diff --git a/alibaba/all.csv b/leetcode/alibaba/all.csv similarity index 100% rename from alibaba/all.csv rename to leetcode/alibaba/all.csv diff --git a/alibaba/more-than-six-months.csv b/leetcode/alibaba/more-than-six-months.csv similarity index 100% rename from alibaba/more-than-six-months.csv rename to leetcode/alibaba/more-than-six-months.csv diff --git a/allincall/all.csv b/leetcode/allincall/all.csv similarity index 100% rename from allincall/all.csv rename to leetcode/allincall/all.csv diff --git a/allincall/more-than-six-months.csv b/leetcode/allincall/more-than-six-months.csv similarity index 100% rename from allincall/more-than-six-months.csv rename to leetcode/allincall/more-than-six-months.csv diff --git a/alphagrep/all.csv b/leetcode/alphagrep/all.csv similarity index 100% rename from alphagrep/all.csv rename to leetcode/alphagrep/all.csv diff --git a/alphagrep/more-than-six-months.csv b/leetcode/alphagrep/more-than-six-months.csv similarity index 100% rename from alphagrep/more-than-six-months.csv rename to leetcode/alphagrep/more-than-six-months.csv diff --git a/alphonso/all.csv b/leetcode/alphonso/all.csv similarity index 100% rename from alphonso/all.csv rename to leetcode/alphonso/all.csv diff --git a/alphonso/more-than-six-months.csv b/leetcode/alphonso/more-than-six-months.csv similarity index 100% rename from alphonso/more-than-six-months.csv rename to leetcode/alphonso/more-than-six-months.csv diff --git a/alten/all.csv b/leetcode/alten/all.csv similarity index 100% rename from alten/all.csv rename to leetcode/alten/all.csv diff --git a/altimetrik/all.csv b/leetcode/altimetrik/all.csv similarity index 100% rename from altimetrik/all.csv rename to leetcode/altimetrik/all.csv diff --git a/altimetrik/more-than-six-months.csv b/leetcode/altimetrik/more-than-six-months.csv similarity index 100% rename from altimetrik/more-than-six-months.csv rename to leetcode/altimetrik/more-than-six-months.csv diff --git a/amadeus/all.csv b/leetcode/amadeus/all.csv similarity index 100% rename from amadeus/all.csv rename to leetcode/amadeus/all.csv diff --git a/amadeus/more-than-six-months.csv b/leetcode/amadeus/more-than-six-months.csv similarity index 100% rename from amadeus/more-than-six-months.csv rename to leetcode/amadeus/more-than-six-months.csv diff --git a/amazon/all.csv b/leetcode/amazon/all.csv similarity index 100% rename from amazon/all.csv rename to leetcode/amazon/all.csv diff --git a/amazon/more-than-six-months.csv b/leetcode/amazon/more-than-six-months.csv similarity index 100% rename from amazon/more-than-six-months.csv rename to leetcode/amazon/more-than-six-months.csv diff --git a/amazon/six-months.csv b/leetcode/amazon/six-months.csv similarity index 100% rename from amazon/six-months.csv rename to leetcode/amazon/six-months.csv diff --git a/amazon/thirty-days.csv b/leetcode/amazon/thirty-days.csv similarity index 100% rename from amazon/thirty-days.csv rename to leetcode/amazon/thirty-days.csv diff --git a/amazon/three-months.csv b/leetcode/amazon/three-months.csv similarity index 100% rename from amazon/three-months.csv rename to leetcode/amazon/three-months.csv diff --git a/amd/all.csv b/leetcode/amd/all.csv similarity index 100% rename from amd/all.csv rename to leetcode/amd/all.csv diff --git a/amd/more-than-six-months.csv b/leetcode/amd/more-than-six-months.csv similarity index 100% rename from amd/more-than-six-months.csv rename to leetcode/amd/more-than-six-months.csv diff --git a/amd/six-months.csv b/leetcode/amd/six-months.csv similarity index 100% rename from amd/six-months.csv rename to leetcode/amd/six-months.csv diff --git a/amdocs/all.csv b/leetcode/amdocs/all.csv similarity index 100% rename from amdocs/all.csv rename to leetcode/amdocs/all.csv diff --git a/amdocs/more-than-six-months.csv b/leetcode/amdocs/more-than-six-months.csv similarity index 100% rename from amdocs/more-than-six-months.csv rename to leetcode/amdocs/more-than-six-months.csv diff --git a/american-airlines/all.csv b/leetcode/american-airlines/all.csv similarity index 100% rename from american-airlines/all.csv rename to leetcode/american-airlines/all.csv diff --git a/american-express/all.csv b/leetcode/american-express/all.csv similarity index 100% rename from american-express/all.csv rename to leetcode/american-express/all.csv diff --git a/american-express/more-than-six-months.csv b/leetcode/american-express/more-than-six-months.csv similarity index 100% rename from american-express/more-than-six-months.csv rename to leetcode/american-express/more-than-six-months.csv diff --git a/american-express/six-months.csv b/leetcode/american-express/six-months.csv similarity index 100% rename from american-express/six-months.csv rename to leetcode/american-express/six-months.csv diff --git a/american-express/three-months.csv b/leetcode/american-express/three-months.csv similarity index 100% rename from american-express/three-months.csv rename to leetcode/american-express/three-months.csv diff --git a/amplitude/all.csv b/leetcode/amplitude/all.csv similarity index 100% rename from amplitude/all.csv rename to leetcode/amplitude/all.csv diff --git a/analytics-quotient/all.csv b/leetcode/analytics-quotient/all.csv similarity index 100% rename from analytics-quotient/all.csv rename to leetcode/analytics-quotient/all.csv diff --git a/analytics-quotient/more-than-six-months.csv b/leetcode/analytics-quotient/more-than-six-months.csv similarity index 100% rename from analytics-quotient/more-than-six-months.csv rename to leetcode/analytics-quotient/more-than-six-months.csv diff --git a/andela/all.csv b/leetcode/andela/all.csv similarity index 100% rename from andela/all.csv rename to leetcode/andela/all.csv diff --git a/andela/more-than-six-months.csv b/leetcode/andela/more-than-six-months.csv similarity index 100% rename from andela/more-than-six-months.csv rename to leetcode/andela/more-than-six-months.csv diff --git a/anduril/all.csv b/leetcode/anduril/all.csv similarity index 100% rename from anduril/all.csv rename to leetcode/anduril/all.csv diff --git a/anduril/more-than-six-months.csv b/leetcode/anduril/more-than-six-months.csv similarity index 100% rename from anduril/more-than-six-months.csv rename to leetcode/anduril/more-than-six-months.csv diff --git a/anduril/six-months.csv b/leetcode/anduril/six-months.csv similarity index 100% rename from anduril/six-months.csv rename to leetcode/anduril/six-months.csv diff --git a/anduril/thirty-days.csv b/leetcode/anduril/thirty-days.csv similarity index 100% rename from anduril/thirty-days.csv rename to leetcode/anduril/thirty-days.csv diff --git a/anduril/three-months.csv b/leetcode/anduril/three-months.csv similarity index 100% rename from anduril/three-months.csv rename to leetcode/anduril/three-months.csv diff --git a/anthropic/all.csv b/leetcode/anthropic/all.csv similarity index 100% rename from anthropic/all.csv rename to leetcode/anthropic/all.csv diff --git a/anthropic/more-than-six-months.csv b/leetcode/anthropic/more-than-six-months.csv similarity index 100% rename from anthropic/more-than-six-months.csv rename to leetcode/anthropic/more-than-six-months.csv diff --git a/anthropic/six-months.csv b/leetcode/anthropic/six-months.csv similarity index 100% rename from anthropic/six-months.csv rename to leetcode/anthropic/six-months.csv diff --git a/anthropic/thirty-days.csv b/leetcode/anthropic/thirty-days.csv similarity index 100% rename from anthropic/thirty-days.csv rename to leetcode/anthropic/thirty-days.csv diff --git a/anthropic/three-months.csv b/leetcode/anthropic/three-months.csv similarity index 100% rename from anthropic/three-months.csv rename to leetcode/anthropic/three-months.csv diff --git a/anyscale/all.csv b/leetcode/anyscale/all.csv similarity index 100% rename from anyscale/all.csv rename to leetcode/anyscale/all.csv diff --git a/anyscale/more-than-six-months.csv b/leetcode/anyscale/more-than-six-months.csv similarity index 100% rename from anyscale/more-than-six-months.csv rename to leetcode/anyscale/more-than-six-months.csv diff --git a/anyscale/six-months.csv b/leetcode/anyscale/six-months.csv similarity index 100% rename from anyscale/six-months.csv rename to leetcode/anyscale/six-months.csv diff --git a/aon/all.csv b/leetcode/aon/all.csv similarity index 100% rename from aon/all.csv rename to leetcode/aon/all.csv diff --git a/aon/more-than-six-months.csv b/leetcode/aon/more-than-six-months.csv similarity index 100% rename from aon/more-than-six-months.csv rename to leetcode/aon/more-than-six-months.csv diff --git a/apna/all.csv b/leetcode/apna/all.csv similarity index 100% rename from apna/all.csv rename to leetcode/apna/all.csv diff --git a/apna/more-than-six-months.csv b/leetcode/apna/more-than-six-months.csv similarity index 100% rename from apna/more-than-six-months.csv rename to leetcode/apna/more-than-six-months.csv diff --git a/apolloio/all.csv b/leetcode/apolloio/all.csv similarity index 100% rename from apolloio/all.csv rename to leetcode/apolloio/all.csv diff --git a/apolloio/more-than-six-months.csv b/leetcode/apolloio/more-than-six-months.csv similarity index 100% rename from apolloio/more-than-six-months.csv rename to leetcode/apolloio/more-than-six-months.csv diff --git a/appdynamics/all.csv b/leetcode/appdynamics/all.csv similarity index 100% rename from appdynamics/all.csv rename to leetcode/appdynamics/all.csv diff --git a/appdynamics/more-than-six-months.csv b/leetcode/appdynamics/more-than-six-months.csv similarity index 100% rename from appdynamics/more-than-six-months.csv rename to leetcode/appdynamics/more-than-six-months.csv diff --git a/appfolio/all.csv b/leetcode/appfolio/all.csv similarity index 100% rename from appfolio/all.csv rename to leetcode/appfolio/all.csv diff --git a/appfolio/more-than-six-months.csv b/leetcode/appfolio/more-than-six-months.csv similarity index 100% rename from appfolio/more-than-six-months.csv rename to leetcode/appfolio/more-than-six-months.csv diff --git a/apple/all.csv b/leetcode/apple/all.csv similarity index 100% rename from apple/all.csv rename to leetcode/apple/all.csv diff --git a/apple/more-than-six-months.csv b/leetcode/apple/more-than-six-months.csv similarity index 100% rename from apple/more-than-six-months.csv rename to leetcode/apple/more-than-six-months.csv diff --git a/apple/six-months.csv b/leetcode/apple/six-months.csv similarity index 100% rename from apple/six-months.csv rename to leetcode/apple/six-months.csv diff --git a/apple/thirty-days.csv b/leetcode/apple/thirty-days.csv similarity index 100% rename from apple/thirty-days.csv rename to leetcode/apple/thirty-days.csv diff --git a/apple/three-months.csv b/leetcode/apple/three-months.csv similarity index 100% rename from apple/three-months.csv rename to leetcode/apple/three-months.csv diff --git a/applied-intuition/all.csv b/leetcode/applied-intuition/all.csv similarity index 100% rename from applied-intuition/all.csv rename to leetcode/applied-intuition/all.csv diff --git a/applied-intuition/more-than-six-months.csv b/leetcode/applied-intuition/more-than-six-months.csv similarity index 100% rename from applied-intuition/more-than-six-months.csv rename to leetcode/applied-intuition/more-than-six-months.csv diff --git a/applied-intuition/six-months.csv b/leetcode/applied-intuition/six-months.csv similarity index 100% rename from applied-intuition/six-months.csv rename to leetcode/applied-intuition/six-months.csv diff --git a/applied-intuition/thirty-days.csv b/leetcode/applied-intuition/thirty-days.csv similarity index 100% rename from applied-intuition/thirty-days.csv rename to leetcode/applied-intuition/thirty-days.csv diff --git a/applied-intuition/three-months.csv b/leetcode/applied-intuition/three-months.csv similarity index 100% rename from applied-intuition/three-months.csv rename to leetcode/applied-intuition/three-months.csv diff --git a/applovin/all.csv b/leetcode/applovin/all.csv similarity index 100% rename from applovin/all.csv rename to leetcode/applovin/all.csv diff --git a/applovin/more-than-six-months.csv b/leetcode/applovin/more-than-six-months.csv similarity index 100% rename from applovin/more-than-six-months.csv rename to leetcode/applovin/more-than-six-months.csv diff --git a/appviewx/all.csv b/leetcode/appviewx/all.csv similarity index 100% rename from appviewx/all.csv rename to leetcode/appviewx/all.csv diff --git a/appviewx/more-than-six-months.csv b/leetcode/appviewx/more-than-six-months.csv similarity index 100% rename from appviewx/more-than-six-months.csv rename to leetcode/appviewx/more-than-six-months.csv diff --git a/aqr-capital-management-llc/all.csv b/leetcode/aqr-capital-management-llc/all.csv similarity index 100% rename from aqr-capital-management-llc/all.csv rename to leetcode/aqr-capital-management-llc/all.csv diff --git a/aqr-capital-management-llc/more-than-six-months.csv b/leetcode/aqr-capital-management-llc/more-than-six-months.csv similarity index 100% rename from aqr-capital-management-llc/more-than-six-months.csv rename to leetcode/aqr-capital-management-llc/more-than-six-months.csv diff --git a/arcesium/all.csv b/leetcode/arcesium/all.csv similarity index 100% rename from arcesium/all.csv rename to leetcode/arcesium/all.csv diff --git a/arcesium/more-than-six-months.csv b/leetcode/arcesium/more-than-six-months.csv similarity index 100% rename from arcesium/more-than-six-months.csv rename to leetcode/arcesium/more-than-six-months.csv diff --git a/argo-ai/all.csv b/leetcode/argo-ai/all.csv similarity index 100% rename from argo-ai/all.csv rename to leetcode/argo-ai/all.csv diff --git a/argo-ai/six-months.csv b/leetcode/argo-ai/six-months.csv similarity index 100% rename from argo-ai/six-months.csv rename to leetcode/argo-ai/six-months.csv diff --git a/argo-ai/three-months.csv b/leetcode/argo-ai/three-months.csv similarity index 100% rename from argo-ai/three-months.csv rename to leetcode/argo-ai/three-months.csv diff --git a/arista-networks/all.csv b/leetcode/arista-networks/all.csv similarity index 100% rename from arista-networks/all.csv rename to leetcode/arista-networks/all.csv diff --git a/arista-networks/more-than-six-months.csv b/leetcode/arista-networks/more-than-six-months.csv similarity index 100% rename from arista-networks/more-than-six-months.csv rename to leetcode/arista-networks/more-than-six-months.csv diff --git a/arista-networks/six-months.csv b/leetcode/arista-networks/six-months.csv similarity index 100% rename from arista-networks/six-months.csv rename to leetcode/arista-networks/six-months.csv diff --git a/arista-networks/three-months.csv b/leetcode/arista-networks/three-months.csv similarity index 100% rename from arista-networks/three-months.csv rename to leetcode/arista-networks/three-months.csv diff --git a/arm/all.csv b/leetcode/arm/all.csv similarity index 100% rename from arm/all.csv rename to leetcode/arm/all.csv diff --git a/arm/more-than-six-months.csv b/leetcode/arm/more-than-six-months.csv similarity index 100% rename from arm/more-than-six-months.csv rename to leetcode/arm/more-than-six-months.csv diff --git a/asana/all.csv b/leetcode/asana/all.csv similarity index 100% rename from asana/all.csv rename to leetcode/asana/all.csv diff --git a/asana/more-than-six-months.csv b/leetcode/asana/more-than-six-months.csv similarity index 100% rename from asana/more-than-six-months.csv rename to leetcode/asana/more-than-six-months.csv diff --git a/asana/six-months.csv b/leetcode/asana/six-months.csv similarity index 100% rename from asana/six-months.csv rename to leetcode/asana/six-months.csv diff --git a/ascend/all.csv b/leetcode/ascend/all.csv similarity index 100% rename from ascend/all.csv rename to leetcode/ascend/all.csv diff --git a/ascend/more-than-six-months.csv b/leetcode/ascend/more-than-six-months.csv similarity index 100% rename from ascend/more-than-six-months.csv rename to leetcode/ascend/more-than-six-months.csv diff --git a/asus/all.csv b/leetcode/asus/all.csv similarity index 100% rename from asus/all.csv rename to leetcode/asus/all.csv diff --git a/asus/more-than-six-months.csv b/leetcode/asus/more-than-six-months.csv similarity index 100% rename from asus/more-than-six-months.csv rename to leetcode/asus/more-than-six-months.csv diff --git a/at-t/all.csv b/leetcode/at-t/all.csv similarity index 100% rename from at-t/all.csv rename to leetcode/at-t/all.csv diff --git a/at-t/six-months.csv b/leetcode/at-t/six-months.csv similarity index 100% rename from at-t/six-months.csv rename to leetcode/at-t/six-months.csv diff --git a/athenahealth/all.csv b/leetcode/athenahealth/all.csv similarity index 100% rename from athenahealth/all.csv rename to leetcode/athenahealth/all.csv diff --git a/athenahealth/more-than-six-months.csv b/leetcode/athenahealth/more-than-six-months.csv similarity index 100% rename from athenahealth/more-than-six-months.csv rename to leetcode/athenahealth/more-than-six-months.csv diff --git a/athenahealth/six-months.csv b/leetcode/athenahealth/six-months.csv similarity index 100% rename from athenahealth/six-months.csv rename to leetcode/athenahealth/six-months.csv diff --git a/athenahealth/three-months.csv b/leetcode/athenahealth/three-months.csv similarity index 100% rename from athenahealth/three-months.csv rename to leetcode/athenahealth/three-months.csv diff --git a/atlassian/all.csv b/leetcode/atlassian/all.csv similarity index 100% rename from atlassian/all.csv rename to leetcode/atlassian/all.csv diff --git a/atlassian/more-than-six-months.csv b/leetcode/atlassian/more-than-six-months.csv similarity index 100% rename from atlassian/more-than-six-months.csv rename to leetcode/atlassian/more-than-six-months.csv diff --git a/atlassian/six-months.csv b/leetcode/atlassian/six-months.csv similarity index 100% rename from atlassian/six-months.csv rename to leetcode/atlassian/six-months.csv diff --git a/atlassian/thirty-days.csv b/leetcode/atlassian/thirty-days.csv similarity index 100% rename from atlassian/thirty-days.csv rename to leetcode/atlassian/thirty-days.csv diff --git a/atlassian/three-months.csv b/leetcode/atlassian/three-months.csv similarity index 100% rename from atlassian/three-months.csv rename to leetcode/atlassian/three-months.csv diff --git a/attentive/all.csv b/leetcode/attentive/all.csv similarity index 100% rename from attentive/all.csv rename to leetcode/attentive/all.csv diff --git a/attentive/more-than-six-months.csv b/leetcode/attentive/more-than-six-months.csv similarity index 100% rename from attentive/more-than-six-months.csv rename to leetcode/attentive/more-than-six-months.csv diff --git a/attentive/six-months.csv b/leetcode/attentive/six-months.csv similarity index 100% rename from attentive/six-months.csv rename to leetcode/attentive/six-months.csv diff --git a/attentive/three-months.csv b/leetcode/attentive/three-months.csv similarity index 100% rename from attentive/three-months.csv rename to leetcode/attentive/three-months.csv diff --git a/audible/all.csv b/leetcode/audible/all.csv similarity index 100% rename from audible/all.csv rename to leetcode/audible/all.csv diff --git a/audible/more-than-six-months.csv b/leetcode/audible/more-than-six-months.csv similarity index 100% rename from audible/more-than-six-months.csv rename to leetcode/audible/more-than-six-months.csv diff --git a/auriga/all.csv b/leetcode/auriga/all.csv similarity index 100% rename from auriga/all.csv rename to leetcode/auriga/all.csv diff --git a/auriga/more-than-six-months.csv b/leetcode/auriga/more-than-six-months.csv similarity index 100% rename from auriga/more-than-six-months.csv rename to leetcode/auriga/more-than-six-months.csv diff --git a/aurora/all.csv b/leetcode/aurora/all.csv similarity index 100% rename from aurora/all.csv rename to leetcode/aurora/all.csv diff --git a/aurora/more-than-six-months.csv b/leetcode/aurora/more-than-six-months.csv similarity index 100% rename from aurora/more-than-six-months.csv rename to leetcode/aurora/more-than-six-months.csv diff --git a/aurora/six-months.csv b/leetcode/aurora/six-months.csv similarity index 100% rename from aurora/six-months.csv rename to leetcode/aurora/six-months.csv diff --git a/aurora/three-months.csv b/leetcode/aurora/three-months.csv similarity index 100% rename from aurora/three-months.csv rename to leetcode/aurora/three-months.csv diff --git a/autodesk/all.csv b/leetcode/autodesk/all.csv similarity index 100% rename from autodesk/all.csv rename to leetcode/autodesk/all.csv diff --git a/autodesk/more-than-six-months.csv b/leetcode/autodesk/more-than-six-months.csv similarity index 100% rename from autodesk/more-than-six-months.csv rename to leetcode/autodesk/more-than-six-months.csv diff --git a/autodesk/six-months.csv b/leetcode/autodesk/six-months.csv similarity index 100% rename from autodesk/six-months.csv rename to leetcode/autodesk/six-months.csv diff --git a/autodesk/thirty-days.csv b/leetcode/autodesk/thirty-days.csv similarity index 100% rename from autodesk/thirty-days.csv rename to leetcode/autodesk/thirty-days.csv diff --git a/autodesk/three-months.csv b/leetcode/autodesk/three-months.csv similarity index 100% rename from autodesk/three-months.csv rename to leetcode/autodesk/three-months.csv diff --git a/avalara/all.csv b/leetcode/avalara/all.csv similarity index 100% rename from avalara/all.csv rename to leetcode/avalara/all.csv diff --git a/avalara/more-than-six-months.csv b/leetcode/avalara/more-than-six-months.csv similarity index 100% rename from avalara/more-than-six-months.csv rename to leetcode/avalara/more-than-six-months.csv diff --git a/avito/all.csv b/leetcode/avito/all.csv similarity index 100% rename from avito/all.csv rename to leetcode/avito/all.csv diff --git a/avito/more-than-six-months.csv b/leetcode/avito/more-than-six-months.csv similarity index 100% rename from avito/more-than-six-months.csv rename to leetcode/avito/more-than-six-months.csv diff --git a/avito/six-months.csv b/leetcode/avito/six-months.csv similarity index 100% rename from avito/six-months.csv rename to leetcode/avito/six-months.csv diff --git a/axis-bank/all.csv b/leetcode/axis-bank/all.csv similarity index 100% rename from axis-bank/all.csv rename to leetcode/axis-bank/all.csv diff --git a/axis-bank/six-months.csv b/leetcode/axis-bank/six-months.csv similarity index 100% rename from axis-bank/six-months.csv rename to leetcode/axis-bank/six-months.csv diff --git a/axon/all.csv b/leetcode/axon/all.csv similarity index 100% rename from axon/all.csv rename to leetcode/axon/all.csv diff --git a/axon/more-than-six-months.csv b/leetcode/axon/more-than-six-months.csv similarity index 100% rename from axon/more-than-six-months.csv rename to leetcode/axon/more-than-six-months.csv diff --git a/axon/six-months.csv b/leetcode/axon/six-months.csv similarity index 100% rename from axon/six-months.csv rename to leetcode/axon/six-months.csv diff --git a/axon/thirty-days.csv b/leetcode/axon/thirty-days.csv similarity index 100% rename from axon/thirty-days.csv rename to leetcode/axon/thirty-days.csv diff --git a/axon/three-months.csv b/leetcode/axon/three-months.csv similarity index 100% rename from axon/three-months.csv rename to leetcode/axon/three-months.csv diff --git a/baidu/all.csv b/leetcode/baidu/all.csv similarity index 100% rename from baidu/all.csv rename to leetcode/baidu/all.csv diff --git a/baidu/more-than-six-months.csv b/leetcode/baidu/more-than-six-months.csv similarity index 100% rename from baidu/more-than-six-months.csv rename to leetcode/baidu/more-than-six-months.csv diff --git a/bank-of-america/all.csv b/leetcode/bank-of-america/all.csv similarity index 100% rename from bank-of-america/all.csv rename to leetcode/bank-of-america/all.csv diff --git a/bank-of-america/more-than-six-months.csv b/leetcode/bank-of-america/more-than-six-months.csv similarity index 100% rename from bank-of-america/more-than-six-months.csv rename to leetcode/bank-of-america/more-than-six-months.csv diff --git a/barclays/all.csv b/leetcode/barclays/all.csv similarity index 100% rename from barclays/all.csv rename to leetcode/barclays/all.csv diff --git a/barclays/more-than-six-months.csv b/leetcode/barclays/more-than-six-months.csv similarity index 100% rename from barclays/more-than-six-months.csv rename to leetcode/barclays/more-than-six-months.csv diff --git a/barclays/six-months.csv b/leetcode/barclays/six-months.csv similarity index 100% rename from barclays/six-months.csv rename to leetcode/barclays/six-months.csv diff --git a/bcg/all.csv b/leetcode/bcg/all.csv similarity index 100% rename from bcg/all.csv rename to leetcode/bcg/all.csv diff --git a/bcg/six-months.csv b/leetcode/bcg/six-months.csv similarity index 100% rename from bcg/six-months.csv rename to leetcode/bcg/six-months.csv diff --git a/bentley-systems/all.csv b/leetcode/bentley-systems/all.csv similarity index 100% rename from bentley-systems/all.csv rename to leetcode/bentley-systems/all.csv diff --git a/bentley-systems/more-than-six-months.csv b/leetcode/bentley-systems/more-than-six-months.csv similarity index 100% rename from bentley-systems/more-than-six-months.csv rename to leetcode/bentley-systems/more-than-six-months.csv diff --git a/bharatpe/all.csv b/leetcode/bharatpe/all.csv similarity index 100% rename from bharatpe/all.csv rename to leetcode/bharatpe/all.csv diff --git a/bharatpe/more-than-six-months.csv b/leetcode/bharatpe/more-than-six-months.csv similarity index 100% rename from bharatpe/more-than-six-months.csv rename to leetcode/bharatpe/more-than-six-months.csv diff --git a/bidgely/all.csv b/leetcode/bidgely/all.csv similarity index 100% rename from bidgely/all.csv rename to leetcode/bidgely/all.csv diff --git a/bidgely/more-than-six-months.csv b/leetcode/bidgely/more-than-six-months.csv similarity index 100% rename from bidgely/more-than-six-months.csv rename to leetcode/bidgely/more-than-six-months.csv diff --git a/billcom/all.csv b/leetcode/billcom/all.csv similarity index 100% rename from billcom/all.csv rename to leetcode/billcom/all.csv diff --git a/billcom/more-than-six-months.csv b/leetcode/billcom/more-than-six-months.csv similarity index 100% rename from billcom/more-than-six-months.csv rename to leetcode/billcom/more-than-six-months.csv diff --git a/bitgo/all.csv b/leetcode/bitgo/all.csv similarity index 100% rename from bitgo/all.csv rename to leetcode/bitgo/all.csv diff --git a/bitgo/more-than-six-months.csv b/leetcode/bitgo/more-than-six-months.csv similarity index 100% rename from bitgo/more-than-six-months.csv rename to leetcode/bitgo/more-than-six-months.csv diff --git a/bitgo/six-months.csv b/leetcode/bitgo/six-months.csv similarity index 100% rename from bitgo/six-months.csv rename to leetcode/bitgo/six-months.csv diff --git a/bitgo/three-months.csv b/leetcode/bitgo/three-months.csv similarity index 100% rename from bitgo/three-months.csv rename to leetcode/bitgo/three-months.csv diff --git a/blackbuck/all.csv b/leetcode/blackbuck/all.csv similarity index 100% rename from blackbuck/all.csv rename to leetcode/blackbuck/all.csv diff --git a/blackbuck/more-than-six-months.csv b/leetcode/blackbuck/more-than-six-months.csv similarity index 100% rename from blackbuck/more-than-six-months.csv rename to leetcode/blackbuck/more-than-six-months.csv diff --git a/blackrock/all.csv b/leetcode/blackrock/all.csv similarity index 100% rename from blackrock/all.csv rename to leetcode/blackrock/all.csv diff --git a/blackrock/more-than-six-months.csv b/leetcode/blackrock/more-than-six-months.csv similarity index 100% rename from blackrock/more-than-six-months.csv rename to leetcode/blackrock/more-than-six-months.csv diff --git a/blackrock/six-months.csv b/leetcode/blackrock/six-months.csv similarity index 100% rename from blackrock/six-months.csv rename to leetcode/blackrock/six-months.csv diff --git a/blackrock/three-months.csv b/leetcode/blackrock/three-months.csv similarity index 100% rename from blackrock/three-months.csv rename to leetcode/blackrock/three-months.csv diff --git a/blackstone/all.csv b/leetcode/blackstone/all.csv similarity index 100% rename from blackstone/all.csv rename to leetcode/blackstone/all.csv diff --git a/blackstone/more-than-six-months.csv b/leetcode/blackstone/more-than-six-months.csv similarity index 100% rename from blackstone/more-than-six-months.csv rename to leetcode/blackstone/more-than-six-months.csv diff --git a/blend/all.csv b/leetcode/blend/all.csv similarity index 100% rename from blend/all.csv rename to leetcode/blend/all.csv diff --git a/blend/more-than-six-months.csv b/leetcode/blend/more-than-six-months.csv similarity index 100% rename from blend/more-than-six-months.csv rename to leetcode/blend/more-than-six-months.csv diff --git a/blend/six-months.csv b/leetcode/blend/six-months.csv similarity index 100% rename from blend/six-months.csv rename to leetcode/blend/six-months.csv diff --git a/blinkit/all.csv b/leetcode/blinkit/all.csv similarity index 100% rename from blinkit/all.csv rename to leetcode/blinkit/all.csv diff --git a/blinkit/more-than-six-months.csv b/leetcode/blinkit/more-than-six-months.csv similarity index 100% rename from blinkit/more-than-six-months.csv rename to leetcode/blinkit/more-than-six-months.csv diff --git a/blizzard/all.csv b/leetcode/blizzard/all.csv similarity index 100% rename from blizzard/all.csv rename to leetcode/blizzard/all.csv diff --git a/blizzard/more-than-six-months.csv b/leetcode/blizzard/more-than-six-months.csv similarity index 100% rename from blizzard/more-than-six-months.csv rename to leetcode/blizzard/more-than-six-months.csv diff --git a/bloomberg/all.csv b/leetcode/bloomberg/all.csv similarity index 100% rename from bloomberg/all.csv rename to leetcode/bloomberg/all.csv diff --git a/bloomberg/more-than-six-months.csv b/leetcode/bloomberg/more-than-six-months.csv similarity index 100% rename from bloomberg/more-than-six-months.csv rename to leetcode/bloomberg/more-than-six-months.csv diff --git a/bloomberg/six-months.csv b/leetcode/bloomberg/six-months.csv similarity index 100% rename from bloomberg/six-months.csv rename to leetcode/bloomberg/six-months.csv diff --git a/bloomberg/thirty-days.csv b/leetcode/bloomberg/thirty-days.csv similarity index 100% rename from bloomberg/thirty-days.csv rename to leetcode/bloomberg/thirty-days.csv diff --git a/bloomberg/three-months.csv b/leetcode/bloomberg/three-months.csv similarity index 100% rename from bloomberg/three-months.csv rename to leetcode/bloomberg/three-months.csv diff --git a/bloomreach/all.csv b/leetcode/bloomreach/all.csv similarity index 100% rename from bloomreach/all.csv rename to leetcode/bloomreach/all.csv diff --git a/bloomreach/more-than-six-months.csv b/leetcode/bloomreach/more-than-six-months.csv similarity index 100% rename from bloomreach/more-than-six-months.csv rename to leetcode/bloomreach/more-than-six-months.csv diff --git a/blue-origin/all.csv b/leetcode/blue-origin/all.csv similarity index 100% rename from blue-origin/all.csv rename to leetcode/blue-origin/all.csv diff --git a/blue-origin/more-than-six-months.csv b/leetcode/blue-origin/more-than-six-months.csv similarity index 100% rename from blue-origin/more-than-six-months.csv rename to leetcode/blue-origin/more-than-six-months.csv diff --git a/blue-yonder/all.csv b/leetcode/blue-yonder/all.csv similarity index 100% rename from blue-yonder/all.csv rename to leetcode/blue-yonder/all.csv diff --git a/blue-yonder/more-than-six-months.csv b/leetcode/blue-yonder/more-than-six-months.csv similarity index 100% rename from blue-yonder/more-than-six-months.csv rename to leetcode/blue-yonder/more-than-six-months.csv diff --git a/bnp-paribas/all.csv b/leetcode/bnp-paribas/all.csv similarity index 100% rename from bnp-paribas/all.csv rename to leetcode/bnp-paribas/all.csv diff --git a/bnp-paribas/more-than-six-months.csv b/leetcode/bnp-paribas/more-than-six-months.csv similarity index 100% rename from bnp-paribas/more-than-six-months.csv rename to leetcode/bnp-paribas/more-than-six-months.csv diff --git a/bny-mellon/all.csv b/leetcode/bny-mellon/all.csv similarity index 100% rename from bny-mellon/all.csv rename to leetcode/bny-mellon/all.csv diff --git a/bny-mellon/more-than-six-months.csv b/leetcode/bny-mellon/more-than-six-months.csv similarity index 100% rename from bny-mellon/more-than-six-months.csv rename to leetcode/bny-mellon/more-than-six-months.csv diff --git a/bny-mellon/six-months.csv b/leetcode/bny-mellon/six-months.csv similarity index 100% rename from bny-mellon/six-months.csv rename to leetcode/bny-mellon/six-months.csv diff --git a/boeing/all.csv b/leetcode/boeing/all.csv similarity index 100% rename from boeing/all.csv rename to leetcode/boeing/all.csv diff --git a/boeing/more-than-six-months.csv b/leetcode/boeing/more-than-six-months.csv similarity index 100% rename from boeing/more-than-six-months.csv rename to leetcode/boeing/more-than-six-months.csv diff --git a/bolt/all.csv b/leetcode/bolt/all.csv similarity index 100% rename from bolt/all.csv rename to leetcode/bolt/all.csv diff --git a/bolt/more-than-six-months.csv b/leetcode/bolt/more-than-six-months.csv similarity index 100% rename from bolt/more-than-six-months.csv rename to leetcode/bolt/more-than-six-months.csv diff --git a/bolt/six-months.csv b/leetcode/bolt/six-months.csv similarity index 100% rename from bolt/six-months.csv rename to leetcode/bolt/six-months.csv diff --git a/bookingcom/all.csv b/leetcode/bookingcom/all.csv similarity index 100% rename from bookingcom/all.csv rename to leetcode/bookingcom/all.csv diff --git a/bookingcom/more-than-six-months.csv b/leetcode/bookingcom/more-than-six-months.csv similarity index 100% rename from bookingcom/more-than-six-months.csv rename to leetcode/bookingcom/more-than-six-months.csv diff --git a/bookingcom/six-months.csv b/leetcode/bookingcom/six-months.csv similarity index 100% rename from bookingcom/six-months.csv rename to leetcode/bookingcom/six-months.csv diff --git a/bosch/all.csv b/leetcode/bosch/all.csv similarity index 100% rename from bosch/all.csv rename to leetcode/bosch/all.csv diff --git a/bosch/more-than-six-months.csv b/leetcode/bosch/more-than-six-months.csv similarity index 100% rename from bosch/more-than-six-months.csv rename to leetcode/bosch/more-than-six-months.csv diff --git a/box/all.csv b/leetcode/box/all.csv similarity index 100% rename from box/all.csv rename to leetcode/box/all.csv diff --git a/box/more-than-six-months.csv b/leetcode/box/more-than-six-months.csv similarity index 100% rename from box/more-than-six-months.csv rename to leetcode/box/more-than-six-months.csv diff --git a/box/six-months.csv b/leetcode/box/six-months.csv similarity index 100% rename from box/six-months.csv rename to leetcode/box/six-months.csv diff --git a/box/three-months.csv b/leetcode/box/three-months.csv similarity index 100% rename from box/three-months.csv rename to leetcode/box/three-months.csv diff --git a/bp/all.csv b/leetcode/bp/all.csv similarity index 100% rename from bp/all.csv rename to leetcode/bp/all.csv diff --git a/bp/more-than-six-months.csv b/leetcode/bp/more-than-six-months.csv similarity index 100% rename from bp/more-than-six-months.csv rename to leetcode/bp/more-than-six-months.csv diff --git a/braze/all.csv b/leetcode/braze/all.csv similarity index 100% rename from braze/all.csv rename to leetcode/braze/all.csv diff --git a/braze/more-than-six-months.csv b/leetcode/braze/more-than-six-months.csv similarity index 100% rename from braze/more-than-six-months.csv rename to leetcode/braze/more-than-six-months.csv diff --git a/brex/all.csv b/leetcode/brex/all.csv similarity index 100% rename from brex/all.csv rename to leetcode/brex/all.csv diff --git a/brex/more-than-six-months.csv b/leetcode/brex/more-than-six-months.csv similarity index 100% rename from brex/more-than-six-months.csv rename to leetcode/brex/more-than-six-months.csv diff --git a/bridgewater-associates/all.csv b/leetcode/bridgewater-associates/all.csv similarity index 100% rename from bridgewater-associates/all.csv rename to leetcode/bridgewater-associates/all.csv diff --git a/bridgewater-associates/more-than-six-months.csv b/leetcode/bridgewater-associates/more-than-six-months.csv similarity index 100% rename from bridgewater-associates/more-than-six-months.csv rename to leetcode/bridgewater-associates/more-than-six-months.csv diff --git a/brillio/all.csv b/leetcode/brillio/all.csv similarity index 100% rename from brillio/all.csv rename to leetcode/brillio/all.csv diff --git a/broadcom/all.csv b/leetcode/broadcom/all.csv similarity index 100% rename from broadcom/all.csv rename to leetcode/broadcom/all.csv diff --git a/broadcom/more-than-six-months.csv b/leetcode/broadcom/more-than-six-months.csv similarity index 100% rename from broadcom/more-than-six-months.csv rename to leetcode/broadcom/more-than-six-months.csv diff --git a/browserstack/all.csv b/leetcode/browserstack/all.csv similarity index 100% rename from browserstack/all.csv rename to leetcode/browserstack/all.csv diff --git a/bt-group/all.csv b/leetcode/bt-group/all.csv similarity index 100% rename from bt-group/all.csv rename to leetcode/bt-group/all.csv diff --git a/bt-group/more-than-six-months.csv b/leetcode/bt-group/more-than-six-months.csv similarity index 100% rename from bt-group/more-than-six-months.csv rename to leetcode/bt-group/more-than-six-months.csv diff --git a/buyhatke/all.csv b/leetcode/buyhatke/all.csv similarity index 100% rename from buyhatke/all.csv rename to leetcode/buyhatke/all.csv diff --git a/buyhatke/more-than-six-months.csv b/leetcode/buyhatke/more-than-six-months.csv similarity index 100% rename from buyhatke/more-than-six-months.csv rename to leetcode/buyhatke/more-than-six-months.csv diff --git a/bytedance/all.csv b/leetcode/bytedance/all.csv similarity index 100% rename from bytedance/all.csv rename to leetcode/bytedance/all.csv diff --git a/bytedance/more-than-six-months.csv b/leetcode/bytedance/more-than-six-months.csv similarity index 100% rename from bytedance/more-than-six-months.csv rename to leetcode/bytedance/more-than-six-months.csv diff --git a/bytedance/six-months.csv b/leetcode/bytedance/six-months.csv similarity index 100% rename from bytedance/six-months.csv rename to leetcode/bytedance/six-months.csv diff --git a/bytedance/three-months.csv b/leetcode/bytedance/three-months.csv similarity index 100% rename from bytedance/three-months.csv rename to leetcode/bytedance/three-months.csv diff --git a/c3-ai/all.csv b/leetcode/c3-ai/all.csv similarity index 100% rename from c3-ai/all.csv rename to leetcode/c3-ai/all.csv diff --git a/c3-ai/six-months.csv b/leetcode/c3-ai/six-months.csv similarity index 100% rename from c3-ai/six-months.csv rename to leetcode/c3-ai/six-months.csv diff --git a/c3-ai/three-months.csv b/leetcode/c3-ai/three-months.csv similarity index 100% rename from c3-ai/three-months.csv rename to leetcode/c3-ai/three-months.csv diff --git a/caastle/all.csv b/leetcode/caastle/all.csv similarity index 100% rename from caastle/all.csv rename to leetcode/caastle/all.csv diff --git a/caastle/more-than-six-months.csv b/leetcode/caastle/more-than-six-months.csv similarity index 100% rename from caastle/more-than-six-months.csv rename to leetcode/caastle/more-than-six-months.csv diff --git a/cadence/all.csv b/leetcode/cadence/all.csv similarity index 100% rename from cadence/all.csv rename to leetcode/cadence/all.csv diff --git a/cadence/more-than-six-months.csv b/leetcode/cadence/more-than-six-months.csv similarity index 100% rename from cadence/more-than-six-months.csv rename to leetcode/cadence/more-than-six-months.csv diff --git a/cadence/six-months.csv b/leetcode/cadence/six-months.csv similarity index 100% rename from cadence/six-months.csv rename to leetcode/cadence/six-months.csv diff --git a/canonical/all.csv b/leetcode/canonical/all.csv similarity index 100% rename from canonical/all.csv rename to leetcode/canonical/all.csv diff --git a/canonical/more-than-six-months.csv b/leetcode/canonical/more-than-six-months.csv similarity index 100% rename from canonical/more-than-six-months.csv rename to leetcode/canonical/more-than-six-months.csv diff --git a/canonical/six-months.csv b/leetcode/canonical/six-months.csv similarity index 100% rename from canonical/six-months.csv rename to leetcode/canonical/six-months.csv diff --git a/canva/all.csv b/leetcode/canva/all.csv similarity index 100% rename from canva/all.csv rename to leetcode/canva/all.csv diff --git a/canva/more-than-six-months.csv b/leetcode/canva/more-than-six-months.csv similarity index 100% rename from canva/more-than-six-months.csv rename to leetcode/canva/more-than-six-months.csv diff --git a/canva/six-months.csv b/leetcode/canva/six-months.csv similarity index 100% rename from canva/six-months.csv rename to leetcode/canva/six-months.csv diff --git a/capgemini/all.csv b/leetcode/capgemini/all.csv similarity index 100% rename from capgemini/all.csv rename to leetcode/capgemini/all.csv diff --git a/capgemini/more-than-six-months.csv b/leetcode/capgemini/more-than-six-months.csv similarity index 100% rename from capgemini/more-than-six-months.csv rename to leetcode/capgemini/more-than-six-months.csv diff --git a/capgemini/six-months.csv b/leetcode/capgemini/six-months.csv similarity index 100% rename from capgemini/six-months.csv rename to leetcode/capgemini/six-months.csv diff --git a/capgemini/three-months.csv b/leetcode/capgemini/three-months.csv similarity index 100% rename from capgemini/three-months.csv rename to leetcode/capgemini/three-months.csv diff --git a/capital-one/all.csv b/leetcode/capital-one/all.csv similarity index 100% rename from capital-one/all.csv rename to leetcode/capital-one/all.csv diff --git a/capital-one/more-than-six-months.csv b/leetcode/capital-one/more-than-six-months.csv similarity index 100% rename from capital-one/more-than-six-months.csv rename to leetcode/capital-one/more-than-six-months.csv diff --git a/capital-one/six-months.csv b/leetcode/capital-one/six-months.csv similarity index 100% rename from capital-one/six-months.csv rename to leetcode/capital-one/six-months.csv diff --git a/capital-one/thirty-days.csv b/leetcode/capital-one/thirty-days.csv similarity index 100% rename from capital-one/thirty-days.csv rename to leetcode/capital-one/thirty-days.csv diff --git a/capital-one/three-months.csv b/leetcode/capital-one/three-months.csv similarity index 100% rename from capital-one/three-months.csv rename to leetcode/capital-one/three-months.csv diff --git a/careem/all.csv b/leetcode/careem/all.csv similarity index 100% rename from careem/all.csv rename to leetcode/careem/all.csv diff --git a/careem/more-than-six-months.csv b/leetcode/careem/more-than-six-months.csv similarity index 100% rename from careem/more-than-six-months.csv rename to leetcode/careem/more-than-six-months.csv diff --git a/careem/six-months.csv b/leetcode/careem/six-months.csv similarity index 100% rename from careem/six-months.csv rename to leetcode/careem/six-months.csv diff --git a/careem/thirty-days.csv b/leetcode/careem/thirty-days.csv similarity index 100% rename from careem/thirty-days.csv rename to leetcode/careem/thirty-days.csv diff --git a/careem/three-months.csv b/leetcode/careem/three-months.csv similarity index 100% rename from careem/three-months.csv rename to leetcode/careem/three-months.csv diff --git a/cars24/all.csv b/leetcode/cars24/all.csv similarity index 100% rename from cars24/all.csv rename to leetcode/cars24/all.csv diff --git a/cars24/more-than-six-months.csv b/leetcode/cars24/more-than-six-months.csv similarity index 100% rename from cars24/more-than-six-months.csv rename to leetcode/cars24/more-than-six-months.csv diff --git a/carwale/all.csv b/leetcode/carwale/all.csv similarity index 100% rename from carwale/all.csv rename to leetcode/carwale/all.csv diff --git a/carwale/more-than-six-months.csv b/leetcode/carwale/more-than-six-months.csv similarity index 100% rename from carwale/more-than-six-months.csv rename to leetcode/carwale/more-than-six-months.csv diff --git a/cashfree/all.csv b/leetcode/cashfree/all.csv similarity index 100% rename from cashfree/all.csv rename to leetcode/cashfree/all.csv diff --git a/cashfree/more-than-six-months.csv b/leetcode/cashfree/more-than-six-months.csv similarity index 100% rename from cashfree/more-than-six-months.csv rename to leetcode/cashfree/more-than-six-months.csv diff --git a/caterpillar/all.csv b/leetcode/caterpillar/all.csv similarity index 100% rename from caterpillar/all.csv rename to leetcode/caterpillar/all.csv diff --git a/cedcoss/all.csv b/leetcode/cedcoss/all.csv similarity index 100% rename from cedcoss/all.csv rename to leetcode/cedcoss/all.csv diff --git a/cedcoss/more-than-six-months.csv b/leetcode/cedcoss/more-than-six-months.csv similarity index 100% rename from cedcoss/more-than-six-months.csv rename to leetcode/cedcoss/more-than-six-months.csv diff --git a/celigo/all.csv b/leetcode/celigo/all.csv similarity index 100% rename from celigo/all.csv rename to leetcode/celigo/all.csv diff --git a/celigo/more-than-six-months.csv b/leetcode/celigo/more-than-six-months.csv similarity index 100% rename from celigo/more-than-six-months.csv rename to leetcode/celigo/more-than-six-months.csv diff --git a/chalo/all.csv b/leetcode/chalo/all.csv similarity index 100% rename from chalo/all.csv rename to leetcode/chalo/all.csv diff --git a/chalo/more-than-six-months.csv b/leetcode/chalo/more-than-six-months.csv similarity index 100% rename from chalo/more-than-six-months.csv rename to leetcode/chalo/more-than-six-months.csv diff --git a/chargebee/all.csv b/leetcode/chargebee/all.csv similarity index 100% rename from chargebee/all.csv rename to leetcode/chargebee/all.csv diff --git a/chargebee/six-months.csv b/leetcode/chargebee/six-months.csv similarity index 100% rename from chargebee/six-months.csv rename to leetcode/chargebee/six-months.csv diff --git a/chewy/all.csv b/leetcode/chewy/all.csv similarity index 100% rename from chewy/all.csv rename to leetcode/chewy/all.csv diff --git a/chewy/more-than-six-months.csv b/leetcode/chewy/more-than-six-months.csv similarity index 100% rename from chewy/more-than-six-months.csv rename to leetcode/chewy/more-than-six-months.csv diff --git a/chime/all.csv b/leetcode/chime/all.csv similarity index 100% rename from chime/all.csv rename to leetcode/chime/all.csv diff --git a/chime/more-than-six-months.csv b/leetcode/chime/more-than-six-months.csv similarity index 100% rename from chime/more-than-six-months.csv rename to leetcode/chime/more-than-six-months.csv diff --git a/chronus/all.csv b/leetcode/chronus/all.csv similarity index 100% rename from chronus/all.csv rename to leetcode/chronus/all.csv diff --git a/chronus/more-than-six-months.csv b/leetcode/chronus/more-than-six-months.csv similarity index 100% rename from chronus/more-than-six-months.csv rename to leetcode/chronus/more-than-six-months.csv diff --git a/chubb/all.csv b/leetcode/chubb/all.csv similarity index 100% rename from chubb/all.csv rename to leetcode/chubb/all.csv diff --git a/chubb/more-than-six-months.csv b/leetcode/chubb/more-than-six-months.csv similarity index 100% rename from chubb/more-than-six-months.csv rename to leetcode/chubb/more-than-six-months.csv diff --git a/ciena/all.csv b/leetcode/ciena/all.csv similarity index 100% rename from ciena/all.csv rename to leetcode/ciena/all.csv diff --git a/ciena/more-than-six-months.csv b/leetcode/ciena/more-than-six-months.csv similarity index 100% rename from ciena/more-than-six-months.csv rename to leetcode/ciena/more-than-six-months.csv diff --git a/circle/all.csv b/leetcode/circle/all.csv similarity index 100% rename from circle/all.csv rename to leetcode/circle/all.csv diff --git a/circle/more-than-six-months.csv b/leetcode/circle/more-than-six-months.csv similarity index 100% rename from circle/more-than-six-months.csv rename to leetcode/circle/more-than-six-months.csv diff --git a/cisco/all.csv b/leetcode/cisco/all.csv similarity index 100% rename from cisco/all.csv rename to leetcode/cisco/all.csv diff --git a/cisco/more-than-six-months.csv b/leetcode/cisco/more-than-six-months.csv similarity index 100% rename from cisco/more-than-six-months.csv rename to leetcode/cisco/more-than-six-months.csv diff --git a/cisco/six-months.csv b/leetcode/cisco/six-months.csv similarity index 100% rename from cisco/six-months.csv rename to leetcode/cisco/six-months.csv diff --git a/cisco/thirty-days.csv b/leetcode/cisco/thirty-days.csv similarity index 100% rename from cisco/thirty-days.csv rename to leetcode/cisco/thirty-days.csv diff --git a/cisco/three-months.csv b/leetcode/cisco/three-months.csv similarity index 100% rename from cisco/three-months.csv rename to leetcode/cisco/three-months.csv diff --git a/citadel/all.csv b/leetcode/citadel/all.csv similarity index 100% rename from citadel/all.csv rename to leetcode/citadel/all.csv diff --git a/citadel/more-than-six-months.csv b/leetcode/citadel/more-than-six-months.csv similarity index 100% rename from citadel/more-than-six-months.csv rename to leetcode/citadel/more-than-six-months.csv diff --git a/citadel/six-months.csv b/leetcode/citadel/six-months.csv similarity index 100% rename from citadel/six-months.csv rename to leetcode/citadel/six-months.csv diff --git a/citadel/thirty-days.csv b/leetcode/citadel/thirty-days.csv similarity index 100% rename from citadel/thirty-days.csv rename to leetcode/citadel/thirty-days.csv diff --git a/citadel/three-months.csv b/leetcode/citadel/three-months.csv similarity index 100% rename from citadel/three-months.csv rename to leetcode/citadel/three-months.csv diff --git a/citi/all.csv b/leetcode/citi/all.csv similarity index 100% rename from citi/all.csv rename to leetcode/citi/all.csv diff --git a/citi/more-than-six-months.csv b/leetcode/citi/more-than-six-months.csv similarity index 100% rename from citi/more-than-six-months.csv rename to leetcode/citi/more-than-six-months.csv diff --git a/citrix/all.csv b/leetcode/citrix/all.csv similarity index 100% rename from citrix/all.csv rename to leetcode/citrix/all.csv diff --git a/citrix/more-than-six-months.csv b/leetcode/citrix/more-than-six-months.csv similarity index 100% rename from citrix/more-than-six-months.csv rename to leetcode/citrix/more-than-six-months.csv diff --git a/clari/all.csv b/leetcode/clari/all.csv similarity index 100% rename from clari/all.csv rename to leetcode/clari/all.csv diff --git a/clari/more-than-six-months.csv b/leetcode/clari/more-than-six-months.csv similarity index 100% rename from clari/more-than-six-months.csv rename to leetcode/clari/more-than-six-months.csv diff --git a/cleartax/all.csv b/leetcode/cleartax/all.csv similarity index 100% rename from cleartax/all.csv rename to leetcode/cleartax/all.csv diff --git a/cleartax/more-than-six-months.csv b/leetcode/cleartax/more-than-six-months.csv similarity index 100% rename from cleartax/more-than-six-months.csv rename to leetcode/cleartax/more-than-six-months.csv diff --git a/cleartrip/all.csv b/leetcode/cleartrip/all.csv similarity index 100% rename from cleartrip/all.csv rename to leetcode/cleartrip/all.csv diff --git a/cleartrip/more-than-six-months.csv b/leetcode/cleartrip/more-than-six-months.csv similarity index 100% rename from cleartrip/more-than-six-months.csv rename to leetcode/cleartrip/more-than-six-months.csv diff --git a/cleartrip/six-months.csv b/leetcode/cleartrip/six-months.csv similarity index 100% rename from cleartrip/six-months.csv rename to leetcode/cleartrip/six-months.csv diff --git a/cloudera/all.csv b/leetcode/cloudera/all.csv similarity index 100% rename from cloudera/all.csv rename to leetcode/cloudera/all.csv diff --git a/cloudera/more-than-six-months.csv b/leetcode/cloudera/more-than-six-months.csv similarity index 100% rename from cloudera/more-than-six-months.csv rename to leetcode/cloudera/more-than-six-months.csv diff --git a/cloudflare/all.csv b/leetcode/cloudflare/all.csv similarity index 100% rename from cloudflare/all.csv rename to leetcode/cloudflare/all.csv diff --git a/cloudflare/more-than-six-months.csv b/leetcode/cloudflare/more-than-six-months.csv similarity index 100% rename from cloudflare/more-than-six-months.csv rename to leetcode/cloudflare/more-than-six-months.csv diff --git a/cloudflare/six-months.csv b/leetcode/cloudflare/six-months.csv similarity index 100% rename from cloudflare/six-months.csv rename to leetcode/cloudflare/six-months.csv diff --git a/cloudflare/thirty-days.csv b/leetcode/cloudflare/thirty-days.csv similarity index 100% rename from cloudflare/thirty-days.csv rename to leetcode/cloudflare/thirty-days.csv diff --git a/cloudflare/three-months.csv b/leetcode/cloudflare/three-months.csv similarity index 100% rename from cloudflare/three-months.csv rename to leetcode/cloudflare/three-months.csv diff --git a/clumio/all.csv b/leetcode/clumio/all.csv similarity index 100% rename from clumio/all.csv rename to leetcode/clumio/all.csv diff --git a/clumio/more-than-six-months.csv b/leetcode/clumio/more-than-six-months.csv similarity index 100% rename from clumio/more-than-six-months.csv rename to leetcode/clumio/more-than-six-months.csv diff --git a/clutter/all.csv b/leetcode/clutter/all.csv similarity index 100% rename from clutter/all.csv rename to leetcode/clutter/all.csv diff --git a/clutter/more-than-six-months.csv b/leetcode/clutter/more-than-six-months.csv similarity index 100% rename from clutter/more-than-six-months.csv rename to leetcode/clutter/more-than-six-months.csv diff --git a/cme-group/all.csv b/leetcode/cme-group/all.csv similarity index 100% rename from cme-group/all.csv rename to leetcode/cme-group/all.csv diff --git a/cme-group/more-than-six-months.csv b/leetcode/cme-group/more-than-six-months.csv similarity index 100% rename from cme-group/more-than-six-months.csv rename to leetcode/cme-group/more-than-six-months.csv diff --git a/cme-group/six-months.csv b/leetcode/cme-group/six-months.csv similarity index 100% rename from cme-group/six-months.csv rename to leetcode/cme-group/six-months.csv diff --git a/cme-group/thirty-days.csv b/leetcode/cme-group/thirty-days.csv similarity index 100% rename from cme-group/thirty-days.csv rename to leetcode/cme-group/thirty-days.csv diff --git a/cme-group/three-months.csv b/leetcode/cme-group/three-months.csv similarity index 100% rename from cme-group/three-months.csv rename to leetcode/cme-group/three-months.csv diff --git a/cockroach-labs/all.csv b/leetcode/cockroach-labs/all.csv similarity index 100% rename from cockroach-labs/all.csv rename to leetcode/cockroach-labs/all.csv diff --git a/cockroach-labs/more-than-six-months.csv b/leetcode/cockroach-labs/more-than-six-months.csv similarity index 100% rename from cockroach-labs/more-than-six-months.csv rename to leetcode/cockroach-labs/more-than-six-months.csv diff --git a/cockroach-labs/six-months.csv b/leetcode/cockroach-labs/six-months.csv similarity index 100% rename from cockroach-labs/six-months.csv rename to leetcode/cockroach-labs/six-months.csv diff --git a/cockroach-labs/thirty-days.csv b/leetcode/cockroach-labs/thirty-days.csv similarity index 100% rename from cockroach-labs/thirty-days.csv rename to leetcode/cockroach-labs/thirty-days.csv diff --git a/cockroach-labs/three-months.csv b/leetcode/cockroach-labs/three-months.csv similarity index 100% rename from cockroach-labs/three-months.csv rename to leetcode/cockroach-labs/three-months.csv diff --git a/code-studio/all.csv b/leetcode/code-studio/all.csv similarity index 100% rename from code-studio/all.csv rename to leetcode/code-studio/all.csv diff --git a/code-studio/more-than-six-months.csv b/leetcode/code-studio/more-than-six-months.csv similarity index 100% rename from code-studio/more-than-six-months.csv rename to leetcode/code-studio/more-than-six-months.csv diff --git a/codingmart/all.csv b/leetcode/codingmart/all.csv similarity index 100% rename from codingmart/all.csv rename to leetcode/codingmart/all.csv diff --git a/codingmart/more-than-six-months.csv b/leetcode/codingmart/more-than-six-months.csv similarity index 100% rename from codingmart/more-than-six-months.csv rename to leetcode/codingmart/more-than-six-months.csv diff --git a/cognizant/all.csv b/leetcode/cognizant/all.csv similarity index 100% rename from cognizant/all.csv rename to leetcode/cognizant/all.csv diff --git a/cognizant/more-than-six-months.csv b/leetcode/cognizant/more-than-six-months.csv similarity index 100% rename from cognizant/more-than-six-months.csv rename to leetcode/cognizant/more-than-six-months.csv diff --git a/cognizant/six-months.csv b/leetcode/cognizant/six-months.csv similarity index 100% rename from cognizant/six-months.csv rename to leetcode/cognizant/six-months.csv diff --git a/cognizant/three-months.csv b/leetcode/cognizant/three-months.csv similarity index 100% rename from cognizant/three-months.csv rename to leetcode/cognizant/three-months.csv diff --git a/cohesity/all.csv b/leetcode/cohesity/all.csv similarity index 100% rename from cohesity/all.csv rename to leetcode/cohesity/all.csv diff --git a/cohesity/more-than-six-months.csv b/leetcode/cohesity/more-than-six-months.csv similarity index 100% rename from cohesity/more-than-six-months.csv rename to leetcode/cohesity/more-than-six-months.csv diff --git a/cohesity/six-months.csv b/leetcode/cohesity/six-months.csv similarity index 100% rename from cohesity/six-months.csv rename to leetcode/cohesity/six-months.csv diff --git a/cohesity/thirty-days.csv b/leetcode/cohesity/thirty-days.csv similarity index 100% rename from cohesity/thirty-days.csv rename to leetcode/cohesity/thirty-days.csv diff --git a/cohesity/three-months.csv b/leetcode/cohesity/three-months.csv similarity index 100% rename from cohesity/three-months.csv rename to leetcode/cohesity/three-months.csv diff --git a/coinbase/all.csv b/leetcode/coinbase/all.csv similarity index 100% rename from coinbase/all.csv rename to leetcode/coinbase/all.csv diff --git a/coinbase/more-than-six-months.csv b/leetcode/coinbase/more-than-six-months.csv similarity index 100% rename from coinbase/more-than-six-months.csv rename to leetcode/coinbase/more-than-six-months.csv diff --git a/coinbase/six-months.csv b/leetcode/coinbase/six-months.csv similarity index 100% rename from coinbase/six-months.csv rename to leetcode/coinbase/six-months.csv diff --git a/coinbase/thirty-days.csv b/leetcode/coinbase/thirty-days.csv similarity index 100% rename from coinbase/thirty-days.csv rename to leetcode/coinbase/thirty-days.csv diff --git a/coinbase/three-months.csv b/leetcode/coinbase/three-months.csv similarity index 100% rename from coinbase/three-months.csv rename to leetcode/coinbase/three-months.csv diff --git a/coindcx/all.csv b/leetcode/coindcx/all.csv similarity index 100% rename from coindcx/all.csv rename to leetcode/coindcx/all.csv diff --git a/coindcx/more-than-six-months.csv b/leetcode/coindcx/more-than-six-months.csv similarity index 100% rename from coindcx/more-than-six-months.csv rename to leetcode/coindcx/more-than-six-months.csv diff --git a/coindcx/six-months.csv b/leetcode/coindcx/six-months.csv similarity index 100% rename from coindcx/six-months.csv rename to leetcode/coindcx/six-months.csv diff --git a/comcast/all.csv b/leetcode/comcast/all.csv similarity index 100% rename from comcast/all.csv rename to leetcode/comcast/all.csv diff --git a/comcast/more-than-six-months.csv b/leetcode/comcast/more-than-six-months.csv similarity index 100% rename from comcast/more-than-six-months.csv rename to leetcode/comcast/more-than-six-months.csv diff --git a/comcast/six-months.csv b/leetcode/comcast/six-months.csv similarity index 100% rename from comcast/six-months.csv rename to leetcode/comcast/six-months.csv diff --git a/commvault/all.csv b/leetcode/commvault/all.csv similarity index 100% rename from commvault/all.csv rename to leetcode/commvault/all.csv diff --git a/commvault/more-than-six-months.csv b/leetcode/commvault/more-than-six-months.csv similarity index 100% rename from commvault/more-than-six-months.csv rename to leetcode/commvault/more-than-six-months.csv diff --git a/compass/all.csv b/leetcode/compass/all.csv similarity index 100% rename from compass/all.csv rename to leetcode/compass/all.csv diff --git a/compass/more-than-six-months.csv b/leetcode/compass/more-than-six-months.csv similarity index 100% rename from compass/more-than-six-months.csv rename to leetcode/compass/more-than-six-months.csv diff --git a/compass/six-months.csv b/leetcode/compass/six-months.csv similarity index 100% rename from compass/six-months.csv rename to leetcode/compass/six-months.csv diff --git a/confluent/all.csv b/leetcode/confluent/all.csv similarity index 100% rename from confluent/all.csv rename to leetcode/confluent/all.csv diff --git a/confluent/more-than-six-months.csv b/leetcode/confluent/more-than-six-months.csv similarity index 100% rename from confluent/more-than-six-months.csv rename to leetcode/confluent/more-than-six-months.csv diff --git a/confluent/six-months.csv b/leetcode/confluent/six-months.csv similarity index 100% rename from confluent/six-months.csv rename to leetcode/confluent/six-months.csv diff --git a/confluent/thirty-days.csv b/leetcode/confluent/thirty-days.csv similarity index 100% rename from confluent/thirty-days.csv rename to leetcode/confluent/thirty-days.csv diff --git a/confluent/three-months.csv b/leetcode/confluent/three-months.csv similarity index 100% rename from confluent/three-months.csv rename to leetcode/confluent/three-months.csv diff --git a/consultadd/all.csv b/leetcode/consultadd/all.csv similarity index 100% rename from consultadd/all.csv rename to leetcode/consultadd/all.csv diff --git a/consultadd/more-than-six-months.csv b/leetcode/consultadd/more-than-six-months.csv similarity index 100% rename from consultadd/more-than-six-months.csv rename to leetcode/consultadd/more-than-six-months.csv diff --git a/couchbase/all.csv b/leetcode/couchbase/all.csv similarity index 100% rename from couchbase/all.csv rename to leetcode/couchbase/all.csv diff --git a/couchbase/more-than-six-months.csv b/leetcode/couchbase/more-than-six-months.csv similarity index 100% rename from couchbase/more-than-six-months.csv rename to leetcode/couchbase/more-than-six-months.csv diff --git a/couchbase/six-months.csv b/leetcode/couchbase/six-months.csv similarity index 100% rename from couchbase/six-months.csv rename to leetcode/couchbase/six-months.csv diff --git a/coupang/all.csv b/leetcode/coupang/all.csv similarity index 100% rename from coupang/all.csv rename to leetcode/coupang/all.csv diff --git a/coupang/more-than-six-months.csv b/leetcode/coupang/more-than-six-months.csv similarity index 100% rename from coupang/more-than-six-months.csv rename to leetcode/coupang/more-than-six-months.csv diff --git a/coupang/six-months.csv b/leetcode/coupang/six-months.csv similarity index 100% rename from coupang/six-months.csv rename to leetcode/coupang/six-months.csv diff --git a/coupang/three-months.csv b/leetcode/coupang/three-months.csv similarity index 100% rename from coupang/three-months.csv rename to leetcode/coupang/three-months.csv diff --git a/coursera/all.csv b/leetcode/coursera/all.csv similarity index 100% rename from coursera/all.csv rename to leetcode/coursera/all.csv diff --git a/coursera/more-than-six-months.csv b/leetcode/coursera/more-than-six-months.csv similarity index 100% rename from coursera/more-than-six-months.csv rename to leetcode/coursera/more-than-six-months.csv diff --git a/coursera/six-months.csv b/leetcode/coursera/six-months.csv similarity index 100% rename from coursera/six-months.csv rename to leetcode/coursera/six-months.csv diff --git a/coursera/three-months.csv b/leetcode/coursera/three-months.csv similarity index 100% rename from coursera/three-months.csv rename to leetcode/coursera/three-months.csv diff --git a/coveo/all.csv b/leetcode/coveo/all.csv similarity index 100% rename from coveo/all.csv rename to leetcode/coveo/all.csv diff --git a/coveo/more-than-six-months.csv b/leetcode/coveo/more-than-six-months.csv similarity index 100% rename from coveo/more-than-six-months.csv rename to leetcode/coveo/more-than-six-months.csv diff --git a/cred/all.csv b/leetcode/cred/all.csv similarity index 100% rename from cred/all.csv rename to leetcode/cred/all.csv diff --git a/cred/six-months.csv b/leetcode/cred/six-months.csv similarity index 100% rename from cred/six-months.csv rename to leetcode/cred/six-months.csv diff --git a/cred/thirty-days.csv b/leetcode/cred/thirty-days.csv similarity index 100% rename from cred/thirty-days.csv rename to leetcode/cred/thirty-days.csv diff --git a/cred/three-months.csv b/leetcode/cred/three-months.csv similarity index 100% rename from cred/three-months.csv rename to leetcode/cred/three-months.csv diff --git a/credit-karma/all.csv b/leetcode/credit-karma/all.csv similarity index 100% rename from credit-karma/all.csv rename to leetcode/credit-karma/all.csv diff --git a/credit-karma/more-than-six-months.csv b/leetcode/credit-karma/more-than-six-months.csv similarity index 100% rename from credit-karma/more-than-six-months.csv rename to leetcode/credit-karma/more-than-six-months.csv diff --git a/criteo/all.csv b/leetcode/criteo/all.csv similarity index 100% rename from criteo/all.csv rename to leetcode/criteo/all.csv diff --git a/criteo/more-than-six-months.csv b/leetcode/criteo/more-than-six-months.csv similarity index 100% rename from criteo/more-than-six-months.csv rename to leetcode/criteo/more-than-six-months.csv diff --git a/criteo/six-months.csv b/leetcode/criteo/six-months.csv similarity index 100% rename from criteo/six-months.csv rename to leetcode/criteo/six-months.csv diff --git a/criteo/three-months.csv b/leetcode/criteo/three-months.csv similarity index 100% rename from criteo/three-months.csv rename to leetcode/criteo/three-months.csv diff --git a/crowdstrike/all.csv b/leetcode/crowdstrike/all.csv similarity index 100% rename from crowdstrike/all.csv rename to leetcode/crowdstrike/all.csv diff --git a/crowdstrike/more-than-six-months.csv b/leetcode/crowdstrike/more-than-six-months.csv similarity index 100% rename from crowdstrike/more-than-six-months.csv rename to leetcode/crowdstrike/more-than-six-months.csv diff --git a/crowdstrike/six-months.csv b/leetcode/crowdstrike/six-months.csv similarity index 100% rename from crowdstrike/six-months.csv rename to leetcode/crowdstrike/six-months.csv diff --git a/crowdstrike/three-months.csv b/leetcode/crowdstrike/three-months.csv similarity index 100% rename from crowdstrike/three-months.csv rename to leetcode/crowdstrike/three-months.csv diff --git a/cruise-automation/all.csv b/leetcode/cruise-automation/all.csv similarity index 100% rename from cruise-automation/all.csv rename to leetcode/cruise-automation/all.csv diff --git a/cruise-automation/more-than-six-months.csv b/leetcode/cruise-automation/more-than-six-months.csv similarity index 100% rename from cruise-automation/more-than-six-months.csv rename to leetcode/cruise-automation/more-than-six-months.csv diff --git a/cruise-automation/six-months.csv b/leetcode/cruise-automation/six-months.csv similarity index 100% rename from cruise-automation/six-months.csv rename to leetcode/cruise-automation/six-months.csv diff --git a/ctc/all.csv b/leetcode/ctc/all.csv similarity index 100% rename from ctc/all.csv rename to leetcode/ctc/all.csv diff --git a/ctc/more-than-six-months.csv b/leetcode/ctc/more-than-six-months.csv similarity index 100% rename from ctc/more-than-six-months.csv rename to leetcode/ctc/more-than-six-months.csv diff --git a/curefit/all.csv b/leetcode/curefit/all.csv similarity index 100% rename from curefit/all.csv rename to leetcode/curefit/all.csv diff --git a/curefit/more-than-six-months.csv b/leetcode/curefit/more-than-six-months.csv similarity index 100% rename from curefit/more-than-six-months.csv rename to leetcode/curefit/more-than-six-months.csv diff --git a/cvent/all.csv b/leetcode/cvent/all.csv similarity index 100% rename from cvent/all.csv rename to leetcode/cvent/all.csv diff --git a/cvent/more-than-six-months.csv b/leetcode/cvent/more-than-six-months.csv similarity index 100% rename from cvent/more-than-six-months.csv rename to leetcode/cvent/more-than-six-months.csv diff --git a/cyntexa/all.csv b/leetcode/cyntexa/all.csv similarity index 100% rename from cyntexa/all.csv rename to leetcode/cyntexa/all.csv diff --git a/cyntexa/more-than-six-months.csv b/leetcode/cyntexa/more-than-six-months.csv similarity index 100% rename from cyntexa/more-than-six-months.csv rename to leetcode/cyntexa/more-than-six-months.csv diff --git a/cyware/all.csv b/leetcode/cyware/all.csv similarity index 100% rename from cyware/all.csv rename to leetcode/cyware/all.csv diff --git a/cyware/more-than-six-months.csv b/leetcode/cyware/more-than-six-months.csv similarity index 100% rename from cyware/more-than-six-months.csv rename to leetcode/cyware/more-than-six-months.csv diff --git a/dailyhunt/all.csv b/leetcode/dailyhunt/all.csv similarity index 100% rename from dailyhunt/all.csv rename to leetcode/dailyhunt/all.csv diff --git a/dailyhunt/more-than-six-months.csv b/leetcode/dailyhunt/more-than-six-months.csv similarity index 100% rename from dailyhunt/more-than-six-months.csv rename to leetcode/dailyhunt/more-than-six-months.csv diff --git a/darwinbox/all.csv b/leetcode/darwinbox/all.csv similarity index 100% rename from darwinbox/all.csv rename to leetcode/darwinbox/all.csv diff --git a/darwinbox/more-than-six-months.csv b/leetcode/darwinbox/more-than-six-months.csv similarity index 100% rename from darwinbox/more-than-six-months.csv rename to leetcode/darwinbox/more-than-six-months.csv diff --git a/darwinbox/six-months.csv b/leetcode/darwinbox/six-months.csv similarity index 100% rename from darwinbox/six-months.csv rename to leetcode/darwinbox/six-months.csv diff --git a/darwinbox/thirty-days.csv b/leetcode/darwinbox/thirty-days.csv similarity index 100% rename from darwinbox/thirty-days.csv rename to leetcode/darwinbox/thirty-days.csv diff --git a/darwinbox/three-months.csv b/leetcode/darwinbox/three-months.csv similarity index 100% rename from darwinbox/three-months.csv rename to leetcode/darwinbox/three-months.csv diff --git a/dassault-sysetmes/all.csv b/leetcode/dassault-sysetmes/all.csv similarity index 100% rename from dassault-sysetmes/all.csv rename to leetcode/dassault-sysetmes/all.csv diff --git a/dassault-sysetmes/more-than-six-months.csv b/leetcode/dassault-sysetmes/more-than-six-months.csv similarity index 100% rename from dassault-sysetmes/more-than-six-months.csv rename to leetcode/dassault-sysetmes/more-than-six-months.csv diff --git a/databricks/all.csv b/leetcode/databricks/all.csv similarity index 100% rename from databricks/all.csv rename to leetcode/databricks/all.csv diff --git a/databricks/more-than-six-months.csv b/leetcode/databricks/more-than-six-months.csv similarity index 100% rename from databricks/more-than-six-months.csv rename to leetcode/databricks/more-than-six-months.csv diff --git a/databricks/six-months.csv b/leetcode/databricks/six-months.csv similarity index 100% rename from databricks/six-months.csv rename to leetcode/databricks/six-months.csv diff --git a/databricks/thirty-days.csv b/leetcode/databricks/thirty-days.csv similarity index 100% rename from databricks/thirty-days.csv rename to leetcode/databricks/thirty-days.csv diff --git a/databricks/three-months.csv b/leetcode/databricks/three-months.csv similarity index 100% rename from databricks/three-months.csv rename to leetcode/databricks/three-months.csv diff --git a/datadog/all.csv b/leetcode/datadog/all.csv similarity index 100% rename from datadog/all.csv rename to leetcode/datadog/all.csv diff --git a/datadog/more-than-six-months.csv b/leetcode/datadog/more-than-six-months.csv similarity index 100% rename from datadog/more-than-six-months.csv rename to leetcode/datadog/more-than-six-months.csv diff --git a/datadog/six-months.csv b/leetcode/datadog/six-months.csv similarity index 100% rename from datadog/six-months.csv rename to leetcode/datadog/six-months.csv diff --git a/datadog/three-months.csv b/leetcode/datadog/three-months.csv similarity index 100% rename from datadog/three-months.csv rename to leetcode/datadog/three-months.csv diff --git a/dataminr/all.csv b/leetcode/dataminr/all.csv similarity index 100% rename from dataminr/all.csv rename to leetcode/dataminr/all.csv diff --git a/dataminr/more-than-six-months.csv b/leetcode/dataminr/more-than-six-months.csv similarity index 100% rename from dataminr/more-than-six-months.csv rename to leetcode/dataminr/more-than-six-months.csv diff --git a/de-shaw/all.csv b/leetcode/de-shaw/all.csv similarity index 100% rename from de-shaw/all.csv rename to leetcode/de-shaw/all.csv diff --git a/de-shaw/more-than-six-months.csv b/leetcode/de-shaw/more-than-six-months.csv similarity index 100% rename from de-shaw/more-than-six-months.csv rename to leetcode/de-shaw/more-than-six-months.csv diff --git a/de-shaw/six-months.csv b/leetcode/de-shaw/six-months.csv similarity index 100% rename from de-shaw/six-months.csv rename to leetcode/de-shaw/six-months.csv diff --git a/de-shaw/thirty-days.csv b/leetcode/de-shaw/thirty-days.csv similarity index 100% rename from de-shaw/thirty-days.csv rename to leetcode/de-shaw/thirty-days.csv diff --git a/de-shaw/three-months.csv b/leetcode/de-shaw/three-months.csv similarity index 100% rename from de-shaw/three-months.csv rename to leetcode/de-shaw/three-months.csv diff --git a/deepmind/all.csv b/leetcode/deepmind/all.csv similarity index 100% rename from deepmind/all.csv rename to leetcode/deepmind/all.csv diff --git a/deepmind/more-than-six-months.csv b/leetcode/deepmind/more-than-six-months.csv similarity index 100% rename from deepmind/more-than-six-months.csv rename to leetcode/deepmind/more-than-six-months.csv diff --git a/delhivery/all.csv b/leetcode/delhivery/all.csv similarity index 100% rename from delhivery/all.csv rename to leetcode/delhivery/all.csv diff --git a/delhivery/more-than-six-months.csv b/leetcode/delhivery/more-than-six-months.csv similarity index 100% rename from delhivery/more-than-six-months.csv rename to leetcode/delhivery/more-than-six-months.csv diff --git a/deliveroo/all.csv b/leetcode/deliveroo/all.csv similarity index 100% rename from deliveroo/all.csv rename to leetcode/deliveroo/all.csv diff --git a/deliveroo/more-than-six-months.csv b/leetcode/deliveroo/more-than-six-months.csv similarity index 100% rename from deliveroo/more-than-six-months.csv rename to leetcode/deliveroo/more-than-six-months.csv diff --git a/dell/all.csv b/leetcode/dell/all.csv similarity index 100% rename from dell/all.csv rename to leetcode/dell/all.csv diff --git a/dell/more-than-six-months.csv b/leetcode/dell/more-than-six-months.csv similarity index 100% rename from dell/more-than-six-months.csv rename to leetcode/dell/more-than-six-months.csv diff --git a/dell/six-months.csv b/leetcode/dell/six-months.csv similarity index 100% rename from dell/six-months.csv rename to leetcode/dell/six-months.csv diff --git a/dell/three-months.csv b/leetcode/dell/three-months.csv similarity index 100% rename from dell/three-months.csv rename to leetcode/dell/three-months.csv diff --git a/deloitte/all.csv b/leetcode/deloitte/all.csv similarity index 100% rename from deloitte/all.csv rename to leetcode/deloitte/all.csv diff --git a/deloitte/more-than-six-months.csv b/leetcode/deloitte/more-than-six-months.csv similarity index 100% rename from deloitte/more-than-six-months.csv rename to leetcode/deloitte/more-than-six-months.csv diff --git a/deloitte/six-months.csv b/leetcode/deloitte/six-months.csv similarity index 100% rename from deloitte/six-months.csv rename to leetcode/deloitte/six-months.csv diff --git a/deloitte/thirty-days.csv b/leetcode/deloitte/thirty-days.csv similarity index 100% rename from deloitte/thirty-days.csv rename to leetcode/deloitte/thirty-days.csv diff --git a/deloitte/three-months.csv b/leetcode/deloitte/three-months.csv similarity index 100% rename from deloitte/three-months.csv rename to leetcode/deloitte/three-months.csv diff --git a/deltax/all.csv b/leetcode/deltax/all.csv similarity index 100% rename from deltax/all.csv rename to leetcode/deltax/all.csv diff --git a/deltax/more-than-six-months.csv b/leetcode/deltax/more-than-six-months.csv similarity index 100% rename from deltax/more-than-six-months.csv rename to leetcode/deltax/more-than-six-months.csv diff --git a/deutsche-bank/all.csv b/leetcode/deutsche-bank/all.csv similarity index 100% rename from deutsche-bank/all.csv rename to leetcode/deutsche-bank/all.csv diff --git a/deutsche-bank/more-than-six-months.csv b/leetcode/deutsche-bank/more-than-six-months.csv similarity index 100% rename from deutsche-bank/more-than-six-months.csv rename to leetcode/deutsche-bank/more-than-six-months.csv diff --git a/devrev/all.csv b/leetcode/devrev/all.csv similarity index 100% rename from devrev/all.csv rename to leetcode/devrev/all.csv diff --git a/devrev/more-than-six-months.csv b/leetcode/devrev/more-than-six-months.csv similarity index 100% rename from devrev/more-than-six-months.csv rename to leetcode/devrev/more-than-six-months.csv diff --git a/devsinc/all.csv b/leetcode/devsinc/all.csv similarity index 100% rename from devsinc/all.csv rename to leetcode/devsinc/all.csv diff --git a/devsinc/more-than-six-months.csv b/leetcode/devsinc/more-than-six-months.csv similarity index 100% rename from devsinc/more-than-six-months.csv rename to leetcode/devsinc/more-than-six-months.csv diff --git a/devtron/all.csv b/leetcode/devtron/all.csv similarity index 100% rename from devtron/all.csv rename to leetcode/devtron/all.csv diff --git a/devtron/more-than-six-months.csv b/leetcode/devtron/more-than-six-months.csv similarity index 100% rename from devtron/more-than-six-months.csv rename to leetcode/devtron/more-than-six-months.csv diff --git a/dialpad/all.csv b/leetcode/dialpad/all.csv similarity index 100% rename from dialpad/all.csv rename to leetcode/dialpad/all.csv diff --git a/dialpad/six-months.csv b/leetcode/dialpad/six-months.csv similarity index 100% rename from dialpad/six-months.csv rename to leetcode/dialpad/six-months.csv diff --git a/didi/all.csv b/leetcode/didi/all.csv similarity index 100% rename from didi/all.csv rename to leetcode/didi/all.csv diff --git a/didi/more-than-six-months.csv b/leetcode/didi/more-than-six-months.csv similarity index 100% rename from didi/more-than-six-months.csv rename to leetcode/didi/more-than-six-months.csv diff --git a/directi/all.csv b/leetcode/directi/all.csv similarity index 100% rename from directi/all.csv rename to leetcode/directi/all.csv diff --git a/directi/more-than-six-months.csv b/leetcode/directi/more-than-six-months.csv similarity index 100% rename from directi/more-than-six-months.csv rename to leetcode/directi/more-than-six-months.csv diff --git a/discord/all.csv b/leetcode/discord/all.csv similarity index 100% rename from discord/all.csv rename to leetcode/discord/all.csv diff --git a/discord/more-than-six-months.csv b/leetcode/discord/more-than-six-months.csv similarity index 100% rename from discord/more-than-six-months.csv rename to leetcode/discord/more-than-six-months.csv diff --git a/disney/all.csv b/leetcode/disney/all.csv similarity index 100% rename from disney/all.csv rename to leetcode/disney/all.csv diff --git a/disney/more-than-six-months.csv b/leetcode/disney/more-than-six-months.csv similarity index 100% rename from disney/more-than-six-months.csv rename to leetcode/disney/more-than-six-months.csv diff --git a/disney/six-months.csv b/leetcode/disney/six-months.csv similarity index 100% rename from disney/six-months.csv rename to leetcode/disney/six-months.csv diff --git a/dji/all.csv b/leetcode/dji/all.csv similarity index 100% rename from dji/all.csv rename to leetcode/dji/all.csv diff --git a/docusign/all.csv b/leetcode/docusign/all.csv similarity index 100% rename from docusign/all.csv rename to leetcode/docusign/all.csv diff --git a/docusign/more-than-six-months.csv b/leetcode/docusign/more-than-six-months.csv similarity index 100% rename from docusign/more-than-six-months.csv rename to leetcode/docusign/more-than-six-months.csv diff --git a/docusign/six-months.csv b/leetcode/docusign/six-months.csv similarity index 100% rename from docusign/six-months.csv rename to leetcode/docusign/six-months.csv diff --git a/docusign/thirty-days.csv b/leetcode/docusign/thirty-days.csv similarity index 100% rename from docusign/thirty-days.csv rename to leetcode/docusign/thirty-days.csv diff --git a/docusign/three-months.csv b/leetcode/docusign/three-months.csv similarity index 100% rename from docusign/three-months.csv rename to leetcode/docusign/three-months.csv diff --git a/doordash/all.csv b/leetcode/doordash/all.csv similarity index 100% rename from doordash/all.csv rename to leetcode/doordash/all.csv diff --git a/doordash/more-than-six-months.csv b/leetcode/doordash/more-than-six-months.csv similarity index 100% rename from doordash/more-than-six-months.csv rename to leetcode/doordash/more-than-six-months.csv diff --git a/doordash/six-months.csv b/leetcode/doordash/six-months.csv similarity index 100% rename from doordash/six-months.csv rename to leetcode/doordash/six-months.csv diff --git a/doordash/thirty-days.csv b/leetcode/doordash/thirty-days.csv similarity index 100% rename from doordash/thirty-days.csv rename to leetcode/doordash/thirty-days.csv diff --git a/doordash/three-months.csv b/leetcode/doordash/three-months.csv similarity index 100% rename from doordash/three-months.csv rename to leetcode/doordash/three-months.csv diff --git a/dp-world/all.csv b/leetcode/dp-world/all.csv similarity index 100% rename from dp-world/all.csv rename to leetcode/dp-world/all.csv diff --git a/dp-world/more-than-six-months.csv b/leetcode/dp-world/more-than-six-months.csv similarity index 100% rename from dp-world/more-than-six-months.csv rename to leetcode/dp-world/more-than-six-months.csv diff --git a/dp-world/six-months.csv b/leetcode/dp-world/six-months.csv similarity index 100% rename from dp-world/six-months.csv rename to leetcode/dp-world/six-months.csv diff --git a/drawbridge/all.csv b/leetcode/drawbridge/all.csv similarity index 100% rename from drawbridge/all.csv rename to leetcode/drawbridge/all.csv diff --git a/drawbridge/more-than-six-months.csv b/leetcode/drawbridge/more-than-six-months.csv similarity index 100% rename from drawbridge/more-than-six-months.csv rename to leetcode/drawbridge/more-than-six-months.csv diff --git a/dream11/all.csv b/leetcode/dream11/all.csv similarity index 100% rename from dream11/all.csv rename to leetcode/dream11/all.csv diff --git a/dream11/more-than-six-months.csv b/leetcode/dream11/more-than-six-months.csv similarity index 100% rename from dream11/more-than-six-months.csv rename to leetcode/dream11/more-than-six-months.csv diff --git a/dream11/six-months.csv b/leetcode/dream11/six-months.csv similarity index 100% rename from dream11/six-months.csv rename to leetcode/dream11/six-months.csv diff --git a/dream11/three-months.csv b/leetcode/dream11/three-months.csv similarity index 100% rename from dream11/three-months.csv rename to leetcode/dream11/three-months.csv diff --git a/dropbox/all.csv b/leetcode/dropbox/all.csv similarity index 100% rename from dropbox/all.csv rename to leetcode/dropbox/all.csv diff --git a/dropbox/more-than-six-months.csv b/leetcode/dropbox/more-than-six-months.csv similarity index 100% rename from dropbox/more-than-six-months.csv rename to leetcode/dropbox/more-than-six-months.csv diff --git a/dropbox/six-months.csv b/leetcode/dropbox/six-months.csv similarity index 100% rename from dropbox/six-months.csv rename to leetcode/dropbox/six-months.csv diff --git a/dropbox/three-months.csv b/leetcode/dropbox/three-months.csv similarity index 100% rename from dropbox/three-months.csv rename to leetcode/dropbox/three-months.csv diff --git a/druva/all.csv b/leetcode/druva/all.csv similarity index 100% rename from druva/all.csv rename to leetcode/druva/all.csv diff --git a/druva/more-than-six-months.csv b/leetcode/druva/more-than-six-months.csv similarity index 100% rename from druva/more-than-six-months.csv rename to leetcode/druva/more-than-six-months.csv diff --git a/drw/all.csv b/leetcode/drw/all.csv similarity index 100% rename from drw/all.csv rename to leetcode/drw/all.csv diff --git a/drw/more-than-six-months.csv b/leetcode/drw/more-than-six-months.csv similarity index 100% rename from drw/more-than-six-months.csv rename to leetcode/drw/more-than-six-months.csv diff --git a/drw/six-months.csv b/leetcode/drw/six-months.csv similarity index 100% rename from drw/six-months.csv rename to leetcode/drw/six-months.csv diff --git a/dtcc/all.csv b/leetcode/dtcc/all.csv similarity index 100% rename from dtcc/all.csv rename to leetcode/dtcc/all.csv diff --git a/dtcc/more-than-six-months.csv b/leetcode/dtcc/more-than-six-months.csv similarity index 100% rename from dtcc/more-than-six-months.csv rename to leetcode/dtcc/more-than-six-months.csv diff --git a/dunzo/all.csv b/leetcode/dunzo/all.csv similarity index 100% rename from dunzo/all.csv rename to leetcode/dunzo/all.csv diff --git a/dunzo/more-than-six-months.csv b/leetcode/dunzo/more-than-six-months.csv similarity index 100% rename from dunzo/more-than-six-months.csv rename to leetcode/dunzo/more-than-six-months.csv diff --git a/duolingo/all.csv b/leetcode/duolingo/all.csv similarity index 100% rename from duolingo/all.csv rename to leetcode/duolingo/all.csv diff --git a/duolingo/more-than-six-months.csv b/leetcode/duolingo/more-than-six-months.csv similarity index 100% rename from duolingo/more-than-six-months.csv rename to leetcode/duolingo/more-than-six-months.csv diff --git a/duolingo/six-months.csv b/leetcode/duolingo/six-months.csv similarity index 100% rename from duolingo/six-months.csv rename to leetcode/duolingo/six-months.csv diff --git a/dxc/all.csv b/leetcode/dxc/all.csv similarity index 100% rename from dxc/all.csv rename to leetcode/dxc/all.csv diff --git a/dxc/more-than-six-months.csv b/leetcode/dxc/more-than-six-months.csv similarity index 100% rename from dxc/more-than-six-months.csv rename to leetcode/dxc/more-than-six-months.csv diff --git a/earnin/all.csv b/leetcode/earnin/all.csv similarity index 100% rename from earnin/all.csv rename to leetcode/earnin/all.csv diff --git a/earnin/more-than-six-months.csv b/leetcode/earnin/more-than-six-months.csv similarity index 100% rename from earnin/more-than-six-months.csv rename to leetcode/earnin/more-than-six-months.csv diff --git a/ebay/all.csv b/leetcode/ebay/all.csv similarity index 100% rename from ebay/all.csv rename to leetcode/ebay/all.csv diff --git a/ebay/more-than-six-months.csv b/leetcode/ebay/more-than-six-months.csv similarity index 100% rename from ebay/more-than-six-months.csv rename to leetcode/ebay/more-than-six-months.csv diff --git a/ebay/six-months.csv b/leetcode/ebay/six-months.csv similarity index 100% rename from ebay/six-months.csv rename to leetcode/ebay/six-months.csv diff --git a/ebay/thirty-days.csv b/leetcode/ebay/thirty-days.csv similarity index 100% rename from ebay/thirty-days.csv rename to leetcode/ebay/thirty-days.csv diff --git a/ebay/three-months.csv b/leetcode/ebay/three-months.csv similarity index 100% rename from ebay/three-months.csv rename to leetcode/ebay/three-months.csv diff --git a/edelweiss/all.csv b/leetcode/edelweiss/all.csv similarity index 100% rename from edelweiss/all.csv rename to leetcode/edelweiss/all.csv diff --git a/edelweiss/more-than-six-months.csv b/leetcode/edelweiss/more-than-six-months.csv similarity index 100% rename from edelweiss/more-than-six-months.csv rename to leetcode/edelweiss/more-than-six-months.csv diff --git a/elbit/all.csv b/leetcode/elbit/all.csv similarity index 100% rename from elbit/all.csv rename to leetcode/elbit/all.csv diff --git a/elbit/more-than-six-months.csv b/leetcode/elbit/more-than-six-months.csv similarity index 100% rename from elbit/more-than-six-months.csv rename to leetcode/elbit/more-than-six-months.csv diff --git a/electronic-arts/all.csv b/leetcode/electronic-arts/all.csv similarity index 100% rename from electronic-arts/all.csv rename to leetcode/electronic-arts/all.csv diff --git a/electronic-arts/more-than-six-months.csv b/leetcode/electronic-arts/more-than-six-months.csv similarity index 100% rename from electronic-arts/more-than-six-months.csv rename to leetcode/electronic-arts/more-than-six-months.csv diff --git a/elitmus/all.csv b/leetcode/elitmus/all.csv similarity index 100% rename from elitmus/all.csv rename to leetcode/elitmus/all.csv diff --git a/elitmus/more-than-six-months.csv b/leetcode/elitmus/more-than-six-months.csv similarity index 100% rename from elitmus/more-than-six-months.csv rename to leetcode/elitmus/more-than-six-months.csv diff --git a/envoy/all.csv b/leetcode/envoy/all.csv similarity index 100% rename from envoy/all.csv rename to leetcode/envoy/all.csv diff --git a/envoy/more-than-six-months.csv b/leetcode/envoy/more-than-six-months.csv similarity index 100% rename from envoy/more-than-six-months.csv rename to leetcode/envoy/more-than-six-months.csv diff --git a/epam-systems/all.csv b/leetcode/epam-systems/all.csv similarity index 100% rename from epam-systems/all.csv rename to leetcode/epam-systems/all.csv diff --git a/epam-systems/more-than-six-months.csv b/leetcode/epam-systems/more-than-six-months.csv similarity index 100% rename from epam-systems/more-than-six-months.csv rename to leetcode/epam-systems/more-than-six-months.csv diff --git a/epam-systems/six-months.csv b/leetcode/epam-systems/six-months.csv similarity index 100% rename from epam-systems/six-months.csv rename to leetcode/epam-systems/six-months.csv diff --git a/epam-systems/three-months.csv b/leetcode/epam-systems/three-months.csv similarity index 100% rename from epam-systems/three-months.csv rename to leetcode/epam-systems/three-months.csv diff --git a/epic-games/all.csv b/leetcode/epic-games/all.csv similarity index 100% rename from epic-games/all.csv rename to leetcode/epic-games/all.csv diff --git a/epic-games/more-than-six-months.csv b/leetcode/epic-games/more-than-six-months.csv similarity index 100% rename from epic-games/more-than-six-months.csv rename to leetcode/epic-games/more-than-six-months.csv diff --git a/epic-systems/all.csv b/leetcode/epic-systems/all.csv similarity index 100% rename from epic-systems/all.csv rename to leetcode/epic-systems/all.csv diff --git a/epic-systems/more-than-six-months.csv b/leetcode/epic-systems/more-than-six-months.csv similarity index 100% rename from epic-systems/more-than-six-months.csv rename to leetcode/epic-systems/more-than-six-months.csv diff --git a/epic-systems/six-months.csv b/leetcode/epic-systems/six-months.csv similarity index 100% rename from epic-systems/six-months.csv rename to leetcode/epic-systems/six-months.csv diff --git a/epic-systems/three-months.csv b/leetcode/epic-systems/three-months.csv similarity index 100% rename from epic-systems/three-months.csv rename to leetcode/epic-systems/three-months.csv diff --git a/epifi/all.csv b/leetcode/epifi/all.csv similarity index 100% rename from epifi/all.csv rename to leetcode/epifi/all.csv diff --git a/ericsson/all.csv b/leetcode/ericsson/all.csv similarity index 100% rename from ericsson/all.csv rename to leetcode/ericsson/all.csv diff --git a/ericsson/more-than-six-months.csv b/leetcode/ericsson/more-than-six-months.csv similarity index 100% rename from ericsson/more-than-six-months.csv rename to leetcode/ericsson/more-than-six-months.csv diff --git a/etsy/all.csv b/leetcode/etsy/all.csv similarity index 100% rename from etsy/all.csv rename to leetcode/etsy/all.csv diff --git a/etsy/more-than-six-months.csv b/leetcode/etsy/more-than-six-months.csv similarity index 100% rename from etsy/more-than-six-months.csv rename to leetcode/etsy/more-than-six-months.csv diff --git a/etsy/six-months.csv b/leetcode/etsy/six-months.csv similarity index 100% rename from etsy/six-months.csv rename to leetcode/etsy/six-months.csv diff --git a/expedia/all.csv b/leetcode/expedia/all.csv similarity index 100% rename from expedia/all.csv rename to leetcode/expedia/all.csv diff --git a/expedia/more-than-six-months.csv b/leetcode/expedia/more-than-six-months.csv similarity index 100% rename from expedia/more-than-six-months.csv rename to leetcode/expedia/more-than-six-months.csv diff --git a/expedia/six-months.csv b/leetcode/expedia/six-months.csv similarity index 100% rename from expedia/six-months.csv rename to leetcode/expedia/six-months.csv diff --git a/ey/all.csv b/leetcode/ey/all.csv similarity index 100% rename from ey/all.csv rename to leetcode/ey/all.csv diff --git a/ey/more-than-six-months.csv b/leetcode/ey/more-than-six-months.csv similarity index 100% rename from ey/more-than-six-months.csv rename to leetcode/ey/more-than-six-months.csv diff --git a/f5-networks/all.csv b/leetcode/f5-networks/all.csv similarity index 100% rename from f5-networks/all.csv rename to leetcode/f5-networks/all.csv diff --git a/f5-networks/more-than-six-months.csv b/leetcode/f5-networks/more-than-six-months.csv similarity index 100% rename from f5-networks/more-than-six-months.csv rename to leetcode/f5-networks/more-than-six-months.csv diff --git a/facebook/all.csv b/leetcode/facebook/all.csv similarity index 100% rename from facebook/all.csv rename to leetcode/facebook/all.csv diff --git a/facebook/more-than-six-months.csv b/leetcode/facebook/more-than-six-months.csv similarity index 100% rename from facebook/more-than-six-months.csv rename to leetcode/facebook/more-than-six-months.csv diff --git a/facebook/six-months.csv b/leetcode/facebook/six-months.csv similarity index 100% rename from facebook/six-months.csv rename to leetcode/facebook/six-months.csv diff --git a/facebook/thirty-days.csv b/leetcode/facebook/thirty-days.csv similarity index 100% rename from facebook/thirty-days.csv rename to leetcode/facebook/thirty-days.csv diff --git a/facebook/three-months.csv b/leetcode/facebook/three-months.csv similarity index 100% rename from facebook/three-months.csv rename to leetcode/facebook/three-months.csv diff --git a/factset/all.csv b/leetcode/factset/all.csv similarity index 100% rename from factset/all.csv rename to leetcode/factset/all.csv diff --git a/factset/more-than-six-months.csv b/leetcode/factset/more-than-six-months.csv similarity index 100% rename from factset/more-than-six-months.csv rename to leetcode/factset/more-than-six-months.csv diff --git a/factwise/all.csv b/leetcode/factwise/all.csv similarity index 100% rename from factwise/all.csv rename to leetcode/factwise/all.csv diff --git a/faire/all.csv b/leetcode/faire/all.csv similarity index 100% rename from faire/all.csv rename to leetcode/faire/all.csv diff --git a/faire/more-than-six-months.csv b/leetcode/faire/more-than-six-months.csv similarity index 100% rename from faire/more-than-six-months.csv rename to leetcode/faire/more-than-six-months.csv diff --git a/faire/six-months.csv b/leetcode/faire/six-months.csv similarity index 100% rename from faire/six-months.csv rename to leetcode/faire/six-months.csv diff --git a/faire/thirty-days.csv b/leetcode/faire/thirty-days.csv similarity index 100% rename from faire/thirty-days.csv rename to leetcode/faire/thirty-days.csv diff --git a/faire/three-months.csv b/leetcode/faire/three-months.csv similarity index 100% rename from faire/three-months.csv rename to leetcode/faire/three-months.csv diff --git a/fallible/all.csv b/leetcode/fallible/all.csv similarity index 100% rename from fallible/all.csv rename to leetcode/fallible/all.csv diff --git a/fallible/more-than-six-months.csv b/leetcode/fallible/more-than-six-months.csv similarity index 100% rename from fallible/more-than-six-months.csv rename to leetcode/fallible/more-than-six-months.csv diff --git a/fastenal/all.csv b/leetcode/fastenal/all.csv similarity index 100% rename from fastenal/all.csv rename to leetcode/fastenal/all.csv diff --git a/fastenal/more-than-six-months.csv b/leetcode/fastenal/more-than-six-months.csv similarity index 100% rename from fastenal/more-than-six-months.csv rename to leetcode/fastenal/more-than-six-months.csv diff --git a/fico/all.csv b/leetcode/fico/all.csv similarity index 100% rename from fico/all.csv rename to leetcode/fico/all.csv diff --git a/fico/more-than-six-months.csv b/leetcode/fico/more-than-six-months.csv similarity index 100% rename from fico/more-than-six-months.csv rename to leetcode/fico/more-than-six-months.csv diff --git a/fidelity/all.csv b/leetcode/fidelity/all.csv similarity index 100% rename from fidelity/all.csv rename to leetcode/fidelity/all.csv diff --git a/fidelity/more-than-six-months.csv b/leetcode/fidelity/more-than-six-months.csv similarity index 100% rename from fidelity/more-than-six-months.csv rename to leetcode/fidelity/more-than-six-months.csv diff --git a/fidessa/all.csv b/leetcode/fidessa/all.csv similarity index 100% rename from fidessa/all.csv rename to leetcode/fidessa/all.csv diff --git a/fiverr/all.csv b/leetcode/fiverr/all.csv similarity index 100% rename from fiverr/all.csv rename to leetcode/fiverr/all.csv diff --git a/fiverr/more-than-six-months.csv b/leetcode/fiverr/more-than-six-months.csv similarity index 100% rename from fiverr/more-than-six-months.csv rename to leetcode/fiverr/more-than-six-months.csv diff --git a/flatiron-health/all.csv b/leetcode/flatiron-health/all.csv similarity index 100% rename from flatiron-health/all.csv rename to leetcode/flatiron-health/all.csv diff --git a/flatiron-health/more-than-six-months.csv b/leetcode/flatiron-health/more-than-six-months.csv similarity index 100% rename from flatiron-health/more-than-six-months.csv rename to leetcode/flatiron-health/more-than-six-months.csv diff --git a/flatiron-health/six-months.csv b/leetcode/flatiron-health/six-months.csv similarity index 100% rename from flatiron-health/six-months.csv rename to leetcode/flatiron-health/six-months.csv diff --git a/flatiron-health/thirty-days.csv b/leetcode/flatiron-health/thirty-days.csv similarity index 100% rename from flatiron-health/thirty-days.csv rename to leetcode/flatiron-health/thirty-days.csv diff --git a/flatiron-health/three-months.csv b/leetcode/flatiron-health/three-months.csv similarity index 100% rename from flatiron-health/three-months.csv rename to leetcode/flatiron-health/three-months.csv diff --git a/fleetx/all.csv b/leetcode/fleetx/all.csv similarity index 100% rename from fleetx/all.csv rename to leetcode/fleetx/all.csv diff --git a/fleetx/more-than-six-months.csv b/leetcode/fleetx/more-than-six-months.csv similarity index 100% rename from fleetx/more-than-six-months.csv rename to leetcode/fleetx/more-than-six-months.csv diff --git a/flexera/all.csv b/leetcode/flexera/all.csv similarity index 100% rename from flexera/all.csv rename to leetcode/flexera/all.csv diff --git a/flexera/more-than-six-months.csv b/leetcode/flexera/more-than-six-months.csv similarity index 100% rename from flexera/more-than-six-months.csv rename to leetcode/flexera/more-than-six-months.csv diff --git a/flexport/all.csv b/leetcode/flexport/all.csv similarity index 100% rename from flexport/all.csv rename to leetcode/flexport/all.csv diff --git a/flexport/more-than-six-months.csv b/leetcode/flexport/more-than-six-months.csv similarity index 100% rename from flexport/more-than-six-months.csv rename to leetcode/flexport/more-than-six-months.csv diff --git a/flexport/six-months.csv b/leetcode/flexport/six-months.csv similarity index 100% rename from flexport/six-months.csv rename to leetcode/flexport/six-months.csv diff --git a/flexport/three-months.csv b/leetcode/flexport/three-months.csv similarity index 100% rename from flexport/three-months.csv rename to leetcode/flexport/three-months.csv diff --git a/flipkart/all.csv b/leetcode/flipkart/all.csv similarity index 100% rename from flipkart/all.csv rename to leetcode/flipkart/all.csv diff --git a/flipkart/more-than-six-months.csv b/leetcode/flipkart/more-than-six-months.csv similarity index 100% rename from flipkart/more-than-six-months.csv rename to leetcode/flipkart/more-than-six-months.csv diff --git a/flipkart/six-months.csv b/leetcode/flipkart/six-months.csv similarity index 100% rename from flipkart/six-months.csv rename to leetcode/flipkart/six-months.csv diff --git a/flipkart/three-months.csv b/leetcode/flipkart/three-months.csv similarity index 100% rename from flipkart/three-months.csv rename to leetcode/flipkart/three-months.csv diff --git a/ford/all.csv b/leetcode/ford/all.csv similarity index 100% rename from ford/all.csv rename to leetcode/ford/all.csv diff --git a/ford/more-than-six-months.csv b/leetcode/ford/more-than-six-months.csv similarity index 100% rename from ford/more-than-six-months.csv rename to leetcode/ford/more-than-six-months.csv diff --git a/fortinet/all.csv b/leetcode/fortinet/all.csv similarity index 100% rename from fortinet/all.csv rename to leetcode/fortinet/all.csv diff --git a/fortinet/more-than-six-months.csv b/leetcode/fortinet/more-than-six-months.csv similarity index 100% rename from fortinet/more-than-six-months.csv rename to leetcode/fortinet/more-than-six-months.csv diff --git a/fortinet/six-months.csv b/leetcode/fortinet/six-months.csv similarity index 100% rename from fortinet/six-months.csv rename to leetcode/fortinet/six-months.csv diff --git a/fortinet/three-months.csv b/leetcode/fortinet/three-months.csv similarity index 100% rename from fortinet/three-months.csv rename to leetcode/fortinet/three-months.csv diff --git a/forusall/all.csv b/leetcode/forusall/all.csv similarity index 100% rename from forusall/all.csv rename to leetcode/forusall/all.csv diff --git a/forusall/more-than-six-months.csv b/leetcode/forusall/more-than-six-months.csv similarity index 100% rename from forusall/more-than-six-months.csv rename to leetcode/forusall/more-than-six-months.csv diff --git a/fourkites/all.csv b/leetcode/fourkites/all.csv similarity index 100% rename from fourkites/all.csv rename to leetcode/fourkites/all.csv diff --git a/fourkites/more-than-six-months.csv b/leetcode/fourkites/more-than-six-months.csv similarity index 100% rename from fourkites/more-than-six-months.csv rename to leetcode/fourkites/more-than-six-months.csv diff --git a/fpt/all.csv b/leetcode/fpt/all.csv similarity index 100% rename from fpt/all.csv rename to leetcode/fpt/all.csv diff --git a/fpt/more-than-six-months.csv b/leetcode/fpt/more-than-six-months.csv similarity index 100% rename from fpt/more-than-six-months.csv rename to leetcode/fpt/more-than-six-months.csv diff --git a/fractal-analytics/all.csv b/leetcode/fractal-analytics/all.csv similarity index 100% rename from fractal-analytics/all.csv rename to leetcode/fractal-analytics/all.csv diff --git a/fractal-analytics/more-than-six-months.csv b/leetcode/fractal-analytics/more-than-six-months.csv similarity index 100% rename from fractal-analytics/more-than-six-months.csv rename to leetcode/fractal-analytics/more-than-six-months.csv diff --git a/fractal-analytics/six-months.csv b/leetcode/fractal-analytics/six-months.csv similarity index 100% rename from fractal-analytics/six-months.csv rename to leetcode/fractal-analytics/six-months.csv diff --git a/fractal-analytics/thirty-days.csv b/leetcode/fractal-analytics/thirty-days.csv similarity index 100% rename from fractal-analytics/thirty-days.csv rename to leetcode/fractal-analytics/thirty-days.csv diff --git a/fractal-analytics/three-months.csv b/leetcode/fractal-analytics/three-months.csv similarity index 100% rename from fractal-analytics/three-months.csv rename to leetcode/fractal-analytics/three-months.csv diff --git a/freecharge/all.csv b/leetcode/freecharge/all.csv similarity index 100% rename from freecharge/all.csv rename to leetcode/freecharge/all.csv diff --git a/freecharge/more-than-six-months.csv b/leetcode/freecharge/more-than-six-months.csv similarity index 100% rename from freecharge/more-than-six-months.csv rename to leetcode/freecharge/more-than-six-months.csv diff --git a/freecharge/six-months.csv b/leetcode/freecharge/six-months.csv similarity index 100% rename from freecharge/six-months.csv rename to leetcode/freecharge/six-months.csv diff --git a/freshworks/all.csv b/leetcode/freshworks/all.csv similarity index 100% rename from freshworks/all.csv rename to leetcode/freshworks/all.csv diff --git a/freshworks/more-than-six-months.csv b/leetcode/freshworks/more-than-six-months.csv similarity index 100% rename from freshworks/more-than-six-months.csv rename to leetcode/freshworks/more-than-six-months.csv diff --git a/fynd/all.csv b/leetcode/fynd/all.csv similarity index 100% rename from fynd/all.csv rename to leetcode/fynd/all.csv diff --git a/gainsight/all.csv b/leetcode/gainsight/all.csv similarity index 100% rename from gainsight/all.csv rename to leetcode/gainsight/all.csv diff --git a/gainsight/more-than-six-months.csv b/leetcode/gainsight/more-than-six-months.csv similarity index 100% rename from gainsight/more-than-six-months.csv rename to leetcode/gainsight/more-than-six-months.csv diff --git a/gameskraft/all.csv b/leetcode/gameskraft/all.csv similarity index 100% rename from gameskraft/all.csv rename to leetcode/gameskraft/all.csv diff --git a/gameskraft/more-than-six-months.csv b/leetcode/gameskraft/more-than-six-months.csv similarity index 100% rename from gameskraft/more-than-six-months.csv rename to leetcode/gameskraft/more-than-six-months.csv diff --git a/garena/all.csv b/leetcode/garena/all.csv similarity index 100% rename from garena/all.csv rename to leetcode/garena/all.csv diff --git a/garena/more-than-six-months.csv b/leetcode/garena/more-than-six-months.csv similarity index 100% rename from garena/more-than-six-months.csv rename to leetcode/garena/more-than-six-months.csv diff --git a/garmin/all.csv b/leetcode/garmin/all.csv similarity index 100% rename from garmin/all.csv rename to leetcode/garmin/all.csv diff --git a/garmin/more-than-six-months.csv b/leetcode/garmin/more-than-six-months.csv similarity index 100% rename from garmin/more-than-six-months.csv rename to leetcode/garmin/more-than-six-months.csv diff --git a/garmin/six-months.csv b/leetcode/garmin/six-months.csv similarity index 100% rename from garmin/six-months.csv rename to leetcode/garmin/six-months.csv diff --git a/garmin/three-months.csv b/leetcode/garmin/three-months.csv similarity index 100% rename from garmin/three-months.csv rename to leetcode/garmin/three-months.csv diff --git a/gartner/all.csv b/leetcode/gartner/all.csv similarity index 100% rename from gartner/all.csv rename to leetcode/gartner/all.csv diff --git a/gartner/more-than-six-months.csv b/leetcode/gartner/more-than-six-months.csv similarity index 100% rename from gartner/more-than-six-months.csv rename to leetcode/gartner/more-than-six-months.csv diff --git a/gartner/six-months.csv b/leetcode/gartner/six-months.csv similarity index 100% rename from gartner/six-months.csv rename to leetcode/gartner/six-months.csv diff --git a/ge-digital/all.csv b/leetcode/ge-digital/all.csv similarity index 100% rename from ge-digital/all.csv rename to leetcode/ge-digital/all.csv diff --git a/ge-digital/more-than-six-months.csv b/leetcode/ge-digital/more-than-six-months.csv similarity index 100% rename from ge-digital/more-than-six-months.csv rename to leetcode/ge-digital/more-than-six-months.csv diff --git a/ge-healthcare/all.csv b/leetcode/ge-healthcare/all.csv similarity index 100% rename from ge-healthcare/all.csv rename to leetcode/ge-healthcare/all.csv diff --git a/ge-healthcare/more-than-six-months.csv b/leetcode/ge-healthcare/more-than-six-months.csv similarity index 100% rename from ge-healthcare/more-than-six-months.csv rename to leetcode/ge-healthcare/more-than-six-months.csv diff --git a/geico/all.csv b/leetcode/geico/all.csv similarity index 100% rename from geico/all.csv rename to leetcode/geico/all.csv diff --git a/geico/more-than-six-months.csv b/leetcode/geico/more-than-six-months.csv similarity index 100% rename from geico/more-than-six-months.csv rename to leetcode/geico/more-than-six-months.csv diff --git a/geico/six-months.csv b/leetcode/geico/six-months.csv similarity index 100% rename from geico/six-months.csv rename to leetcode/geico/six-months.csv diff --git a/geico/three-months.csv b/leetcode/geico/three-months.csv similarity index 100% rename from geico/three-months.csv rename to leetcode/geico/three-months.csv diff --git a/general-electric/all.csv b/leetcode/general-electric/all.csv similarity index 100% rename from general-electric/all.csv rename to leetcode/general-electric/all.csv diff --git a/general-electric/more-than-six-months.csv b/leetcode/general-electric/more-than-six-months.csv similarity index 100% rename from general-electric/more-than-six-months.csv rename to leetcode/general-electric/more-than-six-months.csv diff --git a/general-motors/all.csv b/leetcode/general-motors/all.csv similarity index 100% rename from general-motors/all.csv rename to leetcode/general-motors/all.csv diff --git a/general-motors/more-than-six-months.csv b/leetcode/general-motors/more-than-six-months.csv similarity index 100% rename from general-motors/more-than-six-months.csv rename to leetcode/general-motors/more-than-six-months.csv diff --git a/general-motors/six-months.csv b/leetcode/general-motors/six-months.csv similarity index 100% rename from general-motors/six-months.csv rename to leetcode/general-motors/six-months.csv diff --git a/general-motors/thirty-days.csv b/leetcode/general-motors/thirty-days.csv similarity index 100% rename from general-motors/thirty-days.csv rename to leetcode/general-motors/thirty-days.csv diff --git a/general-motors/three-months.csv b/leetcode/general-motors/three-months.csv similarity index 100% rename from general-motors/three-months.csv rename to leetcode/general-motors/three-months.csv diff --git a/genpact/all.csv b/leetcode/genpact/all.csv similarity index 100% rename from genpact/all.csv rename to leetcode/genpact/all.csv diff --git a/genpact/more-than-six-months.csv b/leetcode/genpact/more-than-six-months.csv similarity index 100% rename from genpact/more-than-six-months.csv rename to leetcode/genpact/more-than-six-months.csv diff --git a/gilt-groupe/all.csv b/leetcode/gilt-groupe/all.csv similarity index 100% rename from gilt-groupe/all.csv rename to leetcode/gilt-groupe/all.csv diff --git a/gilt-groupe/more-than-six-months.csv b/leetcode/gilt-groupe/more-than-six-months.csv similarity index 100% rename from gilt-groupe/more-than-six-months.csv rename to leetcode/gilt-groupe/more-than-six-months.csv diff --git a/github/all.csv b/leetcode/github/all.csv similarity index 100% rename from github/all.csv rename to leetcode/github/all.csv diff --git a/github/six-months.csv b/leetcode/github/six-months.csv similarity index 100% rename from github/six-months.csv rename to leetcode/github/six-months.csv diff --git a/glassdoor/all.csv b/leetcode/glassdoor/all.csv similarity index 100% rename from glassdoor/all.csv rename to leetcode/glassdoor/all.csv diff --git a/glassdoor/more-than-six-months.csv b/leetcode/glassdoor/more-than-six-months.csv similarity index 100% rename from glassdoor/more-than-six-months.csv rename to leetcode/glassdoor/more-than-six-months.csv diff --git a/globallogic/all.csv b/leetcode/globallogic/all.csv similarity index 100% rename from globallogic/all.csv rename to leetcode/globallogic/all.csv diff --git a/globallogic/more-than-six-months.csv b/leetcode/globallogic/more-than-six-months.csv similarity index 100% rename from globallogic/more-than-six-months.csv rename to leetcode/globallogic/more-than-six-months.csv diff --git a/globallogic/six-months.csv b/leetcode/globallogic/six-months.csv similarity index 100% rename from globallogic/six-months.csv rename to leetcode/globallogic/six-months.csv diff --git a/globant/all.csv b/leetcode/globant/all.csv similarity index 100% rename from globant/all.csv rename to leetcode/globant/all.csv diff --git a/globant/more-than-six-months.csv b/leetcode/globant/more-than-six-months.csv similarity index 100% rename from globant/more-than-six-months.csv rename to leetcode/globant/more-than-six-months.csv diff --git a/glovo/all.csv b/leetcode/glovo/all.csv similarity index 100% rename from glovo/all.csv rename to leetcode/glovo/all.csv diff --git a/glovo/six-months.csv b/leetcode/glovo/six-months.csv similarity index 100% rename from glovo/six-months.csv rename to leetcode/glovo/six-months.csv diff --git a/godaddy/all.csv b/leetcode/godaddy/all.csv similarity index 100% rename from godaddy/all.csv rename to leetcode/godaddy/all.csv diff --git a/godaddy/more-than-six-months.csv b/leetcode/godaddy/more-than-six-months.csv similarity index 100% rename from godaddy/more-than-six-months.csv rename to leetcode/godaddy/more-than-six-months.csv diff --git a/gojek/all.csv b/leetcode/gojek/all.csv similarity index 100% rename from gojek/all.csv rename to leetcode/gojek/all.csv diff --git a/gojek/more-than-six-months.csv b/leetcode/gojek/more-than-six-months.csv similarity index 100% rename from gojek/more-than-six-months.csv rename to leetcode/gojek/more-than-six-months.csv diff --git a/goldman-sachs/all.csv b/leetcode/goldman-sachs/all.csv similarity index 100% rename from goldman-sachs/all.csv rename to leetcode/goldman-sachs/all.csv diff --git a/goldman-sachs/more-than-six-months.csv b/leetcode/goldman-sachs/more-than-six-months.csv similarity index 100% rename from goldman-sachs/more-than-six-months.csv rename to leetcode/goldman-sachs/more-than-six-months.csv diff --git a/goldman-sachs/six-months.csv b/leetcode/goldman-sachs/six-months.csv similarity index 100% rename from goldman-sachs/six-months.csv rename to leetcode/goldman-sachs/six-months.csv diff --git a/goldman-sachs/thirty-days.csv b/leetcode/goldman-sachs/thirty-days.csv similarity index 100% rename from goldman-sachs/thirty-days.csv rename to leetcode/goldman-sachs/thirty-days.csv diff --git a/goldman-sachs/three-months.csv b/leetcode/goldman-sachs/three-months.csv similarity index 100% rename from goldman-sachs/three-months.csv rename to leetcode/goldman-sachs/three-months.csv diff --git a/google/all.csv b/leetcode/google/all.csv similarity index 100% rename from google/all.csv rename to leetcode/google/all.csv diff --git a/google/more-than-six-months.csv b/leetcode/google/more-than-six-months.csv similarity index 100% rename from google/more-than-six-months.csv rename to leetcode/google/more-than-six-months.csv diff --git a/google/six-months.csv b/leetcode/google/six-months.csv similarity index 100% rename from google/six-months.csv rename to leetcode/google/six-months.csv diff --git a/google/thirty-days.csv b/leetcode/google/thirty-days.csv similarity index 100% rename from google/thirty-days.csv rename to leetcode/google/thirty-days.csv diff --git a/google/three-months.csv b/leetcode/google/three-months.csv similarity index 100% rename from google/three-months.csv rename to leetcode/google/three-months.csv diff --git a/gopuff/all.csv b/leetcode/gopuff/all.csv similarity index 100% rename from gopuff/all.csv rename to leetcode/gopuff/all.csv diff --git a/gopuff/six-months.csv b/leetcode/gopuff/six-months.csv similarity index 100% rename from gopuff/six-months.csv rename to leetcode/gopuff/six-months.csv diff --git a/grab/all.csv b/leetcode/grab/all.csv similarity index 100% rename from grab/all.csv rename to leetcode/grab/all.csv diff --git a/grab/more-than-six-months.csv b/leetcode/grab/more-than-six-months.csv similarity index 100% rename from grab/more-than-six-months.csv rename to leetcode/grab/more-than-six-months.csv diff --git a/grab/six-months.csv b/leetcode/grab/six-months.csv similarity index 100% rename from grab/six-months.csv rename to leetcode/grab/six-months.csv diff --git a/grab/thirty-days.csv b/leetcode/grab/thirty-days.csv similarity index 100% rename from grab/thirty-days.csv rename to leetcode/grab/thirty-days.csv diff --git a/grab/three-months.csv b/leetcode/grab/three-months.csv similarity index 100% rename from grab/three-months.csv rename to leetcode/grab/three-months.csv diff --git a/grammarly/all.csv b/leetcode/grammarly/all.csv similarity index 100% rename from grammarly/all.csv rename to leetcode/grammarly/all.csv diff --git a/grammarly/more-than-six-months.csv b/leetcode/grammarly/more-than-six-months.csv similarity index 100% rename from grammarly/more-than-six-months.csv rename to leetcode/grammarly/more-than-six-months.csv diff --git a/grammarly/six-months.csv b/leetcode/grammarly/six-months.csv similarity index 100% rename from grammarly/six-months.csv rename to leetcode/grammarly/six-months.csv diff --git a/grammarly/thirty-days.csv b/leetcode/grammarly/thirty-days.csv similarity index 100% rename from grammarly/thirty-days.csv rename to leetcode/grammarly/thirty-days.csv diff --git a/grammarly/three-months.csv b/leetcode/grammarly/three-months.csv similarity index 100% rename from grammarly/three-months.csv rename to leetcode/grammarly/three-months.csv diff --git a/graviton/all.csv b/leetcode/graviton/all.csv similarity index 100% rename from graviton/all.csv rename to leetcode/graviton/all.csv diff --git a/graviton/more-than-six-months.csv b/leetcode/graviton/more-than-six-months.csv similarity index 100% rename from graviton/more-than-six-months.csv rename to leetcode/graviton/more-than-six-months.csv diff --git a/grid-dynamics/all.csv b/leetcode/grid-dynamics/all.csv similarity index 100% rename from grid-dynamics/all.csv rename to leetcode/grid-dynamics/all.csv diff --git a/grid-dynamics/more-than-six-months.csv b/leetcode/grid-dynamics/more-than-six-months.csv similarity index 100% rename from grid-dynamics/more-than-six-months.csv rename to leetcode/grid-dynamics/more-than-six-months.csv diff --git a/groupon/all.csv b/leetcode/groupon/all.csv similarity index 100% rename from groupon/all.csv rename to leetcode/groupon/all.csv diff --git a/groupon/more-than-six-months.csv b/leetcode/groupon/more-than-six-months.csv similarity index 100% rename from groupon/more-than-six-months.csv rename to leetcode/groupon/more-than-six-months.csv diff --git a/groww/all.csv b/leetcode/groww/all.csv similarity index 100% rename from groww/all.csv rename to leetcode/groww/all.csv diff --git a/groww/more-than-six-months.csv b/leetcode/groww/more-than-six-months.csv similarity index 100% rename from groww/more-than-six-months.csv rename to leetcode/groww/more-than-six-months.csv diff --git a/grubhub/all.csv b/leetcode/grubhub/all.csv similarity index 100% rename from grubhub/all.csv rename to leetcode/grubhub/all.csv diff --git a/grubhub/more-than-six-months.csv b/leetcode/grubhub/more-than-six-months.csv similarity index 100% rename from grubhub/more-than-six-months.csv rename to leetcode/grubhub/more-than-six-months.csv diff --git a/gsa-capital/all.csv b/leetcode/gsa-capital/all.csv similarity index 100% rename from gsa-capital/all.csv rename to leetcode/gsa-capital/all.csv diff --git a/gsa-capital/more-than-six-months.csv b/leetcode/gsa-capital/more-than-six-months.csv similarity index 100% rename from gsa-capital/more-than-six-months.csv rename to leetcode/gsa-capital/more-than-six-months.csv diff --git a/gsn-games/all.csv b/leetcode/gsn-games/all.csv similarity index 100% rename from gsn-games/all.csv rename to leetcode/gsn-games/all.csv diff --git a/gsn-games/more-than-six-months.csv b/leetcode/gsn-games/more-than-six-months.csv similarity index 100% rename from gsn-games/more-than-six-months.csv rename to leetcode/gsn-games/more-than-six-months.csv diff --git a/guidewire/all.csv b/leetcode/guidewire/all.csv similarity index 100% rename from guidewire/all.csv rename to leetcode/guidewire/all.csv diff --git a/guidewire/more-than-six-months.csv b/leetcode/guidewire/more-than-six-months.csv similarity index 100% rename from guidewire/more-than-six-months.csv rename to leetcode/guidewire/more-than-six-months.csv diff --git a/guidewire/six-months.csv b/leetcode/guidewire/six-months.csv similarity index 100% rename from guidewire/six-months.csv rename to leetcode/guidewire/six-months.csv diff --git a/guidewire/thirty-days.csv b/leetcode/guidewire/thirty-days.csv similarity index 100% rename from guidewire/thirty-days.csv rename to leetcode/guidewire/thirty-days.csv diff --git a/guidewire/three-months.csv b/leetcode/guidewire/three-months.csv similarity index 100% rename from guidewire/three-months.csv rename to leetcode/guidewire/three-months.csv diff --git a/gusto/all.csv b/leetcode/gusto/all.csv similarity index 100% rename from gusto/all.csv rename to leetcode/gusto/all.csv diff --git a/gusto/more-than-six-months.csv b/leetcode/gusto/more-than-six-months.csv similarity index 100% rename from gusto/more-than-six-months.csv rename to leetcode/gusto/more-than-six-months.csv diff --git a/gusto/six-months.csv b/leetcode/gusto/six-months.csv similarity index 100% rename from gusto/six-months.csv rename to leetcode/gusto/six-months.csv diff --git a/gusto/three-months.csv b/leetcode/gusto/three-months.csv similarity index 100% rename from gusto/three-months.csv rename to leetcode/gusto/three-months.csv diff --git a/harman/all.csv b/leetcode/harman/all.csv similarity index 100% rename from harman/all.csv rename to leetcode/harman/all.csv diff --git a/harman/more-than-six-months.csv b/leetcode/harman/more-than-six-months.csv similarity index 100% rename from harman/more-than-six-months.csv rename to leetcode/harman/more-than-six-months.csv diff --git a/harness/all.csv b/leetcode/harness/all.csv similarity index 100% rename from harness/all.csv rename to leetcode/harness/all.csv diff --git a/harness/more-than-six-months.csv b/leetcode/harness/more-than-six-months.csv similarity index 100% rename from harness/more-than-six-months.csv rename to leetcode/harness/more-than-six-months.csv diff --git a/hashedin/all.csv b/leetcode/hashedin/all.csv similarity index 100% rename from hashedin/all.csv rename to leetcode/hashedin/all.csv diff --git a/hashedin/more-than-six-months.csv b/leetcode/hashedin/more-than-six-months.csv similarity index 100% rename from hashedin/more-than-six-months.csv rename to leetcode/hashedin/more-than-six-months.csv diff --git a/hashedin/six-months.csv b/leetcode/hashedin/six-months.csv similarity index 100% rename from hashedin/six-months.csv rename to leetcode/hashedin/six-months.csv diff --git a/hashedin/three-months.csv b/leetcode/hashedin/three-months.csv similarity index 100% rename from hashedin/three-months.csv rename to leetcode/hashedin/three-months.csv diff --git a/hbo/all.csv b/leetcode/hbo/all.csv similarity index 100% rename from hbo/all.csv rename to leetcode/hbo/all.csv diff --git a/hbo/more-than-six-months.csv b/leetcode/hbo/more-than-six-months.csv similarity index 100% rename from hbo/more-than-six-months.csv rename to leetcode/hbo/more-than-six-months.csv diff --git a/hcl/all.csv b/leetcode/hcl/all.csv similarity index 100% rename from hcl/all.csv rename to leetcode/hcl/all.csv diff --git a/hcl/more-than-six-months.csv b/leetcode/hcl/more-than-six-months.csv similarity index 100% rename from hcl/more-than-six-months.csv rename to leetcode/hcl/more-than-six-months.csv diff --git a/hcl/six-months.csv b/leetcode/hcl/six-months.csv similarity index 100% rename from hcl/six-months.csv rename to leetcode/hcl/six-months.csv diff --git a/heb/all.csv b/leetcode/heb/all.csv similarity index 100% rename from heb/all.csv rename to leetcode/heb/all.csv diff --git a/heb/more-than-six-months.csv b/leetcode/heb/more-than-six-months.csv similarity index 100% rename from heb/more-than-six-months.csv rename to leetcode/heb/more-than-six-months.csv diff --git a/helix/all.csv b/leetcode/helix/all.csv similarity index 100% rename from helix/all.csv rename to leetcode/helix/all.csv diff --git a/helix/more-than-six-months.csv b/leetcode/helix/more-than-six-months.csv similarity index 100% rename from helix/more-than-six-months.csv rename to leetcode/helix/more-than-six-months.csv diff --git a/hertz/all.csv b/leetcode/hertz/all.csv similarity index 100% rename from hertz/all.csv rename to leetcode/hertz/all.csv diff --git a/hertz/more-than-six-months.csv b/leetcode/hertz/more-than-six-months.csv similarity index 100% rename from hertz/more-than-six-months.csv rename to leetcode/hertz/more-than-six-months.csv diff --git a/highspot/all.csv b/leetcode/highspot/all.csv similarity index 100% rename from highspot/all.csv rename to leetcode/highspot/all.csv diff --git a/highspot/more-than-six-months.csv b/leetcode/highspot/more-than-six-months.csv similarity index 100% rename from highspot/more-than-six-months.csv rename to leetcode/highspot/more-than-six-months.csv diff --git a/hilabs/all.csv b/leetcode/hilabs/all.csv similarity index 100% rename from hilabs/all.csv rename to leetcode/hilabs/all.csv diff --git a/hilabs/more-than-six-months.csv b/leetcode/hilabs/more-than-six-months.csv similarity index 100% rename from hilabs/more-than-six-months.csv rename to leetcode/hilabs/more-than-six-months.csv diff --git a/hive/all.csv b/leetcode/hive/all.csv similarity index 100% rename from hive/all.csv rename to leetcode/hive/all.csv diff --git a/hive/more-than-six-months.csv b/leetcode/hive/more-than-six-months.csv similarity index 100% rename from hive/more-than-six-months.csv rename to leetcode/hive/more-than-six-months.csv diff --git a/hiver/all.csv b/leetcode/hiver/all.csv similarity index 100% rename from hiver/all.csv rename to leetcode/hiver/all.csv diff --git a/hiver/more-than-six-months.csv b/leetcode/hiver/more-than-six-months.csv similarity index 100% rename from hiver/more-than-six-months.csv rename to leetcode/hiver/more-than-six-months.csv diff --git a/honey/all.csv b/leetcode/honey/all.csv similarity index 100% rename from honey/all.csv rename to leetcode/honey/all.csv diff --git a/honeywell/all.csv b/leetcode/honeywell/all.csv similarity index 100% rename from honeywell/all.csv rename to leetcode/honeywell/all.csv diff --git a/honeywell/more-than-six-months.csv b/leetcode/honeywell/more-than-six-months.csv similarity index 100% rename from honeywell/more-than-six-months.csv rename to leetcode/honeywell/more-than-six-months.csv diff --git a/hopper/all.csv b/leetcode/hopper/all.csv similarity index 100% rename from hopper/all.csv rename to leetcode/hopper/all.csv diff --git a/hopper/six-months.csv b/leetcode/hopper/six-months.csv similarity index 100% rename from hopper/six-months.csv rename to leetcode/hopper/six-months.csv diff --git a/hopper/three-months.csv b/leetcode/hopper/three-months.csv similarity index 100% rename from hopper/three-months.csv rename to leetcode/hopper/three-months.csv diff --git a/hotstar/all.csv b/leetcode/hotstar/all.csv similarity index 100% rename from hotstar/all.csv rename to leetcode/hotstar/all.csv diff --git a/hotstar/more-than-six-months.csv b/leetcode/hotstar/more-than-six-months.csv similarity index 100% rename from hotstar/more-than-six-months.csv rename to leetcode/hotstar/more-than-six-months.csv diff --git a/houzz/all.csv b/leetcode/houzz/all.csv similarity index 100% rename from houzz/all.csv rename to leetcode/houzz/all.csv diff --git a/houzz/more-than-six-months.csv b/leetcode/houzz/more-than-six-months.csv similarity index 100% rename from houzz/more-than-six-months.csv rename to leetcode/houzz/more-than-six-months.csv diff --git a/hp/all.csv b/leetcode/hp/all.csv similarity index 100% rename from hp/all.csv rename to leetcode/hp/all.csv diff --git a/hp/more-than-six-months.csv b/leetcode/hp/more-than-six-months.csv similarity index 100% rename from hp/more-than-six-months.csv rename to leetcode/hp/more-than-six-months.csv diff --git a/hpe/all.csv b/leetcode/hpe/all.csv similarity index 100% rename from hpe/all.csv rename to leetcode/hpe/all.csv diff --git a/hpe/more-than-six-months.csv b/leetcode/hpe/more-than-six-months.csv similarity index 100% rename from hpe/more-than-six-months.csv rename to leetcode/hpe/more-than-six-months.csv diff --git a/hrt/all.csv b/leetcode/hrt/all.csv similarity index 100% rename from hrt/all.csv rename to leetcode/hrt/all.csv diff --git a/hrt/more-than-six-months.csv b/leetcode/hrt/more-than-six-months.csv similarity index 100% rename from hrt/more-than-six-months.csv rename to leetcode/hrt/more-than-six-months.csv diff --git a/hsbc/all.csv b/leetcode/hsbc/all.csv similarity index 100% rename from hsbc/all.csv rename to leetcode/hsbc/all.csv diff --git a/hsbc/more-than-six-months.csv b/leetcode/hsbc/more-than-six-months.csv similarity index 100% rename from hsbc/more-than-six-months.csv rename to leetcode/hsbc/more-than-six-months.csv diff --git a/hsbc/six-months.csv b/leetcode/hsbc/six-months.csv similarity index 100% rename from hsbc/six-months.csv rename to leetcode/hsbc/six-months.csv diff --git a/hsbc/three-months.csv b/leetcode/hsbc/three-months.csv similarity index 100% rename from hsbc/three-months.csv rename to leetcode/hsbc/three-months.csv diff --git a/huawei/all.csv b/leetcode/huawei/all.csv similarity index 100% rename from huawei/all.csv rename to leetcode/huawei/all.csv diff --git a/huawei/more-than-six-months.csv b/leetcode/huawei/more-than-six-months.csv similarity index 100% rename from huawei/more-than-six-months.csv rename to leetcode/huawei/more-than-six-months.csv diff --git a/hubspot/all.csv b/leetcode/hubspot/all.csv similarity index 100% rename from hubspot/all.csv rename to leetcode/hubspot/all.csv diff --git a/hubspot/more-than-six-months.csv b/leetcode/hubspot/more-than-six-months.csv similarity index 100% rename from hubspot/more-than-six-months.csv rename to leetcode/hubspot/more-than-six-months.csv diff --git a/hubspot/six-months.csv b/leetcode/hubspot/six-months.csv similarity index 100% rename from hubspot/six-months.csv rename to leetcode/hubspot/six-months.csv diff --git a/hubspot/three-months.csv b/leetcode/hubspot/three-months.csv similarity index 100% rename from hubspot/three-months.csv rename to leetcode/hubspot/three-months.csv diff --git a/hulu/all.csv b/leetcode/hulu/all.csv similarity index 100% rename from hulu/all.csv rename to leetcode/hulu/all.csv diff --git a/hulu/more-than-six-months.csv b/leetcode/hulu/more-than-six-months.csv similarity index 100% rename from hulu/more-than-six-months.csv rename to leetcode/hulu/more-than-six-months.csv diff --git a/hyperverge/all.csv b/leetcode/hyperverge/all.csv similarity index 100% rename from hyperverge/all.csv rename to leetcode/hyperverge/all.csv diff --git a/hyperverge/more-than-six-months.csv b/leetcode/hyperverge/more-than-six-months.csv similarity index 100% rename from hyperverge/more-than-six-months.csv rename to leetcode/hyperverge/more-than-six-months.csv diff --git a/ibm/all.csv b/leetcode/ibm/all.csv similarity index 100% rename from ibm/all.csv rename to leetcode/ibm/all.csv diff --git a/ibm/more-than-six-months.csv b/leetcode/ibm/more-than-six-months.csv similarity index 100% rename from ibm/more-than-six-months.csv rename to leetcode/ibm/more-than-six-months.csv diff --git a/ibm/six-months.csv b/leetcode/ibm/six-months.csv similarity index 100% rename from ibm/six-months.csv rename to leetcode/ibm/six-months.csv diff --git a/ibm/thirty-days.csv b/leetcode/ibm/thirty-days.csv similarity index 100% rename from ibm/thirty-days.csv rename to leetcode/ibm/thirty-days.csv diff --git a/ibm/three-months.csv b/leetcode/ibm/three-months.csv similarity index 100% rename from ibm/three-months.csv rename to leetcode/ibm/three-months.csv diff --git a/iit-bombay/all.csv b/leetcode/iit-bombay/all.csv similarity index 100% rename from iit-bombay/all.csv rename to leetcode/iit-bombay/all.csv diff --git a/iit-bombay/more-than-six-months.csv b/leetcode/iit-bombay/more-than-six-months.csv similarity index 100% rename from iit-bombay/more-than-six-months.csv rename to leetcode/iit-bombay/more-than-six-months.csv diff --git a/imc/all.csv b/leetcode/imc/all.csv similarity index 100% rename from imc/all.csv rename to leetcode/imc/all.csv diff --git a/imc/more-than-six-months.csv b/leetcode/imc/more-than-six-months.csv similarity index 100% rename from imc/more-than-six-months.csv rename to leetcode/imc/more-than-six-months.csv diff --git a/impact-analytics/all.csv b/leetcode/impact-analytics/all.csv similarity index 100% rename from impact-analytics/all.csv rename to leetcode/impact-analytics/all.csv diff --git a/impact-analytics/more-than-six-months.csv b/leetcode/impact-analytics/more-than-six-months.csv similarity index 100% rename from impact-analytics/more-than-six-months.csv rename to leetcode/impact-analytics/more-than-six-months.csv diff --git a/increff/all.csv b/leetcode/increff/all.csv similarity index 100% rename from increff/all.csv rename to leetcode/increff/all.csv diff --git a/increff/more-than-six-months.csv b/leetcode/increff/more-than-six-months.csv similarity index 100% rename from increff/more-than-six-months.csv rename to leetcode/increff/more-than-six-months.csv diff --git a/indeed/all.csv b/leetcode/indeed/all.csv similarity index 100% rename from indeed/all.csv rename to leetcode/indeed/all.csv diff --git a/indeed/more-than-six-months.csv b/leetcode/indeed/more-than-six-months.csv similarity index 100% rename from indeed/more-than-six-months.csv rename to leetcode/indeed/more-than-six-months.csv diff --git a/indmoney/all.csv b/leetcode/indmoney/all.csv similarity index 100% rename from indmoney/all.csv rename to leetcode/indmoney/all.csv diff --git a/indmoney/more-than-six-months.csv b/leetcode/indmoney/more-than-six-months.csv similarity index 100% rename from indmoney/more-than-six-months.csv rename to leetcode/indmoney/more-than-six-months.csv diff --git a/info-edge/all.csv b/leetcode/info-edge/all.csv similarity index 100% rename from info-edge/all.csv rename to leetcode/info-edge/all.csv diff --git a/info-edge/more-than-six-months.csv b/leetcode/info-edge/more-than-six-months.csv similarity index 100% rename from info-edge/more-than-six-months.csv rename to leetcode/info-edge/more-than-six-months.csv diff --git a/info-edge/six-months.csv b/leetcode/info-edge/six-months.csv similarity index 100% rename from info-edge/six-months.csv rename to leetcode/info-edge/six-months.csv diff --git a/informatica/all.csv b/leetcode/informatica/all.csv similarity index 100% rename from informatica/all.csv rename to leetcode/informatica/all.csv diff --git a/informatica/more-than-six-months.csv b/leetcode/informatica/more-than-six-months.csv similarity index 100% rename from informatica/more-than-six-months.csv rename to leetcode/informatica/more-than-six-months.csv diff --git a/infosys/all.csv b/leetcode/infosys/all.csv similarity index 100% rename from infosys/all.csv rename to leetcode/infosys/all.csv diff --git a/infosys/more-than-six-months.csv b/leetcode/infosys/more-than-six-months.csv similarity index 100% rename from infosys/more-than-six-months.csv rename to leetcode/infosys/more-than-six-months.csv diff --git a/infosys/six-months.csv b/leetcode/infosys/six-months.csv similarity index 100% rename from infosys/six-months.csv rename to leetcode/infosys/six-months.csv diff --git a/infosys/thirty-days.csv b/leetcode/infosys/thirty-days.csv similarity index 100% rename from infosys/thirty-days.csv rename to leetcode/infosys/thirty-days.csv diff --git a/infosys/three-months.csv b/leetcode/infosys/three-months.csv similarity index 100% rename from infosys/three-months.csv rename to leetcode/infosys/three-months.csv diff --git a/inmobi/all.csv b/leetcode/inmobi/all.csv similarity index 100% rename from inmobi/all.csv rename to leetcode/inmobi/all.csv diff --git a/inmobi/more-than-six-months.csv b/leetcode/inmobi/more-than-six-months.csv similarity index 100% rename from inmobi/more-than-six-months.csv rename to leetcode/inmobi/more-than-six-months.csv diff --git a/innovaccer/all.csv b/leetcode/innovaccer/all.csv similarity index 100% rename from innovaccer/all.csv rename to leetcode/innovaccer/all.csv diff --git a/innovaccer/more-than-six-months.csv b/leetcode/innovaccer/more-than-six-months.csv similarity index 100% rename from innovaccer/more-than-six-months.csv rename to leetcode/innovaccer/more-than-six-months.csv diff --git a/innovaccer/six-months.csv b/leetcode/innovaccer/six-months.csv similarity index 100% rename from innovaccer/six-months.csv rename to leetcode/innovaccer/six-months.csv diff --git a/instabase/all.csv b/leetcode/instabase/all.csv similarity index 100% rename from instabase/all.csv rename to leetcode/instabase/all.csv diff --git a/instabase/more-than-six-months.csv b/leetcode/instabase/more-than-six-months.csv similarity index 100% rename from instabase/more-than-six-months.csv rename to leetcode/instabase/more-than-six-months.csv diff --git a/instacart/all.csv b/leetcode/instacart/all.csv similarity index 100% rename from instacart/all.csv rename to leetcode/instacart/all.csv diff --git a/instacart/more-than-six-months.csv b/leetcode/instacart/more-than-six-months.csv similarity index 100% rename from instacart/more-than-six-months.csv rename to leetcode/instacart/more-than-six-months.csv diff --git a/instacart/six-months.csv b/leetcode/instacart/six-months.csv similarity index 100% rename from instacart/six-months.csv rename to leetcode/instacart/six-months.csv diff --git a/instacart/thirty-days.csv b/leetcode/instacart/thirty-days.csv similarity index 100% rename from instacart/thirty-days.csv rename to leetcode/instacart/thirty-days.csv diff --git a/instacart/three-months.csv b/leetcode/instacart/three-months.csv similarity index 100% rename from instacart/three-months.csv rename to leetcode/instacart/three-months.csv diff --git a/intel/all.csv b/leetcode/intel/all.csv similarity index 100% rename from intel/all.csv rename to leetcode/intel/all.csv diff --git a/intel/more-than-six-months.csv b/leetcode/intel/more-than-six-months.csv similarity index 100% rename from intel/more-than-six-months.csv rename to leetcode/intel/more-than-six-months.csv diff --git a/intel/six-months.csv b/leetcode/intel/six-months.csv similarity index 100% rename from intel/six-months.csv rename to leetcode/intel/six-months.csv diff --git a/interactive-brokers/all.csv b/leetcode/interactive-brokers/all.csv similarity index 100% rename from interactive-brokers/all.csv rename to leetcode/interactive-brokers/all.csv diff --git a/interactive-brokers/more-than-six-months.csv b/leetcode/interactive-brokers/more-than-six-months.csv similarity index 100% rename from interactive-brokers/more-than-six-months.csv rename to leetcode/interactive-brokers/more-than-six-months.csv diff --git a/intercom/all.csv b/leetcode/intercom/all.csv similarity index 100% rename from intercom/all.csv rename to leetcode/intercom/all.csv diff --git a/intercom/more-than-six-months.csv b/leetcode/intercom/more-than-six-months.csv similarity index 100% rename from intercom/more-than-six-months.csv rename to leetcode/intercom/more-than-six-months.csv diff --git a/intercom/six-months.csv b/leetcode/intercom/six-months.csv similarity index 100% rename from intercom/six-months.csv rename to leetcode/intercom/six-months.csv diff --git a/intuit/all.csv b/leetcode/intuit/all.csv similarity index 100% rename from intuit/all.csv rename to leetcode/intuit/all.csv diff --git a/intuit/more-than-six-months.csv b/leetcode/intuit/more-than-six-months.csv similarity index 100% rename from intuit/more-than-six-months.csv rename to leetcode/intuit/more-than-six-months.csv diff --git a/intuit/six-months.csv b/leetcode/intuit/six-months.csv similarity index 100% rename from intuit/six-months.csv rename to leetcode/intuit/six-months.csv diff --git a/intuit/thirty-days.csv b/leetcode/intuit/thirty-days.csv similarity index 100% rename from intuit/thirty-days.csv rename to leetcode/intuit/thirty-days.csv diff --git a/intuit/three-months.csv b/leetcode/intuit/three-months.csv similarity index 100% rename from intuit/three-months.csv rename to leetcode/intuit/three-months.csv diff --git a/ion/all.csv b/leetcode/ion/all.csv similarity index 100% rename from ion/all.csv rename to leetcode/ion/all.csv diff --git a/ion/more-than-six-months.csv b/leetcode/ion/more-than-six-months.csv similarity index 100% rename from ion/more-than-six-months.csv rename to leetcode/ion/more-than-six-months.csv diff --git a/ivp/all.csv b/leetcode/ivp/all.csv similarity index 100% rename from ivp/all.csv rename to leetcode/ivp/all.csv diff --git a/ivp/more-than-six-months.csv b/leetcode/ivp/more-than-six-months.csv similarity index 100% rename from ivp/more-than-six-months.csv rename to leetcode/ivp/more-than-six-months.csv diff --git a/ixigo/all.csv b/leetcode/ixigo/all.csv similarity index 100% rename from ixigo/all.csv rename to leetcode/ixigo/all.csv diff --git a/ixigo/more-than-six-months.csv b/leetcode/ixigo/more-than-six-months.csv similarity index 100% rename from ixigo/more-than-six-months.csv rename to leetcode/ixigo/more-than-six-months.csv diff --git a/ixl/all.csv b/leetcode/ixl/all.csv similarity index 100% rename from ixl/all.csv rename to leetcode/ixl/all.csv diff --git a/ixl/more-than-six-months.csv b/leetcode/ixl/more-than-six-months.csv similarity index 100% rename from ixl/more-than-six-months.csv rename to leetcode/ixl/more-than-six-months.csv diff --git a/ixl/six-months.csv b/leetcode/ixl/six-months.csv similarity index 100% rename from ixl/six-months.csv rename to leetcode/ixl/six-months.csv diff --git a/ixl/three-months.csv b/leetcode/ixl/three-months.csv similarity index 100% rename from ixl/three-months.csv rename to leetcode/ixl/three-months.csv diff --git a/jane-street/all.csv b/leetcode/jane-street/all.csv similarity index 100% rename from jane-street/all.csv rename to leetcode/jane-street/all.csv diff --git a/jane-street/more-than-six-months.csv b/leetcode/jane-street/more-than-six-months.csv similarity index 100% rename from jane-street/more-than-six-months.csv rename to leetcode/jane-street/more-than-six-months.csv diff --git a/jd/all.csv b/leetcode/jd/all.csv similarity index 100% rename from jd/all.csv rename to leetcode/jd/all.csv diff --git a/jd/six-months.csv b/leetcode/jd/six-months.csv similarity index 100% rename from jd/six-months.csv rename to leetcode/jd/six-months.csv diff --git a/jeavio/all.csv b/leetcode/jeavio/all.csv similarity index 100% rename from jeavio/all.csv rename to leetcode/jeavio/all.csv diff --git a/jeavio/more-than-six-months.csv b/leetcode/jeavio/more-than-six-months.csv similarity index 100% rename from jeavio/more-than-six-months.csv rename to leetcode/jeavio/more-than-six-months.csv diff --git a/jetbrains/all.csv b/leetcode/jetbrains/all.csv similarity index 100% rename from jetbrains/all.csv rename to leetcode/jetbrains/all.csv diff --git a/jetbrains/more-than-six-months.csv b/leetcode/jetbrains/more-than-six-months.csv similarity index 100% rename from jetbrains/more-than-six-months.csv rename to leetcode/jetbrains/more-than-six-months.csv diff --git a/jingchi/all.csv b/leetcode/jingchi/all.csv similarity index 100% rename from jingchi/all.csv rename to leetcode/jingchi/all.csv diff --git a/jingchi/more-than-six-months.csv b/leetcode/jingchi/more-than-six-months.csv similarity index 100% rename from jingchi/more-than-six-months.csv rename to leetcode/jingchi/more-than-six-months.csv diff --git a/jio/all.csv b/leetcode/jio/all.csv similarity index 100% rename from jio/all.csv rename to leetcode/jio/all.csv diff --git a/jio/more-than-six-months.csv b/leetcode/jio/more-than-six-months.csv similarity index 100% rename from jio/more-than-six-months.csv rename to leetcode/jio/more-than-six-months.csv diff --git a/josh-technology/all.csv b/leetcode/josh-technology/all.csv similarity index 100% rename from josh-technology/all.csv rename to leetcode/josh-technology/all.csv diff --git a/josh-technology/more-than-six-months.csv b/leetcode/josh-technology/more-than-six-months.csv similarity index 100% rename from josh-technology/more-than-six-months.csv rename to leetcode/josh-technology/more-than-six-months.csv diff --git a/josh-technology/six-months.csv b/leetcode/josh-technology/six-months.csv similarity index 100% rename from josh-technology/six-months.csv rename to leetcode/josh-technology/six-months.csv diff --git a/josh-technology/thirty-days.csv b/leetcode/josh-technology/thirty-days.csv similarity index 100% rename from josh-technology/thirty-days.csv rename to leetcode/josh-technology/thirty-days.csv diff --git a/josh-technology/three-months.csv b/leetcode/josh-technology/three-months.csv similarity index 100% rename from josh-technology/three-months.csv rename to leetcode/josh-technology/three-months.csv diff --git a/jpmorgan/all.csv b/leetcode/jpmorgan/all.csv similarity index 100% rename from jpmorgan/all.csv rename to leetcode/jpmorgan/all.csv diff --git a/jpmorgan/more-than-six-months.csv b/leetcode/jpmorgan/more-than-six-months.csv similarity index 100% rename from jpmorgan/more-than-six-months.csv rename to leetcode/jpmorgan/more-than-six-months.csv diff --git a/jpmorgan/six-months.csv b/leetcode/jpmorgan/six-months.csv similarity index 100% rename from jpmorgan/six-months.csv rename to leetcode/jpmorgan/six-months.csv diff --git a/jpmorgan/thirty-days.csv b/leetcode/jpmorgan/thirty-days.csv similarity index 100% rename from jpmorgan/thirty-days.csv rename to leetcode/jpmorgan/thirty-days.csv diff --git a/jpmorgan/three-months.csv b/leetcode/jpmorgan/three-months.csv similarity index 100% rename from jpmorgan/three-months.csv rename to leetcode/jpmorgan/three-months.csv diff --git a/jtg/all.csv b/leetcode/jtg/all.csv similarity index 100% rename from jtg/all.csv rename to leetcode/jtg/all.csv diff --git a/jtg/more-than-six-months.csv b/leetcode/jtg/more-than-six-months.csv similarity index 100% rename from jtg/more-than-six-months.csv rename to leetcode/jtg/more-than-six-months.csv diff --git a/jump-trading/all.csv b/leetcode/jump-trading/all.csv similarity index 100% rename from jump-trading/all.csv rename to leetcode/jump-trading/all.csv diff --git a/jump-trading/more-than-six-months.csv b/leetcode/jump-trading/more-than-six-months.csv similarity index 100% rename from jump-trading/more-than-six-months.csv rename to leetcode/jump-trading/more-than-six-months.csv diff --git a/jump-trading/six-months.csv b/leetcode/jump-trading/six-months.csv similarity index 100% rename from jump-trading/six-months.csv rename to leetcode/jump-trading/six-months.csv diff --git a/junglee-games/all.csv b/leetcode/junglee-games/all.csv similarity index 100% rename from junglee-games/all.csv rename to leetcode/junglee-games/all.csv diff --git a/junglee-games/more-than-six-months.csv b/leetcode/junglee-games/more-than-six-months.csv similarity index 100% rename from junglee-games/more-than-six-months.csv rename to leetcode/junglee-games/more-than-six-months.csv diff --git a/juniper/all.csv b/leetcode/juniper/all.csv similarity index 100% rename from juniper/all.csv rename to leetcode/juniper/all.csv diff --git a/juniper/more-than-six-months.csv b/leetcode/juniper/more-than-six-months.csv similarity index 100% rename from juniper/more-than-six-months.csv rename to leetcode/juniper/more-than-six-months.csv diff --git a/juspay/all.csv b/leetcode/juspay/all.csv similarity index 100% rename from juspay/all.csv rename to leetcode/juspay/all.csv diff --git a/juspay/more-than-six-months.csv b/leetcode/juspay/more-than-six-months.csv similarity index 100% rename from juspay/more-than-six-months.csv rename to leetcode/juspay/more-than-six-months.csv diff --git a/juspay/six-months.csv b/leetcode/juspay/six-months.csv similarity index 100% rename from juspay/six-months.csv rename to leetcode/juspay/six-months.csv diff --git a/juspay/three-months.csv b/leetcode/juspay/three-months.csv similarity index 100% rename from juspay/three-months.csv rename to leetcode/juspay/three-months.csv diff --git a/justworks/all.csv b/leetcode/justworks/all.csv similarity index 100% rename from justworks/all.csv rename to leetcode/justworks/all.csv diff --git a/justworks/more-than-six-months.csv b/leetcode/justworks/more-than-six-months.csv similarity index 100% rename from justworks/more-than-six-months.csv rename to leetcode/justworks/more-than-six-months.csv diff --git a/kakao/all.csv b/leetcode/kakao/all.csv similarity index 100% rename from kakao/all.csv rename to leetcode/kakao/all.csv diff --git a/kakao/more-than-six-months.csv b/leetcode/kakao/more-than-six-months.csv similarity index 100% rename from kakao/more-than-six-months.csv rename to leetcode/kakao/more-than-six-months.csv diff --git a/karat/all.csv b/leetcode/karat/all.csv similarity index 100% rename from karat/all.csv rename to leetcode/karat/all.csv diff --git a/karat/more-than-six-months.csv b/leetcode/karat/more-than-six-months.csv similarity index 100% rename from karat/more-than-six-months.csv rename to leetcode/karat/more-than-six-months.csv diff --git a/karat/six-months.csv b/leetcode/karat/six-months.csv similarity index 100% rename from karat/six-months.csv rename to leetcode/karat/six-months.csv diff --git a/karat/thirty-days.csv b/leetcode/karat/thirty-days.csv similarity index 100% rename from karat/thirty-days.csv rename to leetcode/karat/thirty-days.csv diff --git a/karat/three-months.csv b/leetcode/karat/three-months.csv similarity index 100% rename from karat/three-months.csv rename to leetcode/karat/three-months.csv diff --git a/keeptruckin/all.csv b/leetcode/keeptruckin/all.csv similarity index 100% rename from keeptruckin/all.csv rename to leetcode/keeptruckin/all.csv diff --git a/keeptruckin/more-than-six-months.csv b/leetcode/keeptruckin/more-than-six-months.csv similarity index 100% rename from keeptruckin/more-than-six-months.csv rename to leetcode/keeptruckin/more-than-six-months.csv diff --git a/keeptruckin/six-months.csv b/leetcode/keeptruckin/six-months.csv similarity index 100% rename from keeptruckin/six-months.csv rename to leetcode/keeptruckin/six-months.csv diff --git a/keeptruckin/three-months.csv b/leetcode/keeptruckin/three-months.csv similarity index 100% rename from keeptruckin/three-months.csv rename to leetcode/keeptruckin/three-months.csv diff --git a/kla-tencor/all.csv b/leetcode/kla-tencor/all.csv similarity index 100% rename from kla-tencor/all.csv rename to leetcode/kla-tencor/all.csv diff --git a/kla-tencor/more-than-six-months.csv b/leetcode/kla-tencor/more-than-six-months.csv similarity index 100% rename from kla-tencor/more-than-six-months.csv rename to leetcode/kla-tencor/more-than-six-months.csv diff --git a/kla-tencor/six-months.csv b/leetcode/kla-tencor/six-months.csv similarity index 100% rename from kla-tencor/six-months.csv rename to leetcode/kla-tencor/six-months.csv diff --git a/kla/all.csv b/leetcode/kla/all.csv similarity index 100% rename from kla/all.csv rename to leetcode/kla/all.csv diff --git a/kla/more-than-six-months.csv b/leetcode/kla/more-than-six-months.csv similarity index 100% rename from kla/more-than-six-months.csv rename to leetcode/kla/more-than-six-months.csv diff --git a/kla/six-months.csv b/leetcode/kla/six-months.csv similarity index 100% rename from kla/six-months.csv rename to leetcode/kla/six-months.csv diff --git a/kla/thirty-days.csv b/leetcode/kla/thirty-days.csv similarity index 100% rename from kla/thirty-days.csv rename to leetcode/kla/thirty-days.csv diff --git a/kla/three-months.csv b/leetcode/kla/three-months.csv similarity index 100% rename from kla/three-months.csv rename to leetcode/kla/three-months.csv diff --git a/komprise/all.csv b/leetcode/komprise/all.csv similarity index 100% rename from komprise/all.csv rename to leetcode/komprise/all.csv diff --git a/komprise/more-than-six-months.csv b/leetcode/komprise/more-than-six-months.csv similarity index 100% rename from komprise/more-than-six-months.csv rename to leetcode/komprise/more-than-six-months.csv diff --git a/kotak-mahindra-bank/all.csv b/leetcode/kotak-mahindra-bank/all.csv similarity index 100% rename from kotak-mahindra-bank/all.csv rename to leetcode/kotak-mahindra-bank/all.csv diff --git a/kotak-mahindra-bank/more-than-six-months.csv b/leetcode/kotak-mahindra-bank/more-than-six-months.csv similarity index 100% rename from kotak-mahindra-bank/more-than-six-months.csv rename to leetcode/kotak-mahindra-bank/more-than-six-months.csv diff --git a/kpit/all.csv b/leetcode/kpit/all.csv similarity index 100% rename from kpit/all.csv rename to leetcode/kpit/all.csv diff --git a/kpit/more-than-six-months.csv b/leetcode/kpit/more-than-six-months.csv similarity index 100% rename from kpit/more-than-six-months.csv rename to leetcode/kpit/more-than-six-months.csv diff --git a/kpmg/all.csv b/leetcode/kpmg/all.csv similarity index 100% rename from kpmg/all.csv rename to leetcode/kpmg/all.csv diff --git a/kpmg/six-months.csv b/leetcode/kpmg/six-months.csv similarity index 100% rename from kpmg/six-months.csv rename to leetcode/kpmg/six-months.csv diff --git a/lacework/all.csv b/leetcode/lacework/all.csv similarity index 100% rename from lacework/all.csv rename to leetcode/lacework/all.csv diff --git a/lacework/more-than-six-months.csv b/leetcode/lacework/more-than-six-months.csv similarity index 100% rename from lacework/more-than-six-months.csv rename to leetcode/lacework/more-than-six-months.csv diff --git a/larsen-toubro/all.csv b/leetcode/larsen-toubro/all.csv similarity index 100% rename from larsen-toubro/all.csv rename to leetcode/larsen-toubro/all.csv diff --git a/larsen-toubro/more-than-six-months.csv b/leetcode/larsen-toubro/more-than-six-months.csv similarity index 100% rename from larsen-toubro/more-than-six-months.csv rename to leetcode/larsen-toubro/more-than-six-months.csv diff --git a/leap-motion/all.csv b/leetcode/leap-motion/all.csv similarity index 100% rename from leap-motion/all.csv rename to leetcode/leap-motion/all.csv diff --git a/leap-motion/more-than-six-months.csv b/leetcode/leap-motion/more-than-six-months.csv similarity index 100% rename from leap-motion/more-than-six-months.csv rename to leetcode/leap-motion/more-than-six-months.csv diff --git a/lendingkart/all.csv b/leetcode/lendingkart/all.csv similarity index 100% rename from lendingkart/all.csv rename to leetcode/lendingkart/all.csv diff --git a/lenskart/all.csv b/leetcode/lenskart/all.csv similarity index 100% rename from lenskart/all.csv rename to leetcode/lenskart/all.csv diff --git a/lenskart/more-than-six-months.csv b/leetcode/lenskart/more-than-six-months.csv similarity index 100% rename from lenskart/more-than-six-months.csv rename to leetcode/lenskart/more-than-six-months.csv diff --git a/lg-electronics/all.csv b/leetcode/lg-electronics/all.csv similarity index 100% rename from lg-electronics/all.csv rename to leetcode/lg-electronics/all.csv diff --git a/lg-electronics/more-than-six-months.csv b/leetcode/lg-electronics/more-than-six-months.csv similarity index 100% rename from lg-electronics/more-than-six-months.csv rename to leetcode/lg-electronics/more-than-six-months.csv diff --git a/lg-electronics/six-months.csv b/leetcode/lg-electronics/six-months.csv similarity index 100% rename from lg-electronics/six-months.csv rename to leetcode/lg-electronics/six-months.csv diff --git a/licious/all.csv b/leetcode/licious/all.csv similarity index 100% rename from licious/all.csv rename to leetcode/licious/all.csv diff --git a/licious/more-than-six-months.csv b/leetcode/licious/more-than-six-months.csv similarity index 100% rename from licious/more-than-six-months.csv rename to leetcode/licious/more-than-six-months.csv diff --git a/liftoff/all.csv b/leetcode/liftoff/all.csv similarity index 100% rename from liftoff/all.csv rename to leetcode/liftoff/all.csv diff --git a/liftoff/more-than-six-months.csv b/leetcode/liftoff/more-than-six-months.csv similarity index 100% rename from liftoff/more-than-six-months.csv rename to leetcode/liftoff/more-than-six-months.csv diff --git a/liftoff/six-months.csv b/leetcode/liftoff/six-months.csv similarity index 100% rename from liftoff/six-months.csv rename to leetcode/liftoff/six-months.csv diff --git a/liftoff/three-months.csv b/leetcode/liftoff/three-months.csv similarity index 100% rename from liftoff/three-months.csv rename to leetcode/liftoff/three-months.csv diff --git a/lime/all.csv b/leetcode/lime/all.csv similarity index 100% rename from lime/all.csv rename to leetcode/lime/all.csv diff --git a/lime/more-than-six-months.csv b/leetcode/lime/more-than-six-months.csv similarity index 100% rename from lime/more-than-six-months.csv rename to leetcode/lime/more-than-six-months.csv diff --git a/lime/six-months.csv b/leetcode/lime/six-months.csv similarity index 100% rename from lime/six-months.csv rename to leetcode/lime/six-months.csv diff --git a/line/all.csv b/leetcode/line/all.csv similarity index 100% rename from line/all.csv rename to leetcode/line/all.csv diff --git a/line/more-than-six-months.csv b/leetcode/line/more-than-six-months.csv similarity index 100% rename from line/more-than-six-months.csv rename to leetcode/line/more-than-six-months.csv diff --git a/line/six-months.csv b/leetcode/line/six-months.csv similarity index 100% rename from line/six-months.csv rename to leetcode/line/six-months.csv diff --git a/line/three-months.csv b/leetcode/line/three-months.csv similarity index 100% rename from line/three-months.csv rename to leetcode/line/three-months.csv diff --git a/linkedin/all.csv b/leetcode/linkedin/all.csv similarity index 100% rename from linkedin/all.csv rename to leetcode/linkedin/all.csv diff --git a/linkedin/more-than-six-months.csv b/leetcode/linkedin/more-than-six-months.csv similarity index 100% rename from linkedin/more-than-six-months.csv rename to leetcode/linkedin/more-than-six-months.csv diff --git a/linkedin/six-months.csv b/leetcode/linkedin/six-months.csv similarity index 100% rename from linkedin/six-months.csv rename to leetcode/linkedin/six-months.csv diff --git a/linkedin/thirty-days.csv b/leetcode/linkedin/thirty-days.csv similarity index 100% rename from linkedin/thirty-days.csv rename to leetcode/linkedin/thirty-days.csv diff --git a/linkedin/three-months.csv b/leetcode/linkedin/three-months.csv similarity index 100% rename from linkedin/three-months.csv rename to leetcode/linkedin/three-months.csv diff --git a/liveramp/all.csv b/leetcode/liveramp/all.csv similarity index 100% rename from liveramp/all.csv rename to leetcode/liveramp/all.csv diff --git a/liveramp/more-than-six-months.csv b/leetcode/liveramp/more-than-six-months.csv similarity index 100% rename from liveramp/more-than-six-months.csv rename to leetcode/liveramp/more-than-six-months.csv diff --git a/livspace/all.csv b/leetcode/livspace/all.csv similarity index 100% rename from livspace/all.csv rename to leetcode/livspace/all.csv diff --git a/livspace/six-months.csv b/leetcode/livspace/six-months.csv similarity index 100% rename from livspace/six-months.csv rename to leetcode/livspace/six-months.csv diff --git a/livspace/three-months.csv b/leetcode/livspace/three-months.csv similarity index 100% rename from livspace/three-months.csv rename to leetcode/livspace/three-months.csv diff --git a/lowe/all.csv b/leetcode/lowe/all.csv similarity index 100% rename from lowe/all.csv rename to leetcode/lowe/all.csv diff --git a/lowe/more-than-six-months.csv b/leetcode/lowe/more-than-six-months.csv similarity index 100% rename from lowe/more-than-six-months.csv rename to leetcode/lowe/more-than-six-months.csv diff --git a/lti/all.csv b/leetcode/lti/all.csv similarity index 100% rename from lti/all.csv rename to leetcode/lti/all.csv diff --git a/lti/more-than-six-months.csv b/leetcode/lti/more-than-six-months.csv similarity index 100% rename from lti/more-than-six-months.csv rename to leetcode/lti/more-than-six-months.csv diff --git a/lucid/all.csv b/leetcode/lucid/all.csv similarity index 100% rename from lucid/all.csv rename to leetcode/lucid/all.csv diff --git a/lucid/more-than-six-months.csv b/leetcode/lucid/more-than-six-months.csv similarity index 100% rename from lucid/more-than-six-months.csv rename to leetcode/lucid/more-than-six-months.csv diff --git a/lucid/six-months.csv b/leetcode/lucid/six-months.csv similarity index 100% rename from lucid/six-months.csv rename to leetcode/lucid/six-months.csv diff --git a/lucid/thirty-days.csv b/leetcode/lucid/thirty-days.csv similarity index 100% rename from lucid/thirty-days.csv rename to leetcode/lucid/thirty-days.csv diff --git a/lucid/three-months.csv b/leetcode/lucid/three-months.csv similarity index 100% rename from lucid/three-months.csv rename to leetcode/lucid/three-months.csv diff --git a/luxoft/all.csv b/leetcode/luxoft/all.csv similarity index 100% rename from luxoft/all.csv rename to leetcode/luxoft/all.csv diff --git a/luxoft/more-than-six-months.csv b/leetcode/luxoft/more-than-six-months.csv similarity index 100% rename from luxoft/more-than-six-months.csv rename to leetcode/luxoft/more-than-six-months.csv diff --git a/luxoft/six-months.csv b/leetcode/luxoft/six-months.csv similarity index 100% rename from luxoft/six-months.csv rename to leetcode/luxoft/six-months.csv diff --git a/lyft/all.csv b/leetcode/lyft/all.csv similarity index 100% rename from lyft/all.csv rename to leetcode/lyft/all.csv diff --git a/lyft/more-than-six-months.csv b/leetcode/lyft/more-than-six-months.csv similarity index 100% rename from lyft/more-than-six-months.csv rename to leetcode/lyft/more-than-six-months.csv diff --git a/lyft/six-months.csv b/leetcode/lyft/six-months.csv similarity index 100% rename from lyft/six-months.csv rename to leetcode/lyft/six-months.csv diff --git a/lyft/thirty-days.csv b/leetcode/lyft/thirty-days.csv similarity index 100% rename from lyft/thirty-days.csv rename to leetcode/lyft/thirty-days.csv diff --git a/lyft/three-months.csv b/leetcode/lyft/three-months.csv similarity index 100% rename from lyft/three-months.csv rename to leetcode/lyft/three-months.csv diff --git a/machine-zone/all.csv b/leetcode/machine-zone/all.csv similarity index 100% rename from machine-zone/all.csv rename to leetcode/machine-zone/all.csv diff --git a/machine-zone/more-than-six-months.csv b/leetcode/machine-zone/more-than-six-months.csv similarity index 100% rename from machine-zone/more-than-six-months.csv rename to leetcode/machine-zone/more-than-six-months.csv diff --git a/machinezone/all.csv b/leetcode/machinezone/all.csv similarity index 100% rename from machinezone/all.csv rename to leetcode/machinezone/all.csv diff --git a/machinezone/more-than-six-months.csv b/leetcode/machinezone/more-than-six-months.csv similarity index 100% rename from machinezone/more-than-six-months.csv rename to leetcode/machinezone/more-than-six-months.csv diff --git a/maersk/all.csv b/leetcode/maersk/all.csv similarity index 100% rename from maersk/all.csv rename to leetcode/maersk/all.csv diff --git a/maersk/more-than-six-months.csv b/leetcode/maersk/more-than-six-months.csv similarity index 100% rename from maersk/more-than-six-months.csv rename to leetcode/maersk/more-than-six-months.csv diff --git a/makemytrip/all.csv b/leetcode/makemytrip/all.csv similarity index 100% rename from makemytrip/all.csv rename to leetcode/makemytrip/all.csv diff --git a/makemytrip/more-than-six-months.csv b/leetcode/makemytrip/more-than-six-months.csv similarity index 100% rename from makemytrip/more-than-six-months.csv rename to leetcode/makemytrip/more-than-six-months.csv diff --git a/mapbox/all.csv b/leetcode/mapbox/all.csv similarity index 100% rename from mapbox/all.csv rename to leetcode/mapbox/all.csv diff --git a/maq-software/all.csv b/leetcode/maq-software/all.csv similarity index 100% rename from maq-software/all.csv rename to leetcode/maq-software/all.csv diff --git a/maq-software/more-than-six-months.csv b/leetcode/maq-software/more-than-six-months.csv similarity index 100% rename from maq-software/more-than-six-months.csv rename to leetcode/maq-software/more-than-six-months.csv diff --git a/marqeta/all.csv b/leetcode/marqeta/all.csv similarity index 100% rename from marqeta/all.csv rename to leetcode/marqeta/all.csv diff --git a/marqeta/more-than-six-months.csv b/leetcode/marqeta/more-than-six-months.csv similarity index 100% rename from marqeta/more-than-six-months.csv rename to leetcode/marqeta/more-than-six-months.csv diff --git a/marqeta/six-months.csv b/leetcode/marqeta/six-months.csv similarity index 100% rename from marqeta/six-months.csv rename to leetcode/marqeta/six-months.csv diff --git a/marqeta/thirty-days.csv b/leetcode/marqeta/thirty-days.csv similarity index 100% rename from marqeta/thirty-days.csv rename to leetcode/marqeta/thirty-days.csv diff --git a/marqeta/three-months.csv b/leetcode/marqeta/three-months.csv similarity index 100% rename from marqeta/three-months.csv rename to leetcode/marqeta/three-months.csv diff --git a/mastercard/all.csv b/leetcode/mastercard/all.csv similarity index 100% rename from mastercard/all.csv rename to leetcode/mastercard/all.csv diff --git a/mastercard/more-than-six-months.csv b/leetcode/mastercard/more-than-six-months.csv similarity index 100% rename from mastercard/more-than-six-months.csv rename to leetcode/mastercard/more-than-six-months.csv diff --git a/mastercard/six-months.csv b/leetcode/mastercard/six-months.csv similarity index 100% rename from mastercard/six-months.csv rename to leetcode/mastercard/six-months.csv diff --git a/mastercard/three-months.csv b/leetcode/mastercard/three-months.csv similarity index 100% rename from mastercard/three-months.csv rename to leetcode/mastercard/three-months.csv diff --git a/mathworks/all.csv b/leetcode/mathworks/all.csv similarity index 100% rename from mathworks/all.csv rename to leetcode/mathworks/all.csv diff --git a/mathworks/more-than-six-months.csv b/leetcode/mathworks/more-than-six-months.csv similarity index 100% rename from mathworks/more-than-six-months.csv rename to leetcode/mathworks/more-than-six-months.csv diff --git a/mathworks/six-months.csv b/leetcode/mathworks/six-months.csv similarity index 100% rename from mathworks/six-months.csv rename to leetcode/mathworks/six-months.csv diff --git a/mathworks/three-months.csv b/leetcode/mathworks/three-months.csv similarity index 100% rename from mathworks/three-months.csv rename to leetcode/mathworks/three-months.csv diff --git a/mcafee/all.csv b/leetcode/mcafee/all.csv similarity index 100% rename from mcafee/all.csv rename to leetcode/mcafee/all.csv diff --git a/mcafee/more-than-six-months.csv b/leetcode/mcafee/more-than-six-months.csv similarity index 100% rename from mcafee/more-than-six-months.csv rename to leetcode/mcafee/more-than-six-months.csv diff --git a/mckinsey/all.csv b/leetcode/mckinsey/all.csv similarity index 100% rename from mckinsey/all.csv rename to leetcode/mckinsey/all.csv diff --git a/mckinsey/more-than-six-months.csv b/leetcode/mckinsey/more-than-six-months.csv similarity index 100% rename from mckinsey/more-than-six-months.csv rename to leetcode/mckinsey/more-than-six-months.csv diff --git a/medianet/all.csv b/leetcode/medianet/all.csv similarity index 100% rename from medianet/all.csv rename to leetcode/medianet/all.csv diff --git a/medianet/more-than-six-months.csv b/leetcode/medianet/more-than-six-months.csv similarity index 100% rename from medianet/more-than-six-months.csv rename to leetcode/medianet/more-than-six-months.csv diff --git a/medianet/six-months.csv b/leetcode/medianet/six-months.csv similarity index 100% rename from medianet/six-months.csv rename to leetcode/medianet/six-months.csv diff --git a/medianet/thirty-days.csv b/leetcode/medianet/thirty-days.csv similarity index 100% rename from medianet/thirty-days.csv rename to leetcode/medianet/thirty-days.csv diff --git a/medianet/three-months.csv b/leetcode/medianet/three-months.csv similarity index 100% rename from medianet/three-months.csv rename to leetcode/medianet/three-months.csv diff --git a/meesho/all.csv b/leetcode/meesho/all.csv similarity index 100% rename from meesho/all.csv rename to leetcode/meesho/all.csv diff --git a/meesho/more-than-six-months.csv b/leetcode/meesho/more-than-six-months.csv similarity index 100% rename from meesho/more-than-six-months.csv rename to leetcode/meesho/more-than-six-months.csv diff --git a/meesho/six-months.csv b/leetcode/meesho/six-months.csv similarity index 100% rename from meesho/six-months.csv rename to leetcode/meesho/six-months.csv diff --git a/meesho/thirty-days.csv b/leetcode/meesho/thirty-days.csv similarity index 100% rename from meesho/thirty-days.csv rename to leetcode/meesho/thirty-days.csv diff --git a/meesho/three-months.csv b/leetcode/meesho/three-months.csv similarity index 100% rename from meesho/three-months.csv rename to leetcode/meesho/three-months.csv diff --git a/meituan/all.csv b/leetcode/meituan/all.csv similarity index 100% rename from meituan/all.csv rename to leetcode/meituan/all.csv diff --git a/meituan/more-than-six-months.csv b/leetcode/meituan/more-than-six-months.csv similarity index 100% rename from meituan/more-than-six-months.csv rename to leetcode/meituan/more-than-six-months.csv diff --git a/mercari/all.csv b/leetcode/mercari/all.csv similarity index 100% rename from mercari/all.csv rename to leetcode/mercari/all.csv diff --git a/mercari/more-than-six-months.csv b/leetcode/mercari/more-than-six-months.csv similarity index 100% rename from mercari/more-than-six-months.csv rename to leetcode/mercari/more-than-six-months.csv diff --git a/micro1/all.csv b/leetcode/micro1/all.csv similarity index 100% rename from micro1/all.csv rename to leetcode/micro1/all.csv diff --git a/micro1/more-than-six-months.csv b/leetcode/micro1/more-than-six-months.csv similarity index 100% rename from micro1/more-than-six-months.csv rename to leetcode/micro1/more-than-six-months.csv diff --git a/microsoft/all.csv b/leetcode/microsoft/all.csv similarity index 100% rename from microsoft/all.csv rename to leetcode/microsoft/all.csv diff --git a/microsoft/more-than-six-months.csv b/leetcode/microsoft/more-than-six-months.csv similarity index 100% rename from microsoft/more-than-six-months.csv rename to leetcode/microsoft/more-than-six-months.csv diff --git a/microsoft/six-months.csv b/leetcode/microsoft/six-months.csv similarity index 100% rename from microsoft/six-months.csv rename to leetcode/microsoft/six-months.csv diff --git a/microsoft/thirty-days.csv b/leetcode/microsoft/thirty-days.csv similarity index 100% rename from microsoft/thirty-days.csv rename to leetcode/microsoft/thirty-days.csv diff --git a/microsoft/three-months.csv b/leetcode/microsoft/three-months.csv similarity index 100% rename from microsoft/three-months.csv rename to leetcode/microsoft/three-months.csv diff --git a/microstrategy/all.csv b/leetcode/microstrategy/all.csv similarity index 100% rename from microstrategy/all.csv rename to leetcode/microstrategy/all.csv diff --git a/microstrategy/more-than-six-months.csv b/leetcode/microstrategy/more-than-six-months.csv similarity index 100% rename from microstrategy/more-than-six-months.csv rename to leetcode/microstrategy/more-than-six-months.csv diff --git a/millennium/all.csv b/leetcode/millennium/all.csv similarity index 100% rename from millennium/all.csv rename to leetcode/millennium/all.csv diff --git a/millennium/more-than-six-months.csv b/leetcode/millennium/more-than-six-months.csv similarity index 100% rename from millennium/more-than-six-months.csv rename to leetcode/millennium/more-than-six-months.csv diff --git a/millennium/six-months.csv b/leetcode/millennium/six-months.csv similarity index 100% rename from millennium/six-months.csv rename to leetcode/millennium/six-months.csv diff --git a/mindtickle/all.csv b/leetcode/mindtickle/all.csv similarity index 100% rename from mindtickle/all.csv rename to leetcode/mindtickle/all.csv diff --git a/mindtickle/more-than-six-months.csv b/leetcode/mindtickle/more-than-six-months.csv similarity index 100% rename from mindtickle/more-than-six-months.csv rename to leetcode/mindtickle/more-than-six-months.csv diff --git a/mindtree/all.csv b/leetcode/mindtree/all.csv similarity index 100% rename from mindtree/all.csv rename to leetcode/mindtree/all.csv diff --git a/mindtree/more-than-six-months.csv b/leetcode/mindtree/more-than-six-months.csv similarity index 100% rename from mindtree/more-than-six-months.csv rename to leetcode/mindtree/more-than-six-months.csv diff --git a/miro/all.csv b/leetcode/miro/all.csv similarity index 100% rename from miro/all.csv rename to leetcode/miro/all.csv diff --git a/miro/more-than-six-months.csv b/leetcode/miro/more-than-six-months.csv similarity index 100% rename from miro/more-than-six-months.csv rename to leetcode/miro/more-than-six-months.csv diff --git a/mishipay/all.csv b/leetcode/mishipay/all.csv similarity index 100% rename from mishipay/all.csv rename to leetcode/mishipay/all.csv diff --git a/mishipay/more-than-six-months.csv b/leetcode/mishipay/more-than-six-months.csv similarity index 100% rename from mishipay/more-than-six-months.csv rename to leetcode/mishipay/more-than-six-months.csv diff --git a/mitsogo/all.csv b/leetcode/mitsogo/all.csv similarity index 100% rename from mitsogo/all.csv rename to leetcode/mitsogo/all.csv diff --git a/mitsogo/more-than-six-months.csv b/leetcode/mitsogo/more-than-six-months.csv similarity index 100% rename from mitsogo/more-than-six-months.csv rename to leetcode/mitsogo/more-than-six-months.csv diff --git a/mixpanel/all.csv b/leetcode/mixpanel/all.csv similarity index 100% rename from mixpanel/all.csv rename to leetcode/mixpanel/all.csv diff --git a/mixpanel/more-than-six-months.csv b/leetcode/mixpanel/more-than-six-months.csv similarity index 100% rename from mixpanel/more-than-six-months.csv rename to leetcode/mixpanel/more-than-six-months.csv diff --git a/mixpanel/six-months.csv b/leetcode/mixpanel/six-months.csv similarity index 100% rename from mixpanel/six-months.csv rename to leetcode/mixpanel/six-months.csv diff --git a/mixpanel/three-months.csv b/leetcode/mixpanel/three-months.csv similarity index 100% rename from mixpanel/three-months.csv rename to leetcode/mixpanel/three-months.csv diff --git a/mobileye/all.csv b/leetcode/mobileye/all.csv similarity index 100% rename from mobileye/all.csv rename to leetcode/mobileye/all.csv diff --git a/mobileye/more-than-six-months.csv b/leetcode/mobileye/more-than-six-months.csv similarity index 100% rename from mobileye/more-than-six-months.csv rename to leetcode/mobileye/more-than-six-months.csv diff --git a/mobisy/all.csv b/leetcode/mobisy/all.csv similarity index 100% rename from mobisy/all.csv rename to leetcode/mobisy/all.csv diff --git a/mobisy/more-than-six-months.csv b/leetcode/mobisy/more-than-six-months.csv similarity index 100% rename from mobisy/more-than-six-months.csv rename to leetcode/mobisy/more-than-six-months.csv diff --git a/moengage/all.csv b/leetcode/moengage/all.csv similarity index 100% rename from moengage/all.csv rename to leetcode/moengage/all.csv diff --git a/moengage/more-than-six-months.csv b/leetcode/moengage/more-than-six-months.csv similarity index 100% rename from moengage/more-than-six-months.csv rename to leetcode/moengage/more-than-six-months.csv diff --git a/moloco/all.csv b/leetcode/moloco/all.csv similarity index 100% rename from moloco/all.csv rename to leetcode/moloco/all.csv diff --git a/moloco/more-than-six-months.csv b/leetcode/moloco/more-than-six-months.csv similarity index 100% rename from moloco/more-than-six-months.csv rename to leetcode/moloco/more-than-six-months.csv diff --git a/moloco/six-months.csv b/leetcode/moloco/six-months.csv similarity index 100% rename from moloco/six-months.csv rename to leetcode/moloco/six-months.csv diff --git a/moneylion/all.csv b/leetcode/moneylion/all.csv similarity index 100% rename from moneylion/all.csv rename to leetcode/moneylion/all.csv diff --git a/moneylion/more-than-six-months.csv b/leetcode/moneylion/more-than-six-months.csv similarity index 100% rename from moneylion/more-than-six-months.csv rename to leetcode/moneylion/more-than-six-months.csv diff --git a/mongodb/all.csv b/leetcode/mongodb/all.csv similarity index 100% rename from mongodb/all.csv rename to leetcode/mongodb/all.csv diff --git a/mongodb/more-than-six-months.csv b/leetcode/mongodb/more-than-six-months.csv similarity index 100% rename from mongodb/more-than-six-months.csv rename to leetcode/mongodb/more-than-six-months.csv diff --git a/mongodb/six-months.csv b/leetcode/mongodb/six-months.csv similarity index 100% rename from mongodb/six-months.csv rename to leetcode/mongodb/six-months.csv diff --git a/mongodb/three-months.csv b/leetcode/mongodb/three-months.csv similarity index 100% rename from mongodb/three-months.csv rename to leetcode/mongodb/three-months.csv diff --git a/morgan-stanley/all.csv b/leetcode/morgan-stanley/all.csv similarity index 100% rename from morgan-stanley/all.csv rename to leetcode/morgan-stanley/all.csv diff --git a/morgan-stanley/more-than-six-months.csv b/leetcode/morgan-stanley/more-than-six-months.csv similarity index 100% rename from morgan-stanley/more-than-six-months.csv rename to leetcode/morgan-stanley/more-than-six-months.csv diff --git a/morgan-stanley/six-months.csv b/leetcode/morgan-stanley/six-months.csv similarity index 100% rename from morgan-stanley/six-months.csv rename to leetcode/morgan-stanley/six-months.csv diff --git a/morgan-stanley/three-months.csv b/leetcode/morgan-stanley/three-months.csv similarity index 100% rename from morgan-stanley/three-months.csv rename to leetcode/morgan-stanley/three-months.csv diff --git a/motorola/all.csv b/leetcode/motorola/all.csv similarity index 100% rename from motorola/all.csv rename to leetcode/motorola/all.csv diff --git a/motorola/more-than-six-months.csv b/leetcode/motorola/more-than-six-months.csv similarity index 100% rename from motorola/more-than-six-months.csv rename to leetcode/motorola/more-than-six-months.csv diff --git a/mountblue/all.csv b/leetcode/mountblue/all.csv similarity index 100% rename from mountblue/all.csv rename to leetcode/mountblue/all.csv diff --git a/mountblue/more-than-six-months.csv b/leetcode/mountblue/more-than-six-months.csv similarity index 100% rename from mountblue/more-than-six-months.csv rename to leetcode/mountblue/more-than-six-months.csv diff --git a/moveworks/all.csv b/leetcode/moveworks/all.csv similarity index 100% rename from moveworks/all.csv rename to leetcode/moveworks/all.csv diff --git a/moveworks/more-than-six-months.csv b/leetcode/moveworks/more-than-six-months.csv similarity index 100% rename from moveworks/more-than-six-months.csv rename to leetcode/moveworks/more-than-six-months.csv diff --git a/moveworks/six-months.csv b/leetcode/moveworks/six-months.csv similarity index 100% rename from moveworks/six-months.csv rename to leetcode/moveworks/six-months.csv diff --git a/moveworks/three-months.csv b/leetcode/moveworks/three-months.csv similarity index 100% rename from moveworks/three-months.csv rename to leetcode/moveworks/three-months.csv diff --git a/msci/all.csv b/leetcode/msci/all.csv similarity index 100% rename from msci/all.csv rename to leetcode/msci/all.csv diff --git a/msci/more-than-six-months.csv b/leetcode/msci/more-than-six-months.csv similarity index 100% rename from msci/more-than-six-months.csv rename to leetcode/msci/more-than-six-months.csv diff --git a/mts/all.csv b/leetcode/mts/all.csv similarity index 100% rename from mts/all.csv rename to leetcode/mts/all.csv diff --git a/mts/more-than-six-months.csv b/leetcode/mts/more-than-six-months.csv similarity index 100% rename from mts/more-than-six-months.csv rename to leetcode/mts/more-than-six-months.csv diff --git a/murex/all.csv b/leetcode/murex/all.csv similarity index 100% rename from murex/all.csv rename to leetcode/murex/all.csv diff --git a/murex/more-than-six-months.csv b/leetcode/murex/more-than-six-months.csv similarity index 100% rename from murex/more-than-six-months.csv rename to leetcode/murex/more-than-six-months.csv diff --git a/mykaarma/all.csv b/leetcode/mykaarma/all.csv similarity index 100% rename from mykaarma/all.csv rename to leetcode/mykaarma/all.csv diff --git a/mykaarma/more-than-six-months.csv b/leetcode/mykaarma/more-than-six-months.csv similarity index 100% rename from mykaarma/more-than-six-months.csv rename to leetcode/mykaarma/more-than-six-months.csv diff --git a/myntra/all.csv b/leetcode/myntra/all.csv similarity index 100% rename from myntra/all.csv rename to leetcode/myntra/all.csv diff --git a/myntra/more-than-six-months.csv b/leetcode/myntra/more-than-six-months.csv similarity index 100% rename from myntra/more-than-six-months.csv rename to leetcode/myntra/more-than-six-months.csv diff --git a/myntra/six-months.csv b/leetcode/myntra/six-months.csv similarity index 100% rename from myntra/six-months.csv rename to leetcode/myntra/six-months.csv diff --git a/nagarro/all.csv b/leetcode/nagarro/all.csv similarity index 100% rename from nagarro/all.csv rename to leetcode/nagarro/all.csv diff --git a/nagarro/more-than-six-months.csv b/leetcode/nagarro/more-than-six-months.csv similarity index 100% rename from nagarro/more-than-six-months.csv rename to leetcode/nagarro/more-than-six-months.csv diff --git a/national-instruments/all.csv b/leetcode/national-instruments/all.csv similarity index 100% rename from national-instruments/all.csv rename to leetcode/national-instruments/all.csv diff --git a/national-instruments/more-than-six-months.csv b/leetcode/national-instruments/more-than-six-months.csv similarity index 100% rename from national-instruments/more-than-six-months.csv rename to leetcode/national-instruments/more-than-six-months.csv diff --git a/national-payments-coorperation-india/all.csv b/leetcode/national-payments-coorperation-india/all.csv similarity index 100% rename from national-payments-coorperation-india/all.csv rename to leetcode/national-payments-coorperation-india/all.csv diff --git a/national-payments-coorperation-india/more-than-six-months.csv b/leetcode/national-payments-coorperation-india/more-than-six-months.csv similarity index 100% rename from national-payments-coorperation-india/more-than-six-months.csv rename to leetcode/national-payments-coorperation-india/more-than-six-months.csv diff --git a/navan/all.csv b/leetcode/navan/all.csv similarity index 100% rename from navan/all.csv rename to leetcode/navan/all.csv diff --git a/navan/more-than-six-months.csv b/leetcode/navan/more-than-six-months.csv similarity index 100% rename from navan/more-than-six-months.csv rename to leetcode/navan/more-than-six-months.csv diff --git a/navan/six-months.csv b/leetcode/navan/six-months.csv similarity index 100% rename from navan/six-months.csv rename to leetcode/navan/six-months.csv diff --git a/navan/three-months.csv b/leetcode/navan/three-months.csv similarity index 100% rename from navan/three-months.csv rename to leetcode/navan/three-months.csv diff --git a/naver/all.csv b/leetcode/naver/all.csv similarity index 100% rename from naver/all.csv rename to leetcode/naver/all.csv diff --git a/naver/more-than-six-months.csv b/leetcode/naver/more-than-six-months.csv similarity index 100% rename from naver/more-than-six-months.csv rename to leetcode/naver/more-than-six-months.csv diff --git a/navi/all.csv b/leetcode/navi/all.csv similarity index 100% rename from navi/all.csv rename to leetcode/navi/all.csv diff --git a/navi/more-than-six-months.csv b/leetcode/navi/more-than-six-months.csv similarity index 100% rename from navi/more-than-six-months.csv rename to leetcode/navi/more-than-six-months.csv diff --git a/ncr/all.csv b/leetcode/ncr/all.csv similarity index 100% rename from ncr/all.csv rename to leetcode/ncr/all.csv diff --git a/ncr/more-than-six-months.csv b/leetcode/ncr/more-than-six-months.csv similarity index 100% rename from ncr/more-than-six-months.csv rename to leetcode/ncr/more-than-six-months.csv diff --git a/nerdwallet/all.csv b/leetcode/nerdwallet/all.csv similarity index 100% rename from nerdwallet/all.csv rename to leetcode/nerdwallet/all.csv diff --git a/netapp/all.csv b/leetcode/netapp/all.csv similarity index 100% rename from netapp/all.csv rename to leetcode/netapp/all.csv diff --git a/netapp/more-than-six-months.csv b/leetcode/netapp/more-than-six-months.csv similarity index 100% rename from netapp/more-than-six-months.csv rename to leetcode/netapp/more-than-six-months.csv diff --git a/netapp/six-months.csv b/leetcode/netapp/six-months.csv similarity index 100% rename from netapp/six-months.csv rename to leetcode/netapp/six-months.csv diff --git a/netcracker-technology/all.csv b/leetcode/netcracker-technology/all.csv similarity index 100% rename from netcracker-technology/all.csv rename to leetcode/netcracker-technology/all.csv diff --git a/netcracker-technology/six-months.csv b/leetcode/netcracker-technology/six-months.csv similarity index 100% rename from netcracker-technology/six-months.csv rename to leetcode/netcracker-technology/six-months.csv diff --git a/netcracker-technology/three-months.csv b/leetcode/netcracker-technology/three-months.csv similarity index 100% rename from netcracker-technology/three-months.csv rename to leetcode/netcracker-technology/three-months.csv diff --git a/netease/all.csv b/leetcode/netease/all.csv similarity index 100% rename from netease/all.csv rename to leetcode/netease/all.csv diff --git a/netease/more-than-six-months.csv b/leetcode/netease/more-than-six-months.csv similarity index 100% rename from netease/more-than-six-months.csv rename to leetcode/netease/more-than-six-months.csv diff --git a/netflix/all.csv b/leetcode/netflix/all.csv similarity index 100% rename from netflix/all.csv rename to leetcode/netflix/all.csv diff --git a/netflix/more-than-six-months.csv b/leetcode/netflix/more-than-six-months.csv similarity index 100% rename from netflix/more-than-six-months.csv rename to leetcode/netflix/more-than-six-months.csv diff --git a/netflix/six-months.csv b/leetcode/netflix/six-months.csv similarity index 100% rename from netflix/six-months.csv rename to leetcode/netflix/six-months.csv diff --git a/netflix/thirty-days.csv b/leetcode/netflix/thirty-days.csv similarity index 100% rename from netflix/thirty-days.csv rename to leetcode/netflix/thirty-days.csv diff --git a/netflix/three-months.csv b/leetcode/netflix/three-months.csv similarity index 100% rename from netflix/three-months.csv rename to leetcode/netflix/three-months.csv diff --git a/netskope/all.csv b/leetcode/netskope/all.csv similarity index 100% rename from netskope/all.csv rename to leetcode/netskope/all.csv diff --git a/netskope/more-than-six-months.csv b/leetcode/netskope/more-than-six-months.csv similarity index 100% rename from netskope/more-than-six-months.csv rename to leetcode/netskope/more-than-six-months.csv diff --git a/netskope/six-months.csv b/leetcode/netskope/six-months.csv similarity index 100% rename from netskope/six-months.csv rename to leetcode/netskope/six-months.csv diff --git a/netsuite/all.csv b/leetcode/netsuite/all.csv similarity index 100% rename from netsuite/all.csv rename to leetcode/netsuite/all.csv diff --git a/netsuite/more-than-six-months.csv b/leetcode/netsuite/more-than-six-months.csv similarity index 100% rename from netsuite/more-than-six-months.csv rename to leetcode/netsuite/more-than-six-months.csv diff --git a/newsbreak/all.csv b/leetcode/newsbreak/all.csv similarity index 100% rename from newsbreak/all.csv rename to leetcode/newsbreak/all.csv diff --git a/newsbreak/six-months.csv b/leetcode/newsbreak/six-months.csv similarity index 100% rename from newsbreak/six-months.csv rename to leetcode/newsbreak/six-months.csv diff --git a/newsbreak/three-months.csv b/leetcode/newsbreak/three-months.csv similarity index 100% rename from newsbreak/three-months.csv rename to leetcode/newsbreak/three-months.csv diff --git a/nextdoor/all.csv b/leetcode/nextdoor/all.csv similarity index 100% rename from nextdoor/all.csv rename to leetcode/nextdoor/all.csv diff --git a/nextdoor/more-than-six-months.csv b/leetcode/nextdoor/more-than-six-months.csv similarity index 100% rename from nextdoor/more-than-six-months.csv rename to leetcode/nextdoor/more-than-six-months.csv diff --git a/nextdoor/six-months.csv b/leetcode/nextdoor/six-months.csv similarity index 100% rename from nextdoor/six-months.csv rename to leetcode/nextdoor/six-months.csv diff --git a/nextjump/all.csv b/leetcode/nextjump/all.csv similarity index 100% rename from nextjump/all.csv rename to leetcode/nextjump/all.csv diff --git a/nextjump/more-than-six-months.csv b/leetcode/nextjump/more-than-six-months.csv similarity index 100% rename from nextjump/more-than-six-months.csv rename to leetcode/nextjump/more-than-six-months.csv diff --git a/nference/all.csv b/leetcode/nference/all.csv similarity index 100% rename from nference/all.csv rename to leetcode/nference/all.csv diff --git a/nference/more-than-six-months.csv b/leetcode/nference/more-than-six-months.csv similarity index 100% rename from nference/more-than-six-months.csv rename to leetcode/nference/more-than-six-months.csv diff --git a/niantic/all.csv b/leetcode/niantic/all.csv similarity index 100% rename from niantic/all.csv rename to leetcode/niantic/all.csv diff --git a/niantic/more-than-six-months.csv b/leetcode/niantic/more-than-six-months.csv similarity index 100% rename from niantic/more-than-six-months.csv rename to leetcode/niantic/more-than-six-months.csv diff --git a/nielsen/all.csv b/leetcode/nielsen/all.csv similarity index 100% rename from nielsen/all.csv rename to leetcode/nielsen/all.csv diff --git a/nielsen/more-than-six-months.csv b/leetcode/nielsen/more-than-six-months.csv similarity index 100% rename from nielsen/more-than-six-months.csv rename to leetcode/nielsen/more-than-six-months.csv diff --git a/nike/all.csv b/leetcode/nike/all.csv similarity index 100% rename from nike/all.csv rename to leetcode/nike/all.csv diff --git a/nike/more-than-six-months.csv b/leetcode/nike/more-than-six-months.csv similarity index 100% rename from nike/more-than-six-months.csv rename to leetcode/nike/more-than-six-months.csv diff --git a/nike/six-months.csv b/leetcode/nike/six-months.csv similarity index 100% rename from nike/six-months.csv rename to leetcode/nike/six-months.csv diff --git a/nike/thirty-days.csv b/leetcode/nike/thirty-days.csv similarity index 100% rename from nike/thirty-days.csv rename to leetcode/nike/thirty-days.csv diff --git a/nike/three-months.csv b/leetcode/nike/three-months.csv similarity index 100% rename from nike/three-months.csv rename to leetcode/nike/three-months.csv diff --git a/ninjacart/all.csv b/leetcode/ninjacart/all.csv similarity index 100% rename from ninjacart/all.csv rename to leetcode/ninjacart/all.csv diff --git a/ninjacart/more-than-six-months.csv b/leetcode/ninjacart/more-than-six-months.csv similarity index 100% rename from ninjacart/more-than-six-months.csv rename to leetcode/ninjacart/more-than-six-months.csv diff --git a/nokia/all.csv b/leetcode/nokia/all.csv similarity index 100% rename from nokia/all.csv rename to leetcode/nokia/all.csv diff --git a/nokia/more-than-six-months.csv b/leetcode/nokia/more-than-six-months.csv similarity index 100% rename from nokia/more-than-six-months.csv rename to leetcode/nokia/more-than-six-months.csv diff --git a/nordstrom/all.csv b/leetcode/nordstrom/all.csv similarity index 100% rename from nordstrom/all.csv rename to leetcode/nordstrom/all.csv diff --git a/nordstrom/more-than-six-months.csv b/leetcode/nordstrom/more-than-six-months.csv similarity index 100% rename from nordstrom/more-than-six-months.csv rename to leetcode/nordstrom/more-than-six-months.csv diff --git a/nordstrom/six-months.csv b/leetcode/nordstrom/six-months.csv similarity index 100% rename from nordstrom/six-months.csv rename to leetcode/nordstrom/six-months.csv diff --git a/nordstrom/three-months.csv b/leetcode/nordstrom/three-months.csv similarity index 100% rename from nordstrom/three-months.csv rename to leetcode/nordstrom/three-months.csv diff --git a/notion/all.csv b/leetcode/notion/all.csv similarity index 100% rename from notion/all.csv rename to leetcode/notion/all.csv diff --git a/notion/more-than-six-months.csv b/leetcode/notion/more-than-six-months.csv similarity index 100% rename from notion/more-than-six-months.csv rename to leetcode/notion/more-than-six-months.csv diff --git a/npci/all.csv b/leetcode/npci/all.csv similarity index 100% rename from npci/all.csv rename to leetcode/npci/all.csv diff --git a/npci/more-than-six-months.csv b/leetcode/npci/more-than-six-months.csv similarity index 100% rename from npci/more-than-six-months.csv rename to leetcode/npci/more-than-six-months.csv diff --git a/nuro/all.csv b/leetcode/nuro/all.csv similarity index 100% rename from nuro/all.csv rename to leetcode/nuro/all.csv diff --git a/nuro/more-than-six-months.csv b/leetcode/nuro/more-than-six-months.csv similarity index 100% rename from nuro/more-than-six-months.csv rename to leetcode/nuro/more-than-six-months.csv diff --git a/nuro/six-months.csv b/leetcode/nuro/six-months.csv similarity index 100% rename from nuro/six-months.csv rename to leetcode/nuro/six-months.csv diff --git a/nuro/thirty-days.csv b/leetcode/nuro/thirty-days.csv similarity index 100% rename from nuro/thirty-days.csv rename to leetcode/nuro/thirty-days.csv diff --git a/nuro/three-months.csv b/leetcode/nuro/three-months.csv similarity index 100% rename from nuro/three-months.csv rename to leetcode/nuro/three-months.csv diff --git a/nutanix/all.csv b/leetcode/nutanix/all.csv similarity index 100% rename from nutanix/all.csv rename to leetcode/nutanix/all.csv diff --git a/nutanix/more-than-six-months.csv b/leetcode/nutanix/more-than-six-months.csv similarity index 100% rename from nutanix/more-than-six-months.csv rename to leetcode/nutanix/more-than-six-months.csv diff --git a/nutanix/six-months.csv b/leetcode/nutanix/six-months.csv similarity index 100% rename from nutanix/six-months.csv rename to leetcode/nutanix/six-months.csv diff --git a/nutanix/thirty-days.csv b/leetcode/nutanix/thirty-days.csv similarity index 100% rename from nutanix/thirty-days.csv rename to leetcode/nutanix/thirty-days.csv diff --git a/nutanix/three-months.csv b/leetcode/nutanix/three-months.csv similarity index 100% rename from nutanix/three-months.csv rename to leetcode/nutanix/three-months.csv diff --git a/nvidia/all.csv b/leetcode/nvidia/all.csv similarity index 100% rename from nvidia/all.csv rename to leetcode/nvidia/all.csv diff --git a/nvidia/more-than-six-months.csv b/leetcode/nvidia/more-than-six-months.csv similarity index 100% rename from nvidia/more-than-six-months.csv rename to leetcode/nvidia/more-than-six-months.csv diff --git a/nvidia/six-months.csv b/leetcode/nvidia/six-months.csv similarity index 100% rename from nvidia/six-months.csv rename to leetcode/nvidia/six-months.csv diff --git a/nvidia/thirty-days.csv b/leetcode/nvidia/thirty-days.csv similarity index 100% rename from nvidia/thirty-days.csv rename to leetcode/nvidia/thirty-days.csv diff --git a/nvidia/three-months.csv b/leetcode/nvidia/three-months.csv similarity index 100% rename from nvidia/three-months.csv rename to leetcode/nvidia/three-months.csv diff --git a/nykaa/all.csv b/leetcode/nykaa/all.csv similarity index 100% rename from nykaa/all.csv rename to leetcode/nykaa/all.csv diff --git a/nykaa/more-than-six-months.csv b/leetcode/nykaa/more-than-six-months.csv similarity index 100% rename from nykaa/more-than-six-months.csv rename to leetcode/nykaa/more-than-six-months.csv diff --git a/nykaa/six-months.csv b/leetcode/nykaa/six-months.csv similarity index 100% rename from nykaa/six-months.csv rename to leetcode/nykaa/six-months.csv diff --git a/observeai/all.csv b/leetcode/observeai/all.csv similarity index 100% rename from observeai/all.csv rename to leetcode/observeai/all.csv diff --git a/observeai/more-than-six-months.csv b/leetcode/observeai/more-than-six-months.csv similarity index 100% rename from observeai/more-than-six-months.csv rename to leetcode/observeai/more-than-six-months.csv diff --git a/observeai/six-months.csv b/leetcode/observeai/six-months.csv similarity index 100% rename from observeai/six-months.csv rename to leetcode/observeai/six-months.csv diff --git a/odoo/all.csv b/leetcode/odoo/all.csv similarity index 100% rename from odoo/all.csv rename to leetcode/odoo/all.csv diff --git a/odoo/more-than-six-months.csv b/leetcode/odoo/more-than-six-months.csv similarity index 100% rename from odoo/more-than-six-months.csv rename to leetcode/odoo/more-than-six-months.csv diff --git a/okta/all.csv b/leetcode/okta/all.csv similarity index 100% rename from okta/all.csv rename to leetcode/okta/all.csv diff --git a/okta/more-than-six-months.csv b/leetcode/okta/more-than-six-months.csv similarity index 100% rename from okta/more-than-six-months.csv rename to leetcode/okta/more-than-six-months.csv diff --git a/okx/all.csv b/leetcode/okx/all.csv similarity index 100% rename from okx/all.csv rename to leetcode/okx/all.csv diff --git a/okx/more-than-six-months.csv b/leetcode/okx/more-than-six-months.csv similarity index 100% rename from okx/more-than-six-months.csv rename to leetcode/okx/more-than-six-months.csv diff --git a/ola/all.csv b/leetcode/ola/all.csv similarity index 100% rename from ola/all.csv rename to leetcode/ola/all.csv diff --git a/ola/more-than-six-months.csv b/leetcode/ola/more-than-six-months.csv similarity index 100% rename from ola/more-than-six-months.csv rename to leetcode/ola/more-than-six-months.csv diff --git a/olx/all.csv b/leetcode/olx/all.csv similarity index 100% rename from olx/all.csv rename to leetcode/olx/all.csv diff --git a/olx/six-months.csv b/leetcode/olx/six-months.csv similarity index 100% rename from olx/six-months.csv rename to leetcode/olx/six-months.csv diff --git a/openai/all.csv b/leetcode/openai/all.csv similarity index 100% rename from openai/all.csv rename to leetcode/openai/all.csv diff --git a/openai/more-than-six-months.csv b/leetcode/openai/more-than-six-months.csv similarity index 100% rename from openai/more-than-six-months.csv rename to leetcode/openai/more-than-six-months.csv diff --git a/openai/six-months.csv b/leetcode/openai/six-months.csv similarity index 100% rename from openai/six-months.csv rename to leetcode/openai/six-months.csv diff --git a/openai/three-months.csv b/leetcode/openai/three-months.csv similarity index 100% rename from openai/three-months.csv rename to leetcode/openai/three-months.csv diff --git a/opendoor/all.csv b/leetcode/opendoor/all.csv similarity index 100% rename from opendoor/all.csv rename to leetcode/opendoor/all.csv diff --git a/opendoor/more-than-six-months.csv b/leetcode/opendoor/more-than-six-months.csv similarity index 100% rename from opendoor/more-than-six-months.csv rename to leetcode/opendoor/more-than-six-months.csv diff --git a/opentext/all.csv b/leetcode/opentext/all.csv similarity index 100% rename from opentext/all.csv rename to leetcode/opentext/all.csv diff --git a/opentext/more-than-six-months.csv b/leetcode/opentext/more-than-six-months.csv similarity index 100% rename from opentext/more-than-six-months.csv rename to leetcode/opentext/more-than-six-months.csv diff --git a/oppo/all.csv b/leetcode/oppo/all.csv similarity index 100% rename from oppo/all.csv rename to leetcode/oppo/all.csv diff --git a/optiver/all.csv b/leetcode/optiver/all.csv similarity index 100% rename from optiver/all.csv rename to leetcode/optiver/all.csv diff --git a/optiver/more-than-six-months.csv b/leetcode/optiver/more-than-six-months.csv similarity index 100% rename from optiver/more-than-six-months.csv rename to leetcode/optiver/more-than-six-months.csv diff --git a/optum/all.csv b/leetcode/optum/all.csv similarity index 100% rename from optum/all.csv rename to leetcode/optum/all.csv diff --git a/optum/more-than-six-months.csv b/leetcode/optum/more-than-six-months.csv similarity index 100% rename from optum/more-than-six-months.csv rename to leetcode/optum/more-than-six-months.csv diff --git a/oracle/all.csv b/leetcode/oracle/all.csv similarity index 100% rename from oracle/all.csv rename to leetcode/oracle/all.csv diff --git a/oracle/more-than-six-months.csv b/leetcode/oracle/more-than-six-months.csv similarity index 100% rename from oracle/more-than-six-months.csv rename to leetcode/oracle/more-than-six-months.csv diff --git a/oracle/six-months.csv b/leetcode/oracle/six-months.csv similarity index 100% rename from oracle/six-months.csv rename to leetcode/oracle/six-months.csv diff --git a/oracle/thirty-days.csv b/leetcode/oracle/thirty-days.csv similarity index 100% rename from oracle/thirty-days.csv rename to leetcode/oracle/thirty-days.csv diff --git a/oracle/three-months.csv b/leetcode/oracle/three-months.csv similarity index 100% rename from oracle/three-months.csv rename to leetcode/oracle/three-months.csv diff --git a/oscar-health/all.csv b/leetcode/oscar-health/all.csv similarity index 100% rename from oscar-health/all.csv rename to leetcode/oscar-health/all.csv diff --git a/oscar-health/more-than-six-months.csv b/leetcode/oscar-health/more-than-six-months.csv similarity index 100% rename from oscar-health/more-than-six-months.csv rename to leetcode/oscar-health/more-than-six-months.csv diff --git a/oscar-health/six-months.csv b/leetcode/oscar-health/six-months.csv similarity index 100% rename from oscar-health/six-months.csv rename to leetcode/oscar-health/six-months.csv diff --git a/oscar-health/thirty-days.csv b/leetcode/oscar-health/thirty-days.csv similarity index 100% rename from oscar-health/thirty-days.csv rename to leetcode/oscar-health/thirty-days.csv diff --git a/oscar-health/three-months.csv b/leetcode/oscar-health/three-months.csv similarity index 100% rename from oscar-health/three-months.csv rename to leetcode/oscar-health/three-months.csv diff --git a/otterai/all.csv b/leetcode/otterai/all.csv similarity index 100% rename from otterai/all.csv rename to leetcode/otterai/all.csv diff --git a/otterai/more-than-six-months.csv b/leetcode/otterai/more-than-six-months.csv similarity index 100% rename from otterai/more-than-six-months.csv rename to leetcode/otterai/more-than-six-months.csv diff --git a/oyo/all.csv b/leetcode/oyo/all.csv similarity index 100% rename from oyo/all.csv rename to leetcode/oyo/all.csv diff --git a/oyo/more-than-six-months.csv b/leetcode/oyo/more-than-six-months.csv similarity index 100% rename from oyo/more-than-six-months.csv rename to leetcode/oyo/more-than-six-months.csv diff --git a/oyo/six-months.csv b/leetcode/oyo/six-months.csv similarity index 100% rename from oyo/six-months.csv rename to leetcode/oyo/six-months.csv diff --git a/oyo/three-months.csv b/leetcode/oyo/three-months.csv similarity index 100% rename from oyo/three-months.csv rename to leetcode/oyo/three-months.csv diff --git a/ozon/all.csv b/leetcode/ozon/all.csv similarity index 100% rename from ozon/all.csv rename to leetcode/ozon/all.csv diff --git a/ozon/more-than-six-months.csv b/leetcode/ozon/more-than-six-months.csv similarity index 100% rename from ozon/more-than-six-months.csv rename to leetcode/ozon/more-than-six-months.csv diff --git a/ozon/six-months.csv b/leetcode/ozon/six-months.csv similarity index 100% rename from ozon/six-months.csv rename to leetcode/ozon/six-months.csv diff --git a/ozon/three-months.csv b/leetcode/ozon/three-months.csv similarity index 100% rename from ozon/three-months.csv rename to leetcode/ozon/three-months.csv diff --git a/palantir-technologies/all.csv b/leetcode/palantir-technologies/all.csv similarity index 100% rename from palantir-technologies/all.csv rename to leetcode/palantir-technologies/all.csv diff --git a/palantir-technologies/more-than-six-months.csv b/leetcode/palantir-technologies/more-than-six-months.csv similarity index 100% rename from palantir-technologies/more-than-six-months.csv rename to leetcode/palantir-technologies/more-than-six-months.csv diff --git a/palantir-technologies/six-months.csv b/leetcode/palantir-technologies/six-months.csv similarity index 100% rename from palantir-technologies/six-months.csv rename to leetcode/palantir-technologies/six-months.csv diff --git a/palantir-technologies/three-months.csv b/leetcode/palantir-technologies/three-months.csv similarity index 100% rename from palantir-technologies/three-months.csv rename to leetcode/palantir-technologies/three-months.csv diff --git a/palo-alto-networks/all.csv b/leetcode/palo-alto-networks/all.csv similarity index 100% rename from palo-alto-networks/all.csv rename to leetcode/palo-alto-networks/all.csv diff --git a/palo-alto-networks/more-than-six-months.csv b/leetcode/palo-alto-networks/more-than-six-months.csv similarity index 100% rename from palo-alto-networks/more-than-six-months.csv rename to leetcode/palo-alto-networks/more-than-six-months.csv diff --git a/palo-alto-networks/six-months.csv b/leetcode/palo-alto-networks/six-months.csv similarity index 100% rename from palo-alto-networks/six-months.csv rename to leetcode/palo-alto-networks/six-months.csv diff --git a/palo-alto-networks/three-months.csv b/leetcode/palo-alto-networks/three-months.csv similarity index 100% rename from palo-alto-networks/three-months.csv rename to leetcode/palo-alto-networks/three-months.csv diff --git a/park/all.csv b/leetcode/park/all.csv similarity index 100% rename from park/all.csv rename to leetcode/park/all.csv diff --git a/park/more-than-six-months.csv b/leetcode/park/more-than-six-months.csv similarity index 100% rename from park/more-than-six-months.csv rename to leetcode/park/more-than-six-months.csv diff --git a/patreon/all.csv b/leetcode/patreon/all.csv similarity index 100% rename from patreon/all.csv rename to leetcode/patreon/all.csv diff --git a/patreon/more-than-six-months.csv b/leetcode/patreon/more-than-six-months.csv similarity index 100% rename from patreon/more-than-six-months.csv rename to leetcode/patreon/more-than-six-months.csv diff --git a/patreon/six-months.csv b/leetcode/patreon/six-months.csv similarity index 100% rename from patreon/six-months.csv rename to leetcode/patreon/six-months.csv diff --git a/paycom/all.csv b/leetcode/paycom/all.csv similarity index 100% rename from paycom/all.csv rename to leetcode/paycom/all.csv diff --git a/paycom/more-than-six-months.csv b/leetcode/paycom/more-than-six-months.csv similarity index 100% rename from paycom/more-than-six-months.csv rename to leetcode/paycom/more-than-six-months.csv diff --git a/paypal/all.csv b/leetcode/paypal/all.csv similarity index 100% rename from paypal/all.csv rename to leetcode/paypal/all.csv diff --git a/paypal/more-than-six-months.csv b/leetcode/paypal/more-than-six-months.csv similarity index 100% rename from paypal/more-than-six-months.csv rename to leetcode/paypal/more-than-six-months.csv diff --git a/paypal/six-months.csv b/leetcode/paypal/six-months.csv similarity index 100% rename from paypal/six-months.csv rename to leetcode/paypal/six-months.csv diff --git a/paypal/thirty-days.csv b/leetcode/paypal/thirty-days.csv similarity index 100% rename from paypal/thirty-days.csv rename to leetcode/paypal/thirty-days.csv diff --git a/paypal/three-months.csv b/leetcode/paypal/three-months.csv similarity index 100% rename from paypal/three-months.csv rename to leetcode/paypal/three-months.csv diff --git a/paypay/all.csv b/leetcode/paypay/all.csv similarity index 100% rename from paypay/all.csv rename to leetcode/paypay/all.csv diff --git a/paypay/more-than-six-months.csv b/leetcode/paypay/more-than-six-months.csv similarity index 100% rename from paypay/more-than-six-months.csv rename to leetcode/paypay/more-than-six-months.csv diff --git a/paypay/six-months.csv b/leetcode/paypay/six-months.csv similarity index 100% rename from paypay/six-months.csv rename to leetcode/paypay/six-months.csv diff --git a/paypay/three-months.csv b/leetcode/paypay/three-months.csv similarity index 100% rename from paypay/three-months.csv rename to leetcode/paypay/three-months.csv diff --git a/paytm/all.csv b/leetcode/paytm/all.csv similarity index 100% rename from paytm/all.csv rename to leetcode/paytm/all.csv diff --git a/paytm/more-than-six-months.csv b/leetcode/paytm/more-than-six-months.csv similarity index 100% rename from paytm/more-than-six-months.csv rename to leetcode/paytm/more-than-six-months.csv diff --git a/paytm/six-months.csv b/leetcode/paytm/six-months.csv similarity index 100% rename from paytm/six-months.csv rename to leetcode/paytm/six-months.csv diff --git a/payu/all.csv b/leetcode/payu/all.csv similarity index 100% rename from payu/all.csv rename to leetcode/payu/all.csv diff --git a/payu/more-than-six-months.csv b/leetcode/payu/more-than-six-months.csv similarity index 100% rename from payu/more-than-six-months.csv rename to leetcode/payu/more-than-six-months.csv diff --git a/peak6/all.csv b/leetcode/peak6/all.csv similarity index 100% rename from peak6/all.csv rename to leetcode/peak6/all.csv diff --git a/pega/all.csv b/leetcode/pega/all.csv similarity index 100% rename from pega/all.csv rename to leetcode/pega/all.csv diff --git a/peloton/all.csv b/leetcode/peloton/all.csv similarity index 100% rename from peloton/all.csv rename to leetcode/peloton/all.csv diff --git a/peloton/more-than-six-months.csv b/leetcode/peloton/more-than-six-months.csv similarity index 100% rename from peloton/more-than-six-months.csv rename to leetcode/peloton/more-than-six-months.csv diff --git a/persistent-systems/all.csv b/leetcode/persistent-systems/all.csv similarity index 100% rename from persistent-systems/all.csv rename to leetcode/persistent-systems/all.csv diff --git a/persistent-systems/more-than-six-months.csv b/leetcode/persistent-systems/more-than-six-months.csv similarity index 100% rename from persistent-systems/more-than-six-months.csv rename to leetcode/persistent-systems/more-than-six-months.csv diff --git a/persistent-systems/six-months.csv b/leetcode/persistent-systems/six-months.csv similarity index 100% rename from persistent-systems/six-months.csv rename to leetcode/persistent-systems/six-months.csv diff --git a/philips/all.csv b/leetcode/philips/all.csv similarity index 100% rename from philips/all.csv rename to leetcode/philips/all.csv diff --git a/philips/six-months.csv b/leetcode/philips/six-months.csv similarity index 100% rename from philips/six-months.csv rename to leetcode/philips/six-months.csv diff --git a/phonepe/all.csv b/leetcode/phonepe/all.csv similarity index 100% rename from phonepe/all.csv rename to leetcode/phonepe/all.csv diff --git a/phonepe/more-than-six-months.csv b/leetcode/phonepe/more-than-six-months.csv similarity index 100% rename from phonepe/more-than-six-months.csv rename to leetcode/phonepe/more-than-six-months.csv diff --git a/phonepe/six-months.csv b/leetcode/phonepe/six-months.csv similarity index 100% rename from phonepe/six-months.csv rename to leetcode/phonepe/six-months.csv diff --git a/phonepe/thirty-days.csv b/leetcode/phonepe/thirty-days.csv similarity index 100% rename from phonepe/thirty-days.csv rename to leetcode/phonepe/thirty-days.csv diff --git a/phonepe/three-months.csv b/leetcode/phonepe/three-months.csv similarity index 100% rename from phonepe/three-months.csv rename to leetcode/phonepe/three-months.csv diff --git a/pickrr/all.csv b/leetcode/pickrr/all.csv similarity index 100% rename from pickrr/all.csv rename to leetcode/pickrr/all.csv diff --git a/pickrr/more-than-six-months.csv b/leetcode/pickrr/more-than-six-months.csv similarity index 100% rename from pickrr/more-than-six-months.csv rename to leetcode/pickrr/more-than-six-months.csv diff --git a/pinterest/all.csv b/leetcode/pinterest/all.csv similarity index 100% rename from pinterest/all.csv rename to leetcode/pinterest/all.csv diff --git a/pinterest/more-than-six-months.csv b/leetcode/pinterest/more-than-six-months.csv similarity index 100% rename from pinterest/more-than-six-months.csv rename to leetcode/pinterest/more-than-six-months.csv diff --git a/pinterest/six-months.csv b/leetcode/pinterest/six-months.csv similarity index 100% rename from pinterest/six-months.csv rename to leetcode/pinterest/six-months.csv diff --git a/pinterest/thirty-days.csv b/leetcode/pinterest/thirty-days.csv similarity index 100% rename from pinterest/thirty-days.csv rename to leetcode/pinterest/thirty-days.csv diff --git a/pinterest/three-months.csv b/leetcode/pinterest/three-months.csv similarity index 100% rename from pinterest/three-months.csv rename to leetcode/pinterest/three-months.csv diff --git a/plaid/all.csv b/leetcode/plaid/all.csv similarity index 100% rename from plaid/all.csv rename to leetcode/plaid/all.csv diff --git a/plaid/six-months.csv b/leetcode/plaid/six-months.csv similarity index 100% rename from plaid/six-months.csv rename to leetcode/plaid/six-months.csv diff --git a/plaid/three-months.csv b/leetcode/plaid/three-months.csv similarity index 100% rename from plaid/three-months.csv rename to leetcode/plaid/three-months.csv diff --git a/pocket-gems/all.csv b/leetcode/pocket-gems/all.csv similarity index 100% rename from pocket-gems/all.csv rename to leetcode/pocket-gems/all.csv diff --git a/pocket-gems/more-than-six-months.csv b/leetcode/pocket-gems/more-than-six-months.csv similarity index 100% rename from pocket-gems/more-than-six-months.csv rename to leetcode/pocket-gems/more-than-six-months.csv diff --git a/point72/all.csv b/leetcode/point72/all.csv similarity index 100% rename from point72/all.csv rename to leetcode/point72/all.csv diff --git a/point72/more-than-six-months.csv b/leetcode/point72/more-than-six-months.csv similarity index 100% rename from point72/more-than-six-months.csv rename to leetcode/point72/more-than-six-months.csv diff --git a/polar/all.csv b/leetcode/polar/all.csv similarity index 100% rename from polar/all.csv rename to leetcode/polar/all.csv diff --git a/polar/more-than-six-months.csv b/leetcode/polar/more-than-six-months.csv similarity index 100% rename from polar/more-than-six-months.csv rename to leetcode/polar/more-than-six-months.csv diff --git a/ponyai/all.csv b/leetcode/ponyai/all.csv similarity index 100% rename from ponyai/all.csv rename to leetcode/ponyai/all.csv diff --git a/ponyai/more-than-six-months.csv b/leetcode/ponyai/more-than-six-months.csv similarity index 100% rename from ponyai/more-than-six-months.csv rename to leetcode/ponyai/more-than-six-months.csv diff --git a/pornhub/all.csv b/leetcode/pornhub/all.csv similarity index 100% rename from pornhub/all.csv rename to leetcode/pornhub/all.csv diff --git a/pornhub/more-than-six-months.csv b/leetcode/pornhub/more-than-six-months.csv similarity index 100% rename from pornhub/more-than-six-months.csv rename to leetcode/pornhub/more-than-six-months.csv diff --git a/porter/all.csv b/leetcode/porter/all.csv similarity index 100% rename from porter/all.csv rename to leetcode/porter/all.csv diff --git a/porter/more-than-six-months.csv b/leetcode/porter/more-than-six-months.csv similarity index 100% rename from porter/more-than-six-months.csv rename to leetcode/porter/more-than-six-months.csv diff --git a/poshmark/all.csv b/leetcode/poshmark/all.csv similarity index 100% rename from poshmark/all.csv rename to leetcode/poshmark/all.csv diff --git a/poshmark/more-than-six-months.csv b/leetcode/poshmark/more-than-six-months.csv similarity index 100% rename from poshmark/more-than-six-months.csv rename to leetcode/poshmark/more-than-six-months.csv diff --git a/postman/all.csv b/leetcode/postman/all.csv similarity index 100% rename from postman/all.csv rename to leetcode/postman/all.csv diff --git a/postmates/all.csv b/leetcode/postmates/all.csv similarity index 100% rename from postmates/all.csv rename to leetcode/postmates/all.csv diff --git a/postmates/more-than-six-months.csv b/leetcode/postmates/more-than-six-months.csv similarity index 100% rename from postmates/more-than-six-months.csv rename to leetcode/postmates/more-than-six-months.csv diff --git a/poynt/all.csv b/leetcode/poynt/all.csv similarity index 100% rename from poynt/all.csv rename to leetcode/poynt/all.csv diff --git a/poynt/more-than-six-months.csv b/leetcode/poynt/more-than-six-months.csv similarity index 100% rename from poynt/more-than-six-months.csv rename to leetcode/poynt/more-than-six-months.csv diff --git a/practo/all.csv b/leetcode/practo/all.csv similarity index 100% rename from practo/all.csv rename to leetcode/practo/all.csv diff --git a/practo/more-than-six-months.csv b/leetcode/practo/more-than-six-months.csv similarity index 100% rename from practo/more-than-six-months.csv rename to leetcode/practo/more-than-six-months.csv diff --git a/publicis-sapient/all.csv b/leetcode/publicis-sapient/all.csv similarity index 100% rename from publicis-sapient/all.csv rename to leetcode/publicis-sapient/all.csv diff --git a/publicis-sapient/more-than-six-months.csv b/leetcode/publicis-sapient/more-than-six-months.csv similarity index 100% rename from publicis-sapient/more-than-six-months.csv rename to leetcode/publicis-sapient/more-than-six-months.csv diff --git a/publicis-sapient/six-months.csv b/leetcode/publicis-sapient/six-months.csv similarity index 100% rename from publicis-sapient/six-months.csv rename to leetcode/publicis-sapient/six-months.csv diff --git a/pubmatic/all.csv b/leetcode/pubmatic/all.csv similarity index 100% rename from pubmatic/all.csv rename to leetcode/pubmatic/all.csv diff --git a/pubmatic/more-than-six-months.csv b/leetcode/pubmatic/more-than-six-months.csv similarity index 100% rename from pubmatic/more-than-six-months.csv rename to leetcode/pubmatic/more-than-six-months.csv diff --git a/pure-storage/all.csv b/leetcode/pure-storage/all.csv similarity index 100% rename from pure-storage/all.csv rename to leetcode/pure-storage/all.csv diff --git a/pure-storage/more-than-six-months.csv b/leetcode/pure-storage/more-than-six-months.csv similarity index 100% rename from pure-storage/more-than-six-months.csv rename to leetcode/pure-storage/more-than-six-months.csv diff --git a/pure-storage/six-months.csv b/leetcode/pure-storage/six-months.csv similarity index 100% rename from pure-storage/six-months.csv rename to leetcode/pure-storage/six-months.csv diff --git a/pure-storage/three-months.csv b/leetcode/pure-storage/three-months.csv similarity index 100% rename from pure-storage/three-months.csv rename to leetcode/pure-storage/three-months.csv diff --git a/pure/all.csv b/leetcode/pure/all.csv similarity index 100% rename from pure/all.csv rename to leetcode/pure/all.csv diff --git a/pure/six-months.csv b/leetcode/pure/six-months.csv similarity index 100% rename from pure/six-months.csv rename to leetcode/pure/six-months.csv diff --git a/purplle/all.csv b/leetcode/purplle/all.csv similarity index 100% rename from purplle/all.csv rename to leetcode/purplle/all.csv diff --git a/purplle/more-than-six-months.csv b/leetcode/purplle/more-than-six-months.csv similarity index 100% rename from purplle/more-than-six-months.csv rename to leetcode/purplle/more-than-six-months.csv diff --git a/pwc/all.csv b/leetcode/pwc/all.csv similarity index 100% rename from pwc/all.csv rename to leetcode/pwc/all.csv diff --git a/pwc/more-than-six-months.csv b/leetcode/pwc/more-than-six-months.csv similarity index 100% rename from pwc/more-than-six-months.csv rename to leetcode/pwc/more-than-six-months.csv diff --git a/pwc/six-months.csv b/leetcode/pwc/six-months.csv similarity index 100% rename from pwc/six-months.csv rename to leetcode/pwc/six-months.csv diff --git a/qburst/all.csv b/leetcode/qburst/all.csv similarity index 100% rename from qburst/all.csv rename to leetcode/qburst/all.csv diff --git a/qburst/more-than-six-months.csv b/leetcode/qburst/more-than-six-months.csv similarity index 100% rename from qburst/more-than-six-months.csv rename to leetcode/qburst/more-than-six-months.csv diff --git a/qualcomm/all.csv b/leetcode/qualcomm/all.csv similarity index 100% rename from qualcomm/all.csv rename to leetcode/qualcomm/all.csv diff --git a/qualcomm/more-than-six-months.csv b/leetcode/qualcomm/more-than-six-months.csv similarity index 100% rename from qualcomm/more-than-six-months.csv rename to leetcode/qualcomm/more-than-six-months.csv diff --git a/qualcomm/six-months.csv b/leetcode/qualcomm/six-months.csv similarity index 100% rename from qualcomm/six-months.csv rename to leetcode/qualcomm/six-months.csv diff --git a/qualcomm/three-months.csv b/leetcode/qualcomm/three-months.csv similarity index 100% rename from qualcomm/three-months.csv rename to leetcode/qualcomm/three-months.csv diff --git a/qualtrics/all.csv b/leetcode/qualtrics/all.csv similarity index 100% rename from qualtrics/all.csv rename to leetcode/qualtrics/all.csv diff --git a/qualtrics/more-than-six-months.csv b/leetcode/qualtrics/more-than-six-months.csv similarity index 100% rename from qualtrics/more-than-six-months.csv rename to leetcode/qualtrics/more-than-six-months.csv diff --git a/qualtrics/six-months.csv b/leetcode/qualtrics/six-months.csv similarity index 100% rename from qualtrics/six-months.csv rename to leetcode/qualtrics/six-months.csv diff --git a/qualys/all.csv b/leetcode/qualys/all.csv similarity index 100% rename from qualys/all.csv rename to leetcode/qualys/all.csv diff --git a/qualys/more-than-six-months.csv b/leetcode/qualys/more-than-six-months.csv similarity index 100% rename from qualys/more-than-six-months.csv rename to leetcode/qualys/more-than-six-months.csv diff --git a/quantcast/all.csv b/leetcode/quantcast/all.csv similarity index 100% rename from quantcast/all.csv rename to leetcode/quantcast/all.csv diff --git a/quantcast/six-months.csv b/leetcode/quantcast/six-months.csv similarity index 100% rename from quantcast/six-months.csv rename to leetcode/quantcast/six-months.csv diff --git a/quantcast/three-months.csv b/leetcode/quantcast/three-months.csv similarity index 100% rename from quantcast/three-months.csv rename to leetcode/quantcast/three-months.csv diff --git a/quince/all.csv b/leetcode/quince/all.csv similarity index 100% rename from quince/all.csv rename to leetcode/quince/all.csv diff --git a/quince/more-than-six-months.csv b/leetcode/quince/more-than-six-months.csv similarity index 100% rename from quince/more-than-six-months.csv rename to leetcode/quince/more-than-six-months.csv diff --git a/quince/six-months.csv b/leetcode/quince/six-months.csv similarity index 100% rename from quince/six-months.csv rename to leetcode/quince/six-months.csv diff --git a/quince/thirty-days.csv b/leetcode/quince/thirty-days.csv similarity index 100% rename from quince/thirty-days.csv rename to leetcode/quince/thirty-days.csv diff --git a/quince/three-months.csv b/leetcode/quince/three-months.csv similarity index 100% rename from quince/three-months.csv rename to leetcode/quince/three-months.csv diff --git a/qumulo/all.csv b/leetcode/qumulo/all.csv similarity index 100% rename from qumulo/all.csv rename to leetcode/qumulo/all.csv diff --git a/qumulo/more-than-six-months.csv b/leetcode/qumulo/more-than-six-months.csv similarity index 100% rename from qumulo/more-than-six-months.csv rename to leetcode/qumulo/more-than-six-months.csv diff --git a/quora/all.csv b/leetcode/quora/all.csv similarity index 100% rename from quora/all.csv rename to leetcode/quora/all.csv diff --git a/quora/more-than-six-months.csv b/leetcode/quora/more-than-six-months.csv similarity index 100% rename from quora/more-than-six-months.csv rename to leetcode/quora/more-than-six-months.csv diff --git a/quora/six-months.csv b/leetcode/quora/six-months.csv similarity index 100% rename from quora/six-months.csv rename to leetcode/quora/six-months.csv diff --git a/quora/three-months.csv b/leetcode/quora/three-months.csv similarity index 100% rename from quora/three-months.csv rename to leetcode/quora/three-months.csv diff --git a/rackspace/all.csv b/leetcode/rackspace/all.csv similarity index 100% rename from rackspace/all.csv rename to leetcode/rackspace/all.csv diff --git a/rackspace/more-than-six-months.csv b/leetcode/rackspace/more-than-six-months.csv similarity index 100% rename from rackspace/more-than-six-months.csv rename to leetcode/rackspace/more-than-six-months.csv diff --git a/radius/all.csv b/leetcode/radius/all.csv similarity index 100% rename from radius/all.csv rename to leetcode/radius/all.csv diff --git a/radius/more-than-six-months.csv b/leetcode/radius/more-than-six-months.csv similarity index 100% rename from radius/more-than-six-months.csv rename to leetcode/radius/more-than-six-months.csv diff --git a/rakuten/all.csv b/leetcode/rakuten/all.csv similarity index 100% rename from rakuten/all.csv rename to leetcode/rakuten/all.csv diff --git a/rakuten/more-than-six-months.csv b/leetcode/rakuten/more-than-six-months.csv similarity index 100% rename from rakuten/more-than-six-months.csv rename to leetcode/rakuten/more-than-six-months.csv diff --git a/rakuten/six-months.csv b/leetcode/rakuten/six-months.csv similarity index 100% rename from rakuten/six-months.csv rename to leetcode/rakuten/six-months.csv diff --git a/rakuten/thirty-days.csv b/leetcode/rakuten/thirty-days.csv similarity index 100% rename from rakuten/thirty-days.csv rename to leetcode/rakuten/thirty-days.csv diff --git a/rakuten/three-months.csv b/leetcode/rakuten/three-months.csv similarity index 100% rename from rakuten/three-months.csv rename to leetcode/rakuten/three-months.csv diff --git a/ramp-2/all.csv b/leetcode/ramp-2/all.csv similarity index 100% rename from ramp-2/all.csv rename to leetcode/ramp-2/all.csv diff --git a/ramp-2/more-than-six-months.csv b/leetcode/ramp-2/more-than-six-months.csv similarity index 100% rename from ramp-2/more-than-six-months.csv rename to leetcode/ramp-2/more-than-six-months.csv diff --git a/ramp-2/six-months.csv b/leetcode/ramp-2/six-months.csv similarity index 100% rename from ramp-2/six-months.csv rename to leetcode/ramp-2/six-months.csv diff --git a/ramp-2/three-months.csv b/leetcode/ramp-2/three-months.csv similarity index 100% rename from ramp-2/three-months.csv rename to leetcode/ramp-2/three-months.csv diff --git a/razorpay/all.csv b/leetcode/razorpay/all.csv similarity index 100% rename from razorpay/all.csv rename to leetcode/razorpay/all.csv diff --git a/razorpay/more-than-six-months.csv b/leetcode/razorpay/more-than-six-months.csv similarity index 100% rename from razorpay/more-than-six-months.csv rename to leetcode/razorpay/more-than-six-months.csv diff --git a/razorpay/six-months.csv b/leetcode/razorpay/six-months.csv similarity index 100% rename from razorpay/six-months.csv rename to leetcode/razorpay/six-months.csv diff --git a/rbc/all.csv b/leetcode/rbc/all.csv similarity index 100% rename from rbc/all.csv rename to leetcode/rbc/all.csv diff --git a/rbc/more-than-six-months.csv b/leetcode/rbc/more-than-six-months.csv similarity index 100% rename from rbc/more-than-six-months.csv rename to leetcode/rbc/more-than-six-months.csv diff --git a/rbc/six-months.csv b/leetcode/rbc/six-months.csv similarity index 100% rename from rbc/six-months.csv rename to leetcode/rbc/six-months.csv diff --git a/redbus/all.csv b/leetcode/redbus/all.csv similarity index 100% rename from redbus/all.csv rename to leetcode/redbus/all.csv diff --git a/redbus/more-than-six-months.csv b/leetcode/redbus/more-than-six-months.csv similarity index 100% rename from redbus/more-than-six-months.csv rename to leetcode/redbus/more-than-six-months.csv diff --git a/reddit/all.csv b/leetcode/reddit/all.csv similarity index 100% rename from reddit/all.csv rename to leetcode/reddit/all.csv diff --git a/reddit/more-than-six-months.csv b/leetcode/reddit/more-than-six-months.csv similarity index 100% rename from reddit/more-than-six-months.csv rename to leetcode/reddit/more-than-six-months.csv diff --git a/reddit/six-months.csv b/leetcode/reddit/six-months.csv similarity index 100% rename from reddit/six-months.csv rename to leetcode/reddit/six-months.csv diff --git a/redfin/all.csv b/leetcode/redfin/all.csv similarity index 100% rename from redfin/all.csv rename to leetcode/redfin/all.csv diff --git a/redfin/six-months.csv b/leetcode/redfin/six-months.csv similarity index 100% rename from redfin/six-months.csv rename to leetcode/redfin/six-months.csv diff --git a/remitly/all.csv b/leetcode/remitly/all.csv similarity index 100% rename from remitly/all.csv rename to leetcode/remitly/all.csv diff --git a/remitly/more-than-six-months.csv b/leetcode/remitly/more-than-six-months.csv similarity index 100% rename from remitly/more-than-six-months.csv rename to leetcode/remitly/more-than-six-months.csv diff --git a/remitly/six-months.csv b/leetcode/remitly/six-months.csv similarity index 100% rename from remitly/six-months.csv rename to leetcode/remitly/six-months.csv diff --git a/remitly/three-months.csv b/leetcode/remitly/three-months.csv similarity index 100% rename from remitly/three-months.csv rename to leetcode/remitly/three-months.csv diff --git a/retailmenot/all.csv b/leetcode/retailmenot/all.csv similarity index 100% rename from retailmenot/all.csv rename to leetcode/retailmenot/all.csv diff --git a/retailmenot/more-than-six-months.csv b/leetcode/retailmenot/more-than-six-months.csv similarity index 100% rename from retailmenot/more-than-six-months.csv rename to leetcode/retailmenot/more-than-six-months.csv diff --git a/revolut/all.csv b/leetcode/revolut/all.csv similarity index 100% rename from revolut/all.csv rename to leetcode/revolut/all.csv diff --git a/revolut/more-than-six-months.csv b/leetcode/revolut/more-than-six-months.csv similarity index 100% rename from revolut/more-than-six-months.csv rename to leetcode/revolut/more-than-six-months.csv diff --git a/revolut/six-months.csv b/leetcode/revolut/six-months.csv similarity index 100% rename from revolut/six-months.csv rename to leetcode/revolut/six-months.csv diff --git a/revolut/three-months.csv b/leetcode/revolut/three-months.csv similarity index 100% rename from revolut/three-months.csv rename to leetcode/revolut/three-months.csv diff --git a/riot-games/all.csv b/leetcode/riot-games/all.csv similarity index 100% rename from riot-games/all.csv rename to leetcode/riot-games/all.csv diff --git a/riot-games/more-than-six-months.csv b/leetcode/riot-games/more-than-six-months.csv similarity index 100% rename from riot-games/more-than-six-months.csv rename to leetcode/riot-games/more-than-six-months.csv diff --git a/riot-games/six-months.csv b/leetcode/riot-games/six-months.csv similarity index 100% rename from riot-games/six-months.csv rename to leetcode/riot-games/six-months.csv diff --git a/ripple/all.csv b/leetcode/ripple/all.csv similarity index 100% rename from ripple/all.csv rename to leetcode/ripple/all.csv diff --git a/ripple/more-than-six-months.csv b/leetcode/ripple/more-than-six-months.csv similarity index 100% rename from ripple/more-than-six-months.csv rename to leetcode/ripple/more-than-six-months.csv diff --git a/ripple/six-months.csv b/leetcode/ripple/six-months.csv similarity index 100% rename from ripple/six-months.csv rename to leetcode/ripple/six-months.csv diff --git a/ripple/three-months.csv b/leetcode/ripple/three-months.csv similarity index 100% rename from ripple/three-months.csv rename to leetcode/ripple/three-months.csv diff --git a/rippling/all.csv b/leetcode/rippling/all.csv similarity index 100% rename from rippling/all.csv rename to leetcode/rippling/all.csv diff --git a/rippling/more-than-six-months.csv b/leetcode/rippling/more-than-six-months.csv similarity index 100% rename from rippling/more-than-six-months.csv rename to leetcode/rippling/more-than-six-months.csv diff --git a/rippling/six-months.csv b/leetcode/rippling/six-months.csv similarity index 100% rename from rippling/six-months.csv rename to leetcode/rippling/six-months.csv diff --git a/rivian/all.csv b/leetcode/rivian/all.csv similarity index 100% rename from rivian/all.csv rename to leetcode/rivian/all.csv diff --git a/rivian/more-than-six-months.csv b/leetcode/rivian/more-than-six-months.csv similarity index 100% rename from rivian/more-than-six-months.csv rename to leetcode/rivian/more-than-six-months.csv diff --git a/rivian/six-months.csv b/leetcode/rivian/six-months.csv similarity index 100% rename from rivian/six-months.csv rename to leetcode/rivian/six-months.csv diff --git a/rivian/three-months.csv b/leetcode/rivian/three-months.csv similarity index 100% rename from rivian/three-months.csv rename to leetcode/rivian/three-months.csv diff --git a/robinhood/all.csv b/leetcode/robinhood/all.csv similarity index 100% rename from robinhood/all.csv rename to leetcode/robinhood/all.csv diff --git a/robinhood/more-than-six-months.csv b/leetcode/robinhood/more-than-six-months.csv similarity index 100% rename from robinhood/more-than-six-months.csv rename to leetcode/robinhood/more-than-six-months.csv diff --git a/robinhood/six-months.csv b/leetcode/robinhood/six-months.csv similarity index 100% rename from robinhood/six-months.csv rename to leetcode/robinhood/six-months.csv diff --git a/robinhood/three-months.csv b/leetcode/robinhood/three-months.csv similarity index 100% rename from robinhood/three-months.csv rename to leetcode/robinhood/three-months.csv diff --git a/roblox/all.csv b/leetcode/roblox/all.csv similarity index 100% rename from roblox/all.csv rename to leetcode/roblox/all.csv diff --git a/roblox/more-than-six-months.csv b/leetcode/roblox/more-than-six-months.csv similarity index 100% rename from roblox/more-than-six-months.csv rename to leetcode/roblox/more-than-six-months.csv diff --git a/roblox/six-months.csv b/leetcode/roblox/six-months.csv similarity index 100% rename from roblox/six-months.csv rename to leetcode/roblox/six-months.csv diff --git a/roblox/thirty-days.csv b/leetcode/roblox/thirty-days.csv similarity index 100% rename from roblox/thirty-days.csv rename to leetcode/roblox/thirty-days.csv diff --git a/roblox/three-months.csv b/leetcode/roblox/three-months.csv similarity index 100% rename from roblox/three-months.csv rename to leetcode/roblox/three-months.csv diff --git a/roche/all.csv b/leetcode/roche/all.csv similarity index 100% rename from roche/all.csv rename to leetcode/roche/all.csv diff --git a/roche/more-than-six-months.csv b/leetcode/roche/more-than-six-months.csv similarity index 100% rename from roche/more-than-six-months.csv rename to leetcode/roche/more-than-six-months.csv diff --git a/rokt/all.csv b/leetcode/rokt/all.csv similarity index 100% rename from rokt/all.csv rename to leetcode/rokt/all.csv diff --git a/rokt/more-than-six-months.csv b/leetcode/rokt/more-than-six-months.csv similarity index 100% rename from rokt/more-than-six-months.csv rename to leetcode/rokt/more-than-six-months.csv diff --git a/rokt/six-months.csv b/leetcode/rokt/six-months.csv similarity index 100% rename from rokt/six-months.csv rename to leetcode/rokt/six-months.csv diff --git a/roku/all.csv b/leetcode/roku/all.csv similarity index 100% rename from roku/all.csv rename to leetcode/roku/all.csv diff --git a/roku/more-than-six-months.csv b/leetcode/roku/more-than-six-months.csv similarity index 100% rename from roku/more-than-six-months.csv rename to leetcode/roku/more-than-six-months.csv diff --git a/roku/six-months.csv b/leetcode/roku/six-months.csv similarity index 100% rename from roku/six-months.csv rename to leetcode/roku/six-months.csv diff --git a/roku/three-months.csv b/leetcode/roku/three-months.csv similarity index 100% rename from roku/three-months.csv rename to leetcode/roku/three-months.csv diff --git a/rubrik/all.csv b/leetcode/rubrik/all.csv similarity index 100% rename from rubrik/all.csv rename to leetcode/rubrik/all.csv diff --git a/rubrik/more-than-six-months.csv b/leetcode/rubrik/more-than-six-months.csv similarity index 100% rename from rubrik/more-than-six-months.csv rename to leetcode/rubrik/more-than-six-months.csv diff --git a/rubrik/six-months.csv b/leetcode/rubrik/six-months.csv similarity index 100% rename from rubrik/six-months.csv rename to leetcode/rubrik/six-months.csv diff --git a/rubrik/three-months.csv b/leetcode/rubrik/three-months.csv similarity index 100% rename from rubrik/three-months.csv rename to leetcode/rubrik/three-months.csv diff --git a/salesforce/all.csv b/leetcode/salesforce/all.csv similarity index 100% rename from salesforce/all.csv rename to leetcode/salesforce/all.csv diff --git a/salesforce/more-than-six-months.csv b/leetcode/salesforce/more-than-six-months.csv similarity index 100% rename from salesforce/more-than-six-months.csv rename to leetcode/salesforce/more-than-six-months.csv diff --git a/salesforce/six-months.csv b/leetcode/salesforce/six-months.csv similarity index 100% rename from salesforce/six-months.csv rename to leetcode/salesforce/six-months.csv diff --git a/salesforce/thirty-days.csv b/leetcode/salesforce/thirty-days.csv similarity index 100% rename from salesforce/thirty-days.csv rename to leetcode/salesforce/thirty-days.csv diff --git a/salesforce/three-months.csv b/leetcode/salesforce/three-months.csv similarity index 100% rename from salesforce/three-months.csv rename to leetcode/salesforce/three-months.csv diff --git a/sambanova/all.csv b/leetcode/sambanova/all.csv similarity index 100% rename from sambanova/all.csv rename to leetcode/sambanova/all.csv diff --git a/samsara/all.csv b/leetcode/samsara/all.csv similarity index 100% rename from samsara/all.csv rename to leetcode/samsara/all.csv diff --git a/samsara/more-than-six-months.csv b/leetcode/samsara/more-than-six-months.csv similarity index 100% rename from samsara/more-than-six-months.csv rename to leetcode/samsara/more-than-six-months.csv diff --git a/samsara/six-months.csv b/leetcode/samsara/six-months.csv similarity index 100% rename from samsara/six-months.csv rename to leetcode/samsara/six-months.csv diff --git a/samsung/all.csv b/leetcode/samsung/all.csv similarity index 100% rename from samsung/all.csv rename to leetcode/samsung/all.csv diff --git a/samsung/more-than-six-months.csv b/leetcode/samsung/more-than-six-months.csv similarity index 100% rename from samsung/more-than-six-months.csv rename to leetcode/samsung/more-than-six-months.csv diff --git a/samsung/six-months.csv b/leetcode/samsung/six-months.csv similarity index 100% rename from samsung/six-months.csv rename to leetcode/samsung/six-months.csv diff --git a/samsung/three-months.csv b/leetcode/samsung/three-months.csv similarity index 100% rename from samsung/three-months.csv rename to leetcode/samsung/three-months.csv diff --git a/sap/all.csv b/leetcode/sap/all.csv similarity index 100% rename from sap/all.csv rename to leetcode/sap/all.csv diff --git a/sap/more-than-six-months.csv b/leetcode/sap/more-than-six-months.csv similarity index 100% rename from sap/more-than-six-months.csv rename to leetcode/sap/more-than-six-months.csv diff --git a/sap/six-months.csv b/leetcode/sap/six-months.csv similarity index 100% rename from sap/six-months.csv rename to leetcode/sap/six-months.csv diff --git a/sap/three-months.csv b/leetcode/sap/three-months.csv similarity index 100% rename from sap/three-months.csv rename to leetcode/sap/three-months.csv diff --git a/scale-ai/all.csv b/leetcode/scale-ai/all.csv similarity index 100% rename from scale-ai/all.csv rename to leetcode/scale-ai/all.csv diff --git a/scale-ai/more-than-six-months.csv b/leetcode/scale-ai/more-than-six-months.csv similarity index 100% rename from scale-ai/more-than-six-months.csv rename to leetcode/scale-ai/more-than-six-months.csv diff --git a/schneider-electric/all.csv b/leetcode/schneider-electric/all.csv similarity index 100% rename from schneider-electric/all.csv rename to leetcode/schneider-electric/all.csv diff --git a/schneider-electric/more-than-six-months.csv b/leetcode/schneider-electric/more-than-six-months.csv similarity index 100% rename from schneider-electric/more-than-six-months.csv rename to leetcode/schneider-electric/more-than-six-months.csv diff --git a/schrodinger/all.csv b/leetcode/schrodinger/all.csv similarity index 100% rename from schrodinger/all.csv rename to leetcode/schrodinger/all.csv diff --git a/schrodinger/more-than-six-months.csv b/leetcode/schrodinger/more-than-six-months.csv similarity index 100% rename from schrodinger/more-than-six-months.csv rename to leetcode/schrodinger/more-than-six-months.csv diff --git a/sentry/all.csv b/leetcode/sentry/all.csv similarity index 100% rename from sentry/all.csv rename to leetcode/sentry/all.csv diff --git a/sentry/more-than-six-months.csv b/leetcode/sentry/more-than-six-months.csv similarity index 100% rename from sentry/more-than-six-months.csv rename to leetcode/sentry/more-than-six-months.csv diff --git a/servicenow/all.csv b/leetcode/servicenow/all.csv similarity index 100% rename from servicenow/all.csv rename to leetcode/servicenow/all.csv diff --git a/servicenow/more-than-six-months.csv b/leetcode/servicenow/more-than-six-months.csv similarity index 100% rename from servicenow/more-than-six-months.csv rename to leetcode/servicenow/more-than-six-months.csv diff --git a/servicenow/six-months.csv b/leetcode/servicenow/six-months.csv similarity index 100% rename from servicenow/six-months.csv rename to leetcode/servicenow/six-months.csv diff --git a/servicenow/three-months.csv b/leetcode/servicenow/three-months.csv similarity index 100% rename from servicenow/three-months.csv rename to leetcode/servicenow/three-months.csv diff --git a/sharechat/all.csv b/leetcode/sharechat/all.csv similarity index 100% rename from sharechat/all.csv rename to leetcode/sharechat/all.csv diff --git a/sharechat/more-than-six-months.csv b/leetcode/sharechat/more-than-six-months.csv similarity index 100% rename from sharechat/more-than-six-months.csv rename to leetcode/sharechat/more-than-six-months.csv diff --git a/shift-technology/all.csv b/leetcode/shift-technology/all.csv similarity index 100% rename from shift-technology/all.csv rename to leetcode/shift-technology/all.csv diff --git a/shift-technology/more-than-six-months.csv b/leetcode/shift-technology/more-than-six-months.csv similarity index 100% rename from shift-technology/more-than-six-months.csv rename to leetcode/shift-technology/more-than-six-months.csv diff --git a/shipsy/all.csv b/leetcode/shipsy/all.csv similarity index 100% rename from shipsy/all.csv rename to leetcode/shipsy/all.csv diff --git a/shipsy/more-than-six-months.csv b/leetcode/shipsy/more-than-six-months.csv similarity index 100% rename from shipsy/more-than-six-months.csv rename to leetcode/shipsy/more-than-six-months.csv diff --git a/shopee/all.csv b/leetcode/shopee/all.csv similarity index 100% rename from shopee/all.csv rename to leetcode/shopee/all.csv diff --git a/shopee/more-than-six-months.csv b/leetcode/shopee/more-than-six-months.csv similarity index 100% rename from shopee/more-than-six-months.csv rename to leetcode/shopee/more-than-six-months.csv diff --git a/shopee/six-months.csv b/leetcode/shopee/six-months.csv similarity index 100% rename from shopee/six-months.csv rename to leetcode/shopee/six-months.csv diff --git a/shopify/all.csv b/leetcode/shopify/all.csv similarity index 100% rename from shopify/all.csv rename to leetcode/shopify/all.csv diff --git a/shopify/more-than-six-months.csv b/leetcode/shopify/more-than-six-months.csv similarity index 100% rename from shopify/more-than-six-months.csv rename to leetcode/shopify/more-than-six-months.csv diff --git a/shopify/six-months.csv b/leetcode/shopify/six-months.csv similarity index 100% rename from shopify/six-months.csv rename to leetcode/shopify/six-months.csv diff --git a/shopify/three-months.csv b/leetcode/shopify/three-months.csv similarity index 100% rename from shopify/three-months.csv rename to leetcode/shopify/three-months.csv diff --git a/siemens/all.csv b/leetcode/siemens/all.csv similarity index 100% rename from siemens/all.csv rename to leetcode/siemens/all.csv diff --git a/siemens/more-than-six-months.csv b/leetcode/siemens/more-than-six-months.csv similarity index 100% rename from siemens/more-than-six-months.csv rename to leetcode/siemens/more-than-six-months.csv diff --git a/siemens/six-months.csv b/leetcode/siemens/six-months.csv similarity index 100% rename from siemens/six-months.csv rename to leetcode/siemens/six-months.csv diff --git a/sig/all.csv b/leetcode/sig/all.csv similarity index 100% rename from sig/all.csv rename to leetcode/sig/all.csv diff --git a/sig/more-than-six-months.csv b/leetcode/sig/more-than-six-months.csv similarity index 100% rename from sig/more-than-six-months.csv rename to leetcode/sig/more-than-six-months.csv diff --git a/sig/six-months.csv b/leetcode/sig/six-months.csv similarity index 100% rename from sig/six-months.csv rename to leetcode/sig/six-months.csv diff --git a/sigmoid/all.csv b/leetcode/sigmoid/all.csv similarity index 100% rename from sigmoid/all.csv rename to leetcode/sigmoid/all.csv diff --git a/sigmoid/more-than-six-months.csv b/leetcode/sigmoid/more-than-six-months.csv similarity index 100% rename from sigmoid/more-than-six-months.csv rename to leetcode/sigmoid/more-than-six-months.csv diff --git a/sigmoid/six-months.csv b/leetcode/sigmoid/six-months.csv similarity index 100% rename from sigmoid/six-months.csv rename to leetcode/sigmoid/six-months.csv diff --git a/sigmoid/three-months.csv b/leetcode/sigmoid/three-months.csv similarity index 100% rename from sigmoid/three-months.csv rename to leetcode/sigmoid/three-months.csv diff --git a/singlestore/all.csv b/leetcode/singlestore/all.csv similarity index 100% rename from singlestore/all.csv rename to leetcode/singlestore/all.csv diff --git a/singlestore/more-than-six-months.csv b/leetcode/singlestore/more-than-six-months.csv similarity index 100% rename from singlestore/more-than-six-months.csv rename to leetcode/singlestore/more-than-six-months.csv diff --git a/sixt/all.csv b/leetcode/sixt/all.csv similarity index 100% rename from sixt/all.csv rename to leetcode/sixt/all.csv diff --git a/sixt/more-than-six-months.csv b/leetcode/sixt/more-than-six-months.csv similarity index 100% rename from sixt/more-than-six-months.csv rename to leetcode/sixt/more-than-six-months.csv diff --git a/slice/all.csv b/leetcode/slice/all.csv similarity index 100% rename from slice/all.csv rename to leetcode/slice/all.csv diff --git a/slice/more-than-six-months.csv b/leetcode/slice/more-than-six-months.csv similarity index 100% rename from slice/more-than-six-months.csv rename to leetcode/slice/more-than-six-months.csv diff --git a/smartnews/all.csv b/leetcode/smartnews/all.csv similarity index 100% rename from smartnews/all.csv rename to leetcode/smartnews/all.csv diff --git a/smartnews/more-than-six-months.csv b/leetcode/smartnews/more-than-six-months.csv similarity index 100% rename from smartnews/more-than-six-months.csv rename to leetcode/smartnews/more-than-six-months.csv diff --git a/smartsheet/all.csv b/leetcode/smartsheet/all.csv similarity index 100% rename from smartsheet/all.csv rename to leetcode/smartsheet/all.csv diff --git a/smartsheet/more-than-six-months.csv b/leetcode/smartsheet/more-than-six-months.csv similarity index 100% rename from smartsheet/more-than-six-months.csv rename to leetcode/smartsheet/more-than-six-months.csv diff --git a/snapchat/all.csv b/leetcode/snapchat/all.csv similarity index 100% rename from snapchat/all.csv rename to leetcode/snapchat/all.csv diff --git a/snapchat/more-than-six-months.csv b/leetcode/snapchat/more-than-six-months.csv similarity index 100% rename from snapchat/more-than-six-months.csv rename to leetcode/snapchat/more-than-six-months.csv diff --git a/snapchat/six-months.csv b/leetcode/snapchat/six-months.csv similarity index 100% rename from snapchat/six-months.csv rename to leetcode/snapchat/six-months.csv diff --git a/snapchat/three-months.csv b/leetcode/snapchat/three-months.csv similarity index 100% rename from snapchat/three-months.csv rename to leetcode/snapchat/three-months.csv diff --git a/snapdeal/all.csv b/leetcode/snapdeal/all.csv similarity index 100% rename from snapdeal/all.csv rename to leetcode/snapdeal/all.csv diff --git a/snapdeal/more-than-six-months.csv b/leetcode/snapdeal/more-than-six-months.csv similarity index 100% rename from snapdeal/more-than-six-months.csv rename to leetcode/snapdeal/more-than-six-months.csv diff --git a/snowflake/all.csv b/leetcode/snowflake/all.csv similarity index 100% rename from snowflake/all.csv rename to leetcode/snowflake/all.csv diff --git a/snowflake/more-than-six-months.csv b/leetcode/snowflake/more-than-six-months.csv similarity index 100% rename from snowflake/more-than-six-months.csv rename to leetcode/snowflake/more-than-six-months.csv diff --git a/snowflake/six-months.csv b/leetcode/snowflake/six-months.csv similarity index 100% rename from snowflake/six-months.csv rename to leetcode/snowflake/six-months.csv diff --git a/snowflake/thirty-days.csv b/leetcode/snowflake/thirty-days.csv similarity index 100% rename from snowflake/thirty-days.csv rename to leetcode/snowflake/thirty-days.csv diff --git a/snowflake/three-months.csv b/leetcode/snowflake/three-months.csv similarity index 100% rename from snowflake/three-months.csv rename to leetcode/snowflake/three-months.csv diff --git a/societe-generale/all.csv b/leetcode/societe-generale/all.csv similarity index 100% rename from societe-generale/all.csv rename to leetcode/societe-generale/all.csv diff --git a/societe-generale/more-than-six-months.csv b/leetcode/societe-generale/more-than-six-months.csv similarity index 100% rename from societe-generale/more-than-six-months.csv rename to leetcode/societe-generale/more-than-six-months.csv diff --git a/sofi/all.csv b/leetcode/sofi/all.csv similarity index 100% rename from sofi/all.csv rename to leetcode/sofi/all.csv diff --git a/sofi/more-than-six-months.csv b/leetcode/sofi/more-than-six-months.csv similarity index 100% rename from sofi/more-than-six-months.csv rename to leetcode/sofi/more-than-six-months.csv diff --git a/sofi/six-months.csv b/leetcode/sofi/six-months.csv similarity index 100% rename from sofi/six-months.csv rename to leetcode/sofi/six-months.csv diff --git a/sofi/three-months.csv b/leetcode/sofi/three-months.csv similarity index 100% rename from sofi/three-months.csv rename to leetcode/sofi/three-months.csv diff --git a/software-ag/all.csv b/leetcode/software-ag/all.csv similarity index 100% rename from software-ag/all.csv rename to leetcode/software-ag/all.csv diff --git a/software-ag/more-than-six-months.csv b/leetcode/software-ag/more-than-six-months.csv similarity index 100% rename from software-ag/more-than-six-months.csv rename to leetcode/software-ag/more-than-six-months.csv diff --git a/softwire/all.csv b/leetcode/softwire/all.csv similarity index 100% rename from softwire/all.csv rename to leetcode/softwire/all.csv diff --git a/softwire/more-than-six-months.csv b/leetcode/softwire/more-than-six-months.csv similarity index 100% rename from softwire/more-than-six-months.csv rename to leetcode/softwire/more-than-six-months.csv diff --git a/softwire/six-months.csv b/leetcode/softwire/six-months.csv similarity index 100% rename from softwire/six-months.csv rename to leetcode/softwire/six-months.csv diff --git a/sony/all.csv b/leetcode/sony/all.csv similarity index 100% rename from sony/all.csv rename to leetcode/sony/all.csv diff --git a/sony/more-than-six-months.csv b/leetcode/sony/more-than-six-months.csv similarity index 100% rename from sony/more-than-six-months.csv rename to leetcode/sony/more-than-six-months.csv diff --git a/soti/all.csv b/leetcode/soti/all.csv similarity index 100% rename from soti/all.csv rename to leetcode/soti/all.csv diff --git a/soti/more-than-six-months.csv b/leetcode/soti/more-than-six-months.csv similarity index 100% rename from soti/more-than-six-months.csv rename to leetcode/soti/more-than-six-months.csv diff --git a/soundhound/all.csv b/leetcode/soundhound/all.csv similarity index 100% rename from soundhound/all.csv rename to leetcode/soundhound/all.csv diff --git a/soundhound/more-than-six-months.csv b/leetcode/soundhound/more-than-six-months.csv similarity index 100% rename from soundhound/more-than-six-months.csv rename to leetcode/soundhound/more-than-six-months.csv diff --git a/spacex/all.csv b/leetcode/spacex/all.csv similarity index 100% rename from spacex/all.csv rename to leetcode/spacex/all.csv diff --git a/spacex/more-than-six-months.csv b/leetcode/spacex/more-than-six-months.csv similarity index 100% rename from spacex/more-than-six-months.csv rename to leetcode/spacex/more-than-six-months.csv diff --git a/spinny/all.csv b/leetcode/spinny/all.csv similarity index 100% rename from spinny/all.csv rename to leetcode/spinny/all.csv diff --git a/spinny/more-than-six-months.csv b/leetcode/spinny/more-than-six-months.csv similarity index 100% rename from spinny/more-than-six-months.csv rename to leetcode/spinny/more-than-six-months.csv diff --git a/spinny/six-months.csv b/leetcode/spinny/six-months.csv similarity index 100% rename from spinny/six-months.csv rename to leetcode/spinny/six-months.csv diff --git a/spinny/three-months.csv b/leetcode/spinny/three-months.csv similarity index 100% rename from spinny/three-months.csv rename to leetcode/spinny/three-months.csv diff --git a/splunk/all.csv b/leetcode/splunk/all.csv similarity index 100% rename from splunk/all.csv rename to leetcode/splunk/all.csv diff --git a/splunk/more-than-six-months.csv b/leetcode/splunk/more-than-six-months.csv similarity index 100% rename from splunk/more-than-six-months.csv rename to leetcode/splunk/more-than-six-months.csv diff --git a/splunk/six-months.csv b/leetcode/splunk/six-months.csv similarity index 100% rename from splunk/six-months.csv rename to leetcode/splunk/six-months.csv diff --git a/spotify/all.csv b/leetcode/spotify/all.csv similarity index 100% rename from spotify/all.csv rename to leetcode/spotify/all.csv diff --git a/spotify/more-than-six-months.csv b/leetcode/spotify/more-than-six-months.csv similarity index 100% rename from spotify/more-than-six-months.csv rename to leetcode/spotify/more-than-six-months.csv diff --git a/spotify/six-months.csv b/leetcode/spotify/six-months.csv similarity index 100% rename from spotify/six-months.csv rename to leetcode/spotify/six-months.csv diff --git a/spotify/thirty-days.csv b/leetcode/spotify/thirty-days.csv similarity index 100% rename from spotify/thirty-days.csv rename to leetcode/spotify/thirty-days.csv diff --git a/spotify/three-months.csv b/leetcode/spotify/three-months.csv similarity index 100% rename from spotify/three-months.csv rename to leetcode/spotify/three-months.csv diff --git a/sprinklr/all.csv b/leetcode/sprinklr/all.csv similarity index 100% rename from sprinklr/all.csv rename to leetcode/sprinklr/all.csv diff --git a/sprinklr/more-than-six-months.csv b/leetcode/sprinklr/more-than-six-months.csv similarity index 100% rename from sprinklr/more-than-six-months.csv rename to leetcode/sprinklr/more-than-six-months.csv diff --git a/square/all.csv b/leetcode/square/all.csv similarity index 100% rename from square/all.csv rename to leetcode/square/all.csv diff --git a/square/more-than-six-months.csv b/leetcode/square/more-than-six-months.csv similarity index 100% rename from square/more-than-six-months.csv rename to leetcode/square/more-than-six-months.csv diff --git a/square/six-months.csv b/leetcode/square/six-months.csv similarity index 100% rename from square/six-months.csv rename to leetcode/square/six-months.csv diff --git a/squarepoint-capital/all.csv b/leetcode/squarepoint-capital/all.csv similarity index 100% rename from squarepoint-capital/all.csv rename to leetcode/squarepoint-capital/all.csv diff --git a/squarepoint-capital/more-than-six-months.csv b/leetcode/squarepoint-capital/more-than-six-months.csv similarity index 100% rename from squarepoint-capital/more-than-six-months.csv rename to leetcode/squarepoint-capital/more-than-six-months.csv diff --git a/squarepoint-capital/six-months.csv b/leetcode/squarepoint-capital/six-months.csv similarity index 100% rename from squarepoint-capital/six-months.csv rename to leetcode/squarepoint-capital/six-months.csv diff --git a/squarespace/all.csv b/leetcode/squarespace/all.csv similarity index 100% rename from squarespace/all.csv rename to leetcode/squarespace/all.csv diff --git a/squarespace/more-than-six-months.csv b/leetcode/squarespace/more-than-six-months.csv similarity index 100% rename from squarespace/more-than-six-months.csv rename to leetcode/squarespace/more-than-six-months.csv diff --git a/squarespace/six-months.csv b/leetcode/squarespace/six-months.csv similarity index 100% rename from squarespace/six-months.csv rename to leetcode/squarespace/six-months.csv diff --git a/squarespace/three-months.csv b/leetcode/squarespace/three-months.csv similarity index 100% rename from squarespace/three-months.csv rename to leetcode/squarespace/three-months.csv diff --git a/src/main/java/Main.java b/leetcode/src/main/java/Main.java similarity index 100% rename from src/main/java/Main.java rename to leetcode/src/main/java/Main.java diff --git a/src/main/java/Scraper.java b/leetcode/src/main/java/Scraper.java similarity index 100% rename from src/main/java/Scraper.java rename to leetcode/src/main/java/Scraper.java diff --git a/src/main/java/model/ProblemStatement.java b/leetcode/src/main/java/model/ProblemStatement.java similarity index 100% rename from src/main/java/model/ProblemStatement.java rename to leetcode/src/main/java/model/ProblemStatement.java diff --git a/stackadapt/all.csv b/leetcode/stackadapt/all.csv similarity index 100% rename from stackadapt/all.csv rename to leetcode/stackadapt/all.csv diff --git a/stackadapt/more-than-six-months.csv b/leetcode/stackadapt/more-than-six-months.csv similarity index 100% rename from stackadapt/more-than-six-months.csv rename to leetcode/stackadapt/more-than-six-months.csv diff --git a/stackline/all.csv b/leetcode/stackline/all.csv similarity index 100% rename from stackline/all.csv rename to leetcode/stackline/all.csv diff --git a/stackline/more-than-six-months.csv b/leetcode/stackline/more-than-six-months.csv similarity index 100% rename from stackline/more-than-six-months.csv rename to leetcode/stackline/more-than-six-months.csv diff --git a/stackline/six-months.csv b/leetcode/stackline/six-months.csv similarity index 100% rename from stackline/six-months.csv rename to leetcode/stackline/six-months.csv diff --git a/starbucks/all.csv b/leetcode/starbucks/all.csv similarity index 100% rename from starbucks/all.csv rename to leetcode/starbucks/all.csv diff --git a/starbucks/six-months.csv b/leetcode/starbucks/six-months.csv similarity index 100% rename from starbucks/six-months.csv rename to leetcode/starbucks/six-months.csv diff --git a/starbucks/three-months.csv b/leetcode/starbucks/three-months.csv similarity index 100% rename from starbucks/three-months.csv rename to leetcode/starbucks/three-months.csv diff --git a/state-farm/all.csv b/leetcode/state-farm/all.csv similarity index 100% rename from state-farm/all.csv rename to leetcode/state-farm/all.csv diff --git a/state-farm/six-months.csv b/leetcode/state-farm/six-months.csv similarity index 100% rename from state-farm/six-months.csv rename to leetcode/state-farm/six-months.csv diff --git a/strava/all.csv b/leetcode/strava/all.csv similarity index 100% rename from strava/all.csv rename to leetcode/strava/all.csv diff --git a/strava/more-than-six-months.csv b/leetcode/strava/more-than-six-months.csv similarity index 100% rename from strava/more-than-six-months.csv rename to leetcode/strava/more-than-six-months.csv diff --git a/stripe/all.csv b/leetcode/stripe/all.csv similarity index 100% rename from stripe/all.csv rename to leetcode/stripe/all.csv diff --git a/stripe/more-than-six-months.csv b/leetcode/stripe/more-than-six-months.csv similarity index 100% rename from stripe/more-than-six-months.csv rename to leetcode/stripe/more-than-six-months.csv diff --git a/stripe/six-months.csv b/leetcode/stripe/six-months.csv similarity index 100% rename from stripe/six-months.csv rename to leetcode/stripe/six-months.csv diff --git a/stripe/thirty-days.csv b/leetcode/stripe/thirty-days.csv similarity index 100% rename from stripe/thirty-days.csv rename to leetcode/stripe/thirty-days.csv diff --git a/stripe/three-months.csv b/leetcode/stripe/three-months.csv similarity index 100% rename from stripe/three-months.csv rename to leetcode/stripe/three-months.csv diff --git a/sumologic/all.csv b/leetcode/sumologic/all.csv similarity index 100% rename from sumologic/all.csv rename to leetcode/sumologic/all.csv diff --git a/sumologic/more-than-six-months.csv b/leetcode/sumologic/more-than-six-months.csv similarity index 100% rename from sumologic/more-than-six-months.csv rename to leetcode/sumologic/more-than-six-months.csv diff --git a/susquehanna-international-group/all.csv b/leetcode/susquehanna-international-group/all.csv similarity index 100% rename from susquehanna-international-group/all.csv rename to leetcode/susquehanna-international-group/all.csv diff --git a/swiggy/all.csv b/leetcode/swiggy/all.csv similarity index 100% rename from swiggy/all.csv rename to leetcode/swiggy/all.csv diff --git a/swiggy/more-than-six-months.csv b/leetcode/swiggy/more-than-six-months.csv similarity index 100% rename from swiggy/more-than-six-months.csv rename to leetcode/swiggy/more-than-six-months.csv diff --git a/swiggy/six-months.csv b/leetcode/swiggy/six-months.csv similarity index 100% rename from swiggy/six-months.csv rename to leetcode/swiggy/six-months.csv diff --git a/swiggy/thirty-days.csv b/leetcode/swiggy/thirty-days.csv similarity index 100% rename from swiggy/thirty-days.csv rename to leetcode/swiggy/thirty-days.csv diff --git a/swiggy/three-months.csv b/leetcode/swiggy/three-months.csv similarity index 100% rename from swiggy/three-months.csv rename to leetcode/swiggy/three-months.csv diff --git a/syfe/all.csv b/leetcode/syfe/all.csv similarity index 100% rename from syfe/all.csv rename to leetcode/syfe/all.csv diff --git a/syfe/more-than-six-months.csv b/leetcode/syfe/more-than-six-months.csv similarity index 100% rename from syfe/more-than-six-months.csv rename to leetcode/syfe/more-than-six-months.csv diff --git a/synology/all.csv b/leetcode/synology/all.csv similarity index 100% rename from synology/all.csv rename to leetcode/synology/all.csv diff --git a/synology/more-than-six-months.csv b/leetcode/synology/more-than-six-months.csv similarity index 100% rename from synology/more-than-six-months.csv rename to leetcode/synology/more-than-six-months.csv diff --git a/synopsys/all.csv b/leetcode/synopsys/all.csv similarity index 100% rename from synopsys/all.csv rename to leetcode/synopsys/all.csv diff --git a/synopsys/more-than-six-months.csv b/leetcode/synopsys/more-than-six-months.csv similarity index 100% rename from synopsys/more-than-six-months.csv rename to leetcode/synopsys/more-than-six-months.csv diff --git a/ta-digital/all.csv b/leetcode/ta-digital/all.csv similarity index 100% rename from ta-digital/all.csv rename to leetcode/ta-digital/all.csv diff --git a/ta-digital/more-than-six-months.csv b/leetcode/ta-digital/more-than-six-months.csv similarity index 100% rename from ta-digital/more-than-six-months.csv rename to leetcode/ta-digital/more-than-six-months.csv diff --git a/tableau/all.csv b/leetcode/tableau/all.csv similarity index 100% rename from tableau/all.csv rename to leetcode/tableau/all.csv diff --git a/tableau/more-than-six-months.csv b/leetcode/tableau/more-than-six-months.csv similarity index 100% rename from tableau/more-than-six-months.csv rename to leetcode/tableau/more-than-six-months.csv diff --git a/tally-solutions/all.csv b/leetcode/tally-solutions/all.csv similarity index 100% rename from tally-solutions/all.csv rename to leetcode/tally-solutions/all.csv diff --git a/tally-solutions/more-than-six-months.csv b/leetcode/tally-solutions/more-than-six-months.csv similarity index 100% rename from tally-solutions/more-than-six-months.csv rename to leetcode/tally-solutions/more-than-six-months.csv diff --git a/tanium/all.csv b/leetcode/tanium/all.csv similarity index 100% rename from tanium/all.csv rename to leetcode/tanium/all.csv diff --git a/tanium/more-than-six-months.csv b/leetcode/tanium/more-than-six-months.csv similarity index 100% rename from tanium/more-than-six-months.csv rename to leetcode/tanium/more-than-six-months.csv diff --git a/tanium/six-months.csv b/leetcode/tanium/six-months.csv similarity index 100% rename from tanium/six-months.csv rename to leetcode/tanium/six-months.csv diff --git a/target/all.csv b/leetcode/target/all.csv similarity index 100% rename from target/all.csv rename to leetcode/target/all.csv diff --git a/target/more-than-six-months.csv b/leetcode/target/more-than-six-months.csv similarity index 100% rename from target/more-than-six-months.csv rename to leetcode/target/more-than-six-months.csv diff --git a/tcs/all.csv b/leetcode/tcs/all.csv similarity index 100% rename from tcs/all.csv rename to leetcode/tcs/all.csv diff --git a/tcs/more-than-six-months.csv b/leetcode/tcs/more-than-six-months.csv similarity index 100% rename from tcs/more-than-six-months.csv rename to leetcode/tcs/more-than-six-months.csv diff --git a/tcs/six-months.csv b/leetcode/tcs/six-months.csv similarity index 100% rename from tcs/six-months.csv rename to leetcode/tcs/six-months.csv diff --git a/tcs/thirty-days.csv b/leetcode/tcs/thirty-days.csv similarity index 100% rename from tcs/thirty-days.csv rename to leetcode/tcs/thirty-days.csv diff --git a/tcs/three-months.csv b/leetcode/tcs/three-months.csv similarity index 100% rename from tcs/three-months.csv rename to leetcode/tcs/three-months.csv diff --git a/tech-mahindra/all.csv b/leetcode/tech-mahindra/all.csv similarity index 100% rename from tech-mahindra/all.csv rename to leetcode/tech-mahindra/all.csv diff --git a/tech-mahindra/more-than-six-months.csv b/leetcode/tech-mahindra/more-than-six-months.csv similarity index 100% rename from tech-mahindra/more-than-six-months.csv rename to leetcode/tech-mahindra/more-than-six-months.csv diff --git a/tekion/all.csv b/leetcode/tekion/all.csv similarity index 100% rename from tekion/all.csv rename to leetcode/tekion/all.csv diff --git a/tekion/more-than-six-months.csv b/leetcode/tekion/more-than-six-months.csv similarity index 100% rename from tekion/more-than-six-months.csv rename to leetcode/tekion/more-than-six-months.csv diff --git a/tekion/six-months.csv b/leetcode/tekion/six-months.csv similarity index 100% rename from tekion/six-months.csv rename to leetcode/tekion/six-months.csv diff --git a/tekion/three-months.csv b/leetcode/tekion/three-months.csv similarity index 100% rename from tekion/three-months.csv rename to leetcode/tekion/three-months.csv diff --git a/tencent/all.csv b/leetcode/tencent/all.csv similarity index 100% rename from tencent/all.csv rename to leetcode/tencent/all.csv diff --git a/tencent/more-than-six-months.csv b/leetcode/tencent/more-than-six-months.csv similarity index 100% rename from tencent/more-than-six-months.csv rename to leetcode/tencent/more-than-six-months.csv diff --git a/tencent/six-months.csv b/leetcode/tencent/six-months.csv similarity index 100% rename from tencent/six-months.csv rename to leetcode/tencent/six-months.csv diff --git a/tencent/three-months.csv b/leetcode/tencent/three-months.csv similarity index 100% rename from tencent/three-months.csv rename to leetcode/tencent/three-months.csv diff --git a/teradata/all.csv b/leetcode/teradata/all.csv similarity index 100% rename from teradata/all.csv rename to leetcode/teradata/all.csv diff --git a/teradata/more-than-six-months.csv b/leetcode/teradata/more-than-six-months.csv similarity index 100% rename from teradata/more-than-six-months.csv rename to leetcode/teradata/more-than-six-months.csv diff --git a/tesco/all.csv b/leetcode/tesco/all.csv similarity index 100% rename from tesco/all.csv rename to leetcode/tesco/all.csv diff --git a/tesco/more-than-six-months.csv b/leetcode/tesco/more-than-six-months.csv similarity index 100% rename from tesco/more-than-six-months.csv rename to leetcode/tesco/more-than-six-months.csv diff --git a/tesco/six-months.csv b/leetcode/tesco/six-months.csv similarity index 100% rename from tesco/six-months.csv rename to leetcode/tesco/six-months.csv diff --git a/tesla/all.csv b/leetcode/tesla/all.csv similarity index 100% rename from tesla/all.csv rename to leetcode/tesla/all.csv diff --git a/tesla/more-than-six-months.csv b/leetcode/tesla/more-than-six-months.csv similarity index 100% rename from tesla/more-than-six-months.csv rename to leetcode/tesla/more-than-six-months.csv diff --git a/tesla/six-months.csv b/leetcode/tesla/six-months.csv similarity index 100% rename from tesla/six-months.csv rename to leetcode/tesla/six-months.csv diff --git a/tesla/three-months.csv b/leetcode/tesla/three-months.csv similarity index 100% rename from tesla/three-months.csv rename to leetcode/tesla/three-months.csv diff --git a/texas-instruments/all.csv b/leetcode/texas-instruments/all.csv similarity index 100% rename from texas-instruments/all.csv rename to leetcode/texas-instruments/all.csv diff --git a/texas-instruments/more-than-six-months.csv b/leetcode/texas-instruments/more-than-six-months.csv similarity index 100% rename from texas-instruments/more-than-six-months.csv rename to leetcode/texas-instruments/more-than-six-months.csv diff --git a/the-trade-desk/all.csv b/leetcode/the-trade-desk/all.csv similarity index 100% rename from the-trade-desk/all.csv rename to leetcode/the-trade-desk/all.csv diff --git a/the-trade-desk/more-than-six-months.csv b/leetcode/the-trade-desk/more-than-six-months.csv similarity index 100% rename from the-trade-desk/more-than-six-months.csv rename to leetcode/the-trade-desk/more-than-six-months.csv diff --git a/the-trade-desk/six-months.csv b/leetcode/the-trade-desk/six-months.csv similarity index 100% rename from the-trade-desk/six-months.csv rename to leetcode/the-trade-desk/six-months.csv diff --git a/thomson-reuters/all.csv b/leetcode/thomson-reuters/all.csv similarity index 100% rename from thomson-reuters/all.csv rename to leetcode/thomson-reuters/all.csv diff --git a/thomson-reuters/more-than-six-months.csv b/leetcode/thomson-reuters/more-than-six-months.csv similarity index 100% rename from thomson-reuters/more-than-six-months.csv rename to leetcode/thomson-reuters/more-than-six-months.csv diff --git a/thoughtspot/all.csv b/leetcode/thoughtspot/all.csv similarity index 100% rename from thoughtspot/all.csv rename to leetcode/thoughtspot/all.csv diff --git a/thoughtspot/more-than-six-months.csv b/leetcode/thoughtspot/more-than-six-months.csv similarity index 100% rename from thoughtspot/more-than-six-months.csv rename to leetcode/thoughtspot/more-than-six-months.csv diff --git a/thoughtworks/all.csv b/leetcode/thoughtworks/all.csv similarity index 100% rename from thoughtworks/all.csv rename to leetcode/thoughtworks/all.csv diff --git a/thoughtworks/more-than-six-months.csv b/leetcode/thoughtworks/more-than-six-months.csv similarity index 100% rename from thoughtworks/more-than-six-months.csv rename to leetcode/thoughtworks/more-than-six-months.csv diff --git a/thousandeyes/all.csv b/leetcode/thousandeyes/all.csv similarity index 100% rename from thousandeyes/all.csv rename to leetcode/thousandeyes/all.csv diff --git a/thousandeyes/more-than-six-months.csv b/leetcode/thousandeyes/more-than-six-months.csv similarity index 100% rename from thousandeyes/more-than-six-months.csv rename to leetcode/thousandeyes/more-than-six-months.csv diff --git a/thumbtack/all.csv b/leetcode/thumbtack/all.csv similarity index 100% rename from thumbtack/all.csv rename to leetcode/thumbtack/all.csv diff --git a/thumbtack/more-than-six-months.csv b/leetcode/thumbtack/more-than-six-months.csv similarity index 100% rename from thumbtack/more-than-six-months.csv rename to leetcode/thumbtack/more-than-six-months.csv diff --git a/tiaa/all.csv b/leetcode/tiaa/all.csv similarity index 100% rename from tiaa/all.csv rename to leetcode/tiaa/all.csv diff --git a/tiaa/more-than-six-months.csv b/leetcode/tiaa/more-than-six-months.csv similarity index 100% rename from tiaa/more-than-six-months.csv rename to leetcode/tiaa/more-than-six-months.csv diff --git a/tiger-analytics/all.csv b/leetcode/tiger-analytics/all.csv similarity index 100% rename from tiger-analytics/all.csv rename to leetcode/tiger-analytics/all.csv diff --git a/tiger-analytics/more-than-six-months.csv b/leetcode/tiger-analytics/more-than-six-months.csv similarity index 100% rename from tiger-analytics/more-than-six-months.csv rename to leetcode/tiger-analytics/more-than-six-months.csv diff --git a/tiger-analytics/six-months.csv b/leetcode/tiger-analytics/six-months.csv similarity index 100% rename from tiger-analytics/six-months.csv rename to leetcode/tiger-analytics/six-months.csv diff --git a/tiger-analytics/three-months.csv b/leetcode/tiger-analytics/three-months.csv similarity index 100% rename from tiger-analytics/three-months.csv rename to leetcode/tiger-analytics/three-months.csv diff --git a/tiktok/all.csv b/leetcode/tiktok/all.csv similarity index 100% rename from tiktok/all.csv rename to leetcode/tiktok/all.csv diff --git a/tiktok/more-than-six-months.csv b/leetcode/tiktok/more-than-six-months.csv similarity index 100% rename from tiktok/more-than-six-months.csv rename to leetcode/tiktok/more-than-six-months.csv diff --git a/tiktok/six-months.csv b/leetcode/tiktok/six-months.csv similarity index 100% rename from tiktok/six-months.csv rename to leetcode/tiktok/six-months.csv diff --git a/tiktok/thirty-days.csv b/leetcode/tiktok/thirty-days.csv similarity index 100% rename from tiktok/thirty-days.csv rename to leetcode/tiktok/thirty-days.csv diff --git a/tiktok/three-months.csv b/leetcode/tiktok/three-months.csv similarity index 100% rename from tiktok/three-months.csv rename to leetcode/tiktok/three-months.csv diff --git a/tinder/all.csv b/leetcode/tinder/all.csv similarity index 100% rename from tinder/all.csv rename to leetcode/tinder/all.csv diff --git a/tinder/more-than-six-months.csv b/leetcode/tinder/more-than-six-months.csv similarity index 100% rename from tinder/more-than-six-months.csv rename to leetcode/tinder/more-than-six-months.csv diff --git a/tinkoff/all.csv b/leetcode/tinkoff/all.csv similarity index 100% rename from tinkoff/all.csv rename to leetcode/tinkoff/all.csv diff --git a/tinkoff/more-than-six-months.csv b/leetcode/tinkoff/more-than-six-months.csv similarity index 100% rename from tinkoff/more-than-six-months.csv rename to leetcode/tinkoff/more-than-six-months.csv diff --git a/toast/all.csv b/leetcode/toast/all.csv similarity index 100% rename from toast/all.csv rename to leetcode/toast/all.csv diff --git a/toast/more-than-six-months.csv b/leetcode/toast/more-than-six-months.csv similarity index 100% rename from toast/more-than-six-months.csv rename to leetcode/toast/more-than-six-months.csv diff --git a/toast/six-months.csv b/leetcode/toast/six-months.csv similarity index 100% rename from toast/six-months.csv rename to leetcode/toast/six-months.csv diff --git a/toast/three-months.csv b/leetcode/toast/three-months.csv similarity index 100% rename from toast/three-months.csv rename to leetcode/toast/three-months.csv diff --git a/tokopedia/all.csv b/leetcode/tokopedia/all.csv similarity index 100% rename from tokopedia/all.csv rename to leetcode/tokopedia/all.csv diff --git a/tokopedia/more-than-six-months.csv b/leetcode/tokopedia/more-than-six-months.csv similarity index 100% rename from tokopedia/more-than-six-months.csv rename to leetcode/tokopedia/more-than-six-months.csv diff --git a/tomtom/all.csv b/leetcode/tomtom/all.csv similarity index 100% rename from tomtom/all.csv rename to leetcode/tomtom/all.csv diff --git a/tomtom/more-than-six-months.csv b/leetcode/tomtom/more-than-six-months.csv similarity index 100% rename from tomtom/more-than-six-months.csv rename to leetcode/tomtom/more-than-six-months.csv diff --git a/tomtom/six-months.csv b/leetcode/tomtom/six-months.csv similarity index 100% rename from tomtom/six-months.csv rename to leetcode/tomtom/six-months.csv diff --git a/toptal/all.csv b/leetcode/toptal/all.csv similarity index 100% rename from toptal/all.csv rename to leetcode/toptal/all.csv diff --git a/toptal/more-than-six-months.csv b/leetcode/toptal/more-than-six-months.csv similarity index 100% rename from toptal/more-than-six-months.csv rename to leetcode/toptal/more-than-six-months.csv diff --git a/tower-research/all.csv b/leetcode/tower-research/all.csv similarity index 100% rename from tower-research/all.csv rename to leetcode/tower-research/all.csv diff --git a/tower-research/more-than-six-months.csv b/leetcode/tower-research/more-than-six-months.csv similarity index 100% rename from tower-research/more-than-six-months.csv rename to leetcode/tower-research/more-than-six-months.csv diff --git a/tracxn/all.csv b/leetcode/tracxn/all.csv similarity index 100% rename from tracxn/all.csv rename to leetcode/tracxn/all.csv diff --git a/tracxn/six-months.csv b/leetcode/tracxn/six-months.csv similarity index 100% rename from tracxn/six-months.csv rename to leetcode/tracxn/six-months.csv diff --git a/traveloka/all.csv b/leetcode/traveloka/all.csv similarity index 100% rename from traveloka/all.csv rename to leetcode/traveloka/all.csv diff --git a/traveloka/more-than-six-months.csv b/leetcode/traveloka/more-than-six-months.csv similarity index 100% rename from traveloka/more-than-six-months.csv rename to leetcode/traveloka/more-than-six-months.csv diff --git a/traveloka/six-months.csv b/leetcode/traveloka/six-months.csv similarity index 100% rename from traveloka/six-months.csv rename to leetcode/traveloka/six-months.csv diff --git a/trexquant/all.csv b/leetcode/trexquant/all.csv similarity index 100% rename from trexquant/all.csv rename to leetcode/trexquant/all.csv diff --git a/trexquant/more-than-six-months.csv b/leetcode/trexquant/more-than-six-months.csv similarity index 100% rename from trexquant/more-than-six-months.csv rename to leetcode/trexquant/more-than-six-months.csv diff --git a/trilogy/all.csv b/leetcode/trilogy/all.csv similarity index 100% rename from trilogy/all.csv rename to leetcode/trilogy/all.csv diff --git a/trilogy/more-than-six-months.csv b/leetcode/trilogy/more-than-six-months.csv similarity index 100% rename from trilogy/more-than-six-months.csv rename to leetcode/trilogy/more-than-six-months.csv diff --git a/trilogy/six-months.csv b/leetcode/trilogy/six-months.csv similarity index 100% rename from trilogy/six-months.csv rename to leetcode/trilogy/six-months.csv diff --git a/trilogy/thirty-days.csv b/leetcode/trilogy/thirty-days.csv similarity index 100% rename from trilogy/thirty-days.csv rename to leetcode/trilogy/thirty-days.csv diff --git a/trilogy/three-months.csv b/leetcode/trilogy/three-months.csv similarity index 100% rename from trilogy/three-months.csv rename to leetcode/trilogy/three-months.csv diff --git a/tripadvisor/all.csv b/leetcode/tripadvisor/all.csv similarity index 100% rename from tripadvisor/all.csv rename to leetcode/tripadvisor/all.csv diff --git a/tripadvisor/more-than-six-months.csv b/leetcode/tripadvisor/more-than-six-months.csv similarity index 100% rename from tripadvisor/more-than-six-months.csv rename to leetcode/tripadvisor/more-than-six-months.csv diff --git a/tripadvisor/six-months.csv b/leetcode/tripadvisor/six-months.csv similarity index 100% rename from tripadvisor/six-months.csv rename to leetcode/tripadvisor/six-months.csv diff --git a/triplebyte/all.csv b/leetcode/triplebyte/all.csv similarity index 100% rename from triplebyte/all.csv rename to leetcode/triplebyte/all.csv diff --git a/triplebyte/more-than-six-months.csv b/leetcode/triplebyte/more-than-six-months.csv similarity index 100% rename from triplebyte/more-than-six-months.csv rename to leetcode/triplebyte/more-than-six-months.csv diff --git a/turing/all.csv b/leetcode/turing/all.csv similarity index 100% rename from turing/all.csv rename to leetcode/turing/all.csv diff --git a/turing/more-than-six-months.csv b/leetcode/turing/more-than-six-months.csv similarity index 100% rename from turing/more-than-six-months.csv rename to leetcode/turing/more-than-six-months.csv diff --git a/turing/six-months.csv b/leetcode/turing/six-months.csv similarity index 100% rename from turing/six-months.csv rename to leetcode/turing/six-months.csv diff --git a/turing/three-months.csv b/leetcode/turing/three-months.csv similarity index 100% rename from turing/three-months.csv rename to leetcode/turing/three-months.csv diff --git a/turo/all.csv b/leetcode/turo/all.csv similarity index 100% rename from turo/all.csv rename to leetcode/turo/all.csv diff --git a/turo/more-than-six-months.csv b/leetcode/turo/more-than-six-months.csv similarity index 100% rename from turo/more-than-six-months.csv rename to leetcode/turo/more-than-six-months.csv diff --git a/turvo/all.csv b/leetcode/turvo/all.csv similarity index 100% rename from turvo/all.csv rename to leetcode/turvo/all.csv diff --git a/turvo/more-than-six-months.csv b/leetcode/turvo/more-than-six-months.csv similarity index 100% rename from turvo/more-than-six-months.csv rename to leetcode/turvo/more-than-six-months.csv diff --git a/tusimple/all.csv b/leetcode/tusimple/all.csv similarity index 100% rename from tusimple/all.csv rename to leetcode/tusimple/all.csv diff --git a/tusimple/more-than-six-months.csv b/leetcode/tusimple/more-than-six-months.csv similarity index 100% rename from tusimple/more-than-six-months.csv rename to leetcode/tusimple/more-than-six-months.csv diff --git a/twilio/all.csv b/leetcode/twilio/all.csv similarity index 100% rename from twilio/all.csv rename to leetcode/twilio/all.csv diff --git a/twilio/more-than-six-months.csv b/leetcode/twilio/more-than-six-months.csv similarity index 100% rename from twilio/more-than-six-months.csv rename to leetcode/twilio/more-than-six-months.csv diff --git a/twitch/all.csv b/leetcode/twitch/all.csv similarity index 100% rename from twitch/all.csv rename to leetcode/twitch/all.csv diff --git a/twitch/more-than-six-months.csv b/leetcode/twitch/more-than-six-months.csv similarity index 100% rename from twitch/more-than-six-months.csv rename to leetcode/twitch/more-than-six-months.csv diff --git a/twitch/six-months.csv b/leetcode/twitch/six-months.csv similarity index 100% rename from twitch/six-months.csv rename to leetcode/twitch/six-months.csv diff --git a/twitch/three-months.csv b/leetcode/twitch/three-months.csv similarity index 100% rename from twitch/three-months.csv rename to leetcode/twitch/three-months.csv diff --git a/twitter/all.csv b/leetcode/twitter/all.csv similarity index 100% rename from twitter/all.csv rename to leetcode/twitter/all.csv diff --git a/twitter/more-than-six-months.csv b/leetcode/twitter/more-than-six-months.csv similarity index 100% rename from twitter/more-than-six-months.csv rename to leetcode/twitter/more-than-six-months.csv diff --git a/two-sigma/all.csv b/leetcode/two-sigma/all.csv similarity index 100% rename from two-sigma/all.csv rename to leetcode/two-sigma/all.csv diff --git a/two-sigma/more-than-six-months.csv b/leetcode/two-sigma/more-than-six-months.csv similarity index 100% rename from two-sigma/more-than-six-months.csv rename to leetcode/two-sigma/more-than-six-months.csv diff --git a/two-sigma/six-months.csv b/leetcode/two-sigma/six-months.csv similarity index 100% rename from two-sigma/six-months.csv rename to leetcode/two-sigma/six-months.csv diff --git a/uber/all.csv b/leetcode/uber/all.csv similarity index 100% rename from uber/all.csv rename to leetcode/uber/all.csv diff --git a/uber/more-than-six-months.csv b/leetcode/uber/more-than-six-months.csv similarity index 100% rename from uber/more-than-six-months.csv rename to leetcode/uber/more-than-six-months.csv diff --git a/uber/six-months.csv b/leetcode/uber/six-months.csv similarity index 100% rename from uber/six-months.csv rename to leetcode/uber/six-months.csv diff --git a/uber/thirty-days.csv b/leetcode/uber/thirty-days.csv similarity index 100% rename from uber/thirty-days.csv rename to leetcode/uber/thirty-days.csv diff --git a/uber/three-months.csv b/leetcode/uber/three-months.csv similarity index 100% rename from uber/three-months.csv rename to leetcode/uber/three-months.csv diff --git a/ubisoft/all.csv b/leetcode/ubisoft/all.csv similarity index 100% rename from ubisoft/all.csv rename to leetcode/ubisoft/all.csv diff --git a/ubs/all.csv b/leetcode/ubs/all.csv similarity index 100% rename from ubs/all.csv rename to leetcode/ubs/all.csv diff --git a/ubs/more-than-six-months.csv b/leetcode/ubs/more-than-six-months.csv similarity index 100% rename from ubs/more-than-six-months.csv rename to leetcode/ubs/more-than-six-months.csv diff --git a/ubs/six-months.csv b/leetcode/ubs/six-months.csv similarity index 100% rename from ubs/six-months.csv rename to leetcode/ubs/six-months.csv diff --git a/uipath/all.csv b/leetcode/uipath/all.csv similarity index 100% rename from uipath/all.csv rename to leetcode/uipath/all.csv diff --git a/uipath/more-than-six-months.csv b/leetcode/uipath/more-than-six-months.csv similarity index 100% rename from uipath/more-than-six-months.csv rename to leetcode/uipath/more-than-six-months.csv diff --git a/uipath/six-months.csv b/leetcode/uipath/six-months.csv similarity index 100% rename from uipath/six-months.csv rename to leetcode/uipath/six-months.csv diff --git a/uipath/three-months.csv b/leetcode/uipath/three-months.csv similarity index 100% rename from uipath/three-months.csv rename to leetcode/uipath/three-months.csv diff --git a/ukg/all.csv b/leetcode/ukg/all.csv similarity index 100% rename from ukg/all.csv rename to leetcode/ukg/all.csv diff --git a/ukg/more-than-six-months.csv b/leetcode/ukg/more-than-six-months.csv similarity index 100% rename from ukg/more-than-six-months.csv rename to leetcode/ukg/more-than-six-months.csv diff --git a/ukg/six-months.csv b/leetcode/ukg/six-months.csv similarity index 100% rename from ukg/six-months.csv rename to leetcode/ukg/six-months.csv diff --git a/ukg/three-months.csv b/leetcode/ukg/three-months.csv similarity index 100% rename from ukg/three-months.csv rename to leetcode/ukg/three-months.csv diff --git a/unbxd/all.csv b/leetcode/unbxd/all.csv similarity index 100% rename from unbxd/all.csv rename to leetcode/unbxd/all.csv diff --git a/unbxd/more-than-six-months.csv b/leetcode/unbxd/more-than-six-months.csv similarity index 100% rename from unbxd/more-than-six-months.csv rename to leetcode/unbxd/more-than-six-months.csv diff --git a/unity/all.csv b/leetcode/unity/all.csv similarity index 100% rename from unity/all.csv rename to leetcode/unity/all.csv diff --git a/unity/more-than-six-months.csv b/leetcode/unity/more-than-six-months.csv similarity index 100% rename from unity/more-than-six-months.csv rename to leetcode/unity/more-than-six-months.csv diff --git a/unstop/all.csv b/leetcode/unstop/all.csv similarity index 100% rename from unstop/all.csv rename to leetcode/unstop/all.csv diff --git a/unstop/more-than-six-months.csv b/leetcode/unstop/more-than-six-months.csv similarity index 100% rename from unstop/more-than-six-months.csv rename to leetcode/unstop/more-than-six-months.csv diff --git a/upstart/all.csv b/leetcode/upstart/all.csv similarity index 100% rename from upstart/all.csv rename to leetcode/upstart/all.csv diff --git a/upstart/more-than-six-months.csv b/leetcode/upstart/more-than-six-months.csv similarity index 100% rename from upstart/more-than-six-months.csv rename to leetcode/upstart/more-than-six-months.csv diff --git a/upstart/six-months.csv b/leetcode/upstart/six-months.csv similarity index 100% rename from upstart/six-months.csv rename to leetcode/upstart/six-months.csv diff --git a/upstart/three-months.csv b/leetcode/upstart/three-months.csv similarity index 100% rename from upstart/three-months.csv rename to leetcode/upstart/three-months.csv diff --git a/upstox/all.csv b/leetcode/upstox/all.csv similarity index 100% rename from upstox/all.csv rename to leetcode/upstox/all.csv diff --git a/urban-company/all.csv b/leetcode/urban-company/all.csv similarity index 100% rename from urban-company/all.csv rename to leetcode/urban-company/all.csv diff --git a/urban-company/more-than-six-months.csv b/leetcode/urban-company/more-than-six-months.csv similarity index 100% rename from urban-company/more-than-six-months.csv rename to leetcode/urban-company/more-than-six-months.csv diff --git a/usaa/all.csv b/leetcode/usaa/all.csv similarity index 100% rename from usaa/all.csv rename to leetcode/usaa/all.csv diff --git a/usaa/more-than-six-months.csv b/leetcode/usaa/more-than-six-months.csv similarity index 100% rename from usaa/more-than-six-months.csv rename to leetcode/usaa/more-than-six-months.csv diff --git a/ust/all.csv b/leetcode/ust/all.csv similarity index 100% rename from ust/all.csv rename to leetcode/ust/all.csv diff --git a/ust/more-than-six-months.csv b/leetcode/ust/more-than-six-months.csv similarity index 100% rename from ust/more-than-six-months.csv rename to leetcode/ust/more-than-six-months.csv diff --git a/valve/all.csv b/leetcode/valve/all.csv similarity index 100% rename from valve/all.csv rename to leetcode/valve/all.csv diff --git a/valve/more-than-six-months.csv b/leetcode/valve/more-than-six-months.csv similarity index 100% rename from valve/more-than-six-months.csv rename to leetcode/valve/more-than-six-months.csv diff --git a/valve/six-months.csv b/leetcode/valve/six-months.csv similarity index 100% rename from valve/six-months.csv rename to leetcode/valve/six-months.csv diff --git a/vanguard/all.csv b/leetcode/vanguard/all.csv similarity index 100% rename from vanguard/all.csv rename to leetcode/vanguard/all.csv diff --git a/vanguard/more-than-six-months.csv b/leetcode/vanguard/more-than-six-months.csv similarity index 100% rename from vanguard/more-than-six-months.csv rename to leetcode/vanguard/more-than-six-months.csv diff --git a/veeva/all.csv b/leetcode/veeva/all.csv similarity index 100% rename from veeva/all.csv rename to leetcode/veeva/all.csv diff --git a/veeva/more-than-six-months.csv b/leetcode/veeva/more-than-six-months.csv similarity index 100% rename from veeva/more-than-six-months.csv rename to leetcode/veeva/more-than-six-months.csv diff --git a/verily/all.csv b/leetcode/verily/all.csv similarity index 100% rename from verily/all.csv rename to leetcode/verily/all.csv diff --git a/verily/more-than-six-months.csv b/leetcode/verily/more-than-six-months.csv similarity index 100% rename from verily/more-than-six-months.csv rename to leetcode/verily/more-than-six-months.csv diff --git a/verily/six-months.csv b/leetcode/verily/six-months.csv similarity index 100% rename from verily/six-months.csv rename to leetcode/verily/six-months.csv diff --git a/veritas/all.csv b/leetcode/veritas/all.csv similarity index 100% rename from veritas/all.csv rename to leetcode/veritas/all.csv diff --git a/veritas/more-than-six-months.csv b/leetcode/veritas/more-than-six-months.csv similarity index 100% rename from veritas/more-than-six-months.csv rename to leetcode/veritas/more-than-six-months.csv diff --git a/verizon/all.csv b/leetcode/verizon/all.csv similarity index 100% rename from verizon/all.csv rename to leetcode/verizon/all.csv diff --git a/verizon/more-than-six-months.csv b/leetcode/verizon/more-than-six-months.csv similarity index 100% rename from verizon/more-than-six-months.csv rename to leetcode/verizon/more-than-six-months.csv diff --git a/verizon/six-months.csv b/leetcode/verizon/six-months.csv similarity index 100% rename from verizon/six-months.csv rename to leetcode/verizon/six-months.csv diff --git a/verkada/all.csv b/leetcode/verkada/all.csv similarity index 100% rename from verkada/all.csv rename to leetcode/verkada/all.csv diff --git a/verkada/more-than-six-months.csv b/leetcode/verkada/more-than-six-months.csv similarity index 100% rename from verkada/more-than-six-months.csv rename to leetcode/verkada/more-than-six-months.csv diff --git a/verkada/six-months.csv b/leetcode/verkada/six-months.csv similarity index 100% rename from verkada/six-months.csv rename to leetcode/verkada/six-months.csv diff --git a/verkada/three-months.csv b/leetcode/verkada/three-months.csv similarity index 100% rename from verkada/three-months.csv rename to leetcode/verkada/three-months.csv diff --git a/viasat/all.csv b/leetcode/viasat/all.csv similarity index 100% rename from viasat/all.csv rename to leetcode/viasat/all.csv diff --git a/viasat/more-than-six-months.csv b/leetcode/viasat/more-than-six-months.csv similarity index 100% rename from viasat/more-than-six-months.csv rename to leetcode/viasat/more-than-six-months.csv diff --git a/viasat/six-months.csv b/leetcode/viasat/six-months.csv similarity index 100% rename from viasat/six-months.csv rename to leetcode/viasat/six-months.csv diff --git a/vimeo/all.csv b/leetcode/vimeo/all.csv similarity index 100% rename from vimeo/all.csv rename to leetcode/vimeo/all.csv diff --git a/vimeo/more-than-six-months.csv b/leetcode/vimeo/more-than-six-months.csv similarity index 100% rename from vimeo/more-than-six-months.csv rename to leetcode/vimeo/more-than-six-months.csv diff --git a/vimeo/six-months.csv b/leetcode/vimeo/six-months.csv similarity index 100% rename from vimeo/six-months.csv rename to leetcode/vimeo/six-months.csv diff --git a/vimeo/three-months.csv b/leetcode/vimeo/three-months.csv similarity index 100% rename from vimeo/three-months.csv rename to leetcode/vimeo/three-months.csv diff --git a/virtu/all.csv b/leetcode/virtu/all.csv similarity index 100% rename from virtu/all.csv rename to leetcode/virtu/all.csv diff --git a/virtu/more-than-six-months.csv b/leetcode/virtu/more-than-six-months.csv similarity index 100% rename from virtu/more-than-six-months.csv rename to leetcode/virtu/more-than-six-months.csv diff --git a/virtu/six-months.csv b/leetcode/virtu/six-months.csv similarity index 100% rename from virtu/six-months.csv rename to leetcode/virtu/six-months.csv diff --git a/virtu/three-months.csv b/leetcode/virtu/three-months.csv similarity index 100% rename from virtu/three-months.csv rename to leetcode/virtu/three-months.csv diff --git a/virtusa/all.csv b/leetcode/virtusa/all.csv similarity index 100% rename from virtusa/all.csv rename to leetcode/virtusa/all.csv diff --git a/virtusa/more-than-six-months.csv b/leetcode/virtusa/more-than-six-months.csv similarity index 100% rename from virtusa/more-than-six-months.csv rename to leetcode/virtusa/more-than-six-months.csv diff --git a/visa/all.csv b/leetcode/visa/all.csv similarity index 100% rename from visa/all.csv rename to leetcode/visa/all.csv diff --git a/visa/more-than-six-months.csv b/leetcode/visa/more-than-six-months.csv similarity index 100% rename from visa/more-than-six-months.csv rename to leetcode/visa/more-than-six-months.csv diff --git a/visa/six-months.csv b/leetcode/visa/six-months.csv similarity index 100% rename from visa/six-months.csv rename to leetcode/visa/six-months.csv diff --git a/visa/three-months.csv b/leetcode/visa/three-months.csv similarity index 100% rename from visa/three-months.csv rename to leetcode/visa/three-months.csv diff --git a/vk/all.csv b/leetcode/vk/all.csv similarity index 100% rename from vk/all.csv rename to leetcode/vk/all.csv diff --git a/vk/more-than-six-months.csv b/leetcode/vk/more-than-six-months.csv similarity index 100% rename from vk/more-than-six-months.csv rename to leetcode/vk/more-than-six-months.csv diff --git a/vk/six-months.csv b/leetcode/vk/six-months.csv similarity index 100% rename from vk/six-months.csv rename to leetcode/vk/six-months.csv diff --git a/vk/three-months.csv b/leetcode/vk/three-months.csv similarity index 100% rename from vk/three-months.csv rename to leetcode/vk/three-months.csv diff --git a/vmware/all.csv b/leetcode/vmware/all.csv similarity index 100% rename from vmware/all.csv rename to leetcode/vmware/all.csv diff --git a/vmware/more-than-six-months.csv b/leetcode/vmware/more-than-six-months.csv similarity index 100% rename from vmware/more-than-six-months.csv rename to leetcode/vmware/more-than-six-months.csv diff --git a/walmart-labs/all.csv b/leetcode/walmart-labs/all.csv similarity index 100% rename from walmart-labs/all.csv rename to leetcode/walmart-labs/all.csv diff --git a/walmart-labs/more-than-six-months.csv b/leetcode/walmart-labs/more-than-six-months.csv similarity index 100% rename from walmart-labs/more-than-six-months.csv rename to leetcode/walmart-labs/more-than-six-months.csv diff --git a/walmart-labs/six-months.csv b/leetcode/walmart-labs/six-months.csv similarity index 100% rename from walmart-labs/six-months.csv rename to leetcode/walmart-labs/six-months.csv diff --git a/walmart-labs/thirty-days.csv b/leetcode/walmart-labs/thirty-days.csv similarity index 100% rename from walmart-labs/thirty-days.csv rename to leetcode/walmart-labs/thirty-days.csv diff --git a/walmart-labs/three-months.csv b/leetcode/walmart-labs/three-months.csv similarity index 100% rename from walmart-labs/three-months.csv rename to leetcode/walmart-labs/three-months.csv diff --git a/warnermedia/all.csv b/leetcode/warnermedia/all.csv similarity index 100% rename from warnermedia/all.csv rename to leetcode/warnermedia/all.csv diff --git a/warnermedia/more-than-six-months.csv b/leetcode/warnermedia/more-than-six-months.csv similarity index 100% rename from warnermedia/more-than-six-months.csv rename to leetcode/warnermedia/more-than-six-months.csv diff --git a/warnermedia/six-months.csv b/leetcode/warnermedia/six-months.csv similarity index 100% rename from warnermedia/six-months.csv rename to leetcode/warnermedia/six-months.csv diff --git a/warnermedia/three-months.csv b/leetcode/warnermedia/three-months.csv similarity index 100% rename from warnermedia/three-months.csv rename to leetcode/warnermedia/three-months.csv diff --git a/watchguard/all.csv b/leetcode/watchguard/all.csv similarity index 100% rename from watchguard/all.csv rename to leetcode/watchguard/all.csv diff --git a/watchguard/more-than-six-months.csv b/leetcode/watchguard/more-than-six-months.csv similarity index 100% rename from watchguard/more-than-six-months.csv rename to leetcode/watchguard/more-than-six-months.csv diff --git a/wayfair/all.csv b/leetcode/wayfair/all.csv similarity index 100% rename from wayfair/all.csv rename to leetcode/wayfair/all.csv diff --git a/wayfair/more-than-six-months.csv b/leetcode/wayfair/more-than-six-months.csv similarity index 100% rename from wayfair/more-than-six-months.csv rename to leetcode/wayfair/more-than-six-months.csv diff --git a/wayfair/six-months.csv b/leetcode/wayfair/six-months.csv similarity index 100% rename from wayfair/six-months.csv rename to leetcode/wayfair/six-months.csv diff --git a/waymo/all.csv b/leetcode/waymo/all.csv similarity index 100% rename from waymo/all.csv rename to leetcode/waymo/all.csv diff --git a/waymo/more-than-six-months.csv b/leetcode/waymo/more-than-six-months.csv similarity index 100% rename from waymo/more-than-six-months.csv rename to leetcode/waymo/more-than-six-months.csv diff --git a/waymo/six-months.csv b/leetcode/waymo/six-months.csv similarity index 100% rename from waymo/six-months.csv rename to leetcode/waymo/six-months.csv diff --git a/waymo/three-months.csv b/leetcode/waymo/three-months.csv similarity index 100% rename from waymo/three-months.csv rename to leetcode/waymo/three-months.csv diff --git a/wayve/all.csv b/leetcode/wayve/all.csv similarity index 100% rename from wayve/all.csv rename to leetcode/wayve/all.csv diff --git a/wayve/more-than-six-months.csv b/leetcode/wayve/more-than-six-months.csv similarity index 100% rename from wayve/more-than-six-months.csv rename to leetcode/wayve/more-than-six-months.csv diff --git a/wealthfront/all.csv b/leetcode/wealthfront/all.csv similarity index 100% rename from wealthfront/all.csv rename to leetcode/wealthfront/all.csv diff --git a/wealthfront/more-than-six-months.csv b/leetcode/wealthfront/more-than-six-months.csv similarity index 100% rename from wealthfront/more-than-six-months.csv rename to leetcode/wealthfront/more-than-six-months.csv diff --git a/wells-fargo/all.csv b/leetcode/wells-fargo/all.csv similarity index 100% rename from wells-fargo/all.csv rename to leetcode/wells-fargo/all.csv diff --git a/wells-fargo/more-than-six-months.csv b/leetcode/wells-fargo/more-than-six-months.csv similarity index 100% rename from wells-fargo/more-than-six-months.csv rename to leetcode/wells-fargo/more-than-six-months.csv diff --git a/weride/all.csv b/leetcode/weride/all.csv similarity index 100% rename from weride/all.csv rename to leetcode/weride/all.csv diff --git a/weride/more-than-six-months.csv b/leetcode/weride/more-than-six-months.csv similarity index 100% rename from weride/more-than-six-months.csv rename to leetcode/weride/more-than-six-months.csv diff --git a/weride/six-months.csv b/leetcode/weride/six-months.csv similarity index 100% rename from weride/six-months.csv rename to leetcode/weride/six-months.csv diff --git a/weride/three-months.csv b/leetcode/weride/three-months.csv similarity index 100% rename from weride/three-months.csv rename to leetcode/weride/three-months.csv diff --git a/western-digital/all.csv b/leetcode/western-digital/all.csv similarity index 100% rename from western-digital/all.csv rename to leetcode/western-digital/all.csv diff --git a/western-digital/six-months.csv b/leetcode/western-digital/six-months.csv similarity index 100% rename from western-digital/six-months.csv rename to leetcode/western-digital/six-months.csv diff --git a/whatfix/all.csv b/leetcode/whatfix/all.csv similarity index 100% rename from whatfix/all.csv rename to leetcode/whatfix/all.csv diff --git a/whatfix/more-than-six-months.csv b/leetcode/whatfix/more-than-six-months.csv similarity index 100% rename from whatfix/more-than-six-months.csv rename to leetcode/whatfix/more-than-six-months.csv diff --git a/whatnot/all.csv b/leetcode/whatnot/all.csv similarity index 100% rename from whatnot/all.csv rename to leetcode/whatnot/all.csv diff --git a/whatnot/more-than-six-months.csv b/leetcode/whatnot/more-than-six-months.csv similarity index 100% rename from whatnot/more-than-six-months.csv rename to leetcode/whatnot/more-than-six-months.csv diff --git a/whatnot/six-months.csv b/leetcode/whatnot/six-months.csv similarity index 100% rename from whatnot/six-months.csv rename to leetcode/whatnot/six-months.csv diff --git a/whatnot/three-months.csv b/leetcode/whatnot/three-months.csv similarity index 100% rename from whatnot/three-months.csv rename to leetcode/whatnot/three-months.csv diff --git a/winzo/all.csv b/leetcode/winzo/all.csv similarity index 100% rename from winzo/all.csv rename to leetcode/winzo/all.csv diff --git a/winzo/more-than-six-months.csv b/leetcode/winzo/more-than-six-months.csv similarity index 100% rename from winzo/more-than-six-months.csv rename to leetcode/winzo/more-than-six-months.csv diff --git a/wipro/all.csv b/leetcode/wipro/all.csv similarity index 100% rename from wipro/all.csv rename to leetcode/wipro/all.csv diff --git a/wipro/more-than-six-months.csv b/leetcode/wipro/more-than-six-months.csv similarity index 100% rename from wipro/more-than-six-months.csv rename to leetcode/wipro/more-than-six-months.csv diff --git a/wipro/six-months.csv b/leetcode/wipro/six-months.csv similarity index 100% rename from wipro/six-months.csv rename to leetcode/wipro/six-months.csv diff --git a/wipro/three-months.csv b/leetcode/wipro/three-months.csv similarity index 100% rename from wipro/three-months.csv rename to leetcode/wipro/three-months.csv diff --git a/wise/all.csv b/leetcode/wise/all.csv similarity index 100% rename from wise/all.csv rename to leetcode/wise/all.csv diff --git a/wise/more-than-six-months.csv b/leetcode/wise/more-than-six-months.csv similarity index 100% rename from wise/more-than-six-months.csv rename to leetcode/wise/more-than-six-months.csv diff --git a/wish/all.csv b/leetcode/wish/all.csv similarity index 100% rename from wish/all.csv rename to leetcode/wish/all.csv diff --git a/wish/more-than-six-months.csv b/leetcode/wish/more-than-six-months.csv similarity index 100% rename from wish/more-than-six-months.csv rename to leetcode/wish/more-than-six-months.csv diff --git a/wissen/all.csv b/leetcode/wissen/all.csv similarity index 100% rename from wissen/all.csv rename to leetcode/wissen/all.csv diff --git a/wissen/more-than-six-months.csv b/leetcode/wissen/more-than-six-months.csv similarity index 100% rename from wissen/more-than-six-months.csv rename to leetcode/wissen/more-than-six-months.csv diff --git a/wissen/six-months.csv b/leetcode/wissen/six-months.csv similarity index 100% rename from wissen/six-months.csv rename to leetcode/wissen/six-months.csv diff --git a/wissen/three-months.csv b/leetcode/wissen/three-months.csv similarity index 100% rename from wissen/three-months.csv rename to leetcode/wissen/three-months.csv diff --git a/wix/all.csv b/leetcode/wix/all.csv similarity index 100% rename from wix/all.csv rename to leetcode/wix/all.csv diff --git a/wix/more-than-six-months.csv b/leetcode/wix/more-than-six-months.csv similarity index 100% rename from wix/more-than-six-months.csv rename to leetcode/wix/more-than-six-months.csv diff --git a/wix/six-months.csv b/leetcode/wix/six-months.csv similarity index 100% rename from wix/six-months.csv rename to leetcode/wix/six-months.csv diff --git a/wix/three-months.csv b/leetcode/wix/three-months.csv similarity index 100% rename from wix/three-months.csv rename to leetcode/wix/three-months.csv diff --git a/workday/all.csv b/leetcode/workday/all.csv similarity index 100% rename from workday/all.csv rename to leetcode/workday/all.csv diff --git a/workday/more-than-six-months.csv b/leetcode/workday/more-than-six-months.csv similarity index 100% rename from workday/more-than-six-months.csv rename to leetcode/workday/more-than-six-months.csv diff --git a/workday/six-months.csv b/leetcode/workday/six-months.csv similarity index 100% rename from workday/six-months.csv rename to leetcode/workday/six-months.csv diff --git a/workday/three-months.csv b/leetcode/workday/three-months.csv similarity index 100% rename from workday/three-months.csv rename to leetcode/workday/three-months.csv diff --git a/works-applications/all.csv b/leetcode/works-applications/all.csv similarity index 100% rename from works-applications/all.csv rename to leetcode/works-applications/all.csv diff --git a/works-applications/more-than-six-months.csv b/leetcode/works-applications/more-than-six-months.csv similarity index 100% rename from works-applications/more-than-six-months.csv rename to leetcode/works-applications/more-than-six-months.csv diff --git a/worldquant/all.csv b/leetcode/worldquant/all.csv similarity index 100% rename from worldquant/all.csv rename to leetcode/worldquant/all.csv diff --git a/worldquant/more-than-six-months.csv b/leetcode/worldquant/more-than-six-months.csv similarity index 100% rename from worldquant/more-than-six-months.csv rename to leetcode/worldquant/more-than-six-months.csv diff --git a/worldquant/six-months.csv b/leetcode/worldquant/six-months.csv similarity index 100% rename from worldquant/six-months.csv rename to leetcode/worldquant/six-months.csv diff --git a/worldquant/three-months.csv b/leetcode/worldquant/three-months.csv similarity index 100% rename from worldquant/three-months.csv rename to leetcode/worldquant/three-months.csv diff --git a/woven-by-toyota/all.csv b/leetcode/woven-by-toyota/all.csv similarity index 100% rename from woven-by-toyota/all.csv rename to leetcode/woven-by-toyota/all.csv diff --git a/woven-by-toyota/six-months.csv b/leetcode/woven-by-toyota/six-months.csv similarity index 100% rename from woven-by-toyota/six-months.csv rename to leetcode/woven-by-toyota/six-months.csv diff --git a/xiaomi/all.csv b/leetcode/xiaomi/all.csv similarity index 100% rename from xiaomi/all.csv rename to leetcode/xiaomi/all.csv diff --git a/xing/all.csv b/leetcode/xing/all.csv similarity index 100% rename from xing/all.csv rename to leetcode/xing/all.csv diff --git a/xing/more-than-six-months.csv b/leetcode/xing/more-than-six-months.csv similarity index 100% rename from xing/more-than-six-months.csv rename to leetcode/xing/more-than-six-months.csv diff --git a/yahoo/all.csv b/leetcode/yahoo/all.csv similarity index 100% rename from yahoo/all.csv rename to leetcode/yahoo/all.csv diff --git a/yahoo/more-than-six-months.csv b/leetcode/yahoo/more-than-six-months.csv similarity index 100% rename from yahoo/more-than-six-months.csv rename to leetcode/yahoo/more-than-six-months.csv diff --git a/yahoo/six-months.csv b/leetcode/yahoo/six-months.csv similarity index 100% rename from yahoo/six-months.csv rename to leetcode/yahoo/six-months.csv diff --git a/yahoo/three-months.csv b/leetcode/yahoo/three-months.csv similarity index 100% rename from yahoo/three-months.csv rename to leetcode/yahoo/three-months.csv diff --git a/yandex/all.csv b/leetcode/yandex/all.csv similarity index 100% rename from yandex/all.csv rename to leetcode/yandex/all.csv diff --git a/yandex/more-than-six-months.csv b/leetcode/yandex/more-than-six-months.csv similarity index 100% rename from yandex/more-than-six-months.csv rename to leetcode/yandex/more-than-six-months.csv diff --git a/yandex/six-months.csv b/leetcode/yandex/six-months.csv similarity index 100% rename from yandex/six-months.csv rename to leetcode/yandex/six-months.csv diff --git a/yandex/thirty-days.csv b/leetcode/yandex/thirty-days.csv similarity index 100% rename from yandex/thirty-days.csv rename to leetcode/yandex/thirty-days.csv diff --git a/yandex/three-months.csv b/leetcode/yandex/three-months.csv similarity index 100% rename from yandex/three-months.csv rename to leetcode/yandex/three-months.csv diff --git a/yatra/all.csv b/leetcode/yatra/all.csv similarity index 100% rename from yatra/all.csv rename to leetcode/yatra/all.csv diff --git a/yatra/more-than-six-months.csv b/leetcode/yatra/more-than-six-months.csv similarity index 100% rename from yatra/more-than-six-months.csv rename to leetcode/yatra/more-than-six-months.csv diff --git a/yelp/all.csv b/leetcode/yelp/all.csv similarity index 100% rename from yelp/all.csv rename to leetcode/yelp/all.csv diff --git a/yelp/more-than-six-months.csv b/leetcode/yelp/more-than-six-months.csv similarity index 100% rename from yelp/more-than-six-months.csv rename to leetcode/yelp/more-than-six-months.csv diff --git a/yelp/six-months.csv b/leetcode/yelp/six-months.csv similarity index 100% rename from yelp/six-months.csv rename to leetcode/yelp/six-months.csv diff --git a/yelp/three-months.csv b/leetcode/yelp/three-months.csv similarity index 100% rename from yelp/three-months.csv rename to leetcode/yelp/three-months.csv diff --git a/yext/all.csv b/leetcode/yext/all.csv similarity index 100% rename from yext/all.csv rename to leetcode/yext/all.csv diff --git a/yext/more-than-six-months.csv b/leetcode/yext/more-than-six-months.csv similarity index 100% rename from yext/more-than-six-months.csv rename to leetcode/yext/more-than-six-months.csv diff --git a/zalando/all.csv b/leetcode/zalando/all.csv similarity index 100% rename from zalando/all.csv rename to leetcode/zalando/all.csv diff --git a/zalando/more-than-six-months.csv b/leetcode/zalando/more-than-six-months.csv similarity index 100% rename from zalando/more-than-six-months.csv rename to leetcode/zalando/more-than-six-months.csv diff --git a/zappos/all.csv b/leetcode/zappos/all.csv similarity index 100% rename from zappos/all.csv rename to leetcode/zappos/all.csv diff --git a/zappos/more-than-six-months.csv b/leetcode/zappos/more-than-six-months.csv similarity index 100% rename from zappos/more-than-six-months.csv rename to leetcode/zappos/more-than-six-months.csv diff --git a/zemoso/all.csv b/leetcode/zemoso/all.csv similarity index 100% rename from zemoso/all.csv rename to leetcode/zemoso/all.csv diff --git a/zemoso/more-than-six-months.csv b/leetcode/zemoso/more-than-six-months.csv similarity index 100% rename from zemoso/more-than-six-months.csv rename to leetcode/zemoso/more-than-six-months.csv diff --git a/zendesk/all.csv b/leetcode/zendesk/all.csv similarity index 100% rename from zendesk/all.csv rename to leetcode/zendesk/all.csv diff --git a/zendesk/more-than-six-months.csv b/leetcode/zendesk/more-than-six-months.csv similarity index 100% rename from zendesk/more-than-six-months.csv rename to leetcode/zendesk/more-than-six-months.csv diff --git a/zenefits/all.csv b/leetcode/zenefits/all.csv similarity index 100% rename from zenefits/all.csv rename to leetcode/zenefits/all.csv diff --git a/zenefits/more-than-six-months.csv b/leetcode/zenefits/more-than-six-months.csv similarity index 100% rename from zenefits/more-than-six-months.csv rename to leetcode/zenefits/more-than-six-months.csv diff --git a/zepto/all.csv b/leetcode/zepto/all.csv similarity index 100% rename from zepto/all.csv rename to leetcode/zepto/all.csv diff --git a/zepto/more-than-six-months.csv b/leetcode/zepto/more-than-six-months.csv similarity index 100% rename from zepto/more-than-six-months.csv rename to leetcode/zepto/more-than-six-months.csv diff --git a/zepto/six-months.csv b/leetcode/zepto/six-months.csv similarity index 100% rename from zepto/six-months.csv rename to leetcode/zepto/six-months.csv diff --git a/zeta-suite/all.csv b/leetcode/zeta-suite/all.csv similarity index 100% rename from zeta-suite/all.csv rename to leetcode/zeta-suite/all.csv diff --git a/zeta-suite/more-than-six-months.csv b/leetcode/zeta-suite/more-than-six-months.csv similarity index 100% rename from zeta-suite/more-than-six-months.csv rename to leetcode/zeta-suite/more-than-six-months.csv diff --git a/zeta/all.csv b/leetcode/zeta/all.csv similarity index 100% rename from zeta/all.csv rename to leetcode/zeta/all.csv diff --git a/zeta/more-than-six-months.csv b/leetcode/zeta/more-than-six-months.csv similarity index 100% rename from zeta/more-than-six-months.csv rename to leetcode/zeta/more-than-six-months.csv diff --git a/zeta/six-months.csv b/leetcode/zeta/six-months.csv similarity index 100% rename from zeta/six-months.csv rename to leetcode/zeta/six-months.csv diff --git a/zeta/thirty-days.csv b/leetcode/zeta/thirty-days.csv similarity index 100% rename from zeta/thirty-days.csv rename to leetcode/zeta/thirty-days.csv diff --git a/zeta/three-months.csv b/leetcode/zeta/three-months.csv similarity index 100% rename from zeta/three-months.csv rename to leetcode/zeta/three-months.csv diff --git a/zillow/all.csv b/leetcode/zillow/all.csv similarity index 100% rename from zillow/all.csv rename to leetcode/zillow/all.csv diff --git a/zillow/more-than-six-months.csv b/leetcode/zillow/more-than-six-months.csv similarity index 100% rename from zillow/more-than-six-months.csv rename to leetcode/zillow/more-than-six-months.csv diff --git a/zip/all.csv b/leetcode/zip/all.csv similarity index 100% rename from zip/all.csv rename to leetcode/zip/all.csv diff --git a/zip/more-than-six-months.csv b/leetcode/zip/more-than-six-months.csv similarity index 100% rename from zip/more-than-six-months.csv rename to leetcode/zip/more-than-six-months.csv diff --git a/zip/six-months.csv b/leetcode/zip/six-months.csv similarity index 100% rename from zip/six-months.csv rename to leetcode/zip/six-months.csv diff --git a/zip/three-months.csv b/leetcode/zip/three-months.csv similarity index 100% rename from zip/three-months.csv rename to leetcode/zip/three-months.csv diff --git a/ziprecruiter/all.csv b/leetcode/ziprecruiter/all.csv similarity index 100% rename from ziprecruiter/all.csv rename to leetcode/ziprecruiter/all.csv diff --git a/ziprecruiter/more-than-six-months.csv b/leetcode/ziprecruiter/more-than-six-months.csv similarity index 100% rename from ziprecruiter/more-than-six-months.csv rename to leetcode/ziprecruiter/more-than-six-months.csv diff --git a/zluri/all.csv b/leetcode/zluri/all.csv similarity index 100% rename from zluri/all.csv rename to leetcode/zluri/all.csv diff --git a/zluri/more-than-six-months.csv b/leetcode/zluri/more-than-six-months.csv similarity index 100% rename from zluri/more-than-six-months.csv rename to leetcode/zluri/more-than-six-months.csv diff --git a/zoho/all.csv b/leetcode/zoho/all.csv similarity index 100% rename from zoho/all.csv rename to leetcode/zoho/all.csv diff --git a/zoho/more-than-six-months.csv b/leetcode/zoho/more-than-six-months.csv similarity index 100% rename from zoho/more-than-six-months.csv rename to leetcode/zoho/more-than-six-months.csv diff --git a/zoho/six-months.csv b/leetcode/zoho/six-months.csv similarity index 100% rename from zoho/six-months.csv rename to leetcode/zoho/six-months.csv diff --git a/zoho/thirty-days.csv b/leetcode/zoho/thirty-days.csv similarity index 100% rename from zoho/thirty-days.csv rename to leetcode/zoho/thirty-days.csv diff --git a/zoho/three-months.csv b/leetcode/zoho/three-months.csv similarity index 100% rename from zoho/three-months.csv rename to leetcode/zoho/three-months.csv diff --git a/zomato/all.csv b/leetcode/zomato/all.csv similarity index 100% rename from zomato/all.csv rename to leetcode/zomato/all.csv diff --git a/zomato/more-than-six-months.csv b/leetcode/zomato/more-than-six-months.csv similarity index 100% rename from zomato/more-than-six-months.csv rename to leetcode/zomato/more-than-six-months.csv diff --git a/zomato/six-months.csv b/leetcode/zomato/six-months.csv similarity index 100% rename from zomato/six-months.csv rename to leetcode/zomato/six-months.csv diff --git a/zomato/three-months.csv b/leetcode/zomato/three-months.csv similarity index 100% rename from zomato/three-months.csv rename to leetcode/zomato/three-months.csv diff --git a/zoom/all.csv b/leetcode/zoom/all.csv similarity index 100% rename from zoom/all.csv rename to leetcode/zoom/all.csv diff --git a/zoom/more-than-six-months.csv b/leetcode/zoom/more-than-six-months.csv similarity index 100% rename from zoom/more-than-six-months.csv rename to leetcode/zoom/more-than-six-months.csv diff --git a/zoox/all.csv b/leetcode/zoox/all.csv similarity index 100% rename from zoox/all.csv rename to leetcode/zoox/all.csv diff --git a/zoox/more-than-six-months.csv b/leetcode/zoox/more-than-six-months.csv similarity index 100% rename from zoox/more-than-six-months.csv rename to leetcode/zoox/more-than-six-months.csv diff --git a/zoox/six-months.csv b/leetcode/zoox/six-months.csv similarity index 100% rename from zoox/six-months.csv rename to leetcode/zoox/six-months.csv diff --git a/zoox/three-months.csv b/leetcode/zoox/three-months.csv similarity index 100% rename from zoox/three-months.csv rename to leetcode/zoox/three-months.csv diff --git a/zopsmart/all.csv b/leetcode/zopsmart/all.csv similarity index 100% rename from zopsmart/all.csv rename to leetcode/zopsmart/all.csv diff --git a/zopsmart/more-than-six-months.csv b/leetcode/zopsmart/more-than-six-months.csv similarity index 100% rename from zopsmart/more-than-six-months.csv rename to leetcode/zopsmart/more-than-six-months.csv diff --git a/zopsmart/six-months.csv b/leetcode/zopsmart/six-months.csv similarity index 100% rename from zopsmart/six-months.csv rename to leetcode/zopsmart/six-months.csv diff --git a/zopsmart/three-months.csv b/leetcode/zopsmart/three-months.csv similarity index 100% rename from zopsmart/three-months.csv rename to leetcode/zopsmart/three-months.csv diff --git a/zs-associates/all.csv b/leetcode/zs-associates/all.csv similarity index 100% rename from zs-associates/all.csv rename to leetcode/zs-associates/all.csv diff --git a/zs-associates/more-than-six-months.csv b/leetcode/zs-associates/more-than-six-months.csv similarity index 100% rename from zs-associates/more-than-six-months.csv rename to leetcode/zs-associates/more-than-six-months.csv diff --git a/zs-associates/six-months.csv b/leetcode/zs-associates/six-months.csv similarity index 100% rename from zs-associates/six-months.csv rename to leetcode/zs-associates/six-months.csv diff --git a/zs-associates/three-months.csv b/leetcode/zs-associates/three-months.csv similarity index 100% rename from zs-associates/three-months.csv rename to leetcode/zs-associates/three-months.csv diff --git a/zscaler/all.csv b/leetcode/zscaler/all.csv similarity index 100% rename from zscaler/all.csv rename to leetcode/zscaler/all.csv diff --git a/zscaler/more-than-six-months.csv b/leetcode/zscaler/more-than-six-months.csv similarity index 100% rename from zscaler/more-than-six-months.csv rename to leetcode/zscaler/more-than-six-months.csv diff --git a/zscaler/six-months.csv b/leetcode/zscaler/six-months.csv similarity index 100% rename from zscaler/six-months.csv rename to leetcode/zscaler/six-months.csv diff --git a/zscaler/three-months.csv b/leetcode/zscaler/three-months.csv similarity index 100% rename from zscaler/three-months.csv rename to leetcode/zscaler/three-months.csv diff --git a/zynga/all.csv b/leetcode/zynga/all.csv similarity index 100% rename from zynga/all.csv rename to leetcode/zynga/all.csv diff --git a/zynga/more-than-six-months.csv b/leetcode/zynga/more-than-six-months.csv similarity index 100% rename from zynga/more-than-six-months.csv rename to leetcode/zynga/more-than-six-months.csv diff --git a/src/Backend/AppContext.cs b/src/Backend/AppContext.cs new file mode 100644 index 0000000..8d97ddf --- /dev/null +++ b/src/Backend/AppContext.cs @@ -0,0 +1,19 @@ +using Backend.Operations; +using Microsoft.Azure.Cosmos; + +namespace Backend +{ + public class AppContext + { + public readonly Operations.DataProvider dataProvider; + public readonly IConfiguration configuration; + public readonly ILogger logger; + + public AppContext(CosmosClient cosmosClient, IConfiguration configuration, ILogger logger) + { + this.dataProvider = new Operations.DataProvider(cosmosClient, configuration, logger); + this.configuration = configuration; + this.logger = logger; + } + } +} \ No newline at end of file diff --git a/src/Backend/Backend.csproj b/src/Backend/Backend.csproj new file mode 100644 index 0000000..15e787a --- /dev/null +++ b/src/Backend/Backend.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + + diff --git a/src/Backend/Backend.http b/src/Backend/Backend.http new file mode 100644 index 0000000..9033100 --- /dev/null +++ b/src/Backend/Backend.http @@ -0,0 +1,6 @@ +@Backend_HostAddress = http://localhost:5164 + +GET {{Backend_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs new file mode 100644 index 0000000..1ea1c24 --- /dev/null +++ b/src/Backend/Controllers/ProblemsController.cs @@ -0,0 +1,46 @@ +namespace Backend.Controllers +{ + using Backend.Models.Public; + using Backend.Operations; + using Microsoft.AspNetCore.Mvc; + using ProblemPublicModel = Common.Models.Problem; + + [ApiController] + public class ProblemsController : ControllerBase + { + private AppContext appContext; + private readonly ILogger logger; + private readonly IConfiguration configuration; + public ProblemsController(AppContext appContext, ILogger logger, IConfiguration configuration) + { + this.appContext = appContext; + this.logger = logger; + this.configuration = configuration; + } + + [HttpGet] + [Route("problems")] + public async Task> GetProblems( + [FromQuery(Name = QueryParam.Skip)] int skip = 0, + [FromQuery(Name = QueryParam.Limit)] int limit = 50, + [FromQuery(Name = QueryParam.Company)] List? companies = null, + [FromQuery(Name = QueryParam.Difficulty)] List? difficulties = null, + [FromQuery(Name = QueryParam.Tag)] List? tags = null) + { + var filter = new ProblemFilter(skip, limit, companies, difficulties, tags); + var filteredProblems = await appContext.dataProvider.GetProblemsAsync(filter); + return Ok(filteredProblems); + } + + [HttpGet] + [Route("problems/{id}")] + public async Task> GetProblems(string id) + { + if (appContext.dataProvider.problemsCache.TryGetValue(id, out var problem)) + { + return Ok(problem); + } + return NotFound($"Problem {id} not found."); + } + } +} \ No newline at end of file diff --git a/src/Backend/Models/Internal/Problem.cs b/src/Backend/Models/Internal/Problem.cs new file mode 100644 index 0000000..e69de29 diff --git a/src/Backend/Models/Public/Problem.cs b/src/Backend/Models/Public/Problem.cs new file mode 100644 index 0000000..0f6f34b --- /dev/null +++ b/src/Backend/Models/Public/Problem.cs @@ -0,0 +1 @@ +// Using Common.Models.Problem scehma \ No newline at end of file diff --git a/src/Backend/Models/Public/QueryParam.cs b/src/Backend/Models/Public/QueryParam.cs new file mode 100644 index 0000000..340cc74 --- /dev/null +++ b/src/Backend/Models/Public/QueryParam.cs @@ -0,0 +1,11 @@ +namespace Backend.Models.Public +{ + public class QueryParam + { + public const string Skip = "skip"; + public const string Limit = "limit"; + public const string Difficulty = "difficulty"; + public const string Company = "company"; + public const string Tag = "tag"; + } +} \ No newline at end of file diff --git a/src/Backend/Operations/DataProvider.cs b/src/Backend/Operations/DataProvider.cs new file mode 100644 index 0000000..8f22b77 --- /dev/null +++ b/src/Backend/Operations/DataProvider.cs @@ -0,0 +1,71 @@ +namespace Backend.Operations +{ + using Common.Models; + using Microsoft.Azure.Cosmos; + + public class DataProvider + { + private const int RefreshIntervalInHours = 6; + private CosmosClient cosmosClient; + private readonly IConfiguration configuration; + ILogger logger; + private DateTime lastLoadedTime = DateTime.MinValue; + public Dictionary problemsCache { get; private set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public DataProvider(CosmosClient client, IConfiguration configuration, ILogger logger) + { + this.cosmosClient = client; + this.configuration = configuration; + this.logger = logger; + } + + public async Task> GetProblemsAsync(IFilter? filter = null) + { + var allProblems = await GetAllProblemsAsync(); + if (filter != null) + { + return filter.ApplyFilterAsync(allProblems.Values.ToList()); + } + return allProblems.Values.ToList(); + } + + private async Task> GetAllProblemsAsync() + { + if ((DateTime.UtcNow - lastLoadedTime) > TimeSpan.FromHours(RefreshIntervalInHours)) + { + await LoadLatestDataAsync(); + } + return problemsCache; + } + + private async Task LoadLatestDataAsync() + { + try + { + var dbId = configuration.GetValue("ApplicationSettings:CosmosDbDatabaseId"); + var containerId = configuration.GetValue("ApplicationSettings:CosmosDbContainerId"); + var db = cosmosClient.GetDatabase(dbId); + var container = db.GetContainer(containerId); + + var query = "SELECT * FROM c"; + var queryDefinition = new QueryDefinition(query); + var queryResultSetIterator = container.GetItemQueryIterator(queryDefinition); + + List results = new List(); + while (queryResultSetIterator.HasMoreResults) + { + var response = await queryResultSetIterator.ReadNextAsync(); + results.AddRange(response.Select(item => new Problem(item))); + } + + lastLoadedTime = DateTime.UtcNow; + problemsCache = results.ToDictionary(p => p.id, StringComparer.OrdinalIgnoreCase); + this.logger.LogInformation($"Loaded {problemsCache.Count} problems from Cosmos DB at {lastLoadedTime}"); + } + catch (Exception ex) + { + this.logger.LogError($"Error loading data from Cosmos DB. {ex}"); + } + } + } +} \ No newline at end of file diff --git a/src/Backend/Operations/IFilter.cs b/src/Backend/Operations/IFilter.cs new file mode 100644 index 0000000..2a2780a --- /dev/null +++ b/src/Backend/Operations/IFilter.cs @@ -0,0 +1,7 @@ +namespace Backend.Operations +{ + public interface IFilter + { + public List ApplyFilterAsync(List problems); + } +} \ No newline at end of file diff --git a/src/Backend/Operations/ProblemFilter.cs b/src/Backend/Operations/ProblemFilter.cs new file mode 100644 index 0000000..7aa7077 --- /dev/null +++ b/src/Backend/Operations/ProblemFilter.cs @@ -0,0 +1,43 @@ +namespace Backend.Operations +{ + public class ProblemFilter : IFilter + { + private int skip = 0; + private int limit = 50; + private List companies; + private List difficulties; + private List tags; + + public ProblemFilter(int skip, int limit, List? companies, List? difficulties, List? tags) + { + this.skip = skip; + this.limit = Math.Min(limit, 50); + this.companies = companies ?? new List(); + this.difficulties = difficulties ?? new List(); + this.tags = tags ?? new List(); + } + + public List ApplyFilterAsync(List problems) + { + List filteredProblems = problems; + + // TODO: Add tags filtering logic with company + if (companies != null && companies.Count > 0) + { + filteredProblems = filteredProblems.Where( + p => p.companies != null && + p.companies.Keys.Any( + c => this.companies.Contains(c, StringComparer.OrdinalIgnoreCase))).ToList(); + } + + if (difficulties != null && difficulties.Count > 0) + { + filteredProblems = filteredProblems.Where(p => this.difficulties.Contains(p.difficulty)).ToList(); + } + + filteredProblems = filteredProblems.Skip(skip).Take(limit).ToList(); + + return filteredProblems; + } + } +} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs new file mode 100644 index 0000000..082f7f1 --- /dev/null +++ b/src/Backend/Program.cs @@ -0,0 +1,83 @@ +namespace Backend; + +using System.Data; +using Backend.Operations; +using Microsoft.Azure.Cosmos; +using Microsoft.Extensions.Logging.ApplicationInsights; + +public class Program +{ + private static void SetupLogging(ILoggingBuilder logging, IConfiguration configuration) + { + logging.ClearProviders(); + logging.AddApplicationInsights( + configureTelemetryConfiguration: (config) => config.ConnectionString = configuration["ApplicationInsights:ConnectionString"], + configureApplicationInsightsLoggerOptions: (options) => { } + ); + + var appLogLevelSettings = configuration.GetSection("ApplicationInsights"); + var defaultLogLevel = appLogLevelSettings.GetValue("LogLevel:Default", LogLevel.Information); + Console.WriteLine($"Setting log level for Default to {defaultLogLevel}"); + + logging.AddFilter("", defaultLogLevel); + + foreach (var kvp in appLogLevelSettings.GetSection("LogLevel").AsEnumerable()) + { + if (Enum.TryParse(kvp.Value, out var logLevel)) + { + logging.AddFilter(kvp.Key.Split(":").Last(), logLevel); + } + } + } + + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + builder.Services.AddApplicationInsightsTelemetry(); + builder.Services.AddControllers(); + + SetupLogging(builder.Logging, builder.Configuration); + + if (builder.Environment.IsDevelopment()) + { + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + + builder.Logging.AddConsole(); + } + + // Register AppContext as singleton + var config = builder.Configuration; + var cosmosClient = new CosmosClient(config["ApplicationSettings:CosmosDbUri"], config["ApplicationSettings:CosmosDbPrimaryKey"]); + builder.Services.AddSingleton(s => + new AppContext( + cosmosClient, + builder.Configuration, + s.GetRequiredService>() + ) + ); + + var app = builder.Build(); + ILogger logger = app.Logger; + + logger.LogInformation($"Backend started at {DateTime.UtcNow}"); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseHttpsRedirection(); + + app.UseAuthorization(); + + app.MapControllers(); + + app.Run(); + } +} diff --git a/src/Backend/Properties/launchSettings.json b/src/Backend/Properties/launchSettings.json new file mode 100644 index 0000000..fe3de06 --- /dev/null +++ b/src/Backend/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:6270", + "sslPort": 44366 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5164", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7060;http://localhost:5164", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Backend/appsettings.Development.json b/src/Backend/appsettings.Development.json new file mode 100644 index 0000000..ff66ba6 --- /dev/null +++ b/src/Backend/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/Backend/appsettings.json b/src/Backend/appsettings.json new file mode 100644 index 0000000..9ee91c9 --- /dev/null +++ b/src/Backend/appsettings.json @@ -0,0 +1,24 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ApplicationSettings": { + "Name": "leetcode-wrapper", + "Version": "1.0.0", + "CosmosDbUri": "https://lcw-cosmos.documents.azure.com:443/", + "CosmosDbPrimaryKey": "", + "CosmosDbDatabaseId": "LeetCodeWrapper", + "CosmosDbContainerId": "Problems" + }, + "ApplicationInsights": { + "LogLevel": { + "Default": "Trace", + "Microsoft": "Warning" + }, + "ConnectionString": "" + }, + "AllowedHosts": "*" +} diff --git a/src/Common/Common.csproj b/src/Common/Common.csproj new file mode 100644 index 0000000..206b89a --- /dev/null +++ b/src/Common/Common.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/src/Common/Models/Problem.cs b/src/Common/Models/Problem.cs new file mode 100644 index 0000000..27b6f19 --- /dev/null +++ b/src/Common/Models/Problem.cs @@ -0,0 +1,58 @@ +namespace Common.Models +{ + public enum Difficulty + { + Unknown = 0, + Easy = 1, + Medium = 2, + Hard = 3 + } + + public class TagName + { + public static string FileName = "filename"; + public static string FolderName = "foldername"; + }; + + public class Problem + { + public Problem() { } + public Problem(Problem ps) + { + this.id = ps.id; + this.title = ps.title; + this.url = ps.url; + this.difficulty = ps.difficulty; + this.acceptance = ps.acceptance; + this.frequency = ps.frequency; + this.companies = new Dictionary>(ps.companies); + this.metadata = new Dictionary(ps.metadata); + } + + public Problem(ProblemSchema ps) + { + this.id = ps.id; + this.title = ps.title; + this.url = ps.url; + this.difficulty = ps.difficulty; + this.acceptance = ps.acceptance; + this.frequency = ps.frequency; + this.companies = ps.companyList.ToDictionary(kv => kv.Key, kv => kv.Value.ToList(), StringComparer.OrdinalIgnoreCase); + this.metadata = ps.metadataList.ToDictionary(kv => kv.Key, kv => kv.Value, StringComparer.OrdinalIgnoreCase); + } + + public string id { get; set; } = string.Empty; + public string title { get; set; } = string.Empty; + public string url { get; set; } = string.Empty; + public Difficulty difficulty { get; set; } = Difficulty.Unknown; + public double acceptance { get; set; } = 0.0; + public double frequency { get; set; } = 0; + public Dictionary> companies { get; set; } = new Dictionary>(StringComparer.OrdinalIgnoreCase); + public Dictionary metadata { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public override string ToString() + { + return $"{id}: {title} ({difficulty}) | companies: {string.Join(", ", companies.Keys)} | metadata: {string.Join(", ", metadata.Select(kv => $"{kv.Key}={kv.Value}"))}"; + } + } +} diff --git a/src/Common/Models/ProblemSchema.cs b/src/Common/Models/ProblemSchema.cs new file mode 100644 index 0000000..edbc20d --- /dev/null +++ b/src/Common/Models/ProblemSchema.cs @@ -0,0 +1,44 @@ +namespace Common.Models +{ + public class ProblemSchema + { + public ProblemSchema() { } + public ProblemSchema(ProblemSchema ps) + { + this.id = ps.id; + this.title = ps.title; + this.url = ps.url; + this.difficulty = ps.difficulty; + this.acceptance = ps.acceptance; + this.frequency = ps.frequency; + this.companyList = new List>>(); + this.metadataList = new List>(); + } + + public ProblemSchema(Problem p) + { + this.id = p.id; + this.title = p.title; + this.url = p.url; + this.difficulty = p.difficulty; + this.acceptance = p.acceptance; + this.frequency = p.frequency; + this.companyList = p.companies.Select(kv => new KeyValuePair>(kv.Key, kv.Value.ToList())).ToList(); + this.metadataList = p.metadata.Select(kv => new KeyValuePair(kv.Key, kv.Value)).ToList(); + } + + public string id { get; set; } = string.Empty; + public string title { get; set; } = string.Empty; + public string url { get; set; } = string.Empty; + public Difficulty difficulty { get; set; } = Difficulty.Unknown; + public double acceptance { get; set; } = 0.0; + public double frequency { get; set; } = 0; + public List>> companyList { get; set; } = new List>>(); + public List> metadataList { get; set; } = new List>(); + + public override string ToString() + { + return $"{id}: {title} ({difficulty}) | companies: {string.Join(", ", companyList.Select(c => c.Key))} | metadata: {string.Join(", ", metadataList.Select(kv => $"{kv.Key}={kv.Value}"))}"; + } + } +} diff --git a/src/Common/Program.cs b/src/Common/Program.cs new file mode 100644 index 0000000..3095376 --- /dev/null +++ b/src/Common/Program.cs @@ -0,0 +1,9 @@ +namespace Common; + +public class Program +{ + static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + } +} diff --git a/src/Synchronizer/Helper.cs b/src/Synchronizer/Helper.cs new file mode 100644 index 0000000..2fb87b2 --- /dev/null +++ b/src/Synchronizer/Helper.cs @@ -0,0 +1,49 @@ +using Synchronizer; + +internal class Helper +{ + public static List GetCsvFileNames(string rootDir) + { + var csvFiles = Directory.GetFiles(rootDir, "*.csv", SearchOption.AllDirectories); + return csvFiles.ToList(); + } + + public static List ReadProblemsFromCsv(string filePath) + { + var problems = new List(); + var lines = File.ReadAllLines(filePath); + var relPath = filePath.Split("leetcode/").Last(); + + foreach (var line in lines.Skip(1)) // Skip header + { + var parts = line.Split(','); + + // ID,URL,Title,Difficulty,Acceptance %,Frequency % + if (parts.Length < 5) + { + Console.WriteLine($"[{relPath}] Skipping malformed line: {line}"); + continue; + } + + var problem = new Common.Models.Problem + { + id = parts[0], + url = parts[1], + title = parts[2], + difficulty = Enum.TryParse(parts[3], true, out var diff) ? diff : Common.Models.Difficulty.Unknown, + acceptance = double.TryParse(parts[4].TrimEnd('%'), out var acc) ? acc : 0.0, + frequency = double.TryParse(parts[5].TrimEnd('%'), out var freq) ? freq : 0.0, + metadata = new Dictionary() + }; + + problem.metadata[Common.Models.TagName.FolderName] = relPath.Split('/').First(); + problem.metadata[Common.Models.TagName.FileName] = relPath.Split('/').Last().Split('.').First(); + + // Additional metadata can be parsed here if available + problems.Add(problem); + } + + return problems; + } + +} \ No newline at end of file diff --git a/src/Synchronizer/ProblemsProcessor.cs b/src/Synchronizer/ProblemsProcessor.cs new file mode 100644 index 0000000..db86026 --- /dev/null +++ b/src/Synchronizer/ProblemsProcessor.cs @@ -0,0 +1,106 @@ +using Microsoft.Azure.Cosmos; +using Common.Models; + +namespace Synchronizer; + +public class ProblemsProcessor +{ + private string rootDir; + private CosmosClient cosmosClient; + private DateTime ScrappedDate = new DateTime(2025, 7, 1); + private Dictionary TagsToReplace = + new Dictionary { { "more-than-six-months", "one-year" } }; + + public ProblemsProcessor(string rootDir, CosmosClient client) + { + this.rootDir = rootDir; + this.cosmosClient = client; + } + + public async Task Run() + { + var files = Helper.GetCsvFileNames(rootDir); + + Dictionary allProblems = new Dictionary(); + HashSet recentTags = new HashSet(StringComparer.OrdinalIgnoreCase); + + foreach (var file in files) + { + var problems = Helper.ReadProblemsFromCsv(file); + foreach (var problem in problems) + { + var companyName = problem.metadata[TagName.FolderName]; + var recent = problem.metadata[TagName.FileName]; + if (TagsToReplace.Keys.Contains(recent, StringComparer.OrdinalIgnoreCase)) + { + recent = TagsToReplace[recent.ToLower()]; + } + recentTags.Add(recent); + problem.metadata.Clear(); + + if (!allProblems.ContainsKey(problem.id)) + { + allProblems[problem.id] = new Problem(problem); + allProblems[problem.id].metadata["scrapped_date"] = ScrappedDate.ToString("yyyy-MM-dd"); + if (!allProblems[problem.id].companies.ContainsKey(companyName)) + { + allProblems[problem.id].companies[companyName] = new List(); + } + allProblems[problem.id].companies[companyName].Add(recent); + } + else + { + if (!allProblems[problem.id].companies.ContainsKey(companyName)) + { + allProblems[problem.id].companies[companyName] = new List(); + } + allProblems[problem.id].companies[companyName].Add(recent); + } + } + + } + // Implementation for processing problems + Console.WriteLine($"Total unique problems found: {allProblems.Count}"); + Console.WriteLine($"Recent tags found: {string.Join(", ", recentTags)}"); + + // var sampleProblems = allProblems.Values.Take(Math.Min(5, allProblems.Count)).ToList(); + // foreach (var prob in sampleProblems) Console.WriteLine(prob.ToString()); + + var db = cosmosClient.GetDatabase(ComosDbSettings.DatabaseId); + var container = db.GetContainer(ComosDbSettings.ContainerId); + + var problemsToUpsert = allProblems.Values.ToList(); + + var batchSize = 50; + for (int start = 0; start < problemsToUpsert.Count; start += batchSize) + { + var batch = problemsToUpsert.Skip(start).Take(batchSize).ToList(); + Console.WriteLine($"Upserting batch of {batch.Count} problems... | start: {start}"); + await UpsertProblems(container, batch); + await Task.Delay(TimeSpan.FromSeconds(1)); // To avoid overwhelming the Cosmos DB with requests + } + + } + + private async Task UpsertProblems(Container container, List problems) + { + var tasks = new List>>(); + var problemIds = new List(); + foreach (var problem in problems) + { + try + { + problemIds.Add(problem.id); + tasks.Add(container.UpsertItemAsync(new ProblemSchema(problem))); + await Task.Delay(TimeSpan.FromMilliseconds(10)); // To avoid overwhelming the Cosmos DB with requests + } + catch (Exception ex) + { + Console.WriteLine($"Error upserting problem {problem.id}: {ex.Message}"); + } + } + + await Task.WhenAll(tasks); + Console.WriteLine($"Upserted {tasks.Count} problems. {string.Join(", ", problemIds)}"); + } +} \ No newline at end of file diff --git a/src/Synchronizer/Program.cs b/src/Synchronizer/Program.cs new file mode 100644 index 0000000..046ba2d --- /dev/null +++ b/src/Synchronizer/Program.cs @@ -0,0 +1,83 @@ +namespace Synchronizer; + +using Microsoft.Azure.Cosmos; +using ProblemSchema = Common.Models.Problem; + +internal class Program +{ + private static bool SetupDb(CosmosClient client) + { + try + { + client.CreateDatabaseIfNotExistsAsync(ComosDbSettings.DatabaseId).GetAwaiter().GetResult(); + var db = client.GetDatabase(ComosDbSettings.DatabaseId); + db.CreateContainerIfNotExistsAsync(ComosDbSettings.ContainerId, partitionKeyPath: "/id").GetAwaiter().GetResult(); + var container = db.GetContainer(ComosDbSettings.ContainerId); + } + catch (Exception ex) + { + Console.WriteLine(ex); + return false; + } + return true; + } + + static void Test(CosmosClient client) + { + var db = client.GetDatabase(ComosDbSettings.DatabaseId); + var container = db.GetContainer(ComosDbSettings.ContainerId); + + var res = container.UpsertItemAsync(new ProblemSchema + { + id = "1", + title = "Two Sum", + url = "https://leetcode.com/problems/two-sum/", + difficulty = Common.Models.Difficulty.Easy, + companies = new Dictionary> { {"Google", new List{"6-month"}} }, + acceptance = 78.5, + metadata = new Dictionary + { + { "tag", "array" }, + { "frequency", "high" } + } + }).GetAwaiter().GetResult(); + + var res2 = container.UpsertItemAsync(new ProblemSchema + { + id = "2", + title = "Three Sum", + url = "https://leetcode.com/problems/two-sum/", + difficulty = Common.Models.Difficulty.Easy, + companies = new Dictionary> { {"Meta", new List{"3-month"}} }, + metadata = new Dictionary + { + { "tag", "array" }, + { "frequency", "high" } + } + }).GetAwaiter().GetResult(); + } + + public static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + + CosmosClient client = new CosmosClient(ComosDbSettings.Uri, ComosDbSettings.PrimaryKey); + + SetupDb(client); + // Test(client); + + string rootDir = args.Length > 0 ? args[0] : throw new ArgumentException("Root directory argument is required"); + var processor = new ProblemsProcessor(rootDir, client); + processor.Run().GetAwaiter().GetResult(); + + Console.WriteLine("Bye bye"); + } +} + +public class ComosDbSettings +{ + public static string Uri { get; } = "https://lcw-cosmos.documents.azure.com:443/"; + public static string DatabaseId { get; } = "LeetCodeWrapper"; + public static string ContainerId { get; } = "Problems"; + public static string PrimaryKey { get; } = ""; +} diff --git a/src/Synchronizer/Synchronizer.csproj b/src/Synchronizer/Synchronizer.csproj new file mode 100644 index 0000000..72a2484 --- /dev/null +++ b/src/Synchronizer/Synchronizer.csproj @@ -0,0 +1,20 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + From 89538b1d10824bc924d569f7caee5a23b8fb6e2e Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 4 Oct 2025 21:50:55 +0530 Subject: [PATCH 02/30] Updated controller to refresh in another task --- src/Backend/Controllers/ProblemsController.cs | 10 ++- src/Backend/Operations/DataProvider.cs | 81 ++++++++++++++----- 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index 1ea1c24..caf93e1 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -18,6 +18,13 @@ public ProblemsController(AppContext appContext, ILogger log this.configuration = configuration; } + [HttpGet] + [Route("")] + public ActionResult GetHome() + { + return Ok("Leetcode Wrapper Backend is running."); + } + [HttpGet] [Route("problems")] public async Task> GetProblems( @@ -36,7 +43,8 @@ public async Task> GetProblems( [Route("problems/{id}")] public async Task> GetProblems(string id) { - if (appContext.dataProvider.problemsCache.TryGetValue(id, out var problem)) + var problem = await appContext.dataProvider.GetProblemByIdAsync(id); + if (problem != null) { return Ok(problem); } diff --git a/src/Backend/Operations/DataProvider.cs b/src/Backend/Operations/DataProvider.cs index 8f22b77..56c22e1 100644 --- a/src/Backend/Operations/DataProvider.cs +++ b/src/Backend/Operations/DataProvider.cs @@ -5,18 +5,20 @@ namespace Backend.Operations public class DataProvider { - private const int RefreshIntervalInHours = 6; + private const int RefreshIntervalInHours = 3; private CosmosClient cosmosClient; private readonly IConfiguration configuration; ILogger logger; private DateTime lastLoadedTime = DateTime.MinValue; - public Dictionary problemsCache { get; private set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + private Task backgroundRefreshTask; + private Dictionary problemsCache = new Dictionary(StringComparer.OrdinalIgnoreCase); public DataProvider(CosmosClient client, IConfiguration configuration, ILogger logger) { this.cosmosClient = client; this.configuration = configuration; this.logger = logger; + this.backgroundRefreshTask = Task.Run(() => this.StartBackgroundRefreshAsync(CancellationToken.None)); } public async Task> GetProblemsAsync(IFilter? filter = null) @@ -28,43 +30,80 @@ public async Task> GetProblemsAsync(IFilter? filter = null) } return allProblems.Values.ToList(); } + + public async Task GetProblemByIdAsync(string id) + { + var allProblems = await GetAllProblemsAsync(); + if (allProblems.TryGetValue(id, out var problem)) + { + return problem; + } + return null; + } private async Task> GetAllProblemsAsync() { - if ((DateTime.UtcNow - lastLoadedTime) > TimeSpan.FromHours(RefreshIntervalInHours)) + if (problemsCache.Count == 0) { await LoadLatestDataAsync(); + if (problemsCache.Count == 0) + { + this.logger.LogWarning("No problems found in the cache after loading data."); + } } return problemsCache; } private async Task LoadLatestDataAsync() { - try + int maxRetries = 3; + for(int i = 0; i < maxRetries; i++) { - var dbId = configuration.GetValue("ApplicationSettings:CosmosDbDatabaseId"); - var containerId = configuration.GetValue("ApplicationSettings:CosmosDbContainerId"); - var db = cosmosClient.GetDatabase(dbId); - var container = db.GetContainer(containerId); + try + { + var dbId = configuration.GetValue("ApplicationSettings:CosmosDbDatabaseId"); + var containerId = configuration.GetValue("ApplicationSettings:CosmosDbContainerId"); + var db = cosmosClient.GetDatabase(dbId); + var container = db.GetContainer(containerId); + + var query = "SELECT * FROM c"; + var queryDefinition = new QueryDefinition(query); + var queryResultSetIterator = container.GetItemQueryIterator(queryDefinition); - var query = "SELECT * FROM c"; - var queryDefinition = new QueryDefinition(query); - var queryResultSetIterator = container.GetItemQueryIterator(queryDefinition); + List results = new List(); + while (queryResultSetIterator.HasMoreResults) + { + var response = await queryResultSetIterator.ReadNextAsync(); + results.AddRange(response.Select(item => new Problem(item))); + } - List results = new List(); - while (queryResultSetIterator.HasMoreResults) + lastLoadedTime = DateTime.UtcNow; + problemsCache = results.ToDictionary(p => p.id, StringComparer.OrdinalIgnoreCase); + this.logger.LogInformation($"Loaded {problemsCache.Count} problems from Cosmos DB at {lastLoadedTime}"); + break; + } + catch (Exception ex) { - var response = await queryResultSetIterator.ReadNextAsync(); - results.AddRange(response.Select(item => new Problem(item))); + this.logger.LogError($"Error loading data from Cosmos DB. {ex}"); + await Task.Delay(TimeSpan.FromSeconds(2 * (i + 1))); } - - lastLoadedTime = DateTime.UtcNow; - problemsCache = results.ToDictionary(p => p.id, StringComparer.OrdinalIgnoreCase); - this.logger.LogInformation($"Loaded {problemsCache.Count} problems from Cosmos DB at {lastLoadedTime}"); } - catch (Exception ex) + } + + public async Task StartBackgroundRefreshAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) { - this.logger.LogError($"Error loading data from Cosmos DB. {ex}"); + try + { + await LoadLatestDataAsync(); + } + catch (Exception ex) + { + this.logger.LogError($"Error during background data refresh: {ex}"); + } + + await Task.Delay(TimeSpan.FromHours(RefreshIntervalInHours), cancellationToken); } } } From 73732af9d214589dd68a6f5b1d867d253762721c Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 11 Oct 2025 11:10:33 +0530 Subject: [PATCH 03/30] Configure Program.cs with necessary middleware and services and Update ProblemsController to handle problem retrieval and filtering --- src/Backend/Controllers/ProblemsController.cs | 6 +++--- src/Backend/Program.cs | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index caf93e1..666ec93 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -6,6 +6,7 @@ namespace Backend.Controllers using ProblemPublicModel = Common.Models.Problem; [ApiController] + [Route("api/[controller]")] public class ProblemsController : ControllerBase { private AppContext appContext; @@ -19,15 +20,14 @@ public ProblemsController(AppContext appContext, ILogger log } [HttpGet] - [Route("")] + [Route("~/api/home")] public ActionResult GetHome() { return Ok("Leetcode Wrapper Backend is running."); } [HttpGet] - [Route("problems")] - public async Task> GetProblems( + public async Task>> GetProblems( [FromQuery(Name = QueryParam.Skip)] int skip = 0, [FromQuery(Name = QueryParam.Limit)] int limit = 50, [FromQuery(Name = QueryParam.Company)] List? companies = null, diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 082f7f1..7583545 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -38,6 +38,16 @@ public static void Main(string[] args) builder.Services.AddApplicationInsightsTelemetry(); builder.Services.AddControllers(); + // Add CORS + builder.Services.AddCors(options => + { + options.AddPolicy("AllowReactApp", + builder => builder + .WithOrigins("http://localhost:3000") + .AllowAnyMethod() + .AllowAnyHeader()); + }); + SetupLogging(builder.Logging, builder.Configuration); if (builder.Environment.IsDevelopment()) @@ -72,7 +82,11 @@ public static void Main(string[] args) app.UseSwaggerUI(); } - app.UseHttpsRedirection(); + // Commenting out HTTPS redirection to allow HTTP + // app.UseHttpsRedirection(); + + // Use CORS before other middleware + app.UseCors("AllowReactApp"); app.UseAuthorization(); From 8e5f391793e0056ea8893fa85116de4cf39388d9 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 11 Oct 2025 11:36:27 +0530 Subject: [PATCH 04/30] Added Client side code --- src/client/.gitignore | 23 + src/client/README.md | 70 + src/client/package-lock.json | 17555 ++++++++++++++++ src/client/package.json | 39 + src/client/public/favicon.ico | Bin 0 -> 3870 bytes src/client/public/index.html | 43 + src/client/public/logo192.png | Bin 0 -> 5347 bytes src/client/public/logo512.png | Bin 0 -> 9664 bytes src/client/public/manifest.json | 25 + src/client/public/robots.txt | 3 + src/client/src/App.css | 38 + src/client/src/App.js | 12 + .../src/components/filters/FilterOptions.js | 107 + src/client/src/components/layout/Body.js | 34 + src/client/src/components/layout/Footer.js | 14 + src/client/src/components/layout/Header.js | 14 + src/client/src/components/layout/Main.js | 73 + src/client/src/components/layout/Nav.js | 19 + .../src/components/problems/ProblemCard.js | 95 + .../src/components/problems/ProblemGrid.js | 58 + src/client/src/constants/difficulty.js | 37 + src/client/src/index.css | 13 + src/client/src/index.js | 12 + src/client/src/services/api.js | 17 + .../src/styles/components/FilterOptions.css | 72 + .../src/styles/components/ProblemCard.css | 96 + .../src/styles/components/ProblemGrid.css | 21 + src/client/src/styles/layout/Body.css | 49 + src/client/src/styles/layout/Footer.css | 19 + src/client/src/styles/layout/Header.css | 22 + src/client/src/styles/layout/Main.css | 7 + src/client/src/styles/layout/Nav.css | 11 + 32 files changed, 18598 insertions(+) create mode 100644 src/client/.gitignore create mode 100644 src/client/README.md create mode 100644 src/client/package-lock.json create mode 100644 src/client/package.json create mode 100644 src/client/public/favicon.ico create mode 100644 src/client/public/index.html create mode 100644 src/client/public/logo192.png create mode 100644 src/client/public/logo512.png create mode 100644 src/client/public/manifest.json create mode 100644 src/client/public/robots.txt create mode 100644 src/client/src/App.css create mode 100644 src/client/src/App.js create mode 100644 src/client/src/components/filters/FilterOptions.js create mode 100644 src/client/src/components/layout/Body.js create mode 100644 src/client/src/components/layout/Footer.js create mode 100644 src/client/src/components/layout/Header.js create mode 100644 src/client/src/components/layout/Main.js create mode 100644 src/client/src/components/layout/Nav.js create mode 100644 src/client/src/components/problems/ProblemCard.js create mode 100644 src/client/src/components/problems/ProblemGrid.js create mode 100644 src/client/src/constants/difficulty.js create mode 100644 src/client/src/index.css create mode 100644 src/client/src/index.js create mode 100644 src/client/src/services/api.js create mode 100644 src/client/src/styles/components/FilterOptions.css create mode 100644 src/client/src/styles/components/ProblemCard.css create mode 100644 src/client/src/styles/components/ProblemGrid.css create mode 100644 src/client/src/styles/layout/Body.css create mode 100644 src/client/src/styles/layout/Footer.css create mode 100644 src/client/src/styles/layout/Header.css create mode 100644 src/client/src/styles/layout/Main.css create mode 100644 src/client/src/styles/layout/Nav.css diff --git a/src/client/.gitignore b/src/client/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/src/client/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/src/client/README.md b/src/client/README.md new file mode 100644 index 0000000..58beeac --- /dev/null +++ b/src/client/README.md @@ -0,0 +1,70 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in your browser. + +The page will reload when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can't go back!** + +If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. + +You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `npm run build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/src/client/package-lock.json b/src/client/package-lock.json new file mode 100644 index 0000000..eec90f1 --- /dev/null +++ b/src/client/package-lock.json @@ -0,0 +1,17555 @@ +{ + "name": "client", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.1.0", + "dependencies": { + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^13.5.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.13.0.tgz", + "integrity": "sha512-2ih5qGw5SZJ+2fLZxP6Lr6Na2NTIgPRL/7Kmyuw0uIyBQnuhQ8fi8fzUTd38eIQmqp+GYLC00cI6WgtqHxBwmw==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", + "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", + "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", + "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001748", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", + "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.230", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.230.tgz", + "integrity": "sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.102.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", + "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.2.3", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/client/package.json b/src/client/package.json new file mode 100644 index 0000000..06aa1a6 --- /dev/null +++ b/src/client/package.json @@ -0,0 +1,39 @@ +{ + "name": "client", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^13.5.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/src/client/public/favicon.ico b/src/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/src/client/public/index.html b/src/client/public/index.html new file mode 100644 index 0000000..aa069f2 --- /dev/null +++ b/src/client/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/src/client/public/logo192.png b/src/client/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/src/client/public/manifest.json b/src/client/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/src/client/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/src/client/public/robots.txt b/src/client/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/src/client/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/client/src/App.css b/src/client/src/App.css new file mode 100644 index 0000000..74b5e05 --- /dev/null +++ b/src/client/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/src/client/src/App.js b/src/client/src/App.js new file mode 100644 index 0000000..3d6c436 --- /dev/null +++ b/src/client/src/App.js @@ -0,0 +1,12 @@ +import "./App.css"; +import Main from "./components/layout/Main"; + +function App() { + return ( +
+
+
+ ); +} + +export default App; diff --git a/src/client/src/components/filters/FilterOptions.js b/src/client/src/components/filters/FilterOptions.js new file mode 100644 index 0000000..4861723 --- /dev/null +++ b/src/client/src/components/filters/FilterOptions.js @@ -0,0 +1,107 @@ +import React from "react"; +import { DifficultyLevel } from "../../constants/difficulty"; +import "../../styles/components/FilterOptions.css"; + +const TIME_PERIODS = [ + { value: "thirty-days", label: "Last 30 Days" }, + { value: "three-months", label: "Last 3 Months" }, + { value: "six-months", label: "Last 6 Months" }, + { value: "one-year", label: "Last Year" }, + { value: "all", label: "All Time" }, +]; + +const DIFFICULTIES = [ + { value: DifficultyLevel.EASY, label: "Easy" }, + { value: DifficultyLevel.MEDIUM, label: "Medium" }, + { value: DifficultyLevel.HARD, label: "Hard" }, +]; + +const FilterOptions = ({ currentFilters, onFilterChange, companies = [] }) => { + const handleCompanyChange = (e) => { + onFilterChange({ ...currentFilters, company: e.target.value }); + }; + + const handleTimePeriodChange = (e) => { + onFilterChange({ ...currentFilters, timePeriod: e.target.value }); + }; + + const handleDifficultyChange = (e) => { + onFilterChange({ ...currentFilters, difficulty: e.target.value }); + }; + + const handleClearFilters = () => { + onFilterChange({ + company: "", + timePeriod: "", + difficulty: "", + }); + }; + + + return ( +
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ ); +}; + +export default FilterOptions; diff --git a/src/client/src/components/layout/Body.js b/src/client/src/components/layout/Body.js new file mode 100644 index 0000000..249e4c0 --- /dev/null +++ b/src/client/src/components/layout/Body.js @@ -0,0 +1,34 @@ +import React from "react"; +import ProblemGrid from "../problems/ProblemGrid"; +import "../../styles/layout/Body.css"; + +const Body = ({ problems, loading, error, filters }) => { + if (loading) { + return ( +
+
Loading problems...
+
+ ); + } + + if (error) { + return ( +
+
+ {error} + +
+
+ ); + } + + return ( +
+
+ +
+
+ ); +}; + +export default Body; diff --git a/src/client/src/components/layout/Footer.js b/src/client/src/components/layout/Footer.js new file mode 100644 index 0000000..1f46ddf --- /dev/null +++ b/src/client/src/components/layout/Footer.js @@ -0,0 +1,14 @@ +import React from "react"; +import "../../styles/layout/Footer.css"; + +const Footer = () => { + return ( +
+
+

Created by Shadow Lord

+
+
+ ); +}; + +export default Footer; diff --git a/src/client/src/components/layout/Header.js b/src/client/src/components/layout/Header.js new file mode 100644 index 0000000..fcdfe21 --- /dev/null +++ b/src/client/src/components/layout/Header.js @@ -0,0 +1,14 @@ +import React from "react"; +import "../../styles/layout/Header.css"; + +const Header = () => { + return ( +
+
+

LeetCode Problem Tracker

+
+
+ ); +}; + +export default Header; diff --git a/src/client/src/components/layout/Main.js b/src/client/src/components/layout/Main.js new file mode 100644 index 0000000..429a4e3 --- /dev/null +++ b/src/client/src/components/layout/Main.js @@ -0,0 +1,73 @@ +import React, { useState, useEffect, useMemo } from "react"; +import { fetchProblems } from "../../services/api"; +import Header from "./Header"; +import Nav from "./Nav"; +import Body from "./Body"; +import Footer from "./Footer"; +import "../../styles/layout/Main.css"; + +const Main = () => { + const [problems, setProblems] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [filters, setFilters] = useState({ + company: "", + timePeriod: "", + difficulty: "", + }); + + useEffect(() => { + const loadProblems = async () => { + setLoading(true); + try { + const data = await fetchProblems(); + setProblems(data); + setError(null); + } catch (err) { + setError("Failed to fetch problems. Please try again later."); + setProblems([]); + } finally { + setLoading(false); + } + }; + + loadProblems(); + }, []); + + // Extract unique company names from problems + const companies = useMemo(() => { + const companySet = new Set(); + problems.forEach((problem) => { + if (problem.companies) { + Object.keys(problem.companies).forEach((company) => + companySet.add(company) + ); + } + }); + return Array.from(companySet).sort(); + }, [problems]); + + const handleFilterChange = (newFilters) => { + setFilters(newFilters); + }; + + return ( +
+
+
+ ); +}; + +export default Main; diff --git a/src/client/src/components/layout/Nav.js b/src/client/src/components/layout/Nav.js new file mode 100644 index 0000000..a8aa9f8 --- /dev/null +++ b/src/client/src/components/layout/Nav.js @@ -0,0 +1,19 @@ +import React from "react"; +import FilterOptions from "../filters/FilterOptions"; +import "../../styles/layout/Nav.css"; + +const Nav = ({ filters, onFilterChange, companies }) => { + return ( + + ); +}; + +export default Nav; diff --git a/src/client/src/components/problems/ProblemCard.js b/src/client/src/components/problems/ProblemCard.js new file mode 100644 index 0000000..ff81d28 --- /dev/null +++ b/src/client/src/components/problems/ProblemCard.js @@ -0,0 +1,95 @@ +import React from "react"; +import { + getDifficultyText, + getDifficultyClass, +} from "../../constants/difficulty"; +import "../../styles/components/ProblemCard.css"; + +const TIME_PERIOD_LABELS = { + "thirty-days": "Last 30 Days", + "three-months": "Last 3 Months", + "six-months": "Last 6 Months", + "one-year": "Last Year", + all: "All Time", +}; + +const ProblemCard = ({ problem }) => { + const difficultyText = getDifficultyText(problem.difficulty); + const difficultyClass = getDifficultyClass(problem.difficulty); + + const getTopCompanies = (companies) => { + if (!companies) return []; + + return Object.entries(companies) + .map(([name, periods]) => ({ + name, + timePeriods: periods.sort((a, b) => { + const order = [ + "thirty-days", + "three-months", + "six-months", + "one-year", + "all", + ]; + return order.indexOf(a) - order.indexOf(b); + }), + })) + .slice(0, 5); + }; + + const topCompanies = getTopCompanies(problem.companies); + + return ( +
+ ); +}; + +export default ProblemCard; diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js new file mode 100644 index 0000000..5de0095 --- /dev/null +++ b/src/client/src/components/problems/ProblemGrid.js @@ -0,0 +1,58 @@ +import React, { useMemo } from "react"; +import ProblemCard from "./ProblemCard"; +import "../../styles/components/ProblemGrid.css"; + +const ProblemGrid = ({ problems, filters }) => { + const filteredProblems = useMemo(() => { + if (!filters.company && !filters.timePeriod && !filters.difficulty) { + return problems; + } + + return problems.filter((problem) => { + // Company filter + if ( + filters.company && + (!problem.companies || !problem.companies[filters.company]) + ) { + return false; + } + + // Time period filter - only apply if both company and time period are selected + if (filters.company && filters.timePeriod) { + if ( + !problem.companies?.[filters.company]?.includes(filters.timePeriod) + ) { + return false; + } + } + + // Difficulty filter + if ( + filters.difficulty && + problem.difficulty !== Number(filters.difficulty) + ) { + return false; + } + + return true; + }); + }, [problems, filters]); + + if (filteredProblems.length === 0) { + return ( +
+

No problems found matching your criteria.

+
+ ); + } + + return ( +
+ {filteredProblems.map((problem) => ( + + ))} +
+ ); +}; + +export default ProblemGrid; diff --git a/src/client/src/constants/difficulty.js b/src/client/src/constants/difficulty.js new file mode 100644 index 0000000..986731f --- /dev/null +++ b/src/client/src/constants/difficulty.js @@ -0,0 +1,37 @@ +/** + * Enum for LeetCode problem difficulty levels + * @readonly + * @enum {number} + */ +export const DifficultyLevel = { + EASY: 1, + MEDIUM: 2, + HARD: 3, +}; + +/** + * Configuration for difficulty levels including display text and styling + * @readonly + * @type {Object.} + */ +export const DifficultyConfig = { + [DifficultyLevel.EASY]: { text: "Easy", className: "easy" }, + [DifficultyLevel.MEDIUM]: { text: "Medium", className: "medium" }, + [DifficultyLevel.HARD]: { text: "Hard", className: "hard" }, +}; + +/** + * Get the display text for a difficulty level + * @param {DifficultyLevel} level + * @returns {string} + */ +export const getDifficultyText = (level) => + DifficultyConfig[level]?.text ?? "Unknown"; + +/** + * Get the CSS class name for a difficulty level + * @param {DifficultyLevel} level + * @returns {string} + */ +export const getDifficultyClass = (level) => + DifficultyConfig[level]?.className ?? ""; diff --git a/src/client/src/index.css b/src/client/src/index.css new file mode 100644 index 0000000..ec2585e --- /dev/null +++ b/src/client/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/src/client/src/index.js b/src/client/src/index.js new file mode 100644 index 0000000..24c23ee --- /dev/null +++ b/src/client/src/index.js @@ -0,0 +1,12 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; + + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); \ No newline at end of file diff --git a/src/client/src/services/api.js b/src/client/src/services/api.js new file mode 100644 index 0000000..b790b2e --- /dev/null +++ b/src/client/src/services/api.js @@ -0,0 +1,17 @@ +const API_BASE_URL = "http://localhost:5164"; + +export const fetchProblems = async () => { + const response = await fetch(`${API_BASE_URL}/api/problems`); + if (!response.ok) { + throw new Error(`Network response was not ok: ${response.status}`); + } + return await response.json(); +}; + +export const getProblemById = async (id) => { + const response = await fetch(`${API_BASE_URL}/api/problems/${id}`); + if (!response.ok) { + throw new Error(`Failed to fetch problem #${id}`); + } + return await response.json(); +}; diff --git a/src/client/src/styles/components/FilterOptions.css b/src/client/src/styles/components/FilterOptions.css new file mode 100644 index 0000000..0a17f25 --- /dev/null +++ b/src/client/src/styles/components/FilterOptions.css @@ -0,0 +1,72 @@ +.filter-options { + display: flex; + gap: 1.5rem; + align-items: flex-end; + flex-wrap: wrap; + padding: 1rem 0; +} + +.filter-group { + display: flex; + flex-direction: column; + gap: 0.5rem; + min-width: 200px; +} + +.filter-group label { + font-size: 0.9rem; + color: #666; + font-weight: 500; +} + +.filter-group select { + padding: 0.5rem; + border: 1px solid #ddd; + border-radius: 4px; + background-color: white; + font-size: 0.9rem; + color: #333; +} + +.filter-group select:disabled { + background-color: #f5f5f5; + cursor: not-allowed; +} + +.clear-filters { + padding: 0.5rem 1rem; + background-color: #dc3545; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 0.9rem; + height: fit-content; +} + +.clear-filters:hover { + background-color: #c82333; +} + +.clear-filters:disabled { + background-color: #f5f5f5; + color: #999; + cursor: not-allowed; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .filter-options { + flex-direction: column; + gap: 1rem; + } + + .filter-group { + width: 100%; + min-width: unset; + } + + .clear-filters { + width: 100%; + } +} \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemCard.css b/src/client/src/styles/components/ProblemCard.css new file mode 100644 index 0000000..c3f30b5 --- /dev/null +++ b/src/client/src/styles/components/ProblemCard.css @@ -0,0 +1,96 @@ +.problem-card { + background: white; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + padding: 1.5rem; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.problem-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); +} + +.problem-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1rem; +} + +.problem-header h3 { + margin: 0; + font-size: 1.1rem; + flex: 1; + padding-right: 1rem; +} + +.problem-header a { + color: #1a1a1a; + text-decoration: none; +} + +.problem-header a:hover { + color: #0066cc; +} + +.difficulty { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.85rem; + font-weight: 500; +} + +.difficulty.easy { + background-color: #e7f6e7; + color: #2cbb5d; +} + +.difficulty.medium { + background-color: #fff7e6; + color: #ffa116; +} + +.difficulty.hard { + background-color: #ffe6e6; + color: #ff375f; +} + +.problem-stats { + display: flex; + gap: 1rem; + margin-bottom: 1rem; + font-size: 0.9rem; + color: #666; +} + +.problem-companies { + border-top: 1px solid #eee; + padding-top: 1rem; +} + +.problem-companies small { + display: block; + margin-bottom: 0.5rem; + color: #666; +} + +.company-tags { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.company-tag { + background: #f5f5f5; + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.85rem; + display: flex; + align-items: center; + gap: 0.25rem; +} + +.recent-indicator { + font-size: 0.8rem; +} \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemGrid.css b/src/client/src/styles/components/ProblemGrid.css new file mode 100644 index 0000000..ec54e5d --- /dev/null +++ b/src/client/src/styles/components/ProblemGrid.css @@ -0,0 +1,21 @@ +.problem-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1.5rem; + padding: 1rem 0; +} + +.no-problems { + text-align: center; + padding: 2rem; + background: white; + border-radius: 8px; + color: #666; +} + +/* Responsive adjustments */ +@media (max-width: 640px) { + .problem-grid { + grid-template-columns: 1fr; + } +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Body.css b/src/client/src/styles/layout/Body.css new file mode 100644 index 0000000..7824269 --- /dev/null +++ b/src/client/src/styles/layout/Body.css @@ -0,0 +1,49 @@ +.body { + flex: 1; + padding: 2rem 0; + background-color: #f5f5f5; +} + +.body-content { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; +} + +.loading { + display: flex; + justify-content: center; + align-items: center; + min-height: 400px; +} + +.loading-spinner { + color: #666; + font-size: 1.2rem; +} + +.error { + display: flex; + justify-content: center; + align-items: center; + min-height: 400px; +} + +.error-message { + color: #dc3545; + text-align: center; +} + +.error-message button { + margin-top: 1rem; + padding: 0.5rem 1rem; + background-color: #dc3545; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; +} + +.error-message button:hover { + background-color: #c82333; +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Footer.css b/src/client/src/styles/layout/Footer.css new file mode 100644 index 0000000..aa1159f --- /dev/null +++ b/src/client/src/styles/layout/Footer.css @@ -0,0 +1,19 @@ +.footer { + background-color: #1a1a1a; + color: white; + padding: 1rem 0; + margin-top: auto; +} + +.footer-content { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; + text-align: center; +} + +.footer p { + margin: 0; + font-size: 0.9rem; + opacity: 0.8; +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Header.css b/src/client/src/styles/layout/Header.css new file mode 100644 index 0000000..6648f4d --- /dev/null +++ b/src/client/src/styles/layout/Header.css @@ -0,0 +1,22 @@ +.header { + width: 100%; + background-color: #1a1a1a; + color: white; + padding: 1rem 0; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.header-content { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; + display: flex; + align-items: center; + justify-content: center; +} + +.header h1 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Main.css b/src/client/src/styles/layout/Main.css new file mode 100644 index 0000000..e6049f9 --- /dev/null +++ b/src/client/src/styles/layout/Main.css @@ -0,0 +1,7 @@ +.main-container { + display: flex; + flex-direction: column; + min-height: 100vh; + width: 100%; + background-color: #f5f5f5; +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Nav.css b/src/client/src/styles/layout/Nav.css new file mode 100644 index 0000000..8905e40 --- /dev/null +++ b/src/client/src/styles/layout/Nav.css @@ -0,0 +1,11 @@ +.nav { + background-color: white; + border-bottom: 1px solid #e0e0e0; + padding: 1rem 0; +} + +.nav-content { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; +} \ No newline at end of file From 316f30adf9c26025b9e340b020f12765dea6ab33 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 11 Oct 2025 14:03:51 +0530 Subject: [PATCH 05/30] Added single problem page and docker basics --- build-image.zsh | 2 + dockerfile | 23 ++++ leetcode-wrapper.sln | 36 ------ run-image.zsh | 1 + src/Backend/Controllers/ProblemsController.cs | 5 +- src/client/package-lock.json | 54 ++++++++ src/client/package.json | 1 + src/client/src/App.css | 116 ++++++++++++++++++ src/client/src/App.js | 9 +- .../src/components/problems/ProblemPage.js | 116 ++++++++++++++++++ src/client/src/services/api.js | 6 +- src/lcw.sln | 62 ++++++++++ 12 files changed, 389 insertions(+), 42 deletions(-) create mode 100755 build-image.zsh create mode 100644 dockerfile delete mode 100644 leetcode-wrapper.sln create mode 100644 run-image.zsh create mode 100644 src/client/src/components/problems/ProblemPage.js create mode 100644 src/lcw.sln diff --git a/build-image.zsh b/build-image.zsh new file mode 100755 index 0000000..bfcb925 --- /dev/null +++ b/build-image.zsh @@ -0,0 +1,2 @@ +VERSION="latest" +docker build -t lcw-backend:$VERSION -f dockerfile . \ No newline at end of file diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..9f2efda --- /dev/null +++ b/dockerfile @@ -0,0 +1,23 @@ +# Use official .NET 8 SDK image for build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /src + +# Copy everything else and build +COPY ./src ./ +WORKDIR /src +RUN dotnet restore + +WORKDIR /src/Backend +RUN dotnet build + +# Expose ports (change as needed) +EXPOSE 80 +EXPOSE 443 +EXPOSE 5164 + +# Set environment variables for production +# ENV ASPNETCORE_URLS="http://+:80;https://+:443" +ENV ASPNETCORE_ENVIRONMENT=Development + +# Start the application +ENTRYPOINT ["dotnet", "run", "--profile", "container"] \ No newline at end of file diff --git a/leetcode-wrapper.sln b/leetcode-wrapper.sln deleted file mode 100644 index 356a8cc..0000000 --- a/leetcode-wrapper.sln +++ /dev/null @@ -1,36 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.2.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "src\Backend\Backend.csproj", "{1A54C3FC-900B-AAEA-3502-101EF4241700}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Synchronizer", "src\Synchronizer\Synchronizer.csproj", "{ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1A54C3FC-900B-AAEA-3502-101EF4241700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A54C3FC-900B-AAEA-3502-101EF4241700}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1A54C3FC-900B-AAEA-3502-101EF4241700}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A54C3FC-900B-AAEA-3502-101EF4241700}.Release|Any CPU.Build.0 = Release|Any CPU - {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {1A54C3FC-900B-AAEA-3502-101EF4241700} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {ADE52CDE-A526-A6CD-B4DA-BE4136905D1F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {4616E715-EE81-4855-918C-DC915A5305C3} - EndGlobalSection -EndGlobal diff --git a/run-image.zsh b/run-image.zsh new file mode 100644 index 0000000..cb2e523 --- /dev/null +++ b/run-image.zsh @@ -0,0 +1 @@ +docker run -p 80:80 -p 443:443 -p 5164:5164 lcw-backend -e ASPNETCORE_ENVIRONMENT=Development -d \ No newline at end of file diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index 666ec93..7803a9c 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -6,7 +6,7 @@ namespace Backend.Controllers using ProblemPublicModel = Common.Models.Problem; [ApiController] - [Route("api/[controller]")] + [Route("api")] public class ProblemsController : ControllerBase { private AppContext appContext; @@ -20,13 +20,14 @@ public ProblemsController(AppContext appContext, ILogger log } [HttpGet] - [Route("~/api/home")] + [Route("")] public ActionResult GetHome() { return Ok("Leetcode Wrapper Backend is running."); } [HttpGet] + [Route("problems")] public async Task>> GetProblems( [FromQuery(Name = QueryParam.Skip)] int skip = 0, [FromQuery(Name = QueryParam.Limit)] int limit = 50, diff --git a/src/client/package-lock.json b/src/client/package-lock.json index eec90f1..569a8a5 100644 --- a/src/client/package-lock.json +++ b/src/client/package-lock.json @@ -14,6 +14,7 @@ "@testing-library/user-event": "^13.5.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-router-dom": "^7.9.4", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" } @@ -13884,6 +13885,53 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz", + "integrity": "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.4.tgz", + "integrity": "sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.4" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -14778,6 +14826,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", diff --git a/src/client/package.json b/src/client/package.json index 06aa1a6..cd3200d 100644 --- a/src/client/package.json +++ b/src/client/package.json @@ -9,6 +9,7 @@ "@testing-library/user-event": "^13.5.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-router-dom": "^7.9.4", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, diff --git a/src/client/src/App.css b/src/client/src/App.css index 74b5e05..064292a 100644 --- a/src/client/src/App.css +++ b/src/client/src/App.css @@ -36,3 +36,119 @@ transform: rotate(360deg); } } + +/* LeetCode-like styling for ProblemPage */ +.lcw-problem-page { + max-width: 800px; + margin: 32px auto; + background: #fff; + border-radius: 12px; + box-shadow: 0 2px 16px rgba(0,0,0,0.08); + padding: 32px; + font-family: 'Segoe UI', 'Roboto', 'Arial', sans-serif; +} + +.lcw-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 18px; +} + +.lcw-link { + color: #ffa116; + text-decoration: none; + font-weight: 500; + border-bottom: 1px dashed #ffa116; + transition: border-bottom 0.2s; +} +.lcw-link:hover { + border-bottom: 2px solid #ffa116; +} + +.lcw-meta { + display: flex; + gap: 18px; + margin-bottom: 24px; + font-size: 16px; +} + +.lcw-meta-item { + color: #555; +} + +.lcw-difficulty { + padding: 4px 12px; + border-radius: 8px; + font-weight: bold; + color: #fff; +} +.lcw-difficulty-easy { + background: #43a047; +} +.lcw-difficulty-medium { + background: #ffa116; +} +.lcw-difficulty-hard { + background: #d32f2f; +} +.lcw-difficulty-unknown { + background: #888; +} + +.lcw-section-title { + margin-top: 32px; + margin-bottom: 12px; + font-size: 20px; + color: #222; + font-weight: 600; +} + +.lcw-table { + width: 100%; + border-collapse: collapse; + margin-bottom: 24px; + background: #fafbfc; + border-radius: 8px; + overflow: hidden; +} + +.lcw-table th, .lcw-table td { + padding: 12px 10px; + border-bottom: 1px solid #eee; + text-align: left; +} + +.lcw-table th { + background: #f6f8fa; + font-weight: 600; + color: #333; +} + +.lcw-tag { + display: inline-block; + background: #e3e6ea; + color: #444; + padding: 4px 10px; + border-radius: 6px; + font-size: 14px; + font-weight: 500; +} + +.lcw-company { + display: inline-block; + background: #f5f5f5; + color: #222; + margin: 2px 6px 2px 0; + padding: 4px 10px; + border-radius: 6px; + font-size: 14px; + border: 1px solid #eee; +} + +.lcw-loading, .lcw-error { + text-align: center; + margin-top: 40px; + font-size: 18px; + color: #d32f2f; +} \ No newline at end of file diff --git a/src/client/src/App.js b/src/client/src/App.js index 3d6c436..4e81d85 100644 --- a/src/client/src/App.js +++ b/src/client/src/App.js @@ -1,10 +1,17 @@ import "./App.css"; +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import Main from "./components/layout/Main"; +import ProblemPage from "./components/problems/ProblemPage"; function App() { return (
-
+ + + } /> + } /> + +
); } diff --git a/src/client/src/components/problems/ProblemPage.js b/src/client/src/components/problems/ProblemPage.js new file mode 100644 index 0000000..fd0fa56 --- /dev/null +++ b/src/client/src/components/problems/ProblemPage.js @@ -0,0 +1,116 @@ +import React, { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import { getProblemById } from "../../services/api"; + +const tagOrder = ["thirty-days", "three-months", "six-months", "one-year", "all"]; + +const ProblemPage = () => { + const { id } = useParams(); + const [problem, setProblem] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(""); + const [tagMap, setTagMap] = useState({}); + + useEffect(() => { + const fetchProblem = async () => { + try { + const response = await getProblemById(id); + setProblem(response); + setTagMap(groupCompaniesByTag(response.companies)); + } catch (err) { + setError("Problem not found or failed to fetch."); + } finally { + setLoading(false); + } + }; + fetchProblem(); + }, [id]); + + if (loading) return
Loading...
; + if (error) return
{error}
; + if (!problem) return
No problem found
; + + return ( +
+
+

{problem.title}

+ + View on LeetCode + +
+
+ + {difficultyLabel(problem.difficulty)} + + + Acceptance: {problem.acceptance}% + + + Frequency: {problem.frequency}% + + + ID: {problem.id} + +
+

Companies by Tag

+ + + + + + + + + {tagOrder + .filter(tag => tagMap[tag]) + .map(tag => ( + + + + + ))} + +
TagCompanies
+ {tag} + + {tagMap[tag].map(company => ( + + {company} + + ))} +
+
+ ); +}; + +function groupCompaniesByTag(companies) { + const tagMap = {}; + Object.entries(companies).forEach(([company, tags]) => { + tags.forEach(tag => { + if (!tagMap[tag]) tagMap[tag] = []; + tagMap[tag].push(company); + }); + }); + return tagMap; +} + +function difficultyLabel(diff) { + if (diff === 1) return "Easy"; + if (diff === 2) return "Medium"; + if (diff === 3) return "Hard"; + return "Unknown"; +} + +function difficultyClass(diff) { + if (diff === 1) return "easy"; + if (diff === 2) return "medium"; + if (diff === 3) return "hard"; + return "unknown"; +} + +export default ProblemPage; \ No newline at end of file diff --git a/src/client/src/services/api.js b/src/client/src/services/api.js index b790b2e..3f4137e 100644 --- a/src/client/src/services/api.js +++ b/src/client/src/services/api.js @@ -1,7 +1,7 @@ -const API_BASE_URL = "http://localhost:5164"; +const API_BASE_URL = "http://localhost:5164/api"; export const fetchProblems = async () => { - const response = await fetch(`${API_BASE_URL}/api/problems`); + const response = await fetch(`${API_BASE_URL}/problems`); if (!response.ok) { throw new Error(`Network response was not ok: ${response.status}`); } @@ -9,7 +9,7 @@ export const fetchProblems = async () => { }; export const getProblemById = async (id) => { - const response = await fetch(`${API_BASE_URL}/api/problems/${id}`); + const response = await fetch(`${API_BASE_URL}/problems/${id}`); if (!response.ok) { throw new Error(`Failed to fetch problem #${id}`); } diff --git a/src/lcw.sln b/src/lcw.sln new file mode 100644 index 0000000..ec43a01 --- /dev/null +++ b/src/lcw.sln @@ -0,0 +1,62 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{D9C22474-6B6F-48CC-88BC-308CAB16BB57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "Backend\Backend.csproj", "{D80E9786-FF6D-4227-B4F4-F3B3960A7843}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Synchronizer", "Synchronizer\Synchronizer.csproj", "{BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}" +EndProject +Global + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Debug|x64.ActiveCfg = Debug|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Debug|x64.Build.0 = Debug|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Debug|x86.ActiveCfg = Debug|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Debug|x86.Build.0 = Debug|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Release|Any CPU.Build.0 = Release|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Release|x64.ActiveCfg = Release|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Release|x64.Build.0 = Release|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Release|x86.ActiveCfg = Release|Any CPU + {D9C22474-6B6F-48CC-88BC-308CAB16BB57}.Release|x86.Build.0 = Release|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Debug|x64.ActiveCfg = Debug|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Debug|x64.Build.0 = Debug|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Debug|x86.ActiveCfg = Debug|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Debug|x86.Build.0 = Debug|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Release|Any CPU.Build.0 = Release|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Release|x64.ActiveCfg = Release|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Release|x64.Build.0 = Release|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Release|x86.ActiveCfg = Release|Any CPU + {D80E9786-FF6D-4227-B4F4-F3B3960A7843}.Release|x86.Build.0 = Release|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Debug|x64.Build.0 = Debug|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Debug|x86.Build.0 = Debug|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|Any CPU.Build.0 = Release|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x64.ActiveCfg = Release|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x64.Build.0 = Release|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x86.ActiveCfg = Release|Any CPU + {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal From 1a4d7e851c8cd2a81f9f23172dd0a6c25e50785f Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 11 Oct 2025 16:19:57 +0530 Subject: [PATCH 06/30] Fixing Links and Updated CSS --- src/client/src/App.css | 116 -------- src/client/src/App.js | 4 + src/client/src/components/layout/Header.js | 5 +- src/client/src/components/layout/Main.js | 4 - .../src/components/problems/ProblemCard.js | 5 +- .../src/components/problems/ProblemPage.js | 1 + .../src/styles/components/FilterOptions.css | 166 +++++++++-- .../src/styles/components/ProblemCard.css | 245 +++++++++++++--- .../src/styles/components/ProblemPage.css | 271 ++++++++++++++++++ src/client/src/styles/layout/Footer.css | 55 +++- src/client/src/styles/layout/Header.css | 217 +++++++++++++- 11 files changed, 890 insertions(+), 199 deletions(-) create mode 100644 src/client/src/styles/components/ProblemPage.css diff --git a/src/client/src/App.css b/src/client/src/App.css index 064292a..74b5e05 100644 --- a/src/client/src/App.css +++ b/src/client/src/App.css @@ -36,119 +36,3 @@ transform: rotate(360deg); } } - -/* LeetCode-like styling for ProblemPage */ -.lcw-problem-page { - max-width: 800px; - margin: 32px auto; - background: #fff; - border-radius: 12px; - box-shadow: 0 2px 16px rgba(0,0,0,0.08); - padding: 32px; - font-family: 'Segoe UI', 'Roboto', 'Arial', sans-serif; -} - -.lcw-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 18px; -} - -.lcw-link { - color: #ffa116; - text-decoration: none; - font-weight: 500; - border-bottom: 1px dashed #ffa116; - transition: border-bottom 0.2s; -} -.lcw-link:hover { - border-bottom: 2px solid #ffa116; -} - -.lcw-meta { - display: flex; - gap: 18px; - margin-bottom: 24px; - font-size: 16px; -} - -.lcw-meta-item { - color: #555; -} - -.lcw-difficulty { - padding: 4px 12px; - border-radius: 8px; - font-weight: bold; - color: #fff; -} -.lcw-difficulty-easy { - background: #43a047; -} -.lcw-difficulty-medium { - background: #ffa116; -} -.lcw-difficulty-hard { - background: #d32f2f; -} -.lcw-difficulty-unknown { - background: #888; -} - -.lcw-section-title { - margin-top: 32px; - margin-bottom: 12px; - font-size: 20px; - color: #222; - font-weight: 600; -} - -.lcw-table { - width: 100%; - border-collapse: collapse; - margin-bottom: 24px; - background: #fafbfc; - border-radius: 8px; - overflow: hidden; -} - -.lcw-table th, .lcw-table td { - padding: 12px 10px; - border-bottom: 1px solid #eee; - text-align: left; -} - -.lcw-table th { - background: #f6f8fa; - font-weight: 600; - color: #333; -} - -.lcw-tag { - display: inline-block; - background: #e3e6ea; - color: #444; - padding: 4px 10px; - border-radius: 6px; - font-size: 14px; - font-weight: 500; -} - -.lcw-company { - display: inline-block; - background: #f5f5f5; - color: #222; - margin: 2px 6px 2px 0; - padding: 4px 10px; - border-radius: 6px; - font-size: 14px; - border: 1px solid #eee; -} - -.lcw-loading, .lcw-error { - text-align: center; - margin-top: 40px; - font-size: 18px; - color: #d32f2f; -} \ No newline at end of file diff --git a/src/client/src/App.js b/src/client/src/App.js index 4e81d85..10f3213 100644 --- a/src/client/src/App.js +++ b/src/client/src/App.js @@ -2,15 +2,19 @@ import "./App.css"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import Main from "./components/layout/Main"; import ProblemPage from "./components/problems/ProblemPage"; +import Header from "./components/layout/Header"; +import Footer from "./components/layout/Footer"; function App() { return (
+
} /> } /> +
); diff --git a/src/client/src/components/layout/Header.js b/src/client/src/components/layout/Header.js index fcdfe21..7fc2f69 100644 --- a/src/client/src/components/layout/Header.js +++ b/src/client/src/components/layout/Header.js @@ -1,11 +1,14 @@ import React from "react"; import "../../styles/layout/Header.css"; +import { Link } from "react-router-dom"; const Header = () => { return (
-

LeetCode Problem Tracker

+ +

LeetCode Problem Tracker

+
); diff --git a/src/client/src/components/layout/Main.js b/src/client/src/components/layout/Main.js index 429a4e3..a493e2d 100644 --- a/src/client/src/components/layout/Main.js +++ b/src/client/src/components/layout/Main.js @@ -1,9 +1,7 @@ import React, { useState, useEffect, useMemo } from "react"; import { fetchProblems } from "../../services/api"; -import Header from "./Header"; import Nav from "./Nav"; import Body from "./Body"; -import Footer from "./Footer"; import "../../styles/layout/Main.css"; const Main = () => { @@ -53,7 +51,6 @@ const Main = () => { return (
-
); }; diff --git a/src/client/src/components/problems/ProblemCard.js b/src/client/src/components/problems/ProblemCard.js index ff81d28..d715b53 100644 --- a/src/client/src/components/problems/ProblemCard.js +++ b/src/client/src/components/problems/ProblemCard.js @@ -4,6 +4,7 @@ import { getDifficultyClass, } from "../../constants/difficulty"; import "../../styles/components/ProblemCard.css"; +import { Link } from "react-router-dom"; const TIME_PERIOD_LABELS = { "thirty-days": "Last 30 Days", @@ -43,9 +44,7 @@ const ProblemCard = ({ problem }) => {

- - {problem.title} - + {problem.title}

{difficultyText} diff --git a/src/client/src/components/problems/ProblemPage.js b/src/client/src/components/problems/ProblemPage.js index fd0fa56..7d4ccbd 100644 --- a/src/client/src/components/problems/ProblemPage.js +++ b/src/client/src/components/problems/ProblemPage.js @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; import { getProblemById } from "../../services/api"; +import "../../styles/components/ProblemPage.css"; const tagOrder = ["thirty-days", "three-months", "six-months", "one-year", "all"]; diff --git a/src/client/src/styles/components/FilterOptions.css b/src/client/src/styles/components/FilterOptions.css index 0a17f25..a5ff42d 100644 --- a/src/client/src/styles/components/FilterOptions.css +++ b/src/client/src/styles/components/FilterOptions.css @@ -1,72 +1,180 @@ .filter-options { display: flex; - gap: 1.5rem; + gap: 2rem; align-items: flex-end; flex-wrap: wrap; - padding: 1rem 0; + padding: 1.5rem 0; + position: relative; + z-index: 10; } .filter-group { display: flex; flex-direction: column; - gap: 0.5rem; - min-width: 200px; + gap: 0.75rem; + min-width: 220px; + position: relative; + z-index: 1000; /* Ensure high z-index for dropdown */ } .filter-group label { - font-size: 0.9rem; - color: #666; - font-weight: 500; + font-size: 0.85rem; + color: #4a5568; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; } .filter-group select { - padding: 0.5rem; - border: 1px solid #ddd; - border-radius: 4px; + padding: 0.75rem 1rem; + border: 2px solid #e2e8f0; + border-radius: 10px; background-color: white; - font-size: 0.9rem; - color: #333; + font-size: 0.95rem; + color: #2d3748; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%234a5568'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 1rem center; + background-size: 1rem; + padding-right: 2.5rem; + font-weight: 500; + position: relative; + z-index: 1001; /* Higher z-index for the select element */ +} + +/* Ensure dropdown options are visible */ +.filter-group select option { + background: white; + color: #2d3748; + padding: 12px 16px; + font-size: 0.95rem; + border-bottom: 1px solid #f1f5f9; + position: relative; + z-index: 10000; /* Very high z-index for options */ +} + +.filter-group select option:hover { + background-color: #f0f7ff; + color: #0066cc; +} + +.filter-group select option:checked { + background-color: #0066cc; + color: white; +} + +.filter-group select:focus { + outline: none; + border-color: #0066cc; + box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1); + background-color: white; + z-index: 1002; /* Even higher when focused */ +} + +/* Style the dropdown container */ +.filter-group select { + z-index: 1001; +} + +/* Ensure the dropdown appears above other elements */ +.filter-group { + position: relative; +} + +/* Fix for dropdown visibility */ +select { + position: relative; } -.filter-group select:disabled { - background-color: #f5f5f5; - cursor: not-allowed; +/* Additional styles to ensure dropdown visibility */ +.filter-options * { + box-sizing: border-box; } +/* Company dropdown specific fixes */ +#company { + min-height: 48px; + max-height: 200px; /* Limit height if needed */ +} + +/* Ensure the nav has proper z-index */ +.nav { + background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); + border-bottom: 1px solid #e2e8f0; + padding: 0; + box-shadow: 0 2px 20px rgba(0, 0, 0, 0.06); + position: relative; + z-index: 100; +} + +.nav-content { + max-width: 1200px; + margin: 0 auto; + padding: 0 1.5rem; + position: relative; + z-index: 101; +} + +/* Clear filters button */ .clear-filters { - padding: 0.5rem 1rem; - background-color: #dc3545; + padding: 0.75rem 1.5rem; + background: linear-gradient(135deg, #dc3545, #c82333); color: white; border: none; - border-radius: 4px; + border-radius: 10px; cursor: pointer; font-size: 0.9rem; + font-weight: 600; height: fit-content; -} - -.clear-filters:hover { - background-color: #c82333; -} - -.clear-filters:disabled { - background-color: #f5f5f5; - color: #999; - cursor: not-allowed; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + text-transform: uppercase; + letter-spacing: 0.5px; + box-shadow: 0 2px 8px rgba(220, 53, 69, 0.3); + position: relative; + z-index: 100; } /* Responsive adjustments */ @media (max-width: 768px) { .filter-options { flex-direction: column; - gap: 1rem; + gap: 1.25rem; + padding: 1.25rem 0; + z-index: 1000; } .filter-group { width: 100%; min-width: unset; + z-index: 1001; + } + + .filter-group select { + width: 100%; + z-index: 1002; } .clear-filters { width: 100%; + margin-top: 0.5rem; + z-index: 100; } +} + +/* Emergency fix - if dropdown still doesn't show */ +.filter-group select { + transform: translateZ(0); /* Force hardware acceleration */ +} + +/* Alternative: Increase the size of the dropdown */ +.filter-group select { + min-height: 48px; +} + +/* Make sure the dropdown has enough space */ +.filter-group { + margin-bottom: 0; } \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemCard.css b/src/client/src/styles/components/ProblemCard.css index c3f30b5..97027f8 100644 --- a/src/client/src/styles/components/ProblemCard.css +++ b/src/client/src/styles/components/ProblemCard.css @@ -1,96 +1,269 @@ .problem-card { - background: white; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - padding: 1.5rem; - transition: transform 0.2s ease, box-shadow 0.2s ease; + background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); + border-radius: 12px; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); + padding: 1.75rem; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + border: 1px solid rgba(255, 255, 255, 0.8); + position: relative; + overflow: hidden; +} + +.problem-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 3px; + background: linear-gradient(90deg, #0066cc, #0099ff); + transform: scaleX(0); + transition: transform 0.3s ease; } .problem-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); + transform: translateY(-4px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); +} + +.problem-card:hover::before { + transform: scaleX(1); } .problem-header { display: flex; justify-content: space-between; align-items: flex-start; - margin-bottom: 1rem; + margin-bottom: 1.25rem; + gap: 1rem; } .problem-header h3 { margin: 0; - font-size: 1.1rem; + font-size: 1.25rem; flex: 1; - padding-right: 1rem; + font-weight: 600; + line-height: 1.4; } .problem-header a { - color: #1a1a1a; + color: #1a202c; text-decoration: none; + background: linear-gradient(90deg, #1a202c, #2d3748); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + transition: all 0.3s ease; + position: relative; +} + +.problem-header a::after { + content: ''; + position: absolute; + bottom: -2px; + left: 0; + width: 0; + height: 2px; + background: linear-gradient(90deg, #0066cc, #0099ff); + transition: width 0.3s ease; } .problem-header a:hover { - color: #0066cc; + background: linear-gradient(90deg, #0066cc, #0099ff); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.problem-header a:hover::after { + width: 100%; } .difficulty { - padding: 0.25rem 0.75rem; - border-radius: 12px; - font-size: 0.85rem; - font-weight: 500; + padding: 0.4rem 1rem; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + white-space: nowrap; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 255, 255, 0.3); } .difficulty.easy { - background-color: #e7f6e7; - color: #2cbb5d; + background: linear-gradient(135deg, #43a047, #4caf50); + color: white; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .difficulty.medium { - background-color: #fff7e6; - color: #ffa116; + background: linear-gradient(135deg, #ffa116, #ffb74d); + color: white; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .difficulty.hard { - background-color: #ffe6e6; - color: #ff375f; + background: linear-gradient(135deg, #d32f2f, #f44336); + color: white; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .problem-stats { display: flex; - gap: 1rem; - margin-bottom: 1rem; + gap: 1.5rem; + margin-bottom: 1.25rem; font-size: 0.9rem; - color: #666; +} + +.problem-stats span { + display: flex; + align-items: center; + color: #4a5568; + font-weight: 500; + position: relative; +} + +.problem-stats span::before { + content: ''; + display: inline-block; + width: 4px; + height: 4px; + border-radius: 50%; + background: #cbd5e0; + margin-right: 0.5rem; +} + +.problem-stats span:first-child::before { + display: none; +} + +.acceptance { + color: #2d3748; + font-weight: 600; +} + +.frequency { + color: #4a5568; } .problem-companies { - border-top: 1px solid #eee; - padding-top: 1rem; + border-top: 1px solid #e2e8f0; + padding-top: 1.25rem; + margin-top: 1rem; } .problem-companies small { display: block; - margin-bottom: 0.5rem; - color: #666; + margin-bottom: 0.75rem; + color: #718096; + font-weight: 600; + font-size: 0.8rem; + text-transform: uppercase; + letter-spacing: 0.5px; } .company-tags { display: flex; flex-wrap: wrap; - gap: 0.5rem; + gap: 0.6rem; } .company-tag { - background: #f5f5f5; - padding: 0.25rem 0.75rem; - border-radius: 12px; - font-size: 0.85rem; + background: linear-gradient(135deg, #ffffff, #f7fafc); + padding: 0.5rem 1rem; + border-radius: 10px; + font-size: 0.8rem; display: flex; align-items: center; - gap: 0.25rem; + gap: 0.4rem; + border: 1px solid #e2e8f0; + transition: all 0.2s ease; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + font-weight: 500; + color: #2d3748; +} + +.company-tag:hover { + transform: translateY(-1px); + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1); + border-color: #ffa116; + background: linear-gradient(135deg, #fffaf0, #fffbeb); +} + +.company-name { + font-weight: 600; + color: #2d3748; } .recent-indicator { - font-size: 0.8rem; + font-size: 0.7rem; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + transform: scale(1); + } + 50% { + opacity: 0.7; + transform: scale(1.1); + } +} + +/* Responsive Design */ +@media (max-width: 768px) { + .problem-card { + padding: 1.25rem; + margin: 0.5rem; + } + + .problem-header { + flex-direction: column; + align-items: flex-start; + gap: 0.75rem; + } + + .problem-header h3 { + font-size: 1.1rem; + padding-right: 0; + } + + .difficulty { + align-self: flex-start; + } + + .problem-stats { + flex-direction: column; + gap: 0.5rem; + } + + .problem-stats span::before { + display: none; + } + + .company-tags { + gap: 0.4rem; + } + + .company-tag { + padding: 0.4rem 0.8rem; + font-size: 0.75rem; + } +} + +/* Animation for card entrance */ +@keyframes cardEntrance { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.problem-card { + animation: cardEntrance 0.6s ease-out; } \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemPage.css b/src/client/src/styles/components/ProblemPage.css new file mode 100644 index 0000000..3ddf68b --- /dev/null +++ b/src/client/src/styles/components/ProblemPage.css @@ -0,0 +1,271 @@ +.lcw-problem-page { + max-width: 900px; + margin: 32px auto; + background: #fff; + border-radius: 16px; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1); + padding: 40px; + font-family: 'Segoe UI', 'Roboto', 'Arial', sans-serif; + color: #2d3748; + line-height: 1.6; +} + +/* Header Section */ +.lcw-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 24px; + border-bottom: 2px solid #f1f5f9; + padding-bottom: 20px; +} + +.lcw-header h2 { + margin: 0; + font-size: 28px; + font-weight: 700; + color: #1a202c; + line-height: 1.3; + flex: 1; +} + +.lcw-link { + color: #ffa116; + text-decoration: none; + font-weight: 600; + padding: 8px 16px; + border: 2px solid #ffa116; + border-radius: 8px; + transition: all 0.3s ease; + font-size: 14px; + white-space: nowrap; + margin-left: 20px; +} + +.lcw-link:hover { + background: #ffa116; + color: white; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(255, 161, 22, 0.3); +} + +/* Meta Information */ +.lcw-meta { + display: flex; + flex-wrap: wrap; + gap: 16px; + margin-bottom: 32px; + padding: 20px; + background: #f8fafc; + border-radius: 12px; + border-left: 4px solid #ffa116; +} + +.lcw-meta-item { + color: #4a5568; + font-size: 15px; + font-weight: 500; +} + +.lcw-difficulty { + padding: 6px 16px; + border-radius: 12px; + font-weight: 600; + color: #fff; + font-size: 14px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.lcw-difficulty-easy { + background: linear-gradient(135deg, #43a047, #4caf50); + box-shadow: 0 2px 8px rgba(67, 160, 71, 0.3); +} + +.lcw-difficulty-medium { + background: linear-gradient(135deg, #ffa116, #ffb74d); + box-shadow: 0 2px 8px rgba(255, 161, 22, 0.3); +} + +.lcw-difficulty-hard { + background: linear-gradient(135deg, #d32f2f, #f44336); + box-shadow: 0 2px 8px rgba(211, 47, 47, 0.3); +} + +.lcw-difficulty-unknown { + background: linear-gradient(135deg, #718096, #a0aec0); +} + +/* Section Title */ +.lcw-section-title { + margin: 40px 0 20px 0; + font-size: 22px; + color: #1a202c; + font-weight: 700; + position: relative; + padding-bottom: 12px; +} + +.lcw-section-title::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 60px; + height: 3px; + background: linear-gradient(90deg, #ffa116, #ffd54f); + border-radius: 2px; +} + +/* Table Styling */ +.lcw-table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + margin-bottom: 32px; + background: #fff; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); +} + +.lcw-table th { + background: linear-gradient(135deg, #1a202c, #2d3748); + color: white; + font-weight: 600; + padding: 16px 20px; + text-align: left; + font-size: 15px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.lcw-table td { + padding: 20px; + border-bottom: 1px solid #e2e8f0; + background: #fff; + transition: background-color 0.2s ease; +} + +.lcw-table tr:last-child td { + border-bottom: none; +} + +.lcw-table tr:hover td { + background: #f7fafc; +} + +/* Tag Styling */ +.lcw-tag { + display: inline-block; + background: linear-gradient(135deg, #e2e8f0, #edf2f7); + color: #2d3748; + padding: 8px 16px; + border-radius: 8px; + font-size: 13px; + font-weight: 600; + text-transform: capitalize; + border: 1px solid #cbd5e0; + min-width: 100px; + text-align: center; +} + +/* Company Tags */ +.lcw-company { + display: inline-block; + background: linear-gradient(135deg, #ffffff, #f7fafc); + color: #2d3748; + margin: 4px 8px 4px 0; + padding: 6px 14px; + border-radius: 8px; + font-size: 13px; + font-weight: 500; + border: 1px solid #e2e8f0; + transition: all 0.2s ease; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); +} + +.lcw-company:hover { + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border-color: #ffa116; + background: linear-gradient(135deg, #fffaf0, #fffbeb); +} + +/* Loading and Error States */ +.lcw-loading, .lcw-error { + text-align: center; + margin-top: 60px; + font-size: 18px; + padding: 40px; + border-radius: 12px; +} + +.lcw-loading { + color: #4a5568; + background: #f7fafc; + border: 2px dashed #cbd5e0; +} + +.lcw-error { + color: #e53e3e; + background: #fed7d7; + border: 2px solid #feb2b2; + font-weight: 600; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .lcw-problem-page { + margin: 16px; + padding: 24px; + border-radius: 12px; + } + + .lcw-header { + flex-direction: column; + align-items: flex-start; + } + + .lcw-link { + margin: 16px 0 0 0; + align-self: flex-start; + } + + .lcw-meta { + flex-direction: column; + gap: 12px; + align-items: flex-start; + } + + .lcw-table { + font-size: 14px; + } + + .lcw-table th, + .lcw-table td { + padding: 12px 8px; + } + + .lcw-company { + font-size: 12px; + padding: 4px 10px; + margin: 2px 4px 2px 0; + } +} + +/* Animation for page load */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.lcw-problem-page { + animation: fadeIn 0.6s ease-out; +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Footer.css b/src/client/src/styles/layout/Footer.css index aa1159f..9e9425a 100644 --- a/src/client/src/styles/layout/Footer.css +++ b/src/client/src/styles/layout/Footer.css @@ -1,19 +1,64 @@ .footer { - background-color: #1a1a1a; + background: #1a1a1a; color: white; - padding: 1rem 0; + padding: 1.5rem 0; margin-top: auto; + border-top: 1px solid #2d2d2d; } .footer-content { max-width: 1200px; margin: 0 auto; - padding: 0 1rem; + padding: 0 2rem; text-align: center; } .footer p { margin: 0; - font-size: 0.9rem; - opacity: 0.8; + font-size: 0.95rem; + color: #a0a0a0; + font-weight: 400; + letter-spacing: 0.5px; + transition: color 0.2s ease; +} + +.footer p:hover { + color: #d0d0d0; +} + +/* Optional: Add a subtle top border accent */ +.footer { + position: relative; +} + +.footer::before { + content: ''; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 100px; + height: 2px; + background: linear-gradient(90deg, transparent, #ffa116, transparent); +} + +/* Responsive Design */ +@media (max-width: 768px) { + .footer { + padding: 1.25rem 0; + } + + .footer-content { + padding: 0 1rem; + } + + .footer p { + font-size: 0.9rem; + } +} + +@media (max-width: 480px) { + .footer p { + font-size: 0.85rem; + } } \ No newline at end of file diff --git a/src/client/src/styles/layout/Header.css b/src/client/src/styles/layout/Header.css index 6648f4d..7796726 100644 --- a/src/client/src/styles/layout/Header.css +++ b/src/client/src/styles/layout/Header.css @@ -1,22 +1,229 @@ .header { width: 100%; - background-color: #1a1a1a; + background: linear-gradient(135deg, #1a1a1a 0%, #2d1b69 50%, #1a1a1a 100%); color: white; - padding: 1rem 0; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + padding: 1.25rem 0; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); + position: relative; + overflow: hidden; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: + radial-gradient(circle at 20% 80%, rgba(255, 161, 22, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(0, 102, 204, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(67, 160, 71, 0.05) 0%, transparent 50%); + pointer-events: none; +} + +.header::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, + transparent 0%, + rgba(255, 161, 22, 0.6) 25%, + rgba(0, 102, 204, 0.6) 50%, + rgba(255, 161, 22, 0.6) 75%, + transparent 100%); } .header-content { max-width: 1200px; margin: 0 auto; - padding: 0 1rem; + padding: 0 2rem; display: flex; align-items: center; justify-content: center; + position: relative; + z-index: 2; +} + +.header-link { + text-decoration: none; + color: inherit; + cursor: pointer; + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + position: relative; + padding: 0.5rem 1rem; + border-radius: 12px; +} + +.header-link::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, rgba(255, 161, 22, 0.1), rgba(0, 102, 204, 0.1)); + border-radius: 12px; + opacity: 0; + transition: opacity 0.3s ease; +} + +.header-link:hover { + transform: translateY(-2px); + text-shadow: 0 4px 12px rgba(255, 255, 255, 0.3); +} + +.header-link:hover::before { + opacity: 1; +} + +.header-link:active { + transform: translateY(0); } .header h1 { margin: 0; + font-size: 2rem; + font-weight: 700; + background: linear-gradient(135deg, #ffffff 0%, #ffa116 50%, #0099ff 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-align: center; + line-height: 1.2; + letter-spacing: -0.5px; + position: relative; + padding: 0.5rem 0; +} + +.header h1::after { + content: '🔍'; + position: absolute; + top: 50%; + right: -2rem; + transform: translateY(-50%); font-size: 1.5rem; - font-weight: 600; + opacity: 0.8; + animation: float 3s ease-in-out infinite; +} + +/* Code-inspired decoration */ +.header-content::before { + content: '{ }'; + position: absolute; + left: 2rem; + top: 50%; + transform: translateY(-50%); + font-size: 1.2rem; + color: rgba(255, 161, 22, 0.6); + font-family: 'Courier New', monospace; + font-weight: bold; + opacity: 0.7; +} + +.header-content::after { + content: ''; + position: absolute; + right: 2rem; + top: 50%; + transform: translateY(-50%); + font-size: 1.2rem; + color: rgba(0, 102, 204, 0.6); + font-family: 'Courier New', monospace; + font-weight: bold; + opacity: 0.7; +} + +/* Floating animation */ +@keyframes float { + 0%, 100% { + transform: translateY(-50%) rotate(0deg); + } + 50% { + transform: translateY(-50%) rotate(10deg); + } +} + +/* Glow effect on hover */ +@keyframes textGlow { + 0%, 100% { + text-shadow: 0 0 20px rgba(255, 255, 255, 0.3); + } + 50% { + text-shadow: 0 0 30px rgba(255, 161, 22, 0.5), 0 0 40px rgba(0, 102, 204, 0.3); + } +} + +.header-link:hover h1 { + animation: textGlow 2s ease-in-out infinite; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .header { + padding: 1rem 0; + } + + .header-content { + padding: 0 1rem; + } + + .header h1 { + font-size: 1.5rem; + } + + .header h1::after { + right: -1.5rem; + font-size: 1.2rem; + } + + .header-content::before, + .header-content::after { + display: none; /* Hide code symbols on mobile */ + } +} + +@media (max-width: 480px) { + .header h1 { + font-size: 1.25rem; + letter-spacing: -0.25px; + } + + .header h1::after { + display: none; /* Hide emoji on very small screens */ + } + + .header-link { + padding: 0.25rem 0.5rem; + } +} + +/* Reduced motion support */ +@media (prefers-reduced-motion: reduce) { + .header-link { + transition: none; + } + + .header-link:hover { + transform: none; + } + + .header h1::after { + animation: none; + } + + .header-link:hover h1 { + animation: none; + } +} + +/* Dark theme optimization */ +@media (prefers-color-scheme: dark) { + .header { + background: linear-gradient(135deg, #0a0a0a 0%, #1a0f4d 50%, #0a0a0a 100%); + } } \ No newline at end of file From 2898cfa7fd40553d20fa7e9657149b35c90d2a66 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 11 Oct 2025 16:47:58 +0530 Subject: [PATCH 07/30] implemented pagination --- src/client/src/components/layout/Body.js | 18 +++- src/client/src/components/layout/Main.js | 27 +++++- .../src/components/layout/Pagination.js | 75 +++++++++++++++ src/client/src/services/api.js | 24 ++++- src/client/src/styles/layout/Body.css | 7 +- src/client/src/styles/layout/Pagination.css | 94 +++++++++++++++++++ 6 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 src/client/src/components/layout/Pagination.js create mode 100644 src/client/src/styles/layout/Pagination.css diff --git a/src/client/src/components/layout/Body.js b/src/client/src/components/layout/Body.js index 249e4c0..764138a 100644 --- a/src/client/src/components/layout/Body.js +++ b/src/client/src/components/layout/Body.js @@ -1,8 +1,17 @@ import React from "react"; import ProblemGrid from "../problems/ProblemGrid"; +import Pagination from "./Pagination"; // Add this import import "../../styles/layout/Body.css"; -const Body = ({ problems, loading, error, filters }) => { +const Body = ({ + problems, + loading, + error, + filters, + currentPage, + totalPages, + onPageChange +}) => { if (loading) { return (
@@ -26,9 +35,14 @@ const Body = ({ problems, loading, error, filters }) => {
+
); }; -export default Body; +export default Body; \ No newline at end of file diff --git a/src/client/src/components/layout/Main.js b/src/client/src/components/layout/Main.js index a493e2d..46136d3 100644 --- a/src/client/src/components/layout/Main.js +++ b/src/client/src/components/layout/Main.js @@ -13,14 +13,25 @@ const Main = () => { timePeriod: "", difficulty: "", }); + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + + const PROBLEMS_PER_PAGE = 50; useEffect(() => { const loadProblems = async () => { setLoading(true); try { - const data = await fetchProblems(); + const data = await fetchProblems(currentPage, PROBLEMS_PER_PAGE, filters); setProblems(data); setError(null); + + // Estimate total pages based on response + if (data.length < PROBLEMS_PER_PAGE) { + setTotalPages(currentPage); + } else { + setTotalPages(currentPage + 1); + } } catch (err) { setError("Failed to fetch problems. Please try again later."); setProblems([]); @@ -30,7 +41,7 @@ const Main = () => { }; loadProblems(); - }, []); + }, [currentPage, filters]); // Extract unique company names from problems const companies = useMemo(() => { @@ -47,6 +58,13 @@ const Main = () => { const handleFilterChange = (newFilters) => { setFilters(newFilters); + setCurrentPage(1); // Reset to first page when filters change + }; + + const handlePageChange = (page) => { + setCurrentPage(page); + // Scroll to top when page changes + window.scrollTo({ top: 0, behavior: 'smooth' }); }; return ( @@ -61,9 +79,12 @@ const Main = () => { loading={loading} error={error} filters={filters} + currentPage={currentPage} + totalPages={totalPages} + onPageChange={handlePageChange} />
); }; -export default Main; +export default Main; \ No newline at end of file diff --git a/src/client/src/components/layout/Pagination.js b/src/client/src/components/layout/Pagination.js new file mode 100644 index 0000000..2458d84 --- /dev/null +++ b/src/client/src/components/layout/Pagination.js @@ -0,0 +1,75 @@ +// components/Pagination.js +import React from "react"; +import "../../styles/layout/Pagination.css"; + +const Pagination = ({ currentPage, totalPages, onPageChange }) => { + const getPageNumbers = () => { + const pages = []; + const maxVisiblePages = 5; + + let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2)); + let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1); + + // Adjust start page if we're near the end + if (endPage - startPage + 1 < maxVisiblePages) { + startPage = Math.max(1, endPage - maxVisiblePages + 1); + } + + for (let i = startPage; i <= endPage; i++) { + pages.push(i); + } + + return pages; + }; + + if (totalPages <= 1) return null; + + return ( +
+ {/* First Page Button */} + + + {/* Previous Page Button */} + + + {/* Page Numbers */} +
+ {getPageNumbers().map(page => ( + + ))} +
+ + {/* Next Page Button */} + +
+ ); +}; + +export default Pagination; \ No newline at end of file diff --git a/src/client/src/services/api.js b/src/client/src/services/api.js index 3f4137e..b57069a 100644 --- a/src/client/src/services/api.js +++ b/src/client/src/services/api.js @@ -1,7 +1,25 @@ +// services/api.js const API_BASE_URL = "http://localhost:5164/api"; -export const fetchProblems = async () => { - const response = await fetch(`${API_BASE_URL}/problems`); +export const fetchProblems = async (page = 1, limit = 50, filters = {}) => { + const skip = (page - 1) * limit; + const params = new URLSearchParams({ + skip: skip.toString(), + limit: limit.toString() + }); + + // Add filter parameters if they exist + if (filters.company) { + params.append('companies', filters.company); + } + if (filters.difficulty) { + params.append('difficulties', filters.difficulty); + } + if (filters.timePeriod) { + params.append('tags', filters.timePeriod); + } + + const response = await fetch(`${API_BASE_URL}/problems?${params}`); if (!response.ok) { throw new Error(`Network response was not ok: ${response.status}`); } @@ -14,4 +32,4 @@ export const getProblemById = async (id) => { throw new Error(`Failed to fetch problem #${id}`); } return await response.json(); -}; +}; \ No newline at end of file diff --git a/src/client/src/styles/layout/Body.css b/src/client/src/styles/layout/Body.css index 7824269..c98c329 100644 --- a/src/client/src/styles/layout/Body.css +++ b/src/client/src/styles/layout/Body.css @@ -46,4 +46,9 @@ .error-message button:hover { background-color: #c82333; -} \ No newline at end of file +} + +/* Add to styles/layout/Body.css */ +.body-content { + min-height: 60vh; +} diff --git a/src/client/src/styles/layout/Pagination.css b/src/client/src/styles/layout/Pagination.css new file mode 100644 index 0000000..a29519d --- /dev/null +++ b/src/client/src/styles/layout/Pagination.css @@ -0,0 +1,94 @@ +/* styles/components/Pagination.css */ +.pagination { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; + margin: 2rem 0; + padding: 1rem; +} + +.pagination-pages { + display: flex; + gap: 0.25rem; +} + +.pagination-btn { + padding: 0.5rem 0.75rem; + border: 1px solid #e2e8f0; + background: white; + color: #4a5568; + border-radius: 6px; + cursor: pointer; + transition: all 0.2s ease; + font-weight: 500; + min-width: 2.5rem; + display: flex; + align-items: center; + justify-content: center; +} + +.pagination-btn:hover:not(:disabled) { + background: #f7fafc; + border-color: #cbd5e0; + transform: translateY(-1px); +} + +.pagination-btn.active { + background: #0066cc; + color: white; + border-color: #0066cc; +} + +.pagination-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + transform: none; +} + +/* Specific styles for navigation buttons */ +.pagination-first, +.pagination-last { + font-weight: bold; + font-size: 1.1rem; +} + +.pagination-prev, +.pagination-next { + font-weight: bold; +} + +.pagination-info { + text-align: center; + color: #666; + margin-bottom: 1rem; + font-size: 0.9rem; +} + +/* Responsive */ +@media (max-width: 768px) { + .pagination { + gap: 0.25rem; + } + + .pagination-btn { + padding: 0.4rem 0.6rem; + font-size: 0.9rem; + min-width: 2.25rem; + } + + .pagination-pages { + gap: 0.125rem; + } + + /* Hide page numbers on very small screens, keep only navigation */ + @media (max-width: 480px) { + .pagination-pages { + display: none; + } + + .pagination { + gap: 0.5rem; + } + } +} \ No newline at end of file From 5b5f369d211018121ec04ddce4d10d257de5e244 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 11 Oct 2025 23:59:20 +0530 Subject: [PATCH 08/30] allowed all origins --- src/Backend/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 7583545..e2c1fe5 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -43,7 +43,7 @@ public static void Main(string[] args) { options.AddPolicy("AllowReactApp", builder => builder - .WithOrigins("http://localhost:3000") + .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); From 4f81dbab066b75805d55a1538ca6c629a2fc9637 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 11 Oct 2025 23:59:20 +0530 Subject: [PATCH 09/30] Added search engine and removed keys --- src/Backend/AppContext.cs | 10 +- src/Backend/Backend.csproj | 3 + .../Controllers/JobSearchController.cs | 44 ++++++ src/Backend/Models/Internal/ScrappedJob.cs | 37 +++++ src/Backend/Models/Public/GSResult.cs | 132 ++++++++++++++++++ src/Backend/Operations/AIEngine.cs | 16 +++ src/Backend/Operations/GSEngine.cs | 126 +++++++++++++++++ src/Backend/Program.cs | 13 +- src/Backend/Properties/launchSettings.json | 10 ++ src/Backend/appsettings.json | 4 + 10 files changed, 383 insertions(+), 12 deletions(-) create mode 100644 src/Backend/Controllers/JobSearchController.cs create mode 100644 src/Backend/Models/Internal/ScrappedJob.cs create mode 100644 src/Backend/Models/Public/GSResult.cs create mode 100644 src/Backend/Operations/AIEngine.cs create mode 100644 src/Backend/Operations/GSEngine.cs diff --git a/src/Backend/AppContext.cs b/src/Backend/AppContext.cs index 8d97ddf..5950797 100644 --- a/src/Backend/AppContext.cs +++ b/src/Backend/AppContext.cs @@ -5,13 +5,15 @@ namespace Backend { public class AppContext { - public readonly Operations.DataProvider dataProvider; + public readonly DataProvider dataProvider; public readonly IConfiguration configuration; - public readonly ILogger logger; + public readonly ILogger logger; + public readonly GSEngine gsEngine; - public AppContext(CosmosClient cosmosClient, IConfiguration configuration, ILogger logger) + public AppContext(DataProvider _dataProvider, GSEngine _gsEngine, IConfiguration configuration, ILogger logger) { - this.dataProvider = new Operations.DataProvider(cosmosClient, configuration, logger); + this.dataProvider = _dataProvider; + this.gsEngine = _gsEngine; this.configuration = configuration; this.logger = logger; } diff --git a/src/Backend/Backend.csproj b/src/Backend/Backend.csproj index 15e787a..768ca68 100644 --- a/src/Backend/Backend.csproj +++ b/src/Backend/Backend.csproj @@ -7,6 +7,9 @@ + + + diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs new file mode 100644 index 0000000..8d1a32e --- /dev/null +++ b/src/Backend/Controllers/JobSearchController.cs @@ -0,0 +1,44 @@ +namespace Backend.Controllers +{ + using Microsoft.AspNetCore.Mvc; + + [ApiController] + public class JobSearchController : ControllerBase + { + private readonly AppContext appContext; + public JobSearchController(AppContext appContext) + { + this.appContext = appContext; + } + + [HttpGet] + [Route("/jobs/search")] + public async Task>> SearchJobs([FromQuery(Name = "q")] string query) + { + var gsEngine = this.appContext.gsEngine; + var result = await gsEngine.SearchAndScrapeJobsAsync(query); + if (result != null) + { + return Ok(result); + } + return StatusCode(500, "Error occurred while searching for jobs."); + } + + [HttpGet] + [Route("/jobs/latest")] + public ActionResult GetLatestJobs() + { + // Placeholder implementation for latest jobs + return Ok("Latest job postings"); + } + + [HttpGet] + [Route("/jobs/{id}")] + public ActionResult GetJobById(string id) + { + // Placeholder implementation for getting job by ID + return Ok($"Job details for ID: {id}"); + } + + } +} \ No newline at end of file diff --git a/src/Backend/Models/Internal/ScrappedJob.cs b/src/Backend/Models/Internal/ScrappedJob.cs new file mode 100644 index 0000000..9759d83 --- /dev/null +++ b/src/Backend/Models/Internal/ScrappedJob.cs @@ -0,0 +1,37 @@ +namespace Backend.Models.Internal +{ + public class ScrappedJob + { + public string jobId { get; set; } + public string title { get; set; } + public string displayLink { get; set; } + public string snippet { get; set; } + public string description { get; set; } + public string link { get; set; } + public DateTime scrappedTime { get; set; } + public List tags { get; set; } = new List(); + + public ScrappedJob() { } + public ScrappedJob(Models.Public.Item item, DateTime scrappedTime) + { + this.title = item.title; + this.displayLink = item.displayLink; + this.snippet = item.snippet; + this.link = item.link; + this.jobId = GenerateHashId(item.link, item.displayLink); + this.scrappedTime = scrappedTime; + this.description = "NA"; + } + + private string GenerateHashId(string url, string displayLink) + { + // Use a simple hash code and base36 encoding for lightweight hash + int hash = url.GetHashCode(); + string base36 = Math.Abs(hash).ToString("x"); // Hexadecimal representation + string dtime = DateTime.UtcNow.ToString("yyyyMMdd"); + // Pad or trim to 20 characters + var hashvalue = base36.Length > 10 ? base36.Substring(0, 10) : base36.PadLeft(10, '0'); + return $"{displayLink}-{dtime}-{hashvalue}"; + } + } +} \ No newline at end of file diff --git a/src/Backend/Models/Public/GSResult.cs b/src/Backend/Models/Public/GSResult.cs new file mode 100644 index 0000000..e89800e --- /dev/null +++ b/src/Backend/Models/Public/GSResult.cs @@ -0,0 +1,132 @@ +namespace Backend.Models.Public +{ + public class GSResult + { + public string kind { get; set; } + public UrlInfo url { get; set; } + public Queries queries { get; set; } + public Context context { get; set; } + public SearchInformation searchInformation { get; set; } + public List items { get; set; } + } + + public class UrlInfo + { + public string type { get; set; } + public string template { get; set; } + } + + public class Queries + { + public List request { get; set; } + public List nextPage { get; set; } + } + + public class QueryRequest + { + public string totalResults { get; set; } + public int count { get; set; } + public int startIndex { get; set; } + public string inputEncoding { get; set; } + public string outputEncoding { get; set; } + public string safe { get; set; } + public string cx { get; set; } + public string sort { get; set; } + public string gl { get; set; } + public string siteSearch { get; set; } + public string siteSearchFilter { get; set; } + public string exactTerms { get; set; } + public string excludeTerms { get; set; } + public string dateRestrict { get; set; } + } + + public class Context + { + public string title { get; set; } + } + + public class SearchInformation + { + public double searchTime { get; set; } + public string formattedSearchTime { get; set; } + public string totalResults { get; set; } + public string formattedTotalResults { get; set; } + } + + public class Item + { + public string kind { get; set; } + public string title { get; set; } + public string htmlTitle { get; set; } + public string link { get; set; } + public string displayLink { get; set; } + public string snippet { get; set; } + public string htmlSnippet { get; set; } + public string formattedUrl { get; set; } + public string htmlFormattedUrl { get; set; } + // public PageMap pagemap { get; set; } // Not in use currently + } + + /* + #region PageMapClasses + public class PageMap + { + public List metatags { get; set; } + public List cse_thumbnail { get; set; } + public List cse_image { get; set; } + public List BreadcrumbList { get; set; } + public List organization { get; set; } + } + + public class MetaTag + { + public string image { get; set; } + public string og_type { get; set; } + public string viewport { get; set; } + public string title { get; set; } + public string og_url { get; set; } + public string og_image { get; set; } + public string og_site_name { get; set; } + public string og_locale { get; set; } + public string og_description { get; set; } + public string twitter_card { get; set; } + public string twitter_image { get; set; } + public string author { get; set; } + public string url { get; set; } + public string position { get; set; } + public string referrer { get; set; } + public string csrf_token { get; set; } + public string csrf_param { get; set; } + public string jobidentifier { get; set; } + public string og_image_width { get; set; } + public string og_image_height { get; set; } + public string http_ogp_me_ns_article_published_time { get; set; } + public string http_ogp_me_ns_article_modified_time { get; set; } + public string http_ogp_me_ns_article_section { get; set; } + public string twitter_site { get; set; } + } + + public class CseThumbnail + { + public string src { get; set; } + public string width { get; set; } + public string height { get; set; } + } + + public class CseImage + { + public string src { get; set; } + } + + public class BreadcrumbList + { + // Add properties if needed + } + + public class Organization + { + public string sameas { get; set; } + } + #endregion PageMapClasses + */ +} \ No newline at end of file diff --git a/src/Backend/Operations/AIEngine.cs b/src/Backend/Operations/AIEngine.cs new file mode 100644 index 0000000..526b377 --- /dev/null +++ b/src/Backend/Operations/AIEngine.cs @@ -0,0 +1,16 @@ +namespace Backend.Operations +{ + using Azure.Identity; + using Azure.AI.Inference; + using Azure.Core; + using Azure.Core.Pipeline; + class AIEngine + { + private const string OPENAI_API_URL = "https://job-analyzer.services.ai.azure.com/api/projects/firstProject"; + private readonly ILogger logger; + private readonly IConfiguration configuration; + public AIEngine(IConfiguration configuration, ILogger logger) + { + } + } +} \ No newline at end of file diff --git a/src/Backend/Operations/GSEngine.cs b/src/Backend/Operations/GSEngine.cs new file mode 100644 index 0000000..4a58b4f --- /dev/null +++ b/src/Backend/Operations/GSEngine.cs @@ -0,0 +1,126 @@ +namespace Backend.Operations +{ + using System.Data.Common; + using Backend.Models.Internal; + using Microsoft.Azure.Cosmos.Linq; + using Newtonsoft.Json; + public class GSEngine + { + private readonly string apiKey; + private readonly string searchEngineId; + private readonly HttpClient httpClient; + private string baseUrl = "https://customsearch.googleapis.com/customsearch/v1"; + private int maxResultsPerSearch = 150; + ILogger logger; + + public GSEngine(IConfiguration configuration, ILogger _logger) + { + this.apiKey = configuration["GoogleSearch:ApiKey"] ?? throw new ArgumentNullException("Google Search API Key is not configured."); + this.searchEngineId = configuration["GoogleSearch:SearchEngineId"] ?? throw new ArgumentNullException("Google Search Engine ID is not configured."); + this.logger = _logger; + this.httpClient = new HttpClient(); + } + + public async Task> SearchAndScrapeJobsAsync(string query) + { + var allJobs = new List(); + int startIndex = 1, totalResults = 0; + + var template = $"{this.baseUrl}?key={apiKey}&cx={searchEngineId}&q={Uri.EscapeDataString(query)}"; + template += AddLocationToQuery() + AddDateRestrictionToQuery() + AddNegativeTermToQuery() + + AddPositiveTermToQuery() + RemoveSiteSearchFromQuery() + AddAdditionalSearchTerms(); + + do + { + var url = template + AddStartIndexToQuery(startIndex); + var res = await SearchRawUrlAsync(url); + if (res == null) + { + logger.LogError("SearchAsync returned null result."); + break; + } + else if (res.queries.request[0].count == 0) + { + logger.LogInformation($"No results found for query: {url}"); + break; + } + + foreach (var item in res.items) + { + var job = new ScrappedJob(item, DateTime.UtcNow); + allJobs.Add(job); + } + + totalResults = int.Parse(res.queries.request[0].totalResults); + startIndex += res.queries.request[0].count; + } + while (startIndex < maxResultsPerSearch && startIndex < totalResults); + + this.logger.LogInformation($"Fetched {allJobs.Count} jobs. Total available: {totalResults}. Using url template: {template}"); + + return allJobs; + } + + public async Task SearchRawUrlAsync(string url) + { + try + { + var response = await httpClient.GetAsync(url); + response.EnsureSuccessStatusCode(); + var content = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(content); + } + catch (Exception ex) + { + logger.LogError(ex, "Error occurred during Google Search API call."); + } + + return null; + } + + private string AddLocationToQuery(string location = "in") + { + return $"&gl={location}"; + } + + private string AddDateRestrictionToQuery(string dateRestrict = "d1") + { + return $"&dateRestrict={dateRestrict}"; + } + + private string AddNegativeTermToQuery(string phrase = "manager") + { + return $"&excludeTerms={Uri.EscapeDataString(phrase)}"; + } + + private string AddPositiveTermToQuery(string phrase = "Software Engineer") + { + return $"&exactTerms={Uri.EscapeDataString(phrase)}"; + } + + private string AddSiteSearchToQuery(string site = "linkedin.com") + { + return $"&siteSearch={site}&siteSearchFilter=i"; + } + + private string RemoveSiteSearchFromQuery(string site = "linkedin.com") + { + return $"&siteSearch={site}&siteSearchFilter=e"; + } + + private string AddSortingToQuery(string sort = "date") + { + return $"&sort={sort}"; + } + + private string AddAdditionalSearchTerms(string terms = "India") + { + return $"&hq={Uri.EscapeDataString(terms)}"; + } + + private string AddStartIndexToQuery(int startIndex = 1) + { + return $"&start={startIndex}"; + } + } +} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 7583545..17b9aff 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -43,7 +43,7 @@ public static void Main(string[] args) { options.AddPolicy("AllowReactApp", builder => builder - .WithOrigins("http://localhost:3000") + .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); @@ -62,13 +62,10 @@ public static void Main(string[] args) // Register AppContext as singleton var config = builder.Configuration; var cosmosClient = new CosmosClient(config["ApplicationSettings:CosmosDbUri"], config["ApplicationSettings:CosmosDbPrimaryKey"]); - builder.Services.AddSingleton(s => - new AppContext( - cosmosClient, - builder.Configuration, - s.GetRequiredService>() - ) - ); + builder.Services.AddSingleton(cosmosClient); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Backend/Properties/launchSettings.json b/src/Backend/Properties/launchSettings.json index fe3de06..8b6a653 100644 --- a/src/Backend/Properties/launchSettings.json +++ b/src/Backend/Properties/launchSettings.json @@ -29,6 +29,16 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, + "container": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://0.0.0.0:5164", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, diff --git a/src/Backend/appsettings.json b/src/Backend/appsettings.json index 9ee91c9..627b327 100644 --- a/src/Backend/appsettings.json +++ b/src/Backend/appsettings.json @@ -20,5 +20,9 @@ }, "ConnectionString": "" }, + "GoogleSearch": { + "ApiKey": "", + "SearchEngineId": "e509d21f7c4af4d2c" + }, "AllowedHosts": "*" } From 07c38bb64c5bc621832616fa56542dd5d09a9baf Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sun, 12 Oct 2025 02:55:09 +0530 Subject: [PATCH 10/30] Added AI Engine to label job category --- src/Backend/AppContext.cs | 4 +- src/Backend/Backend.csproj | 2 + .../Controllers/JobSearchController.cs | 12 +- src/Backend/Operations/AIEngine.cs | 123 +++++++++++++++++- src/Backend/Operations/GSEngine.cs | 2 +- src/Backend/Program.cs | 1 + 6 files changed, 136 insertions(+), 8 deletions(-) diff --git a/src/Backend/AppContext.cs b/src/Backend/AppContext.cs index 5950797..6f3ddfa 100644 --- a/src/Backend/AppContext.cs +++ b/src/Backend/AppContext.cs @@ -9,13 +9,15 @@ public class AppContext public readonly IConfiguration configuration; public readonly ILogger logger; public readonly GSEngine gsEngine; + public readonly AIEngine aiEngine; - public AppContext(DataProvider _dataProvider, GSEngine _gsEngine, IConfiguration configuration, ILogger logger) + public AppContext(DataProvider _dataProvider, GSEngine _gsEngine, AIEngine _aiEngine, IConfiguration configuration, ILogger logger) { this.dataProvider = _dataProvider; this.gsEngine = _gsEngine; this.configuration = configuration; this.logger = logger; + this.aiEngine = _aiEngine; } } } \ No newline at end of file diff --git a/src/Backend/Backend.csproj b/src/Backend/Backend.csproj index 768ca68..ad94ee8 100644 --- a/src/Backend/Backend.csproj +++ b/src/Backend/Backend.csproj @@ -7,7 +7,9 @@ + + diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index 8d1a32e..c38a0de 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -3,6 +3,7 @@ namespace Backend.Controllers using Microsoft.AspNetCore.Mvc; [ApiController] + [Route("api")] public class JobSearchController : ControllerBase { private readonly AppContext appContext; @@ -19,13 +20,22 @@ public JobSearchController(AppContext appContext) var result = await gsEngine.SearchAndScrapeJobsAsync(query); if (result != null) { + var levels = await this.appContext.aiEngine.GetJobLevelAsync(result); + foreach (var level in levels) + { + var job = result.FirstOrDefault(j => j.jobId == level.Key); + if (job != null) + { + job.tags.Add(level.Value); + } + } return Ok(result); } return StatusCode(500, "Error occurred while searching for jobs."); } [HttpGet] - [Route("/jobs/latest")] + [Route("/jobs")] public ActionResult GetLatestJobs() { // Placeholder implementation for latest jobs diff --git a/src/Backend/Operations/AIEngine.cs b/src/Backend/Operations/AIEngine.cs index 526b377..538c783 100644 --- a/src/Backend/Operations/AIEngine.cs +++ b/src/Backend/Operations/AIEngine.cs @@ -1,16 +1,129 @@ namespace Backend.Operations { + using Azure; + using Azure.AI; using Azure.Identity; using Azure.AI.Inference; - using Azure.Core; - using Azure.Core.Pipeline; - class AIEngine + using Azure.AI.Projects; + using Azure.AI.Agents.Persistent; + using System.Diagnostics; + using Backend.Models.Internal; + using Newtonsoft.Json; + + public class AIEngine { - private const string OPENAI_API_URL = "https://job-analyzer.services.ai.azure.com/api/projects/firstProject"; + private const string AI_SERVICE_ENDPOINT = "https://job-analyzer.services.ai.azure.com/api/projects/firstProject"; + private const string AGENT_ID = "asst_gWZPhAs5gg4jVvmuto9sop5h"; private readonly ILogger logger; private readonly IConfiguration configuration; + private PersistentAgent agent; + private PersistentAgentsClient agentsClient; public AIEngine(IConfiguration configuration, ILogger logger) - { + { + this.logger = logger; + this.configuration = configuration; + for (int i = 0; i < 3; i++) + { + try + { + this.agentsClient = new(AI_SERVICE_ENDPOINT, new DefaultAzureCredential()); + this.agent = this.agentsClient.Administration.GetAgent(AGENT_ID); + this.logger.LogInformation($"AIEngine initialized successfully. Endpoint: {AI_SERVICE_ENDPOINT}, AgentId: {AGENT_ID}"); + break; + } + catch (Exception ex) + { + logger.LogError($"Error initializing AIEngine: {ex.Message}"); + Task.Delay((i + 1) * 2000).ConfigureAwait(false).GetAwaiter().GetResult(); + } + } + + if (!IsReady()) + { + this.logger.LogError("AIEngine failed to initialize properly."); + throw new InvalidOperationException("AIEngine failed to initialize properly."); + } + } + + public bool IsReady() + { + return this.agent != null && this.agentsClient != null; + } + + public async Task>> GetJobLevelAsync(List scrappedJobs) + { + var results = new List>(); + this.logger.LogInformation($"Processing {scrappedJobs.Count} scrapped jobs. Ready: {IsReady()}"); + for (int i=0; i < scrappedJobs.Count; i += 20) + { + var batch = scrappedJobs.Skip(i).Take(20).ToList(); + try + { + var sw = Stopwatch.StartNew(); + var prompt = JsonConvert.SerializeObject(batch); + var response = await GetResponseInternalAsync(prompt); + sw.Stop(); + this.logger.LogInformation($"Processed jobs: {string.Join(",", batch.Select(j => j.jobId))} | response: {response}"); + var kvList = response.Split(",").Select(kvs => kvs.Split(":")).Where(kv => kv.Length == 2).Select(kv => new KeyValuePair(kv[0].Trim(), kv[1].Trim())).ToList(); + results.AddRange(kvList); + } + catch (Exception ex) + { + this.logger.LogError($"Error processing batch: {string.Join(",", batch.Select(j => j.jobId))} | {ex.Message}"); + } + } + return results; + } + + private async Task GetResponseInternalAsync(string input) + { + if (!IsReady()) + { + this.logger.LogError($"AIEngine is not properly initialized. Given input: {input}"); + throw new InvalidOperationException("AIEngine is not properly initialized."); + } + + PersistentAgentThread thread = agentsClient.Threads.CreateThread(); + + PersistentThreadMessage messageResponse = agentsClient.Messages.CreateMessage( + thread.Id, + MessageRole.User, + input); + + ThreadRun run = agentsClient.Runs.CreateRun( + thread.Id, + agent.Id); + + // Poll until the run reaches a terminal status + do + { + await Task.Delay(TimeSpan.FromMilliseconds(500)); + run = agentsClient.Runs.GetRun(thread.Id, run.Id); + } + while (run.Status == RunStatus.Queued + || run.Status == RunStatus.InProgress); + if (run.Status != RunStatus.Completed) + { + this.logger.LogError($"Run failed or was canceled. ThreadId: {thread.Id} Last error: {run.LastError?.Message}"); + throw new InvalidOperationException($"Run failed or was canceled: {run.LastError?.Message}"); + } + + Pageable messages = agentsClient.Messages.GetMessages( + thread.Id, order: ListSortOrder.Ascending); + + string response = string.Empty; + PersistentThreadMessage lastThreadMessage = messages.Last(); + + foreach (MessageContent contentItem in lastThreadMessage.ContentItems) + { + if (contentItem is MessageTextContent textItem) + { + response += textItem.Text; + } + } + + agentsClient.Threads.DeleteThread(thread.Id); + return response; } } } \ No newline at end of file diff --git a/src/Backend/Operations/GSEngine.cs b/src/Backend/Operations/GSEngine.cs index 4a58b4f..68c4d4b 100644 --- a/src/Backend/Operations/GSEngine.cs +++ b/src/Backend/Operations/GSEngine.cs @@ -39,7 +39,7 @@ public async Task> SearchAndScrapeJobsAsync(string query) logger.LogError("SearchAsync returned null result."); break; } - else if (res.queries.request[0].count == 0) + else if (string.IsNullOrEmpty(res.queries.request[0].totalResults) || res.items == null) { logger.LogInformation($"No results found for query: {url}"); break; diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 17b9aff..67a1a28 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -65,6 +65,7 @@ public static void Main(string[] args) builder.Services.AddSingleton(cosmosClient); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); var app = builder.Build(); From f5a811a1492dee8164f93656a9fdf0a3e83b08bc Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sun, 12 Oct 2025 12:50:05 +0530 Subject: [PATCH 11/30] search query on previous days --- src/Backend/Controllers/JobSearchController.cs | 6 ++++-- src/Backend/Operations/GSEngine.cs | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index c38a0de..707a73c 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -14,10 +14,12 @@ public JobSearchController(AppContext appContext) [HttpGet] [Route("/jobs/search")] - public async Task>> SearchJobs([FromQuery(Name = "q")] string query) + public async Task>> SearchJobs( + [FromQuery(Name = "q")] string query, + [FromQuery(Name = "d")] int nPreviousDays) { var gsEngine = this.appContext.gsEngine; - var result = await gsEngine.SearchAndScrapeJobsAsync(query); + var result = await gsEngine.SearchAndScrapeJobsAsync(query, nPreviousDays); if (result != null) { var levels = await this.appContext.aiEngine.GetJobLevelAsync(result); diff --git a/src/Backend/Operations/GSEngine.cs b/src/Backend/Operations/GSEngine.cs index 68c4d4b..1bb28e9 100644 --- a/src/Backend/Operations/GSEngine.cs +++ b/src/Backend/Operations/GSEngine.cs @@ -21,14 +21,14 @@ public GSEngine(IConfiguration configuration, ILogger _logger) this.httpClient = new HttpClient(); } - public async Task> SearchAndScrapeJobsAsync(string query) + public async Task> SearchAndScrapeJobsAsync(string query, int nPreviousDays = 1) { var allJobs = new List(); int startIndex = 1, totalResults = 0; var template = $"{this.baseUrl}?key={apiKey}&cx={searchEngineId}&q={Uri.EscapeDataString(query)}"; - template += AddLocationToQuery() + AddDateRestrictionToQuery() + AddNegativeTermToQuery() + - AddPositiveTermToQuery() + RemoveSiteSearchFromQuery() + AddAdditionalSearchTerms(); + template += AddLocationToQuery() + AddDateRestrictionToQuery($"d{nPreviousDays}") + AddNegativeTermToQuery() + + AddPositiveTermToQuery() + AddAdditionalSearchTerms(); // + RemoveSiteSearchFromQuery() do { From 2531fd0d08c4b2bb7b76582ea0d4ec6aa270141d Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sun, 12 Oct 2025 15:16:39 +0530 Subject: [PATCH 12/30] Removed Filter logic from client side --- src/client/src/components/layout/Body.js | 29 +++++++----- src/client/src/components/layout/Main.js | 18 +++++-- .../src/components/problems/ProblemGrid.js | 47 ++++--------------- src/client/src/services/api.js | 6 +-- 4 files changed, 41 insertions(+), 59 deletions(-) diff --git a/src/client/src/components/layout/Body.js b/src/client/src/components/layout/Body.js index 764138a..3359d5c 100644 --- a/src/client/src/components/layout/Body.js +++ b/src/client/src/components/layout/Body.js @@ -1,21 +1,26 @@ import React from "react"; import ProblemGrid from "../problems/ProblemGrid"; -import Pagination from "./Pagination"; // Add this import +import Pagination from "./Pagination"; import "../../styles/layout/Body.css"; -const Body = ({ - problems, - loading, - error, - filters, - currentPage, - totalPages, - onPageChange +const Body = ({ + problems, + loading, + error, + filters, + currentPage, + totalPages, + onPageChange, + hasActiveFilters, }) => { if (loading) { return (
-
Loading problems...
+
+ {hasActiveFilters + ? "Loading filtered problems..." + : "Loading problems..."} +
); } @@ -34,7 +39,7 @@ const Body = ({ return (
- + { const PROBLEMS_PER_PAGE = 50; + // Check if any filters are active + const hasActiveFilters = useMemo(() => { + return !!(filters.company || filters.timePeriod || filters.difficulty); + }, [filters]); + useEffect(() => { const loadProblems = async () => { setLoading(true); try { + // ALWAYS pass filters to API - backend will ignore empty ones const data = await fetchProblems(currentPage, PROBLEMS_PER_PAGE, filters); setProblems(data); setError(null); // Estimate total pages based on response if (data.length < PROBLEMS_PER_PAGE) { - setTotalPages(currentPage); + setTotalPages(currentPage); // This is the last page } else { - setTotalPages(currentPage + 1); + setTotalPages(currentPage + 1); // There might be more pages } } catch (err) { setError("Failed to fetch problems. Please try again later."); @@ -41,10 +47,12 @@ const Main = () => { }; loadProblems(); - }, [currentPage, filters]); + }, [currentPage, filters]); // Re-fetch when page OR filters change - // Extract unique company names from problems + // Extract unique company names from ALL problems (initial load for dropdown) const companies = useMemo(() => { + // We need to load companies separately or keep the existing approach + // For now, let's keep the current implementation const companySet = new Set(); problems.forEach((problem) => { if (problem.companies) { @@ -63,7 +71,6 @@ const Main = () => { const handlePageChange = (page) => { setCurrentPage(page); - // Scroll to top when page changes window.scrollTo({ top: 0, behavior: 'smooth' }); }; @@ -82,6 +89,7 @@ const Main = () => { currentPage={currentPage} totalPages={totalPages} onPageChange={handlePageChange} + hasActiveFilters={hasActiveFilters} />
); diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js index 5de0095..86e3ce2 100644 --- a/src/client/src/components/problems/ProblemGrid.js +++ b/src/client/src/components/problems/ProblemGrid.js @@ -1,58 +1,27 @@ -import React, { useMemo } from "react"; +import React from "react"; import ProblemCard from "./ProblemCard"; import "../../styles/components/ProblemGrid.css"; -const ProblemGrid = ({ problems, filters }) => { - const filteredProblems = useMemo(() => { - if (!filters.company && !filters.timePeriod && !filters.difficulty) { - return problems; - } +const ProblemGrid = ({ problems, hasActiveFilters }) => { - return problems.filter((problem) => { - // Company filter - if ( - filters.company && - (!problem.companies || !problem.companies[filters.company]) - ) { - return false; - } - - // Time period filter - only apply if both company and time period are selected - if (filters.company && filters.timePeriod) { - if ( - !problem.companies?.[filters.company]?.includes(filters.timePeriod) - ) { - return false; - } - } - - // Difficulty filter - if ( - filters.difficulty && - problem.difficulty !== Number(filters.difficulty) - ) { - return false; - } - - return true; - }); - }, [problems, filters]); - - if (filteredProblems.length === 0) { + if (problems.length === 0) { return (

No problems found matching your criteria.

+ {hasActiveFilters && ( +

Try adjusting your filters or clearing them to see all problems.

+ )}
); } return (
- {filteredProblems.map((problem) => ( + {problems.map((problem) => ( ))}
); }; -export default ProblemGrid; +export default ProblemGrid; \ No newline at end of file diff --git a/src/client/src/services/api.js b/src/client/src/services/api.js index b57069a..762d1c6 100644 --- a/src/client/src/services/api.js +++ b/src/client/src/services/api.js @@ -10,13 +10,13 @@ export const fetchProblems = async (page = 1, limit = 50, filters = {}) => { // Add filter parameters if they exist if (filters.company) { - params.append('companies', filters.company); + params.append('company', filters.company); } if (filters.difficulty) { - params.append('difficulties', filters.difficulty); + params.append('difficulty', filters.difficulty); } if (filters.timePeriod) { - params.append('tags', filters.timePeriod); + params.append('tag', filters.timePeriod); } const response = await fetch(`${API_BASE_URL}/problems?${params}`); From 9f5a6d859883a0713075b8030b3d980f572148e8 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sun, 12 Oct 2025 16:01:59 +0530 Subject: [PATCH 13/30] List implementation --- src/client/src/App.js | 2 +- src/client/src/components/layout/Body.js | 11 +- src/client/src/components/layout/Main.js | 5 +- .../src/components/layout/ViewToggle.js | 25 +++ .../src/components/problems/ProblemGrid.js | 21 ++- .../src/components/problems/ProblemList.js | 53 +++++++ .../src/styles/components/ProblemCard.css | 60 +++---- .../src/styles/components/ProblemGrid.css | 12 +- .../src/styles/components/ProblemList.css | 146 ++++++++++++++++++ src/client/src/styles/layout/Body.css | 15 +- src/client/src/styles/layout/ViewToggle.css | 28 ++++ 11 files changed, 325 insertions(+), 53 deletions(-) create mode 100644 src/client/src/components/layout/ViewToggle.js create mode 100644 src/client/src/components/problems/ProblemList.js create mode 100644 src/client/src/styles/components/ProblemList.css create mode 100644 src/client/src/styles/layout/ViewToggle.css diff --git a/src/client/src/App.js b/src/client/src/App.js index 10f3213..23f2ce2 100644 --- a/src/client/src/App.js +++ b/src/client/src/App.js @@ -14,7 +14,7 @@ function App() { } /> } /> -
+ {/*
*/}
); diff --git a/src/client/src/components/layout/Body.js b/src/client/src/components/layout/Body.js index 3359d5c..b8db1a2 100644 --- a/src/client/src/components/layout/Body.js +++ b/src/client/src/components/layout/Body.js @@ -12,6 +12,8 @@ const Body = ({ totalPages, onPageChange, hasActiveFilters, + currentView, + onViewChange }) => { if (loading) { return ( @@ -39,7 +41,12 @@ const Body = ({ return (
- + { }); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); + const [currentView, setCurrentView] = useState('list'); // s states 'list' or 'grid' const PROBLEMS_PER_PAGE = 50; @@ -51,8 +52,6 @@ const Main = () => { // Extract unique company names from ALL problems (initial load for dropdown) const companies = useMemo(() => { - // We need to load companies separately or keep the existing approach - // For now, let's keep the current implementation const companySet = new Set(); problems.forEach((problem) => { if (problem.companies) { @@ -90,6 +89,8 @@ const Main = () => { totalPages={totalPages} onPageChange={handlePageChange} hasActiveFilters={hasActiveFilters} + currentView={currentView} + onViewChange={setCurrentView} />
); diff --git a/src/client/src/components/layout/ViewToggle.js b/src/client/src/components/layout/ViewToggle.js new file mode 100644 index 0000000..723edf7 --- /dev/null +++ b/src/client/src/components/layout/ViewToggle.js @@ -0,0 +1,25 @@ +import React from "react"; +import "../../styles/layout/ViewToggle.css"; + +const ViewToggle = ({ currentView, onViewChange }) => { + return ( +
+ + +
+ ); +}; + +export default ViewToggle; \ No newline at end of file diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js index 86e3ce2..bacee98 100644 --- a/src/client/src/components/problems/ProblemGrid.js +++ b/src/client/src/components/problems/ProblemGrid.js @@ -1,9 +1,10 @@ import React from "react"; import ProblemCard from "./ProblemCard"; +import ProblemList from "./ProblemList"; +import ViewToggle from "../layout/ViewToggle"; import "../../styles/components/ProblemGrid.css"; -const ProblemGrid = ({ problems, hasActiveFilters }) => { - +const ProblemGrid = ({ problems, hasActiveFilters, currentView, onViewChange }) => { if (problems.length === 0) { return (
@@ -16,10 +17,18 @@ const ProblemGrid = ({ problems, hasActiveFilters }) => { } return ( -
- {problems.map((problem) => ( - - ))} +
+ + + {currentView === 'grid' ? ( +
+ {problems.map((problem) => ( + + ))} +
+ ) : ( + + )}
); }; diff --git a/src/client/src/components/problems/ProblemList.js b/src/client/src/components/problems/ProblemList.js new file mode 100644 index 0000000..5381d78 --- /dev/null +++ b/src/client/src/components/problems/ProblemList.js @@ -0,0 +1,53 @@ +import React from "react"; +import { Link } from "react-router-dom"; +import { + getDifficultyText, + getDifficultyClass, +} from "../../constants/difficulty"; +import "../../styles/components/ProblemList.css"; + +const ProblemList = ({ problems }) => { + if (problems.length === 0) { + return ( +
+

No problems found matching your criteria.

+
+ ); + } + + return ( +
+
+ ID + Problem Name + Difficulty + Acceptance +
+
+ {problems.map((problem) => ( + + ))} +
+
+ ); +}; + +const ProblemListItem = ({ problem }) => { + const difficultyText = getDifficultyText(problem.difficulty); + const difficultyClass = getDifficultyClass(problem.difficulty); + + return ( +
+
{problem.id}
+
+ {problem.title} +
+
+ {difficultyText} +
+
{problem.acceptance}%
+
+ ); +}; + +export default ProblemList; \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemCard.css b/src/client/src/styles/components/ProblemCard.css index 97027f8..1b18551 100644 --- a/src/client/src/styles/components/ProblemCard.css +++ b/src/client/src/styles/components/ProblemCard.css @@ -2,7 +2,7 @@ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); border-radius: 12px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); - padding: 1.75rem; + padding: 1.25rem; /* Reduced from 1.75rem */ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); border: 1px solid rgba(255, 255, 255, 0.8); position: relative; @@ -22,8 +22,8 @@ } .problem-card:hover { - transform: translateY(-4px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + transform: translateY(-2px); /* Reduced from -4px */ + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); /* Reduced shadow */ } .problem-card:hover::before { @@ -34,16 +34,16 @@ display: flex; justify-content: space-between; align-items: flex-start; - margin-bottom: 1.25rem; + margin-bottom: 1rem; /* Reduced from 1.25rem */ gap: 1rem; } .problem-header h3 { margin: 0; - font-size: 1.25rem; + font-size: 1.1rem; /* Slightly smaller */ flex: 1; font-weight: 600; - line-height: 1.4; + line-height: 1.3; /* Tighter line height */ } .problem-header a { @@ -79,9 +79,9 @@ } .difficulty { - padding: 0.4rem 1rem; + padding: 0.3rem 0.8rem; /* Slightly smaller */ border-radius: 20px; - font-size: 0.8rem; + font-size: 0.75rem; /* Smaller font */ font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; @@ -110,9 +110,9 @@ .problem-stats { display: flex; - gap: 1.5rem; - margin-bottom: 1.25rem; - font-size: 0.9rem; + gap: 1rem; /* Reduced from 1.5rem */ + margin-bottom: 1rem; /* Reduced from 1.25rem */ + font-size: 0.85rem; /* Slightly smaller */ } .problem-stats span { @@ -148,16 +148,16 @@ .problem-companies { border-top: 1px solid #e2e8f0; - padding-top: 1.25rem; - margin-top: 1rem; + padding-top: 1rem; /* Reduced from 1.25rem */ + margin-top: 0.75rem; /* Reduced from 1rem */ } .problem-companies small { display: block; - margin-bottom: 0.75rem; + margin-bottom: 0.5rem; /* Reduced from 0.75rem */ color: #718096; font-weight: 600; - font-size: 0.8rem; + font-size: 0.75rem; /* Smaller */ text-transform: uppercase; letter-spacing: 0.5px; } @@ -165,17 +165,17 @@ .company-tags { display: flex; flex-wrap: wrap; - gap: 0.6rem; + gap: 0.5rem; /* Reduced from 0.6rem */ } .company-tag { background: linear-gradient(135deg, #ffffff, #f7fafc); - padding: 0.5rem 1rem; + padding: 0.4rem 0.8rem; /* Reduced padding */ border-radius: 10px; - font-size: 0.8rem; + font-size: 0.75rem; /* Smaller */ display: flex; align-items: center; - gap: 0.4rem; + gap: 0.3rem; /* Reduced gap */ border: 1px solid #e2e8f0; transition: all 0.2s ease; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); @@ -185,7 +185,7 @@ .company-tag:hover { transform: translateY(-1px); - box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); /* Reduced shadow */ border-color: #ffa116; background: linear-gradient(135deg, #fffaf0, #fffbeb); } @@ -196,7 +196,7 @@ } .recent-indicator { - font-size: 0.7rem; + font-size: 0.65rem; /* Smaller */ animation: pulse 2s infinite; } @@ -214,18 +214,18 @@ /* Responsive Design */ @media (max-width: 768px) { .problem-card { - padding: 1.25rem; - margin: 0.5rem; + padding: 1rem; /* Reduced from 1.25rem */ + margin: 0.25rem; /* Reduced from 0.5rem */ } .problem-header { flex-direction: column; align-items: flex-start; - gap: 0.75rem; + gap: 0.5rem; /* Reduced from 0.75rem */ } .problem-header h3 { - font-size: 1.1rem; + font-size: 1rem; /* Smaller on mobile */ padding-right: 0; } @@ -235,7 +235,7 @@ .problem-stats { flex-direction: column; - gap: 0.5rem; + gap: 0.25rem; /* Reduced from 0.5rem */ } .problem-stats span::before { @@ -243,12 +243,12 @@ } .company-tags { - gap: 0.4rem; + gap: 0.3rem; /* Reduced from 0.4rem */ } .company-tag { - padding: 0.4rem 0.8rem; - font-size: 0.75rem; + padding: 0.3rem 0.6rem; /* Smaller on mobile */ + font-size: 0.7rem; /* Smaller on mobile */ } } @@ -256,7 +256,7 @@ @keyframes cardEntrance { from { opacity: 0; - transform: translateY(20px); + transform: translateY(10px); /* Reduced from 20px */ } to { opacity: 1; diff --git a/src/client/src/styles/components/ProblemGrid.css b/src/client/src/styles/components/ProblemGrid.css index ec54e5d..9381372 100644 --- a/src/client/src/styles/components/ProblemGrid.css +++ b/src/client/src/styles/components/ProblemGrid.css @@ -1,21 +1,27 @@ +.problem-container { + margin-bottom: 1rem; +} + .problem-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 1.5rem; - padding: 1rem 0; + gap: 1rem; + padding: 0.5rem 0; } .no-problems { text-align: center; - padding: 2rem; + padding: 1.5rem; background: white; border-radius: 8px; color: #666; + margin: 1rem 0; } /* Responsive adjustments */ @media (max-width: 640px) { .problem-grid { grid-template-columns: 1fr; + gap: 0.75rem; } } \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemList.css b/src/client/src/styles/components/ProblemList.css new file mode 100644 index 0000000..d1765c5 --- /dev/null +++ b/src/client/src/styles/components/ProblemList.css @@ -0,0 +1,146 @@ +.problem-list { + background: white; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + overflow: hidden; + margin: 0.5rem 0; +} + +.list-header { + display: grid; + grid-template-columns: 80px 1fr 120px 100px; + gap: 1rem; + padding: 0.75rem 1.5rem; + background: #f8fafc; + border-bottom: 1px solid #e2e8f0; + font-weight: 600; + color: #4a5568; + font-size: 0.9rem; + align-items: center; +} + +/* Explicit alignment for each column */ +.header-id { + text-align: left; + justify-self: start; +} + +.header-title { + text-align: left; + justify-self: start; +} + +.header-difficulty { + text-align: center; + justify-self: center; +} + +.header-acceptance { + text-align: center; + justify-self: center; +} + +.list-content { + max-height: 400px; + overflow-y: auto; +} + +.problem-list-item { + display: grid; + grid-template-columns: 80px 1fr 120px 100px; + gap: 1rem; + padding: 0.75rem 1.5rem; + border-bottom: 1px solid #f1f5f9; + transition: background-color 0.2s ease; + align-items: center; +} + +.problem-list-item:hover { + background: #f7fafc; +} + +.problem-list-item:last-child { + border-bottom: none; +} + +/* Explicit alignment for each data cell */ +.problem-id { + color: #666; + font-weight: 500; + font-size: 0.9rem; + text-align: left; + justify-self: start; +} + +.problem-title { + font-weight: 500; + text-align: left; + justify-self: start; +} + +.problem-title a { + color: #2d3748; + text-decoration: none; + transition: color 0.2s ease; + display: block; + width: 100%; +} + +.problem-title a:hover { + color: #0066cc; +} + +.problem-difficulty { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.8rem; + font-weight: 500; + text-align: center; + text-transform: uppercase; + justify-self: center; +} + +.problem-acceptance { + color: #666; + font-size: 0.9rem; + text-align: center; + justify-self: center; +} + +.problem-difficulty.easy { + background: #e7f6e7; + color: #2cbb5d; +} + +.problem-difficulty.medium { + background: #fff7e6; + color: #ffa116; +} + +.problem-difficulty.hard { + background: #ffe6e6; + color: #ff375f; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .list-header { + grid-template-columns: 60px 1fr 100px; + padding: 0.75rem 1rem; + } + + .problem-list-item { + grid-template-columns: 60px 1fr 100px; + padding: 0.75rem 1rem; + } + + .header-acceptance, + .problem-acceptance { + display: none; + } + + .problem-difficulty { + font-size: 0.75rem; + padding: 0.2rem 0.5rem; + } +} \ No newline at end of file diff --git a/src/client/src/styles/layout/Body.css b/src/client/src/styles/layout/Body.css index c98c329..913a059 100644 --- a/src/client/src/styles/layout/Body.css +++ b/src/client/src/styles/layout/Body.css @@ -1,20 +1,22 @@ .body { flex: 1; - padding: 2rem 0; + padding: 0.5rem 0; background-color: #f5f5f5; + min-height: auto; } .body-content { max-width: 1200px; margin: 0 auto; padding: 0 1rem; + min-height: auto; } .loading { display: flex; justify-content: center; align-items: center; - min-height: 400px; + min-height: 200px; } .loading-spinner { @@ -26,7 +28,7 @@ display: flex; justify-content: center; align-items: center; - min-height: 400px; + min-height: 200px; } .error-message { @@ -46,9 +48,4 @@ .error-message button:hover { background-color: #c82333; -} - -/* Add to styles/layout/Body.css */ -.body-content { - min-height: 60vh; -} +} \ No newline at end of file diff --git a/src/client/src/styles/layout/ViewToggle.css b/src/client/src/styles/layout/ViewToggle.css new file mode 100644 index 0000000..262796a --- /dev/null +++ b/src/client/src/styles/layout/ViewToggle.css @@ -0,0 +1,28 @@ +.view-toggle { + display: flex; + gap: 0.5rem; + margin-bottom: 1.5rem; + justify-content: flex-end; +} + +.toggle-btn { + padding: 0.5rem 1rem; + border: 1px solid #e2e8f0; + background: white; + color: #4a5568; + border-radius: 6px; + cursor: pointer; + transition: all 0.2s ease; + font-size: 0.9rem; +} + +.toggle-btn:hover { + background: #f7fafc; + border-color: #cbd5e0; +} + +.toggle-btn.active { + background: #0066cc; + color: white; + border-color: #0066cc; +} \ No newline at end of file From 7a9995c4cae18690539351eadf76b0f218071212 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sun, 12 Oct 2025 16:15:53 +0530 Subject: [PATCH 14/30] Fixed List CSS --- src/client/src/App.js | 2 - src/client/src/components/layout/Footer.js | 14 ---- .../src/components/problems/ProblemGrid.js | 4 +- .../src/components/problems/ProblemList.js | 8 +-- .../src/styles/components/ProblemGrid.css | 7 ++ .../src/styles/components/ProblemList.css | 69 ++++++++++++------- src/client/src/styles/layout/Body.css | 8 +++ src/client/src/styles/layout/Footer.css | 64 ----------------- 8 files changed, 66 insertions(+), 110 deletions(-) delete mode 100644 src/client/src/components/layout/Footer.js delete mode 100644 src/client/src/styles/layout/Footer.css diff --git a/src/client/src/App.js b/src/client/src/App.js index 23f2ce2..b0381e8 100644 --- a/src/client/src/App.js +++ b/src/client/src/App.js @@ -3,7 +3,6 @@ import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import Main from "./components/layout/Main"; import ProblemPage from "./components/problems/ProblemPage"; import Header from "./components/layout/Header"; -import Footer from "./components/layout/Footer"; function App() { return ( @@ -14,7 +13,6 @@ function App() { } /> } /> - {/*
*/}
); diff --git a/src/client/src/components/layout/Footer.js b/src/client/src/components/layout/Footer.js deleted file mode 100644 index 1f46ddf..0000000 --- a/src/client/src/components/layout/Footer.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from "react"; -import "../../styles/layout/Footer.css"; - -const Footer = () => { - return ( -
-
-

Created by Shadow Lord

-
-
- ); -}; - -export default Footer; diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js index bacee98..c6a8e9d 100644 --- a/src/client/src/components/problems/ProblemGrid.js +++ b/src/client/src/components/problems/ProblemGrid.js @@ -27,7 +27,9 @@ const ProblemGrid = ({ problems, hasActiveFilters, currentView, onViewChange }) ))}
) : ( - +
+ +
)}
); diff --git a/src/client/src/components/problems/ProblemList.js b/src/client/src/components/problems/ProblemList.js index 5381d78..a08eeee 100644 --- a/src/client/src/components/problems/ProblemList.js +++ b/src/client/src/components/problems/ProblemList.js @@ -24,20 +24,20 @@ const ProblemList = ({ problems }) => { Acceptance
- {problems.map((problem) => ( - + {problems.map((problem, index) => ( + ))}
); }; -const ProblemListItem = ({ problem }) => { +const ProblemListItem = ({ problem, index }) => { const difficultyText = getDifficultyText(problem.difficulty); const difficultyClass = getDifficultyClass(problem.difficulty); return ( -
+
{problem.id}
{problem.title} diff --git a/src/client/src/styles/components/ProblemGrid.css b/src/client/src/styles/components/ProblemGrid.css index 9381372..7eeadfb 100644 --- a/src/client/src/styles/components/ProblemGrid.css +++ b/src/client/src/styles/components/ProblemGrid.css @@ -1,5 +1,6 @@ .problem-container { margin-bottom: 1rem; + padding-bottom: 0; } .problem-grid { @@ -18,6 +19,12 @@ margin: 1rem 0; } +/* Ensure list view takes only needed space */ +.problem-list-container { + margin-bottom: 0; + padding-bottom: 0; +} + /* Responsive adjustments */ @media (max-width: 640px) { .problem-grid { diff --git a/src/client/src/styles/components/ProblemList.css b/src/client/src/styles/components/ProblemList.css index d1765c5..59e4c2c 100644 --- a/src/client/src/styles/components/ProblemList.css +++ b/src/client/src/styles/components/ProblemList.css @@ -1,3 +1,4 @@ +/* styles/components/ProblemList.css */ .problem-list { background: white; border-radius: 8px; @@ -12,37 +13,24 @@ gap: 1rem; padding: 0.75rem 1.5rem; background: #f8fafc; - border-bottom: 1px solid #e2e8f0; + border-bottom: 2px solid #e2e8f0; font-weight: 600; color: #4a5568; font-size: 0.9rem; align-items: center; } -/* Explicit alignment for each column */ -.header-id { - text-align: left; - justify-self: start; -} - -.header-title { +/* Left align all headers explicitly */ +.header-id, +.header-title, +.header-difficulty, +.header-acceptance { text-align: left; justify-self: start; } -.header-difficulty { - text-align: center; - justify-self: center; -} - -.header-acceptance { - text-align: center; - justify-self: center; -} - .list-content { - max-height: 400px; - overflow-y: auto; + min-height: auto; } .problem-list-item { @@ -53,17 +41,29 @@ border-bottom: 1px solid #f1f5f9; transition: background-color 0.2s ease; align-items: center; + min-height: 60px; +} + +/* Alternate background colors for rows */ +.problem-list-item:nth-child(even) { + background-color: #fafbfc; +} + +.problem-list-item:nth-child(odd) { + background-color: #ffffff; } .problem-list-item:hover { - background: #f7fafc; + background: #f0f7ff !important; /* Override alternate colors on hover */ + border-left: 3px solid #0066cc; + margin-left: -3px; } .problem-list-item:last-child { border-bottom: none; } -/* Explicit alignment for each data cell */ +/* Left align all content cells */ .problem-id { color: #666; font-weight: 500; @@ -97,29 +97,38 @@ font-weight: 500; text-align: center; text-transform: uppercase; - justify-self: center; + justify-self: start; /* Changed to left align */ + width: fit-content; } .problem-acceptance { color: #666; font-size: 0.9rem; - text-align: center; - justify-self: center; + text-align: left; /* Changed to left align */ + justify-self: start; } .problem-difficulty.easy { background: #e7f6e7; color: #2cbb5d; + border: 1px solid #c8e6c9; } .problem-difficulty.medium { background: #fff7e6; color: #ffa116; + border: 1px solid #ffe0b2; } .problem-difficulty.hard { background: #ffe6e6; color: #ff375f; + border: 1px solid #ffcdd2; +} + +/* Ensure no extra space when empty */ +.problem-list:empty { + display: none; } /* Responsive Design */ @@ -143,4 +152,14 @@ font-size: 0.75rem; padding: 0.2rem 0.5rem; } +} + +/* Enhanced hover effects */ +.problem-list-item { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.problem-list-item:hover { + transform: translateX(4px); + box-shadow: 2px 0 8px rgba(0, 102, 204, 0.1); } \ No newline at end of file diff --git a/src/client/src/styles/layout/Body.css b/src/client/src/styles/layout/Body.css index 913a059..a1c8ffa 100644 --- a/src/client/src/styles/layout/Body.css +++ b/src/client/src/styles/layout/Body.css @@ -1,3 +1,4 @@ +/* styles/layout/Body.css */ .body { flex: 1; padding: 0.5rem 0; @@ -10,6 +11,8 @@ margin: 0 auto; padding: 0 1rem; min-height: auto; + /* Ensure no extra padding at bottom */ + padding-bottom: 0; } .loading { @@ -48,4 +51,9 @@ .error-message button:hover { background-color: #c82333; +} + +/* Remove any bottom margin from the last element in body */ +.body-content > *:last-child { + margin-bottom: 0; } \ No newline at end of file diff --git a/src/client/src/styles/layout/Footer.css b/src/client/src/styles/layout/Footer.css deleted file mode 100644 index 9e9425a..0000000 --- a/src/client/src/styles/layout/Footer.css +++ /dev/null @@ -1,64 +0,0 @@ -.footer { - background: #1a1a1a; - color: white; - padding: 1.5rem 0; - margin-top: auto; - border-top: 1px solid #2d2d2d; -} - -.footer-content { - max-width: 1200px; - margin: 0 auto; - padding: 0 2rem; - text-align: center; -} - -.footer p { - margin: 0; - font-size: 0.95rem; - color: #a0a0a0; - font-weight: 400; - letter-spacing: 0.5px; - transition: color 0.2s ease; -} - -.footer p:hover { - color: #d0d0d0; -} - -/* Optional: Add a subtle top border accent */ -.footer { - position: relative; -} - -.footer::before { - content: ''; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 100px; - height: 2px; - background: linear-gradient(90deg, transparent, #ffa116, transparent); -} - -/* Responsive Design */ -@media (max-width: 768px) { - .footer { - padding: 1.25rem 0; - } - - .footer-content { - padding: 0 1rem; - } - - .footer p { - font-size: 0.9rem; - } -} - -@media (max-width: 480px) { - .footer p { - font-size: 0.85rem; - } -} \ No newline at end of file From ca01a212f19d2378931682e7cb5cae2ec7596723 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sun, 12 Oct 2025 21:43:34 +0530 Subject: [PATCH 15/30] Added tag filtering --- src/Backend/Operations/DataProvider.cs | 1 + src/Backend/Operations/ProblemFilter.cs | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Backend/Operations/DataProvider.cs b/src/Backend/Operations/DataProvider.cs index 56c22e1..8ed9d78 100644 --- a/src/Backend/Operations/DataProvider.cs +++ b/src/Backend/Operations/DataProvider.cs @@ -78,6 +78,7 @@ private async Task LoadLatestDataAsync() } lastLoadedTime = DateTime.UtcNow; + results = results.OrderBy(p => int.TryParse(p.id, out int id) ? id : -1).ToList(); problemsCache = results.ToDictionary(p => p.id, StringComparer.OrdinalIgnoreCase); this.logger.LogInformation($"Loaded {problemsCache.Count} problems from Cosmos DB at {lastLoadedTime}"); break; diff --git a/src/Backend/Operations/ProblemFilter.cs b/src/Backend/Operations/ProblemFilter.cs index 7aa7077..c8d9535 100644 --- a/src/Backend/Operations/ProblemFilter.cs +++ b/src/Backend/Operations/ProblemFilter.cs @@ -22,12 +22,13 @@ public ProblemFilter(int skip, int limit, List? companies, List filteredProblems = problems; // TODO: Add tags filtering logic with company - if (companies != null && companies.Count > 0) + if ((companies != null && companies.Count > 0) || (tags != null && tags.Count > 0)) { filteredProblems = filteredProblems.Where( p => p.companies != null && - p.companies.Keys.Any( - c => this.companies.Contains(c, StringComparer.OrdinalIgnoreCase))).ToList(); + p.companies.Any(kv => + (this.companies == null || this.companies.Count== 0 || this.companies.Contains(kv.Key, StringComparer.OrdinalIgnoreCase)) && + kv.Value.Any(t => this.tags == null || this.tags.Count == 0 || this.tags.Contains(t, StringComparer.OrdinalIgnoreCase)))).ToList(); } if (difficulties != null && difficulties.Count > 0) From 997c8fbb1e7103570c9bc1daf44c6b2eb942fc40 Mon Sep 17 00:00:00 2001 From: Ayush Behera Date: Fri, 17 Oct 2025 00:37:21 +0530 Subject: [PATCH 16/30] Refactoring Solution --- .gitignore | 3 +- src/Backend/AppContext.cs | 19 ---- src/Backend/Backend.csproj | 4 +- src/Backend/Backend.csproj.user | 6 ++ src/Backend/Controllers/ProblemsController.cs | 21 +++-- src/Backend/Filters/IFilter.cs | 9 ++ .../{Operations => Filters}/ProblemFilter.cs | 22 ++--- src/Backend/Models/Internal/Problem.cs | 0 src/Backend/Models/Public/Problem.cs | 1 - src/Backend/Operations/DataProvider.cs | 88 ++++--------------- src/Backend/Operations/IFilter.cs | 7 -- src/Backend/Program.cs | 42 +++++++-- src/Backend/appsettings.json | 6 +- src/Common/Cache/BaseCache.cs | 71 +++++++++++++++ src/Common/Cache/ICache.cs | 42 +++++++++ src/Common/Cache/ProblemCache.cs | 77 ++++++++++++++++ src/Common/Common.csproj | 10 ++- src/Common/Constants/CacheConstants.cs | 13 +++ .../Constants/ConfigurationConstants.cs | 19 ++++ src/Common/Enums/CosmosContainerEnum.cs | 13 +++ .../Factories/CosmosContainerFactory.cs | 48 ++++++++++ .../Factories/ICosmosContainerFactory.cs | 10 +++ .../Models/Miscellaneous/ContainerDetails.cs | 20 +++++ .../Public => Common/Models}/QueryParam.cs | 0 src/Common/Program.cs | 9 -- src/Common/Repositories/IProblemRepository.cs | 9 ++ src/Common/Repositories/ProblemRepository.cs | 37 ++++++++ src/Synchronizer/Synchronizer.csproj | 4 +- 28 files changed, 464 insertions(+), 146 deletions(-) delete mode 100644 src/Backend/AppContext.cs create mode 100644 src/Backend/Backend.csproj.user create mode 100644 src/Backend/Filters/IFilter.cs rename src/Backend/{Operations => Filters}/ProblemFilter.cs (50%) delete mode 100644 src/Backend/Models/Internal/Problem.cs delete mode 100644 src/Backend/Models/Public/Problem.cs delete mode 100644 src/Backend/Operations/IFilter.cs create mode 100644 src/Common/Cache/BaseCache.cs create mode 100644 src/Common/Cache/ICache.cs create mode 100644 src/Common/Cache/ProblemCache.cs create mode 100644 src/Common/Constants/CacheConstants.cs create mode 100644 src/Common/Constants/ConfigurationConstants.cs create mode 100644 src/Common/Enums/CosmosContainerEnum.cs create mode 100644 src/Common/Factories/CosmosContainerFactory.cs create mode 100644 src/Common/Factories/ICosmosContainerFactory.cs create mode 100644 src/Common/Models/Miscellaneous/ContainerDetails.cs rename src/{Backend/Models/Public => Common/Models}/QueryParam.cs (100%) delete mode 100644 src/Common/Program.cs create mode 100644 src/Common/Repositories/IProblemRepository.cs create mode 100644 src/Common/Repositories/ProblemRepository.cs diff --git a/.gitignore b/.gitignore index 6020982..c661872 100644 --- a/.gitignore +++ b/.gitignore @@ -197,4 +197,5 @@ dependency-reduced-pom.xml README.html *.iml .idea -.exercism \ No newline at end of file +.exercism +/src/.vs diff --git a/src/Backend/AppContext.cs b/src/Backend/AppContext.cs deleted file mode 100644 index 8d97ddf..0000000 --- a/src/Backend/AppContext.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Backend.Operations; -using Microsoft.Azure.Cosmos; - -namespace Backend -{ - public class AppContext - { - public readonly Operations.DataProvider dataProvider; - public readonly IConfiguration configuration; - public readonly ILogger logger; - - public AppContext(CosmosClient cosmosClient, IConfiguration configuration, ILogger logger) - { - this.dataProvider = new Operations.DataProvider(cosmosClient, configuration, logger); - this.configuration = configuration; - this.logger = logger; - } - } -} \ No newline at end of file diff --git a/src/Backend/Backend.csproj b/src/Backend/Backend.csproj index 15e787a..e8f47c1 100644 --- a/src/Backend/Backend.csproj +++ b/src/Backend/Backend.csproj @@ -8,10 +8,10 @@ - + - + diff --git a/src/Backend/Backend.csproj.user b/src/Backend/Backend.csproj.user new file mode 100644 index 0000000..9ff5820 --- /dev/null +++ b/src/Backend/Backend.csproj.user @@ -0,0 +1,6 @@ + + + + https + + \ No newline at end of file diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index 7803a9c..7be6d7c 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -1,21 +1,24 @@ namespace Backend.Controllers { + using Backend.Filters; using Backend.Models.Public; using Backend.Operations; + using Common.Models; using Microsoft.AspNetCore.Mvc; - using ProblemPublicModel = Common.Models.Problem; [ApiController] [Route("api")] public class ProblemsController : ControllerBase { - private AppContext appContext; private readonly ILogger logger; private readonly IConfiguration configuration; - public ProblemsController(AppContext appContext, ILogger logger, IConfiguration configuration) + private readonly DataProvider dataProvider; + public ProblemsController(ILogger logger, + DataProvider dataProvider, + IConfiguration configuration) { - this.appContext = appContext; this.logger = logger; + this.dataProvider = dataProvider; this.configuration = configuration; } @@ -28,23 +31,23 @@ public ActionResult GetHome() [HttpGet] [Route("problems")] - public async Task>> GetProblems( + public async Task>> GetProblems( [FromQuery(Name = QueryParam.Skip)] int skip = 0, [FromQuery(Name = QueryParam.Limit)] int limit = 50, [FromQuery(Name = QueryParam.Company)] List? companies = null, - [FromQuery(Name = QueryParam.Difficulty)] List? difficulties = null, + [FromQuery(Name = QueryParam.Difficulty)] List? difficulties = null, [FromQuery(Name = QueryParam.Tag)] List? tags = null) { var filter = new ProblemFilter(skip, limit, companies, difficulties, tags); - var filteredProblems = await appContext.dataProvider.GetProblemsAsync(filter); + var filteredProblems = await dataProvider.GetProblemsAsync(filter); return Ok(filteredProblems); } [HttpGet] [Route("problems/{id}")] - public async Task> GetProblems(string id) + public async Task> GetProblems(string id) { - var problem = await appContext.dataProvider.GetProblemByIdAsync(id); + var problem = await dataProvider.GetProblemByIdAsync(id); if (problem != null) { return Ok(problem); diff --git a/src/Backend/Filters/IFilter.cs b/src/Backend/Filters/IFilter.cs new file mode 100644 index 0000000..91a29e5 --- /dev/null +++ b/src/Backend/Filters/IFilter.cs @@ -0,0 +1,9 @@ +using Common.Models; + +namespace Backend.Filters +{ + public interface IFilter + { + public List ApplyFilterAsync(List problems); + } +} \ No newline at end of file diff --git a/src/Backend/Operations/ProblemFilter.cs b/src/Backend/Filters/ProblemFilter.cs similarity index 50% rename from src/Backend/Operations/ProblemFilter.cs rename to src/Backend/Filters/ProblemFilter.cs index c8d9535..a4b66f5 100644 --- a/src/Backend/Operations/ProblemFilter.cs +++ b/src/Backend/Filters/ProblemFilter.cs @@ -1,39 +1,41 @@ -namespace Backend.Operations +using Common.Models; + +namespace Backend.Filters { public class ProblemFilter : IFilter { private int skip = 0; private int limit = 50; private List companies; - private List difficulties; + private List difficulties; private List tags; - public ProblemFilter(int skip, int limit, List? companies, List? difficulties, List? tags) + public ProblemFilter(int skip, int limit, List? companies, List? difficulties, List? tags) { this.skip = skip; this.limit = Math.Min(limit, 50); this.companies = companies ?? new List(); - this.difficulties = difficulties ?? new List(); + this.difficulties = difficulties ?? new List(); this.tags = tags ?? new List(); } - public List ApplyFilterAsync(List problems) + public List ApplyFilterAsync(List problems) { - List filteredProblems = problems; + List filteredProblems = problems; // TODO: Add tags filtering logic with company - if ((companies != null && companies.Count > 0) || (tags != null && tags.Count > 0)) + if (companies != null && companies.Count > 0 || tags != null && tags.Count > 0) { filteredProblems = filteredProblems.Where( p => p.companies != null && p.companies.Any(kv => - (this.companies == null || this.companies.Count== 0 || this.companies.Contains(kv.Key, StringComparer.OrdinalIgnoreCase)) && - kv.Value.Any(t => this.tags == null || this.tags.Count == 0 || this.tags.Contains(t, StringComparer.OrdinalIgnoreCase)))).ToList(); + (companies == null || companies.Count== 0 || companies.Contains(kv.Key, StringComparer.OrdinalIgnoreCase)) && + kv.Value.Any(t => tags == null || tags.Count == 0 || tags.Contains(t, StringComparer.OrdinalIgnoreCase)))).ToList(); } if (difficulties != null && difficulties.Count > 0) { - filteredProblems = filteredProblems.Where(p => this.difficulties.Contains(p.difficulty)).ToList(); + filteredProblems = filteredProblems.Where(p => difficulties.Contains(p.difficulty)).ToList(); } filteredProblems = filteredProblems.Skip(skip).Take(limit).ToList(); diff --git a/src/Backend/Models/Internal/Problem.cs b/src/Backend/Models/Internal/Problem.cs deleted file mode 100644 index e69de29..0000000 diff --git a/src/Backend/Models/Public/Problem.cs b/src/Backend/Models/Public/Problem.cs deleted file mode 100644 index 0f6f34b..0000000 --- a/src/Backend/Models/Public/Problem.cs +++ /dev/null @@ -1 +0,0 @@ -// Using Common.Models.Problem scehma \ No newline at end of file diff --git a/src/Backend/Operations/DataProvider.cs b/src/Backend/Operations/DataProvider.cs index 8ed9d78..c280dd1 100644 --- a/src/Backend/Operations/DataProvider.cs +++ b/src/Backend/Operations/DataProvider.cs @@ -1,24 +1,18 @@ namespace Backend.Operations { + using Backend.Filters; + using Common.Cache; + using Common.Constants; using Common.Models; - using Microsoft.Azure.Cosmos; public class DataProvider { - private const int RefreshIntervalInHours = 3; - private CosmosClient cosmosClient; - private readonly IConfiguration configuration; - ILogger logger; - private DateTime lastLoadedTime = DateTime.MinValue; - private Task backgroundRefreshTask; - private Dictionary problemsCache = new Dictionary(StringComparer.OrdinalIgnoreCase); - - public DataProvider(CosmosClient client, IConfiguration configuration, ILogger logger) + private ICache _problemCache; + private ILogger _logger; + public DataProvider([FromKeyedServices(CacheConstants.ProblemCacheKey)] ICache problemCache, ILogger logger) { - this.cosmosClient = client; - this.configuration = configuration; - this.logger = logger; - this.backgroundRefreshTask = Task.Run(() => this.StartBackgroundRefreshAsync(CancellationToken.None)); + _problemCache = problemCache; + _logger = logger; } public async Task> GetProblemsAsync(IFilter? filter = null) @@ -43,69 +37,17 @@ public async Task> GetProblemsAsync(IFilter? filter = null) private async Task> GetAllProblemsAsync() { - if (problemsCache.Count == 0) + if (_problemCache.Contains(CacheConstants.ProblemCacheKey)) { - await LoadLatestDataAsync(); - if (problemsCache.Count == 0) - { - this.logger.LogWarning("No problems found in the cache after loading data."); - } + _logger.LogInformation("Problem cache hit. Retrieving data from cache."); } - return problemsCache; - } - - private async Task LoadLatestDataAsync() - { - int maxRetries = 3; - for(int i = 0; i < maxRetries; i++) + else { - try - { - var dbId = configuration.GetValue("ApplicationSettings:CosmosDbDatabaseId"); - var containerId = configuration.GetValue("ApplicationSettings:CosmosDbContainerId"); - var db = cosmosClient.GetDatabase(dbId); - var container = db.GetContainer(containerId); - - var query = "SELECT * FROM c"; - var queryDefinition = new QueryDefinition(query); - var queryResultSetIterator = container.GetItemQueryIterator(queryDefinition); - - List results = new List(); - while (queryResultSetIterator.HasMoreResults) - { - var response = await queryResultSetIterator.ReadNextAsync(); - results.AddRange(response.Select(item => new Problem(item))); - } - - lastLoadedTime = DateTime.UtcNow; - results = results.OrderBy(p => int.TryParse(p.id, out int id) ? id : -1).ToList(); - problemsCache = results.ToDictionary(p => p.id, StringComparer.OrdinalIgnoreCase); - this.logger.LogInformation($"Loaded {problemsCache.Count} problems from Cosmos DB at {lastLoadedTime}"); - break; - } - catch (Exception ex) - { - this.logger.LogError($"Error loading data from Cosmos DB. {ex}"); - await Task.Delay(TimeSpan.FromSeconds(2 * (i + 1))); - } - } - } - - public async Task StartBackgroundRefreshAsync(CancellationToken cancellationToken) - { - while (!cancellationToken.IsCancellationRequested) - { - try - { - await LoadLatestDataAsync(); - } - catch (Exception ex) - { - this.logger.LogError($"Error during background data refresh: {ex}"); - } - - await Task.Delay(TimeSpan.FromHours(RefreshIntervalInHours), cancellationToken); + _logger.LogInformation("Problem cache miss. Loading data into cache."); + await _problemCache.Populate(); } + + return _problemCache.Get>(CacheConstants.ProblemCacheKey) ?? new Dictionary(StringComparer.OrdinalIgnoreCase); } } } \ No newline at end of file diff --git a/src/Backend/Operations/IFilter.cs b/src/Backend/Operations/IFilter.cs deleted file mode 100644 index 2a2780a..0000000 --- a/src/Backend/Operations/IFilter.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Backend.Operations -{ - public interface IFilter - { - public List ApplyFilterAsync(List problems); - } -} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index e2c1fe5..3c19749 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -1,9 +1,13 @@ namespace Backend; -using System.Data; using Backend.Operations; +using Common.Cache; +using Common.Constants; +using Common.Factories; +using Common.Repositories; using Microsoft.Azure.Cosmos; using Microsoft.Extensions.Logging.ApplicationInsights; +using System.Data; public class Program { @@ -33,6 +37,7 @@ private static void SetupLogging(ILoggingBuilder logging, IConfiguration configu public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); + var services = builder.Services; // Add services to the container. builder.Services.AddApplicationInsightsTelemetry(); @@ -61,14 +66,33 @@ public static void Main(string[] args) // Register AppContext as singleton var config = builder.Configuration; - var cosmosClient = new CosmosClient(config["ApplicationSettings:CosmosDbUri"], config["ApplicationSettings:CosmosDbPrimaryKey"]); - builder.Services.AddSingleton(s => - new AppContext( - cosmosClient, - builder.Configuration, - s.GetRequiredService>() - ) - ); + + #region Register Cosmos related services + services.AddSingleton(s => + { + var cosmosDbUri = config[ConfigurationConstants.CosmosDBUriKey]; + var cosmosDbAccountKey = config[ConfigurationConstants.CosmosDBAccountKey]; + if (string.IsNullOrEmpty(cosmosDbUri) || string.IsNullOrEmpty(cosmosDbAccountKey)) + { + throw new DataException("Cosmos DB configuration is missing or invalid."); + } + return new CosmosClient(cosmosDbUri, cosmosDbAccountKey); + }); + + services.AddTransient(); + #endregion + + #region Register Cache + services.AddKeyedSingleton(CacheConstants.ProblemCacheKey); + #endregion + + #region Register Repositories + services.AddTransient(); + #endregion + + #region Register Miscellaneous Services + services.AddTransient(); + #endregion var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Backend/appsettings.json b/src/Backend/appsettings.json index 9ee91c9..22c42e9 100644 --- a/src/Backend/appsettings.json +++ b/src/Backend/appsettings.json @@ -9,9 +9,9 @@ "Name": "leetcode-wrapper", "Version": "1.0.0", "CosmosDbUri": "https://lcw-cosmos.documents.azure.com:443/", - "CosmosDbPrimaryKey": "", - "CosmosDbDatabaseId": "LeetCodeWrapper", - "CosmosDbContainerId": "Problems" + "AccountKey": "", + "LCProject:DatabaseName": "LeetCodeWrapper", + "LCProject:ContainerName": "Problems" }, "ApplicationInsights": { "LogLevel": { diff --git a/src/Common/Cache/BaseCache.cs b/src/Common/Cache/BaseCache.cs new file mode 100644 index 0000000..5337506 --- /dev/null +++ b/src/Common/Cache/BaseCache.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; + +namespace Common.Cache +{ + public abstract class BaseCache : ICache + { + // Internal cache storage + protected readonly ConcurrentDictionary _cache = new(); + + // Represents a cache item with optional expiration + protected class CacheItem + { + public object? Value { get; set; } + public DateTime? Expiration { get; set; } + } + + public T? Get(string key) + { + if (_cache.TryGetValue(key, out var item)) + { + if (item.Expiration == null || item.Expiration > DateTime.UtcNow) + { + return item.Value is T value ? value : default; + } + // Item expired, remove it + _cache.TryRemove(key, out _); + } + return default; + } + + public void Set(string key, T value, TimeSpan? absoluteExpiration = null) + { + var expiration = absoluteExpiration.HasValue + ? DateTime.UtcNow.Add(absoluteExpiration.Value) + : (DateTime?)null; + + _cache[key] = new CacheItem + { + Value = value, + Expiration = expiration + }; + } + + public void Remove(string key) + { + _cache.TryRemove(key, out _); + } + + public bool Contains(string key) + { + if (_cache.TryGetValue(key, out var item)) + { + if (item.Expiration == null || item.Expiration > DateTime.UtcNow) + { + return true; + } + // Item expired, remove it + _cache.TryRemove(key, out _); + } + return false; + } + + /// + /// Populates the cache using a custom technique. + /// Override this method in derived classes for custom population logic. + /// + public abstract Task Populate(); + } +} \ No newline at end of file diff --git a/src/Common/Cache/ICache.cs b/src/Common/Cache/ICache.cs new file mode 100644 index 0000000..56d36d2 --- /dev/null +++ b/src/Common/Cache/ICache.cs @@ -0,0 +1,42 @@ +using System; + +namespace Common.Cache +{ + public interface ICache + { + /// + /// Gets a cached item by key. + /// + /// Type of the cached item. + /// The cache key. + /// The cached item, or default if not found. + T? Get(string key); + + /// + /// Adds or updates an item in the cache. + /// + /// Type of the item. + /// The cache key. + /// The value to cache. + /// Optional absolute expiration time. + void Set(string key, T value, TimeSpan? absoluteExpiration = null); + + /// + /// Removes an item from the cache. + /// + /// The cache key. + void Remove(string key); + + /// + /// Checks if a key exists in the cache. + /// + /// The cache key. + /// True if the key exists, otherwise false. + bool Contains(string key); + + /// + /// Populates the cache using a custom technique defined by the implementing class. + /// + Task Populate(); + } +} \ No newline at end of file diff --git a/src/Common/Cache/ProblemCache.cs b/src/Common/Cache/ProblemCache.cs new file mode 100644 index 0000000..37c2211 --- /dev/null +++ b/src/Common/Cache/ProblemCache.cs @@ -0,0 +1,77 @@ + +using Common.Constants; +using Common.Models; +using Common.Repositories; +using Microsoft.Azure.Cosmos; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace Common.Cache +{ + public class ProblemCache : BaseCache + { + private const int RefreshIntervalInHours = 3; + private readonly IConfiguration configuration; + private readonly IProblemRepository problemRepository; + ILogger logger; + private DateTime lastLoadedTime = DateTime.MinValue; + private Dictionary problemsCache = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public ProblemCache(IProblemRepository problemRepository, IConfiguration configuration, ILogger logger) + { + this.problemRepository = problemRepository; + this.configuration = configuration; + this.logger = logger; + Task.Run(() => this.StartBackgroundRefreshAsync(CancellationToken.None)); + } + + public async override Task Populate() + { + await LoadLatestDataAsync(); + // Ideally we should just make a call to redi here and return the data. + Set>(CacheConstants.ProblemCacheKey, problemsCache); + return; + } + + + private async Task LoadLatestDataAsync() + { + int maxRetries = 3; + for (int i = 0; i < maxRetries; i++) + { + try + { + var results = await problemRepository.GetAllProblemsAsync(); + lastLoadedTime = DateTime.UtcNow; + results = results.OrderBy(p => int.TryParse(p.id, out int id) ? id : -1).ToList(); + problemsCache = results.ToDictionary(p => p.id, StringComparer.OrdinalIgnoreCase); + this.logger.LogInformation($"Loaded {problemsCache.Count} problems from Cosmos DB at {lastLoadedTime}"); + break; + } + catch (Exception ex) + { + this.logger.LogError($"Error loading data from Cosmos DB. {ex}"); + await Task.Delay(TimeSpan.FromSeconds(2 * (i + 1))); + } + } + } + + private async Task StartBackgroundRefreshAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + try + { + await LoadLatestDataAsync(); + } + catch (Exception ex) + { + this.logger.LogError($"Error during background data refresh: {ex}"); + } + + await Task.Delay(TimeSpan.FromHours(RefreshIntervalInHours), cancellationToken); + } + } + + } +} diff --git a/src/Common/Common.csproj b/src/Common/Common.csproj index 206b89a..844bdc5 100644 --- a/src/Common/Common.csproj +++ b/src/Common/Common.csproj @@ -1,10 +1,18 @@  - Exe + Library net8.0 enable enable + + + + + + + + diff --git a/src/Common/Constants/CacheConstants.cs b/src/Common/Constants/CacheConstants.cs new file mode 100644 index 0000000..28f2b63 --- /dev/null +++ b/src/Common/Constants/CacheConstants.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Constants +{ + public class CacheConstants + { + public const string ProblemCacheKey = "ProblemCache"; + } +} diff --git a/src/Common/Constants/ConfigurationConstants.cs b/src/Common/Constants/ConfigurationConstants.cs new file mode 100644 index 0000000..bb21455 --- /dev/null +++ b/src/Common/Constants/ConfigurationConstants.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Constants +{ + public static class ConfigurationConstants + { + #region Application Settings + public const string CosmosDBUriKey = "ApplicationSettings:CosmosDbUri"; + public const string CosmosDBAccountKey = "ApplicationSettings:AccountKey"; + public const string ApplicationSettings = "ApplicationSettings"; + public const string LCProjectContainerNameKey = "LCProject:ContainerName"; + public const string LCProjectDatabaseNameKey = "LCProject:DatabaseName"; + #endregion + } +} diff --git a/src/Common/Enums/CosmosContainerEnum.cs b/src/Common/Enums/CosmosContainerEnum.cs new file mode 100644 index 0000000..538f048 --- /dev/null +++ b/src/Common/Enums/CosmosContainerEnum.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Enums +{ + public enum CosmosContainerEnum + { + ProblemsContainer + } +} diff --git a/src/Common/Factories/CosmosContainerFactory.cs b/src/Common/Factories/CosmosContainerFactory.cs new file mode 100644 index 0000000..d526140 --- /dev/null +++ b/src/Common/Factories/CosmosContainerFactory.cs @@ -0,0 +1,48 @@ +using Common.Constants; +using Common.Enums; +using Common.Models.Miscellaneous; +using Microsoft.Azure.Cosmos; +using Microsoft.Extensions.Configuration; + +namespace Common.Factories +{ + public class CosmosContainerFactory : ICosmosContainerFactory + { + private CosmosClient _cosmosClient; + + private readonly IConfiguration _configuration; + + public CosmosContainerFactory(CosmosClient cosmosClient, IConfiguration configuration) + { + _cosmosClient = cosmosClient; + _configuration = configuration; + } + + public Container GetContainer(CosmosContainerEnum container) + { + var containerDetails = LoadContainerDetails(); + switch (container) + { + case CosmosContainerEnum.ProblemsContainer: + var dbId = containerDetails[container].DatabaseName; + var containerId = containerDetails[container].ContainerName; + var db = _cosmosClient.GetDatabase(dbId); + return db.GetContainer(containerId); + default: + throw new ArgumentOutOfRangeException(nameof(container), container, null); + } + } + + private Dictionary LoadContainerDetails() + { + var config = _configuration.GetSection(ConfigurationConstants.ApplicationSettings); + return new Dictionary + { + { + CosmosContainerEnum.ProblemsContainer, + new ContainerDetails(config[ConfigurationConstants.LCProjectDatabaseNameKey], config[ConfigurationConstants.LCProjectContainerNameKey]) + } + }; + } + } +} diff --git a/src/Common/Factories/ICosmosContainerFactory.cs b/src/Common/Factories/ICosmosContainerFactory.cs new file mode 100644 index 0000000..f177298 --- /dev/null +++ b/src/Common/Factories/ICosmosContainerFactory.cs @@ -0,0 +1,10 @@ +using Common.Enums; +using Microsoft.Azure.Cosmos; + +namespace Common.Factories +{ + public interface ICosmosContainerFactory + { + Container GetContainer(CosmosContainerEnum container); + } +} \ No newline at end of file diff --git a/src/Common/Models/Miscellaneous/ContainerDetails.cs b/src/Common/Models/Miscellaneous/ContainerDetails.cs new file mode 100644 index 0000000..9d3a630 --- /dev/null +++ b/src/Common/Models/Miscellaneous/ContainerDetails.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Models.Miscellaneous +{ + public class ContainerDetails + { + public string DatabaseName { get; set; } + public string ContainerName { get; set; } + + public ContainerDetails(string databaseName, string containerName) + { + DatabaseName = databaseName; + ContainerName = containerName; + } + } +} diff --git a/src/Backend/Models/Public/QueryParam.cs b/src/Common/Models/QueryParam.cs similarity index 100% rename from src/Backend/Models/Public/QueryParam.cs rename to src/Common/Models/QueryParam.cs diff --git a/src/Common/Program.cs b/src/Common/Program.cs deleted file mode 100644 index 3095376..0000000 --- a/src/Common/Program.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Common; - -public class Program -{ - static void Main(string[] args) - { - Console.WriteLine("Hello, World!"); - } -} diff --git a/src/Common/Repositories/IProblemRepository.cs b/src/Common/Repositories/IProblemRepository.cs new file mode 100644 index 0000000..17abe1b --- /dev/null +++ b/src/Common/Repositories/IProblemRepository.cs @@ -0,0 +1,9 @@ +using Common.Models; + +namespace Common.Repositories +{ + public interface IProblemRepository + { + Task> GetAllProblemsAsync(); + } +} \ No newline at end of file diff --git a/src/Common/Repositories/ProblemRepository.cs b/src/Common/Repositories/ProblemRepository.cs new file mode 100644 index 0000000..8ca5d29 --- /dev/null +++ b/src/Common/Repositories/ProblemRepository.cs @@ -0,0 +1,37 @@ +using Common.Enums; +using Common.Factories; +using Common.Models; +using Microsoft.Azure.Cosmos; +using Microsoft.Extensions.Logging; + +namespace Common.Repositories +{ + public class ProblemRepository : IProblemRepository + { + private readonly Container _problemContainer; + private readonly ILogger _logger; + + public ProblemRepository(ICosmosContainerFactory cosmosContainerFactory, + ILogger logger) + { + _problemContainer = cosmosContainerFactory.GetContainer(CosmosContainerEnum.ProblemsContainer); + _logger = logger; + } + + public async Task> GetAllProblemsAsync() + { + var query = "SELECT * FROM c"; + var queryDefinition = new QueryDefinition(query); + var queryResultSetIterator = _problemContainer.GetItemQueryIterator(queryDefinition); + List results = new List(); + while (queryResultSetIterator.HasMoreResults) + { + var response = await queryResultSetIterator.ReadNextAsync(); + results.AddRange(response.Select(item => new Problem(item))); + } + results = results.OrderBy(p => int.TryParse(p.id, out int id) ? id : -1).ToList(); + _logger.LogInformation($"Retrieved {results.Count} problems from Cosmos DB."); + return results; + } + } +} diff --git a/src/Synchronizer/Synchronizer.csproj b/src/Synchronizer/Synchronizer.csproj index 72a2484..36a7b00 100644 --- a/src/Synchronizer/Synchronizer.csproj +++ b/src/Synchronizer/Synchronizer.csproj @@ -8,8 +8,8 @@ - - + + From d50def76df6a695c1cc4973e680abedc5f693104 Mon Sep 17 00:00:00 2001 From: Ayush Behera Date: Fri, 17 Oct 2025 01:13:13 +0530 Subject: [PATCH 17/30] Adding milestones --- src/Backend/Backend.csproj | 6 +++++- src/Backend/Docs/NextPlanOfAction.md | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/Backend/Docs/NextPlanOfAction.md diff --git a/src/Backend/Backend.csproj b/src/Backend/Backend.csproj index e8f47c1..1a02122 100644 --- a/src/Backend/Backend.csproj +++ b/src/Backend/Backend.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -18,4 +18,8 @@ + + + + diff --git a/src/Backend/Docs/NextPlanOfAction.md b/src/Backend/Docs/NextPlanOfAction.md new file mode 100644 index 0000000..c782975 --- /dev/null +++ b/src/Backend/Docs/NextPlanOfAction.md @@ -0,0 +1,8 @@ +## Next Plans +1. **Create functions for async updates for Jobs backend** +2. **Integrate Redis for fast retreival** +3. **Notification System upon new Job post arrival** + 3.1. **Will require integration to some async framework.** + 3.2. **Using Servicebus can be costly might use some other message broker** +4. **Custom tracing framework using Prometheus and Grafana (learning purpose)** +5. **Make the system scalable enough to register a new scraping source easily** \ No newline at end of file From dd1427d6450066a558dac4b2e707aa26442965be Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 18 Oct 2025 01:45:49 +0530 Subject: [PATCH 18/30] merged master and resolved conflicts --- src/Backend/AppContext.cs | 23 ------------------- .../Controllers/JobSearchController.cs | 19 +++++++++------ src/Backend/Controllers/ProblemsController.cs | 2 +- src/Backend/Operations/AIEngine.cs | 2 +- src/Backend/Operations/GSEngine.cs | 8 +++---- src/Backend/Program.cs | 3 +++ src/Common/Models/GSResult.cs | 2 +- src/Common/Models/{ => Public}/QueryParam.cs | 2 +- .../Internal => Common/Models}/ScrappedJob.cs | 4 ++-- 9 files changed, 24 insertions(+), 41 deletions(-) delete mode 100644 src/Backend/AppContext.cs rename src/Common/Models/{ => Public}/QueryParam.cs (89%) rename src/{Backend/Models/Internal => Common/Models}/ScrappedJob.cs (92%) diff --git a/src/Backend/AppContext.cs b/src/Backend/AppContext.cs deleted file mode 100644 index 6f3ddfa..0000000 --- a/src/Backend/AppContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Backend.Operations; -using Microsoft.Azure.Cosmos; - -namespace Backend -{ - public class AppContext - { - public readonly DataProvider dataProvider; - public readonly IConfiguration configuration; - public readonly ILogger logger; - public readonly GSEngine gsEngine; - public readonly AIEngine aiEngine; - - public AppContext(DataProvider _dataProvider, GSEngine _gsEngine, AIEngine _aiEngine, IConfiguration configuration, ILogger logger) - { - this.dataProvider = _dataProvider; - this.gsEngine = _gsEngine; - this.configuration = configuration; - this.logger = logger; - this.aiEngine = _aiEngine; - } - } -} \ No newline at end of file diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index 707a73c..e73d3f9 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -1,28 +1,33 @@ namespace Backend.Controllers { + using Backend.Operations; using Microsoft.AspNetCore.Mvc; + using Common.Models; [ApiController] [Route("api")] public class JobSearchController : ControllerBase { - private readonly AppContext appContext; - public JobSearchController(AppContext appContext) + private readonly GSEngine gsEngine; + private readonly AIEngine aiEngine; + private readonly ILogger logger; + public JobSearchController(GSEngine gsEngine, AIEngine aiEngine, ILogger logger) { - this.appContext = appContext; + this.gsEngine = gsEngine; + this.aiEngine = aiEngine; + this.logger = logger; } [HttpGet] [Route("/jobs/search")] - public async Task>> SearchJobs( + public async Task>> SearchJobs( [FromQuery(Name = "q")] string query, [FromQuery(Name = "d")] int nPreviousDays) { - var gsEngine = this.appContext.gsEngine; - var result = await gsEngine.SearchAndScrapeJobsAsync(query, nPreviousDays); + var result = await this.gsEngine.SearchAndScrapeJobsAsync(query, nPreviousDays); if (result != null) { - var levels = await this.appContext.aiEngine.GetJobLevelAsync(result); + var levels = await this.aiEngine.GetJobLevelAsync(result); foreach (var level in levels) { var job = result.FirstOrDefault(j => j.jobId == level.Key); diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index 7be6d7c..fd63bf0 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -1,7 +1,7 @@ namespace Backend.Controllers { using Backend.Filters; - using Backend.Models.Public; + using Common.Models.Public; using Backend.Operations; using Common.Models; using Microsoft.AspNetCore.Mvc; diff --git a/src/Backend/Operations/AIEngine.cs b/src/Backend/Operations/AIEngine.cs index 538c783..dfcb015 100644 --- a/src/Backend/Operations/AIEngine.cs +++ b/src/Backend/Operations/AIEngine.cs @@ -7,7 +7,7 @@ namespace Backend.Operations using Azure.AI.Projects; using Azure.AI.Agents.Persistent; using System.Diagnostics; - using Backend.Models.Internal; + using Common.Models; using Newtonsoft.Json; public class AIEngine diff --git a/src/Backend/Operations/GSEngine.cs b/src/Backend/Operations/GSEngine.cs index 1bb28e9..5acc8d1 100644 --- a/src/Backend/Operations/GSEngine.cs +++ b/src/Backend/Operations/GSEngine.cs @@ -1,8 +1,6 @@ namespace Backend.Operations { - using System.Data.Common; - using Backend.Models.Internal; - using Microsoft.Azure.Cosmos.Linq; + using Common.Models; using Newtonsoft.Json; public class GSEngine { @@ -61,14 +59,14 @@ public async Task> SearchAndScrapeJobsAsync(string query, int return allJobs; } - public async Task SearchRawUrlAsync(string url) + public async Task SearchRawUrlAsync(string url) { try { var response = await httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); var content = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(content); + return JsonConvert.DeserializeObject(content); } catch (Exception ex) { diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 3c19749..43c7f8b 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -94,6 +94,9 @@ public static void Main(string[] args) services.AddTransient(); #endregion + services.AddSingleton(); + services.AddSingleton(); + var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Common/Models/GSResult.cs b/src/Common/Models/GSResult.cs index e89800e..c1882c0 100644 --- a/src/Common/Models/GSResult.cs +++ b/src/Common/Models/GSResult.cs @@ -1,4 +1,4 @@ -namespace Backend.Models.Public +namespace Common.Models { public class GSResult { diff --git a/src/Common/Models/QueryParam.cs b/src/Common/Models/Public/QueryParam.cs similarity index 89% rename from src/Common/Models/QueryParam.cs rename to src/Common/Models/Public/QueryParam.cs index 340cc74..85010b8 100644 --- a/src/Common/Models/QueryParam.cs +++ b/src/Common/Models/Public/QueryParam.cs @@ -1,4 +1,4 @@ -namespace Backend.Models.Public +namespace Common.Models.Public { public class QueryParam { diff --git a/src/Backend/Models/Internal/ScrappedJob.cs b/src/Common/Models/ScrappedJob.cs similarity index 92% rename from src/Backend/Models/Internal/ScrappedJob.cs rename to src/Common/Models/ScrappedJob.cs index 9759d83..21caa68 100644 --- a/src/Backend/Models/Internal/ScrappedJob.cs +++ b/src/Common/Models/ScrappedJob.cs @@ -1,4 +1,4 @@ -namespace Backend.Models.Internal +namespace Common.Models { public class ScrappedJob { @@ -12,7 +12,7 @@ public class ScrappedJob public List tags { get; set; } = new List(); public ScrappedJob() { } - public ScrappedJob(Models.Public.Item item, DateTime scrappedTime) + public ScrappedJob(Item item, DateTime scrappedTime) { this.title = item.title; this.displayLink = item.displayLink; From efb9d23c242ddb5be3a38015b4624d8abf05ca0c Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 18 Oct 2025 11:31:13 +0530 Subject: [PATCH 19/30] UI Fixes for minimalistic compact design --- .../src/styles/components/FilterOptions.css | 146 ++++++++---------- .../src/styles/components/ProblemGrid.css | 20 +-- .../src/styles/components/ProblemList.css | 112 +++++++++----- src/client/src/styles/layout/Body.css | 17 +- src/client/src/styles/layout/Header.css | 107 ++++++------- src/client/src/styles/layout/Nav.css | 20 ++- src/client/src/styles/layout/ViewToggle.css | 19 ++- 7 files changed, 242 insertions(+), 199 deletions(-) diff --git a/src/client/src/styles/components/FilterOptions.css b/src/client/src/styles/components/FilterOptions.css index a5ff42d..0037ce7 100644 --- a/src/client/src/styles/components/FilterOptions.css +++ b/src/client/src/styles/components/FilterOptions.css @@ -1,9 +1,10 @@ +/* styles/components/FilterOptions.css */ .filter-options { display: flex; - gap: 2rem; + gap: 1rem; /* Reduced from 2rem */ align-items: flex-end; flex-wrap: wrap; - padding: 1.5rem 0; + padding: 0.75rem 0; /* Reduced from 1.5rem */ position: relative; z-index: 10; } @@ -11,101 +12,98 @@ .filter-group { display: flex; flex-direction: column; - gap: 0.75rem; - min-width: 220px; + gap: 0.4rem; /* Reduced from 0.75rem */ + min-width: 180px; /* Reduced from 220px */ position: relative; - z-index: 1000; /* Ensure high z-index for dropdown */ + z-index: 1000; } .filter-group label { - font-size: 0.85rem; + font-size: 0.75rem; /* Reduced from 0.85rem */ color: #4a5568; font-weight: 600; text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.3px; /* Reduced from 0.5px */ + margin-bottom: 0; } .filter-group select { - padding: 0.75rem 1rem; - border: 2px solid #e2e8f0; - border-radius: 10px; + padding: 0.5rem 0.75rem; /* Reduced from 0.75rem 1rem */ + border: 1px solid #e2e8f0; /* Reduced from 2px */ + border-radius: 6px; /* Reduced from 10px */ background-color: white; - font-size: 0.95rem; + font-size: 0.85rem; /* Reduced from 0.95rem */ color: #2d3748; cursor: pointer; - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + transition: all 0.2s ease; /* Simplified transition */ appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%234a5568'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E"); background-repeat: no-repeat; - background-position: right 1rem center; - background-size: 1rem; - padding-right: 2.5rem; + background-position: right 0.75rem center; /* Adjusted */ + background-size: 0.875rem; /* Reduced from 1rem */ + padding-right: 2rem; /* Reduced from 2.5rem */ font-weight: 500; position: relative; - z-index: 1001; /* Higher z-index for the select element */ + z-index: 1001; + height: 36px; /* Fixed height for consistency */ } -/* Ensure dropdown options are visible */ .filter-group select option { background: white; color: #2d3748; - padding: 12px 16px; - font-size: 0.95rem; + padding: 8px 12px; /* Reduced from 12px 16px */ + font-size: 0.85rem; /* Reduced from 0.95rem */ border-bottom: 1px solid #f1f5f9; position: relative; - z-index: 10000; /* Very high z-index for options */ -} - -.filter-group select option:hover { - background-color: #f0f7ff; - color: #0066cc; -} - -.filter-group select option:checked { - background-color: #0066cc; - color: white; + z-index: 10000; } .filter-group select:focus { outline: none; border-color: #0066cc; - box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1); + box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.1); /* Reduced from 3px */ background-color: white; - z-index: 1002; /* Even higher when focused */ + z-index: 1002; } -/* Style the dropdown container */ -.filter-group select { - z-index: 1001; -} - -/* Ensure the dropdown appears above other elements */ -.filter-group { - position: relative; -} - -/* Fix for dropdown visibility */ -select { +/* Clear filters button - more compact */ +.clear-filters { + padding: 0.5rem 1rem; /* Reduced from 0.75rem 1.5rem */ + background: linear-gradient(135deg, #dc3545, #c82333); + color: white; + border: none; + border-radius: 6px; /* Reduced from 10px */ + cursor: pointer; + font-size: 0.8rem; /* Reduced from 0.9rem */ + font-weight: 600; + height: 36px; /* Match select height */ + transition: all 0.2s ease; + text-transform: uppercase; + letter-spacing: 0.3px; /* Reduced from 0.5px */ + box-shadow: 0 1px 4px rgba(220, 53, 69, 0.3); /* Reduced shadow */ position: relative; + z-index: 100; + white-space: nowrap; } -/* Additional styles to ensure dropdown visibility */ -.filter-options * { - box-sizing: border-box; +.clear-filters:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 2px 6px rgba(220, 53, 69, 0.4); } -/* Company dropdown specific fixes */ -#company { - min-height: 48px; - max-height: 200px; /* Limit height if needed */ +.clear-filters:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; + box-shadow: none; } -/* Ensure the nav has proper z-index */ +/* Ensure the nav has proper z-index but minimal padding */ .nav { background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); border-bottom: 1px solid #e2e8f0; padding: 0; - box-shadow: 0 2px 20px rgba(0, 0, 0, 0.06); + box-shadow: 0 1px 8px rgba(0, 0, 0, 0.04); /* Reduced shadow */ position: relative; z-index: 100; } @@ -118,31 +116,17 @@ select { z-index: 101; } -/* Clear filters button */ -.clear-filters { - padding: 0.75rem 1.5rem; - background: linear-gradient(135deg, #dc3545, #c82333); - color: white; - border: none; - border-radius: 10px; - cursor: pointer; - font-size: 0.9rem; - font-weight: 600; - height: fit-content; - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - text-transform: uppercase; - letter-spacing: 0.5px; - box-shadow: 0 2px 8px rgba(220, 53, 69, 0.3); - position: relative; - z-index: 100; +/* Compact layout for filter groups */ +.filter-group select { + min-height: 36px; /* Reduced from 48px */ } -/* Responsive adjustments */ +/* Responsive adjustments - more compact */ @media (max-width: 768px) { .filter-options { flex-direction: column; - gap: 1.25rem; - padding: 1.25rem 0; + gap: 0.75rem; /* Reduced from 1.25rem */ + padding: 0.5rem 0; /* Reduced from 1.25rem */ z-index: 1000; } @@ -150,6 +134,7 @@ select { width: 100%; min-width: unset; z-index: 1001; + gap: 0.3rem; /* Reduced gap */ } .filter-group select { @@ -159,22 +144,21 @@ select { .clear-filters { width: 100%; - margin-top: 0.5rem; + margin-top: 0.25rem; /* Reduced from 0.5rem */ z-index: 100; } + + .filter-group label { + font-size: 0.7rem; /* Even smaller on mobile */ + } } /* Emergency fix - if dropdown still doesn't show */ .filter-group select { - transform: translateZ(0); /* Force hardware acceleration */ -} - -/* Alternative: Increase the size of the dropdown */ -.filter-group select { - min-height: 48px; + transform: translateZ(0); } -/* Make sure the dropdown has enough space */ +/* Make sure the dropdown has enough space but compact */ .filter-group { margin-bottom: 0; } \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemGrid.css b/src/client/src/styles/components/ProblemGrid.css index 7eeadfb..4680458 100644 --- a/src/client/src/styles/components/ProblemGrid.css +++ b/src/client/src/styles/components/ProblemGrid.css @@ -1,26 +1,28 @@ .problem-container { - margin-bottom: 1rem; + margin-bottom: 0.5rem; padding-bottom: 0; } .problem-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - gap: 1rem; - padding: 0.5rem 0; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 0.75rem; + padding: 0.25rem 0; } .no-problems { text-align: center; - padding: 1.5rem; + padding: 1rem; background: white; - border-radius: 8px; + border-radius: 6px; color: #666; - margin: 1rem 0; + margin: 0.75rem 0; + font-size: 0.9rem; } -/* Ensure list view takes only needed space */ +/* Remove space between toggle and list */ .problem-list-container { + margin-top: 0; /* Ensure no top margin */ margin-bottom: 0; padding-bottom: 0; } @@ -29,6 +31,6 @@ @media (max-width: 640px) { .problem-grid { grid-template-columns: 1fr; - gap: 0.75rem; + gap: 0.5rem; } } \ No newline at end of file diff --git a/src/client/src/styles/components/ProblemList.css b/src/client/src/styles/components/ProblemList.css index 59e4c2c..4045e4f 100644 --- a/src/client/src/styles/components/ProblemList.css +++ b/src/client/src/styles/components/ProblemList.css @@ -1,22 +1,22 @@ /* styles/components/ProblemList.css */ .problem-list { background: white; - border-radius: 8px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + border-radius: 6px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); overflow: hidden; - margin: 0.5rem 0; + margin: 0.25rem 0; } .list-header { display: grid; - grid-template-columns: 80px 1fr 120px 100px; - gap: 1rem; - padding: 0.75rem 1.5rem; + grid-template-columns: 60px 1fr 90px 80px; /* Reduced column widths */ + gap: 0.75rem; /* Reduced from 1rem */ + padding: 0.5rem 1rem; /* Reduced padding */ background: #f8fafc; - border-bottom: 2px solid #e2e8f0; + border-bottom: 1px solid #e2e8f0; /* Thinner border */ font-weight: 600; color: #4a5568; - font-size: 0.9rem; + font-size: 0.8rem; /* Smaller font */ align-items: center; } @@ -35,18 +35,18 @@ .problem-list-item { display: grid; - grid-template-columns: 80px 1fr 120px 100px; - gap: 1rem; - padding: 0.75rem 1.5rem; + grid-template-columns: 60px 1fr 90px 80px; /* Reduced column widths */ + gap: 0.75rem; /* Reduced from 1rem */ + padding: 0.5rem 1rem; /* Reduced from 0.75rem 1.5rem */ border-bottom: 1px solid #f1f5f9; transition: background-color 0.2s ease; align-items: center; - min-height: 60px; + min-height: 44px; /* Reduced from 60px */ } /* Alternate background colors for rows */ .problem-list-item:nth-child(even) { - background-color: #fafbfc; + background-color: #fcfcfc; } .problem-list-item:nth-child(odd) { @@ -54,9 +54,9 @@ } .problem-list-item:hover { - background: #f0f7ff !important; /* Override alternate colors on hover */ - border-left: 3px solid #0066cc; - margin-left: -3px; + background: #f0f7ff !important; + border-left: 2px solid #0066cc; /* Thinner border */ + margin-left: -2px; } .problem-list-item:last-child { @@ -67,7 +67,7 @@ .problem-id { color: #666; font-weight: 500; - font-size: 0.9rem; + font-size: 0.8rem; /* Smaller font */ text-align: left; justify-self: start; } @@ -84,6 +84,8 @@ transition: color 0.2s ease; display: block; width: 100%; + font-size: 0.85rem; /* Smaller font */ + line-height: 1.3; } .problem-title a:hover { @@ -91,21 +93,23 @@ } .problem-difficulty { - padding: 0.25rem 0.75rem; - border-radius: 12px; - font-size: 0.8rem; - font-weight: 500; + padding: 0.2rem 0.5rem; /* Reduced padding */ + border-radius: 8px; /* Smaller radius */ + font-size: 0.7rem; /* Smaller font */ + font-weight: 600; text-align: center; text-transform: uppercase; - justify-self: start; /* Changed to left align */ + justify-self: start; width: fit-content; + min-width: 60px; /* Ensure consistent width */ } .problem-acceptance { color: #666; - font-size: 0.9rem; - text-align: left; /* Changed to left align */ + font-size: 0.8rem; /* Smaller font */ + text-align: left; justify-self: start; + font-weight: 500; } .problem-difficulty.easy { @@ -131,16 +135,30 @@ display: none; } -/* Responsive Design */ +/* Compact hover effects */ +.problem-list-item { + transition: all 0.2s ease; +} + +.problem-list-item:hover { + transform: translateX(2px); /* Reduced movement */ + box-shadow: 1px 0 4px rgba(0, 102, 204, 0.1); +} + +/* Responsive Design - More compact */ @media (max-width: 768px) { .list-header { - grid-template-columns: 60px 1fr 100px; - padding: 0.75rem 1rem; + grid-template-columns: 50px 1fr 70px; + padding: 0.4rem 0.75rem; + font-size: 0.75rem; + gap: 0.5rem; } .problem-list-item { - grid-template-columns: 60px 1fr 100px; - padding: 0.75rem 1rem; + grid-template-columns: 50px 1fr 70px; + padding: 0.4rem 0.75rem; + gap: 0.5rem; + min-height: 40px; } .header-acceptance, @@ -149,17 +167,35 @@ } .problem-difficulty { + font-size: 0.65rem; + padding: 0.15rem 0.4rem; + min-width: 55px; + } + + .problem-title a { + font-size: 0.8rem; + } + + .problem-id { font-size: 0.75rem; - padding: 0.2rem 0.5rem; } } -/* Enhanced hover effects */ -.problem-list-item { - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); -} - -.problem-list-item:hover { - transform: translateX(4px); - box-shadow: 2px 0 8px rgba(0, 102, 204, 0.1); +/* Ultra-compact for very small screens */ +@media (max-width: 480px) { + .list-header { + padding: 0.3rem 0.5rem; + gap: 0.4rem; + } + + .problem-list-item { + padding: 0.3rem 0.5rem; + gap: 0.4rem; + min-height: 36px; + } + + .problem-difficulty { + min-width: 50px; + font-size: 0.6rem; + } } \ No newline at end of file diff --git a/src/client/src/styles/layout/Body.css b/src/client/src/styles/layout/Body.css index a1c8ffa..a184219 100644 --- a/src/client/src/styles/layout/Body.css +++ b/src/client/src/styles/layout/Body.css @@ -1,7 +1,7 @@ /* styles/layout/Body.css */ .body { flex: 1; - padding: 0.5rem 0; + padding: 0.125rem 0; /* Further reduced */ background-color: #f5f5f5; min-height: auto; } @@ -9,9 +9,8 @@ .body-content { max-width: 1200px; margin: 0 auto; - padding: 0 1rem; + padding: 0 0.75rem; /* Reduced from 1rem */ min-height: auto; - /* Ensure no extra padding at bottom */ padding-bottom: 0; } @@ -19,34 +18,36 @@ display: flex; justify-content: center; align-items: center; - min-height: 200px; + min-height: 150px; /* Reduced */ } .loading-spinner { color: #666; - font-size: 1.2rem; + font-size: 1rem; /* Smaller */ } .error { display: flex; justify-content: center; align-items: center; - min-height: 200px; + min-height: 150px; /* Reduced */ } .error-message { color: #dc3545; text-align: center; + font-size: 0.9rem; /* Smaller */ } .error-message button { - margin-top: 1rem; - padding: 0.5rem 1rem; + margin-top: 0.75rem; + padding: 0.4rem 0.8rem; background-color: #dc3545; color: white; border: none; border-radius: 4px; cursor: pointer; + font-size: 0.8rem; } .error-message button:hover { diff --git a/src/client/src/styles/layout/Header.css b/src/client/src/styles/layout/Header.css index 7796726..fec5051 100644 --- a/src/client/src/styles/layout/Header.css +++ b/src/client/src/styles/layout/Header.css @@ -1,9 +1,10 @@ +/* styles/layout/Header.css */ .header { width: 100%; - background: linear-gradient(135deg, #1a1a1a 0%, #2d1b69 50%, #1a1a1a 100%); + background: linear-gradient(135deg, #1a1a1a 0%, #2d1b69 100%); color: white; - padding: 1.25rem 0; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); + padding: 0.75rem 0; /* Reduced from 1.25rem */ + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); /* Reduced shadow */ position: relative; overflow: hidden; border-bottom: 1px solid rgba(255, 255, 255, 0.1); @@ -17,9 +18,8 @@ right: 0; bottom: 0; background: - radial-gradient(circle at 20% 80%, rgba(255, 161, 22, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 20%, rgba(0, 102, 204, 0.1) 0%, transparent 50%), - radial-gradient(circle at 40% 40%, rgba(67, 160, 71, 0.05) 0%, transparent 50%); + radial-gradient(circle at 20% 80%, rgba(255, 161, 22, 0.08) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(0, 102, 204, 0.08) 0%, transparent 50%); pointer-events: none; } @@ -32,16 +32,16 @@ height: 1px; background: linear-gradient(90deg, transparent 0%, - rgba(255, 161, 22, 0.6) 25%, - rgba(0, 102, 204, 0.6) 50%, - rgba(255, 161, 22, 0.6) 75%, + rgba(255, 161, 22, 0.4) 25%, + rgba(0, 102, 204, 0.4) 50%, + rgba(255, 161, 22, 0.4) 75%, transparent 100%); } .header-content { max-width: 1200px; margin: 0 auto; - padding: 0 2rem; + padding: 0 1.5rem; /* Reduced from 2rem */ display: flex; align-items: center; justify-content: center; @@ -53,10 +53,10 @@ text-decoration: none; color: inherit; cursor: pointer; - transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: all 0.3s ease; /* Simplified transition */ position: relative; - padding: 0.5rem 1rem; - border-radius: 12px; + padding: 0.375rem 0.75rem; /* Reduced from 0.5rem 1rem */ + border-radius: 8px; /* Reduced from 12px */ } .header-link::before { @@ -66,15 +66,14 @@ left: 0; right: 0; bottom: 0; - background: linear-gradient(135deg, rgba(255, 161, 22, 0.1), rgba(0, 102, 204, 0.1)); - border-radius: 12px; + background: linear-gradient(135deg, rgba(255, 161, 22, 0.08), rgba(0, 102, 204, 0.08)); + border-radius: 8px; opacity: 0; - transition: opacity 0.3s ease; + transition: opacity 0.2s ease; } .header-link:hover { - transform: translateY(-2px); - text-shadow: 0 4px 12px rgba(255, 255, 255, 0.3); + transform: translateY(-1px); /* Reduced from -2px */ } .header-link:hover::before { @@ -87,7 +86,7 @@ .header h1 { margin: 0; - font-size: 2rem; + font-size: 1.5rem; /* Reduced from 2rem */ font-weight: 700; background: linear-gradient(135deg, #ffffff 0%, #ffa116 50%, #0099ff 100%); -webkit-background-clip: text; @@ -95,77 +94,68 @@ background-clip: text; text-align: center; line-height: 1.2; - letter-spacing: -0.5px; + letter-spacing: -0.25px; /* Reduced from -0.5px */ position: relative; - padding: 0.5rem 0; + padding: 0.25rem 0; /* Reduced from 0.5rem */ } .header h1::after { content: '🔍'; position: absolute; top: 50%; - right: -2rem; + right: -1.5rem; /* Reduced from -2rem */ transform: translateY(-50%); - font-size: 1.5rem; + font-size: 1.1rem; /* Reduced from 1.5rem */ opacity: 0.8; animation: float 3s ease-in-out infinite; } -/* Code-inspired decoration */ +/* Code-inspired decoration - made smaller */ .header-content::before { content: '{ }'; position: absolute; - left: 2rem; + left: 1.5rem; /* Reduced from 2rem */ top: 50%; transform: translateY(-50%); - font-size: 1.2rem; - color: rgba(255, 161, 22, 0.6); + font-size: 1rem; /* Reduced from 1.2rem */ + color: rgba(255, 161, 22, 0.5); /* More subtle */ font-family: 'Courier New', monospace; font-weight: bold; - opacity: 0.7; + opacity: 0.6; } .header-content::after { content: ''; position: absolute; - right: 2rem; + right: 1.5rem; /* Reduced from 2rem */ top: 50%; transform: translateY(-50%); - font-size: 1.2rem; - color: rgba(0, 102, 204, 0.6); + font-size: 1rem; /* Reduced from 1.2rem */ + color: rgba(0, 102, 204, 0.5); /* More subtle */ font-family: 'Courier New', monospace; font-weight: bold; - opacity: 0.7; + opacity: 0.6; } -/* Floating animation */ +/* Floating animation - more subtle */ @keyframes float { 0%, 100% { transform: translateY(-50%) rotate(0deg); } 50% { - transform: translateY(-50%) rotate(10deg); - } -} - -/* Glow effect on hover */ -@keyframes textGlow { - 0%, 100% { - text-shadow: 0 0 20px rgba(255, 255, 255, 0.3); - } - 50% { - text-shadow: 0 0 30px rgba(255, 161, 22, 0.5), 0 0 40px rgba(0, 102, 204, 0.3); + transform: translateY(-50%) rotate(5deg); /* Reduced rotation */ } } +/* Simplified glow effect */ .header-link:hover h1 { - animation: textGlow 2s ease-in-out infinite; + text-shadow: 0 2px 8px rgba(255, 255, 255, 0.2); } -/* Responsive Design */ +/* Responsive Design - More compact */ @media (max-width: 768px) { .header { - padding: 1rem 0; + padding: 0.5rem 0; /* Reduced from 1rem */ } .header-content { @@ -173,32 +163,36 @@ } .header h1 { - font-size: 1.5rem; + font-size: 1.25rem; /* Reduced from 1.5rem */ } .header h1::after { - right: -1.5rem; - font-size: 1.2rem; + right: -1.25rem; /* Reduced from -1.5rem */ + font-size: 1rem; /* Reduced from 1.2rem */ } .header-content::before, .header-content::after { - display: none; /* Hide code symbols on mobile */ + display: none; } } @media (max-width: 480px) { .header h1 { - font-size: 1.25rem; - letter-spacing: -0.25px; + font-size: 1.1rem; /* Reduced from 1.25rem */ + letter-spacing: -0.1px; } .header h1::after { - display: none; /* Hide emoji on very small screens */ + display: none; } .header-link { - padding: 0.25rem 0.5rem; + padding: 0.2rem 0.4rem; /* More compact */ + } + + .header-content { + padding: 0 0.75rem; } } @@ -218,12 +212,13 @@ .header-link:hover h1 { animation: none; + text-shadow: none; } } /* Dark theme optimization */ @media (prefers-color-scheme: dark) { .header { - background: linear-gradient(135deg, #0a0a0a 0%, #1a0f4d 50%, #0a0a0a 100%); + background: linear-gradient(135deg, #0a0a0a 0%, #1a0f4d 100%); } } \ No newline at end of file diff --git a/src/client/src/styles/layout/Nav.css b/src/client/src/styles/layout/Nav.css index 8905e40..9817eb4 100644 --- a/src/client/src/styles/layout/Nav.css +++ b/src/client/src/styles/layout/Nav.css @@ -1,11 +1,23 @@ +/* styles/layout/Nav.css */ .nav { - background-color: white; - border-bottom: 1px solid #e0e0e0; - padding: 1rem 0; + background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); + border-bottom: 1px solid #e2e8f0; + padding: 0; + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.04); + position: relative; + z-index: 100; + min-height: auto; } .nav-content { max-width: 1200px; margin: 0 auto; - padding: 0 1rem; + padding: 0 1.5rem; + position: relative; + z-index: 101; +} + +/* Remove any extra padding that might be adding space */ +.nav * { + box-sizing: border-box; } \ No newline at end of file diff --git a/src/client/src/styles/layout/ViewToggle.css b/src/client/src/styles/layout/ViewToggle.css index 262796a..eed7363 100644 --- a/src/client/src/styles/layout/ViewToggle.css +++ b/src/client/src/styles/layout/ViewToggle.css @@ -1,19 +1,19 @@ .view-toggle { display: flex; gap: 0.5rem; - margin-bottom: 1.5rem; + margin-bottom: 0.5rem; /* Reduced from 1.5rem */ justify-content: flex-end; } .toggle-btn { - padding: 0.5rem 1rem; + padding: 0.4rem 0.8rem; /* Slightly smaller */ border: 1px solid #e2e8f0; background: white; color: #4a5568; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; - font-size: 0.9rem; + font-size: 0.85rem; /* Slightly smaller */ } .toggle-btn:hover { @@ -25,4 +25,17 @@ background: #0066cc; color: white; border-color: #0066cc; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .view-toggle { + margin-bottom: 0.375rem; + gap: 0.375rem; + } + + .toggle-btn { + padding: 0.35rem 0.7rem; + font-size: 0.8rem; + } } \ No newline at end of file From 22570a2020458dbe7ff010ba60f7a3d8bba51979 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 18 Oct 2025 12:10:45 +0530 Subject: [PATCH 20/30] Added acustom hook to handle the storing and fetching from localstore --- .../src/components/hooks/useSolvedProblems.js | 74 +++++++++ src/client/src/components/layout/Body.js | 10 +- src/client/src/components/layout/Main.js | 8 +- .../src/components/problems/ProblemCard.js | 21 ++- .../src/components/problems/ProblemGrid.js | 19 ++- .../src/components/problems/ProblemList.js | 27 +++- .../src/styles/components/ProblemCard.css | 144 ++++++++++++++---- .../src/styles/components/ProblemList.css | 114 +++++++++++--- 8 files changed, 349 insertions(+), 68 deletions(-) create mode 100644 src/client/src/components/hooks/useSolvedProblems.js diff --git a/src/client/src/components/hooks/useSolvedProblems.js b/src/client/src/components/hooks/useSolvedProblems.js new file mode 100644 index 0000000..689d5eb --- /dev/null +++ b/src/client/src/components/hooks/useSolvedProblems.js @@ -0,0 +1,74 @@ +import { useState, useEffect } from 'react'; + +const useSolvedProblems = () => { + // Initialize state directly from localStorage using lazy initial state + const [solvedProblems, setSolvedProblems] = useState(() => { + try { + const stored = localStorage.getItem('leetcode-solved-problems'); + if (stored) { + const parsed = JSON.parse(stored); + return new Set(parsed); + } + } catch (error) { + console.error('Error loading solved problems from localStorage:', error); + } + return new Set(); + }); + + // Single useEffect for saving to localStorage + useEffect(() => { + try { + const array = Array.from(solvedProblems); + localStorage.setItem('leetcode-solved-problems', JSON.stringify(array)); + } catch (error) { + console.error('Error saving solved problems to localStorage:', error); + } + }, [solvedProblems]); + + const toggleSolved = (problemId) => { + setSolvedProblems(prev => { + const newSet = new Set(prev); + if (newSet.has(problemId)) { + newSet.delete(problemId); + } else { + newSet.add(problemId); + } + return newSet; + }); + }; + + const isSolved = (problemId) => { + return solvedProblems.has(problemId); + }; + + const markSolved = (problemId) => { + setSolvedProblems(prev => { + const newSet = new Set(prev); + newSet.add(problemId); + return newSet; + }); + }; + + const markUnsolved = (problemId) => { + setSolvedProblems(prev => { + const newSet = new Set(prev); + newSet.delete(problemId); + return newSet; + }); + }; + + const clearAllSolved = () => { + setSolvedProblems(new Set()); + }; + + return { + solvedProblems, + toggleSolved, + isSolved, + markSolved, + markUnsolved, + clearAllSolved + }; +}; + +export default useSolvedProblems; \ No newline at end of file diff --git a/src/client/src/components/layout/Body.js b/src/client/src/components/layout/Body.js index b8db1a2..acf92f0 100644 --- a/src/client/src/components/layout/Body.js +++ b/src/client/src/components/layout/Body.js @@ -13,7 +13,8 @@ const Body = ({ onPageChange, hasActiveFilters, currentView, - onViewChange + onViewChange, + solvedProblems, }) => { if (loading) { return ( @@ -41,11 +42,12 @@ const Body = ({ return (
- { @@ -15,7 +16,9 @@ const Main = () => { }); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); - const [currentView, setCurrentView] = useState('list'); // s states 'list' or 'grid' + const [currentView, setCurrentView] = useState('list'); + // Use the solved problems hook + const solvedProblems = useSolvedProblems(); const PROBLEMS_PER_PAGE = 50; @@ -48,7 +51,7 @@ const Main = () => { }; loadProblems(); - }, [currentPage, filters]); // Re-fetch when page OR filters change + }, [currentPage, filters]); // Extract unique company names from ALL problems (initial load for dropdown) const companies = useMemo(() => { @@ -91,6 +94,7 @@ const Main = () => { hasActiveFilters={hasActiveFilters} currentView={currentView} onViewChange={setCurrentView} + solvedProblems={solvedProblems} />
); diff --git a/src/client/src/components/problems/ProblemCard.js b/src/client/src/components/problems/ProblemCard.js index d715b53..369c5bd 100644 --- a/src/client/src/components/problems/ProblemCard.js +++ b/src/client/src/components/problems/ProblemCard.js @@ -14,9 +14,14 @@ const TIME_PERIOD_LABELS = { all: "All Time", }; -const ProblemCard = ({ problem }) => { +const ProblemCard = ({ problem, solvedProblems }) => { const difficultyText = getDifficultyText(problem.difficulty); const difficultyClass = getDifficultyClass(problem.difficulty); + const isSolved = solvedProblems.isSolved(problem.id); + + const handleCheckboxChange = () => { + solvedProblems.toggleSolved(problem.id); + }; const getTopCompanies = (companies) => { if (!companies) return []; @@ -41,7 +46,17 @@ const ProblemCard = ({ problem }) => { const topCompanies = getTopCompanies(problem.companies); return ( -
+
+ {/* Checkbox in top-right corner */} +
+ +
+

{problem.title} @@ -91,4 +106,4 @@ const ProblemCard = ({ problem }) => { ); }; -export default ProblemCard; +export default ProblemCard; \ No newline at end of file diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js index c6a8e9d..6b7b92c 100644 --- a/src/client/src/components/problems/ProblemGrid.js +++ b/src/client/src/components/problems/ProblemGrid.js @@ -4,7 +4,13 @@ import ProblemList from "./ProblemList"; import ViewToggle from "../layout/ViewToggle"; import "../../styles/components/ProblemGrid.css"; -const ProblemGrid = ({ problems, hasActiveFilters, currentView, onViewChange }) => { +const ProblemGrid = ({ + problems, + hasActiveFilters, + currentView, + onViewChange, + solvedProblems +}) => { if (problems.length === 0) { return (
@@ -23,12 +29,19 @@ const ProblemGrid = ({ problems, hasActiveFilters, currentView, onViewChange }) {currentView === 'grid' ? (
{problems.map((problem) => ( - + ))}
) : (
- +
)}
diff --git a/src/client/src/components/problems/ProblemList.js b/src/client/src/components/problems/ProblemList.js index a08eeee..e1c467c 100644 --- a/src/client/src/components/problems/ProblemList.js +++ b/src/client/src/components/problems/ProblemList.js @@ -6,7 +6,7 @@ import { } from "../../constants/difficulty"; import "../../styles/components/ProblemList.css"; -const ProblemList = ({ problems }) => { +const ProblemList = ({ problems, solvedProblems }) => { if (problems.length === 0) { return (
@@ -18,6 +18,7 @@ const ProblemList = ({ problems }) => { return (
+ Solved ID Problem Name Difficulty @@ -25,19 +26,37 @@ const ProblemList = ({ problems }) => {
{problems.map((problem, index) => ( - + ))}
); }; -const ProblemListItem = ({ problem, index }) => { +const ProblemListItem = ({ problem, index, solvedProblems }) => { const difficultyText = getDifficultyText(problem.difficulty); const difficultyClass = getDifficultyClass(problem.difficulty); + const isSolved = solvedProblems.isSolved(problem.id); + + const handleCheckboxChange = () => { + solvedProblems.toggleSolved(problem.id); + }; return ( -
+
+
+ +
{problem.id}
{problem.title} diff --git a/src/client/src/styles/components/ProblemCard.css b/src/client/src/styles/components/ProblemCard.css index 1b18551..9615365 100644 --- a/src/client/src/styles/components/ProblemCard.css +++ b/src/client/src/styles/components/ProblemCard.css @@ -1,14 +1,32 @@ +/* styles/components/ProblemCard.css */ .problem-card { background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); border-radius: 12px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); - padding: 1.25rem; /* Reduced from 1.75rem */ + padding: 1.25rem; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); border: 1px solid rgba(255, 255, 255, 0.8); position: relative; overflow: hidden; } +/* Solved state for grid cards */ +.problem-card.solved { + background: linear-gradient(135deg, #f0f9f0 0%, #e8f5e8 100%); + border-left: 4px solid #10b981; +} + +.problem-card.solved::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 3px; + background: linear-gradient(90deg, #10b981, #34d399); + transform: scaleX(1); +} + .problem-card::before { content: ''; position: absolute; @@ -22,28 +40,79 @@ } .problem-card:hover { - transform: translateY(-2px); /* Reduced from -4px */ - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); /* Reduced shadow */ + transform: translateY(-2px); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); } .problem-card:hover::before { transform: scaleX(1); } +/* Checkbox positioning in grid cards */ +.problem-card-checkbox { + position: absolute; + top: 12px; + right: 12px; + z-index: 10; +} + +/* Custom Checkbox Styling for Grid */ +.problem-card .solved-checkbox { + width: 20px; + height: 20px; + cursor: pointer; + border: 2px solid #d1d5db; + border-radius: 4px; + background: white; + position: relative; + transition: all 0.2s ease; + appearance: none; + -webkit-appearance: none; + margin: 0; +} + +.problem-card .solved-checkbox:checked { + background: #10b981; + border-color: #10b981; +} + +.problem-card .solved-checkbox:checked::before { + content: '✓'; + position: absolute; + color: white; + font-size: 14px; + font-weight: bold; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.problem-card .solved-checkbox:hover { + border-color: #10b981; + box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1); +} + +.problem-card .solved-checkbox:focus { + outline: none; + border-color: #10b981; + box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.2); +} + .problem-header { display: flex; justify-content: space-between; align-items: flex-start; - margin-bottom: 1rem; /* Reduced from 1.25rem */ + margin-bottom: 1rem; gap: 1rem; + padding-right: 30px; /* Make space for checkbox */ } .problem-header h3 { margin: 0; - font-size: 1.1rem; /* Slightly smaller */ + font-size: 1.1rem; flex: 1; font-weight: 600; - line-height: 1.3; /* Tighter line height */ + line-height: 1.3; } .problem-header a { @@ -79,9 +148,9 @@ } .difficulty { - padding: 0.3rem 0.8rem; /* Slightly smaller */ + padding: 0.3rem 0.8rem; border-radius: 20px; - font-size: 0.75rem; /* Smaller font */ + font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; @@ -110,9 +179,9 @@ .problem-stats { display: flex; - gap: 1rem; /* Reduced from 1.5rem */ - margin-bottom: 1rem; /* Reduced from 1.25rem */ - font-size: 0.85rem; /* Slightly smaller */ + gap: 1rem; + margin-bottom: 1rem; + font-size: 0.85rem; } .problem-stats span { @@ -148,16 +217,16 @@ .problem-companies { border-top: 1px solid #e2e8f0; - padding-top: 1rem; /* Reduced from 1.25rem */ - margin-top: 0.75rem; /* Reduced from 1rem */ + padding-top: 1rem; + margin-top: 0.75rem; } .problem-companies small { display: block; - margin-bottom: 0.5rem; /* Reduced from 0.75rem */ + margin-bottom: 0.5rem; color: #718096; font-weight: 600; - font-size: 0.75rem; /* Smaller */ + font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.5px; } @@ -165,17 +234,17 @@ .company-tags { display: flex; flex-wrap: wrap; - gap: 0.5rem; /* Reduced from 0.6rem */ + gap: 0.5rem; } .company-tag { background: linear-gradient(135deg, #ffffff, #f7fafc); - padding: 0.4rem 0.8rem; /* Reduced padding */ + padding: 0.4rem 0.8rem; border-radius: 10px; - font-size: 0.75rem; /* Smaller */ + font-size: 0.75rem; display: flex; align-items: center; - gap: 0.3rem; /* Reduced gap */ + gap: 0.3rem; border: 1px solid #e2e8f0; transition: all 0.2s ease; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); @@ -185,7 +254,7 @@ .company-tag:hover { transform: translateY(-1px); - box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); /* Reduced shadow */ + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); border-color: #ffa116; background: linear-gradient(135deg, #fffaf0, #fffbeb); } @@ -196,7 +265,7 @@ } .recent-indicator { - font-size: 0.65rem; /* Smaller */ + font-size: 0.65rem; animation: pulse 2s infinite; } @@ -214,18 +283,19 @@ /* Responsive Design */ @media (max-width: 768px) { .problem-card { - padding: 1rem; /* Reduced from 1.25rem */ - margin: 0.25rem; /* Reduced from 0.5rem */ + padding: 1rem; + margin: 0.25rem; } .problem-header { flex-direction: column; align-items: flex-start; - gap: 0.5rem; /* Reduced from 0.75rem */ + gap: 0.5rem; + padding-right: 0; } .problem-header h3 { - font-size: 1rem; /* Smaller on mobile */ + font-size: 1rem; padding-right: 0; } @@ -235,7 +305,7 @@ .problem-stats { flex-direction: column; - gap: 0.25rem; /* Reduced from 0.5rem */ + gap: 0.25rem; } .problem-stats span::before { @@ -243,12 +313,26 @@ } .company-tags { - gap: 0.3rem; /* Reduced from 0.4rem */ + gap: 0.3rem; } .company-tag { - padding: 0.3rem 0.6rem; /* Smaller on mobile */ - font-size: 0.7rem; /* Smaller on mobile */ + padding: 0.3rem 0.6rem; + font-size: 0.7rem; + } + + .problem-card-checkbox { + top: 8px; + right: 8px; + } + + .problem-card .solved-checkbox { + width: 18px; + height: 18px; + } + + .problem-card .solved-checkbox:checked::before { + font-size: 12px; } } @@ -256,7 +340,7 @@ @keyframes cardEntrance { from { opacity: 0; - transform: translateY(10px); /* Reduced from 20px */ + transform: translateY(10px); } to { opacity: 1; diff --git a/src/client/src/styles/components/ProblemList.css b/src/client/src/styles/components/ProblemList.css index 4045e4f..aef5aa4 100644 --- a/src/client/src/styles/components/ProblemList.css +++ b/src/client/src/styles/components/ProblemList.css @@ -9,18 +9,19 @@ .list-header { display: grid; - grid-template-columns: 60px 1fr 90px 80px; /* Reduced column widths */ - gap: 0.75rem; /* Reduced from 1rem */ - padding: 0.5rem 1rem; /* Reduced padding */ + grid-template-columns: 50px 60px 1fr 90px 80px; /* Adjusted column widths */ + gap: 0.75rem; + padding: 0.5rem 1rem; background: #f8fafc; - border-bottom: 1px solid #e2e8f0; /* Thinner border */ + border-bottom: 1px solid #e2e8f0; font-weight: 600; color: #4a5568; - font-size: 0.8rem; /* Smaller font */ + font-size: 0.8rem; align-items: center; } -/* Left align all headers explicitly */ +/* Header alignment */ +.header-solved, .header-id, .header-title, .header-difficulty, @@ -29,19 +30,30 @@ justify-self: start; } +.header-solved { + text-align: center; + justify-self: center; +} + .list-content { min-height: auto; } .problem-list-item { display: grid; - grid-template-columns: 60px 1fr 90px 80px; /* Reduced column widths */ - gap: 0.75rem; /* Reduced from 1rem */ - padding: 0.5rem 1rem; /* Reduced from 0.75rem 1.5rem */ + grid-template-columns: 50px 60px 1fr 90px 80px; /* Adjusted column widths */ + gap: 0.75rem; + padding: 0.5rem 1rem; border-bottom: 1px solid #f1f5f9; - transition: background-color 0.2s ease; + transition: all 0.2s ease; align-items: center; - min-height: 44px; /* Reduced from 60px */ + min-height: 44px; +} + +/* Solved row styling */ +.problem-list-item.solved { + background-color: #f0f9f0 !important; + border-left: 2px solid #10b981; } /* Alternate background colors for rows */ @@ -55,7 +67,7 @@ .problem-list-item:hover { background: #f0f7ff !important; - border-left: 2px solid #0066cc; /* Thinner border */ + border-left: 2px solid #0066cc; margin-left: -2px; } @@ -63,11 +75,60 @@ border-bottom: none; } +/* Custom Checkbox Styling */ +.problem-solved { + display: flex; + justify-content: center; + align-items: center; + justify-self: center; +} + +.solved-checkbox { + width: 20px; + height: 20px; + cursor: pointer; + border: 2px solid #d1d5db; + border-radius: 4px; + background: white; + position: relative; + transition: all 0.2s ease; + appearance: none; + -webkit-appearance: none; + margin: 0; +} + +.solved-checkbox:checked { + background: #10b981; + border-color: #10b981; +} + +.solved-checkbox:checked::before { + content: '✓'; + position: absolute; + color: white; + font-size: 14px; + font-weight: bold; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.solved-checkbox:hover { + border-color: #10b981; + box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1); +} + +.solved-checkbox:focus { + outline: none; + border-color: #10b981; + box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.2); +} + /* Left align all content cells */ .problem-id { color: #666; font-weight: 500; - font-size: 0.8rem; /* Smaller font */ + font-size: 0.8rem; text-align: left; justify-self: start; } @@ -84,7 +145,7 @@ transition: color 0.2s ease; display: block; width: 100%; - font-size: 0.85rem; /* Smaller font */ + font-size: 0.85rem; line-height: 1.3; } @@ -93,20 +154,20 @@ } .problem-difficulty { - padding: 0.2rem 0.5rem; /* Reduced padding */ - border-radius: 8px; /* Smaller radius */ - font-size: 0.7rem; /* Smaller font */ + padding: 0.2rem 0.5rem; + border-radius: 8px; + font-size: 0.7rem; font-weight: 600; text-align: center; text-transform: uppercase; justify-self: start; width: fit-content; - min-width: 60px; /* Ensure consistent width */ + min-width: 60px; } .problem-acceptance { color: #666; - font-size: 0.8rem; /* Smaller font */ + font-size: 0.8rem; text-align: left; justify-self: start; font-weight: 500; @@ -141,21 +202,21 @@ } .problem-list-item:hover { - transform: translateX(2px); /* Reduced movement */ + transform: translateX(2px); box-shadow: 1px 0 4px rgba(0, 102, 204, 0.1); } /* Responsive Design - More compact */ @media (max-width: 768px) { .list-header { - grid-template-columns: 50px 1fr 70px; + grid-template-columns: 40px 50px 1fr 70px; /* Hide acceptance on mobile */ padding: 0.4rem 0.75rem; font-size: 0.75rem; gap: 0.5rem; } .problem-list-item { - grid-template-columns: 50px 1fr 70px; + grid-template-columns: 40px 50px 1fr 70px; padding: 0.4rem 0.75rem; gap: 0.5rem; min-height: 40px; @@ -179,6 +240,15 @@ .problem-id { font-size: 0.75rem; } + + .solved-checkbox { + width: 18px; + height: 18px; + } + + .solved-checkbox:checked::before { + font-size: 12px; + } } /* Ultra-compact for very small screens */ From 076c0761ccb57b7c8abd4273c360841b2a657090 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 18 Oct 2025 12:17:52 +0530 Subject: [PATCH 21/30] Added Clear solved button to reset localStore --- .../src/components/layout/ViewToggle.js | 58 +++++++++++++------ .../src/components/problems/ProblemGrid.js | 10 +++- src/client/src/styles/layout/ViewToggle.css | 54 +++++++++++++++-- 3 files changed, 96 insertions(+), 26 deletions(-) diff --git a/src/client/src/components/layout/ViewToggle.js b/src/client/src/components/layout/ViewToggle.js index 723edf7..eb5faab 100644 --- a/src/client/src/components/layout/ViewToggle.js +++ b/src/client/src/components/layout/ViewToggle.js @@ -1,25 +1,49 @@ import React from "react"; import "../../styles/layout/ViewToggle.css"; -const ViewToggle = ({ currentView, onViewChange }) => { +const ViewToggle = ({ currentView, onViewChange, solvedProblems }) => { + const handleClearAll = () => { + if ( + window.confirm( + "Are you sure you want to clear all solved problems? This action cannot be undone." + ) + ) { + solvedProblems.clearAllSolved(); + } + }; + + const hasSolvedProblems = solvedProblems.solvedProblems.size > 0; + return ( -
- - +
+
+ + +
+ + {hasSolvedProblems && ( + + )}
); }; -export default ViewToggle; \ No newline at end of file +export default ViewToggle; diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js index 6b7b92c..824cbd6 100644 --- a/src/client/src/components/problems/ProblemGrid.js +++ b/src/client/src/components/problems/ProblemGrid.js @@ -9,7 +9,7 @@ const ProblemGrid = ({ hasActiveFilters, currentView, onViewChange, - solvedProblems + solvedProblems }) => { if (problems.length === 0) { return ( @@ -24,7 +24,11 @@ const ProblemGrid = ({ return (
- + {currentView === 'grid' ? (
@@ -40,7 +44,7 @@ const ProblemGrid = ({
)} diff --git a/src/client/src/styles/layout/ViewToggle.css b/src/client/src/styles/layout/ViewToggle.css index eed7363..2fb0006 100644 --- a/src/client/src/styles/layout/ViewToggle.css +++ b/src/client/src/styles/layout/ViewToggle.css @@ -1,19 +1,25 @@ +.view-toggle-container { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.5rem; + gap: 1rem; +} + .view-toggle { display: flex; gap: 0.5rem; - margin-bottom: 0.5rem; /* Reduced from 1.5rem */ - justify-content: flex-end; } .toggle-btn { - padding: 0.4rem 0.8rem; /* Slightly smaller */ + padding: 0.4rem 0.8rem; border: 1px solid #e2e8f0; background: white; color: #4a5568; border-radius: 6px; cursor: pointer; transition: all 0.2s ease; - font-size: 0.85rem; /* Slightly smaller */ + font-size: 0.85rem; } .toggle-btn:hover { @@ -27,15 +33,51 @@ border-color: #0066cc; } +.clear-all-btn { + padding: 0.4rem 0.8rem; + border: 1px solid #e2e8f0; + background: #dc3545; + color: white; + border-radius: 6px; + cursor: pointer; + transition: all 0.2s ease; + font-size: 0.85rem; + font-weight: 500; +} + +.clear-all-btn:hover { + background: #c82333; + border-color: #bd2130; + transform: translateY(-1px); +} + +.clear-all-btn:active { + transform: translateY(0); +} + /* Responsive adjustments */ @media (max-width: 768px) { + .view-toggle-container { + flex-direction: column; + align-items: stretch; + gap: 0.75rem; + } + .view-toggle { - margin-bottom: 0.375rem; - gap: 0.375rem; + justify-content: center; + } + + .clear-all-btn { + order: -1; /* Move clear button to top on mobile */ } .toggle-btn { padding: 0.35rem 0.7rem; font-size: 0.8rem; } + + .clear-all-btn { + padding: 0.35rem 0.7rem; + font-size: 0.8rem; + } } \ No newline at end of file From 07581e4d80d9edf005a69d09b4c4e045f9d54db8 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 18 Oct 2025 17:58:41 +0530 Subject: [PATCH 22/30] Add scrapper configurations and isolated scrapping process --- .../Controllers/JobSearchController.cs | 66 ++++++++++++--- src/Backend/Operations/AIEngine.cs | 4 +- src/Backend/Operations/GSEngine.cs | 47 ++++++++--- src/Backend/Operations/JobScrapper.cs | 64 ++++++++++++++ src/Backend/Operations/JobScrapperManager.cs | 53 ++++++++++++ .../Operations/JobScrapperSettingsManager.cs | 54 ++++++++++++ src/Backend/Program.cs | 3 + src/Common/Enums/CosmosContainerEnum.cs | 4 +- .../Factories/CosmosContainerFactory.cs | 16 +++- src/Common/Helper.cs | 51 ++++++++++++ src/Common/Models/JobScrapperSettings.cs | 83 +++++++++++++++++++ src/Common/Models/Public/ScrapperSettings.cs | 23 +++++ src/Common/Models/ScrappedJob.cs | 14 +--- src/Common/Repositories/JobsRepository.cs | 83 +++++++++++++++++++ 14 files changed, 525 insertions(+), 40 deletions(-) create mode 100644 src/Backend/Operations/JobScrapper.cs create mode 100644 src/Backend/Operations/JobScrapperManager.cs create mode 100644 src/Backend/Operations/JobScrapperSettingsManager.cs create mode 100644 src/Common/Helper.cs create mode 100644 src/Common/Models/JobScrapperSettings.cs create mode 100644 src/Common/Models/Public/ScrapperSettings.cs create mode 100644 src/Common/Repositories/JobsRepository.cs diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index e73d3f9..47e329d 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -3,6 +3,9 @@ namespace Backend.Controllers using Backend.Operations; using Microsoft.AspNetCore.Mvc; using Common.Models; + using Common.Models.Public; + using Common.Repositories; + using System.Threading.Tasks; [ApiController] [Route("api")] @@ -10,27 +13,31 @@ public class JobSearchController : ControllerBase { private readonly GSEngine gsEngine; private readonly AIEngine aiEngine; + private readonly JobScrapperManager jobscrapperManager; + private readonly JobsRepository jobsContainer; private readonly ILogger logger; - public JobSearchController(GSEngine gsEngine, AIEngine aiEngine, ILogger logger) + public JobSearchController(GSEngine gsEngine, AIEngine aiEngine, JobsRepository jobsContainer, JobScrapperManager jobscrapperManager, ILogger logger) { this.gsEngine = gsEngine; this.aiEngine = aiEngine; this.logger = logger; + this.jobscrapperManager = jobscrapperManager; + this.jobsContainer = jobsContainer; } [HttpGet] - [Route("/jobs/search")] + [Route("jobs/search")] public async Task>> SearchJobs( [FromQuery(Name = "q")] string query, [FromQuery(Name = "d")] int nPreviousDays) { - var result = await this.gsEngine.SearchAndScrapeJobsAsync(query, nPreviousDays); + var result = await this.gsEngine.SearchBasicQueryAsync(query, nPreviousDays); if (result != null) { var levels = await this.aiEngine.GetJobLevelAsync(result); foreach (var level in levels) { - var job = result.FirstOrDefault(j => j.jobId == level.Key); + var job = result.FirstOrDefault(j => j.id == level.Key); if (job != null) { job.tags.Add(level.Value); @@ -42,20 +49,55 @@ public async Task>> SearchJobs( } [HttpGet] - [Route("/jobs")] - public ActionResult GetLatestJobs() + [Route("jobs/latest")] + public async Task> GetLatestJobsFromScrapper() { - // Placeholder implementation for latest jobs - return Ok("Latest job postings"); + return Ok(await this.jobsContainer.GetAllLatestJobsAsync()); } [HttpGet] - [Route("/jobs/{id}")] - public ActionResult GetJobById(string id) + [Route("jobs/profile/{id}")] + public async Task> GetJobById(string id) { - // Placeholder implementation for getting job by ID - return Ok($"Job details for ID: {id}"); + var job = await this.jobsContainer.GetJobByIdAsync(id); + if (job != null) + { + return Ok(job); + } + return Ok("Not found."); + } + + [HttpGet] + [Route("jobs/scrappers")] + public ActionResult> GetAllJobScrappers() + { + // Placeholder implementation for getting all scrappers + return Ok(this.jobscrapperManager.settingsManager.GetAllSettings()); + } + + [HttpPut] + [Route("jobs/scrappers/{id}")] + public ActionResult CreateOrUpdateJobScrapperSettings(string id, [FromBody] ScrapperSettings settings) + { + // Placeholder implementation for updating scrapper settings + return Ok(this.jobscrapperManager.settingsManager.CreateOrUpdateSettings(id, settings)); + } + + [HttpGet] + [Route("jobs/scrappers/{id}")] + public ActionResult GetJobScrapperSettings(string id) + { + // Placeholder implementation for getting scrapper settings + return Ok(this.jobscrapperManager.settingsManager.GetSettingsById(id)); } + [HttpGet] + [Route("jobs/scrappers/{id}/trigger")] + public ActionResult TriggerScrapper(string id) + { + // Placeholder implementation for getting scrapper settings + this.jobscrapperManager.RunScrapperByIdAsync(id); + return Ok($"Started scrapper for settings id: {id}"); + } } } \ No newline at end of file diff --git a/src/Backend/Operations/AIEngine.cs b/src/Backend/Operations/AIEngine.cs index dfcb015..631336c 100644 --- a/src/Backend/Operations/AIEngine.cs +++ b/src/Backend/Operations/AIEngine.cs @@ -63,13 +63,13 @@ public async Task>> GetJobLevelAsync(List j.jobId))} | response: {response}"); + this.logger.LogInformation($"Processed jobs: {string.Join(",", batch.Select(j => j.id))} | response: {response}"); var kvList = response.Split(",").Select(kvs => kvs.Split(":")).Where(kv => kv.Length == 2).Select(kv => new KeyValuePair(kv[0].Trim(), kv[1].Trim())).ToList(); results.AddRange(kvList); } catch (Exception ex) { - this.logger.LogError($"Error processing batch: {string.Join(",", batch.Select(j => j.jobId))} | {ex.Message}"); + this.logger.LogError($"Error processing batch: {string.Join(",", batch.Select(j => j.id))} | {ex.Message}"); } } return results; diff --git a/src/Backend/Operations/GSEngine.cs b/src/Backend/Operations/GSEngine.cs index 5acc8d1..5d59743 100644 --- a/src/Backend/Operations/GSEngine.cs +++ b/src/Backend/Operations/GSEngine.cs @@ -1,6 +1,8 @@ namespace Backend.Operations { using Common.Models; + using Common.Models.Public; + using Microsoft.AspNetCore.Mvc.ModelBinding; using Newtonsoft.Json; public class GSEngine { @@ -19,14 +21,21 @@ public GSEngine(IConfiguration configuration, ILogger _logger) this.httpClient = new HttpClient(); } - public async Task> SearchAndScrapeJobsAsync(string query, int nPreviousDays = 1) + public async Task> SearchQueryAsync(JobScrapperSettings settings) { + var qsettings = settings.Settings; var allJobs = new List(); int startIndex = 1, totalResults = 0; - var template = $"{this.baseUrl}?key={apiKey}&cx={searchEngineId}&q={Uri.EscapeDataString(query)}"; - template += AddLocationToQuery() + AddDateRestrictionToQuery($"d{nPreviousDays}") + AddNegativeTermToQuery() + - AddPositiveTermToQuery() + AddAdditionalSearchTerms(); // + RemoveSiteSearchFromQuery() + var template = $"{this.baseUrl}?key={apiKey}&cx={searchEngineId}&q={Uri.EscapeDataString(qsettings.Query)}"; + template += AddDateRestrictionToQuery(qsettings.lookBackDays); + + if (!string.IsNullOrEmpty(qsettings.ExactTerms)) template += AddExactTermsToQuery(qsettings.ExactTerms); + if (!string.IsNullOrEmpty(qsettings.NegativeTerms)) template += AddNegativeTermToQuery(qsettings.NegativeTerms); + if (!string.IsNullOrEmpty(qsettings.Location)) template += AddClientLocationToQuery(qsettings.Location); + if (!string.IsNullOrEmpty(qsettings.SiteToInclude)) template += AddSiteSearchToQuery(qsettings.SiteToExclude); + if (!string.IsNullOrEmpty(qsettings.SiteToExclude)) template += AddExcludeSiteSearchFromQuery(qsettings.SiteToExclude); + if (!string.IsNullOrEmpty(qsettings.AdditionalSearchterms)) template += AddAdditionalSearchTerms(qsettings.AdditionalSearchterms); do { @@ -42,7 +51,7 @@ public async Task> SearchAndScrapeJobsAsync(string query, int logger.LogInformation($"No results found for query: {url}"); break; } - + foreach (var item in res.items) { var job = new ScrappedJob(item, DateTime.UtcNow); @@ -50,7 +59,7 @@ public async Task> SearchAndScrapeJobsAsync(string query, int } totalResults = int.Parse(res.queries.request[0].totalResults); - startIndex += res.queries.request[0].count; + startIndex += res.queries.request[0].count; } while (startIndex < maxResultsPerSearch && startIndex < totalResults); @@ -59,6 +68,22 @@ public async Task> SearchAndScrapeJobsAsync(string query, int return allJobs; } + public async Task> SearchBasicQueryAsync(string query, int nPreviousDays = 1) + { + var qsettings = new Common.Models.Public.QuerySettings + { + query = query, + additionalTerms = "India", + exactTerms = "Software Engineer", + negativeTerms = "Manager", + location = "India", + siteToExclude = "linkedin.com" + }; + var settings = new JobScrapperSettings("basic-search", qsettings, true); + settings.Settings.lookBackDays = nPreviousDays; + return await SearchQueryAsync(settings); + } + public async Task SearchRawUrlAsync(string url) { try @@ -76,14 +101,14 @@ public async Task> SearchAndScrapeJobsAsync(string query, int return null; } - private string AddLocationToQuery(string location = "in") + private string AddClientLocationToQuery(string location = "in") { return $"&gl={location}"; } - private string AddDateRestrictionToQuery(string dateRestrict = "d1") + private string AddDateRestrictionToQuery(int previousNDays = 1) { - return $"&dateRestrict={dateRestrict}"; + return $"&dateRestrict=d{previousNDays}"; } private string AddNegativeTermToQuery(string phrase = "manager") @@ -91,7 +116,7 @@ private string AddNegativeTermToQuery(string phrase = "manager") return $"&excludeTerms={Uri.EscapeDataString(phrase)}"; } - private string AddPositiveTermToQuery(string phrase = "Software Engineer") + private string AddExactTermsToQuery(string phrase = "Software Engineer") { return $"&exactTerms={Uri.EscapeDataString(phrase)}"; } @@ -101,7 +126,7 @@ private string AddSiteSearchToQuery(string site = "linkedin.com") return $"&siteSearch={site}&siteSearchFilter=i"; } - private string RemoveSiteSearchFromQuery(string site = "linkedin.com") + private string AddExcludeSiteSearchFromQuery(string site = "linkedin.com") { return $"&siteSearch={site}&siteSearchFilter=e"; } diff --git a/src/Backend/Operations/JobScrapper.cs b/src/Backend/Operations/JobScrapper.cs new file mode 100644 index 0000000..349d9e7 --- /dev/null +++ b/src/Backend/Operations/JobScrapper.cs @@ -0,0 +1,64 @@ +namespace Backend.Operations +{ + using Common.Models; + using Common.Repositories; + + public class JobScrapper + { + private JobScrapperSettings settings; + private GSEngine gsEngine; + private AIEngine aiEngine; + private JobsRepository jobsContainer; + private ILogger logger; + + public JobScrapper(JobScrapperSettings settings, GSEngine gsEngine, AIEngine aiEngine, JobsRepository jobsRepo, ILogger logger) + { + this.logger = logger; + this.gsEngine = gsEngine; + this.aiEngine = aiEngine; + this.settings = settings; + this.jobsContainer = jobsRepo; + } + + public async Task RunAsync() + { + var startTime = DateTime.UtcNow; + this.logger.LogInformation($"Starting JobScrapper run for settings: {this.settings}"); + + var searchResults = await gsEngine.SearchQueryAsync(this.settings); + + if (searchResults == null || searchResults.Count == 0) + { + this.logger.LogInformation($"Nothing to process. Query settings: {this.settings}"); + return; + } + + var mp = searchResults.ToDictionary(j => j.id, j => j); + var levels = await this.aiEngine.GetJobLevelAsync(searchResults); + foreach (var level in levels) + { + if (mp.ContainsKey(level.Key)) + { + mp[level.Key].tags.Add(level.Value); + } + else + { + this.logger.LogWarning($"Job ID {level.Key} not found in search results while assigning level tag."); + } + } + + foreach (var job in searchResults) + { + var success = await this.jobsContainer.CreateOrUpdateJobAsync(job); + if (!success) + { + this.logger.LogError($"Failed to push job {job.id} to JobsRepository."); + } + } + + var duration = DateTime.UtcNow - startTime; + this.logger.LogInformation($"JobScrapper run completed. Duration: {duration}. Processed {searchResults.Count} jobs for settings: {this.settings}"); + } + + } +} \ No newline at end of file diff --git a/src/Backend/Operations/JobScrapperManager.cs b/src/Backend/Operations/JobScrapperManager.cs new file mode 100644 index 0000000..432e148 --- /dev/null +++ b/src/Backend/Operations/JobScrapperManager.cs @@ -0,0 +1,53 @@ +using Common.Repositories; + +namespace Backend.Operations +{ + public class JobScrapperManager + { + private readonly ILogger logger; + private readonly GSEngine gsEngine; + private readonly AIEngine aiEngine; + private readonly JobsRepository jobsContainer; + public readonly JobScrapperSettingsManager settingsManager; + + + public JobScrapperManager(ILogger logger, GSEngine gsEngine, AIEngine aiEngine, JobScrapperSettingsManager settingsManager, JobsRepository jobsRepo) + { + this.logger = logger; + this.gsEngine = gsEngine; + this.aiEngine = aiEngine; + this.settingsManager = settingsManager; + this.jobsContainer = jobsRepo; + } + + public async Task RunAllScrappersAsync() + { + + } + + public async Task RunScrapperByIdAsync(string id) + { + var settings = this.settingsManager.GetSettingsById(id); + if (settings.Enabled) + { + var scrapper = new JobScrapper(settings, this.gsEngine, this.aiEngine, this.jobsContainer, this.logger); + Task.Run(async () => + { + try + { + await scrapper.RunAsync(); + } + catch (Exception ex) + { + this.logger.LogError($"Error occurred while running scrapper with ID {id}: {ex.Message}"); + } + }); + this.settingsManager.UpdateLastRunTime(id, DateTime.UtcNow); + } + else + { + this.logger.LogWarning($"Scrapper with ID {id} is disabled. Skipping execution."); + } + } + } +} \ No newline at end of file diff --git a/src/Backend/Operations/JobScrapperSettingsManager.cs b/src/Backend/Operations/JobScrapperSettingsManager.cs new file mode 100644 index 0000000..4771902 --- /dev/null +++ b/src/Backend/Operations/JobScrapperSettingsManager.cs @@ -0,0 +1,54 @@ +namespace Backend.Operations +{ + using System.Collections.Concurrent; + using System.Globalization; + using System.Reflection.Metadata.Ecma335; + using Common.Models; + + public class JobScrapperSettingsManager + { + private ConcurrentDictionary settingsStore = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + + public JobScrapperSettingsManager() {} + + public JobScrapperSettings CreateOrUpdateSettings(string id, Common.Models.Public.ScrapperSettings publicSettings) + { + var newSettings = new JobScrapperSettings( + id, + publicSettings.settings, + false); // Initially disabled + + settingsStore.AddOrUpdate(id, newSettings, (key, value) => + { + value.UpdateFromPublicModel(publicSettings); + value.LastUpdated = DateTime.UtcNow; + return value; + }); + + return settingsStore[id]; + } + + public JobScrapperSettings GetSettingsById(string id) + { + if(settingsStore.TryGetValue(id, out var settings)) + { + return settings; + } + return new JobScrapperSettings("NOT FOUND", new Common.Models.Public.QuerySettings(), false); + } + + public List GetAllSettings() + { + return settingsStore.Values.ToList(); + } + + public void UpdateLastRunTime(string id, DateTime runTime) + { + if(settingsStore.TryGetValue(id, out var settings)) + { + settings.LastRunTime = runTime; + settingsStore[id] = settings; + } + } + } +} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 43c7f8b..5bace22 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -96,6 +96,9 @@ public static void Main(string[] args) services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Common/Enums/CosmosContainerEnum.cs b/src/Common/Enums/CosmosContainerEnum.cs index 538f048..cf53d10 100644 --- a/src/Common/Enums/CosmosContainerEnum.cs +++ b/src/Common/Enums/CosmosContainerEnum.cs @@ -8,6 +8,8 @@ namespace Common.Enums { public enum CosmosContainerEnum { - ProblemsContainer + ProblemsContainer, + JobsContainer, + ScrapperSettingsContainer } } diff --git a/src/Common/Factories/CosmosContainerFactory.cs b/src/Common/Factories/CosmosContainerFactory.cs index d526140..2253602 100644 --- a/src/Common/Factories/CosmosContainerFactory.cs +++ b/src/Common/Factories/CosmosContainerFactory.cs @@ -21,16 +21,24 @@ public CosmosContainerFactory(CosmosClient cosmosClient, IConfiguration configur public Container GetContainer(CosmosContainerEnum container) { var containerDetails = LoadContainerDetails(); + string dbId; + string containerId; switch (container) { case CosmosContainerEnum.ProblemsContainer: - var dbId = containerDetails[container].DatabaseName; - var containerId = containerDetails[container].ContainerName; - var db = _cosmosClient.GetDatabase(dbId); - return db.GetContainer(containerId); + dbId = containerDetails[container].DatabaseName; + containerId = containerDetails[container].ContainerName; + break; + case CosmosContainerEnum.JobsContainer: + dbId = "JobDataBase"; + containerId = "JobDetailsContainer"; + break; default: throw new ArgumentOutOfRangeException(nameof(container), container, null); } + + var db = _cosmosClient.GetDatabase(dbId); + return db.GetContainer(containerId); } private Dictionary LoadContainerDetails() diff --git a/src/Common/Helper.cs b/src/Common/Helper.cs new file mode 100644 index 0000000..435650e --- /dev/null +++ b/src/Common/Helper.cs @@ -0,0 +1,51 @@ +namespace Common.Helper +{ + using System; + using System.Collections.Generic; + using System.Text; + + public static class FastHashId + { + public static string GenerateHashId(string part1, string part2, string part3) + { + return GenerateHashId(new List { part1, part2, part3 }); + } + + public static string GenerateHashId(List input) + { + string combined = string.Join("|", input); + ulong hash = 14695981039346656037UL; // FNV offset basis + const ulong prime = 1099511628211UL; + + foreach (byte b in Encoding.UTF8.GetBytes(combined)) + { + hash ^= b; + hash *= prime; + } + + // Convert hash to Base36 (alphanumeric) for compactness + string base36 = ToBase36(hash); + + // Ensure it's exactly 10 characters + return base36.Length > 10 ? base36.Substring(0, 10) : base36.PadLeft(10, '0'); + } + + private static string ToBase36(ulong value) + { + const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + StringBuilder sb = new StringBuilder(); + while (value > 0) + { + sb.Insert(0, chars[(int)(value % 36)]); + value /= 36; + } + return sb.ToString(); + } + + public static string GenerateRandonGuid() + { + return Guid.NewGuid().ToString("N"); + } + } + +} diff --git a/src/Common/Models/JobScrapperSettings.cs b/src/Common/Models/JobScrapperSettings.cs new file mode 100644 index 0000000..d97b7a4 --- /dev/null +++ b/src/Common/Models/JobScrapperSettings.cs @@ -0,0 +1,83 @@ +namespace Common.Models +{ + public class JobScrapperSettings + { + public string Id { get; set; } + public bool Enabled { get; set; } + public DateTime LastUpdated { get; set; } + public DateTime LastRunTime { get; set; } + public int RunIntervalInHours { get; set; } + public QuerySettings Settings { get; set; } + + public JobScrapperSettings(string id, Models.Public.QuerySettings settings, bool enabled = false) + { + this.Id = id; + this.Enabled = enabled; + this.LastUpdated = DateTime.UtcNow; + this.LastRunTime = DateTime.MinValue; + this.RunIntervalInHours = 24; // Default to daily runs + this.Settings = new Models.QuerySettings(settings); + } + + public string GetQueryParameters() + { + return string.Empty; + } + + public void UpdateFromPublicModel(Models.Public.ScrapperSettings publicSettings) + { + this.Enabled = publicSettings.enabled; + this.RunIntervalInHours = publicSettings.runIntervalInHours; + this.Settings = new Models.QuerySettings(publicSettings.settings); + } + + public Models.Public.ScrapperSettings ToPublicModel() + { + return new Models.Public.ScrapperSettings + { + id = this.Id, + enabled = this.Enabled, + lastUpdated = this.LastUpdated, + lastRunTime = this.LastRunTime, + runIntervalInHours = this.RunIntervalInHours, + settings = new Models.Public.QuerySettings + { + query = this.Settings.Query, + location = this.Settings.Location, + siteToInclude = this.Settings.SiteToInclude, + siteToExclude = this.Settings.SiteToExclude, + exactTerms = this.Settings.ExactTerms, + negativeTerms = this.Settings.NegativeTerms + } + }; + } + + public override string ToString() + { + return $"JobScrapperSettings(Id={Id}, Enabled={Enabled}, LastUpdated={LastUpdated}, LastRunTime={LastRunTime}, RunIntervalInHours={RunIntervalInHours}, Settings=[Query={Settings.Query}, Location={Settings.Location}])"; + } + } + + public class QuerySettings + { + public string Query { get; set; } + public string Location { get; set; } + public string SiteToInclude { get; set; } + public string SiteToExclude { get; set; } + public string ExactTerms { get; set; } + public string NegativeTerms { get; set; } + public int lookBackDays = 1; + public string AdditionalSearchterms { get; set; } + + public QuerySettings(Models.Public.QuerySettings qs) + { + this.Query = qs.query; + this.Location = qs.location; + this.SiteToInclude = qs.siteToInclude; + this.SiteToExclude = qs.siteToExclude; + this.ExactTerms = qs.exactTerms; + this.NegativeTerms = qs.negativeTerms; + this.AdditionalSearchterms = qs.additionalTerms; + } + } +} \ No newline at end of file diff --git a/src/Common/Models/Public/ScrapperSettings.cs b/src/Common/Models/Public/ScrapperSettings.cs new file mode 100644 index 0000000..1a6a320 --- /dev/null +++ b/src/Common/Models/Public/ScrapperSettings.cs @@ -0,0 +1,23 @@ +namespace Common.Models.Public +{ + public class ScrapperSettings + { + public string id { get; set; } + public bool enabled { get; set; } + public DateTime lastUpdated { get; set; } + public DateTime lastRunTime { get; set; } + public int runIntervalInHours { get; set; } + public QuerySettings settings { get; set; } + } + + public class QuerySettings + { + public string query { get; set; } + public string location { get; set; } + public string siteToInclude { get; set; } + public string siteToExclude { get; set; } + public string exactTerms { get; set; } + public string negativeTerms { get; set; } + public string additionalTerms { get; set; } + } +} \ No newline at end of file diff --git a/src/Common/Models/ScrappedJob.cs b/src/Common/Models/ScrappedJob.cs index 21caa68..2758490 100644 --- a/src/Common/Models/ScrappedJob.cs +++ b/src/Common/Models/ScrappedJob.cs @@ -2,7 +2,7 @@ namespace Common.Models { public class ScrappedJob { - public string jobId { get; set; } + public string id { get; set; } public string title { get; set; } public string displayLink { get; set; } public string snippet { get; set; } @@ -18,20 +18,14 @@ public ScrappedJob(Item item, DateTime scrappedTime) this.displayLink = item.displayLink; this.snippet = item.snippet; this.link = item.link; - this.jobId = GenerateHashId(item.link, item.displayLink); + this.id = GenerateHashId(item.link, item.title, item.displayLink); this.scrappedTime = scrappedTime; this.description = "NA"; } - private string GenerateHashId(string url, string displayLink) + private string GenerateHashId(string v1, string v2, string v3) { - // Use a simple hash code and base36 encoding for lightweight hash - int hash = url.GetHashCode(); - string base36 = Math.Abs(hash).ToString("x"); // Hexadecimal representation - string dtime = DateTime.UtcNow.ToString("yyyyMMdd"); - // Pad or trim to 20 characters - var hashvalue = base36.Length > 10 ? base36.Substring(0, 10) : base36.PadLeft(10, '0'); - return $"{displayLink}-{dtime}-{hashvalue}"; + return Common.Helper.FastHashId.GenerateHashId(v1, v2, v3); } } } \ No newline at end of file diff --git a/src/Common/Repositories/JobsRepository.cs b/src/Common/Repositories/JobsRepository.cs new file mode 100644 index 0000000..f95d4b8 --- /dev/null +++ b/src/Common/Repositories/JobsRepository.cs @@ -0,0 +1,83 @@ +namespace Common.Repositories +{ + using Common.Enums; + using Common.Factories; + using Common.Models; + using Microsoft.Azure.Cosmos; + using Microsoft.Extensions.Logging; + + public class JobsRepository + { + private readonly Container jobsContainer; + private readonly ILogger logger; + + public JobsRepository(ICosmosContainerFactory cosmosContainerFactory, + ILogger logger) + { + this.jobsContainer = cosmosContainerFactory.GetContainer(CosmosContainerEnum.JobsContainer); + this.logger = logger; + } + + public async Task> GetAllLatestJobsAsync() + { + var query = "SELECT * FROM c ORDER BY c.scrappedTime DESC OFFSET 0 LIMIT 100"; + return await QueryJobsAsync(query); + } + + public async Task> GetAllJobsInLastOneDay() + { + var query = $"SELECT * FROM c WHERE DateTimeToTimestamp(GetCurrentTimestamp()) - DateTimeToTimestamp(c.scrappedTime) < 86400"; + return await QueryJobsAsync(query); + } + + public async Task GetJobByIdAsync(string id) + { + try + { + // TODO: NOT working as expected + var response = await this.jobsContainer.ReadItemAsync(id, new PartitionKey(id)); + return response.Resource; + } + catch (CosmosException cosmosEx) when (cosmosEx.StatusCode == System.Net.HttpStatusCode.NotFound) + { + this.logger.LogWarning($"Job: {id} not found in container."); + return null; + } + catch (Exception ex) + { + this.logger.LogError($"Failed to retrieve job: {id} from container. Ex: {ex}"); + return null; + } + } + + public async Task CreateOrUpdateJobAsync(ScrappedJob job) + { + try + { + // TODO: Do async inserts for faster performance + var res = await this.jobsContainer.UpsertItemAsync(job); + } + catch (Exception ex) + { + this.logger.LogError($"Failed to push job: {job.id} to container. Ex: {ex}"); + return false; + } + + return true; + } + + private async Task> QueryJobsAsync(string query) + { + var queryDefinition = new QueryDefinition(query); + var queryResultSetIterator = jobsContainer.GetItemQueryIterator(queryDefinition); + List results = new List(); + while (queryResultSetIterator.HasMoreResults) + { + var response = await queryResultSetIterator.ReadNextAsync(); + results.AddRange(response); + } + this.logger.LogInformation($"Retrieved {results.Count} jobs from Cosmos DB. Query: {query}"); + return results; + } + } +} From 0ccdbd7de398f502329811661b700b7457aba065 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 18 Oct 2025 20:03:33 +0530 Subject: [PATCH 23/30] Added shuffle in query params --- src/Backend/Controllers/ProblemsController.cs | 3 ++- src/Backend/Filters/ProblemFilter.cs | 27 ++++++++++++++++--- src/Common/Models/QueryParam.cs | 1 + 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index 7be6d7c..1bb76ad 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -34,11 +34,12 @@ public ActionResult GetHome() public async Task>> GetProblems( [FromQuery(Name = QueryParam.Skip)] int skip = 0, [FromQuery(Name = QueryParam.Limit)] int limit = 50, + [FromQuery(Name = QueryParam.Shuffle)] int shuffle = -1, [FromQuery(Name = QueryParam.Company)] List? companies = null, [FromQuery(Name = QueryParam.Difficulty)] List? difficulties = null, [FromQuery(Name = QueryParam.Tag)] List? tags = null) { - var filter = new ProblemFilter(skip, limit, companies, difficulties, tags); + var filter = new ProblemFilter(skip, limit, shuffle, companies, difficulties, tags); var filteredProblems = await dataProvider.GetProblemsAsync(filter); return Ok(filteredProblems); } diff --git a/src/Backend/Filters/ProblemFilter.cs b/src/Backend/Filters/ProblemFilter.cs index a4b66f5..c42b8b6 100644 --- a/src/Backend/Filters/ProblemFilter.cs +++ b/src/Backend/Filters/ProblemFilter.cs @@ -6,14 +6,16 @@ public class ProblemFilter : IFilter { private int skip = 0; private int limit = 50; + private int shuffle = -1; private List companies; private List difficulties; private List tags; - public ProblemFilter(int skip, int limit, List? companies, List? difficulties, List? tags) + public ProblemFilter(int skip, int limit, int shuffle, List? companies, List? difficulties, List? tags) { this.skip = skip; this.limit = Math.Min(limit, 50); + this.shuffle = shuffle; this.companies = companies ?? new List(); this.difficulties = difficulties ?? new List(); this.tags = tags ?? new List(); @@ -29,7 +31,7 @@ public List ApplyFilterAsync(List problems) filteredProblems = filteredProblems.Where( p => p.companies != null && p.companies.Any(kv => - (companies == null || companies.Count== 0 || companies.Contains(kv.Key, StringComparer.OrdinalIgnoreCase)) && + (companies == null || companies.Count == 0 || companies.Contains(kv.Key, StringComparer.OrdinalIgnoreCase)) && kv.Value.Any(t => tags == null || tags.Count == 0 || tags.Contains(t, StringComparer.OrdinalIgnoreCase)))).ToList(); } @@ -37,10 +39,27 @@ public List ApplyFilterAsync(List problems) { filteredProblems = filteredProblems.Where(p => difficulties.Contains(p.difficulty)).ToList(); } - + + if (shuffle != -1) + { + Shuffle(filteredProblems, this.shuffle); + } + filteredProblems = filteredProblems.Skip(skip).Take(limit).ToList(); - + return filteredProblems; } + + private static void Shuffle(IList list, int seed) + { + Random rng = new Random(seed); + int n = list.Count; + while (n > 1) + { + n--; + int k = rng.Next(n + 1); + (list[n], list[k]) = (list[k], list[n]); + } + } } } \ No newline at end of file diff --git a/src/Common/Models/QueryParam.cs b/src/Common/Models/QueryParam.cs index 340cc74..7142689 100644 --- a/src/Common/Models/QueryParam.cs +++ b/src/Common/Models/QueryParam.cs @@ -7,5 +7,6 @@ public class QueryParam public const string Difficulty = "difficulty"; public const string Company = "company"; public const string Tag = "tag"; + public const string Shuffle = "shuffle"; } } \ No newline at end of file From 924ef71746eea3b7b3bf3e3c82aa3f5175be61af Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 18 Oct 2025 20:40:27 +0530 Subject: [PATCH 24/30] Added configurable backend endpoint --- src/client/.env.development | 1 + src/client/.env.production | 1 + src/client/src/services/api.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 src/client/.env.development create mode 100644 src/client/.env.production diff --git a/src/client/.env.development b/src/client/.env.development new file mode 100644 index 0000000..9878cb0 --- /dev/null +++ b/src/client/.env.development @@ -0,0 +1 @@ +REACT_APP_API_BASE_URL=http://localhost:5164/api \ No newline at end of file diff --git a/src/client/.env.production b/src/client/.env.production new file mode 100644 index 0000000..9e309e5 --- /dev/null +++ b/src/client/.env.production @@ -0,0 +1 @@ +REACT_APP_API_BASE_URL=https://lcw-test.westus2.cloudapp.azure.com/api \ No newline at end of file diff --git a/src/client/src/services/api.js b/src/client/src/services/api.js index 762d1c6..01b341b 100644 --- a/src/client/src/services/api.js +++ b/src/client/src/services/api.js @@ -1,5 +1,5 @@ // services/api.js -const API_BASE_URL = "http://localhost:5164/api"; +const API_BASE_URL = process.env.REACT_APP_API_BASE_URL || "http://default-fallback.com/api"; export const fetchProblems = async (page = 1, limit = 50, filters = {}) => { const skip = (page - 1) * limit; From 014a8ee595bafdce841cbdcd35e00a74e020a719 Mon Sep 17 00:00:00 2001 From: Swoyam Date: Sat, 18 Oct 2025 23:15:30 +0530 Subject: [PATCH 25/30] Added Shuffle functionality --- src/client/src/components/layout/Body.js | 8 +- src/client/src/components/layout/Main.js | 62 +++++++++++--- .../src/components/layout/ShuffleToggle.js | 25 ++++++ .../src/components/layout/ViewToggle.js | 66 +++++++++------ .../src/components/problems/ProblemGrid.js | 37 ++++----- src/client/src/services/api.js | 24 ++++-- .../src/styles/components/ProblemGrid.css | 20 +++-- src/client/src/styles/layout/Nav.css | 32 ++++++-- .../src/styles/layout/ShuffleToggle.css | 80 +++++++++++++++++++ src/client/src/styles/layout/ViewToggle.css | 30 ++++++- 10 files changed, 300 insertions(+), 84 deletions(-) create mode 100644 src/client/src/components/layout/ShuffleToggle.js create mode 100644 src/client/src/styles/layout/ShuffleToggle.css diff --git a/src/client/src/components/layout/Body.js b/src/client/src/components/layout/Body.js index acf92f0..f771550 100644 --- a/src/client/src/components/layout/Body.js +++ b/src/client/src/components/layout/Body.js @@ -15,6 +15,7 @@ const Body = ({ currentView, onViewChange, solvedProblems, + shuffleState }) => { if (loading) { return ( @@ -42,12 +43,13 @@ const Body = ({ return (
- { const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [currentView, setCurrentView] = useState('list'); - // Use the solved problems hook - const solvedProblems = useSolvedProblems(); + const [shuffle, setShuffle] = useState(-1); // -1 means shuffle is off + const [isShuffleEnabled, setIsShuffleEnabled] = useState(false); + const solvedProblems = useSolvedProblems(); const PROBLEMS_PER_PAGE = 50; - // Check if any filters are active const hasActiveFilters = useMemo(() => { return !!(filters.company || filters.timePeriod || filters.difficulty); }, [filters]); + const generateShuffleNumber = () => { + return Math.floor(Math.random() * 10000) + 1; + }; + + // Toggle shuffle on/off + const toggleShuffle = () => { + if (isShuffleEnabled) { + // Turning shuffle off + setIsShuffleEnabled(false); + setShuffle(-1); + } else { + // Turning shuffle on - generate new number if none exists + setIsShuffleEnabled(true); + if (shuffle === -1) { + setShuffle(generateShuffleNumber()); + } + } + }; + + // Regenerate shuffle number + const regenerateShuffle = () => { + const newShuffle = generateShuffleNumber(); + setShuffle(newShuffle); + setCurrentPage(1); // Reset to first page when regenerating shuffle + }; + useEffect(() => { const loadProblems = async () => { setLoading(true); try { - // ALWAYS pass filters to API - backend will ignore empty ones - const data = await fetchProblems(currentPage, PROBLEMS_PER_PAGE, filters); + const data = await fetchProblems( + currentPage, + PROBLEMS_PER_PAGE, + filters, + isShuffleEnabled ? shuffle : -1 // Only pass shuffle if enabled + ); setProblems(data); setError(null); - // Estimate total pages based on response if (data.length < PROBLEMS_PER_PAGE) { - setTotalPages(currentPage); // This is the last page + setTotalPages(currentPage); } else { - setTotalPages(currentPage + 1); // There might be more pages + setTotalPages(currentPage + 1); } } catch (err) { setError("Failed to fetch problems. Please try again later."); @@ -51,9 +80,8 @@ const Main = () => { }; loadProblems(); - }, [currentPage, filters]); + }, [currentPage, filters, shuffle, isShuffleEnabled]); - // Extract unique company names from ALL problems (initial load for dropdown) const companies = useMemo(() => { const companySet = new Set(); problems.forEach((problem) => { @@ -68,7 +96,7 @@ const Main = () => { const handleFilterChange = (newFilters) => { setFilters(newFilters); - setCurrentPage(1); // Reset to first page when filters change + setCurrentPage(1); }; const handlePageChange = (page) => { @@ -82,6 +110,12 @@ const Main = () => { filters={filters} onFilterChange={handleFilterChange} companies={companies} + shuffleState={{ + isShuffleEnabled, + shuffle, + toggleShuffle, + regenerateShuffle + }} /> { currentView={currentView} onViewChange={setCurrentView} solvedProblems={solvedProblems} + shuffleState={{ + isShuffleEnabled, + shuffle, + toggleShuffle, + regenerateShuffle + }} />
); diff --git a/src/client/src/components/layout/ShuffleToggle.js b/src/client/src/components/layout/ShuffleToggle.js new file mode 100644 index 0000000..40684cb --- /dev/null +++ b/src/client/src/components/layout/ShuffleToggle.js @@ -0,0 +1,25 @@ +import React from "react"; +import "../../styles/layout/ShuffleToggle.css"; + +const ShuffleToggle = ({ shuffleState }) => { + const { isShuffleEnabled, toggleShuffle } = shuffleState; + + return ( +
+
+ +
+
+ ); +}; + +export default ShuffleToggle; \ No newline at end of file diff --git a/src/client/src/components/layout/ViewToggle.js b/src/client/src/components/layout/ViewToggle.js index eb5faab..ab3bfa6 100644 --- a/src/client/src/components/layout/ViewToggle.js +++ b/src/client/src/components/layout/ViewToggle.js @@ -1,7 +1,13 @@ import React from "react"; +import ShuffleToggle from "./ShuffleToggle"; import "../../styles/layout/ViewToggle.css"; -const ViewToggle = ({ currentView, onViewChange, solvedProblems }) => { +const ViewToggle = ({ + currentView, + onViewChange, + solvedProblems, + shuffleState, +}) => { const handleClearAll = () => { if ( window.confirm( @@ -16,32 +22,42 @@ const ViewToggle = ({ currentView, onViewChange, solvedProblems }) => { return (
-
- - +
+
+ + +
- {hasSolvedProblems && ( - - )} +
+ {shuffleState && ( +
+ +
+ )} + + {hasSolvedProblems && ( + + )} +
); }; diff --git a/src/client/src/components/problems/ProblemGrid.js b/src/client/src/components/problems/ProblemGrid.js index 824cbd6..d8c219d 100644 --- a/src/client/src/components/problems/ProblemGrid.js +++ b/src/client/src/components/problems/ProblemGrid.js @@ -4,19 +4,22 @@ import ProblemList from "./ProblemList"; import ViewToggle from "../layout/ViewToggle"; import "../../styles/components/ProblemGrid.css"; -const ProblemGrid = ({ - problems, - hasActiveFilters, - currentView, +const ProblemGrid = ({ + problems, + hasActiveFilters, + currentView, onViewChange, - solvedProblems + solvedProblems, + shuffleState, }) => { if (problems.length === 0) { return (

No problems found matching your criteria.

{hasActiveFilters && ( -

Try adjusting your filters or clearing them to see all problems.

+

+ Try adjusting your filters or clearing them to see all problems. +

)}
); @@ -24,32 +27,30 @@ const ProblemGrid = ({ return (
- - - {currentView === 'grid' ? ( + + {currentView === "grid" ? (
{problems.map((problem) => ( - ))}
) : (
- +
)}
); }; -export default ProblemGrid; \ No newline at end of file +export default ProblemGrid; diff --git a/src/client/src/services/api.js b/src/client/src/services/api.js index 01b341b..ca72016 100644 --- a/src/client/src/services/api.js +++ b/src/client/src/services/api.js @@ -1,22 +1,32 @@ // services/api.js -const API_BASE_URL = process.env.REACT_APP_API_BASE_URL || "http://default-fallback.com/api"; +const API_BASE_URL = + process.env.REACT_APP_API_BASE_URL || "http://default-fallback.com/api"; -export const fetchProblems = async (page = 1, limit = 50, filters = {}) => { +export const fetchProblems = async ( + page = 1, + limit = 50, + filters = {}, + shuffle = -1 +) => { const skip = (page - 1) * limit; const params = new URLSearchParams({ skip: skip.toString(), - limit: limit.toString() + limit: limit.toString(), }); // Add filter parameters if they exist if (filters.company) { - params.append('company', filters.company); + params.append("company", filters.company); } if (filters.difficulty) { - params.append('difficulty', filters.difficulty); + params.append("difficulty", filters.difficulty); } if (filters.timePeriod) { - params.append('tag', filters.timePeriod); + params.append("tag", filters.timePeriod); + } + + if (shuffle !== -1) { + params.append("shuffle", shuffle.toString()); } const response = await fetch(`${API_BASE_URL}/problems?${params}`); @@ -32,4 +42,4 @@ export const getProblemById = async (id) => { throw new Error(`Failed to fetch problem #${id}`); } return await response.json(); -}; \ No newline at end of file +}; diff --git a/src/client/src/styles/components/ProblemGrid.css b/src/client/src/styles/components/ProblemGrid.css index 4680458..7eeadfb 100644 --- a/src/client/src/styles/components/ProblemGrid.css +++ b/src/client/src/styles/components/ProblemGrid.css @@ -1,28 +1,26 @@ .problem-container { - margin-bottom: 0.5rem; + margin-bottom: 1rem; padding-bottom: 0; } .problem-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 0.75rem; - padding: 0.25rem 0; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1rem; + padding: 0.5rem 0; } .no-problems { text-align: center; - padding: 1rem; + padding: 1.5rem; background: white; - border-radius: 6px; + border-radius: 8px; color: #666; - margin: 0.75rem 0; - font-size: 0.9rem; + margin: 1rem 0; } -/* Remove space between toggle and list */ +/* Ensure list view takes only needed space */ .problem-list-container { - margin-top: 0; /* Ensure no top margin */ margin-bottom: 0; padding-bottom: 0; } @@ -31,6 +29,6 @@ @media (max-width: 640px) { .problem-grid { grid-template-columns: 1fr; - gap: 0.5rem; + gap: 0.75rem; } } \ No newline at end of file diff --git a/src/client/src/styles/layout/Nav.css b/src/client/src/styles/layout/Nav.css index 9817eb4..26d5a20 100644 --- a/src/client/src/styles/layout/Nav.css +++ b/src/client/src/styles/layout/Nav.css @@ -1,12 +1,10 @@ -/* styles/layout/Nav.css */ .nav { background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); border-bottom: 1px solid #e2e8f0; padding: 0; - box-shadow: 0 1px 6px rgba(0, 0, 0, 0.04); + box-shadow: 0 1px 8px rgba(0, 0, 0, 0.04); position: relative; z-index: 100; - min-height: auto; } .nav-content { @@ -15,9 +13,31 @@ padding: 0 1.5rem; position: relative; z-index: 101; + display: flex; + flex-direction: column; + gap: 1rem; + padding-top: 1rem; + padding-bottom: 1rem; } -/* Remove any extra padding that might be adding space */ -.nav * { - box-sizing: border-box; +/* Ensure filter options and shuffle toggle are properly aligned */ +.filter-options { + display: flex; + gap: 2rem; + align-items: flex-end; + flex-wrap: wrap; + padding: 0; /* Remove padding since nav-content handles it */ +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .nav-content { + padding: 0 1rem; + gap: 0.75rem; + } + + .filter-options { + flex-direction: column; + gap: 1rem; + } } \ No newline at end of file diff --git a/src/client/src/styles/layout/ShuffleToggle.css b/src/client/src/styles/layout/ShuffleToggle.css new file mode 100644 index 0000000..df82379 --- /dev/null +++ b/src/client/src/styles/layout/ShuffleToggle.css @@ -0,0 +1,80 @@ +.shuffle-toggle-container { + display: flex; + align-items: center; +} + +.shuffle-toggle { + display: flex; + align-items: center; + padding: 0.5rem; + background: white; + border-radius: 6px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + border: 1px solid #e2e8f0; +} + +.shuffle-label { + display: flex; + align-items: center; + gap: 0.5rem; + cursor: pointer; + font-weight: 500; + color: #4a5568; + margin: 0; +} + +.shuffle-checkbox { + display: none; +} + +.shuffle-slider { + width: 40px; + height: 20px; + background: #cbd5e0; + border-radius: 20px; + position: relative; + transition: all 0.3s ease; + flex-shrink: 0; +} + +.shuffle-slider::before { + content: ''; + position: absolute; + width: 16px; + height: 16px; + border-radius: 50%; + background: white; + top: 2px; + left: 2px; + transition: all 0.3s ease; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +.shuffle-checkbox:checked + .shuffle-slider { + background: #0066cc; +} + +.shuffle-checkbox:checked + .shuffle-slider::before { + transform: translateX(20px); +} + +.shuffle-text { + font-size: 0.8rem; + font-weight: 600; + white-space: nowrap; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .shuffle-toggle { + padding: 0.4rem; + } + + .shuffle-label { + gap: 0.4rem; + } + + .shuffle-text { + font-size: 0.75rem; + } +} \ No newline at end of file diff --git a/src/client/src/styles/layout/ViewToggle.css b/src/client/src/styles/layout/ViewToggle.css index 2fb0006..475d59c 100644 --- a/src/client/src/styles/layout/ViewToggle.css +++ b/src/client/src/styles/layout/ViewToggle.css @@ -6,11 +6,28 @@ gap: 1rem; } +.left-controls { + display: flex; + align-items: center; + gap: 1rem; +} + +.right-controls { + display: flex; + align-items: center; + gap: 1rem; +} + .view-toggle { display: flex; gap: 0.5rem; } +.shuffle-control { + display: flex; + align-items: center; +} + .toggle-btn { padding: 0.4rem 0.8rem; border: 1px solid #e2e8f0; @@ -63,12 +80,19 @@ gap: 0.75rem; } - .view-toggle { + .left-controls { justify-content: center; + width: 100%; } - .clear-all-btn { - order: -1; /* Move clear button to top on mobile */ + .right-controls { + justify-content: space-between; + width: 100%; + order: -1; + } + + .view-toggle { + justify-content: center; } .toggle-btn { From b733e456d75695347752c43f54d9a21989bf6e05 Mon Sep 17 00:00:00 2001 From: Ayush Behera Date: Sun, 19 Oct 2025 22:39:58 +0530 Subject: [PATCH 26/30] Refactoring code for async data pulls --- src/.dockerignore | 30 ++ .../Controllers/JobSearchController.cs | 85 ++---- .../Controllers/ScrapperSettingsController.cs | 58 ++++ src/Backend/Filters/IFilter.cs | 9 - src/Backend/Filters/ProblemFilter.cs | 3 +- src/Backend/Operations/DataProvider.cs | 3 +- src/Backend/Operations/GSEngine.cs | 149 ---------- src/Backend/Operations/JobScrapperManager.cs | 53 ---- .../Operations/JobScrapperSettingsManager.cs | 54 ---- src/Backend/Program.cs | 9 +- src/Backend/appsettings.json | 5 +- src/Common/Common.csproj | 3 + .../Constants/ConfigurationConstants.cs | 3 + .../DatabaseModels/JobScrapperSettings.cs | 82 ++++++ .../ProblemSchema.cs | 36 +-- src/Common/DatabaseModels/QuerySettings.cs | 33 +++ .../{Models => DatabaseModels}/ScrappedJob.cs | 22 +- .../Operations => Common/Engines}/AIEngine.cs | 81 +++--- src/Common/Engines/GSEngine.cs | 238 ++++++++++++++++ .../Factories/CosmosContainerFactory.cs | 40 +-- src/Common/IFilter.cs | 7 + .../Managers}/JobScrapper.cs | 19 +- .../Managers/JobScrapperSettingsManager.cs | 93 ++++++ src/Common/Models/JobScrapperSettings.cs | 83 ------ src/Common/Models/Problem.cs | 2 + src/Common/Models/Public/QuerySettings.cs | 15 + src/Common/Models/Public/ScrapperSettings.cs | 14 +- src/Common/Queries/JobQuery.cs | 12 + .../JobScrapperSettingsRepository.cs | 53 ++++ src/Common/Repositories/JobsRepository.cs | 131 ++++++++- src/Common/Repositories/ProblemRepository.cs | 3 +- src/PetProjectAzFunctions/.gitignore | 264 ++++++++++++++++++ src/PetProjectAzFunctions/Dockerfile | 29 ++ .../JobOpeningsSyncFunction.cs | 67 +++++ .../PetProjectAzFunctions.csproj | 37 +++ src/PetProjectAzFunctions/Program.cs | 53 ++++ .../Properties/launchSettings.json | 15 + .../Properties/serviceDependencies.json | 11 + src/PetProjectAzFunctions/host.json | 12 + src/PetProjectAzFunctions/readme.md | 11 + src/Synchronizer/ProblemsProcessor.cs | 1 + src/lcw.sln | 20 +- 42 files changed, 1418 insertions(+), 530 deletions(-) create mode 100644 src/.dockerignore create mode 100644 src/Backend/Controllers/ScrapperSettingsController.cs delete mode 100644 src/Backend/Filters/IFilter.cs delete mode 100644 src/Backend/Operations/GSEngine.cs delete mode 100644 src/Backend/Operations/JobScrapperManager.cs delete mode 100644 src/Backend/Operations/JobScrapperSettingsManager.cs create mode 100644 src/Common/DatabaseModels/JobScrapperSettings.cs rename src/Common/{Models => DatabaseModels}/ProblemSchema.cs (55%) create mode 100644 src/Common/DatabaseModels/QuerySettings.cs rename src/Common/{Models => DatabaseModels}/ScrappedJob.cs (54%) rename src/{Backend/Operations => Common/Engines}/AIEngine.cs (63%) create mode 100644 src/Common/Engines/GSEngine.cs create mode 100644 src/Common/IFilter.cs rename src/{Backend/Operations => Common/Managers}/JobScrapper.cs (79%) create mode 100644 src/Common/Managers/JobScrapperSettingsManager.cs delete mode 100644 src/Common/Models/JobScrapperSettings.cs create mode 100644 src/Common/Models/Public/QuerySettings.cs create mode 100644 src/Common/Queries/JobQuery.cs create mode 100644 src/Common/Repositories/JobScrapperSettingsRepository.cs create mode 100644 src/PetProjectAzFunctions/.gitignore create mode 100644 src/PetProjectAzFunctions/Dockerfile create mode 100644 src/PetProjectAzFunctions/JobOpeningsSyncFunction.cs create mode 100644 src/PetProjectAzFunctions/PetProjectAzFunctions.csproj create mode 100644 src/PetProjectAzFunctions/Program.cs create mode 100644 src/PetProjectAzFunctions/Properties/launchSettings.json create mode 100644 src/PetProjectAzFunctions/Properties/serviceDependencies.json create mode 100644 src/PetProjectAzFunctions/host.json create mode 100644 src/PetProjectAzFunctions/readme.md diff --git a/src/.dockerignore b/src/.dockerignore new file mode 100644 index 0000000..fe1152b --- /dev/null +++ b/src/.dockerignore @@ -0,0 +1,30 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +!**/.gitignore +!.git/HEAD +!.git/config +!.git/packed-refs +!.git/refs/heads/** \ No newline at end of file diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index 47e329d..2ced804 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -2,102 +2,57 @@ namespace Backend.Controllers { using Backend.Operations; using Microsoft.AspNetCore.Mvc; - using Common.Models; using Common.Models.Public; using Common.Repositories; using System.Threading.Tasks; + using Common.Managers; + using Common.Engines; + using Common.Queries; + using Common.DatabaseModels; [ApiController] [Route("api")] public class JobSearchController : ControllerBase { - private readonly GSEngine gsEngine; - private readonly AIEngine aiEngine; - private readonly JobScrapperManager jobscrapperManager; - private readonly JobsRepository jobsContainer; + private readonly JobsRepository jobsRepository; private readonly ILogger logger; - public JobSearchController(GSEngine gsEngine, AIEngine aiEngine, JobsRepository jobsContainer, JobScrapperManager jobscrapperManager, ILogger logger) + public JobSearchController(JobsRepository jobsRepository, ILogger logger) { - this.gsEngine = gsEngine; - this.aiEngine = aiEngine; this.logger = logger; - this.jobscrapperManager = jobscrapperManager; - this.jobsContainer = jobsContainer; + this.jobsRepository = jobsRepository; } - [HttpGet] + [HttpPost] [Route("jobs/search")] - public async Task>> SearchJobs( - [FromQuery(Name = "q")] string query, - [FromQuery(Name = "d")] int nPreviousDays) + public async Task>> SearchJobs([FromBody] JobQuery jobquery) { - var result = await this.gsEngine.SearchBasicQueryAsync(query, nPreviousDays); - if (result != null) - { - var levels = await this.aiEngine.GetJobLevelAsync(result); - foreach (var level in levels) - { - var job = result.FirstOrDefault(j => j.id == level.Key); - if (job != null) - { - job.tags.Add(level.Value); - } - } - return Ok(result); - } - return StatusCode(500, "Error occurred while searching for jobs."); + return Ok(await jobsRepository.GetJobsFromQuery(jobquery)); } [HttpGet] [Route("jobs/latest")] - public async Task> GetLatestJobsFromScrapper() + public async Task> GetLatestJobsFromDb() { - return Ok(await this.jobsContainer.GetAllLatestJobsAsync()); + return Ok(await this.jobsRepository.GetAllLatestJobsAsync()); + } + + [HttpGet] + [Route("jobs/lastOneDay")] + public async Task> GetLastOneDayJobsFromDb() + { + return Ok(await this.jobsRepository.GetAllJobsInLastOneDay()); } [HttpGet] [Route("jobs/profile/{id}")] public async Task> GetJobById(string id) { - var job = await this.jobsContainer.GetJobByIdAsync(id); + var job = await this.jobsRepository.GetJobByIdAsync(id); if (job != null) { return Ok(job); } return Ok("Not found."); } - - [HttpGet] - [Route("jobs/scrappers")] - public ActionResult> GetAllJobScrappers() - { - // Placeholder implementation for getting all scrappers - return Ok(this.jobscrapperManager.settingsManager.GetAllSettings()); - } - - [HttpPut] - [Route("jobs/scrappers/{id}")] - public ActionResult CreateOrUpdateJobScrapperSettings(string id, [FromBody] ScrapperSettings settings) - { - // Placeholder implementation for updating scrapper settings - return Ok(this.jobscrapperManager.settingsManager.CreateOrUpdateSettings(id, settings)); - } - - [HttpGet] - [Route("jobs/scrappers/{id}")] - public ActionResult GetJobScrapperSettings(string id) - { - // Placeholder implementation for getting scrapper settings - return Ok(this.jobscrapperManager.settingsManager.GetSettingsById(id)); - } - - [HttpGet] - [Route("jobs/scrappers/{id}/trigger")] - public ActionResult TriggerScrapper(string id) - { - // Placeholder implementation for getting scrapper settings - this.jobscrapperManager.RunScrapperByIdAsync(id); - return Ok($"Started scrapper for settings id: {id}"); - } } } \ No newline at end of file diff --git a/src/Backend/Controllers/ScrapperSettingsController.cs b/src/Backend/Controllers/ScrapperSettingsController.cs new file mode 100644 index 0000000..3cbdc4b --- /dev/null +++ b/src/Backend/Controllers/ScrapperSettingsController.cs @@ -0,0 +1,58 @@ +using Common.DatabaseModels; +using Common.Engines; +using Common.Managers; +using Common.Models; +using Common.Models.Public; +using Common.Repositories; +using Microsoft.AspNetCore.Mvc; + +namespace Backend.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class ScrapperSettingsController : ControllerBase + { + private readonly JobScrapperSettingsManager _settingsManager; + + private readonly ILogger _logger; + + public ScrapperSettingsController( JobScrapperSettingsManager jobScrapperSettingsManager, + ILogger logger) + { + _settingsManager = jobScrapperSettingsManager; + _logger = logger; + } + + [HttpGet] + [Route("jobs/scrappers")] + public async Task>> GetAllJobScrappers() + { + // Placeholder implementation for getting all scrappers + return Ok(await _settingsManager.GetAllSettings()); + } + + [HttpPut] + [Route("jobs/scrappers/{id}")] + public async Task> UpdateJobScrapperSettings(string id, [FromBody] ScrapperSettings settings) + { + // Placeholder implementation for updating scrapper settings + return Ok(await _settingsManager.CreateOrUpdateSettings(id, settings)); + } + + [HttpPost] + [Route("jobs/scrappers/Add")] + public async Task> CreateNewJobScrapperSettings([FromBody] ScrapperSettings settings) + { + // Placeholder implementation for updating scrapper settings + return Ok(await _settingsManager.CreateOrUpdateSettings(string.Empty, settings)); + } + + [HttpGet] + [Route("jobs/scrappers/{id}")] + public async Task> GetJobScrapperSettings(string id) + { + // Placeholder implementation for getting scrapper settings + return Ok(await _settingsManager.GetSettingsById(id)); + } + } +} diff --git a/src/Backend/Filters/IFilter.cs b/src/Backend/Filters/IFilter.cs deleted file mode 100644 index 91a29e5..0000000 --- a/src/Backend/Filters/IFilter.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Common.Models; - -namespace Backend.Filters -{ - public interface IFilter - { - public List ApplyFilterAsync(List problems); - } -} \ No newline at end of file diff --git a/src/Backend/Filters/ProblemFilter.cs b/src/Backend/Filters/ProblemFilter.cs index a4b66f5..4d73c5e 100644 --- a/src/Backend/Filters/ProblemFilter.cs +++ b/src/Backend/Filters/ProblemFilter.cs @@ -1,8 +1,9 @@ +using Common; using Common.Models; namespace Backend.Filters { - public class ProblemFilter : IFilter + public class ProblemFilter : IFilter { private int skip = 0; private int limit = 50; diff --git a/src/Backend/Operations/DataProvider.cs b/src/Backend/Operations/DataProvider.cs index c280dd1..04f80a0 100644 --- a/src/Backend/Operations/DataProvider.cs +++ b/src/Backend/Operations/DataProvider.cs @@ -1,6 +1,7 @@ namespace Backend.Operations { using Backend.Filters; + using Common; using Common.Cache; using Common.Constants; using Common.Models; @@ -15,7 +16,7 @@ public DataProvider([FromKeyedServices(CacheConstants.ProblemCacheKey)] ICache p _logger = logger; } - public async Task> GetProblemsAsync(IFilter? filter = null) + public async Task> GetProblemsAsync(IFilter? filter = null) { var allProblems = await GetAllProblemsAsync(); if (filter != null) diff --git a/src/Backend/Operations/GSEngine.cs b/src/Backend/Operations/GSEngine.cs deleted file mode 100644 index 5d59743..0000000 --- a/src/Backend/Operations/GSEngine.cs +++ /dev/null @@ -1,149 +0,0 @@ -namespace Backend.Operations -{ - using Common.Models; - using Common.Models.Public; - using Microsoft.AspNetCore.Mvc.ModelBinding; - using Newtonsoft.Json; - public class GSEngine - { - private readonly string apiKey; - private readonly string searchEngineId; - private readonly HttpClient httpClient; - private string baseUrl = "https://customsearch.googleapis.com/customsearch/v1"; - private int maxResultsPerSearch = 150; - ILogger logger; - - public GSEngine(IConfiguration configuration, ILogger _logger) - { - this.apiKey = configuration["GoogleSearch:ApiKey"] ?? throw new ArgumentNullException("Google Search API Key is not configured."); - this.searchEngineId = configuration["GoogleSearch:SearchEngineId"] ?? throw new ArgumentNullException("Google Search Engine ID is not configured."); - this.logger = _logger; - this.httpClient = new HttpClient(); - } - - public async Task> SearchQueryAsync(JobScrapperSettings settings) - { - var qsettings = settings.Settings; - var allJobs = new List(); - int startIndex = 1, totalResults = 0; - - var template = $"{this.baseUrl}?key={apiKey}&cx={searchEngineId}&q={Uri.EscapeDataString(qsettings.Query)}"; - template += AddDateRestrictionToQuery(qsettings.lookBackDays); - - if (!string.IsNullOrEmpty(qsettings.ExactTerms)) template += AddExactTermsToQuery(qsettings.ExactTerms); - if (!string.IsNullOrEmpty(qsettings.NegativeTerms)) template += AddNegativeTermToQuery(qsettings.NegativeTerms); - if (!string.IsNullOrEmpty(qsettings.Location)) template += AddClientLocationToQuery(qsettings.Location); - if (!string.IsNullOrEmpty(qsettings.SiteToInclude)) template += AddSiteSearchToQuery(qsettings.SiteToExclude); - if (!string.IsNullOrEmpty(qsettings.SiteToExclude)) template += AddExcludeSiteSearchFromQuery(qsettings.SiteToExclude); - if (!string.IsNullOrEmpty(qsettings.AdditionalSearchterms)) template += AddAdditionalSearchTerms(qsettings.AdditionalSearchterms); - - do - { - var url = template + AddStartIndexToQuery(startIndex); - var res = await SearchRawUrlAsync(url); - if (res == null) - { - logger.LogError("SearchAsync returned null result."); - break; - } - else if (string.IsNullOrEmpty(res.queries.request[0].totalResults) || res.items == null) - { - logger.LogInformation($"No results found for query: {url}"); - break; - } - - foreach (var item in res.items) - { - var job = new ScrappedJob(item, DateTime.UtcNow); - allJobs.Add(job); - } - - totalResults = int.Parse(res.queries.request[0].totalResults); - startIndex += res.queries.request[0].count; - } - while (startIndex < maxResultsPerSearch && startIndex < totalResults); - - this.logger.LogInformation($"Fetched {allJobs.Count} jobs. Total available: {totalResults}. Using url template: {template}"); - - return allJobs; - } - - public async Task> SearchBasicQueryAsync(string query, int nPreviousDays = 1) - { - var qsettings = new Common.Models.Public.QuerySettings - { - query = query, - additionalTerms = "India", - exactTerms = "Software Engineer", - negativeTerms = "Manager", - location = "India", - siteToExclude = "linkedin.com" - }; - var settings = new JobScrapperSettings("basic-search", qsettings, true); - settings.Settings.lookBackDays = nPreviousDays; - return await SearchQueryAsync(settings); - } - - public async Task SearchRawUrlAsync(string url) - { - try - { - var response = await httpClient.GetAsync(url); - response.EnsureSuccessStatusCode(); - var content = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(content); - } - catch (Exception ex) - { - logger.LogError(ex, "Error occurred during Google Search API call."); - } - - return null; - } - - private string AddClientLocationToQuery(string location = "in") - { - return $"&gl={location}"; - } - - private string AddDateRestrictionToQuery(int previousNDays = 1) - { - return $"&dateRestrict=d{previousNDays}"; - } - - private string AddNegativeTermToQuery(string phrase = "manager") - { - return $"&excludeTerms={Uri.EscapeDataString(phrase)}"; - } - - private string AddExactTermsToQuery(string phrase = "Software Engineer") - { - return $"&exactTerms={Uri.EscapeDataString(phrase)}"; - } - - private string AddSiteSearchToQuery(string site = "linkedin.com") - { - return $"&siteSearch={site}&siteSearchFilter=i"; - } - - private string AddExcludeSiteSearchFromQuery(string site = "linkedin.com") - { - return $"&siteSearch={site}&siteSearchFilter=e"; - } - - private string AddSortingToQuery(string sort = "date") - { - return $"&sort={sort}"; - } - - private string AddAdditionalSearchTerms(string terms = "India") - { - return $"&hq={Uri.EscapeDataString(terms)}"; - } - - private string AddStartIndexToQuery(int startIndex = 1) - { - return $"&start={startIndex}"; - } - } -} \ No newline at end of file diff --git a/src/Backend/Operations/JobScrapperManager.cs b/src/Backend/Operations/JobScrapperManager.cs deleted file mode 100644 index 432e148..0000000 --- a/src/Backend/Operations/JobScrapperManager.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Common.Repositories; - -namespace Backend.Operations -{ - public class JobScrapperManager - { - private readonly ILogger logger; - private readonly GSEngine gsEngine; - private readonly AIEngine aiEngine; - private readonly JobsRepository jobsContainer; - public readonly JobScrapperSettingsManager settingsManager; - - - public JobScrapperManager(ILogger logger, GSEngine gsEngine, AIEngine aiEngine, JobScrapperSettingsManager settingsManager, JobsRepository jobsRepo) - { - this.logger = logger; - this.gsEngine = gsEngine; - this.aiEngine = aiEngine; - this.settingsManager = settingsManager; - this.jobsContainer = jobsRepo; - } - - public async Task RunAllScrappersAsync() - { - - } - - public async Task RunScrapperByIdAsync(string id) - { - var settings = this.settingsManager.GetSettingsById(id); - if (settings.Enabled) - { - var scrapper = new JobScrapper(settings, this.gsEngine, this.aiEngine, this.jobsContainer, this.logger); - Task.Run(async () => - { - try - { - await scrapper.RunAsync(); - } - catch (Exception ex) - { - this.logger.LogError($"Error occurred while running scrapper with ID {id}: {ex.Message}"); - } - }); - this.settingsManager.UpdateLastRunTime(id, DateTime.UtcNow); - } - else - { - this.logger.LogWarning($"Scrapper with ID {id} is disabled. Skipping execution."); - } - } - } -} \ No newline at end of file diff --git a/src/Backend/Operations/JobScrapperSettingsManager.cs b/src/Backend/Operations/JobScrapperSettingsManager.cs deleted file mode 100644 index 4771902..0000000 --- a/src/Backend/Operations/JobScrapperSettingsManager.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace Backend.Operations -{ - using System.Collections.Concurrent; - using System.Globalization; - using System.Reflection.Metadata.Ecma335; - using Common.Models; - - public class JobScrapperSettingsManager - { - private ConcurrentDictionary settingsStore = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - - public JobScrapperSettingsManager() {} - - public JobScrapperSettings CreateOrUpdateSettings(string id, Common.Models.Public.ScrapperSettings publicSettings) - { - var newSettings = new JobScrapperSettings( - id, - publicSettings.settings, - false); // Initially disabled - - settingsStore.AddOrUpdate(id, newSettings, (key, value) => - { - value.UpdateFromPublicModel(publicSettings); - value.LastUpdated = DateTime.UtcNow; - return value; - }); - - return settingsStore[id]; - } - - public JobScrapperSettings GetSettingsById(string id) - { - if(settingsStore.TryGetValue(id, out var settings)) - { - return settings; - } - return new JobScrapperSettings("NOT FOUND", new Common.Models.Public.QuerySettings(), false); - } - - public List GetAllSettings() - { - return settingsStore.Values.ToList(); - } - - public void UpdateLastRunTime(string id, DateTime runTime) - { - if(settingsStore.TryGetValue(id, out var settings)) - { - settings.LastRunTime = runTime; - settingsStore[id] = settings; - } - } - } -} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 5bace22..8d434c8 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -3,7 +3,9 @@ namespace Backend; using Backend.Operations; using Common.Cache; using Common.Constants; +using Common.Engines; using Common.Factories; +using Common.Managers; using Common.Repositories; using Microsoft.Azure.Cosmos; using Microsoft.Extensions.Logging.ApplicationInsights; @@ -59,12 +61,14 @@ public static void Main(string[] args) { // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); - builder.Services.AddSwaggerGen(); + builder.Services.AddSwaggerGen(c => + { + c.CustomSchemaIds(type => type.FullName); + }); builder.Logging.AddConsole(); } - // Register AppContext as singleton var config = builder.Configuration; #region Register Cosmos related services @@ -98,7 +102,6 @@ public static void Main(string[] args) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Backend/appsettings.json b/src/Backend/appsettings.json index 0ea12c8..c1e8513 100644 --- a/src/Backend/appsettings.json +++ b/src/Backend/appsettings.json @@ -11,7 +11,10 @@ "CosmosDbUri": "https://lcw-cosmos.documents.azure.com:443/", "AccountKey": "", "LCProject:DatabaseName": "LeetCodeWrapper", - "LCProject:ContainerName": "Problems" + "LCProject:ContainerName": "Problems", + "JobProject:DatabaseName": "JobDataBase", + "JobProject:ContainerName": "JobDetailsContainer", + "JobProject:ScraperContainerName": "ScraperSettingsContainer" }, "ApplicationInsights": { "LogLevel": { diff --git a/src/Common/Common.csproj b/src/Common/Common.csproj index 844bdc5..91dccc4 100644 --- a/src/Common/Common.csproj +++ b/src/Common/Common.csproj @@ -13,6 +13,9 @@ + + + diff --git a/src/Common/Constants/ConfigurationConstants.cs b/src/Common/Constants/ConfigurationConstants.cs index bb21455..b286deb 100644 --- a/src/Common/Constants/ConfigurationConstants.cs +++ b/src/Common/Constants/ConfigurationConstants.cs @@ -14,6 +14,9 @@ public static class ConfigurationConstants public const string ApplicationSettings = "ApplicationSettings"; public const string LCProjectContainerNameKey = "LCProject:ContainerName"; public const string LCProjectDatabaseNameKey = "LCProject:DatabaseName"; + public const string JobsProjectContainerNameKey = "JobProject:ContainerName"; + public const string JobsScraperSettingsContainerNameKey = "JobProject:ScraperContainerName"; + public const string JobsProjectDatabaseNameKey = "JobProject:DatabaseName"; #endregion } } diff --git a/src/Common/DatabaseModels/JobScrapperSettings.cs b/src/Common/DatabaseModels/JobScrapperSettings.cs new file mode 100644 index 0000000..17f3c6d --- /dev/null +++ b/src/Common/DatabaseModels/JobScrapperSettings.cs @@ -0,0 +1,82 @@ +using System; +using Common.Models.Public; +using PublicSettingsModel = Common.Models.Public.QuerySettings; + +namespace Common.DatabaseModels +{ + public class JobScrapperSettings + { + public string id { get; set; } + + public string settingName { get; set; } + + public bool enabled { get; set; } + + public DateTime lastUpdated { get; set; } + + public DateTime lastRunTime { get; set; } + + public int runIntervalInMinutes { get; set; } + + public QuerySettings settings { get; set; } + + public JobScrapperSettings(string id, + string settingName, + int? runIntervalsInMinutes, + PublicSettingsModel settings, + bool enabled = false) + { + this.id = id; + this.settingName = settingName; + this.enabled = enabled; + this.lastUpdated = DateTime.UtcNow; + this.lastRunTime = DateTime.MinValue; + this.runIntervalInMinutes = Math.Min(60, runIntervalsInMinutes ?? 60); + this.settings = new QuerySettings(settings); + } + + public void UpdateFromPublicModel(ScrapperSettings publicSettings) + { + if (publicSettings == null) throw new ArgumentNullException(nameof(publicSettings)); + + this.enabled = publicSettings.enabled; + this.runIntervalInMinutes = publicSettings.runIntervalInMinutes; + this.settings = new QuerySettings(publicSettings.settings); + this.lastUpdated = DateTime.UtcNow; + // keep SettingName unchanged unless public model provides one + if (!string.IsNullOrWhiteSpace(publicSettings.name)) + { + this.settingName = publicSettings.name; + } + } + + public ScrapperSettings ToPublicModel() + { + return new ScrapperSettings + { + id = this.id, + name = this.settingName, + enabled = this.enabled, + lastUpdated = this.lastUpdated, + lastRunTime = this.lastRunTime, + runIntervalInMinutes = this.runIntervalInMinutes, + settings = new PublicSettingsModel + { + query = this.settings.query, + locations = this.settings.locations, + sitesToInclude = this.settings.sitesToInclude, + sitesToExclude = this.settings.sitesToExclude, + exactTerms = this.settings.exactTerms, + negativeTerms = this.settings.negativeTerms, + additionalTerms = this.settings.additionalSearchterms, + lookBackDays = this.settings.lookBackDays + } + }; + } + + public QuerySettings GetQuerySettings() + { + return this.settings; + } + } +} \ No newline at end of file diff --git a/src/Common/Models/ProblemSchema.cs b/src/Common/DatabaseModels/ProblemSchema.cs similarity index 55% rename from src/Common/Models/ProblemSchema.cs rename to src/Common/DatabaseModels/ProblemSchema.cs index edbc20d..137bb81 100644 --- a/src/Common/Models/ProblemSchema.cs +++ b/src/Common/DatabaseModels/ProblemSchema.cs @@ -1,30 +1,32 @@ -namespace Common.Models +using Common.Models; + +namespace Common.DatabaseModels { public class ProblemSchema { public ProblemSchema() { } public ProblemSchema(ProblemSchema ps) { - this.id = ps.id; - this.title = ps.title; - this.url = ps.url; - this.difficulty = ps.difficulty; - this.acceptance = ps.acceptance; - this.frequency = ps.frequency; - this.companyList = new List>>(); - this.metadataList = new List>(); + id = ps.id; + title = ps.title; + url = ps.url; + difficulty = ps.difficulty; + acceptance = ps.acceptance; + frequency = ps.frequency; + companyList = new List>>(); + metadataList = new List>(); } public ProblemSchema(Problem p) { - this.id = p.id; - this.title = p.title; - this.url = p.url; - this.difficulty = p.difficulty; - this.acceptance = p.acceptance; - this.frequency = p.frequency; - this.companyList = p.companies.Select(kv => new KeyValuePair>(kv.Key, kv.Value.ToList())).ToList(); - this.metadataList = p.metadata.Select(kv => new KeyValuePair(kv.Key, kv.Value)).ToList(); + id = p.id; + title = p.title; + url = p.url; + difficulty = p.difficulty; + acceptance = p.acceptance; + frequency = p.frequency; + companyList = p.companies.Select(kv => new KeyValuePair>(kv.Key, kv.Value.ToList())).ToList(); + metadataList = p.metadata.Select(kv => new KeyValuePair(kv.Key, kv.Value)).ToList(); } public string id { get; set; } = string.Empty; diff --git a/src/Common/DatabaseModels/QuerySettings.cs b/src/Common/DatabaseModels/QuerySettings.cs new file mode 100644 index 0000000..c03571a --- /dev/null +++ b/src/Common/DatabaseModels/QuerySettings.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PublicSettingsModel = Common.Models.Public.QuerySettings; + +namespace Common.DatabaseModels +{ + + public class QuerySettings + { + public string query { get; set; } + public List locations { get; set; } + public List sitesToInclude { get; set; } + public List sitesToExclude { get; set; } + public List exactTerms { get; set; } + public List negativeTerms { get; set; } + public int lookBackDays { get; set; } = 1; + public List additionalSearchterms { get; set; } + + public QuerySettings(PublicSettingsModel qs) + { + query = qs.query; + locations = qs.locations; + sitesToInclude = qs.sitesToInclude; + sitesToExclude = qs.sitesToExclude; + exactTerms = qs.exactTerms; + negativeTerms = qs.negativeTerms; + additionalSearchterms = qs.additionalTerms; + } + } +} diff --git a/src/Common/Models/ScrappedJob.cs b/src/Common/DatabaseModels/ScrappedJob.cs similarity index 54% rename from src/Common/Models/ScrappedJob.cs rename to src/Common/DatabaseModels/ScrappedJob.cs index 2758490..f334826 100644 --- a/src/Common/Models/ScrappedJob.cs +++ b/src/Common/DatabaseModels/ScrappedJob.cs @@ -1,4 +1,6 @@ -namespace Common.Models +using Common.Models; + +namespace Common.DatabaseModels { public class ScrappedJob { @@ -9,23 +11,27 @@ public class ScrappedJob public string description { get; set; } public string link { get; set; } public DateTime scrappedTime { get; set; } + public DateTime JobPostedTime { get; set; } + public string companyName { get; set; } + public string jobType { get; set; } + public string location { get; set; } public List tags { get; set; } = new List(); public ScrappedJob() { } public ScrappedJob(Item item, DateTime scrappedTime) { - this.title = item.title; - this.displayLink = item.displayLink; - this.snippet = item.snippet; - this.link = item.link; - this.id = GenerateHashId(item.link, item.title, item.displayLink); + title = item.title; + displayLink = item.displayLink; + snippet = item.snippet; + link = item.link; + id = GenerateHashId(item.link, item.title, item.displayLink); this.scrappedTime = scrappedTime; - this.description = "NA"; + description = "NA"; } private string GenerateHashId(string v1, string v2, string v3) { - return Common.Helper.FastHashId.GenerateHashId(v1, v2, v3); + return Helper.FastHashId.GenerateHashId(v1, v2, v3); } } } \ No newline at end of file diff --git a/src/Backend/Operations/AIEngine.cs b/src/Common/Engines/AIEngine.cs similarity index 63% rename from src/Backend/Operations/AIEngine.cs rename to src/Common/Engines/AIEngine.cs index 631336c..ee3fa22 100644 --- a/src/Backend/Operations/AIEngine.cs +++ b/src/Common/Engines/AIEngine.cs @@ -1,4 +1,4 @@ -namespace Backend.Operations +namespace Common.Engines { using Azure; using Azure.AI; @@ -7,8 +7,10 @@ namespace Backend.Operations using Azure.AI.Projects; using Azure.AI.Agents.Persistent; using System.Diagnostics; - using Common.Models; using Newtonsoft.Json; + using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Configuration; + using Common.DatabaseModels; public class AIEngine { @@ -79,51 +81,52 @@ private async Task GetResponseInternalAsync(string input) { if (!IsReady()) { - this.logger.LogError($"AIEngine is not properly initialized. Given input: {input}"); - throw new InvalidOperationException("AIEngine is not properly initialized."); + logger.LogError($"AIEngine is not properly initialized. Input: {input}"); + throw new InvalidOperationException("AIEngine not initialized."); } - PersistentAgentThread thread = agentsClient.Threads.CreateThread(); - - PersistentThreadMessage messageResponse = agentsClient.Messages.CreateMessage( - thread.Id, - MessageRole.User, - input); + var threadResponse = await agentsClient.Threads.CreateThreadAsync(); + var thread = threadResponse.Value; - ThreadRun run = agentsClient.Runs.CreateRun( - thread.Id, - agent.Id); - - // Poll until the run reaches a terminal status - do - { - await Task.Delay(TimeSpan.FromMilliseconds(500)); - run = agentsClient.Runs.GetRun(thread.Id, run.Id); - } - while (run.Status == RunStatus.Queued - || run.Status == RunStatus.InProgress); - if (run.Status != RunStatus.Completed) + try { - this.logger.LogError($"Run failed or was canceled. ThreadId: {thread.Id} Last error: {run.LastError?.Message}"); - throw new InvalidOperationException($"Run failed or was canceled: {run.LastError?.Message}"); - } + await agentsClient.Messages.CreateMessageAsync(thread.Id, MessageRole.User, input); + var runResponse = await agentsClient.Runs.CreateRunAsync(thread.Id, agent.Id); + var run = runResponse.Value; - Pageable messages = agentsClient.Messages.GetMessages( - thread.Id, order: ListSortOrder.Ascending); - - string response = string.Empty; - PersistentThreadMessage lastThreadMessage = messages.Last(); + // Poll until terminal state + do + { + await Task.Delay(500); + run = await agentsClient.Runs.GetRunAsync(thread.Id, run.Id); + } + while (run.Status == RunStatus.Queued || run.Status == RunStatus.InProgress); - foreach (MessageContent contentItem in lastThreadMessage.ContentItems) - { - if (contentItem is MessageTextContent textItem) + if (run.Status != RunStatus.Completed) { - response += textItem.Text; + logger.LogError($"Run failed. ThreadId={thread.Id}, Error={run.LastError?.Message}"); + throw new InvalidOperationException($"Run failed: {run.LastError?.Message}"); + } + + // Fetch all messages in ascending order + var messages = agentsClient.Messages.GetMessagesAsync(thread.Id, order: ListSortOrder.Ascending); + + string response = string.Empty; + PersistentThreadMessage lastThreadMessage = messages.ToBlockingEnumerable().Last(); + foreach (MessageContent contentItem in lastThreadMessage.ContentItems) + { + if (contentItem is MessageTextContent textItem) + { + response += textItem.Text; + } } - } - agentsClient.Threads.DeleteThread(thread.Id); - return response; + return response; + } + finally + { + await agentsClient.Threads.DeleteThreadAsync(thread.Id); + } } - } + } } \ No newline at end of file diff --git a/src/Common/Engines/GSEngine.cs b/src/Common/Engines/GSEngine.cs new file mode 100644 index 0000000..231c96b --- /dev/null +++ b/src/Common/Engines/GSEngine.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Common.DatabaseModels; +using Common.Models; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; + +namespace Common.Engines +{ + public class GSEngine + { + private readonly string apiKey; + private readonly string searchEngineId; + private readonly HttpClient httpClient; + private string baseUrl = "https://customsearch.googleapis.com/customsearch/v1"; + private int maxResultsPerSearch = 150; + private readonly ILogger logger; + + public GSEngine(IConfiguration configuration, ILogger _logger) + { + this.apiKey = configuration["GoogleSearch:ApiKey"] ?? throw new ArgumentNullException("Google Search API Key is not configured."); + this.searchEngineId = configuration["GoogleSearch:SearchEngineId"] ?? throw new ArgumentNullException("Google Search Engine ID is not configured."); + this.logger = _logger; + this.httpClient = new HttpClient(); + } + + public async Task> SearchQueryAsync(JobScrapperSettings settings) + { + if (settings == null) throw new ArgumentNullException(nameof(settings)); + + var qsettings = settings.GetQuerySettings() ?? throw new InvalidOperationException("Query settings cannot be null."); + var allJobs = new List(); + int startIndex = 1; + int totalResults = 0; + + var sb = new StringBuilder(); + sb.Append($"{this.baseUrl}?key={apiKey}&cx={searchEngineId}"); + + // base query + var baseQuery = qsettings.query ?? string.Empty; + sb.Append($"&q={Uri.EscapeDataString(baseQuery)}"); + + // date restriction + if (qsettings.lookBackDays > 0) + { + sb.Append(AddDateRestrictionToQuery(qsettings.lookBackDays)); + } + + // Exact terms (join list if provided) + if (qsettings.exactTerms != null && qsettings.exactTerms.Any()) + { + var exact = string.Join(" ", qsettings.exactTerms.Where(s => !string.IsNullOrWhiteSpace(s))); + if (!string.IsNullOrWhiteSpace(exact)) sb.Append(AddExactTermsToQuery(exact)); + } + + // Negative terms + if (qsettings.negativeTerms != null && qsettings.negativeTerms.Any()) + { + var neg = string.Join(" ", qsettings.negativeTerms.Where(s => !string.IsNullOrWhiteSpace(s))); + if (!string.IsNullOrWhiteSpace(neg)) sb.Append(AddNegativeTermToQuery(neg)); + } + + // Location - use first location if present (api uses gl for country) + if (qsettings.locations != null && qsettings.locations.Any() && !string.IsNullOrWhiteSpace(qsettings.locations.First())) + { + sb.Append(AddClientLocationToQuery(qsettings.locations.First())); + } + + // Site include / exclude - use first for siteSearch (API supports one siteSearch parameter) + if (qsettings.sitesToInclude != null && qsettings.sitesToInclude.Any() && !string.IsNullOrWhiteSpace(qsettings.sitesToInclude.First())) + { + sb.Append(AddSiteSearchToQuery(qsettings.sitesToInclude.First())); + } + else if (qsettings.sitesToExclude != null && qsettings.sitesToExclude.Any() && !string.IsNullOrWhiteSpace(qsettings.sitesToExclude.First())) + { + // prefer include if present; otherwise exclude + sb.Append(AddExcludeSiteSearchFromQuery(qsettings.sitesToExclude.First())); + } + + // Additional terms (hq) + if (qsettings.additionalSearchterms != null && qsettings.additionalSearchterms.Any()) + { + var add = string.Join(" ", qsettings.additionalSearchterms.Where(s => !string.IsNullOrWhiteSpace(s))); + if (!string.IsNullOrWhiteSpace(add)) sb.Append(AddadditionalSearchterms(add)); + } + + var template = sb.ToString(); + + do + { + var url = template + AddStartIndexToQuery(startIndex); + var res = await SearchRawUrlAsync(url); + if (res == null) + { + logger.LogError("SearchRawUrlAsync returned null for url: {url}", url); + break; + } + + // No items => stop + if (res.items == null || res.items.Count == 0) + { + logger.LogInformation("No items returned for url: {url}", url); + break; + } + + foreach (var item in res.items) + { + try + { + var job = new ScrappedJob(item, DateTime.UtcNow); + allJobs.Add(job); + } + catch (Exception ex) + { + logger.LogWarning(ex, "Skipping item due to processing error."); + } + } + + // Determine total results + if (!string.IsNullOrWhiteSpace(res.searchInformation?.totalResults)) + { + if (!int.TryParse(res.searchInformation.totalResults, out totalResults)) + { + // try fallback to queries.request[0].totalResults + var reqTotal = res.queries?.request?.FirstOrDefault()?.totalResults; + if (!int.TryParse(reqTotal, out totalResults)) totalResults = int.MaxValue; + } + } + else + { + var reqTotal = res.queries?.request?.FirstOrDefault()?.totalResults; + if (!int.TryParse(reqTotal, out totalResults)) totalResults = int.MaxValue; + } + + // Advance to next page if present + if (res.queries?.nextPage != null && res.queries.nextPage.Count > 0) + { + var next = res.queries.nextPage[0]; + // Use next.startIndex if present; otherwise increment by count + if (next.startIndex > 0) + { + startIndex = next.startIndex; + } + else + { + var count = res.queries.request?.FirstOrDefault()?.count ?? res.items.Count; + if (count <= 0) break; + startIndex += count; + } + } + else + { + // no next page -> stop + break; + } + + // safety: prevent infinite looping + if (startIndex <= 0 || startIndex > maxResultsPerSearch) break; + } + while (startIndex <= maxResultsPerSearch && (totalResults == 0 || startIndex <= totalResults)); + + this.logger.LogInformation("Fetched {count} jobs. Total available (approx): {total}. Url template: {template}", allJobs.Count, totalResults, template); + return allJobs; + } + + public async Task SearchRawUrlAsync(string url) + { + try + { + var response = await httpClient.GetAsync(url); + if (!response.IsSuccessStatusCode) + { + logger.LogWarning("Google Search API returned status {status} for url {url}", response.StatusCode, url); + return null; + } + + var content = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(content); + } + catch (Exception ex) + { + logger.LogError(ex, "Error occurred during Google Search API call."); + } + + return null; + } + + private string AddClientLocationToQuery(string location = "in") + { + return $"&gl={Uri.EscapeDataString(location)}"; + } + + private string AddDateRestrictionToQuery(int previousNDays = 1) + { + return $"&dateRestrict=d{previousNDays}"; + } + + private string AddNegativeTermToQuery(string phrase = "manager") + { + return $"&excludeTerms={Uri.EscapeDataString(phrase)}"; + } + + private string AddExactTermsToQuery(string phrase = "Software Engineer") + { + return $"&exactTerms={Uri.EscapeDataString(phrase)}"; + } + + private string AddSiteSearchToQuery(string site = "linkedin.com") + { + return $"&siteSearch={Uri.EscapeDataString(site)}&siteSearchFilter=i"; + } + + private string AddExcludeSiteSearchFromQuery(string site = "linkedin.com") + { + return $"&siteSearch={Uri.EscapeDataString(site)}&siteSearchFilter=e"; + } + + private string AddSortingToQuery(string sort = "date") + { + return $"&sort={Uri.EscapeDataString(sort)}"; + } + + private string AddadditionalSearchterms(string terms = "India") + { + return $"&hq={Uri.EscapeDataString(terms)}"; + } + + private string AddStartIndexToQuery(int startIndex = 1) + { + return $"&start={startIndex}"; + } + } +} \ No newline at end of file diff --git a/src/Common/Factories/CosmosContainerFactory.cs b/src/Common/Factories/CosmosContainerFactory.cs index 2253602..f54b062 100644 --- a/src/Common/Factories/CosmosContainerFactory.cs +++ b/src/Common/Factories/CosmosContainerFactory.cs @@ -3,6 +3,7 @@ using Common.Models.Miscellaneous; using Microsoft.Azure.Cosmos; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; namespace Common.Factories { @@ -12,33 +13,30 @@ public class CosmosContainerFactory : ICosmosContainerFactory private readonly IConfiguration _configuration; - public CosmosContainerFactory(CosmosClient cosmosClient, IConfiguration configuration) + private readonly ILogger _logger; + public CosmosContainerFactory(CosmosClient cosmosClient, + IConfiguration configuration, + ILogger logger) { _cosmosClient = cosmosClient; _configuration = configuration; + _logger = logger; } public Container GetContainer(CosmosContainerEnum container) { var containerDetails = LoadContainerDetails(); - string dbId; - string containerId; - switch (container) + + if(!containerDetails.ContainsKey(container)) { - case CosmosContainerEnum.ProblemsContainer: - dbId = containerDetails[container].DatabaseName; - containerId = containerDetails[container].ContainerName; - break; - case CosmosContainerEnum.JobsContainer: - dbId = "JobDataBase"; - containerId = "JobDetailsContainer"; - break; - default: - throw new ArgumentOutOfRangeException(nameof(container), container, null); + _logger.LogError("Container details not found for container: {Container}", container); + throw new ArgumentOutOfRangeException(nameof(container), container, null); } - - var db = _cosmosClient.GetDatabase(dbId); - return db.GetContainer(containerId); + + var databaseName = containerDetails[container].DatabaseName; + var containerName = containerDetails[container].ContainerName; + var dbInstnace = _cosmosClient.GetDatabase(databaseName); + return dbInstnace.GetContainer(containerName); } private Dictionary LoadContainerDetails() @@ -49,6 +47,14 @@ private Dictionary LoadContainerDetails() { CosmosContainerEnum.ProblemsContainer, new ContainerDetails(config[ConfigurationConstants.LCProjectDatabaseNameKey], config[ConfigurationConstants.LCProjectContainerNameKey]) + }, + { + CosmosContainerEnum.JobsContainer, + new ContainerDetails(config[ConfigurationConstants.JobsProjectDatabaseNameKey], config[ConfigurationConstants.JobsProjectContainerNameKey]) + }, + { + CosmosContainerEnum.ScrapperSettingsContainer, + new ContainerDetails(config[ConfigurationConstants.JobsProjectDatabaseNameKey], config[ConfigurationConstants.JobsScraperSettingsContainerNameKey]) } }; } diff --git a/src/Common/IFilter.cs b/src/Common/IFilter.cs new file mode 100644 index 0000000..0a90e8c --- /dev/null +++ b/src/Common/IFilter.cs @@ -0,0 +1,7 @@ +namespace Common +{ + public interface IFilter + { + public List ApplyFilterAsync(List entities); + } +} \ No newline at end of file diff --git a/src/Backend/Operations/JobScrapper.cs b/src/Common/Managers/JobScrapper.cs similarity index 79% rename from src/Backend/Operations/JobScrapper.cs rename to src/Common/Managers/JobScrapper.cs index 349d9e7..f7f9a45 100644 --- a/src/Backend/Operations/JobScrapper.cs +++ b/src/Common/Managers/JobScrapper.cs @@ -1,23 +1,30 @@ -namespace Backend.Operations +namespace Common.Managers + { - using Common.Models; + using Common.DatabaseModels; + using Common.Engines; using Common.Repositories; + using Microsoft.Extensions.Logging; public class JobScrapper { private JobScrapperSettings settings; private GSEngine gsEngine; private AIEngine aiEngine; - private JobsRepository jobsContainer; + private JobsRepository jobsRepository; private ILogger logger; - public JobScrapper(JobScrapperSettings settings, GSEngine gsEngine, AIEngine aiEngine, JobsRepository jobsRepo, ILogger logger) + public JobScrapper(GSEngine gsEngine, AIEngine aiEngine, JobsRepository jobsRepo, ILogger logger) { this.logger = logger; this.gsEngine = gsEngine; this.aiEngine = aiEngine; + this.jobsRepository = jobsRepo; + } + + public void ConfigureSettings(JobScrapperSettings settings) + { this.settings = settings; - this.jobsContainer = jobsRepo; } public async Task RunAsync() @@ -49,7 +56,7 @@ public async Task RunAsync() foreach (var job in searchResults) { - var success = await this.jobsContainer.CreateOrUpdateJobAsync(job); + var success = await this.jobsRepository.CreateIfNotExistsAsync(job); if (!success) { this.logger.LogError($"Failed to push job {job.id} to JobsRepository."); diff --git a/src/Common/Managers/JobScrapperSettingsManager.cs b/src/Common/Managers/JobScrapperSettingsManager.cs new file mode 100644 index 0000000..3d434f7 --- /dev/null +++ b/src/Common/Managers/JobScrapperSettingsManager.cs @@ -0,0 +1,93 @@ +namespace Common.Managers +{ + using Common.DatabaseModels; + using Common.Enums; + using Common.Factories; + using Common.Models.Public; + using Microsoft.Azure.Cosmos; + using Microsoft.Extensions.Logging; + public class JobScrapperSettingsManager + { + private readonly Container _scrapperSettingsContainer; + private readonly ILogger _logger; + + public JobScrapperSettingsManager(ICosmosContainerFactory cosmosContainerFactory, + ILogger logger) + { + _scrapperSettingsContainer = cosmosContainerFactory.GetContainer(CosmosContainerEnum.ScrapperSettingsContainer); + _logger = logger; + } + + public async Task CreateOrUpdateSettings(string id, ScrapperSettings publicSettings) + { + if(publicSettings == null) + { + throw new ArgumentNullException(nameof(publicSettings), "Public settings cannot be null"); + } + + var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT TOP 1* from ScraperSettingsContainer where Id = {id}"); + + int count = 0; + var existingSettingsList = new List(); + var returnSettings = default(JobScrapperSettings); + while (settingsInDb.HasMoreResults) + { + var response = await settingsInDb.ReadNextAsync(); + existingSettingsList.AddRange(response); + } + + if(count > 0) + { + var existingSettings = existingSettingsList[0]; + existingSettings.UpdateFromPublicModel(publicSettings); + await _scrapperSettingsContainer.ReplaceItemAsync( + existingSettings, + existingSettings.id + ); + returnSettings = existingSettings; + } + else + { + id = Guid.NewGuid().ToString(); + returnSettings = await _scrapperSettingsContainer.CreateItemAsync( + new JobScrapperSettings( + id, + publicSettings.name, + publicSettings.runIntervalInMinutes, + publicSettings.settings, + true) + ); + } + + return returnSettings; + } + + public async Task GetSettingsById(string id) + { + var setting = await _scrapperSettingsContainer.ReadItemAsync( + id, + new PartitionKey(id) + ); + + if(setting == null) + { + _logger.LogError($"No JobScrapperSettings found with id: {id}"); + throw new KeyNotFoundException($"No JobScrapperSettings found with id: {id}"); + } + + return setting; + } + + public async Task> GetAllSettings() + { + var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT * from ScraperSettingsContainer"); + var allSettings = new List(); + while (settingsInDb.HasMoreResults) + { + var response = await settingsInDb.ReadNextAsync(); + allSettings.AddRange(response); + } + return allSettings; + } + } +} \ No newline at end of file diff --git a/src/Common/Models/JobScrapperSettings.cs b/src/Common/Models/JobScrapperSettings.cs deleted file mode 100644 index d97b7a4..0000000 --- a/src/Common/Models/JobScrapperSettings.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace Common.Models -{ - public class JobScrapperSettings - { - public string Id { get; set; } - public bool Enabled { get; set; } - public DateTime LastUpdated { get; set; } - public DateTime LastRunTime { get; set; } - public int RunIntervalInHours { get; set; } - public QuerySettings Settings { get; set; } - - public JobScrapperSettings(string id, Models.Public.QuerySettings settings, bool enabled = false) - { - this.Id = id; - this.Enabled = enabled; - this.LastUpdated = DateTime.UtcNow; - this.LastRunTime = DateTime.MinValue; - this.RunIntervalInHours = 24; // Default to daily runs - this.Settings = new Models.QuerySettings(settings); - } - - public string GetQueryParameters() - { - return string.Empty; - } - - public void UpdateFromPublicModel(Models.Public.ScrapperSettings publicSettings) - { - this.Enabled = publicSettings.enabled; - this.RunIntervalInHours = publicSettings.runIntervalInHours; - this.Settings = new Models.QuerySettings(publicSettings.settings); - } - - public Models.Public.ScrapperSettings ToPublicModel() - { - return new Models.Public.ScrapperSettings - { - id = this.Id, - enabled = this.Enabled, - lastUpdated = this.LastUpdated, - lastRunTime = this.LastRunTime, - runIntervalInHours = this.RunIntervalInHours, - settings = new Models.Public.QuerySettings - { - query = this.Settings.Query, - location = this.Settings.Location, - siteToInclude = this.Settings.SiteToInclude, - siteToExclude = this.Settings.SiteToExclude, - exactTerms = this.Settings.ExactTerms, - negativeTerms = this.Settings.NegativeTerms - } - }; - } - - public override string ToString() - { - return $"JobScrapperSettings(Id={Id}, Enabled={Enabled}, LastUpdated={LastUpdated}, LastRunTime={LastRunTime}, RunIntervalInHours={RunIntervalInHours}, Settings=[Query={Settings.Query}, Location={Settings.Location}])"; - } - } - - public class QuerySettings - { - public string Query { get; set; } - public string Location { get; set; } - public string SiteToInclude { get; set; } - public string SiteToExclude { get; set; } - public string ExactTerms { get; set; } - public string NegativeTerms { get; set; } - public int lookBackDays = 1; - public string AdditionalSearchterms { get; set; } - - public QuerySettings(Models.Public.QuerySettings qs) - { - this.Query = qs.query; - this.Location = qs.location; - this.SiteToInclude = qs.siteToInclude; - this.SiteToExclude = qs.siteToExclude; - this.ExactTerms = qs.exactTerms; - this.NegativeTerms = qs.negativeTerms; - this.AdditionalSearchterms = qs.additionalTerms; - } - } -} \ No newline at end of file diff --git a/src/Common/Models/Problem.cs b/src/Common/Models/Problem.cs index 27b6f19..714968f 100644 --- a/src/Common/Models/Problem.cs +++ b/src/Common/Models/Problem.cs @@ -1,3 +1,5 @@ +using Common.DatabaseModels; + namespace Common.Models { public enum Difficulty diff --git a/src/Common/Models/Public/QuerySettings.cs b/src/Common/Models/Public/QuerySettings.cs new file mode 100644 index 0000000..682021b --- /dev/null +++ b/src/Common/Models/Public/QuerySettings.cs @@ -0,0 +1,15 @@ +namespace Common.Models.Public +{ + + public class QuerySettings + { + public string query { get; set; } + public List locations { get; set; } + public List sitesToInclude { get; set; } + public List sitesToExclude { get; set; } + public List exactTerms { get; set; } + public List negativeTerms { get; set; } + public List additionalTerms { get; set; } + public int lookBackDays { get; set; } + } +} diff --git a/src/Common/Models/Public/ScrapperSettings.cs b/src/Common/Models/Public/ScrapperSettings.cs index 1a6a320..85d424b 100644 --- a/src/Common/Models/Public/ScrapperSettings.cs +++ b/src/Common/Models/Public/ScrapperSettings.cs @@ -3,21 +3,11 @@ namespace Common.Models.Public public class ScrapperSettings { public string id { get; set; } + public string name { get; set; } public bool enabled { get; set; } public DateTime lastUpdated { get; set; } public DateTime lastRunTime { get; set; } - public int runIntervalInHours { get; set; } + public int runIntervalInMinutes { get; set; } public QuerySettings settings { get; set; } } - - public class QuerySettings - { - public string query { get; set; } - public string location { get; set; } - public string siteToInclude { get; set; } - public string siteToExclude { get; set; } - public string exactTerms { get; set; } - public string negativeTerms { get; set; } - public string additionalTerms { get; set; } - } } \ No newline at end of file diff --git a/src/Common/Queries/JobQuery.cs b/src/Common/Queries/JobQuery.cs new file mode 100644 index 0000000..3bcce34 --- /dev/null +++ b/src/Common/Queries/JobQuery.cs @@ -0,0 +1,12 @@ +namespace Common.Queries +{ + public class JobQuery + { + public string JobType { get; set; } // Software Engineer, Data Scientist, etc. + public DateTime StartDate { get; set; } = DateTime.UtcNow; // Start date for the job posting + public DateTime EndDate { get; set; } = DateTime.UtcNow; // End date for the job posting + public List Companies { get; set; } // List of companies to filter + public List Locations { get; set; } // List of locations to filter + public string JobLevel { get; set; } // Entry Level, Mid Level, Senior Level, etc. + } +} diff --git a/src/Common/Repositories/JobScrapperSettingsRepository.cs b/src/Common/Repositories/JobScrapperSettingsRepository.cs new file mode 100644 index 0000000..8b2edb0 --- /dev/null +++ b/src/Common/Repositories/JobScrapperSettingsRepository.cs @@ -0,0 +1,53 @@ +using Common.DatabaseModels; +using Common.Enums; +using Common.Factories; +using Common.Managers; +using Microsoft.Azure.Cosmos; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common.Repositories +{ + public class JobScrapperSettingsRepository + { + private readonly Container _scrapperSettingsContainer; + private readonly ILogger _logger; + + public JobScrapperSettingsRepository(ICosmosContainerFactory cosmosContainerFactory, + ILogger logger) + { + _scrapperSettingsContainer = cosmosContainerFactory.GetContainer(CosmosContainerEnum.ScrapperSettingsContainer); + _logger = logger; + } + + public async Task> GetAllSettings() + { + var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT * from JobScrapperSettings"); + var allSettings = new List(); + while (settingsInDb.HasMoreResults) + { + var response = await settingsInDb.ReadNextAsync(); + allSettings.AddRange(response); + } + return allSettings; + } + + public async Task UpdateSettingsAsync(string id, JobScrapperSettings jobSetting) + { + try + { + await _scrapperSettingsContainer.UpsertItemAsync(jobSetting, new PartitionKey(id)); + _logger.LogInformation($"Successfully updated JobScrapperSettings with id: {id}"); + } + catch (Exception ex) + { + _logger.LogError($"Error updating JobScrapperSettings with id: {id}. Exception: {ex.Message}"); + throw; + } + } + } +} diff --git a/src/Common/Repositories/JobsRepository.cs b/src/Common/Repositories/JobsRepository.cs index f95d4b8..3086fdb 100644 --- a/src/Common/Repositories/JobsRepository.cs +++ b/src/Common/Repositories/JobsRepository.cs @@ -1,10 +1,12 @@ namespace Common.Repositories { + using Common.DatabaseModels; using Common.Enums; using Common.Factories; - using Common.Models; + using Common.Queries; using Microsoft.Azure.Cosmos; using Microsoft.Extensions.Logging; + using System.Net; public class JobsRepository { @@ -50,22 +52,41 @@ public async Task GetJobByIdAsync(string id) } } - public async Task CreateOrUpdateJobAsync(ScrappedJob job) + /// + /// Create the item only if it does not already exist using a single DB call. + /// Returns true if the item was created, false if it already existed. + /// + public async Task CreateIfNotExistsAsync(ScrappedJob job) { + if (job == null) throw new ArgumentNullException(nameof(job)); try { - // TODO: Do async inserts for faster performance - var res = await this.jobsContainer.UpsertItemAsync(job); + var requestOptions = new ItemRequestOptions + { + // Instruct Cosmos to only create if the item does not exist. + // SDK will translate this to an If-None-Match header. + IfNoneMatchEtag = "*" + }; + + var response = await this.jobsContainer.CreateItemAsync(job, new PartitionKey(job.id), requestOptions); + // Created successfully + this.logger.LogInformation("Created job {id} in Cosmos DB. RU charge: {ru}", job.id, response.RequestCharge); + return true; } - catch (Exception ex) + catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.PreconditionFailed || ex.StatusCode == HttpStatusCode.Conflict) { - this.logger.LogError($"Failed to push job: {job.id} to container. Ex: {ex}"); + // Item already exists (server enforces the If-None-Match precondition). + this.logger.LogInformation("Job {id} already exists. Skipping create.", job.id); return false; } - - return true; + catch (Exception ex) + { + this.logger.LogError(ex, "Failed to create job {id} in Cosmos DB.", job.id); + throw; + } } + private async Task> QueryJobsAsync(string query) { var queryDefinition = new QueryDefinition(query); @@ -79,5 +100,99 @@ private async Task> QueryJobsAsync(string query) this.logger.LogInformation($"Retrieved {results.Count} jobs from Cosmos DB. Query: {query}"); return results; } + private async Task> QueryJobsAsync(QueryDefinition queryDefinition) + { + var queryResultSetIterator = jobsContainer.GetItemQueryIterator(queryDefinition); + List results = new List(); + while (queryResultSetIterator.HasMoreResults) + { + var response = await queryResultSetIterator.ReadNextAsync(); + results.AddRange(response); + } + this.logger.LogInformation($"Retrieved {results.Count} jobs from Cosmos DB."); + return results; + } + + public async Task> GetJobsFromQuery(JobQuery jobquery) + { + if (jobquery == null) throw new ArgumentNullException(nameof(jobquery)); + + var sql = "SELECT * FROM c WHERE 1=1"; + var qd = new QueryDefinition(sql); + + // JobType: search title or tags + if (!string.IsNullOrWhiteSpace(jobquery.JobType)) + { + qd = qd.WithParameter("@jobType", jobquery.JobType); + sql += " AND CONTAINS(c.jobType, @jobType, true)"; + } + + // Companies (list) + if (jobquery.Companies != null && jobquery.Companies.Count > 0) + { + var companyConditions = new List(); + for (int i = 0; i < jobquery.Companies.Count; i++) + { + var param = $"@company{i}"; + qd = qd.WithParameter(param, jobquery.Companies[i]); + companyConditions.Add($"c.companyName = {param}"); + } + sql += " AND (" + string.Join(" OR ", companyConditions) + ")"; + } + + // Locations: fallback to searching in displayLink, snippet or description + if (jobquery.Locations != null && jobquery.Locations.Count > 0) + { + var locationConditions = new List(); + for (int i = 0; i < jobquery.Locations.Count; i++) + { + var param = $"@location{i}"; + qd = qd.WithParameter(param, jobquery.Locations[i]); + locationConditions.Add($"CONTAINS(c.location, {param}, true)"); + } + sql += " AND (" + string.Join(" OR ", locationConditions) + ")"; + } + + // JobLevel: search in tags array (case-insensitive contains) + if (!string.IsNullOrWhiteSpace(jobquery.JobLevel)) + { + qd = qd.WithParameter("@jobLevel", jobquery.JobLevel); + // Use EXISTS with an IN on the tags array and CONTAINS for case-insensitive matching + sql += " AND EXISTS(SELECT VALUE t FROM t IN c.tags WHERE CONTAINS(t, @jobLevel, true))"; + } + + // Date range (JobPostedTime) + if (jobquery.StartDate > DateTime.MinValue) + { + qd = qd.WithParameter("@startDate", jobquery.StartDate); + sql += " AND c.jobPostedTime >= @startDate"; + } + if (jobquery.EndDate > DateTime.MinValue) + { + qd = qd.WithParameter("@endDate", jobquery.EndDate); + sql += " AND c.jobPostedTime <= @endDate"; + } + + // final ordering / limit - optional, keep callers responsible if needed + qd = new QueryDefinition(sql); // rebuild with final SQL + // re-add parameters (QueryDefinition is immutable-like with chaining, but to keep it simple rebuild) + // Add parameters again + if (!string.IsNullOrWhiteSpace(jobquery.JobType)) qd = qd.WithParameter("@jobType", jobquery.JobType); + if (jobquery.Companies != null) + { + for (int i = 0; i < jobquery.Companies.Count; i++) qd = qd.WithParameter($"@company{i}", jobquery.Companies[i]); + } + if (jobquery.Locations != null) + { + for (int i = 0; i < jobquery.Locations.Count; i++) qd = qd.WithParameter($"@location{i}", jobquery.Locations[i]); + } + if (!string.IsNullOrWhiteSpace(jobquery.JobLevel)) qd = qd.WithParameter("@jobLevel", jobquery.JobLevel); + if (jobquery.StartDate > DateTime.MinValue) qd = qd.WithParameter("@startDate", jobquery.StartDate); + if (jobquery.EndDate > DateTime.MinValue) qd = qd.WithParameter("@endDate", jobquery.EndDate); + + logger.LogInformation($"Constructed job query: {sql}"); + + return await QueryJobsAsync(qd); + } } } diff --git a/src/Common/Repositories/ProblemRepository.cs b/src/Common/Repositories/ProblemRepository.cs index 8ca5d29..1d5fa79 100644 --- a/src/Common/Repositories/ProblemRepository.cs +++ b/src/Common/Repositories/ProblemRepository.cs @@ -1,4 +1,5 @@ -using Common.Enums; +using Common.DatabaseModels; +using Common.Enums; using Common.Factories; using Common.Models; using Microsoft.Azure.Cosmos; diff --git a/src/PetProjectAzFunctions/.gitignore b/src/PetProjectAzFunctions/.gitignore new file mode 100644 index 0000000..ff5b00c --- /dev/null +++ b/src/PetProjectAzFunctions/.gitignore @@ -0,0 +1,264 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# Azure Functions localsettings file +local.settings.json + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/src/PetProjectAzFunctions/Dockerfile b/src/PetProjectAzFunctions/Dockerfile new file mode 100644 index 0000000..61200dd --- /dev/null +++ b/src/PetProjectAzFunctions/Dockerfile @@ -0,0 +1,29 @@ +# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. + +# This stage is used when running from VS in fast mode (Default for Debug configuration) +FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0 AS base +WORKDIR /home/site/wwwroot +EXPOSE 8080 + + +# This stage is used to build the service project +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src +COPY ["PetProjectAzFunctions/PetProjectAzFunctions.csproj", "PetProjectAzFunctions/"] +RUN dotnet restore "./PetProjectAzFunctions/PetProjectAzFunctions.csproj" +COPY . . +WORKDIR "/src/PetProjectAzFunctions" +RUN dotnet build "./PetProjectAzFunctions.csproj" -c $BUILD_CONFIGURATION -o /app/build + +# This stage is used to publish the service project to be copied to the final stage +FROM build AS publish +ARG BUILD_CONFIGURATION=Release +RUN dotnet publish "./PetProjectAzFunctions.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration) +FROM base AS final +WORKDIR /home/site/wwwroot +COPY --from=publish /app/publish . +ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ + AzureFunctionsJobHost__Logging__Console__IsEnabled=true \ No newline at end of file diff --git a/src/PetProjectAzFunctions/JobOpeningsSyncFunction.cs b/src/PetProjectAzFunctions/JobOpeningsSyncFunction.cs new file mode 100644 index 0000000..a87b8db --- /dev/null +++ b/src/PetProjectAzFunctions/JobOpeningsSyncFunction.cs @@ -0,0 +1,67 @@ +using System; +using Common.Managers; +using Common.Repositories; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace PetProjectAzFunctions +{ + public class JobOpeningsSyncFunction + { + private readonly ILogger _logger; + + private readonly JobScrapperSettingsRepository _jobScrapperSettingsRepository; + + private readonly IServiceProvider _serviceProvider; + + public JobOpeningsSyncFunction(ILoggerFactory loggerFactory, + JobScrapperSettingsRepository jobScrapperSettingsRepository, + IServiceProvider serviceProvider) + { + _logger = loggerFactory.CreateLogger(); + _jobScrapperSettingsRepository = jobScrapperSettingsRepository; + _serviceProvider = serviceProvider; + } + + [Function("JobOpeningsSyncFunction")] + public async Task Run([TimerTrigger("%CronPeriod%")] TimerInfo myTimer) + { + _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); + var scrapperSettings = await _jobScrapperSettingsRepository.GetAllSettings(); + var currentTime = DateTime.UtcNow; + await Parallel.ForEachAsync(scrapperSettings, async (setting, ct) => + { + try + { + if (setting.enabled) + { + if(setting.lastRunTime.AddMinutes(setting.runIntervalInMinutes) >= currentTime.AddMinutes(-1)) + { + using var scope = _serviceProvider.CreateScope(); + var scrapperInstance = scope.ServiceProvider.GetRequiredService(); + scrapperInstance.ConfigureSettings(setting); + await scrapperInstance.RunAsync(); + setting.lastRunTime = currentTime; + await _jobScrapperSettingsRepository.UpdateSettingsAsync(setting.id, setting); + } + else + { + _logger.LogInformation($"Scrapper setting {setting.id} was run at {setting.lastRunTime}, next run schedule has not yet come. Skipping this run."); + } + } + else + { + _logger.LogInformation($"Scrapper setting {setting.id} is disabled. Skipping."); + return; + } + } + catch (Exception ex) + { + _logger.LogError(ex, $"Error processing scrapper settings: {setting}"); + } + }); + } + } +} diff --git a/src/PetProjectAzFunctions/PetProjectAzFunctions.csproj b/src/PetProjectAzFunctions/PetProjectAzFunctions.csproj new file mode 100644 index 0000000..873e3b4 --- /dev/null +++ b/src/PetProjectAzFunctions/PetProjectAzFunctions.csproj @@ -0,0 +1,37 @@ + + + net8.0 + v4 + Exe + enable + enable + /home/site/wwwroot + Linux + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + Never + + + + + + \ No newline at end of file diff --git a/src/PetProjectAzFunctions/Program.cs b/src/PetProjectAzFunctions/Program.cs new file mode 100644 index 0000000..7de0b9e --- /dev/null +++ b/src/PetProjectAzFunctions/Program.cs @@ -0,0 +1,53 @@ +using Common.Constants; +using Common.Engines; +using Common.Factories; +using Common.Managers; +using Common.Repositories; +using Microsoft.Azure.Cosmos; +using Microsoft.Azure.Functions.Worker.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System.Data; + +public class Program +{ + public static void Main(string[] args) + { + var builder = FunctionsApplication.CreateBuilder(args); + + builder.ConfigureFunctionsWebApplication(); + ConfigureServices(builder); + builder.Build().Run(); + } + + private static void ConfigureServices(FunctionsApplicationBuilder builder) + { + var services = builder.Services; + // Register your services here + services.AddLogging(); + services.AddHttpClient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + var config = builder.Configuration; + + #region Register Cosmos related services + services.AddSingleton(s => + { + var cosmosDbUri = config[ConfigurationConstants.CosmosDBUriKey]; + var cosmosDbAccountKey = config[ConfigurationConstants.CosmosDBAccountKey]; + if (string.IsNullOrEmpty(cosmosDbUri) || string.IsNullOrEmpty(cosmosDbAccountKey)) + { + throw new DataException("Cosmos DB configuration is missing or invalid."); + } + return new CosmosClient(cosmosDbUri, cosmosDbAccountKey); + }); + + services.AddTransient(); + #endregion + + } +} diff --git a/src/PetProjectAzFunctions/Properties/launchSettings.json b/src/PetProjectAzFunctions/Properties/launchSettings.json new file mode 100644 index 0000000..6a6168e --- /dev/null +++ b/src/PetProjectAzFunctions/Properties/launchSettings.json @@ -0,0 +1,15 @@ +{ + "profiles": { + "PetProjectAzFunctions": { + "commandName": "Project", + "commandLineArgs": "--port 7149" + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", + "containerRunArguments": "--init", + "httpPort": 31027, + "useSSL": false + } + } +} \ No newline at end of file diff --git a/src/PetProjectAzFunctions/Properties/serviceDependencies.json b/src/PetProjectAzFunctions/Properties/serviceDependencies.json new file mode 100644 index 0000000..df4dcc9 --- /dev/null +++ b/src/PetProjectAzFunctions/Properties/serviceDependencies.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "appInsights1": { + "type": "appInsights" + }, + "storage1": { + "type": "storage", + "connectionId": "AzureWebJobsStorage" + } + } +} \ No newline at end of file diff --git a/src/PetProjectAzFunctions/host.json b/src/PetProjectAzFunctions/host.json new file mode 100644 index 0000000..ee5cf5f --- /dev/null +++ b/src/PetProjectAzFunctions/host.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + }, + "enableLiveMetricsFilters": true + } + } +} \ No newline at end of file diff --git a/src/PetProjectAzFunctions/readme.md b/src/PetProjectAzFunctions/readme.md new file mode 100644 index 0000000..0b247b5 --- /dev/null +++ b/src/PetProjectAzFunctions/readme.md @@ -0,0 +1,11 @@ +# TimerTrigger - C# + +The `TimerTrigger` makes it incredibly easy to have your functions executed on a schedule. This sample demonstrates a simple use case of calling your function every 5 minutes. + +## How it works + +For a `TimerTrigger` to work, you provide a schedule in the form of a [cron expression](https://en.wikipedia.org/wiki/Cron#CRON_expression)(See the link for full details). A cron expression is a string with 6 separate expressions which represent a given schedule via patterns. The pattern we use to represent every 5 minutes is `0 */5 * * * *`. This, in plain text, means: "When seconds is equal to 0, minutes is divisible by 5, for any hour, day of the month, month, day of the week, or year". + +## Learn more + + Documentation \ No newline at end of file diff --git a/src/Synchronizer/ProblemsProcessor.cs b/src/Synchronizer/ProblemsProcessor.cs index db86026..a1a66d8 100644 --- a/src/Synchronizer/ProblemsProcessor.cs +++ b/src/Synchronizer/ProblemsProcessor.cs @@ -1,5 +1,6 @@ using Microsoft.Azure.Cosmos; using Common.Models; +using Common.DatabaseModels; namespace Synchronizer; diff --git a/src/lcw.sln b/src/lcw.sln index ec43a01..424b481 100644 --- a/src/lcw.sln +++ b/src/lcw.sln @@ -9,10 +9,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "Backend\Backend. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Synchronizer", "Synchronizer\Synchronizer.csproj", "{BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PetProjectAzFunctions", "PetProjectAzFunctions\PetProjectAzFunctions.csproj", "{31C50D63-3018-4679-92FD-F080D47A32D0}" +EndProject Global - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 @@ -58,5 +57,20 @@ Global {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x64.Build.0 = Release|Any CPU {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x86.ActiveCfg = Release|Any CPU {BF0FF8B1-3D65-459E-8CA1-A7C0ED4F97B9}.Release|x86.Build.0 = Release|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Debug|x64.ActiveCfg = Debug|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Debug|x64.Build.0 = Debug|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Debug|x86.ActiveCfg = Debug|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Debug|x86.Build.0 = Debug|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Release|Any CPU.Build.0 = Release|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Release|x64.ActiveCfg = Release|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Release|x64.Build.0 = Release|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Release|x86.ActiveCfg = Release|Any CPU + {31C50D63-3018-4679-92FD-F080D47A32D0}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection EndGlobal From 8107cf7dbb585d5553873027850ec12a9816e5b6 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sat, 25 Oct 2025 19:52:44 +0530 Subject: [PATCH 27/30] Added basic background process controller and added basic scrapper --- src/Backend/Controllers/AdminController.cs | 69 +++++++++++ .../Controllers/JobSearchController.cs | 16 +-- .../Controllers/ScrapperSettingsController.cs | 26 ++-- src/Backend/Operations/ScrapperRunner.cs | 117 ++++++++++++++++++ src/Backend/Program.cs | 1 + src/Backend/Views/JobListView.cs | 54 ++++++++ src/Backend/appsettings.json | 2 +- .../DatabaseModels/JobScrapperSettings.cs | 2 +- src/Common/DatabaseModels/QuerySettings.cs | 4 +- src/Common/Engines/GSEngine.cs | 4 +- src/Common/Managers/JobScrapper.cs | 12 +- .../Managers/JobScrapperSettingsManager.cs | 68 +++++----- src/Common/Models/Public/QuerySettings.cs | 2 +- .../JobScrapperSettingsRepository.cs | 2 +- src/Common/Repositories/JobsRepository.cs | 9 ++ 15 files changed, 327 insertions(+), 61 deletions(-) create mode 100644 src/Backend/Controllers/AdminController.cs create mode 100644 src/Backend/Operations/ScrapperRunner.cs create mode 100644 src/Backend/Views/JobListView.cs diff --git a/src/Backend/Controllers/AdminController.cs b/src/Backend/Controllers/AdminController.cs new file mode 100644 index 0000000..dad6987 --- /dev/null +++ b/src/Backend/Controllers/AdminController.cs @@ -0,0 +1,69 @@ + +namespace Backend.Controllers +{ + using Backend.Operations; + using Common.Managers; + using Microsoft.AspNetCore.Mvc; + + [ApiController] + [Route("api/admin")] + public class AdminController : ControllerBase + { + private readonly ILogger logger; + private readonly ScrapperRunner scrapperRunner; + + public AdminController(ILogger logger, ScrapperRunner scrapperRunner) + { + this.logger = logger; + this.scrapperRunner = scrapperRunner; + } + + [HttpGet] + [Route("scrappers/trigger/{scrapperId}")] + public ActionResult TriggerScrapperRun(string scrapperId) + { + // _ = Task.Run(async () => await scrapperRunner.RunScrapperAsync(scrapperId)); + return Ok($"[Dummy]: Scrapper run triggered for id: {scrapperId}"); + } + + [HttpPut] + [Route("scrappers/trigger/{scrapperId}")] + public ActionResult EnableScrapper(string scrapperId) + { + this.scrapperRunner.EnableScrapper(scrapperId); + return Ok($"Scrapper enabled for id: {scrapperId}"); + } + + [HttpDelete] + [Route("scrappers/trigger/{scrapperId}")] + public ActionResult DisableScrapper(string scrapperId) + { + this.scrapperRunner.DisableScrapper(scrapperId); + return Ok($"Scrapper disabled for id: {scrapperId}"); + } + + [HttpGet] + [Route("scrappers/background/start")] + public ActionResult StartScrappersInBackground() + { + this.scrapperRunner.StartBackgroundRunner(); + return Ok($"Background scrapper runs started. Current State: {this.scrapperRunner.CurrentState}"); + } + + [HttpGet] + [Route("scrappers/background/stop")] + public ActionResult StopScrappersInBackground() + { + this.scrapperRunner.StopBackgroundRunner(); + return Ok($"Background scrapper runs stopped. Current State: {this.scrapperRunner.CurrentState}"); + } + + [HttpGet] + [Route("scrappers/background/status")] + public ActionResult GetScrappersInBackgroundStatus() + { + this.scrapperRunner.StopBackgroundRunner(); + return Ok($"{this.scrapperRunner.GetStatus()}"); + } + } +} \ No newline at end of file diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index 2ced804..7a396e4 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -11,7 +11,7 @@ namespace Backend.Controllers using Common.DatabaseModels; [ApiController] - [Route("api")] + [Route("api/jobs")] public class JobSearchController : ControllerBase { private readonly JobsRepository jobsRepository; @@ -23,28 +23,30 @@ public JobSearchController(JobsRepository jobsRepository, ILogger>> SearchJobs([FromBody] JobQuery jobquery) { return Ok(await jobsRepository.GetJobsFromQuery(jobquery)); } [HttpGet] - [Route("jobs/latest")] - public async Task> GetLatestJobsFromDb() + [Route("latest")] + public async Task> GetLatestJobsFromDb( + [FromQuery] string location = "India", + [FromQuery] string level = "Mid") { - return Ok(await this.jobsRepository.GetAllLatestJobsAsync()); + return Content(JobListView.RenderScrappedJobsHtml(await this.jobsRepository.GetJobsEasyQueryAsync(location, level)), "text/html"); } [HttpGet] - [Route("jobs/lastOneDay")] + [Route("lastOneDay")] public async Task> GetLastOneDayJobsFromDb() { return Ok(await this.jobsRepository.GetAllJobsInLastOneDay()); } [HttpGet] - [Route("jobs/profile/{id}")] + [Route("profile/{id}")] public async Task> GetJobById(string id) { var job = await this.jobsRepository.GetJobByIdAsync(id); diff --git a/src/Backend/Controllers/ScrapperSettingsController.cs b/src/Backend/Controllers/ScrapperSettingsController.cs index 3cbdc4b..4192716 100644 --- a/src/Backend/Controllers/ScrapperSettingsController.cs +++ b/src/Backend/Controllers/ScrapperSettingsController.cs @@ -9,14 +9,14 @@ namespace Backend.Controllers { [ApiController] - [Route("api/[controller]")] + [Route("api/jobs/scrappers")] public class ScrapperSettingsController : ControllerBase { private readonly JobScrapperSettingsManager _settingsManager; private readonly ILogger _logger; - public ScrapperSettingsController( JobScrapperSettingsManager jobScrapperSettingsManager, + public ScrapperSettingsController(JobScrapperSettingsManager jobScrapperSettingsManager, ILogger logger) { _settingsManager = jobScrapperSettingsManager; @@ -24,7 +24,7 @@ public ScrapperSettingsController( JobScrapperSettingsManager jobScrapperSetting } [HttpGet] - [Route("jobs/scrappers")] + [Route("")] public async Task>> GetAllJobScrappers() { // Placeholder implementation for getting all scrappers @@ -32,23 +32,29 @@ public async Task>> GetAllJobScrappers() } [HttpPut] - [Route("jobs/scrappers/{id}")] + [Route("{id}")] public async Task> UpdateJobScrapperSettings(string id, [FromBody] ScrapperSettings settings) { - // Placeholder implementation for updating scrapper settings - return Ok(await _settingsManager.CreateOrUpdateSettings(id, settings)); + try + { + return Ok(await _settingsManager.CreateOrUpdateSettings(id, settings)); + } + catch (InvalidOperationException ex) + { + return BadRequest(ex.Message); + } } [HttpPost] - [Route("jobs/scrappers/Add")] + [Route("add")] public async Task> CreateNewJobScrapperSettings([FromBody] ScrapperSettings settings) { - // Placeholder implementation for updating scrapper settings - return Ok(await _settingsManager.CreateOrUpdateSettings(string.Empty, settings)); + return BadRequest("Use PUT api/jobs/scrappers/{id} to create or update scrapper settings."); + // return Ok(await _settingsManager.CreateOrUpdateSettings(string.Empty, settings)); } [HttpGet] - [Route("jobs/scrappers/{id}")] + [Route("{id}")] public async Task> GetJobScrapperSettings(string id) { // Placeholder implementation for getting scrapper settings diff --git a/src/Backend/Operations/ScrapperRunner.cs b/src/Backend/Operations/ScrapperRunner.cs new file mode 100644 index 0000000..79d8f2c --- /dev/null +++ b/src/Backend/Operations/ScrapperRunner.cs @@ -0,0 +1,117 @@ +using System.Collections.Concurrent; +using System.Text; +using Common.Engines; +using Common.Managers; +using Common.Repositories; + +namespace Backend.Operations +{ + public class ScrapperRunner + { + ILogger logger; + GSEngine gsEngine; + AIEngine aiEngine; + JobsRepository jobsRepository; + JobScrapperSettingsManager settingsManager; + + private ConcurrentBag enabledScrappers = new ConcurrentBag(); + private TimeSpan runInterval = TimeSpan.FromHours(3); + private CancellationTokenSource cts = new CancellationTokenSource(); + private Task backgroundTask = null; + public string CurrentState { get; private set; } = "Stopped"; + private string LastError = string.Empty; + private DateTime lastRunTime = DateTime.MinValue; + + public ScrapperRunner(ILogger logger, JobScrapperSettingsManager settingsManager, GSEngine gSEngine, AIEngine aIEngine, JobsRepository jobsRepository) + { + this.logger = logger; + this.gsEngine = gSEngine; + this.aiEngine = aIEngine; + this.jobsRepository = jobsRepository; + this.settingsManager = settingsManager; + } + + public void EnableScrapper(string scrapperId) + { + if (!enabledScrappers.Contains(scrapperId)) + { + enabledScrappers.Add(scrapperId); + } + } + + public void DisableScrapper(string scrapperId) + { + enabledScrappers = new ConcurrentBag(enabledScrappers.Except(new List { scrapperId })); + } + + + public async Task RunScrapperAsync(string scrapperId) + { + var settings = await this.settingsManager.GetSettingsById(scrapperId); + if (settings == null) + { + logger.LogWarning($"Scrapper settings not found for id: {scrapperId}. Skipping scrapper run."); + return; + } + + try + { + var scrapper = new JobScrapper(gsEngine, aiEngine, jobsRepository, logger); + scrapper.ConfigureSettings(settings); + await scrapper.RunAsync(); + logger.LogInformation($"Scrapper run completed for id: {scrapperId}"); + settings.lastRunTime = DateTime.UtcNow; + await this.settingsManager.UpdateSettingsAsync(scrapperId, settings); + } + catch (Exception ex) + { + logger.LogError($"Error running scrapper for id: {scrapperId}. Exception: {ex}"); + this.LastError = ex.Message; + } + } + + public void StartBackgroundRunner() + { + if (backgroundTask == null || backgroundTask.IsCompleted) + { + cts = new CancellationTokenSource(); + backgroundTask = RunInBackgroundAsync(cts.Token); + this.CurrentState = "Running"; + } + } + + public void StopBackgroundRunner() + { + if (cts != null && !cts.IsCancellationRequested) + { + cts.Cancel(); + this.CurrentState = "Stopped"; + } + } + + public string GetStatus() + { + var sb = new StringBuilder(); + sb.Append($"CurrentState: {this.CurrentState}\n"); + sb.Append($"AI Engine Ready: {this.aiEngine.IsReady()}\n"); + sb.Append($"Run Interval: {this.runInterval} | Last Run Time (UTC): {this.lastRunTime}\n"); + sb.Append($"EnabledScrappers: {string.Join(",", this.enabledScrappers)}\n"); + sb.Append($"LastError: {this.LastError}"); + return sb.ToString(); + } + + private async Task RunInBackgroundAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + lastRunTime = DateTime.UtcNow; + foreach (var scrapperId in enabledScrappers) + { + logger.LogInformation($"Starting scrapper run for id: {scrapperId}"); + await RunScrapperAsync(scrapperId); + } + await Task.Delay(runInterval, cancellationToken); + } + } + } +} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 8d434c8..12127ae 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -102,6 +102,7 @@ public static void Main(string[] args) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Backend/Views/JobListView.cs b/src/Backend/Views/JobListView.cs new file mode 100644 index 0000000..d1fdff1 --- /dev/null +++ b/src/Backend/Views/JobListView.cs @@ -0,0 +1,54 @@ +using System.Text; +using Common.DatabaseModels; + +public static class JobListView +{ + public static string RenderScrappedJobsHtml(List jobs) + { + var sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine("Scrapped Jobs"); + sb.AppendLine(@""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine("

Scrapped Job Listings

"); + + foreach (var job in jobs) + { + sb.AppendLine("
"); + sb.AppendLine($" "); + sb.AppendLine($"
{System.Net.WebUtility.HtmlEncode(job.companyName ?? "Unknown")} — {System.Net.WebUtility.HtmlEncode(job.location ?? "N/A")}
"); + sb.AppendLine($"
{System.Net.WebUtility.HtmlEncode(job.snippet ?? "No description available.")}
"); + + if (job.tags != null && job.tags.Count > 0) + { + sb.AppendLine("
"); + foreach (var tag in job.tags) + sb.AppendLine($"{System.Net.WebUtility.HtmlEncode(tag)}"); + sb.AppendLine("
"); + } + + sb.AppendLine($" "); + sb.AppendLine($"
Scrapped: {job.scrappedTime:yyyy-MM-dd HH:mm}
"); + sb.AppendLine("
"); + } + + sb.AppendLine(""); + + return sb.ToString(); + } +} diff --git a/src/Backend/appsettings.json b/src/Backend/appsettings.json index c1e8513..d7bf0c3 100644 --- a/src/Backend/appsettings.json +++ b/src/Backend/appsettings.json @@ -14,7 +14,7 @@ "LCProject:ContainerName": "Problems", "JobProject:DatabaseName": "JobDataBase", "JobProject:ContainerName": "JobDetailsContainer", - "JobProject:ScraperContainerName": "ScraperSettingsContainer" + "JobProject:ScraperContainerName": "ScrapperSettingsContainer" }, "ApplicationInsights": { "LogLevel": { diff --git a/src/Common/DatabaseModels/JobScrapperSettings.cs b/src/Common/DatabaseModels/JobScrapperSettings.cs index 17f3c6d..570c209 100644 --- a/src/Common/DatabaseModels/JobScrapperSettings.cs +++ b/src/Common/DatabaseModels/JobScrapperSettings.cs @@ -68,7 +68,7 @@ public ScrapperSettings ToPublicModel() sitesToExclude = this.settings.sitesToExclude, exactTerms = this.settings.exactTerms, negativeTerms = this.settings.negativeTerms, - additionalTerms = this.settings.additionalSearchterms, + additionalSearchTerms = this.settings.additionalSearchTerms, lookBackDays = this.settings.lookBackDays } }; diff --git a/src/Common/DatabaseModels/QuerySettings.cs b/src/Common/DatabaseModels/QuerySettings.cs index c03571a..aa447a6 100644 --- a/src/Common/DatabaseModels/QuerySettings.cs +++ b/src/Common/DatabaseModels/QuerySettings.cs @@ -17,7 +17,7 @@ public class QuerySettings public List exactTerms { get; set; } public List negativeTerms { get; set; } public int lookBackDays { get; set; } = 1; - public List additionalSearchterms { get; set; } + public List additionalSearchTerms { get; set; } public QuerySettings(PublicSettingsModel qs) { @@ -27,7 +27,7 @@ public QuerySettings(PublicSettingsModel qs) sitesToExclude = qs.sitesToExclude; exactTerms = qs.exactTerms; negativeTerms = qs.negativeTerms; - additionalSearchterms = qs.additionalTerms; + additionalSearchTerms = qs.additionalSearchTerms; } } } diff --git a/src/Common/Engines/GSEngine.cs b/src/Common/Engines/GSEngine.cs index 231c96b..f871261 100644 --- a/src/Common/Engines/GSEngine.cs +++ b/src/Common/Engines/GSEngine.cs @@ -83,9 +83,9 @@ public async Task> SearchQueryAsync(JobScrapperSettings settin } // Additional terms (hq) - if (qsettings.additionalSearchterms != null && qsettings.additionalSearchterms.Any()) + if (qsettings.additionalSearchTerms != null && qsettings.additionalSearchTerms.Any()) { - var add = string.Join(" ", qsettings.additionalSearchterms.Where(s => !string.IsNullOrWhiteSpace(s))); + var add = string.Join(" ", qsettings.additionalSearchTerms.Where(s => !string.IsNullOrWhiteSpace(s))); if (!string.IsNullOrWhiteSpace(add)) sb.Append(AddadditionalSearchterms(add)); } diff --git a/src/Common/Managers/JobScrapper.cs b/src/Common/Managers/JobScrapper.cs index f7f9a45..84d6a07 100644 --- a/src/Common/Managers/JobScrapper.cs +++ b/src/Common/Managers/JobScrapper.cs @@ -40,13 +40,21 @@ public async Task RunAsync() return; } - var mp = searchResults.ToDictionary(j => j.id, j => j); + var mp = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var job in searchResults) + { + if (!mp.ContainsKey(job.id)) + { + mp[job.id] = job; + } + } + var levels = await this.aiEngine.GetJobLevelAsync(searchResults); foreach (var level in levels) { if (mp.ContainsKey(level.Key)) { - mp[level.Key].tags.Add(level.Value); + mp[level.Key].tags.AddRange(level.Value.Split("-")); } else { diff --git a/src/Common/Managers/JobScrapperSettingsManager.cs b/src/Common/Managers/JobScrapperSettingsManager.cs index 3d434f7..2c9f48f 100644 --- a/src/Common/Managers/JobScrapperSettingsManager.cs +++ b/src/Common/Managers/JobScrapperSettingsManager.cs @@ -25,51 +25,36 @@ public async Task CreateOrUpdateSettings(string id, Scrappe throw new ArgumentNullException(nameof(publicSettings), "Public settings cannot be null"); } - var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT TOP 1* from ScraperSettingsContainer where Id = {id}"); - - int count = 0; - var existingSettingsList = new List(); - var returnSettings = default(JobScrapperSettings); - while (settingsInDb.HasMoreResults) + var settingsInDb = await this.GetAllSettings(); + JobScrapperSettings current = null; + if(!string.IsNullOrEmpty(id) && settingsInDb.Any(s => s.id.Equals(id, StringComparison.OrdinalIgnoreCase))) { - var response = await settingsInDb.ReadNextAsync(); - existingSettingsList.AddRange(response); + current = settingsInDb.First(s => s.id.Equals(id, StringComparison.OrdinalIgnoreCase)); } - if(count > 0) + if (current != null) { - var existingSettings = existingSettingsList[0]; - existingSettings.UpdateFromPublicModel(publicSettings); - await _scrapperSettingsContainer.ReplaceItemAsync( - existingSettings, - existingSettings.id - ); - returnSettings = existingSettings; + current.UpdateFromPublicModel(publicSettings); } else - { - id = Guid.NewGuid().ToString(); - returnSettings = await _scrapperSettingsContainer.CreateItemAsync( - new JobScrapperSettings( - id, - publicSettings.name, - publicSettings.runIntervalInMinutes, - publicSettings.settings, - true) - ); + { // TODO: Restrict total number of settings to 5 + if (settingsInDb.Count >= 5) + { + throw new InvalidOperationException("[TooManySettings]: Cannot create more than 5 scrapper settings."); + } + current = new JobScrapperSettings(id, publicSettings.name, publicSettings.runIntervalInMinutes, publicSettings.settings, true); } - - return returnSettings; + + await _scrapperSettingsContainer.UpsertItemAsync(current); + return current; } public async Task GetSettingsById(string id) { - var setting = await _scrapperSettingsContainer.ReadItemAsync( - id, - new PartitionKey(id) - ); + var allSettings = await GetAllSettings(); + var setting = allSettings.FirstOrDefault(s => s.id.Equals(id, StringComparison.OrdinalIgnoreCase)); - if(setting == null) + if (setting == null) { _logger.LogError($"No JobScrapperSettings found with id: {id}"); throw new KeyNotFoundException($"No JobScrapperSettings found with id: {id}"); @@ -77,10 +62,25 @@ public async Task GetSettingsById(string id) return setting; } + + public async Task UpdateSettingsAsync(string id, JobScrapperSettings jobSetting) + { + try + { + await _scrapperSettingsContainer.UpsertItemAsync(jobSetting, new PartitionKey(id)); + _logger.LogInformation($"Successfully updated JobScrapperSettings with id: {id}"); + } + catch (Exception ex) + { + _logger.LogError($"Error updating JobScrapperSettings with id: {id}. Exception: {ex.Message}"); + return false; + } + return true; + } public async Task> GetAllSettings() { - var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT * from ScraperSettingsContainer"); + var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT * from c"); var allSettings = new List(); while (settingsInDb.HasMoreResults) { diff --git a/src/Common/Models/Public/QuerySettings.cs b/src/Common/Models/Public/QuerySettings.cs index 682021b..4bb8415 100644 --- a/src/Common/Models/Public/QuerySettings.cs +++ b/src/Common/Models/Public/QuerySettings.cs @@ -9,7 +9,7 @@ public class QuerySettings public List sitesToExclude { get; set; } public List exactTerms { get; set; } public List negativeTerms { get; set; } - public List additionalTerms { get; set; } + public List additionalSearchTerms { get; set; } public int lookBackDays { get; set; } } } diff --git a/src/Common/Repositories/JobScrapperSettingsRepository.cs b/src/Common/Repositories/JobScrapperSettingsRepository.cs index 8b2edb0..c997470 100644 --- a/src/Common/Repositories/JobScrapperSettingsRepository.cs +++ b/src/Common/Repositories/JobScrapperSettingsRepository.cs @@ -26,7 +26,7 @@ public JobScrapperSettingsRepository(ICosmosContainerFactory cosmosContainerFact public async Task> GetAllSettings() { - var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT * from JobScrapperSettings"); + var settingsInDb = _scrapperSettingsContainer.GetItemQueryIterator($"SELECT * from c"); var allSettings = new List(); while (settingsInDb.HasMoreResults) { diff --git a/src/Common/Repositories/JobsRepository.cs b/src/Common/Repositories/JobsRepository.cs index 3086fdb..b2b2c7a 100644 --- a/src/Common/Repositories/JobsRepository.cs +++ b/src/Common/Repositories/JobsRepository.cs @@ -86,6 +86,15 @@ public async Task CreateIfNotExistsAsync(ScrappedJob job) } } + public async Task> GetJobsEasyQueryAsync(string location, string level) + { + var query = "SELECT * FROM c WHERE EXISTS ( SELECT VALUE t FROM t IN c.tags WHERE CONTAINS(LOWER(t), @location) OR CONTAINS(LOWER(t), @unknown) ) ORDER BY c.scrappedTime DESC OFFSET 0 LIMIT 1000"; + var queryDefinition = new QueryDefinition(query).WithParameter("@location", location.ToLower()).WithParameter("@unknown", "unknown"); + var res = await QueryJobsAsync(queryDefinition); + res = res.Where(j => j.tags.Any(t => t.Equals(level, StringComparison.OrdinalIgnoreCase))).ToList(); + return res; + } + private async Task> QueryJobsAsync(string query) { From 2ce4ff496c5c7aac055707d7e91b7809a32e3215 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Sun, 26 Oct 2025 13:17:01 +0530 Subject: [PATCH 28/30] Fixed bug and added more info for tracking --- src/Backend/Controllers/AdminController.cs | 3 +- src/Backend/Operations/ScrapperRunner.cs | 53 ++++++++++++++-------- src/Common/Managers/JobScrapper.cs | 12 +++-- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/Backend/Controllers/AdminController.cs b/src/Backend/Controllers/AdminController.cs index dad6987..f96406e 100644 --- a/src/Backend/Controllers/AdminController.cs +++ b/src/Backend/Controllers/AdminController.cs @@ -62,8 +62,7 @@ public ActionResult StopScrappersInBackground() [Route("scrappers/background/status")] public ActionResult GetScrappersInBackgroundStatus() { - this.scrapperRunner.StopBackgroundRunner(); - return Ok($"{this.scrapperRunner.GetStatus()}"); + return Ok(this.scrapperRunner.GetStatus()); } } } \ No newline at end of file diff --git a/src/Backend/Operations/ScrapperRunner.cs b/src/Backend/Operations/ScrapperRunner.cs index 79d8f2c..e15faf3 100644 --- a/src/Backend/Operations/ScrapperRunner.cs +++ b/src/Backend/Operations/ScrapperRunner.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using System.Dynamic; using System.Text; using Common.Engines; using Common.Managers; @@ -17,10 +18,12 @@ public class ScrapperRunner private ConcurrentBag enabledScrappers = new ConcurrentBag(); private TimeSpan runInterval = TimeSpan.FromHours(3); private CancellationTokenSource cts = new CancellationTokenSource(); - private Task backgroundTask = null; - public string CurrentState { get; private set; } = "Stopped"; + private Task? backgroundTask = null; + public string CurrentState => backgroundTask != null && !backgroundTask.IsCompleted ? "Running" : "Stopped"; + private string LastError = string.Empty; private DateTime lastRunTime = DateTime.MinValue; + private ConcurrentDictionary lastRunResults = new ConcurrentDictionary(); public ScrapperRunner(ILogger logger, JobScrapperSettingsManager settingsManager, GSEngine gSEngine, AIEngine aIEngine, JobsRepository jobsRepository) { @@ -51,6 +54,7 @@ public async Task RunScrapperAsync(string scrapperId) if (settings == null) { logger.LogWarning($"Scrapper settings not found for id: {scrapperId}. Skipping scrapper run."); + this.lastRunResults[scrapperId] = $"[{DateTime.Now}] Settings not found."; return; } @@ -58,9 +62,10 @@ public async Task RunScrapperAsync(string scrapperId) { var scrapper = new JobScrapper(gsEngine, aiEngine, jobsRepository, logger); scrapper.ConfigureSettings(settings); - await scrapper.RunAsync(); - logger.LogInformation($"Scrapper run completed for id: {scrapperId}"); + var res = await scrapper.RunAsync(); + logger.LogInformation($"Scrapper run completed for id: {scrapperId} | Results: {res}"); settings.lastRunTime = DateTime.UtcNow; + this.lastRunResults[scrapperId] = $"[{DateTime.Now}] {res}"; await this.settingsManager.UpdateSettingsAsync(scrapperId, settings); } catch (Exception ex) @@ -76,7 +81,6 @@ public void StartBackgroundRunner() { cts = new CancellationTokenSource(); backgroundTask = RunInBackgroundAsync(cts.Token); - this.CurrentState = "Running"; } } @@ -85,32 +89,41 @@ public void StopBackgroundRunner() if (cts != null && !cts.IsCancellationRequested) { cts.Cancel(); - this.CurrentState = "Stopped"; } } - public string GetStatus() - { - var sb = new StringBuilder(); - sb.Append($"CurrentState: {this.CurrentState}\n"); - sb.Append($"AI Engine Ready: {this.aiEngine.IsReady()}\n"); - sb.Append($"Run Interval: {this.runInterval} | Last Run Time (UTC): {this.lastRunTime}\n"); - sb.Append($"EnabledScrappers: {string.Join(",", this.enabledScrappers)}\n"); - sb.Append($"LastError: {this.LastError}"); - return sb.ToString(); + public dynamic GetStatus() + { + dynamic status = new ExpandoObject(); + var dict = (IDictionary)status; + + dict["CurrentState"] = this.CurrentState; + dict["AIEngineReady"] = this.aiEngine?.IsReady() ?? false; + dict["RunInterval"] = this.runInterval; + dict["LastRunTimeUtc"] = this.lastRunTime; + dict["EnabledScrappers"] = this.enabledScrappers.ToArray(); + // copy concurrent dictionary to a normal dictionary for safe enumeration / serialization + dict["LastResults"] = this.lastRunResults.ToDictionary(kv => kv.Key, kv => kv.Value); + dict["LastError"] = this.LastError; + + return status; } private async Task RunInBackgroundAsync(CancellationToken cancellationToken) { + TimeSpan checkInterval = TimeSpan.FromMinutes(5); while (!cancellationToken.IsCancellationRequested) { - lastRunTime = DateTime.UtcNow; - foreach (var scrapperId in enabledScrappers) + if (DateTime.UtcNow - lastRunTime > runInterval) { - logger.LogInformation($"Starting scrapper run for id: {scrapperId}"); - await RunScrapperAsync(scrapperId); + foreach (var scrapperId in enabledScrappers) + { + logger.LogInformation($"Starting scrapper run for id: {scrapperId}"); + await RunScrapperAsync(scrapperId); + } + lastRunTime = DateTime.UtcNow; } - await Task.Delay(runInterval, cancellationToken); + await Task.Delay(checkInterval, cancellationToken); } } } diff --git a/src/Common/Managers/JobScrapper.cs b/src/Common/Managers/JobScrapper.cs index 84d6a07..30c5cfb 100644 --- a/src/Common/Managers/JobScrapper.cs +++ b/src/Common/Managers/JobScrapper.cs @@ -27,7 +27,7 @@ public void ConfigureSettings(JobScrapperSettings settings) this.settings = settings; } - public async Task RunAsync() + public async Task RunAsync() { var startTime = DateTime.UtcNow; this.logger.LogInformation($"Starting JobScrapper run for settings: {this.settings}"); @@ -37,7 +37,7 @@ public async Task RunAsync() if (searchResults == null || searchResults.Count == 0) { this.logger.LogInformation($"Nothing to process. Query settings: {this.settings}"); - return; + return "No search results, processing skipped."; } var mp = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -49,6 +49,8 @@ public async Task RunAsync() } } + // TODO: Filter duplicates by fetching the latest jobs from DB in last 1d. + var levels = await this.aiEngine.GetJobLevelAsync(searchResults); foreach (var level in levels) { @@ -62,17 +64,19 @@ public async Task RunAsync() } } + var newResults = 0; foreach (var job in searchResults) { var success = await this.jobsRepository.CreateIfNotExistsAsync(job); - if (!success) + if (success) { - this.logger.LogError($"Failed to push job {job.id} to JobsRepository."); + newResults++; } } var duration = DateTime.UtcNow - startTime; this.logger.LogInformation($"JobScrapper run completed. Duration: {duration}. Processed {searchResults.Count} jobs for settings: {this.settings}"); + return $"Processed {searchResults.Count} jobs | New addition: {newResults} in {duration.TotalSeconds} seconds."; } } From c0b6feddb877e02f6ce1f61498900b1d244d7dd8 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Wed, 29 Oct 2025 01:01:32 +0530 Subject: [PATCH 29/30] Updated JobDetails, added more query, and adeed problems metadata --- src/Backend/Backend.csproj | 1 + .../Controllers/JobSearchController.cs | 28 +++---- src/Backend/Controllers/ProblemsController.cs | 7 ++ src/Backend/Operations/DataProvider.cs | 25 ++++++ src/Backend/Operations/JobDataProvider.cs | 78 +++++++++++++++++++ src/Backend/Program.cs | 1 + src/Common/Cache/Memca.cs | 39 ++++++++++ src/Common/Common.csproj | 1 + src/Common/Managers/JobScrapper.cs | 22 +++++- src/Common/Repositories/JobsRepository.cs | 48 +++++++----- 10 files changed, 207 insertions(+), 43 deletions(-) create mode 100644 src/Backend/Operations/JobDataProvider.cs create mode 100644 src/Common/Cache/Memca.cs diff --git a/src/Backend/Backend.csproj b/src/Backend/Backend.csproj index 140b068..2f72ea8 100644 --- a/src/Backend/Backend.csproj +++ b/src/Backend/Backend.csproj @@ -17,6 +17,7 @@ + diff --git a/src/Backend/Controllers/JobSearchController.cs b/src/Backend/Controllers/JobSearchController.cs index 7a396e4..3d57f86 100644 --- a/src/Backend/Controllers/JobSearchController.cs +++ b/src/Backend/Controllers/JobSearchController.cs @@ -14,47 +14,37 @@ namespace Backend.Controllers [Route("api/jobs")] public class JobSearchController : ControllerBase { - private readonly JobsRepository jobsRepository; + private readonly JobDataProvider jobDataProvider; private readonly ILogger logger; - public JobSearchController(JobsRepository jobsRepository, ILogger logger) + public JobSearchController(JobDataProvider jobDataProvider, ILogger logger) { this.logger = logger; - this.jobsRepository = jobsRepository; + this.jobDataProvider = jobDataProvider; } [HttpPost] [Route("search")] public async Task>> SearchJobs([FromBody] JobQuery jobquery) { - return Ok(await jobsRepository.GetJobsFromQuery(jobquery)); + return await this.jobDataProvider.GetJobsAsync(jobquery); } [HttpGet] [Route("latest")] public async Task> GetLatestJobsFromDb( [FromQuery] string location = "India", - [FromQuery] string level = "Mid") + [FromQuery] string level = "Mid", + [FromQuery] int days = 3) { - return Content(JobListView.RenderScrappedJobsHtml(await this.jobsRepository.GetJobsEasyQueryAsync(location, level)), "text/html"); + var jobList = await this.jobDataProvider.GetJobsAsync(location, days, level); + return Content(JobListView.RenderScrappedJobsHtml(jobList), "text/html"); } [HttpGet] [Route("lastOneDay")] public async Task> GetLastOneDayJobsFromDb() { - return Ok(await this.jobsRepository.GetAllJobsInLastOneDay()); - } - - [HttpGet] - [Route("profile/{id}")] - public async Task> GetJobById(string id) - { - var job = await this.jobsRepository.GetJobByIdAsync(id); - if (job != null) - { - return Ok(job); - } - return Ok("Not found."); + return Ok(await this.jobDataProvider.GetAllJobsAsync(1)); } } } \ No newline at end of file diff --git a/src/Backend/Controllers/ProblemsController.cs b/src/Backend/Controllers/ProblemsController.cs index beacd1b..954c9ee 100644 --- a/src/Backend/Controllers/ProblemsController.cs +++ b/src/Backend/Controllers/ProblemsController.cs @@ -44,6 +44,13 @@ public async Task>> GetProblems( return Ok(filteredProblems); } + [HttpGet] + [Route("problems-metadata")] + public async Task> GetProblemsMetadata() + { + return Ok(await dataProvider.GetProblemsMetadataAsync()); + } + [HttpGet] [Route("problems/{id}")] public async Task> GetProblems(string id) diff --git a/src/Backend/Operations/DataProvider.cs b/src/Backend/Operations/DataProvider.cs index 04f80a0..55bd888 100644 --- a/src/Backend/Operations/DataProvider.cs +++ b/src/Backend/Operations/DataProvider.cs @@ -10,12 +10,37 @@ public class DataProvider { private ICache _problemCache; private ILogger _logger; + private List companyTags = new List(); + private DateTime lastMetadataFetchTime = DateTime.MinValue; public DataProvider([FromKeyedServices(CacheConstants.ProblemCacheKey)] ICache problemCache, ILogger logger) { _problemCache = problemCache; _logger = logger; } + public async Task> GetProblemsMetadataAsync() + { + if (companyTags == null || companyTags.Count == 0 || lastMetadataFetchTime < DateTime.UtcNow.AddDays(14)) + { + var allProblems = await GetAllProblemsAsync(); + var companySet = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var problem in allProblems.Values) + { + if (problem.companies != null) + { + foreach (var company in problem.companies) + { + companySet.Add(company.Key); + } + } + } + lastMetadataFetchTime = DateTime.UtcNow; + companyTags = companySet?.ToList() ?? new List(); + } + + return companyTags; + } + public async Task> GetProblemsAsync(IFilter? filter = null) { var allProblems = await GetAllProblemsAsync(); diff --git a/src/Backend/Operations/JobDataProvider.cs b/src/Backend/Operations/JobDataProvider.cs new file mode 100644 index 0000000..05aed99 --- /dev/null +++ b/src/Backend/Operations/JobDataProvider.cs @@ -0,0 +1,78 @@ +namespace Backend.Operations +{ + using System.ComponentModel; + using Common.Cache; + using Common.DatabaseModels; + using Common.Queries; + using Common.Repositories; + + public class JobDataProvider + { + private readonly ILogger _logger; + private readonly JobsRepository _jobsRepository; + + private TimeSpan cacheDuration = TimeSpan.FromMinutes(15); + private Memca cache; + + public JobDataProvider(ILogger logger, JobsRepository jobsRepository) + { + _logger = logger; + _jobsRepository = jobsRepository; + this.cache = new Memca(this.cacheDuration); + } + + public async Task> GetJobsAsync(string jobLocation, int lookbackdays, string level) + { + var filteredJobs = await GetRecentJobsAsync(jobLocation, lookbackdays); + + if (!string.IsNullOrEmpty(level)) + { + filteredJobs = filteredJobs.Where(j => j.jobType.ToLower().Contains(level.ToLower())).ToList(); + } + + return filteredJobs; + } + + public async Task> GetJobsAsync(JobQuery jobquery) + { + return await this._jobsRepository.GetJobsFromQuery(jobquery); + } + + public async Task> GetAllJobsAsync(int lookbackdays = 1) + { + var allJobs = await GetAllLatestJobsAsync(); + allJobs = allJobs.Where(j => j.scrappedTime >= DateTime.UtcNow.AddDays(-lookbackdays)).ToList(); + return allJobs; + } + + private async Task> GetRecentJobsAsync(string location = "india", int lookbackdays = 3) + { + string cacheKey = $"jobs_{location}_{lookbackdays}"; + if (this.cache.Get>(cacheKey) is List cachedJobs) + { + _logger.LogInformation($"Cache hit for key: {cacheKey}"); + return cachedJobs; + } + + _logger.LogInformation($"Cache miss for key: {cacheKey}. Fetching from database."); + var jobs = await _jobsRepository.GetJobsAsync(location, lookbackdays); + this.cache.Set(cacheKey, jobs, this.cacheDuration); + return jobs; + } + + private async Task> GetAllLatestJobsAsync() + { + string cacheKey = $"all_jobs_latest"; + if (this.cache.Get>(cacheKey) is List cachedJobs) + { + _logger.LogInformation($"Cache hit for key: {cacheKey}"); + return cachedJobs; + } + + _logger.LogInformation($"Cache miss for key: {cacheKey}. Fetching from database."); + var jobs = await _jobsRepository.GetAllLatestJobsAsync(); + this.cache.Set(cacheKey, jobs, this.cacheDuration); + return jobs; + } + } +} \ No newline at end of file diff --git a/src/Backend/Program.cs b/src/Backend/Program.cs index 12127ae..44cde0f 100644 --- a/src/Backend/Program.cs +++ b/src/Backend/Program.cs @@ -103,6 +103,7 @@ public static void Main(string[] args) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); var app = builder.Build(); ILogger logger = app.Logger; diff --git a/src/Common/Cache/Memca.cs b/src/Common/Cache/Memca.cs new file mode 100644 index 0000000..75feeb3 --- /dev/null +++ b/src/Common/Cache/Memca.cs @@ -0,0 +1,39 @@ +namespace Common.Cache +{ + using System.Runtime.Caching; + public class Memca + { + private MemoryCache cache; + private readonly TimeSpan defaultExpiryDuration; + + public Memca(TimeSpan defaultExpiryDuration) + { + this.cache = MemoryCache.Default; + this.defaultExpiryDuration = defaultExpiryDuration; + } + + public T? Get(string key) + { + return (T?)this.cache.Get(key); + } + + public void Set(string key, T value, TimeSpan? absoluteExpiration = null) + { + var policy = new CacheItemPolicy(); + if (absoluteExpiration.HasValue) + { + policy.AbsoluteExpiration = DateTimeOffset.Now.Add(absoluteExpiration.Value); + } + else + { + policy.AbsoluteExpiration = DateTimeOffset.Now.Add(this.defaultExpiryDuration); + } + this.cache.Set(key, value, policy); + } + + public void Remove(string key) + { + this.cache.Remove(key); + } + } +} diff --git a/src/Common/Common.csproj b/src/Common/Common.csproj index 91dccc4..39ee69e 100644 --- a/src/Common/Common.csproj +++ b/src/Common/Common.csproj @@ -16,6 +16,7 @@ + diff --git a/src/Common/Managers/JobScrapper.cs b/src/Common/Managers/JobScrapper.cs index 30c5cfb..dee2e4f 100644 --- a/src/Common/Managers/JobScrapper.cs +++ b/src/Common/Managers/JobScrapper.cs @@ -40,6 +40,19 @@ public async Task RunAsync() return "No search results, processing skipped."; } + var existingJobIds = await this.jobsRepository.GetJobIdsInLastNDaysAsync(1); + var hashSetExistingJobIds = new HashSet(existingJobIds, StringComparer.OrdinalIgnoreCase); + + this.logger.LogInformation($"Search Results count: {searchResults.Count} JobIds in last N(1) days = {hashSetExistingJobIds.Count}"); + searchResults = searchResults.Where(j => !hashSetExistingJobIds.Contains(j.id)).ToList(); + this.logger.LogInformation($"Filtered Search Results count: {searchResults.Count}"); + + if (searchResults.Count == 0) + { + this.logger.LogInformation($"All jobs are duplicates. Nothing to process. Query settings: {this.settings}"); + return "All jobs are duplicates, processing skipped."; + } + var mp = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var job in searchResults) { @@ -48,15 +61,18 @@ public async Task RunAsync() mp[job.id] = job; } } - - // TODO: Filter duplicates by fetching the latest jobs from DB in last 1d. - + var levels = await this.aiEngine.GetJobLevelAsync(searchResults); foreach (var level in levels) { if (mp.ContainsKey(level.Key)) { mp[level.Key].tags.AddRange(level.Value.Split("-")); + mp[level.Key].jobType = level.Value.Split("-").FirstOrDefault() ?? mp[level.Key].jobType; + if (level.Value.Split("-").Length > 1) + { + mp[level.Key].location = level.Value.Split("-")[1]; + } } else { diff --git a/src/Common/Repositories/JobsRepository.cs b/src/Common/Repositories/JobsRepository.cs index b2b2c7a..3c9efb9 100644 --- a/src/Common/Repositories/JobsRepository.cs +++ b/src/Common/Repositories/JobsRepository.cs @@ -22,7 +22,7 @@ public JobsRepository(ICosmosContainerFactory cosmosContainerFactory, public async Task> GetAllLatestJobsAsync() { - var query = "SELECT * FROM c ORDER BY c.scrappedTime DESC OFFSET 0 LIMIT 100"; + var query = "SELECT * FROM c ORDER BY c.scrappedTime DESC OFFSET 0 LIMIT 2000"; return await QueryJobsAsync(query); } @@ -32,26 +32,6 @@ public async Task> GetAllJobsInLastOneDay() return await QueryJobsAsync(query); } - public async Task GetJobByIdAsync(string id) - { - try - { - // TODO: NOT working as expected - var response = await this.jobsContainer.ReadItemAsync(id, new PartitionKey(id)); - return response.Resource; - } - catch (CosmosException cosmosEx) when (cosmosEx.StatusCode == System.Net.HttpStatusCode.NotFound) - { - this.logger.LogWarning($"Job: {id} not found in container."); - return null; - } - catch (Exception ex) - { - this.logger.LogError($"Failed to retrieve job: {id} from container. Ex: {ex}"); - return null; - } - } - /// /// Create the item only if it does not already exist using a single DB call. /// Returns true if the item was created, false if it already existed. @@ -95,6 +75,32 @@ public async Task> GetJobsEasyQueryAsync(string location, stri return res; } + public async Task> GetJobIdsInLastNDaysAsync(int lookbackdays) + { + var cutoffDate = DateTime.UtcNow.AddDays(-lookbackdays); + var query = "SELECT c.id FROM c WHERE c.scrappedTime >= @cutoffDate"; + var queryDefinition = new QueryDefinition(query).WithParameter("@cutoffDate", cutoffDate); + var queryResultSetIterator = jobsContainer.GetItemQueryIterator(queryDefinition); + List results = new List(); + while (queryResultSetIterator.HasMoreResults) + { + var response = await queryResultSetIterator.ReadNextAsync(); + results.AddRange(response.Select(j => j.id)); + } + this.logger.LogInformation($"Retrieved {results.Count} job IDs from Cosmos DB in last {lookbackdays} days."); + return results; + } + + public async Task> GetJobsAsync(string location, int lookbackdays) + { + var cutoffDate = DateTime.UtcNow.AddDays(-lookbackdays); + var query = "SELECT * FROM c WHERE (LOWER(c.location) = @location OR LOWER(c.location) = @unknown) AND c.scrappedTime >= @cutoffDate ORDER BY c.scrappedTime DESC"; + var queryDefinition = new QueryDefinition(query) + .WithParameter("@location", location.ToLower()) + .WithParameter("@unknown", "unknown") + .WithParameter("@cutoffDate", cutoffDate.ToString("yyyy-MM-ddTHH:mm:ss")); + return await QueryJobsAsync(queryDefinition); + } private async Task> QueryJobsAsync(string query) { From 9b185988ebf8fd098038c2fb62b1f9e0d7996953 Mon Sep 17 00:00:00 2001 From: devidnyk Date: Wed, 29 Oct 2025 01:06:27 +0530 Subject: [PATCH 30/30] updated be endpoint --- src/client/.env.production | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/.env.production b/src/client/.env.production index 9e309e5..ea5464b 100644 --- a/src/client/.env.production +++ b/src/client/.env.production @@ -1 +1 @@ -REACT_APP_API_BASE_URL=https://lcw-test.westus2.cloudapp.azure.com/api \ No newline at end of file +REACT_APP_API_BASE_URL=https://leetwrap.centralindia.cloudapp.azure.com/api \ No newline at end of file

+
+

+ + {problem.title} + +

+ + {difficultyText} + +
+ +
+ Acceptance: {problem.acceptance}% + Frequency: {problem.frequency}% +
+ + {topCompanies.length > 0 && ( +
+ Top Companies: +
+ {topCompanies.map((company, index) => ( +
TIME_PERIOD_LABELS[p]) + .join(", ")} + > + + {company.name + .split("-") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ")} + + {company.timePeriods.includes("thirty-days") && ( + + 🔥 + + )} +
+ ))} +
+
+ )} +