diff --git a/classrooms/index.min.js b/classrooms/index.min.js index a44f653..c1cb42d 100644 --- a/classrooms/index.min.js +++ b/classrooms/index.min.js @@ -1 +1 @@ -var M,h,J,S,z,K,$,Q,T={},X=[],re=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,F=Array.isArray;function C(t,e){for(var n in e)t[n]=e[n];return t}function Y(t){var e=t.parentNode;e&&e.removeChild(t)}function le(t,e,n){var r,l,o,i={};for(o in e)o=="key"?r=e[o]:o=="ref"?l=e[o]:i[o]=e[o];if(arguments.length>2&&(i.children=arguments.length>3?M.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(o in t.defaultProps)i[o]===void 0&&(i[o]=t.defaultProps[o]);return D(t,i,r,l,null)}function D(t,e,n,r,l){var o={type:t,props:e,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:l??++J};return l==null&&h.vnode!=null&&h.vnode(o),o}function I(t){return t.children}function W(t,e){this.props=t,this.context=e}function L(t,e){if(e==null)return t.__?L(t.__,t.__.__k.indexOf(t)+1):null;for(var n;ee&&S.sort($));H.__r=0}function ee(t,e,n,r,l,o,i,c,u,x,d){var _,m,f,s,p,w,a,v,b,g=0,y=r&&r.__k||X,U=y.length,P=U,E=e.length;for(n.__k=[],_=0;_0?D(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):s)!=null?(s.__=n,s.__b=n.__b+1,(v=se(s,y,a=_+g,P))===-1?f=T:(f=y[v]||T,y[v]=void 0,P--),R(t,s,f,l,o,i,c,u,x,d),p=s.__e,(m=s.ref)&&f.ref!=m&&(f.ref&&j(f.ref,null,s),d.push(m,s.__c||p,s)),p!=null&&(w==null&&(w=p),(b=f===T||f.__v===null)?v==-1&&g--:v!==a&&(v===a+1?g++:v>a?P>E-a?g+=v-a:g--:g=v(u!=null?1:0))for(;i>=0||c=0){if((u=e[i])&&l==u.key&&o===u.type)return i;i--}if(c=u.__.length&&u.__.push({__V:p}),u.__[_]}function k(_){return v1=1,B1(U,_)}function B1(_,n,u){var t=l(c++,2);if(t.t=_,!t.__c&&(t.__=[u?u(n):U(void 0,n),function(a){var f=t.__N?t.__N[0]:t.__[0],s=t.t(f,a);f!==s&&(t.__N=[s,t.__[1]],t.__c.setState({}))}],t.__c=o,!o.u)){var i=function(a,f,s){if(!t.__c.__H)return!0;var m=t.__c.__H.__.filter((function(e){return e.__c}));if(m.every((function(e){return!e.__N})))return!h||h.call(this,a,f,s);var V=!1;return m.forEach((function(e){if(e.__N){var P=e.__[0];e.__=e.__N,e.__N=void 0,P!==e.__[0]&&(V=!0)}})),!(!V&&t.__c.props===a)&&(!h||h.call(this,a,f,s))};o.u=!0;var h=o.shouldComponentUpdate,N=o.componentWillUpdate;o.componentWillUpdate=function(a,f,s){if(this.__e){var m=h;h=void 0,i(a,f,s),h=m}N&&N.call(this,a,f,s)},o.shouldComponentUpdate=i}return t.__N||t.__}function j1(_,n){var u=l(c++,3);!h.__s&&y(u.__H,n)&&(u.__=_,u.i=n,o.__H.__h.push(u))}function w(_){return v1=5,T1((function(){return{current:_}}),[])}function T1(_,n){var u=l(c++,7);return y(u.__H,n)?(u.__V=_(),u.i=n,u.__h=_,u.__V):u.__}function L1(_,n){return v1=8,T1((function(){return _}),n)}function M1(_){var n=o.context[_.__c],u=l(c++,9);return u.c=_,n?(u.__==null&&(u.__=!0,n.sub(o)),n.props.value):_.__}function R1(){for(var _;_=x.shift();)if(_.__P&&_.__H)try{_.__H.__h.forEach(d),_.__H.__h.forEach(E),_.__H.__h=[]}catch(n){_.__H.__h=[],h.__e(n,_.__v)}}h.__b=function(_){o=null,g&&g(_)},h.__r=function(_){A1&&A1(_),c=0;var n=(o=_.__c).__H;n&&(H1===o?(n.__h=[],o.__h=[],n.__.forEach((function(u){u.__N&&(u.__=u.__N),u.__V=p,u.__N=u.i=void 0}))):(n.__h.forEach(d),n.__h.forEach(E),n.__h=[],c=0)),H1=o},h.diffed=function(_){C1&&C1(_);var n=_.__c;n&&n.__H&&(n.__H.__h.length&&(x.push(n)!==1&&b===h.requestAnimationFrame||((b=h.requestAnimationFrame)||S1)(R1)),n.__H.__.forEach((function(u){u.i&&(u.__H=u.i),u.__V!==p&&(u.__=u.__V),u.i=void 0,u.__V=p}))),H1=o=null},h.__c=function(_,n){n.some((function(u){try{u.__h.forEach(d),u.__h=u.__h.filter((function(t){return!t.__||E(t)}))}catch(t){n.some((function(i){i.__h&&(i.__h=[])})),n=[],h.__e(t,u.__v)}})),F1&&F1(_,n)},h.unmount=function(_){q1&&q1(_);var n,u=_.__c;u&&u.__H&&(u.__H.__.forEach((function(t){try{d(t)}catch(i){n=i}})),u.__H=void 0,n&&h.__e(n,u.__v))};var D1=typeof requestAnimationFrame=="function";function S1(_){var n,u=function(){clearTimeout(t),D1&&cancelAnimationFrame(n),setTimeout(_)},t=setTimeout(u,100);D1&&(n=requestAnimationFrame(u))}function d(_){var n=o,u=_.__c;typeof u=="function"&&(_.__c=void 0,u()),o=n}function E(_){var n=o;_.__c=_.__(),o=n}function y(_,n){return!_||_.length!==n.length||n.some((function(u,t){return u!==_[t]}))}function U(_,n){return typeof n=="function"?n(_):n}const MS_PER_DAY=24*60*60*1e3;const DAY_NUMS=[0,1,2,3,4,5,6];class Day{#date;constructor(utcDate){this.#date=utcDate}get year(){return this.#date.getUTCFullYear()}get month(){return this.#date.getUTCMonth()+1}monthName(length="long",locales){return new Intl.DateTimeFormat(locales,{timeZone:"UTC",month:length}).format(this.#date)}get date(){return this.#date.getUTCDate()}get day(){return this.#date.getUTCDay()}dayName(length="long",locales){return new Intl.DateTimeFormat(locales,{timeZone:"UTC",weekday:length}).format(this.#date)}get id(){return this.#date.getTime()/MS_PER_DAY}get sunday(){return this.last(0)}get monday(){return this.last(1)}get valid(){return!Number.isNaN(this.#date.getTime())}add(days){const clone=new Date(this.#date);clone.setUTCDate(this.date+days);return new Day(clone)}last(day){const offset=day-this.day;if(offset===0){return this}else if(offset<0){return this.add(offset)}else{return this.add(offset-7)}}toLocal(){return new Date(this.year,this.month-1,this.date)}toString(...args){return args.length>0?this.#date.toLocaleDateString(args[0],{...args[1],timeZone:"UTC"}):this.valid?[this.year.toString().padStart(4,"0"),this.month.toString().padStart(2,"0"),this.date.toString().padStart(2,"0")].join("-"):"Invalid date"}valueOf(){return this.id}toJSON(){return this.toString()}[Symbol.for("Deno.customInspect")](){return this.toString()}static get EPOCH(){return new Day(new Date(0))}static from(year,month,date){const dateObj=new Date(Date.UTC(year,month-1,date));if(year<100){dateObj.setUTCFullYear(year)}return new Day(dateObj)}static fromLocal(date){return Day.from(date.getFullYear(),date.getMonth()+1,date.getDate())}static today(){return Day.fromLocal(new Date)}static parse(str){const[year,month,date]=str.split("-").map(Number);const parsed=Day.from(year,month,date);return parsed.valid?parsed:null}static fromId(dayId){return Day.EPOCH.add(dayId)}static monthName(month,length="long",locales){return this.from(1970,month,1).monthName(length,locales)}static dayName(day,length="long",locales){return this.from(1970,1,4+day).dayName(length,locales)}static min(first,...rest){const days=Array.isArray(first)?[...first,...rest]:[first,...rest];return this.fromId(days.reduce(((cum,curr)=>Math.min(cum,curr.id)),Infinity))}static max(first,...rest){const days=Array.isArray(first)?[...first,...rest]:[first,...rest];return this.fromId(days.reduce(((cum,curr)=>Math.max(cum,curr.id)),-Infinity))}}const holidayCache={};function getHolidays(year){holidayCache[year]??={[Day.from(year,1,1).id]:"New Year's Day",[Day.from(year,1,7).monday.add(14).id]:"Martin Luther King Jr. Day",[Day.from(year,2,7).monday.add(14).id]:"Presidents' Day",[Day.from(year,3,31).last(5).id]:"César Chávez Day",[Day.from(year,5,31).monday.id]:"Memorial Day",[Day.from(year,6,19).id]:"Juneteenth",[Day.from(year,7,4).id]:"Independence Day",[Day.from(year,9,7).monday.id]:"Labor Day",[Day.from(year,9,11).id]:"Veterans Day",[Day.from(year,11,7).last(4).add(21).id]:"Thanksgiving",[Day.from(year,11,7).last(4).add(22).id]:"Day after Thanksgiving",[Day.from(year,12,24).id]:"Christmas Eve",[Day.from(year,12,25).id]:"Christmas",[Day.from(year,12,31).id]:"New Year's Eve"};return holidayCache[year]}const importMeta={url:"file:///home/sheep/uxdy/terms/index.ts",main:false};const offsets={WI:0,SP:84,S1:175,S2:210,FA:262};const lengths={FA:79,WI:75,SP:74,S1:33,S2:33};const finalsOffsets={FA:7,WI:7,SP:6,S1:1,S2:1};const names={FA:"Fall",WI:"Winter",SP:"Spring",S1:"Summer Session I",S2:"Summer Session II",S3:"Special Summer Session",SU:"Summer Med School"};function winterStart(year){if(year<2028){const jan1=Day.from(year,1,1);return Day.from(year,1,9-jan1.day)}else{const dec30=Day.from(year,1,-1);return Day.from(year,1,14-dec30.day)}}function getTermDays(year,season){let offset=offsets[season];if((season==="FA"?year+1:year)===2e3){offset+=7}if(season==="FA"&&[1995,2001,2006,2014,2020].includes(year)){if(year<2010){offset-=7}else{offset+=7}}const start=winterStart(year).add(offset);return{start:start,finals:start.add(lengths[season]-finalsOffsets[season]),end:start.add(lengths[season]+(year<=1995&&season==="SP"?1:year<2e3&&(season==="S1"||season==="S2")?-1:0))}}function getTerm(day){let termDays=null;let season=null;let current=false;for(const term of["WI","SP","S1","S2","FA"]){termDays=getTermDays(day.year,term);if(day<=termDays.end){season=term;current=day>=termDays.start;break}}if(termDays===null){throw new Error("Unreachable.")}const year=season===null?day.year+1:day.year;if(season===null){season="WI";termDays=getTermDays(year,season)}if(current){const finals=current&&day>=termDays.finals;const week=Math.floor((+day.monday-+termDays.start)/7)+1;return{year:year,season:season,current:current,week:week,finals:finals}}else{return{year:year,season:season,current:current,week:-1,finals:false}}}function termCode(year,quarter){return quarter+(year%100).toString().padStart(2,"0")}function termName(year,quarter){return`${names[quarter]} ${year}`}if(importMeta.main){console.log(["Start year","Fall start","Fall end","Winter start","Spring end"].join("\t"));for(let year=2005;year<=2028;year++){const{end:springEnd}=getTermDays(year,"SP");const{start:fallStart,end:fallEnd}=getTermDays(year,"FA");const{start:winterStart}=getTermDays(year+1,"WI");console.log([+fallStart-+springEnd,+winterStart-+fallEnd].join("\t"))}}function useLast(init,value){const ref=w(init);if(value!==null&&value!==undefined){ref.current=value}return ref.current}const __default=JSON.parse('{\n "$schema": "../schemas/locations.schema.json",\n "comment": [\n "https://registrar.ucsd.edu/StudentLink/bldg_codes.html",\n "For locations, go onto Google Maps, right click on approximate center of building, click on coordinates to copy.",\n "I omit \'College\' and \'Outdoor Classroom\' from building names, but not \'Building.\'"\n ],\n "colleges": {\n "seventh": {\n "OTRSN": {\n "location": [32.88665760836001, -117.24102406579628],\n "name": "Otterson Hall",\n "images": [\n "https://i.imgur.com/2DncCdV.jpeg",\n "https://i.imgur.com/nuuiXO9.jpeg",\n "https://i.imgur.com/ByRotXZ.jpeg",\n "https://i.imgur.com/rh1PE4K.jpeg",\n "https://i.imgur.com/k8Bubgx.jpeg"\n ]\n },\n "SEVW2": {\n "location": [32.8880285561251, -117.24255222849888],\n "name": "Seventh West Building 2",\n "images": []\n },\n "SEVE3": {\n "location": [32.88825009555447, -117.24173440393453],\n "name": "Seventh East Ecoflats 3",\n "images": [\n "https://i.imgur.com/RFVU7xr.jpeg",\n "https://i.imgur.com/81Y5Bqh.jpeg",\n "https://i.imgur.com/z85Z6w3.jpeg",\n "https://i.imgur.com/K7KBhkk.jpeg",\n "https://i.imgur.com/46FqmYp.jpeg",\n "https://i.imgur.com/A7z04lV.jpeg"\n ]\n },\n "SEVE4": {\n "location": [32.88807303667593, -117.2417902045747],\n "name": "Seventh East Ecoflats 4",\n "images": [\n "https://i.imgur.com/rvX3WRu.jpeg",\n "https://i.imgur.com/3HtM3MY.jpeg",\n "https://i.imgur.com/7qsGG1G.jpeg",\n "https://i.imgur.com/A7z04lV.jpeg"\n ]\n },\n "WFH": {\n "location": [32.886967814911024, -117.24173638805067],\n "name": "Wells Fargo Hall",\n "images": [\n "https://i.imgur.com/JwSFFD5.jpeg",\n "https://i.imgur.com/wd4xodE.jpeg",\n "https://i.imgur.com/gPAVIsw.jpeg",\n "https://i.imgur.com/k8Bubgx.jpeg"\n ]\n }\n },\n "erc": {\n "ASANT": {\n "location": [32.88423744331073, -117.24213984468823],\n "name": "Asante House",\n "images": [\n "https://i.imgur.com/41b7QoK.jpeg",\n "https://i.imgur.com/cg9qmez.jpeg",\n "https://i.imgur.com/KAX1Krl.jpeg"\n ]\n },\n "ERCA": {\n "location": [32.886087113975414, -117.24205254723678],\n "name": "ERC Administration",\n "images": [\n "https://i.imgur.com/zTuN3ki.jpeg",\n "https://i.imgur.com/K38yRo7.jpeg",\n "https://i.imgur.com/xsRVr2m.jpeg",\n "https://i.imgur.com/jQdIpgH.jpeg"\n ]\n },\n "GREAT": {\n "location": [32.883944240936444, -117.24193249617227],\n "name": "Great Hall",\n "images": [\n "https://i.imgur.com/2iS1TGa.jpeg",\n "https://i.imgur.com/OKLA6JX.jpeg",\n "https://i.imgur.com/2v7svKU.jpeg"\n ]\n },\n "LASB": {\n "location": [32.88557327735999, -117.2413567320843],\n "name": "Latin American Studies Building",\n "images": ["https://i.imgur.com/kP1FInU.jpeg"]\n },\n "RBC": {\n "location": [32.88427044449085, -117.2408680383893],\n "name": "Robinson Building Complex",\n "images": [\n "https://i.imgur.com/SDNf4ci.jpeg",\n "https://i.imgur.com/jQMCHrY.jpeg",\n "https://i.imgur.com/G0GLZQD.jpeg",\n "https://i.imgur.com/XrAZzhh.jpeg",\n "https://i.imgur.com/1ysjMHf.jpeg"\n ],\n "comment": [\n "https://gps.ucsd.edu/_files/misc/GPS-Printable-Map-2015.pdf",\n "I think Garner is part of this"\n ]\n },\n "SDSC": {\n "location": [32.88445992833245, -117.2393967518539],\n "name": "San Diego Supercomputer Center",\n "images": []\n },\n "SSB": {\n "location": [32.88391338508008, -117.24045720071513],\n "name": "Social Sciences Building",\n "images": [\n "https://i.imgur.com/bHveajb.jpeg",\n "https://i.imgur.com/0V90Tca.jpeg",\n "https://i.imgur.com/5A2kawY.jpeg",\n "https://i.imgur.com/t15im8k.jpeg"\n ]\n }\n },\n "marshall": {\n "CSB": {\n "location": [32.880517237245954, -117.23939317415764],\n "name": "Cognitive Science Building",\n "images": [\n "https://i.imgur.com/CXa715U.jpeg",\n "https://i.imgur.com/6NiZ46R.jpeg",\n "https://i.imgur.com/wSSxyyj.jpeg",\n "https://i.imgur.com/fSMNNuc.jpeg",\n "https://i.imgur.com/riutYQz.jpeg",\n "https://i.imgur.com/pa0BSpr.jpeg",\n "https://i.imgur.com/jZvJO05.jpeg"\n ]\n },\n "ECON": {\n "location": [32.88235588485967, -117.24040328432459],\n "name": "Economics Building",\n "images": [\n "https://i.imgur.com/MTxt62o.jpeg",\n "https://i.imgur.com/iQIL8bu.jpeg",\n "https://i.imgur.com/xnokzUN.jpeg",\n "https://i.imgur.com/YY7YmrA.jpeg"\n ]\n },\n "PETER": {\n "location": [32.879984046654364, -117.2402525268966],\n "name": "Peterson Hall",\n "images": [\n "https://i.imgur.com/7O3YLwu.jpeg",\n "https://i.imgur.com/kZeE8oF.jpeg",\n "https://i.imgur.com/ryxGEki.jpeg",\n "https://i.imgur.com/JWDIvEy.jpeg",\n "https://i.imgur.com/ZwBOssV.jpeg"\n ]\n },\n "SEQUO": {\n "location": [32.88203974495475, -117.24103633144476],\n "name": "Sequoyah Hall",\n "images": [\n "https://i.imgur.com/YXgBI1O.jpeg",\n "https://i.imgur.com/UJa4KNw.jpeg",\n "https://i.imgur.com/NUqDM5a.jpeg",\n "https://i.imgur.com/f7EFZpT.jpeg",\n "https://i.imgur.com/7zLoJjJ.jpeg",\n "https://i.imgur.com/KBUySt6.jpeg"\n ]\n },\n "SOLIS": {\n "location": [32.880935740253626, -117.23964750230745],\n "name": "Solís Hall",\n "images": [\n "https://i.imgur.com/bZzkyvr.jpeg",\n "https://i.imgur.com/EeChtxt.jpeg",\n "https://i.imgur.com/CXa715U.jpeg"\n ]\n },\n "SSRB": {\n "location": [32.88075657728253, -117.240142743495],\n "name": "Social Sciences Research Building",\n "images": [\n "https://i.imgur.com/ktWIzDA.jpeg",\n "https://i.imgur.com/suB1Zw2.jpeg",\n "https://i.imgur.com/suB1Zw2.jpeg",\n "https://i.imgur.com/batB9YN.jpeg",\n "https://i.imgur.com/gNdZy7z.jpeg",\n "https://i.imgur.com/wOK32RL.jpeg",\n "https://i.imgur.com/2Ne0Zz3.jpeg"\n ]\n },\n "TM102": {\n "location": [32.88134401507817, -117.23933111579409],\n "name": "Thurgood Marshall 102",\n "images": ["https://i.imgur.com/gGIHRxo.jpeg"]\n }\n },\n "sixth": {\n "CTL": {\n "location": [32.880720265920914, -117.24142517100402],\n "name": "Catalyst",\n "images": [\n "https://i.imgur.com/Wgtxcio.jpeg",\n "https://i.imgur.com/TApNHHe.jpeg",\n "https://i.imgur.com/UzvzE2n.jpeg",\n "https://i.imgur.com/PgRu7iI.jpeg",\n "https://i.imgur.com/brkGKmT.jpeg",\n "https://i.imgur.com/MzO8kdg.jpeg"\n ]\n },\n "JEANN": {\n "location": [32.8799296621332, -117.24119652096547],\n "name": "The Jeannie",\n "images": [\n "https://i.imgur.com/S7hWyFi.jpeg",\n "https://i.imgur.com/Gr72SGn.jpeg",\n "https://i.imgur.com/jcmweDB.jpeg",\n "https://i.imgur.com/7g2ddgc.jpeg",\n "https://i.imgur.com/H3pf35p.jpeg",\n "https://i.imgur.com/WXEOHoX.jpeg",\n "https://i.imgur.com/0SCGaj1.jpeg"\n ]\n },\n "MOS": {\n "location": [32.88001190738399, -117.24163094823878],\n "name": "Mosaic",\n "images": [\n "https://i.imgur.com/mMpazXy.jpeg",\n "https://i.imgur.com/kOoJMGj.jpeg",\n "https://i.imgur.com/uYLVGh5.jpeg",\n "https://i.imgur.com/PiC2Cb8.jpeg",\n "https://i.imgur.com/FHpBJYo.jpeg",\n "https://i.imgur.com/6woeDzV.jpeg",\n "https://i.imgur.com/6woeDzV.jpeg"\n ]\n },\n "RWAC": {\n "location": [32.880374742852574, -117.24106684310492],\n "name": "Ridge Walk Academic Complex",\n "images": [\n "https://i.imgur.com/wzZrECe.jpeg",\n "https://i.imgur.com/rHbydi1.jpeg",\n "https://i.imgur.com/bckfXJi.jpeg",\n "https://i.imgur.com/6hH79mc.jpeg",\n "https://i.imgur.com/OHUnhy9.jpeg",\n "https://i.imgur.com/jBTe18L.jpeg",\n "https://i.imgur.com/cga1K75.jpeg",\n "https://i.imgur.com/ltI4q8O.jpeg",\n "https://i.imgur.com/8yGvvrA.jpeg",\n "https://i.imgur.com/PKQ0Eda.jpeg",\n "https://i.imgur.com/GJlru9N.jpeg",\n "https://i.imgur.com/pvCEee4.jpeg",\n "https://i.imgur.com/U817BWw.jpeg"\n ]\n }\n },\n "muir": {\n "APM": {\n "location": [32.87900949086575, -117.24105009713044],\n "name": "Applied Physics and Mathematics",\n "images": [\n "https://i.imgur.com/89vhOWC.jpeg",\n "https://i.imgur.com/1xFYiGu.jpeg",\n "https://i.imgur.com/89vhOWC.jpeg",\n "https://i.imgur.com/FloMKYA.jpeg"\n ]\n },\n "BIO": {\n "location": [32.878428690703146, -117.24103674033825],\n "name": "Biology Building",\n "images": [\n "https://i.imgur.com/voBOeaq.jpeg",\n "https://i.imgur.com/7fdINBO.jpeg",\n "https://i.imgur.com/BklsyEi.jpeg"\n ]\n },\n "HSS": {\n "location": [32.87834508545459, -117.24168835799722],\n "name": "Humanities and Social Sciences Building",\n "images": [\n "https://i.imgur.com/Lue4Hz0.jpeg",\n "https://i.imgur.com/ESTU5K4.jpeg",\n "https://i.imgur.com/hoq0JCh.jpeg",\n "https://i.imgur.com/q36eBkZ.jpeg"\n ]\n },\n "LEDDN": {\n "location": [32.87876783002103, -117.24168242455174],\n "name": "Ledden Auditorium",\n "images": [\n "https://i.imgur.com/TeEhzeV.jpeg",\n "https://i.imgur.com/BklsyEi.jpeg",\n "https://i.imgur.com/TqvKBYJ.jpeg"\n ]\n },\n "MANDE": {\n "location": [32.877812337766414, -117.23998508397895],\n "name": "Mandeville Center",\n "images": [\n "https://i.imgur.com/2yXTr9k.jpeg",\n "https://i.imgur.com/w93BY9I.jpeg",\n "https://i.imgur.com/4MCnqQs.jpeg",\n "https://i.imgur.com/kUJwqWS.jpeg",\n "https://i.imgur.com/vcZNcYB.jpeg",\n "https://i.imgur.com/aW79Stz.jpeg",\n "https://i.imgur.com/Xb8Lgc3.jpeg"\n ]\n },\n "MCGIL": {\n "location": [32.87900601797463, -117.24205773606351],\n "name": "McGill Hall",\n "images": [\n "https://i.imgur.com/ean0Xw4.jpeg",\n "https://i.imgur.com/FAyAZ2g.jpeg",\n "https://i.imgur.com/oKUKr7n.jpeg",\n "https://i.imgur.com/RyCAZpz.jpeg"\n ]\n },\n "MNDLR": {\n "location": [32.87928595670899, -117.24214505416418],\n "name": "Mandler Hall",\n "images": [\n "https://i.imgur.com/wHkcEkv.jpeg",\n "https://i.imgur.com/VjGXYpA.jpeg"\n ]\n },\n "RECGM": {\n "location": [32.87672837413399, -117.24124478552716],\n "name": "Recreation Gym",\n "images": ["https://i.imgur.com/qRSwZXl.jpeg"]\n },\n "STCTR": {\n "location": [32.87752027586717, -117.23974942056223],\n "name": "Old Student Center",\n "images": [],\n "comment": [\n "https://ugseminars.ucsd.edu/listing.aspx?qtr=SP16&c=f STCTR E209 is LGBT RC, Conference Room"\n ]\n }\n },\n "revelle": {\n "BONN": {\n "location": [32.876084946774036, -117.24038814500676],\n "name": "Bonner Hall",\n "images": [\n "https://i.imgur.com/O46bvAl.jpeg",\n "https://i.imgur.com/C9iPmC5.jpeg",\n "https://i.imgur.com/PAzV1gB.jpeg"\n ]\n },\n "GH": {\n "location": [32.87374584111353, -117.24092662366324],\n "name": "Galbraith Hall",\n "images": [\n "https://i.imgur.com/cRjQv3U.jpeg",\n "https://i.imgur.com/diEDnqe.jpeg",\n "https://i.imgur.com/LkEDdjA.jpeg",\n "https://i.imgur.com/5ZlmhSL.jpeg"\n ]\n },\n "MAYER": {\n "location": [32.87528696893803, -117.24019479635555],\n "name": "Mayer Hall",\n "images": [\n "https://i.imgur.com/EdHd4Ud.jpeg",\n "https://i.imgur.com/RnOIVMS.jpeg"\n ]\n },\n "MYR-A": {\n "location": [32.87536189399691, -117.23970412241734],\n "name": "Mayer Hall Addition",\n "images": ["https://i.imgur.com/GWhZi3j.jpeg"]\n },\n "NSB": {\n "location": [32.87527130105447, -117.24282324774462],\n "name": "Natural Sciences Building",\n "images": [\n "https://i.imgur.com/gHCTVsy.jpeg",\n "https://i.imgur.com/p0Gb9tw.jpeg",\n "https://i.imgur.com/R6YKwCR.jpeg",\n "https://i.imgur.com/LJyRUbq.jpeg",\n "https://i.imgur.com/Dj4bcaH.jpeg",\n "https://i.imgur.com/7swuR0z.jpeg"\n ]\n },\n "PACIF": {\n "location": [32.87595284128824, -117.24210006678864],\n "name": "Pacific Hall",\n "images": [\n "https://i.imgur.com/icFVT7s.jpeg",\n "https://i.imgur.com/ql0yrzo.jpeg",\n "https://i.imgur.com/7swuR0z.jpeg",\n "https://i.imgur.com/SZBGFAD.jpeg",\n "https://i.imgur.com/O57GZsU.jpeg",\n "https://i.imgur.com/gHurrsx.jpeg"\n ]\n },\n "REV": {\n "location": [32.87480385710217, -117.24096166711239],\n "name": "Revelle Plaza",\n "images": [\n "https://i.imgur.com/C1hf2i4.jpeg",\n "https://i.imgur.com/WswaxG1.jpeg",\n "https://i.imgur.com/xgdoadK.jpeg"\n ],\n "comment": ["Revelle Plaza Outdoor Classroom"]\n },\n "RVCOM": {\n "location": [32.87457496393089, -117.2425008415767],\n "name": "Revelle Commons",\n "images": [\n "https://i.imgur.com/LC6z27w.jpeg",\n "https://i.imgur.com/cZOtJyZ.jpeg",\n "https://i.imgur.com/M8mLc0O.jpeg",\n "https://i.imgur.com/tkfsNCA.jpeg"\n ]\n },\n "TATA": {\n "location": [32.876460769081355, -117.24152230144844],\n "name": "Tata Hall",\n "images": [\n "https://i.imgur.com/xgg8MgX.jpeg",\n "https://i.imgur.com/RXHiy6H.jpeg"\n ]\n },\n "UREY": {\n "location": [32.875555403867246, -117.2412962102085],\n "name": "Urey Hall",\n "images": [\n "https://i.imgur.com/GHh8eKi.jpeg",\n "https://i.imgur.com/WJoatRZ.jpeg",\n "https://i.imgur.com/tw8jQvV.jpeg",\n "https://i.imgur.com/x25Ffeu.jpeg",\n\n "https://i.imgur.com/eeDOB4E.jpeg",\n "https://i.imgur.com/v8NnQ5W.jpeg"\n ]\n },\n "YORK": {\n "location": [32.87454593562147, -117.24000502137861],\n "name": "York Hall",\n "images": [\n "https://i.imgur.com/ZSk3HVG.jpeg",\n "https://i.imgur.com/OlQ1P94.jpeg",\n "https://i.imgur.com/nSvISfv.jpeg",\n "https://i.imgur.com/NY73bP9.jpeg"\n ],\n "comment": [\n "Herbert F. York Undergraduate Sciences Building",\n "TODO: Take photos now that the facade construction is done."\n ]\n }\n },\n "eighth": {\n "DANCE": {\n "location": [32.87186729617818, -117.24003377110412],\n "name": "Molli and Arthur Wagner Dance Building",\n "images": [\n "https://i.imgur.com/IjcxcYu.jpeg",\n "https://i.imgur.com/mZqSm9K.jpeg",\n "https://i.imgur.com/Ff2omog.jpeg",\n "https://i.imgur.com/Cd9qF5k.jpeg"\n ]\n },\n "MWEIS": {\n "location": [32.87095079844769, -117.24121579783444],\n "name": "Mandell Weiss Theatre",\n "images": [\n "https://i.imgur.com/hFfdmH0.jpeg",\n "https://i.imgur.com/axNZj29.jpeg",\n "https://i.imgur.com/7XrSpQc.jpeg",\n "https://i.imgur.com/U1yMrNx.jpeg"\n ],\n "comment": [\n "According to http://m.ucsd.edu/maps/static/location/5?query=&no_server_init it\'s the theater not forum"\n ]\n },\n "PODEM": {\n "location": [32.87340196755349, -117.24174621477657],\n "name": "Podemos",\n "images": [],\n "comment": [\n "https://www.reddit.com/r/UCSD/comments/13pua2j/podem_1a18/"\n ]\n },\n "POTKR": {\n "location": [32.87110810161448, -117.24052277636109],\n "name": "Sheila and Hughes Potiker Theatre",\n "images": [\n "https://i.imgur.com/g5FaydY.jpeg",\n "https://i.imgur.com/sUsYzqf.jpeg"\n ],\n "comment": [\n "This is the building with the big glass windows that say \'La Jolla Playhouse.\' It\'s labelled as La Jolla Playhouse on the map."\n ]\n }\n },\n "warren": {\n "CMRR": {\n "location": [32.88061652328027, -117.23531336416724],\n "name": "Center for Memory and Recording Research",\n "images": []\n },\n "EBU1": {\n "location": [32.88168612813114, -117.2352758424052],\n "name": "Jacobs Hall",\n "images": [\n "https://i.imgur.com/KqK2iLM.jpeg",\n "https://i.imgur.com/6vAmVAz.jpeg",\n "https://i.imgur.com/TAqZDMr.jpeg",\n "https://i.imgur.com/5heLBXk.jpeg",\n "https://i.imgur.com/z9nZx9E.jpeg"\n ]\n },\n "EBU2": {\n "location": [32.88116494369773, -117.23334050065942],\n "name": "Engineering Building Unit II",\n "images": [\n "https://i.imgur.com/hABuTPh.jpeg",\n "https://i.imgur.com/W3BFNPh.jpeg"\n ]\n },\n "EBU3B": {\n "location": [32.8817383470234, -117.23358830529953],\n "name": "Computer Science and Engineering Building",\n "images": [\n "https://i.imgur.com/cIKcb6i.jpeg",\n "https://i.imgur.com/840Ijht.jpeg",\n "https://i.imgur.com/EHbekQN.jpeg",\n "https://i.imgur.com/989kevK.jpeg"\n ]\n },\n "FAH": {\n "location": [32.883557123107536, -117.23496426482438],\n "name": "Franklin Antonio Hall",\n "images": [\n "https://i.imgur.com/MGZugul.jpeg",\n "https://i.imgur.com/dMr7V2X.jpeg",\n "https://i.imgur.com/TbzWfMa.jpeg"\n ]\n },\n "HDSI": {\n "location": [32.880614100775574, -117.23378883326575],\n "name": "Halıcıoğlu Data Science Institute Building",\n "images": [],\n "comment": ["https://datascience.ucsd.edu/venue/hdsi-building/"]\n },\n "PFBH": {\n "location": [32.88173836638747, -117.2343791731388],\n "name": "Powell-Focht Bioengineering Hall",\n "images": ["https://i.imgur.com/lYP4GT9.jpeg"]\n },\n "WARR": {\n "location": [32.88114818094256, -117.23504265009306],\n "name": "Warren Mall",\n "images": [\n "https://i.imgur.com/zqg1cHJ.jpeg",\n "https://i.imgur.com/zlTUVJf.jpeg"\n ],\n "comment": ["Warren Mall Outdoor Classroom"]\n },\n "WLH": {\n "location": [32.88059104682919, -117.23436049332548],\n "name": "Warren Lecture Hall",\n "images": [\n "https://i.imgur.com/YEaKlBF.jpeg",\n "https://i.imgur.com/Kdv8YiX.jpeg"\n ]\n },\n "WSAC": {\n "location": [32.88246082957613, -117.23329893891902],\n "name": "Warren Student Activities Center",\n "images": [\n "https://i.imgur.com/DRjFAFy.jpeg",\n "https://i.imgur.com/Q3u5WgD.jpeg",\n "https://i.imgur.com/Byuu0Vw.jpeg"\n ]\n }\n },\n "pepperCanyon": {\n "DIB": {\n "location": [32.87937650181871, -117.23229157766367],\n "name": "Design & Innovation Building",\n "images": []\n },\n "PCYNH": {\n "location": [32.878341870703316, -117.23391147692307],\n "name": "Pepper Canyon Hall",\n "images": []\n },\n "SME": {\n "location": [32.879887628129154, -117.23275634017203],\n "name": "Structural and Materials Engineering Building",\n "images": []\n },\n "VAF": {\n "location": [32.879139240878324, -117.23396876625009],\n "name": "Visual Arts Facility",\n "images": []\n }\n },\n "universityCenter": {\n "CENTR": {\n "location": [32.87797399985619, -117.237243418587],\n "name": "Center Hall",\n "images": []\n },\n "CSC": {\n "location": [32.87840034888087, -117.23791254127356],\n "name": "Career Services Center",\n "images": []\n },\n "CPMC": {\n "location": [32.87808507377693, -117.23466682590514],\n "name": "Conrad Presbys Music Center",\n "images": []\n },\n "P416": {\n "location": [32.87775532737337, -117.23812995691154],\n "name": "Center Hall",\n "images": ["Parking Lot P416"],\n "comment": ["P416 Outdoor Classroom"]\n },\n "PRICE": {\n "location": [32.879954671864304, -117.23711807270978],\n "name": "Price Center",\n "images": []\n },\n "SERF": {\n "location": [32.87969838069206, -117.23507094146997],\n "name": "Science & Engineering Research Facility",\n "images": []\n },\n "U201": {\n "location": [32.87750663014029, -117.23672981527089],\n "name": "University Center 201",\n "images": []\n },\n "U301": {\n "location": [32.87773977889938, -117.23584205327144],\n "name": "University Center 301",\n "images": []\n }\n },\n "med": {\n "BRF2": {\n "location": [32.874320265698685, -117.2350725903077],\n "name": "Biomedical Research Facility II",\n "images": []\n },\n "BSB": {\n "location": [32.87583620115867, -117.23610217780087],\n "name": "Biomedical Sciences Building",\n "images": []\n },\n "CMME": {\n "location": [32.876369320524, -117.23767828382417],\n "name": "Cellular and Molecular Medicine East",\n "images": []\n },\n "CNCB": {\n "location": [32.87569310599253, -117.23819914713752],\n "name": "Center for Neural Circuits and Behavior",\n "images": []\n },\n "KECK": {\n "location": [32.87504438926279, -117.23617314958287],\n "name": "W. M. Keck Building",\n "images": []\n },\n "LFFB": {\n "location": [32.87668499513593, -117.23686452737942],\n "name": "Leichtag Biomedical Research Building",\n "images": []\n },\n "MET": {\n "location": [32.875220419083554, -117.23478623990438],\n "name": "Medical Education and Telemedicine Building",\n "images": []\n },\n "MTF": {\n "location": [32.87559622253949, -117.23543639784786],\n "name": "Medical Teaching Facility",\n "images": []\n },\n "PSB": {\n "location": [32.874209066736114, -117.23571795183558],\n "name": "Skaggs Pharmaceutical Sciences Building",\n "images": []\n },\n "SCRB": {\n "location": [32.8758549279704, -117.23394815633426],\n "name": "Stein Clinical Research Building",\n "images": []\n }\n },\n "health": {\n "MCC": {\n "location": [32.87832294065095, -117.22294309501584],\n "name": "Moores Cancer Center",\n "images": []\n }\n },\n "sio": {\n "ECKRT": {\n "location": [32.8672217685922, -117.25258463073409],\n "name": "Eckart Building",\n "images": []\n },\n "HUBBS": {\n "location": [32.86744021132684, -117.25344551951103],\n "name": "Hubbs Hall",\n "images": []\n },\n "HYDRO": {\n "location": [32.86889985285985, -117.25226455555327],\n "name": "Hydraulics Laboratory",\n "images": []\n },\n "IGPP": {\n "location": [32.86830699100889, -117.25287278628777],\n "name": "Institute of Geophysics and Planetary Physics",\n "images": []\n },\n "NIERN": {\n "location": [32.86846701354387, -117.25120611888595],\n "name": "Nierenberg Hall",\n "images": []\n },\n "OAR": {\n "location": [32.86949599612524, -117.25063208743448],\n "name": "Keck Oceanographic and Atmospheric Research",\n "images": [],\n "comment": [\n "https://blink.ucsd.edu/sponsor/advancement/advancement-services/stewardship/named-buildings/keck-oceanographic-atmospheric-research-2.html"\n ]\n },\n "MCTF": {\n "location": [32.87120629806947, -117.25201093495335],\n "name": "Marine Conservation and Technology Facility",\n "images": []\n },\n "RITTR": {\n "location": [32.86529347606621, -117.25357019529167],\n "name": "Ritter Hall",\n "images": []\n },\n "SPIES": {\n "location": [32.86909245015263, -117.25095900205372],\n "name": "Spiess Hall",\n "images": []\n },\n "SUMNR": {\n "location": [32.86488587494083, -117.2529119246211],\n "name": "Sumner Auditorium",\n "images": []\n },\n "VAUGN": {\n "location": [32.86531011859729, -117.25300219413253],\n "name": "Vaughan Hall",\n "images": []\n }\n }\n }\n}');const buildings={};for(const[college,collegeBldgs]of Object.entries(__default.colleges)){for(const[code,{location:location,name:name,images:images}]of Object.entries(collegeBldgs).sort(((a,b)=>b[1].location[0]-a[1].location[0]))){buildings[code]={name:name,code:code,college:college,location:[location[0],location[1]],images:images}}}class Time{hour;minute;constructor(hour,minute){this.hour=hour;this.minute=minute}get#utcDate(){return new Date(Date.UTC(2e3,0,1,this.hour,this.minute))}formatRange(end,locales){return new Intl.DateTimeFormat(locales,{timeStyle:"short",timeZone:"UTC"}).formatRange(this.#utcDate,end.#utcDate)}toString(locales=false){const minute=this.minute.toString().padStart(2,"0");return typeof locales!=="boolean"?this.#utcDate.toLocaleTimeString(locales,{timeStyle:"short",timeZone:"UTC"}):locales?`${this.hour.toString().padStart(2,"0")}:${minute}`:`${(this.hour+11)%12+1}:${minute} ${this.hour<12?"a":"p"}m`}valueOf(){return this.hour*60+this.minute}static from(minutes){return new Time(Math.floor(minutes/60),minutes%60)}static parse24(string){const[hour,minute]=string.split(":").map(Number);if(Number.isInteger(hour)&&hour>=0&&hour<24&&Number.isInteger(minute)&&minute>=0&&minute<60){return new Time(hour,minute)}else{return null}}}function coursesToClassrooms(courses,{finals:finals=false,monday:monday}){const holidays=getHolidays(monday.year);const nextMonday=monday.add(7);const buildings={};for(const[i,{code:code,groups:groups}]of courses.entries()){for(const[j,{sections:sections,meetings:meetings,exams:exams,dateRange:dateRange}]of groups.entries()){const groupCapacity=sections.reduce(((cum,curr)=>cum+curr.capacity),0);const allMeetings=[...sections,...meetings,...exams];for(const meeting of allMeetings){const{location:location,time:time}=meeting;if(!time||!location||location.building==="RCLAS"){continue}if(meeting.kind==="exam"){if(meeting.date=nextMonday){continue}}else if(finals){continue}const days=time.days.filter((weekday=>{const day=monday.add((weekday+6)%7);if(holidays[day.id]){return false}if(dateRange&&meeting.kind!=="exam"){return dateRange.start<=day&&day<=dateRange.end}return true}));if(days.length===0){continue}buildings[location.building]??={};buildings[location.building][location.room]??=[];buildings[location.building][location.room].push({...meeting,days:days,start:Time.from(time.start),end:Time.from(time.end),capacity:meeting.kind==="section"?meeting.capacity:groupCapacity,course:code,index:{group:i,meeting:j},special:dateRange!==undefined&&meeting.kind!=="exam"})}}}return buildings}const TILE_LEFT=-6;const SCALE=2**(7+17)*1.5;function latLongToPixel([latitude,longitude]){return{x:SCALE*(longitude/180+1),y:-SCALE*(Math.log(Math.tan(Math.PI/4+latitude*Math.PI/360))/Math.PI+1)}}const coords=Object.values(buildings).map((({location:location})=>location));function getExtremeCoord(index,max){return coords.reduce(((acc,curr)=>(max?Math.max:Math.min)(acc,curr[index])),max?-Infinity:Infinity)}const southwest=latLongToPixel([getExtremeCoord(0,false),getExtremeCoord(1,false)]);const northeast=latLongToPixel([getExtremeCoord(0,true),getExtremeCoord(1,true)]);const PADDING={top:60,horizontal:50,bottom:168};const MAP_TILE_SIZE=256*1.5;const center=latLongToPixel([32.877341347399,-117.23531663418]);const mapPosition={x:Math.floor(center.x/MAP_TILE_SIZE+TILE_LEFT)*MAP_TILE_SIZE-(southwest.x-PADDING.horizontal),y:Math.floor(center.y/MAP_TILE_SIZE-4)*MAP_TILE_SIZE-(northeast.y-PADDING.top),width:(5-TILE_LEFT+1)*MAP_TILE_SIZE};const TIME_ZONE="America/Los_Angeles";function inPT(){const{timeZone:timeZone}=(new Intl.DateTimeFormat).resolvedOptions();return timeZone===TIME_ZONE}function toPT(date){const string=date.toLocaleString("en-US",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",timeZone:TIME_ZONE});const match=string.match(/^(\d\d)\/(\d\d)\/(\d{4}), (\d\d):(\d\d) ([AP]M)$/);if(match){return{date:Day.from(+match[3],+match[1],+match[2]),time:new Time(match[4]==="12"?match[6]==="AM"?0:12:+match[4]+(match[6]==="PM"?12:0),+match[5])}}else{console.warn(string,"did not match expected PT format.");return{date:Day.fromLocal(date),time:new Time(date.getHours(),date.getMinutes())}}}function now(){return toPT(new Date)}function used(weekday,time,includeBefore=0){return meeting=>meeting.days.includes(weekday)&&+meeting.start-includeBefore<=+time&&timename!=="")).map((name=>{const[first,last]=name.split(",");return{first:first,last:last}})),sections:[],meetings:[],exams:[],coscheduled:[]});state={type:"sections",hasMeetings:additionalMeetings===":"||additionalMeetings===".",hasExams:additionalMeetings===":"||additionalMeetings==="'"}}}else if(state.type==="sections"){while(taker.hasMore()){const capacity=taker.takeInt(4);group.sections.push({kind:"section",capacity:capacity===9999?Infinity:capacity,...taker.takeMeeting(),code:taker.take(3)})}state=state.hasMeetings?{type:"meetings",hasExams:state.hasExams}:state.hasExams?{type:"exams"}:{type:"course-or-group"}}else if(state.type==="meetings"){while(taker.hasMore()){group.meetings.push({kind:"meeting",...taker.takeMeeting(),code:taker.take(3)})}state=state.hasExams?{type:"exams"}:{type:"course-or-group"}}else if(state.type==="exams"){while(taker.hasMore()){const date=Day.from(taker.takeInt(4),taker.takeInt(2),taker.takeInt(2));group.exams.push({kind:"exam",date:date,...taker.takeMeeting(date.day)})}state={type:"course-or-group"}}}return{scraped:scraped,courses:courses}}if(importMeta1.main){console.log(coursesFromFile(await Deno.readTextFile(Deno.args[0])).courses[100])}class TermCache{#cache={};async#fetch(term,summer){const response=await fetch(`../data/classrooms-${term}.txt`);if(response.ok){try{return coursesFromFile(await response.text(),summer)}catch(error){if(error instanceof CourseFormatError){window.location.reload()}throw error}}else if(response.status===404){return"unavailable"}else{throw new Error(`HTTP ${response.status} error`)}}#term({year:year,quarter:quarter},full){return full?`${termCode(year,quarter)}-full`:termCode(year,quarter)}#request(request,full=false){const termId=this.#term(request,full);const cached=this.#cache[termId]??this.#cache[this.#term(request,true)];if(cached==="unavailable"){return{type:"unavailable",request:request}}else if(cached){return{request:request,result:cached}}else{return this.#fetch(termId,request.quarter==="S3").then((result=>{this.#cache[termId]=result;return result==="unavailable"?{type:"unavailable",request:request}:{request:request,result:result}})).catch((()=>({type:"offline",request:request})))}}#partition(results){const successes=[];const errors=[];for(const result of results){if("result"in result){successes.push(result)}else{errors.push(result)}}return{successes:successes,errors:errors}}requestTerms(requests,full=false){const rawResults=requests.map((request=>this.#request(request,full)));const allCached=rawResults.every((result=>!(result instanceof Promise)));if(allCached){return this.#partition(rawResults)}else{return Promise.all(rawResults).then((results=>this.#partition(results)))}}}function viewFromUrl(url){const{searchParams:searchParams,hash:hash}=new URL(url);const building=searchParams.get("building");const course=searchParams.get("course");const professor=searchParams.get("professor");if(building){return{type:"building",building:building,room:searchParams.get("room")}}else if(course){return{type:"course",course:course}}else if(professor){return{type:"professor",name:professor}}else{return{type:"default",searching:hash==="#search"}}}function viewToUrl(view){const url=new URL(window.location.pathname,window.location.href);if(view.type==="default"){if(view.searching){url.hash="search"}}else if(view.type==="building"){url.searchParams.append("building",view.building);if(view.room){url.searchParams.append("room",view.room)}}else if(view.type==="course"){url.searchParams.append("course",view.course)}else if(view.type==="professor"){url.searchParams.append("professor",view.name)}return url}const OnView=ve((_=>{}));function AbbrevHeading({heading:Heading,abbrev:abbrev,children:children,class:className=""}){return v(Heading,{class:`abbrev-heading ${className}`,children:[v("span",{class:"abbrev",children:abbrev}),v("span",{class:"colon",children:": "}),v("span",{class:"long",children:children})]})}function BackIcon(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",class:"icon",children:v("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"})})}function CloseIcon(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",class:"icon",children:v("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})}const ClearIcon=CloseIcon;function navigate(onView,{view:view={type:"default"},back:back}={}){const destination=viewToUrl(view);const previous=Array.isArray(window.history.state?.previous)?window.history.state?.previous:[];if(back){const index=back(previous.map((url=>viewFromUrl(url))));if(index!==null){window.history.go(-(index+1));return}}onView(view);if(window.location.href===destination.href){return}const args=[{previous:[window.location.href,...previous]},"",destination];window.history.pushState(...args)}function Link({view:view,back:back,class:className="",style:style,children:children,elemRef:elemRef}){const onView=M1(OnView);return v("a",{href:view?"?":undefined,class:`internal-link ${className}`,style:style,ref:elemRef,onClick:e=>{e.preventDefault();if(view){navigate(onView,{view:view,back:back})}},children:children})}const exams={FI:"Final Exam",MI:"Midterm",FM:"Film Sessions",PB:"Problem Sessions",OT:"Other Sessions",RE:"Review Sessions",MU:"Make-up Sessions"};const instructionTypes={LE:"Lecture",DI:"Discussion",LA:"Lab",IN:"Independent Study",SE:"Seminar",AC:"Activity",CL:"Clinical Clerkship",CN:"Clinic",CO:"Conference",FW:"Fieldwork",IT:"Internship",OP:"Outside Preparation",PR:"Practicum",SA:"Study Abroad",SI:"Simultaneous Enrlmnt-Other UC",ST:"Studio",TU:"Tutorial",OT:"Other Sessions"};const meetingTypes={...exams,...instructionTypes};function getFloor(roomNum){const digit=roomNum.match(/\d/);if(digit){const basement=roomNum.startsWith("B");return basement?-digit[0]:+digit[0]}else{return 0}}function compareRoomNums(a,b){const aFloor=getFloor(a);const bFloor=getFloor(b);if(aFloor!==bFloor){return aFloor-bFloor}else{return a.localeCompare(b)}}function RoomList({weekday:weekday,time:time,building:building,rooms:rooms}){if(Object.keys(rooms).length===0){return v("div",{class:"empty",children:v("p",{children:"This building isn't used for any classes this week, as far as WebReg is concerned."})})}return v("div",{class:"room-list",children:[v("div",{class:"gradient gradient-sticky gradient-top"}),v("div",{class:"rooms",children:Object.entries(rooms).sort((([a],[b])=>compareRoomNums(a,b))).map((([room,meetings])=>{const activeMeeting=meetings.find(used(weekday,time,10));const soon=activeMeeting&&timemeeting.days.includes(6)||meeting.days.includes(7)));const earliest=meetings.reduce(((acc,curr)=>Math.min(acc,+curr.start)),Infinity);const latest=meetings.reduce(((acc,curr)=>Math.max(acc,+curr.end)),-Infinity);const inUse=used(weekday,time);return v("div",{class:"schedule",children:[v("div",{class:"day-names-wrapper",children:[v("div",{class:"gradient gradient-bg gradient-top"}),v("div",{class:"day-names",children:(hasWeekend?DAYS:WEEKDAYS).map((weekDay=>v("button",{class:`day day-name ${weekDay===day?"selected-day":""}`,onClick:()=>setDay((day=>weekDay===day?null:weekDay)),children:Day.dayName(weekDay,"short")},weekDay)))})]}),v("div",{class:`meetings-wrapper ${day===null?"full-week":""}`,children:(day!==null?[day]:hasWeekend?DAYS:WEEKDAYS).map((day=>v("div",{class:"day meetings",style:{height:`${(latest-earliest)/1}px`},children:[meetings.filter((meeting=>meeting.days.includes(day))).sort(((a,b)=>+a.start-+b.start)).map((meeting=>v(Link,{view:{type:"course",course:meeting.course},class:`meeting ${inUse(meeting)?"current":""} ${meeting.kind==="exam"?"exam":""}`,style:{top:`${(+meeting.start-earliest)/1}px`,height:`${(+meeting.end-+meeting.start)/1}px`},children:[v("div",{class:"meeting-name",children:[meeting.course," (",v("abbr",{title:meetingTypes[meeting.type],children:meeting.type}),")"]}),v("div",{class:"meeting-time",children:meeting.start.formatRange(meeting.end)}),meeting.special&&v("abbr",{class:"special-summer",title:"This meeting is from a Special Summer Session course.",children:"S3"})]}))),weekday===day&&earliest<=+time&&+time0&&v("img",{class:`building-image ${imageLoaded?"":"building-image-loading"}`,src:imageUrl,onLoad:()=>setImageLoaded(true)},imageUrl),v(Link,{view:room?{type:"building",building:code}:null,class:"icon-btn back",back:([previous])=>{if(previous&&previous.type==="building"&&!previous.room){return 0}else{return null}},children:v(BackIcon,{})}),v(AbbrevHeading,{heading:"h2",abbrev:v("span",{children:[code," ",v("span",{class:"room-number",children:lastRoom})]}),children:name}),v(Link,{view:{type:"default"},class:"icon-btn close",back:([previous,before])=>{if(!previous){return null}if(previous.type==="default"){return 0}if(room&&before&&before.type==="default"){if(previous.type==="building"&&!previous.room){return 1}}return null},children:v(CloseIcon,{})})]}),room?v(RoomSchedule,{weekday:weekday,time:time,meetings:rooms[room]??[]}):v(RoomList,{weekday:weekday,time:time,building:code,rooms:rooms})]})}function BuildingPanel({visible:visible,rightPanelOpen:rightPanelOpen,...props}){return v("div",{class:`building-panel ${visible?"":"building-panel-invisible"} ${rightPanelOpen?"right-panel-open":""}`,children:v(BuildingPanelContent,{...props},props.building.code)})}function BuildingButton({weekday:weekday,time:time,building:building,rooms:rooms,selected:selected,scrollTarget:scrollTarget,visible:visible}){const college=building.college;const ref=L1((button=>{if(scrollTarget&&button){window.requestAnimationFrame((()=>{const windowWidth=window.innerWidth;const windowHeight=window.innerHeight;const panelHeight=scrollTarget.init?0:windowHeight*(windowWidth<=690?.7:.6);const{left:left,top:top,width:width,height:height}=button.getBoundingClientRect();button.closest(".buildings")?.scrollBy({left:left+(-windowWidth+width)/2,top:top+(-(windowHeight-panelHeight)+height)/2,behavior:scrollTarget.init?"auto":"smooth"})}))}}),[scrollTarget]);const{x:x,y:y}=latLongToPixel(building.location);return v(Link,{view:{type:"building",building:building.code},class:`building-btn college-${college} ${selected?"selected":""} ${visible?"":"building-btn-hidden"}`,style:{left:`${x-southwest.x+PADDING.horizontal}px`,top:`${y-northeast.y+PADDING.top}px`},elemRef:ref,children:[building.code,v("span",{class:"room-count",children:[v("span",{class:"in-use",children:rooms.filter((meetings=>meetings.some(used(weekday,time)))).length}),"/",rooms.length]})]})}const dateFormat=new Intl.DateTimeFormat([],{dateStyle:"short",timeStyle:"short"});function DateTimeButton({date:date,time:time,onClick:onClick,bottomPanelOpen:bottomPanelOpen,disabled:disabled}){const{year:year,season:season,current:current,week:week}=getTerm(date);return v("button",{class:`date-time-button ${bottomPanelOpen?"bottom-panel-open":""}`,onClick:onClick,disabled:disabled,children:[v("p",{class:"showing-schedule-wrapper",children:[v("span",{class:"showing-schedule-text",children:"Showing schedule for"}),v("div",{class:"date-time",children:dateFormat.format(new Date(date.year,date.month,date.date,time.hour,time.minute))}),current&&v("span",{class:"quarter-week",children:[termCode(year,season)," ",week<10?`Week ${week}`:"Finals"," ",date.dayName("short")]})]}),v("div",{class:"filled-icon-btn edit-icon",children:"Edit"})]})}function CalendarRow({children:children,week:week,class:className=""}){return v("div",{class:`calendar-row ${className}`,children:[v("div",{class:"calendar-week-num",children:week}),children]})}function CalendarHeaderRow(){return v(CalendarRow,{class:"calendar-header-row",week:v("span",{children:"Wk"}),children:DAY_NUMS.map((day=>v("div",{class:`calendar-item calendar-week-day`,children:Day.dayName(day+1,"short")})))})}function CalendarQuarterHeadingRow({year:year,season:season}){return v(CalendarRow,{class:"calendar-heading-row calendar-quarter-heading-row",children:[v("div",{class:"gradient gradient-bg gradient-bottom"}),v(AbbrevHeading,{heading:"h2",abbrev:termCode(year,season),class:"calendar-heading calendar-quarter-heading",children:termName(year,season)})]})}function CalendarMonthHeadingRow({month:month}){return v(CalendarRow,{class:"calendar-heading-row calendar-month-heading-row",children:v("h3",{class:"calendar-heading calendar-month-heading",children:Day.monthName(month)})})}function CalendarWeekRow({termDays:termDays,start:start,end:end,monday:monday,date:date,onDate:onDate}){const endDay=monday.add(7);const week=Math.floor((monday.id-termDays.start.id)/7)+1;const holidays=getHolidays(Math.max(monday.year,start.year));return v("div",{class:"calendar-row calendar-date-row",children:[v("div",{class:"calendar-week-num",children:week===11?"FI":termDays.start{const day=monday.add(i);if(dayend){return v("div",{class:"calendar-item"})}return v("label",{class:`calendar-item calendar-day ${day>=termDays.finals&&day<=termDays.end?"calendar-finals-day":""} ${day.id===date.id?"calendar-selected":""} ${day>=termDays.start&&day<=termDays.end&&!holidays[day.id]?"":"calendar-break-day"}`,children:[v("input",{type:"radio",class:"visually-hidden",name:"calendar-day",onKeyDown:e=>{if(e.key==="ArrowUp"||e.key==="ArrowDown"){const up=e.key==="ArrowUp";onDate(date.add(up?-7:7));e.preventDefault()}},onInput:()=>onDate(day),checked:day.id===date.id}),day.date]})}))]})}function MonthCalendar({start:start,end:end,scrollMode:scrollMode,month:month,...props}){const{date:date}=props;const monthStart=Day.max(start,Day.from(start.year,month,1));const monthEnd=Day.min(end,Day.from(start.year,month+1,0));const weeks=[];for(let monday=monthStart.monday;monday<=monthEnd;monday=monday.add(7)){weeks.push(v(CalendarWeekRow,{monday:monday,start:monthStart,end:monthEnd,...props},monday.id))}const ref=w(null);j1((()=>{const div=ref.current;if(div?.parentElement&&scrollMode!=="none"&&date>=monthStart&&date<=monthEnd){div.parentElement.scrollTo({top:div.offsetTop-90,behavior:scrollMode==="init"?"auto":"smooth"})}}),[scrollMode,date.id,monthStart.id,monthEnd.id]);return v("div",{class:"calendar-month",ref:ref,children:[v(CalendarMonthHeadingRow,{month:month}),weeks]})}function TermCalendar(props){const{start:start,end:end}=props;const months=[];for(let month=start.month;month<=end.month;month++){months.push(v(MonthCalendar,{month:month,...props},month))}return v(I,{children:months})}const seasons=["WI","SP","S1","S2","FA"];function Calendar({freeScroll:freeScroll,...props}){const{date:date,scrollMode:scrollMode}=props;const selectedStart=date.month<=6?date.year-1:date.year;const selectedEnd=date.month>=9?date.year+1:date.year;const[start,setStart]=k(selectedStart);const[end,setEnd]=k(selectedEnd);if(scrollMode==="date-edited"){if(start!==selectedStart){setStart(selectedStart)}if(end!==selectedEnd){setEnd(selectedEnd)}}j1((()=>{if(document.activeElement instanceof HTMLInputElement&&document.activeElement.name==="calendar-day"&&!document.activeElement.checked){const checked=document.querySelector('[name="calendar-day"]:checked');if(checked instanceof HTMLInputElement){checked.focus()}}}),[date.id]);const calendars=[];for(let year=start;year<=end;year++){const yearTermDays=seasons.map((season=>getTermDays(year,season)));for(const[i,season]of seasons.entries()){calendars.push(v(CalendarQuarterHeadingRow,{year:year,season:season},`${year} ${season} heading`),v(TermCalendar,{termDays:yearTermDays[i],start:i===0?Day.from(year,1,1):yearTermDays[i].start.monday,end:yearTermDays[i+1]?.start.monday.add(-1)??Day.from(year+1,1,0),...props},`${year} ${season}`))}}return v("div",{class:"calendar-scroll-area",children:[v("div",{class:"gradient gradient-sticky gradient-top"}),v(CalendarHeaderRow,{}),v(CalendarRow,{class:"show-year-btn-top",children:v("button",{type:"button",class:"show-year-btn",onClick:e=>{setStart(start-1);freeScroll();const target=e.currentTarget.closest(".calendar-scroll-area")?.querySelector(".calendar-month");if(target instanceof HTMLElement){const oldX=target.offsetTop;window.requestAnimationFrame((()=>{target.parentElement?.scrollTo({top:target.offsetTop-oldX})}))}},children:["Show ",start-1]})}),calendars,v(CalendarRow,{children:v("button",{type:"button",class:"show-year-btn",onClick:()=>{setEnd(end+1);freeScroll()},children:["Show ",end+1]})}),v("div",{class:"gradient gradient-sticky gradient-bottom"})]})}function DateTimePanel({date:date,onDate:onDate,time:time,onTime:onTime,useNow:useNow,onUseNow:onUseNow,visible:visible,closeable:closeable,class:className,onClose:onClose}){const[scrollMode,setScrollMode]=k("init");return v("form",{class:`date-time-panel ${visible?"":"date-time-panel-hidden"} ${className} calendar-open`,onSubmit:e=>{onClose();e.preventDefault()},children:[v("div",{class:"date-time-flex",children:[v("label",{class:"checkbox-label",children:[v("input",{type:"checkbox",checked:useNow,onInput:e=>{onUseNow(e.currentTarget.checked);if(e.currentTarget.checked){setScrollMode("date-edited")}}}),v("span",{children:["Use current time",inPT()?null:v("span",{class:"tz-note",children:"(in San Diego)"})]})]}),date.id!==Day.today().id&&v("button",{type:"button",class:"today-btn",onClick:()=>{onDate(Day.today());setScrollMode("date-edited")},children:"Today"}),closeable&&v("button",{class:"filled-icon-btn close-date-btn",children:"Close"})]}),v("div",{class:"date-time-flex",children:[v("input",{type:"date",name:"date",value:date.toString(),onInput:e=>{const date=Day.parse(e.currentTarget.value);if(date){if(useNow){onUseNow(false)}onDate(date);setScrollMode("date-edited")}},class:"date-input"}),v("input",{type:"time",value:time.toString(true),onInput:e=>{const time=Time.parse24(e.currentTarget.value);if(time){if(useNow){onUseNow(false)}onTime(time)}},class:"time-input"})]}),v(Calendar,{date:date,onDate:date=>{if(useNow){onUseNow(false)}onDate(date);setScrollMode("none")},scrollMode:scrollMode,freeScroll:()=>setScrollMode("none")})]})}const webregDays=["Sun","M","Tu","W","Th","F","S","Sun"];function MeetingCard({meeting:meeting,code:code}){const physicalRoom=meeting.location&&meeting.location.building!=="RCLAS";return v("section",{class:"meeting-card",children:[v("p",{class:"meeting-type",children:[meetingTypes[meeting.type]??meeting.type,code&&v(I,{children:[v("span",{class:"colon",children:": "}),v("span",{class:"meeting-code",children:code})]})]}),meeting.kind==="section"&&v("p",{class:"meeting-column section-capacity",children:meeting.capacity===Infinity?"No limit":v(I,{children:["Capacity: ",v("strong",{children:meeting.capacity})]})}),v("div",{class:"mobile-break"}),v("p",{class:`meeting-column meeting-date ${meeting.kind==="exam"?"meeting-date-specific":""}`,children:meeting.kind==="exam"?meeting.date.toString([],{month:"long",day:"numeric"}):meeting.time&&v(I,{children:[v("abbr",{title:meeting.time.days.map((day=>Day.dayName(day,"long"))).join(", "),children:meeting.time.days.map((day=>webregDays[day])).join("")})," ",Time.from(meeting.time.start).formatRange(Time.from(meeting.time.end))]})}),v(Link,{view:physicalRoom&&meeting.location?{type:"building",building:meeting.location.building,room:meeting.location.room}:null,class:`meeting-column location ${physicalRoom?"":"location-not-room"}`,children:meeting.location?meeting.location.building==="RCLAS"?"Remote":`${meeting.location.building} ${meeting.location.room}`:"TBA"})]})}function CourseInfo({course:course}){return v("div",{class:"course-info",children:course.groups.map((group=>v("article",{class:"group",children:[v("header",{class:"group-info",children:[v("span",{class:"group-code",children:group.code}),v("div",{class:"instructors",children:[group.instructors.map((({first:first,last:last})=>v(Link,{view:{type:"professor",name:`${last}, ${first}`},class:"instructor",children:[first," ",v("span",{class:"last-name",children:last})]},`${last}, ${first}`))),group.instructors.length===0&&v("span",{class:"staff",children:"Instructor TBA"})]})]}),group.meetings.map(((meeting,i)=>v(MeetingCard,{meeting:meeting,code:meeting.code!==group.code?meeting.code:null},i))),group.sections.length>0&&group.meetings.length>0&&v("hr",{class:"additional-meetings-divider"}),group.sections.map((section=>v(MeetingCard,{meeting:section,code:section.code!==group.code?section.code:null},section.code))),group.meetings.length>0&&group.exams.length>0&&v("hr",{class:"additional-meetings-divider"}),group.exams.map(((exam,i)=>v(MeetingCard,{meeting:exam},i)))]},group.code)))})}function ProfInfo({professor:professor}){return v("div",{class:"prof-info",children:professor.courses.map((course=>v(Link,{view:{type:"course",course:course.code},class:"prof-course",children:course.code},course.code)))})}function ResultModal({view:view,open:open}){const onView=M1(OnView);const ref=w(null);j1((()=>{if(open){ref.current?.showModal()}else{ref.current?.close("force-closed")}}),[open]);return v("dialog",{class:"modal",ref:ref,onClick:e=>{if(e.target===e.currentTarget){e.currentTarget.close("shaded-area")}},onClose:e=>{if(e.currentTarget.returnValue!=="force-closed"){navigate(onView,{view:{type:"default"},back:([previous])=>{if(previous&&previous.type!=="course"&&previous.type!=="professor"){return 0}else{return null}}})}},children:v("form",{method:"dialog",class:"modal-body",children:[v("header",{class:"modal-header",children:[view.type==="course"?v(AbbrevHeading,{heading:"h1",abbrev:view.course.code,class:"modal-title modal-title-course-code",children:view.course.title}):v("h1",{class:"modal-title modal-title-professor",children:[view.professor.first," ",v("span",{class:"last-name",children:view.professor.last})]}),v("button",{class:"close icon-btn",type:"submit",value:"close-btn",children:v(CloseIcon,{})})]}),view.type==="course"?v(CourseInfo,{course:view.course}):v(ProfInfo,{professor:view.professor})]})})}function SearchIcon(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 -960 960 960",class:"icon",children:v("path",{d:"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"})})}function SearchResult({name:name,code:code,primary:primaryField,match:match,selected:selected,view:view}){const ref=w(null);j1((()=>{if(selected){ref.current?.scrollIntoView({block:"nearest"})}}),[selected]);const nameFirst=primaryField==="name";const primary=nameFirst?name:code;const secondary=nameFirst?code:name;return v(Link,{view:view,class:`result ${selected?"result-selected":""}`,elemRef:ref,children:[primary!==undefined&&v("p",{class:`result-primary ${nameFirst?"result-name":"result-code"}`,children:match?v(I,{children:[primary.slice(0,match.start),v("span",{class:"result-match",children:primary.slice(match.start,match.end)}),primary.slice(match.end)]}):primary}),secondary!==undefined&&v("p",{class:`result-secondary ${nameFirst?"result-code":"result-name"}`,children:secondary})]})}function score(string,query){if(string===""){return{score:0}}string=string.toLocaleLowerCase();if(string===query){return{score:3,match:{start:0,end:string.length}}}if(string.startsWith(query)){return{score:2+(/\W/.test(string[query.length])?.5:0),match:{start:0,end:query.length}}}const index=string.indexOf(query);if(index!==-1){return{score:1+(/\W/.test(string[index-1])&&(index+query.length===string.length||/\W/.test(string[index+query.length]))?.5:0),match:{start:index,end:index+query.length}}}return{score:0}}function maxResult(a,b){return a.score>=b.score?a:b}function sortResults(results){return results.filter((result=>result.score>0)).sort(((a,b)=>b.score-a.score)).slice(0,15)}function search(data,query){if(query===""){return{courses:[],buildings:[],professors:[]}}const results={courses:sortResults(data.courses.map((course=>maxResult({...course,in:"title",...score(course.title,query)},{...course,in:"code",...score(course.code,query)})))),professors:sortResults(data.professors.map((({first:first,last:last})=>{const id=`${last}, ${first}`;return maxResult({first:first,last:last,id:id,order:"forward",...score(`${first} ${last}`,query)},{first:first,last:last,id:id,order:"reverse",...score(id,query)})}))),buildings:sortResults(data.buildings.map((code=>maxResult({code:code,in:"name",...score(buildings[code]?.name??"",query)},{code:code,in:"code",...score(code,query)}))))};const sections=(results.courses.length>0?1:0)+(results.professors.length>0?1:0)+(results.buildings.length>0?1:0);const maxSectionLength=sections===3?5:sections===2?7:12;return{courses:results.courses.slice(0,maxSectionLength),professors:results.professors.slice(0,maxSectionLength),buildings:results.buildings.slice(0,maxSectionLength)}}function SearchResults({terms:terms,query:query,data:data,index:index}){const results=T1((()=>search(data,query.toLowerCase())),[query,data]);const length=results.courses.length+results.professors.length+results.buildings.length;index=index===null?-1:(index%length+length)%length;if(length===0){if(query===""){return null}else{return v("p",{class:"no-results",children:["No results from ",terms.map((({year:year,quarter:quarter})=>termName(year,quarter))).join(" nor "),"."]})}}return v("div",{class:"results",children:[results.courses.length>0&&v("h2",{class:"result-heading",children:"Courses"}),results.courses.map(((course,i)=>v(SearchResult,{name:course.title,code:course.code,primary:course.in==="code"?"code":"name",match:course.match,selected:i===index,view:{type:"course",course:course.code}},`course\t${course.code}\t${course.in}`))),results.professors.length>0&&v("h2",{class:"result-heading",children:"Professors"}),results.professors.map(((professor,i)=>v(SearchResult,{name:professor.order==="forward"?`${professor.first} ${professor.last}`:professor.id,primary:"name",match:professor.match,selected:i+results.courses.length===index,view:{type:"professor",name:professor.id}},`course\t${professor.id}\t${professor.order}`))),results.buildings.length>0&&v("h2",{class:"result-heading",children:"Buildings"}),results.buildings.map(((building,i)=>v(SearchResult,{name:buildings[building.code]?.name??building.code,code:building.code,primary:building.in==="code"?"code":"name",match:building.match,selected:i+results.courses.length+results.professors.length===index,view:{type:"building",building:building.code}},`course\t${building.code}\t${building.in}`)))]})}function SearchBar({state:state,terms:terms,termId:termId,buildings:buildings,showResults:showResults,onSearch:onSearch,visible:visible}){const[query,setQuery]=k("");const[index,setIndex]=k(0);const ref=w(null);const loaded=state.type==="loaded"&&state.termId===termId;j1((()=>{const handleKeyDown=e=>{if(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey){return}if((e.key==="/"||e.key==="s")&&e.target===document.body){ref.current?.focus();e.preventDefault()}};document.addEventListener("keydown",handleKeyDown);return()=>{document.removeEventListener("keydown",handleKeyDown)}}),[]);return v("form",{role:"search",action:"javascript:",onSubmit:e=>{const selected=e.currentTarget.closest(".search-wrapper")?.querySelector(".result-selected");if(selected instanceof HTMLElement){selected.click()}},class:`search-wrapper ${visible?"":"hide-search"} ${loaded&&showResults&&query!==""?"showing-results":""}`,children:[v("label",{class:"search-bar",children:[v(SearchIcon,{}),v("input",{type:"text",id:"search",autocomplete:"off",autocapitalize:"none",autocorrect:"off","aria-label":"Search courses, people, and buildings.",title:"Press '/' to jump to the search box.",placeholder:"Search courses, people, buildings...",class:"search-input",value:query,onInput:e=>{setQuery(e.currentTarget.value);setIndex(0);onSearch(e.currentTarget.value.length>0)},onKeyDown:e=>{if(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey){return}if(e.key==="ArrowUp"||e.key==="ArrowDown"){setIndex((index=>index===null?e.key==="ArrowUp"?-1:0:index+(e.key==="ArrowUp"?-1:1)));e.preventDefault()}},onFocus:e=>{onSearch(e.currentTarget.value.length>0)},ref:ref}),query.length>0&&v("button",{class:"icon-btn clear-btn",type:"reset",onClick:()=>{setQuery("");onSearch(false)},children:v(ClearIcon,{})})]}),loaded&&showResults&&v(SearchResults,{terms:terms,query:query,data:{...state.data,buildings:buildings},index:index})]})}function TermStatus({status:currentStatus,visible:visible}){const showStatus=visible&¤tStatus&¤tStatus.length>0;const status=useLast([],showStatus?currentStatus:null);const omitTerm=status.length===1&&status[0][0].quarter!=="S3";return v("div",{class:`term-statuses ${showStatus?"":"hide-status"}`,children:status.map((([term,status])=>v("p",{class:`term-updated ${status==="offline"?"term-offline":status==="unavailable"?"term-unavailable":""}`,children:[!omitTerm&&v(I,{children:[v("span",{class:"term-code",children:termCode(term.year,term.quarter)})," "]}),status instanceof Date?v(I,{children:[omitTerm?"Updated ":"last updated ",v("span",{class:"updated-date",children:status.toLocaleDateString()}),"."]}):status==="offline"?"failed to load.":"is unavailable."]},termCode(term.year,term.quarter))))})}function displayError(errors){const offlineErrors=errors.filter((({type:type})=>type==="offline")).map((({request:{year:year,quarter:quarter}})=>termName(year,quarter)));if(offlineErrors.length>0){return`I couldn't load schedules for ${offlineErrors.join(" and ")}. Is ResNet failing you again?`}else{return`Schedules aren't available for ${errors.map((({request:{year:year,quarter:quarter}})=>termName(year,quarter))).join(" and ")}.`}}function getTerms({year:year,season:season,current:current}){const terms=[current?[{year:year,quarter:season}]:[],season==="S1"||season==="S2"||season==="FA"&&!current?[{year:year,quarter:"S3"}]:[]];return terms.flat()}function App({title:title}){const onView=M1(OnView);const[realTime,setRealTime]=k(true);const[date,setDate]=k((()=>now().date));const[time,setTime]=k((()=>now().time));j1((()=>{if(realTime){const intervalId=setInterval((()=>{const{date:date,time:time}=now();setTime((oldTime=>+oldTime===+time?oldTime:time));setDate((oldDate=>{if(+oldDate===+date){return oldDate}else{handleDate(date);return date}}))}),1e3);return()=>{clearInterval(intervalId)}}}),[realTime]);const termCache=w(new TermCache);const[state,setState]=k(null);const noticeVisible=!state?.buildings;const notice=useLast("",state===null?"Loading...":state.buildings?null:state&&state.errors.length>0?displayError(state.errors):state.holiday?`${state.holiday}!`:state.season==="WI"?"Winter break.":state.season==="SP"?"Spring break.":"Summer break.");const[showDatePanel,setShowDatePanel]=k(false);const[buildingCode,setBuildingCode]=k(null);const lastBuilding=useLast("CENTR",buildingCode);const[scrollTo,setScrollTo]=k({building:"CENTR",init:true});const[room,setRoom]=k(null);const[showResults,setShowResults]=k(false);const[searchState,setSearchState]=k({type:"unloaded"});const[modal,setModal]=k(null);const modalView=useLast({type:"course",course:{code:"",title:"",groups:[]}},modal);const terms=getTerms(getTerm(date));const termId=terms.map((term=>termCode(term.year,term.quarter))).join(" ");const datePanelVisible=showDatePanel||noticeVisible&&state!==null;const buildingPanelVisible=buildingCode!==null&&!noticeVisible;async function handleDate(date){const currentTerm=getTerm(date);const{season:season,finals:finals}=currentTerm;const terms=getTerms(currentTerm);const holiday=getHolidays(date.year)[date.id];if(holiday||terms.length===0){setState({errors:[],status:[],season:season,holiday:holiday});return}const maybePromise=termCache.current.requestTerms(terms);if(maybePromise instanceof Promise){setState(null)}const{successes:successes,errors:errors}=maybePromise instanceof Promise?await maybePromise:maybePromise;const courses=successes.flatMap((result=>result.result.courses));const finalsWeek=finals&&season!=="S1"&&season!=="S2";const classrooms=coursesToClassrooms(courses,{monday:date.monday,finals:finalsWeek});for(const building of Object.keys(classrooms)){if(!buildings[building]){console.warn(`${building} does not exist.`)}}const empty=Object.keys(classrooms).length===0&&!(finalsWeek&&courses.length>0);setState({buildings:empty?undefined:classrooms,status:[...successes.map((result=>[result.request,result.result.scraped])),...errors.map((error=>[error.request,error.type]))],errors:errors,season:season})}j1((()=>{handleDate(date)}),[]);async function loadTerms(){const maybePromise=termCache.current.requestTerms(terms,true);if(maybePromise instanceof Promise){setSearchState({type:"loading"})}const{successes:successes,errors:errors}=maybePromise instanceof Promise?await maybePromise:maybePromise;const courses=successes.flatMap((result=>result.result.courses));setSearchState({type:"loaded",termId:termId,data:{courses:courses,professors:Array.from(new Set(courses.flatMap((course=>course.groups.flatMap((group=>group.instructors.map((({first:first,last:last})=>`${last}, ${first}`))))))),(name=>{const[last,first]=name.split(", ");return{first:first,last:last}}))},offline:errors.filter((error=>error.type==="offline")).map((error=>error.request))});return courses}async function handleView(view){if(view.type==="default"){setModal(null);setBuildingCode(null);setShowResults(!!view.searching);document.title=title;return}setShowResults(false);if(view.type==="building"){setScrollTo({building:view.building,init:false});setBuildingCode(view.building);setModal(null);setRoom(view.room??null);document.title=`${view.room?`${view.building} ${view.room}`:buildings[view.building]?.name??view.building} · ${title}`;return}setBuildingCode(null);const courses=searchState.type==="loaded"&&searchState.termId===termId?searchState.data.courses:await loadTerms();if(view.type==="course"){const course=courses.find((course=>course.code===view.course));if(course){setModal({type:"course",course:course});document.title=`${view.course} · ${title}`}else{setModal({type:"course",course:{code:view.course,title:view.course,groups:[]}});document.title=`Course not found · ${title}`}}else{const[last,first]=view.name.split(", ");setModal({type:"professor",professor:{first:first,last:last,courses:courses.flatMap((course=>{const groups=course.groups.filter((group=>group.instructors.some((prof=>prof.first===first&&prof.last===last))));return groups.length>0?[{...course,groups:groups}]:[]}))}});document.title=`${first} ${last} · ${title}`}}j1((()=>{const initView=viewFromUrl(window.location.href);if(initView.type!=="default"){handleView(initView)}const handlePopstate=()=>{handleView(viewFromUrl(window.location.href))};window.addEventListener("popstate",handlePopstate);return()=>{window.removeEventListener("popstate",handlePopstate)}}),[searchState]);return v(OnView.Provider,{value:handleView,children:[v(SearchBar,{state:searchState,terms:terms,termId:termId,buildings:state?.buildings?Object.keys(state?.buildings):[],showResults:showResults,onSearch:showResults=>{setShowResults(showResults);navigate(onView,{view:{type:"default",searching:showResults},back:([previous])=>{if(showResults||!previous){return null}if(previous.type==="default"&&!previous.searching){return 0}else{return null}}});if(searchState.type==="unloaded"||searchState.type==="loaded"&&searchState.termId!==termId){loadTerms()}},visible:!noticeVisible}),v(ResultModal,{view:modalView,open:modal!==null}),v("div",{class:"corner",children:[v(DateTimeButton,{date:date,time:time,onClick:()=>setShowDatePanel(true),bottomPanelOpen:buildingPanelVisible,disabled:datePanelVisible}),v(TermStatus,{status:state?.status,visible:!noticeVisible})]}),v(DateTimePanel,{date:date,onDate:date=>{setRealTime(false);setDate(date);handleDate(date)},time:time,onTime:time=>{setRealTime(false);setTime(time)},useNow:realTime,onUseNow:useNow=>{if(useNow){const{date:date,time:time}=now();setRealTime(true);setDate(date);setTime(time);handleDate(date)}else{setRealTime(false)}},visible:datePanelVisible,closeable:!noticeVisible||state===null,class:`${buildingPanelVisible?"date-time-panel-bottom-panel":""} ${noticeVisible?"date-time-panel-notice-visible":""}`,onClose:()=>setShowDatePanel(false)}),v("div",{class:"buildings-wrapper",children:[v("p",{class:`notice ${noticeVisible?"notice-visible":""} ${datePanelVisible?"notice-date-open":""}`,children:v("span",{class:"notice-text",children:notice})}),v("div",{class:"buildings",children:[v("div",{class:"scroll-area",style:{width:`${northeast.x-southwest.x+PADDING.horizontal*2}px`,height:`${southwest.y-northeast.y+PADDING.top+PADDING.bottom}px`,backgroundSize:`${mapPosition.width}px`,backgroundPosition:`${mapPosition.x}px ${mapPosition.y}px`}}),Object.values(buildings).map((building=>v(BuildingButton,{weekday:date.day,time:time,building:building,rooms:Object.values(state?.buildings?.[building.code]??{}),selected:building.code===buildingCode,scrollTarget:building.code===scrollTo.building?scrollTo:null,visible:!!state?.buildings&&building.code in state.buildings},building.code)))]})]}),v(BuildingPanel,{weekday:date.day,time:time,building:buildings[lastBuilding]??{code:lastBuilding,college:"",images:"",location:[0,0],name:lastBuilding},room:room,rooms:state?.buildings?.[lastBuilding]??{},visible:buildingPanelVisible,rightPanelOpen:datePanelVisible})]})}pe(v(App,{title:document.title}),document.getElementById("root")); +var M,h,J,S,z,K,$,Q,T={},X=[],re=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,F=Array.isArray;function C(t,e){for(var n in e)t[n]=e[n];return t}function Y(t){var e=t.parentNode;e&&e.removeChild(t)}function le(t,e,n){var r,l,o,i={};for(o in e)o=="key"?r=e[o]:o=="ref"?l=e[o]:i[o]=e[o];if(arguments.length>2&&(i.children=arguments.length>3?M.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(o in t.defaultProps)i[o]===void 0&&(i[o]=t.defaultProps[o]);return D(t,i,r,l,null)}function D(t,e,n,r,l){var o={type:t,props:e,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:l??++J};return l==null&&h.vnode!=null&&h.vnode(o),o}function I(t){return t.children}function W(t,e){this.props=t,this.context=e}function L(t,e){if(e==null)return t.__?L(t.__,t.__.__k.indexOf(t)+1):null;for(var n;ee&&S.sort($));H.__r=0}function ee(t,e,n,r,l,o,i,c,u,x,d){var _,m,f,s,p,w,a,v,b,g=0,y=r&&r.__k||X,U=y.length,P=U,E=e.length;for(n.__k=[],_=0;_0?D(s.type,s.props,s.key,s.ref?s.ref:null,s.__v):s)!=null?(s.__=n,s.__b=n.__b+1,(v=se(s,y,a=_+g,P))===-1?f=T:(f=y[v]||T,y[v]=void 0,P--),R(t,s,f,l,o,i,c,u,x,d),p=s.__e,(m=s.ref)&&f.ref!=m&&(f.ref&&j(f.ref,null,s),d.push(m,s.__c||p,s)),p!=null&&(w==null&&(w=p),(b=f===T||f.__v===null)?v==-1&&g--:v!==a&&(v===a+1?g++:v>a?P>E-a?g+=v-a:g--:g=v(u!=null?1:0))for(;i>=0||c=0){if((u=e[i])&&l==u.key&&o===u.type)return i;i--}if(c=u.__.length&&u.__.push({__V:p}),u.__[_]}function k(_){return v1=1,B1(U,_)}function B1(_,n,u){var t=l(c++,2);if(t.t=_,!t.__c&&(t.__=[u?u(n):U(void 0,n),function(a){var f=t.__N?t.__N[0]:t.__[0],s=t.t(f,a);f!==s&&(t.__N=[s,t.__[1]],t.__c.setState({}))}],t.__c=o,!o.u)){var i=function(a,f,s){if(!t.__c.__H)return!0;var m=t.__c.__H.__.filter((function(e){return e.__c}));if(m.every((function(e){return!e.__N})))return!h||h.call(this,a,f,s);var V=!1;return m.forEach((function(e){if(e.__N){var P=e.__[0];e.__=e.__N,e.__N=void 0,P!==e.__[0]&&(V=!0)}})),!(!V&&t.__c.props===a)&&(!h||h.call(this,a,f,s))};o.u=!0;var h=o.shouldComponentUpdate,N=o.componentWillUpdate;o.componentWillUpdate=function(a,f,s){if(this.__e){var m=h;h=void 0,i(a,f,s),h=m}N&&N.call(this,a,f,s)},o.shouldComponentUpdate=i}return t.__N||t.__}function j1(_,n){var u=l(c++,3);!h.__s&&y(u.__H,n)&&(u.__=_,u.i=n,o.__H.__h.push(u))}function w(_){return v1=5,T1((function(){return{current:_}}),[])}function T1(_,n){var u=l(c++,7);return y(u.__H,n)?(u.__V=_(),u.i=n,u.__h=_,u.__V):u.__}function L1(_,n){return v1=8,T1((function(){return _}),n)}function M1(_){var n=o.context[_.__c],u=l(c++,9);return u.c=_,n?(u.__==null&&(u.__=!0,n.sub(o)),n.props.value):_.__}function R1(){for(var _;_=x.shift();)if(_.__P&&_.__H)try{_.__H.__h.forEach(d),_.__H.__h.forEach(E),_.__H.__h=[]}catch(n){_.__H.__h=[],h.__e(n,_.__v)}}h.__b=function(_){o=null,g&&g(_)},h.__r=function(_){A1&&A1(_),c=0;var n=(o=_.__c).__H;n&&(H1===o?(n.__h=[],o.__h=[],n.__.forEach((function(u){u.__N&&(u.__=u.__N),u.__V=p,u.__N=u.i=void 0}))):(n.__h.forEach(d),n.__h.forEach(E),n.__h=[],c=0)),H1=o},h.diffed=function(_){C1&&C1(_);var n=_.__c;n&&n.__H&&(n.__H.__h.length&&(x.push(n)!==1&&b===h.requestAnimationFrame||((b=h.requestAnimationFrame)||S1)(R1)),n.__H.__.forEach((function(u){u.i&&(u.__H=u.i),u.__V!==p&&(u.__=u.__V),u.i=void 0,u.__V=p}))),H1=o=null},h.__c=function(_,n){n.some((function(u){try{u.__h.forEach(d),u.__h=u.__h.filter((function(t){return!t.__||E(t)}))}catch(t){n.some((function(i){i.__h&&(i.__h=[])})),n=[],h.__e(t,u.__v)}})),F1&&F1(_,n)},h.unmount=function(_){q1&&q1(_);var n,u=_.__c;u&&u.__H&&(u.__H.__.forEach((function(t){try{d(t)}catch(i){n=i}})),u.__H=void 0,n&&h.__e(n,u.__v))};var D1=typeof requestAnimationFrame=="function";function S1(_){var n,u=function(){clearTimeout(t),D1&&cancelAnimationFrame(n),setTimeout(_)},t=setTimeout(u,100);D1&&(n=requestAnimationFrame(u))}function d(_){var n=o,u=_.__c;typeof u=="function"&&(_.__c=void 0,u()),o=n}function E(_){var n=o;_.__c=_.__(),o=n}function y(_,n){return!_||_.length!==n.length||n.some((function(u,t){return u!==_[t]}))}function U(_,n){return typeof n=="function"?n(_):n}const MS_PER_DAY=24*60*60*1e3;const DAY_NUMS=[0,1,2,3,4,5,6];class Day{#date;constructor(utcDate){this.#date=utcDate}get year(){return this.#date.getUTCFullYear()}get month(){return this.#date.getUTCMonth()+1}monthName(length="long",locales){return new Intl.DateTimeFormat(locales,{timeZone:"UTC",month:length}).format(this.#date)}get date(){return this.#date.getUTCDate()}get day(){return this.#date.getUTCDay()}dayName(length="long",locales){return new Intl.DateTimeFormat(locales,{timeZone:"UTC",weekday:length}).format(this.#date)}get id(){return this.#date.getTime()/MS_PER_DAY}get sunday(){return this.last(0)}get monday(){return this.last(1)}get valid(){return!Number.isNaN(this.#date.getTime())}add(days){const clone=new Date(this.#date);clone.setUTCDate(this.date+days);return new Day(clone)}last(day){const offset=day-this.day;if(offset===0){return this}else if(offset<0){return this.add(offset)}else{return this.add(offset-7)}}toLocal(hour=0,minute=0){return new Date(this.year,this.month-1,this.date,hour,minute)}toString(...args){return args.length>0?this.#date.toLocaleDateString(args[0],{...args[1],timeZone:"UTC"}):this.valid?[this.year.toString().padStart(4,"0"),this.month.toString().padStart(2,"0"),this.date.toString().padStart(2,"0")].join("-"):"Invalid date"}valueOf(){return this.id}toJSON(){return this.toString()}[Symbol.for("Deno.customInspect")](){return this.toString()}static get EPOCH(){return new Day(new Date(0))}static from(year,month,date){const dateObj=new Date(Date.UTC(year,month-1,date));if(year<100){dateObj.setUTCFullYear(year)}return new Day(dateObj)}static fromLocal(date){return Day.from(date.getFullYear(),date.getMonth()+1,date.getDate())}static today(){return Day.fromLocal(new Date)}static parse(str){const[year,month,date]=str.split("-").map(Number);const parsed=Day.from(year,month,date);return parsed.valid?parsed:null}static fromId(dayId){return Day.EPOCH.add(dayId)}static monthName(month,length="long",locales){return this.from(1970,month,1).monthName(length,locales)}static dayName(day,length="long",locales){return this.from(1970,1,4+day).dayName(length,locales)}static min(first,...rest){const days=Array.isArray(first)?[...first,...rest]:[first,...rest];return this.fromId(days.reduce(((cum,curr)=>Math.min(cum,curr.id)),Infinity))}static max(first,...rest){const days=Array.isArray(first)?[...first,...rest]:[first,...rest];return this.fromId(days.reduce(((cum,curr)=>Math.max(cum,curr.id)),-Infinity))}}const holidayCache={};function getHolidays(year){holidayCache[year]??={[Day.from(year,1,1).id]:"New Year's Day",[Day.from(year,1,7).monday.add(14).id]:"Martin Luther King Jr. Day",[Day.from(year,2,7).monday.add(14).id]:"Presidents' Day",[Day.from(year,3,31).last(5).id]:"César Chávez Day",[Day.from(year,5,31).monday.id]:"Memorial Day",[Day.from(year,6,19).id]:"Juneteenth",[Day.from(year,7,4).id]:"Independence Day",[Day.from(year,9,7).monday.id]:"Labor Day",[Day.from(year,9,11).id]:"Veterans Day",[Day.from(year,11,7).last(4).add(21).id]:"Thanksgiving",[Day.from(year,11,7).last(4).add(22).id]:"Day after Thanksgiving",[Day.from(year,12,24).id]:"Christmas Eve",[Day.from(year,12,25).id]:"Christmas",[Day.from(year,12,31).id]:"New Year's Eve"};return holidayCache[year]}const importMeta={url:"file:///home/sheep/uxdy/terms/index.ts",main:false};const offsets={WI:0,SP:84,S1:175,S2:210,FA:262};const lengths={FA:79,WI:75,SP:74,S1:33,S2:33};const finalsOffsets={FA:7,WI:7,SP:6,S1:1,S2:1};const names={FA:"Fall",WI:"Winter",SP:"Spring",S1:"Summer Session I",S2:"Summer Session II",S3:"Special Summer Session",SU:"Summer Med School"};function winterStart(year){if(year<2028){const jan1=Day.from(year,1,1);return Day.from(year,1,9-jan1.day)}else{const dec30=Day.from(year,1,-1);return Day.from(year,1,14-dec30.day)}}function getTermDays(year,season){let offset=offsets[season];if((season==="FA"?year+1:year)===2e3){offset+=7}if(season==="FA"&&[1995,2001,2006,2014,2020].includes(year)){if(year<2010){offset-=7}else{offset+=7}}const start=winterStart(year).add(offset);return{start:start,finals:start.add(lengths[season]-finalsOffsets[season]),end:start.add(lengths[season]+(year<=1995&&season==="SP"?1:year<2e3&&(season==="S1"||season==="S2")?-1:0))}}function getTerm(day){let termDays=null;let season=null;let current=false;for(const term of["WI","SP","S1","S2","FA"]){termDays=getTermDays(day.year,term);if(day<=termDays.end){season=term;current=day>=termDays.start;break}}if(termDays===null){throw new Error("Unreachable.")}const year=season===null?day.year+1:day.year;if(season===null){season="WI";termDays=getTermDays(year,season)}if(current){const finals=current&&day>=termDays.finals;const week=Math.floor((+day.monday-+termDays.start)/7)+1;return{year:year,season:season,current:current,week:week,finals:finals}}else{return{year:year,season:season,current:current,week:-1,finals:false}}}function termCode(year,quarter){return quarter+(year%100).toString().padStart(2,"0")}function termName(year,quarter){return`${names[quarter]} ${year}`}if(importMeta.main){console.log(["Start year","Fall start","Fall end","Winter start","Spring end"].join("\t"));for(let year=2005;year<=2028;year++){const{end:springEnd}=getTermDays(year,"SP");const{start:fallStart,end:fallEnd}=getTermDays(year,"FA");const{start:winterStart}=getTermDays(year+1,"WI");console.log([+fallStart-+springEnd,+winterStart-+fallEnd].join("\t"))}}function useLast(init,value){const ref=w(init);if(value!==null&&value!==undefined){ref.current=value}return ref.current}const __default=JSON.parse('{\n "$schema": "../schemas/locations.schema.json",\n "comment": [\n "https://registrar.ucsd.edu/StudentLink/bldg_codes.html",\n "For locations, go onto Google Maps, right click on approximate center of building, click on coordinates to copy.",\n "I omit \'College\' and \'Outdoor Classroom\' from building names, but not \'Building.\'"\n ],\n "colleges": {\n "seventh": {\n "OTRSN": {\n "location": [32.88665760836001, -117.24102406579628],\n "name": "Otterson Hall",\n "images": [\n "https://i.imgur.com/2DncCdV.jpeg",\n "https://i.imgur.com/nuuiXO9.jpeg",\n "https://i.imgur.com/ByRotXZ.jpeg",\n "https://i.imgur.com/rh1PE4K.jpeg",\n "https://i.imgur.com/k8Bubgx.jpeg"\n ]\n },\n "SEVW2": {\n "location": [32.8880285561251, -117.24255222849888],\n "name": "Seventh West Building 2",\n "images": []\n },\n "SEVE3": {\n "location": [32.88825009555447, -117.24173440393453],\n "name": "Seventh East Ecoflats 3",\n "images": [\n "https://i.imgur.com/RFVU7xr.jpeg",\n "https://i.imgur.com/81Y5Bqh.jpeg",\n "https://i.imgur.com/z85Z6w3.jpeg",\n "https://i.imgur.com/K7KBhkk.jpeg",\n "https://i.imgur.com/46FqmYp.jpeg",\n "https://i.imgur.com/A7z04lV.jpeg"\n ]\n },\n "SEVE4": {\n "location": [32.88807303667593, -117.2417902045747],\n "name": "Seventh East Ecoflats 4",\n "images": [\n "https://i.imgur.com/rvX3WRu.jpeg",\n "https://i.imgur.com/3HtM3MY.jpeg",\n "https://i.imgur.com/7qsGG1G.jpeg",\n "https://i.imgur.com/A7z04lV.jpeg"\n ]\n },\n "WFH": {\n "location": [32.886967814911024, -117.24173638805067],\n "name": "Wells Fargo Hall",\n "images": [\n "https://i.imgur.com/JwSFFD5.jpeg",\n "https://i.imgur.com/wd4xodE.jpeg",\n "https://i.imgur.com/gPAVIsw.jpeg",\n "https://i.imgur.com/k8Bubgx.jpeg"\n ]\n }\n },\n "erc": {\n "ASANT": {\n "location": [32.88423744331073, -117.24213984468823],\n "name": "Asante House",\n "images": [\n "https://i.imgur.com/41b7QoK.jpeg",\n "https://i.imgur.com/cg9qmez.jpeg",\n "https://i.imgur.com/KAX1Krl.jpeg"\n ]\n },\n "ERCA": {\n "location": [32.886087113975414, -117.24205254723678],\n "name": "ERC Administration",\n "images": [\n "https://i.imgur.com/zTuN3ki.jpeg",\n "https://i.imgur.com/K38yRo7.jpeg",\n "https://i.imgur.com/xsRVr2m.jpeg",\n "https://i.imgur.com/jQdIpgH.jpeg"\n ]\n },\n "GREAT": {\n "location": [32.883944240936444, -117.24193249617227],\n "name": "Great Hall",\n "images": [\n "https://i.imgur.com/2iS1TGa.jpeg",\n "https://i.imgur.com/OKLA6JX.jpeg",\n "https://i.imgur.com/2v7svKU.jpeg"\n ]\n },\n "LASB": {\n "location": [32.88557327735999, -117.2413567320843],\n "name": "Latin American Studies Building",\n "images": ["https://i.imgur.com/kP1FInU.jpeg"]\n },\n "RBC": {\n "location": [32.88427044449085, -117.2408680383893],\n "name": "Robinson Building Complex",\n "images": [\n "https://i.imgur.com/SDNf4ci.jpeg",\n "https://i.imgur.com/jQMCHrY.jpeg",\n "https://i.imgur.com/G0GLZQD.jpeg",\n "https://i.imgur.com/XrAZzhh.jpeg",\n "https://i.imgur.com/1ysjMHf.jpeg"\n ],\n "comment": [\n "https://gps.ucsd.edu/_files/misc/GPS-Printable-Map-2015.pdf",\n "I think Garner is part of this"\n ]\n },\n "SDSC": {\n "location": [32.88445992833245, -117.2393967518539],\n "name": "San Diego Supercomputer Center",\n "images": []\n },\n "SSB": {\n "location": [32.88391338508008, -117.24045720071513],\n "name": "Social Sciences Building",\n "images": [\n "https://i.imgur.com/bHveajb.jpeg",\n "https://i.imgur.com/0V90Tca.jpeg",\n "https://i.imgur.com/5A2kawY.jpeg",\n "https://i.imgur.com/t15im8k.jpeg"\n ]\n }\n },\n "marshall": {\n "CSB": {\n "location": [32.880517237245954, -117.23939317415764],\n "name": "Cognitive Science Building",\n "images": [\n "https://i.imgur.com/CXa715U.jpeg",\n "https://i.imgur.com/6NiZ46R.jpeg",\n "https://i.imgur.com/wSSxyyj.jpeg",\n "https://i.imgur.com/fSMNNuc.jpeg",\n "https://i.imgur.com/riutYQz.jpeg",\n "https://i.imgur.com/pa0BSpr.jpeg",\n "https://i.imgur.com/jZvJO05.jpeg"\n ]\n },\n "ECON": {\n "location": [32.88235588485967, -117.24040328432459],\n "name": "Economics Building",\n "images": [\n "https://i.imgur.com/MTxt62o.jpeg",\n "https://i.imgur.com/iQIL8bu.jpeg",\n "https://i.imgur.com/xnokzUN.jpeg",\n "https://i.imgur.com/YY7YmrA.jpeg"\n ]\n },\n "PETER": {\n "location": [32.879984046654364, -117.2402525268966],\n "name": "Peterson Hall",\n "images": [\n "https://i.imgur.com/7O3YLwu.jpeg",\n "https://i.imgur.com/kZeE8oF.jpeg",\n "https://i.imgur.com/ryxGEki.jpeg",\n "https://i.imgur.com/JWDIvEy.jpeg",\n "https://i.imgur.com/ZwBOssV.jpeg"\n ]\n },\n "SEQUO": {\n "location": [32.88203974495475, -117.24103633144476],\n "name": "Sequoyah Hall",\n "images": [\n "https://i.imgur.com/YXgBI1O.jpeg",\n "https://i.imgur.com/UJa4KNw.jpeg",\n "https://i.imgur.com/NUqDM5a.jpeg",\n "https://i.imgur.com/f7EFZpT.jpeg",\n "https://i.imgur.com/7zLoJjJ.jpeg",\n "https://i.imgur.com/KBUySt6.jpeg"\n ]\n },\n "SOLIS": {\n "location": [32.880935740253626, -117.23964750230745],\n "name": "Solís Hall",\n "images": [\n "https://i.imgur.com/bZzkyvr.jpeg",\n "https://i.imgur.com/EeChtxt.jpeg",\n "https://i.imgur.com/CXa715U.jpeg"\n ]\n },\n "SSRB": {\n "location": [32.88075657728253, -117.240142743495],\n "name": "Social Sciences Research Building",\n "images": [\n "https://i.imgur.com/ktWIzDA.jpeg",\n "https://i.imgur.com/suB1Zw2.jpeg",\n "https://i.imgur.com/suB1Zw2.jpeg",\n "https://i.imgur.com/batB9YN.jpeg",\n "https://i.imgur.com/gNdZy7z.jpeg",\n "https://i.imgur.com/wOK32RL.jpeg",\n "https://i.imgur.com/2Ne0Zz3.jpeg"\n ]\n },\n "TM102": {\n "location": [32.88134401507817, -117.23933111579409],\n "name": "Thurgood Marshall 102",\n "images": ["https://i.imgur.com/gGIHRxo.jpeg"]\n }\n },\n "sixth": {\n "CTL": {\n "location": [32.880720265920914, -117.24142517100402],\n "name": "Catalyst",\n "images": [\n "https://i.imgur.com/Wgtxcio.jpeg",\n "https://i.imgur.com/TApNHHe.jpeg",\n "https://i.imgur.com/UzvzE2n.jpeg",\n "https://i.imgur.com/PgRu7iI.jpeg",\n "https://i.imgur.com/brkGKmT.jpeg",\n "https://i.imgur.com/MzO8kdg.jpeg"\n ]\n },\n "JEANN": {\n "location": [32.8799296621332, -117.24119652096547],\n "name": "The Jeannie",\n "images": [\n "https://i.imgur.com/S7hWyFi.jpeg",\n "https://i.imgur.com/Gr72SGn.jpeg",\n "https://i.imgur.com/jcmweDB.jpeg",\n "https://i.imgur.com/7g2ddgc.jpeg",\n "https://i.imgur.com/H3pf35p.jpeg",\n "https://i.imgur.com/WXEOHoX.jpeg",\n "https://i.imgur.com/0SCGaj1.jpeg"\n ]\n },\n "MOS": {\n "location": [32.88001190738399, -117.24163094823878],\n "name": "Mosaic",\n "images": [\n "https://i.imgur.com/mMpazXy.jpeg",\n "https://i.imgur.com/kOoJMGj.jpeg",\n "https://i.imgur.com/uYLVGh5.jpeg",\n "https://i.imgur.com/PiC2Cb8.jpeg",\n "https://i.imgur.com/FHpBJYo.jpeg",\n "https://i.imgur.com/6woeDzV.jpeg",\n "https://i.imgur.com/6woeDzV.jpeg"\n ]\n },\n "RWAC": {\n "location": [32.880374742852574, -117.24106684310492],\n "name": "Ridge Walk Academic Complex",\n "images": [\n "https://i.imgur.com/wzZrECe.jpeg",\n "https://i.imgur.com/rHbydi1.jpeg",\n "https://i.imgur.com/bckfXJi.jpeg",\n "https://i.imgur.com/6hH79mc.jpeg",\n "https://i.imgur.com/OHUnhy9.jpeg",\n "https://i.imgur.com/jBTe18L.jpeg",\n "https://i.imgur.com/cga1K75.jpeg",\n "https://i.imgur.com/ltI4q8O.jpeg",\n "https://i.imgur.com/8yGvvrA.jpeg",\n "https://i.imgur.com/PKQ0Eda.jpeg",\n "https://i.imgur.com/GJlru9N.jpeg",\n "https://i.imgur.com/pvCEee4.jpeg",\n "https://i.imgur.com/U817BWw.jpeg"\n ]\n }\n },\n "muir": {\n "APM": {\n "location": [32.87900949086575, -117.24105009713044],\n "name": "Applied Physics and Mathematics",\n "images": [\n "https://i.imgur.com/89vhOWC.jpeg",\n "https://i.imgur.com/1xFYiGu.jpeg",\n "https://i.imgur.com/89vhOWC.jpeg",\n "https://i.imgur.com/FloMKYA.jpeg"\n ]\n },\n "BIO": {\n "location": [32.878428690703146, -117.24103674033825],\n "name": "Biology Building",\n "images": [\n "https://i.imgur.com/voBOeaq.jpeg",\n "https://i.imgur.com/7fdINBO.jpeg",\n "https://i.imgur.com/BklsyEi.jpeg"\n ]\n },\n "HSS": {\n "location": [32.87834508545459, -117.24168835799722],\n "name": "Humanities and Social Sciences Building",\n "images": [\n "https://i.imgur.com/Lue4Hz0.jpeg",\n "https://i.imgur.com/ESTU5K4.jpeg",\n "https://i.imgur.com/hoq0JCh.jpeg",\n "https://i.imgur.com/q36eBkZ.jpeg"\n ]\n },\n "LEDDN": {\n "location": [32.87876783002103, -117.24168242455174],\n "name": "Ledden Auditorium",\n "images": [\n "https://i.imgur.com/TeEhzeV.jpeg",\n "https://i.imgur.com/BklsyEi.jpeg",\n "https://i.imgur.com/TqvKBYJ.jpeg"\n ]\n },\n "MANDE": {\n "location": [32.877812337766414, -117.23998508397895],\n "name": "Mandeville Center",\n "images": [\n "https://i.imgur.com/2yXTr9k.jpeg",\n "https://i.imgur.com/w93BY9I.jpeg",\n "https://i.imgur.com/4MCnqQs.jpeg",\n "https://i.imgur.com/kUJwqWS.jpeg",\n "https://i.imgur.com/vcZNcYB.jpeg",\n "https://i.imgur.com/aW79Stz.jpeg",\n "https://i.imgur.com/Xb8Lgc3.jpeg"\n ]\n },\n "MCGIL": {\n "location": [32.87900601797463, -117.24205773606351],\n "name": "McGill Hall",\n "images": [\n "https://i.imgur.com/ean0Xw4.jpeg",\n "https://i.imgur.com/FAyAZ2g.jpeg",\n "https://i.imgur.com/oKUKr7n.jpeg",\n "https://i.imgur.com/RyCAZpz.jpeg"\n ]\n },\n "MNDLR": {\n "location": [32.87928595670899, -117.24214505416418],\n "name": "Mandler Hall",\n "images": [\n "https://i.imgur.com/wHkcEkv.jpeg",\n "https://i.imgur.com/VjGXYpA.jpeg"\n ]\n },\n "RECGM": {\n "location": [32.87672837413399, -117.24124478552716],\n "name": "Recreation Gym",\n "images": ["https://i.imgur.com/qRSwZXl.jpeg"]\n },\n "STCTR": {\n "location": [32.87752027586717, -117.23974942056223],\n "name": "Old Student Center",\n "images": [],\n "comment": [\n "https://ugseminars.ucsd.edu/listing.aspx?qtr=SP16&c=f STCTR E209 is LGBT RC, Conference Room"\n ]\n },\n "TAMRK": {\n "location": [32.87827951064168, -117.24241123452238],\n "name": "Tamarack",\n "images": [],\n "comment": ["Not certain; can\'t find much info on it"]\n }\n },\n "revelle": {\n "BONN": {\n "location": [32.876084946774036, -117.24038814500676],\n "name": "Bonner Hall",\n "images": [\n "https://i.imgur.com/O46bvAl.jpeg",\n "https://i.imgur.com/C9iPmC5.jpeg",\n "https://i.imgur.com/PAzV1gB.jpeg"\n ]\n },\n "GH": {\n "location": [32.87374584111353, -117.24092662366324],\n "name": "Galbraith Hall",\n "images": [\n "https://i.imgur.com/cRjQv3U.jpeg",\n "https://i.imgur.com/diEDnqe.jpeg",\n "https://i.imgur.com/LkEDdjA.jpeg",\n "https://i.imgur.com/5ZlmhSL.jpeg"\n ]\n },\n "MAYER": {\n "location": [32.87528696893803, -117.24019479635555],\n "name": "Mayer Hall",\n "images": [\n "https://i.imgur.com/EdHd4Ud.jpeg",\n "https://i.imgur.com/RnOIVMS.jpeg"\n ]\n },\n "MYR-A": {\n "location": [32.87536189399691, -117.23970412241734],\n "name": "Mayer Hall Addition",\n "images": ["https://i.imgur.com/GWhZi3j.jpeg"]\n },\n "NSB": {\n "location": [32.87527130105447, -117.24282324774462],\n "name": "Natural Sciences Building",\n "images": [\n "https://i.imgur.com/gHCTVsy.jpeg",\n "https://i.imgur.com/p0Gb9tw.jpeg",\n "https://i.imgur.com/R6YKwCR.jpeg",\n "https://i.imgur.com/LJyRUbq.jpeg",\n "https://i.imgur.com/Dj4bcaH.jpeg",\n "https://i.imgur.com/7swuR0z.jpeg"\n ]\n },\n "PACIF": {\n "location": [32.87595284128824, -117.24210006678864],\n "name": "Pacific Hall",\n "images": [\n "https://i.imgur.com/icFVT7s.jpeg",\n "https://i.imgur.com/ql0yrzo.jpeg",\n "https://i.imgur.com/7swuR0z.jpeg",\n "https://i.imgur.com/SZBGFAD.jpeg",\n "https://i.imgur.com/O57GZsU.jpeg",\n "https://i.imgur.com/gHurrsx.jpeg"\n ]\n },\n "REV": {\n "location": [32.87480385710217, -117.24096166711239],\n "name": "Revelle Plaza",\n "images": [\n "https://i.imgur.com/C1hf2i4.jpeg",\n "https://i.imgur.com/WswaxG1.jpeg",\n "https://i.imgur.com/xgdoadK.jpeg"\n ],\n "comment": ["Revelle Plaza Outdoor Classroom"]\n },\n "RVCOM": {\n "location": [32.87457496393089, -117.2425008415767],\n "name": "Revelle Commons",\n "images": [\n "https://i.imgur.com/LC6z27w.jpeg",\n "https://i.imgur.com/cZOtJyZ.jpeg",\n "https://i.imgur.com/M8mLc0O.jpeg",\n "https://i.imgur.com/tkfsNCA.jpeg"\n ]\n },\n "TATA": {\n "location": [32.876460769081355, -117.24152230144844],\n "name": "Tata Hall",\n "images": [\n "https://i.imgur.com/xgg8MgX.jpeg",\n "https://i.imgur.com/RXHiy6H.jpeg"\n ]\n },\n "UREY": {\n "location": [32.875555403867246, -117.2412962102085],\n "name": "Urey Hall",\n "images": [\n "https://i.imgur.com/GHh8eKi.jpeg",\n "https://i.imgur.com/WJoatRZ.jpeg",\n "https://i.imgur.com/tw8jQvV.jpeg",\n "https://i.imgur.com/x25Ffeu.jpeg",\n\n "https://i.imgur.com/eeDOB4E.jpeg",\n "https://i.imgur.com/v8NnQ5W.jpeg"\n ]\n },\n "YORK": {\n "location": [32.87454593562147, -117.24000502137861],\n "name": "York Hall",\n "images": [\n "https://i.imgur.com/ZSk3HVG.jpeg",\n "https://i.imgur.com/OlQ1P94.jpeg",\n "https://i.imgur.com/nSvISfv.jpeg",\n "https://i.imgur.com/NY73bP9.jpeg"\n ],\n "comment": [\n "Herbert F. York Undergraduate Sciences Building",\n "TODO: Take photos now that the facade construction is done."\n ]\n }\n },\n "eighth": {\n "DANCE": {\n "location": [32.87186729617818, -117.24003377110412],\n "name": "Molli and Arthur Wagner Dance Building",\n "images": [\n "https://i.imgur.com/IjcxcYu.jpeg",\n "https://i.imgur.com/mZqSm9K.jpeg",\n "https://i.imgur.com/Ff2omog.jpeg",\n "https://i.imgur.com/Cd9qF5k.jpeg"\n ]\n },\n "MWEIS": {\n "location": [32.87095079844769, -117.24121579783444],\n "name": "Mandell Weiss Theatre",\n "images": [\n "https://i.imgur.com/hFfdmH0.jpeg",\n "https://i.imgur.com/axNZj29.jpeg",\n "https://i.imgur.com/7XrSpQc.jpeg",\n "https://i.imgur.com/U1yMrNx.jpeg"\n ],\n "comment": [\n "According to http://m.ucsd.edu/maps/static/location/5?query=&no_server_init it\'s the theater not forum"\n ]\n },\n "PODEM": {\n "location": [32.87340196755349, -117.24174621477657],\n "name": "Podemos",\n "images": [],\n "comment": [\n "https://www.reddit.com/r/UCSD/comments/13pua2j/podem_1a18/"\n ]\n },\n "POTKR": {\n "location": [32.87110810161448, -117.24052277636109],\n "name": "Sheila and Hughes Potiker Theatre",\n "images": [\n "https://i.imgur.com/g5FaydY.jpeg",\n "https://i.imgur.com/sUsYzqf.jpeg"\n ],\n "comment": [\n "This is the building with the big glass windows that say \'La Jolla Playhouse.\' It\'s labelled as La Jolla Playhouse on the map."\n ]\n }\n },\n "warren": {\n "CMRR": {\n "location": [32.88061652328027, -117.23531336416724],\n "name": "Center for Memory and Recording Research",\n "images": []\n },\n "EBU1": {\n "location": [32.88168612813114, -117.2352758424052],\n "name": "Jacobs Hall",\n "images": [\n "https://i.imgur.com/KqK2iLM.jpeg",\n "https://i.imgur.com/6vAmVAz.jpeg",\n "https://i.imgur.com/TAqZDMr.jpeg",\n "https://i.imgur.com/5heLBXk.jpeg",\n "https://i.imgur.com/z9nZx9E.jpeg"\n ]\n },\n "EBU2": {\n "location": [32.88116494369773, -117.23334050065942],\n "name": "Engineering Building Unit II",\n "images": [\n "https://i.imgur.com/hABuTPh.jpeg",\n "https://i.imgur.com/W3BFNPh.jpeg"\n ]\n },\n "EBU3B": {\n "location": [32.8817383470234, -117.23358830529953],\n "name": "Computer Science and Engineering Building",\n "images": [\n "https://i.imgur.com/cIKcb6i.jpeg",\n "https://i.imgur.com/840Ijht.jpeg",\n "https://i.imgur.com/EHbekQN.jpeg",\n "https://i.imgur.com/989kevK.jpeg"\n ]\n },\n "FAH": {\n "location": [32.883557123107536, -117.23496426482438],\n "name": "Franklin Antonio Hall",\n "images": [\n "https://i.imgur.com/MGZugul.jpeg",\n "https://i.imgur.com/dMr7V2X.jpeg",\n "https://i.imgur.com/TbzWfMa.jpeg"\n ]\n },\n "HDSI": {\n "location": [32.880614100775574, -117.23378883326575],\n "name": "Halıcıoğlu Data Science Institute Building",\n "images": [],\n "comment": ["https://datascience.ucsd.edu/venue/hdsi-building/"]\n },\n "PFBH": {\n "location": [32.88173836638747, -117.2343791731388],\n "name": "Powell-Focht Bioengineering Hall",\n "images": ["https://i.imgur.com/lYP4GT9.jpeg"]\n },\n "WARR": {\n "location": [32.88114818094256, -117.23504265009306],\n "name": "Warren Mall",\n "images": [\n "https://i.imgur.com/zqg1cHJ.jpeg",\n "https://i.imgur.com/zlTUVJf.jpeg"\n ],\n "comment": ["Warren Mall Outdoor Classroom"]\n },\n "WLH": {\n "location": [32.88059104682919, -117.23436049332548],\n "name": "Warren Lecture Hall",\n "images": [\n "https://i.imgur.com/YEaKlBF.jpeg",\n "https://i.imgur.com/Kdv8YiX.jpeg"\n ]\n },\n "WSAC": {\n "location": [32.88246082957613, -117.23329893891902],\n "name": "Warren Student Activities Center",\n "images": [\n "https://i.imgur.com/DRjFAFy.jpeg",\n "https://i.imgur.com/Q3u5WgD.jpeg",\n "https://i.imgur.com/Byuu0Vw.jpeg"\n ]\n }\n },\n "pepperCanyon": {\n "DIB": {\n "location": [32.87937650181871, -117.23229157766367],\n "name": "Design & Innovation Building",\n "images": []\n },\n "PCYNH": {\n "location": [32.878341870703316, -117.23391147692307],\n "name": "Pepper Canyon Hall",\n "images": []\n },\n "SME": {\n "location": [32.879887628129154, -117.23275634017203],\n "name": "Structural and Materials Engineering Building",\n "images": []\n },\n "VAF": {\n "location": [32.879139240878324, -117.23396876625009],\n "name": "Visual Arts Facility",\n "images": []\n }\n },\n "universityCenter": {\n "CENTR": {\n "location": [32.87797399985619, -117.237243418587],\n "name": "Center Hall",\n "images": []\n },\n "CSC": {\n "location": [32.87840034888087, -117.23791254127356],\n "name": "Career Services Center",\n "images": []\n },\n "CPMC": {\n "location": [32.87808507377693, -117.23466682590514],\n "name": "Conrad Presbys Music Center",\n "images": []\n },\n "P416": {\n "location": [32.87775532737337, -117.23812995691154],\n "name": "Center Hall",\n "images": ["Parking Lot P416"],\n "comment": ["P416 Outdoor Classroom"]\n },\n "PRICE": {\n "location": [32.879954671864304, -117.23711807270978],\n "name": "Price Center",\n "images": []\n },\n "SERF": {\n "location": [32.87969838069206, -117.23507094146997],\n "name": "Science & Engineering Research Facility",\n "images": []\n },\n "U201": {\n "location": [32.87750663014029, -117.23672981527089],\n "name": "University Center 201",\n "images": []\n },\n "U301": {\n "location": [32.87773977889938, -117.23584205327144],\n "name": "University Center 301",\n "images": []\n }\n },\n "med": {\n "BRF2": {\n "location": [32.874320265698685, -117.2350725903077],\n "name": "Biomedical Research Facility II",\n "images": []\n },\n "BSB": {\n "location": [32.87583620115867, -117.23610217780087],\n "name": "Biomedical Sciences Building",\n "images": []\n },\n "CMME": {\n "location": [32.876369320524, -117.23767828382417],\n "name": "Cellular and Molecular Medicine East",\n "images": []\n },\n "CNCB": {\n "location": [32.87569310599253, -117.23819914713752],\n "name": "Center for Neural Circuits and Behavior",\n "images": []\n },\n "KECK": {\n "location": [32.87504438926279, -117.23617314958287],\n "name": "W. M. Keck Building",\n "images": []\n },\n "LFFB": {\n "location": [32.87668499513593, -117.23686452737942],\n "name": "Leichtag Biomedical Research Building",\n "images": []\n },\n "MET": {\n "location": [32.875220419083554, -117.23478623990438],\n "name": "Medical Education and Telemedicine Building",\n "images": []\n },\n "MTF": {\n "location": [32.87559622253949, -117.23543639784786],\n "name": "Medical Teaching Facility",\n "images": []\n },\n "PSB": {\n "location": [32.874209066736114, -117.23571795183558],\n "name": "Skaggs Pharmaceutical Sciences Building",\n "images": []\n },\n "SCRB": {\n "location": [32.8758549279704, -117.23394815633426],\n "name": "Stein Clinical Research Building",\n "images": []\n }\n },\n "health": {\n "MCC": {\n "location": [32.87832294065095, -117.22294309501584],\n "name": "Moores Cancer Center",\n "images": []\n }\n },\n "sio": {\n "ECKRT": {\n "location": [32.8672217685922, -117.25258463073409],\n "name": "Eckart Building",\n "images": []\n },\n "HUBBS": {\n "location": [32.86744021132684, -117.25344551951103],\n "name": "Hubbs Hall",\n "images": []\n },\n "HYDRO": {\n "location": [32.86889985285985, -117.25226455555327],\n "name": "Hydraulics Laboratory",\n "images": []\n },\n "IGPP": {\n "location": [32.86830699100889, -117.25287278628777],\n "name": "Institute of Geophysics and Planetary Physics",\n "images": []\n },\n "NIERN": {\n "location": [32.86846701354387, -117.25120611888595],\n "name": "Nierenberg Hall",\n "images": []\n },\n "OAR": {\n "location": [32.86949599612524, -117.25063208743448],\n "name": "Keck Oceanographic and Atmospheric Research",\n "images": [],\n "comment": [\n "https://blink.ucsd.edu/sponsor/advancement/advancement-services/stewardship/named-buildings/keck-oceanographic-atmospheric-research-2.html"\n ]\n },\n "MCTF": {\n "location": [32.87120629806947, -117.25201093495335],\n "name": "Marine Conservation and Technology Facility",\n "images": []\n },\n "RITTR": {\n "location": [32.86529347606621, -117.25357019529167],\n "name": "Ritter Hall",\n "images": []\n },\n "SPIES": {\n "location": [32.86909245015263, -117.25095900205372],\n "name": "Spiess Hall",\n "images": []\n },\n "SUMNR": {\n "location": [32.86488587494083, -117.2529119246211],\n "name": "Sumner Auditorium",\n "images": []\n },\n "VAUGN": {\n "location": [32.86531011859729, -117.25300219413253],\n "name": "Vaughan Hall",\n "images": []\n }\n }\n }\n}');const buildings={};for(const[college,collegeBldgs]of Object.entries(__default.colleges)){for(const[code,{location:location,name:name,images:images}]of Object.entries(collegeBldgs).sort(((a,b)=>b[1].location[0]-a[1].location[0]))){buildings[code]={name:name,code:code,college:college,location:[location[0],location[1]],images:images}}}class Time{hour;minute;constructor(hour,minute){this.hour=hour;this.minute=minute}get#utcDate(){return new Date(Date.UTC(2e3,0,1,this.hour,this.minute))}formatRange(end,locales){return new Intl.DateTimeFormat(locales,{timeStyle:"short",timeZone:"UTC"}).formatRange(this.#utcDate,end.#utcDate)}toString(locales=false){const minute=this.minute.toString().padStart(2,"0");return typeof locales!=="boolean"?this.#utcDate.toLocaleTimeString(locales,{timeStyle:"short",timeZone:"UTC"}):locales?`${this.hour.toString().padStart(2,"0")}:${minute}`:`${(this.hour+11)%12+1}:${minute} ${this.hour<12?"a":"p"}m`}valueOf(){return this.hour*60+this.minute}static from(minutes){return new Time(Math.floor(minutes/60),minutes%60)}static parse24(string){const[hour,minute]=string.split(":").map(Number);if(Number.isInteger(hour)&&hour>=0&&hour<24&&Number.isInteger(minute)&&minute>=0&&minute<60){return new Time(hour,minute)}else{return null}}}function coursesToClassrooms(courses,{finals:finals=false,monday:monday}){const holidays=getHolidays(monday.year);const nextMonday=monday.add(7);const buildings={};for(const[i,{code:code,groups:groups}]of courses.entries()){for(const[j,{sections:sections,meetings:meetings,exams:exams,dateRange:dateRange}]of groups.entries()){const groupCapacity=sections.reduce(((cum,curr)=>cum+curr.capacity),0);const allMeetings=[...sections,...meetings,...exams];for(const meeting of allMeetings){const{location:location,time:time}=meeting;if(!time||!location||location.building==="RCLAS"){continue}if(meeting.kind==="exam"){if(meeting.date=nextMonday){continue}}else if(finals){continue}const days=time.days.filter((weekday=>{const day=monday.add((weekday+6)%7);if(holidays[day.id]){return false}if(dateRange&&meeting.kind!=="exam"){return dateRange.start<=day&&day<=dateRange.end}return true}));if(days.length===0){continue}buildings[location.building]??={};buildings[location.building][location.room]??=[];buildings[location.building][location.room].push({...meeting,days:days,start:Time.from(time.start),end:Time.from(time.end),capacity:meeting.kind==="section"?meeting.capacity:groupCapacity,course:code,index:{group:i,meeting:j},special:dateRange!==undefined&&meeting.kind!=="exam"})}}}return buildings}const TILE_LEFT=-6;const SCALE=2**(7+17)*1.5;function latLongToPixel([latitude,longitude]){return{x:SCALE*(longitude/180+1),y:-SCALE*(Math.log(Math.tan(Math.PI/4+latitude*Math.PI/360))/Math.PI+1)}}const coords=Object.values(buildings).map((({location:location})=>location));function getExtremeCoord(index,max){return coords.reduce(((acc,curr)=>(max?Math.max:Math.min)(acc,curr[index])),max?-Infinity:Infinity)}const southwest=latLongToPixel([getExtremeCoord(0,false),getExtremeCoord(1,false)]);const northeast=latLongToPixel([getExtremeCoord(0,true),getExtremeCoord(1,true)]);const PADDING={top:60,horizontal:50,bottom:168};const MAP_TILE_SIZE=256*1.5;const center=latLongToPixel([32.877341347399,-117.23531663418]);const mapPosition={x:Math.floor(center.x/MAP_TILE_SIZE+TILE_LEFT)*MAP_TILE_SIZE-(southwest.x-PADDING.horizontal),y:Math.floor(center.y/MAP_TILE_SIZE-4)*MAP_TILE_SIZE-(northeast.y-PADDING.top),width:(5-TILE_LEFT+1)*MAP_TILE_SIZE};const TIME_ZONE="America/Los_Angeles";function inPT(){const{timeZone:timeZone}=(new Intl.DateTimeFormat).resolvedOptions();return timeZone===TIME_ZONE}function toPT(date){const string=date.toLocaleString("en-US",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",timeZone:TIME_ZONE});const match=string.match(/^(\d\d)\/(\d\d)\/(\d{4}), (\d\d):(\d\d) ([AP]M)$/);if(match){return{date:Day.from(+match[3],+match[1],+match[2]),time:new Time(match[4]==="12"?match[6]==="AM"?0:12:+match[4]+(match[6]==="PM"?12:0),+match[5])}}else{console.warn(string,"did not match expected PT format.");return{date:Day.fromLocal(date),time:new Time(date.getHours(),date.getMinutes())}}}function now(){return toPT(new Date)}function used(weekday,time,includeBefore=0){return meeting=>meeting.days.includes(weekday)&&+meeting.start-includeBefore<=+time&&timename!=="")).map((name=>{const[first,last]=name.split(",");return{first:first,last:last}})),sections:[],meetings:[],exams:[],coscheduled:[]});state={type:"sections",hasMeetings:additionalMeetings===":"||additionalMeetings===".",hasExams:additionalMeetings===":"||additionalMeetings==="'"}}}else if(state.type==="sections"){while(taker.hasMore()){const capacity=taker.takeInt(4);group.sections.push({kind:"section",capacity:capacity===9999?Infinity:capacity,...taker.takeMeeting(),code:taker.take(3)})}state=state.hasMeetings?{type:"meetings",hasExams:state.hasExams}:state.hasExams?{type:"exams"}:{type:"course-or-group"}}else if(state.type==="meetings"){while(taker.hasMore()){group.meetings.push({kind:"meeting",...taker.takeMeeting(),code:taker.take(3)})}state=state.hasExams?{type:"exams"}:{type:"course-or-group"}}else if(state.type==="exams"){while(taker.hasMore()){const date=Day.from(taker.takeInt(4),taker.takeInt(2),taker.takeInt(2));group.exams.push({kind:"exam",date:date,...taker.takeMeeting(date.day)})}state={type:"course-or-group"}}}return{scraped:scraped,courses:courses}}if(importMeta1.main){console.log(coursesFromFile(await Deno.readTextFile(Deno.args[0])).courses[100])}class TermCache{#cache={};async#fetch(term,summer){const response=await fetch(`../data/classrooms-${term}.txt`);if(response.ok){try{return coursesFromFile(await response.text(),summer)}catch(error){if(error instanceof CourseFormatError){window.location.reload()}throw error}}else if(response.status===404){return"unavailable"}else{throw new Error(`HTTP ${response.status} error`)}}#term({year:year,quarter:quarter},full){return full?`${termCode(year,quarter)}-full`:termCode(year,quarter)}#request(request,full=false){const termId=this.#term(request,full);const cached=this.#cache[termId]??this.#cache[this.#term(request,true)];if(cached==="unavailable"){return{type:"unavailable",request:request}}else if(cached){return{request:request,result:cached}}else{return this.#fetch(termId,request.quarter==="S3").then((result=>{this.#cache[termId]=result;return result==="unavailable"?{type:"unavailable",request:request}:{request:request,result:result}})).catch((()=>({type:"offline",request:request})))}}#partition(results){const successes=[];const errors=[];for(const result of results){if("result"in result){successes.push(result)}else{errors.push(result)}}return{successes:successes,errors:errors}}requestTerms(requests,full=false){const rawResults=requests.map((request=>this.#request(request,full)));const allCached=rawResults.every((result=>!(result instanceof Promise)));if(allCached){return this.#partition(rawResults)}else{return Promise.all(rawResults).then((results=>this.#partition(results)))}}}function viewFromUrl(url){const{searchParams:searchParams,hash:hash}=new URL(url);const building=searchParams.get("building");const course=searchParams.get("course");const professor=searchParams.get("professor");if(building){return{type:"building",building:building,room:searchParams.get("room")}}else if(course){return{type:"course",course:course}}else if(professor){return{type:"professor",name:professor}}else{return{type:"default",searching:hash==="#search"}}}function viewToUrl(view){const url=new URL(window.location.pathname,window.location.href);if(view.type==="default"){if(view.searching){url.hash="search"}}else if(view.type==="building"){url.searchParams.append("building",view.building);if(view.room){url.searchParams.append("room",view.room)}}else if(view.type==="course"){url.searchParams.append("course",view.course)}else if(view.type==="professor"){url.searchParams.append("professor",view.name)}return url}const OnView=ve((_=>{}));function AbbrevHeading({heading:Heading,abbrev:abbrev,children:children,class:className=""}){return v(Heading,{class:`abbrev-heading ${className}`,children:[v("span",{class:"abbrev",children:abbrev}),v("span",{class:"colon",children:": "}),v("span",{class:"long",children:children})]})}function BackIcon(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",class:"icon",children:v("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"})})}function CloseIcon(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",class:"icon",children:v("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})}const ClearIcon=CloseIcon;function navigate(onView,{view:view={type:"default"},back:back}={}){const destination=viewToUrl(view);const previous=Array.isArray(window.history.state?.previous)?window.history.state?.previous:[];if(back){const index=back(previous.map((url=>viewFromUrl(url))));if(index!==null){window.history.go(-(index+1));return}}onView(view);if(window.location.href===destination.href){return}const args=[{previous:[window.location.href,...previous]},"",destination];window.history.pushState(...args)}function Link({view:view,back:back,class:className="",style:style,children:children,elemRef:elemRef}){const onView=M1(OnView);return v("a",{href:view?"?":undefined,class:`internal-link ${className}`,style:style,ref:elemRef,onClick:e=>{e.preventDefault();if(view){navigate(onView,{view:view,back:back})}},children:children})}const exams={FI:"Final Exam",MI:"Midterm",FM:"Film Sessions",PB:"Problem Sessions",OT:"Other Sessions",RE:"Review Sessions",MU:"Make-up Sessions"};const instructionTypes={LE:"Lecture",DI:"Discussion",LA:"Lab",IN:"Independent Study",SE:"Seminar",AC:"Activity",CL:"Clinical Clerkship",CN:"Clinic",CO:"Conference",FW:"Fieldwork",IT:"Internship",OP:"Outside Preparation",PR:"Practicum",SA:"Study Abroad",SI:"Simultaneous Enrlmnt-Other UC",ST:"Studio",TU:"Tutorial",OT:"Other Sessions"};const meetingTypes={...exams,...instructionTypes};function getFloor(roomNum){const digit=roomNum.match(/\d/);if(digit){const basement=roomNum.startsWith("B");return basement?-digit[0]:+digit[0]}else{return 0}}function compareRoomNums(a,b){const aFloor=getFloor(a);const bFloor=getFloor(b);if(aFloor!==bFloor){return aFloor-bFloor}else{return a.localeCompare(b)}}function RoomList({weekday:weekday,time:time,building:building,rooms:rooms}){if(Object.keys(rooms).length===0){return v("div",{class:"empty",children:v("p",{children:"This building isn't used for any classes this week, as far as WebReg is concerned."})})}return v("div",{class:"room-list",children:[v("div",{class:"gradient gradient-sticky gradient-top"}),v("div",{class:"rooms",children:Object.entries(rooms).sort((([a],[b])=>compareRoomNums(a,b))).map((([room,meetings])=>{const activeMeeting=meetings.find(used(weekday,time,10));const soon=activeMeeting&&timemeeting.days.includes(6)||meeting.days.includes(7)));const earliest=meetings.reduce(((acc,curr)=>Math.min(acc,+curr.start)),Infinity);const latest=meetings.reduce(((acc,curr)=>Math.max(acc,+curr.end)),-Infinity);const inUse=used(weekday,time);return v("div",{class:"schedule",children:[v("div",{class:"day-names-wrapper",children:[v("div",{class:"gradient gradient-bg gradient-top"}),v("div",{class:"day-names",children:(hasWeekend?DAYS:WEEKDAYS).map((weekDay=>v("button",{class:`day day-name ${weekDay===day?"selected-day":""}`,onClick:()=>setDay((day=>weekDay===day?null:weekDay)),children:Day.dayName(weekDay,"short")},weekDay)))})]}),v("div",{class:`meetings-wrapper ${day===null?"full-week":""}`,children:(day!==null?[day]:hasWeekend?DAYS:WEEKDAYS).map((day=>v("div",{class:"day meetings",style:{height:`${(latest-earliest)/1}px`},children:[meetings.filter((meeting=>meeting.days.includes(day))).sort(((a,b)=>+a.start-+b.start)).map((meeting=>v(Link,{view:{type:"course",course:meeting.course},class:`meeting ${inUse(meeting)?"current":""} ${meeting.kind==="exam"?"exam":""}`,style:{top:`${(+meeting.start-earliest)/1}px`,height:`${(+meeting.end-+meeting.start)/1}px`},children:[v("div",{class:"meeting-name",children:[meeting.course," (",v("abbr",{title:meetingTypes[meeting.type],children:meeting.type}),")"]}),v("div",{class:"meeting-time",children:meeting.start.formatRange(meeting.end)}),meeting.special&&v("abbr",{class:"special-summer",title:"This meeting is from a Special Summer Session course.",children:"S3"})]}))),weekday===day&&earliest<=+time&&+time0&&v("img",{class:`building-image ${imageLoaded?"":"building-image-loading"}`,src:imageUrl,onLoad:()=>setImageLoaded(true)},imageUrl),v(Link,{view:room?{type:"building",building:code}:null,class:"icon-btn back",back:([previous])=>{if(previous&&previous.type==="building"&&!previous.room){return 0}else{return null}},children:v(BackIcon,{})}),v(AbbrevHeading,{heading:"h2",abbrev:v("span",{children:[code," ",v("span",{class:"room-number",children:lastRoom})]}),children:name}),v(Link,{view:{type:"default"},class:"icon-btn close",back:([previous,before])=>{if(!previous){return null}if(previous.type==="default"){return 0}if(room&&before&&before.type==="default"){if(previous.type==="building"&&!previous.room){return 1}}return null},children:v(CloseIcon,{})})]}),room?v(RoomSchedule,{weekday:weekday,time:time,meetings:rooms[room]??[]}):v(RoomList,{weekday:weekday,time:time,building:code,rooms:rooms})]})}function BuildingPanel({visible:visible,rightPanelOpen:rightPanelOpen,...props}){return v("div",{class:`building-panel ${visible?"":"building-panel-invisible"} ${rightPanelOpen?"right-panel-open":""}`,children:v(BuildingPanelContent,{...props},props.building.code)})}function BuildingButton({weekday:weekday,time:time,building:building,rooms:rooms,selected:selected,scrollTarget:scrollTarget,visible:visible}){const college=building.college;const ref=L1((button=>{if(scrollTarget&&button){window.requestAnimationFrame((()=>{const windowWidth=window.innerWidth;const windowHeight=window.innerHeight;const panelHeight=scrollTarget.init?0:windowHeight*(windowWidth<=690?.7:.6);const{left:left,top:top,width:width,height:height}=button.getBoundingClientRect();button.closest(".buildings")?.scrollBy({left:left+(-windowWidth+width)/2,top:top+(-(windowHeight-panelHeight)+height)/2,behavior:scrollTarget.init?"auto":"smooth"})}))}}),[scrollTarget]);const{x:x,y:y}=latLongToPixel(building.location);return v(Link,{view:{type:"building",building:building.code},class:`building-btn college-${college} ${selected?"selected":""} ${visible?"":"building-btn-hidden"}`,style:{left:`${x-southwest.x+PADDING.horizontal}px`,top:`${y-northeast.y+PADDING.top}px`},elemRef:ref,children:[building.code,v("span",{class:"room-count",children:[v("span",{class:"in-use",children:rooms.filter((meetings=>meetings.some(used(weekday,time)))).length}),"/",rooms.length]})]})}const dateFormat=new Intl.DateTimeFormat([],{dateStyle:"short",timeStyle:"short"});function DateTimeButton({date:date,time:time,onClick:onClick,bottomPanelOpen:bottomPanelOpen,disabled:disabled}){const{year:year,season:season,current:current,week:week}=getTerm(date);return v("button",{class:`date-time-button ${bottomPanelOpen?"bottom-panel-open":""}`,onClick:onClick,disabled:disabled,children:[v("p",{class:"showing-schedule-wrapper",children:[v("span",{class:"showing-schedule-text",children:"Showing schedule for"}),v("div",{class:"date-time",children:dateFormat.format(date.toLocal(time.hour,time.minute))}),current&&v("span",{class:"quarter-week",children:[termCode(year,season)," ",week<10?`Week ${week}`:"Finals"," ",date.dayName("short")]})]}),v("div",{class:"filled-icon-btn edit-icon",children:"Edit"})]})}function CalendarRow({children:children,week:week,class:className=""}){return v("div",{class:`calendar-row ${className}`,children:[v("div",{class:"calendar-week-num",children:week}),children]})}function CalendarHeaderRow(){return v(CalendarRow,{class:"calendar-header-row",week:v("span",{children:"Wk"}),children:DAY_NUMS.map((day=>v("div",{class:`calendar-item calendar-week-day`,children:Day.dayName(day+1,"short")})))})}function CalendarQuarterHeadingRow({year:year,season:season}){return v(CalendarRow,{class:"calendar-heading-row calendar-quarter-heading-row",children:[v("div",{class:"gradient gradient-bg gradient-bottom"}),v(AbbrevHeading,{heading:"h2",abbrev:termCode(year,season),class:"calendar-heading calendar-quarter-heading",children:termName(year,season)})]})}function CalendarMonthHeadingRow({month:month}){return v(CalendarRow,{class:"calendar-heading-row calendar-month-heading-row",children:v("h3",{class:"calendar-heading calendar-month-heading",children:Day.monthName(month)})})}function CalendarWeekRow({termDays:termDays,start:start,end:end,monday:monday,date:date,onDate:onDate}){const endDay=monday.add(7);const week=Math.floor((monday.id-termDays.start.id)/7)+1;const holidays=getHolidays(Math.max(monday.year,start.year));return v("div",{class:"calendar-row calendar-date-row",children:[v("div",{class:"calendar-week-num",children:week===11?"FI":termDays.start{const day=monday.add(i);if(dayend){return v("div",{class:"calendar-item"})}return v("label",{class:`calendar-item calendar-day ${day>=termDays.finals&&day<=termDays.end?"calendar-finals-day":""} ${day.id===date.id?"calendar-selected":""} ${day>=termDays.start&&day<=termDays.end&&!holidays[day.id]?"":"calendar-break-day"}`,children:[v("input",{type:"radio",class:"visually-hidden",name:"calendar-day",onKeyDown:e=>{if(e.key==="ArrowUp"||e.key==="ArrowDown"){const up=e.key==="ArrowUp";onDate(date.add(up?-7:7));e.preventDefault()}},onInput:()=>onDate(day),checked:day.id===date.id}),day.date]})}))]})}function MonthCalendar({start:start,end:end,scrollMode:scrollMode,month:month,...props}){const{date:date}=props;const monthStart=Day.max(start,Day.from(start.year,month,1));const monthEnd=Day.min(end,Day.from(start.year,month+1,0));const weeks=[];for(let monday=monthStart.monday;monday<=monthEnd;monday=monday.add(7)){weeks.push(v(CalendarWeekRow,{monday:monday,start:monthStart,end:monthEnd,...props},monday.id))}const ref=w(null);j1((()=>{const div=ref.current;if(div?.parentElement&&scrollMode!=="none"&&date>=monthStart&&date<=monthEnd){div.parentElement.scrollTo({top:div.offsetTop-90,behavior:scrollMode==="init"?"auto":"smooth"})}}),[scrollMode,date.id,monthStart.id,monthEnd.id]);return v("div",{class:"calendar-month",ref:ref,children:[v(CalendarMonthHeadingRow,{month:month}),weeks]})}function TermCalendar(props){const{start:start,end:end}=props;const months=[];for(let month=start.month;month<=end.month;month++){months.push(v(MonthCalendar,{month:month,...props},month))}return v(I,{children:months})}const seasons=["WI","SP","S1","S2","FA"];function Calendar({freeScroll:freeScroll,...props}){const{date:date,scrollMode:scrollMode}=props;const selectedStart=date.month<=6?date.year-1:date.year;const selectedEnd=date.month>=9?date.year+1:date.year;const[start,setStart]=k(selectedStart);const[end,setEnd]=k(selectedEnd);if(scrollMode==="date-edited"){if(start!==selectedStart){setStart(selectedStart)}if(end!==selectedEnd){setEnd(selectedEnd)}}j1((()=>{if(document.activeElement instanceof HTMLInputElement&&document.activeElement.name==="calendar-day"&&!document.activeElement.checked){const checked=document.querySelector('[name="calendar-day"]:checked');if(checked instanceof HTMLInputElement){checked.focus()}}}),[date.id]);const calendars=[];for(let year=start;year<=end;year++){const yearTermDays=seasons.map((season=>getTermDays(year,season)));for(const[i,season]of seasons.entries()){calendars.push(v(CalendarQuarterHeadingRow,{year:year,season:season},`${year} ${season} heading`),v(TermCalendar,{termDays:yearTermDays[i],start:i===0?Day.from(year,1,1):yearTermDays[i].start.monday,end:yearTermDays[i+1]?.start.monday.add(-1)??Day.from(year+1,1,0),...props},`${year} ${season}`))}}return v("div",{class:"calendar-scroll-area",children:[v("div",{class:"gradient gradient-sticky gradient-top"}),v(CalendarHeaderRow,{}),v(CalendarRow,{class:"show-year-btn-top",children:v("button",{type:"button",class:"show-year-btn",onClick:e=>{setStart(start-1);freeScroll();const target=e.currentTarget.closest(".calendar-scroll-area")?.querySelector(".calendar-month");if(target instanceof HTMLElement){const oldX=target.offsetTop;window.requestAnimationFrame((()=>{target.parentElement?.scrollTo({top:target.offsetTop-oldX})}))}},children:["Show ",start-1]})}),calendars,v(CalendarRow,{children:v("button",{type:"button",class:"show-year-btn",onClick:()=>{setEnd(end+1);freeScroll()},children:["Show ",end+1]})}),v("div",{class:"gradient gradient-sticky gradient-bottom"})]})}function DateTimePanel({date:date,onDate:onDate,time:time,onTime:onTime,useNow:useNow,onUseNow:onUseNow,visible:visible,closeable:closeable,class:className,onClose:onClose}){const[scrollMode,setScrollMode]=k("init");return v("form",{class:`date-time-panel ${visible?"":"date-time-panel-hidden"} ${className} calendar-open`,onSubmit:e=>{onClose();e.preventDefault()},children:[v("div",{class:"date-time-flex",children:[v("label",{class:"checkbox-label",children:[v("input",{type:"checkbox",checked:useNow,onInput:e=>{onUseNow(e.currentTarget.checked);if(e.currentTarget.checked){setScrollMode("date-edited")}}}),v("span",{children:["Use current time",inPT()?null:v("span",{class:"tz-note",children:"(in San Diego)"})]})]}),date.id!==Day.today().id&&v("button",{type:"button",class:"today-btn",onClick:()=>{onDate(Day.today());setScrollMode("date-edited")},children:"Today"}),closeable&&v("button",{class:"filled-icon-btn close-date-btn",children:"Close"})]}),v("div",{class:"date-time-flex",children:[v("input",{type:"date",name:"date",value:date.toString(),onInput:e=>{const date=Day.parse(e.currentTarget.value);if(date){if(useNow){onUseNow(false)}onDate(date);setScrollMode("date-edited")}},class:"date-input"}),v("input",{type:"time",value:time.toString(true),onInput:e=>{const time=Time.parse24(e.currentTarget.value);if(time){if(useNow){onUseNow(false)}onTime(time)}},class:"time-input"})]}),v(Calendar,{date:date,onDate:date=>{if(useNow){onUseNow(false)}onDate(date);setScrollMode("none")},scrollMode:scrollMode,freeScroll:()=>setScrollMode("none")})]})}const webregDays=["Sun","M","Tu","W","Th","F","S","Sun"];function MeetingCard({meeting:meeting,code:code}){const physicalRoom=meeting.location&&meeting.location.building!=="RCLAS";return v("section",{class:"meeting-card",children:[v("p",{class:"meeting-type",children:[meetingTypes[meeting.type]??meeting.type,code&&v(I,{children:[v("span",{class:"colon",children:": "}),v("span",{class:"meeting-code",children:code})]})]}),meeting.kind==="section"&&v("p",{class:"meeting-column section-capacity",children:meeting.capacity===Infinity?"No limit":v(I,{children:["Capacity: ",v("strong",{children:meeting.capacity})]})}),v("div",{class:"mobile-break"}),v("p",{class:`meeting-column meeting-date ${meeting.kind==="exam"?"meeting-date-specific":""}`,children:meeting.kind==="exam"?meeting.date.toString([],{month:"long",day:"numeric"}):meeting.time&&v(I,{children:[v("abbr",{title:meeting.time.days.map((day=>Day.dayName(day,"long"))).join(", "),children:meeting.time.days.map((day=>webregDays[day])).join("")})," ",Time.from(meeting.time.start).formatRange(Time.from(meeting.time.end))]})}),v(Link,{view:physicalRoom&&meeting.location?{type:"building",building:meeting.location.building,room:meeting.location.room}:null,class:`meeting-column location ${physicalRoom?"":"location-not-room"}`,children:meeting.location?meeting.location.building==="RCLAS"?"Remote":`${meeting.location.building} ${meeting.location.room}`:"TBA"})]})}function CourseInfo({course:course}){return v("div",{class:"course-info",children:course.groups.map((group=>v("article",{class:"group",children:[v("header",{class:"group-info",children:[v("span",{class:"group-code",children:group.code}),v("div",{class:"instructors",children:[group.instructors.map((({first:first,last:last})=>v(Link,{view:{type:"professor",name:`${last}, ${first}`},class:"instructor",children:[first," ",v("span",{class:"last-name",children:last})]},`${last}, ${first}`))),group.instructors.length===0&&v("span",{class:"staff",children:"Instructor TBA"})]})]}),group.meetings.map(((meeting,i)=>v(MeetingCard,{meeting:meeting,code:meeting.code!==group.code?meeting.code:null},i))),group.sections.length>0&&group.meetings.length>0&&v("hr",{class:"additional-meetings-divider"}),group.sections.map((section=>v(MeetingCard,{meeting:section,code:section.code!==group.code?section.code:null},section.code))),group.meetings.length>0&&group.exams.length>0&&v("hr",{class:"additional-meetings-divider"}),group.exams.map(((exam,i)=>v(MeetingCard,{meeting:exam},i)))]},group.code)))})}function ProfInfo({professor:professor}){return v("div",{class:"prof-info",children:professor.courses.map((course=>v(Link,{view:{type:"course",course:course.code},class:"prof-course",children:course.code},course.code)))})}function ResultModal({view:view,open:open}){const onView=M1(OnView);const ref=w(null);j1((()=>{if(open){ref.current?.showModal()}else{ref.current?.close("force-closed")}}),[open]);return v("dialog",{class:"modal",ref:ref,onClick:e=>{if(e.target===e.currentTarget){e.currentTarget.close("shaded-area")}},onClose:e=>{if(e.currentTarget.returnValue!=="force-closed"){navigate(onView,{view:{type:"default"},back:([previous])=>{if(previous&&previous.type!=="course"&&previous.type!=="professor"){return 0}else{return null}}})}},children:v("form",{method:"dialog",class:"modal-body",children:[v("header",{class:"modal-header",children:[view.type==="course"?v(AbbrevHeading,{heading:"h1",abbrev:view.course.code,class:"modal-title modal-title-course-code",children:view.course.title}):v("h1",{class:"modal-title modal-title-professor",children:[view.professor.first," ",v("span",{class:"last-name",children:view.professor.last})]}),v("button",{class:"close icon-btn",type:"submit",value:"close-btn",children:v(CloseIcon,{})})]}),view.type==="course"?v(CourseInfo,{course:view.course}):v(ProfInfo,{professor:view.professor})]})})}function SearchIcon(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 -960 960 960",class:"icon",children:v("path",{d:"M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"})})}function SearchResult({name:name,code:code,primary:primaryField,match:match,selected:selected,view:view}){const ref=w(null);j1((()=>{if(selected){ref.current?.scrollIntoView({block:"nearest"})}}),[selected]);const nameFirst=primaryField==="name";const primary=nameFirst?name:code;const secondary=nameFirst?code:name;return v(Link,{view:view,class:`result ${selected?"result-selected":""}`,elemRef:ref,children:[primary!==undefined&&v("p",{class:`result-primary ${nameFirst?"result-name":"result-code"}`,children:match?v(I,{children:[primary.slice(0,match.start),v("span",{class:"result-match",children:primary.slice(match.start,match.end)}),primary.slice(match.end)]}):primary}),secondary!==undefined&&v("p",{class:`result-secondary ${nameFirst?"result-code":"result-name"}`,children:secondary})]})}function score(string,query){if(string===""){return{score:0}}string=string.toLocaleLowerCase();if(string===query){return{score:3,match:{start:0,end:string.length}}}if(string.startsWith(query)){return{score:2+(/\W/.test(string[query.length])?.5:0),match:{start:0,end:query.length}}}const index=string.indexOf(query);if(index!==-1){return{score:1+(/\W/.test(string[index-1])&&(index+query.length===string.length||/\W/.test(string[index+query.length]))?.5:0),match:{start:index,end:index+query.length}}}return{score:0}}function maxResult(a,b){return a.score>=b.score?a:b}function sortResults(results){return results.filter((result=>result.score>0)).sort(((a,b)=>b.score-a.score)).slice(0,15)}function search(data,query){if(query===""){return{courses:[],buildings:[],professors:[]}}const results={courses:sortResults(data.courses.map((course=>maxResult({...course,in:"title",...score(course.title,query)},{...course,in:"code",...score(course.code,query)})))),professors:sortResults(data.professors.map((({first:first,last:last})=>{const id=`${last}, ${first}`;return maxResult({first:first,last:last,id:id,order:"forward",...score(`${first} ${last}`,query)},{first:first,last:last,id:id,order:"reverse",...score(id,query)})}))),buildings:sortResults(data.buildings.map((code=>maxResult({code:code,in:"name",...score(buildings[code]?.name??"",query)},{code:code,in:"code",...score(code,query)}))))};const sections=(results.courses.length>0?1:0)+(results.professors.length>0?1:0)+(results.buildings.length>0?1:0);const maxSectionLength=sections===3?5:sections===2?7:12;return{courses:results.courses.slice(0,maxSectionLength),professors:results.professors.slice(0,maxSectionLength),buildings:results.buildings.slice(0,maxSectionLength)}}function SearchResults({terms:terms,query:query,data:data,index:index}){const results=T1((()=>search(data,query.toLowerCase())),[query,data]);const length=results.courses.length+results.professors.length+results.buildings.length;index=index===null?-1:(index%length+length)%length;if(length===0){if(query===""){return null}else{return v("p",{class:"no-results",children:["No results from ",terms.map((({year:year,quarter:quarter})=>termName(year,quarter))).join(" nor "),"."]})}}return v("div",{class:"results",children:[results.courses.length>0&&v("h2",{class:"result-heading",children:"Courses"}),results.courses.map(((course,i)=>v(SearchResult,{name:course.title,code:course.code,primary:course.in==="code"?"code":"name",match:course.match,selected:i===index,view:{type:"course",course:course.code}},`course\t${course.code}\t${course.in}`))),results.professors.length>0&&v("h2",{class:"result-heading",children:"Professors"}),results.professors.map(((professor,i)=>v(SearchResult,{name:professor.order==="forward"?`${professor.first} ${professor.last}`:professor.id,primary:"name",match:professor.match,selected:i+results.courses.length===index,view:{type:"professor",name:professor.id}},`course\t${professor.id}\t${professor.order}`))),results.buildings.length>0&&v("h2",{class:"result-heading",children:"Buildings"}),results.buildings.map(((building,i)=>v(SearchResult,{name:buildings[building.code]?.name??building.code,code:building.code,primary:building.in==="code"?"code":"name",match:building.match,selected:i+results.courses.length+results.professors.length===index,view:{type:"building",building:building.code}},`course\t${building.code}\t${building.in}`)))]})}function SearchBar({state:state,terms:terms,termId:termId,buildings:buildings,showResults:showResults,onSearch:onSearch,visible:visible}){const[query,setQuery]=k("");const[index,setIndex]=k(0);const ref=w(null);const loaded=state.type==="loaded"&&state.termId===termId;j1((()=>{const handleKeyDown=e=>{if(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey){return}if((e.key==="/"||e.key==="s")&&e.target===document.body){ref.current?.focus();e.preventDefault()}};document.addEventListener("keydown",handleKeyDown);return()=>{document.removeEventListener("keydown",handleKeyDown)}}),[]);return v("form",{role:"search",action:"javascript:",onSubmit:e=>{const selected=e.currentTarget.closest(".search-wrapper")?.querySelector(".result-selected");if(selected instanceof HTMLElement){selected.click()}},class:`search-wrapper ${visible?"":"hide-search"} ${loaded&&showResults&&query!==""?"showing-results":""}`,children:[v("label",{class:"search-bar",children:[v(SearchIcon,{}),v("input",{type:"text",id:"search",autocomplete:"off",autocapitalize:"none",autocorrect:"off","aria-label":"Search courses, people, and buildings.",title:"Press '/' to jump to the search box.",placeholder:"Search courses, people, buildings...",class:"search-input",value:query,onInput:e=>{setQuery(e.currentTarget.value);setIndex(0);onSearch(e.currentTarget.value.length>0)},onKeyDown:e=>{if(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey){return}if(e.key==="ArrowUp"||e.key==="ArrowDown"){setIndex((index=>index===null?e.key==="ArrowUp"?-1:0:index+(e.key==="ArrowUp"?-1:1)));e.preventDefault()}},onFocus:e=>{onSearch(e.currentTarget.value.length>0)},ref:ref}),query.length>0&&v("button",{class:"icon-btn clear-btn",type:"reset",onClick:()=>{setQuery("");onSearch(false)},children:v(ClearIcon,{})})]}),loaded&&showResults&&v(SearchResults,{terms:terms,query:query,data:{...state.data,buildings:buildings},index:index})]})}function TermStatus({status:currentStatus,visible:visible}){const showStatus=visible&¤tStatus&¤tStatus.length>0;const status=useLast([],showStatus?currentStatus:null);const omitTerm=status.length===1&&status[0][0].quarter!=="S3";return v("div",{class:`term-statuses ${showStatus?"":"hide-status"}`,children:status.map((([term,status])=>v("p",{class:`term-updated ${status==="offline"?"term-offline":status==="unavailable"?"term-unavailable":""}`,children:[!omitTerm&&v(I,{children:[v("span",{class:"term-code",children:termCode(term.year,term.quarter)})," "]}),status instanceof Date?v(I,{children:[omitTerm?"Updated ":"last updated ",v("span",{class:"updated-date",children:status.toLocaleDateString()}),"."]}):status==="offline"?"failed to load.":"is unavailable."]},termCode(term.year,term.quarter))))})}function displayError(errors){const offlineErrors=errors.filter((({type:type})=>type==="offline")).map((({request:{year:year,quarter:quarter}})=>termName(year,quarter)));if(offlineErrors.length>0){return`I couldn't load schedules for ${offlineErrors.join(" and ")}. Is ResNet failing you again?`}else{return`Schedules aren't available for ${errors.map((({request:{year:year,quarter:quarter}})=>termName(year,quarter))).join(" and ")}.`}}function getTerms({year:year,season:season,current:current}){const terms=[current?[{year:year,quarter:season}]:[],season==="S1"||season==="S2"||season==="FA"&&!current?[{year:year,quarter:"S3"}]:[]];return terms.flat()}function App({title:title}){const onView=M1(OnView);const[realTime,setRealTime]=k(true);const[date,setDate]=k((()=>now().date));const[time,setTime]=k((()=>now().time));j1((()=>{if(realTime){const intervalId=setInterval((()=>{const{date:date,time:time}=now();setTime((oldTime=>+oldTime===+time?oldTime:time));setDate((oldDate=>{if(+oldDate===+date){return oldDate}else{handleDate(date);return date}}))}),1e3);return()=>{clearInterval(intervalId)}}}),[realTime]);const termCache=w(new TermCache);const[state,setState]=k(null);const noticeVisible=!state?.buildings;const notice=useLast("",state===null?"Loading...":state.buildings?null:state&&state.errors.length>0?displayError(state.errors):state.holiday?`${state.holiday}!`:state.season==="WI"?"Winter break.":state.season==="SP"?"Spring break.":"Summer break.");const[showDatePanel,setShowDatePanel]=k(false);const[buildingCode,setBuildingCode]=k(null);const lastBuilding=useLast("CENTR",buildingCode);const[scrollTo,setScrollTo]=k({building:"CENTR",init:true});const[room,setRoom]=k(null);const[showResults,setShowResults]=k(false);const[searchState,setSearchState]=k({type:"unloaded"});const[modal,setModal]=k(null);const modalView=useLast({type:"course",course:{code:"",title:"",groups:[]}},modal);const terms=getTerms(getTerm(date));const termId=terms.map((term=>termCode(term.year,term.quarter))).join(" ");const datePanelVisible=showDatePanel||noticeVisible&&state!==null;const buildingPanelVisible=buildingCode!==null&&!noticeVisible;async function handleDate(date){const currentTerm=getTerm(date);const{season:season,finals:finals}=currentTerm;const terms=getTerms(currentTerm);const holiday=getHolidays(date.year)[date.id];if(holiday||terms.length===0){setState({errors:[],status:[],season:season,holiday:holiday});return}const maybePromise=termCache.current.requestTerms(terms);if(maybePromise instanceof Promise){setState(null)}const{successes:successes,errors:errors}=maybePromise instanceof Promise?await maybePromise:maybePromise;const courses=successes.flatMap((result=>result.result.courses));const finalsWeek=finals&&season!=="S1"&&season!=="S2";const classrooms=coursesToClassrooms(courses,{monday:date.monday,finals:finalsWeek});for(const building of Object.keys(classrooms)){if(!buildings[building]){console.warn(`${building} does not exist.`)}}const empty=Object.keys(classrooms).length===0&&!(finalsWeek&&courses.length>0);setState({buildings:empty?undefined:classrooms,status:[...successes.map((result=>[result.request,result.result.scraped])),...errors.map((error=>[error.request,error.type]))],errors:errors,season:season})}j1((()=>{handleDate(date)}),[]);async function loadTerms(){const maybePromise=termCache.current.requestTerms(terms,true);if(maybePromise instanceof Promise){setSearchState({type:"loading"})}const{successes:successes,errors:errors}=maybePromise instanceof Promise?await maybePromise:maybePromise;const courses=successes.flatMap((result=>result.result.courses));setSearchState({type:"loaded",termId:termId,data:{courses:courses,professors:Array.from(new Set(courses.flatMap((course=>course.groups.flatMap((group=>group.instructors.map((({first:first,last:last})=>`${last}, ${first}`))))))),(name=>{const[last,first]=name.split(", ");return{first:first,last:last}}))},offline:errors.filter((error=>error.type==="offline")).map((error=>error.request))});return courses}async function handleView(view){if(view.type==="default"){setModal(null);setBuildingCode(null);setShowResults(!!view.searching);document.title=title;return}setShowResults(false);if(view.type==="building"){setScrollTo({building:view.building,init:false});setBuildingCode(view.building);setModal(null);setRoom(view.room??null);document.title=`${view.room?`${view.building} ${view.room}`:buildings[view.building]?.name??view.building} · ${title}`;return}setBuildingCode(null);const courses=searchState.type==="loaded"&&searchState.termId===termId?searchState.data.courses:await loadTerms();if(view.type==="course"){const course=courses.find((course=>course.code===view.course));if(course){setModal({type:"course",course:course});document.title=`${view.course} · ${title}`}else{setModal({type:"course",course:{code:view.course,title:view.course,groups:[]}});document.title=`Course not found · ${title}`}}else{const[last,first]=view.name.split(", ");setModal({type:"professor",professor:{first:first,last:last,courses:courses.flatMap((course=>{const groups=course.groups.filter((group=>group.instructors.some((prof=>prof.first===first&&prof.last===last))));return groups.length>0?[{...course,groups:groups}]:[]}))}});document.title=`${first} ${last} · ${title}`}}j1((()=>{const initView=viewFromUrl(window.location.href);if(initView.type!=="default"){handleView(initView)}const handlePopstate=()=>{handleView(viewFromUrl(window.location.href))};window.addEventListener("popstate",handlePopstate);return()=>{window.removeEventListener("popstate",handlePopstate)}}),[searchState]);return v(OnView.Provider,{value:handleView,children:[v(SearchBar,{state:searchState,terms:terms,termId:termId,buildings:state?.buildings?Object.keys(state?.buildings):[],showResults:showResults,onSearch:showResults=>{setShowResults(showResults);navigate(onView,{view:{type:"default",searching:showResults},back:([previous])=>{if(showResults||!previous){return null}if(previous.type==="default"&&!previous.searching){return 0}else{return null}}});if(searchState.type==="unloaded"||searchState.type==="loaded"&&searchState.termId!==termId){loadTerms()}},visible:!noticeVisible}),v(ResultModal,{view:modalView,open:modal!==null}),v("div",{class:"corner",children:[v(DateTimeButton,{date:date,time:time,onClick:()=>setShowDatePanel(true),bottomPanelOpen:buildingPanelVisible,disabled:datePanelVisible}),v(TermStatus,{status:state?.status,visible:!noticeVisible})]}),v(DateTimePanel,{date:date,onDate:date=>{setRealTime(false);setDate(date);handleDate(date)},time:time,onTime:time=>{setRealTime(false);setTime(time)},useNow:realTime,onUseNow:useNow=>{if(useNow){const{date:date,time:time}=now();setRealTime(true);setDate(date);setTime(time);handleDate(date)}else{setRealTime(false)}},visible:datePanelVisible,closeable:!noticeVisible||state===null,class:`${buildingPanelVisible?"date-time-panel-bottom-panel":""} ${noticeVisible?"date-time-panel-notice-visible":""}`,onClose:()=>setShowDatePanel(false)}),v("div",{class:"buildings-wrapper",children:[v("p",{class:`notice ${noticeVisible?"notice-visible":""} ${datePanelVisible?"notice-date-open":""}`,children:v("span",{class:"notice-text",children:notice})}),v("div",{class:"buildings",children:[v("div",{class:"scroll-area",style:{width:`${northeast.x-southwest.x+PADDING.horizontal*2}px`,height:`${southwest.y-northeast.y+PADDING.top+PADDING.bottom}px`,backgroundSize:`${mapPosition.width}px`,backgroundPosition:`${mapPosition.x}px ${mapPosition.y}px`}}),Object.values(buildings).map((building=>v(BuildingButton,{weekday:date.day,time:time,building:building,rooms:Object.values(state?.buildings?.[building.code]??{}),selected:building.code===buildingCode,scrollTarget:building.code===scrollTo.building?scrollTo:null,visible:!!state?.buildings&&building.code in state.buildings},building.code)))]})]}),v(BuildingPanel,{weekday:date.day,time:time,building:buildings[lastBuilding]??{code:lastBuilding,college:"",images:"",location:[0,0],name:lastBuilding},room:room,rooms:state?.buildings?.[lastBuilding]??{},visible:buildingPanelVisible,rightPanelOpen:datePanelVisible})]})}pe(v(App,{title:document.title}),document.getElementById("root"));