diff --git a/.gitignore b/.gitignore index 052269b..5bfb66b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ node_modules out openring draft -cache.json \ No newline at end of file +cache.json +cache.sqlite3 \ No newline at end of file diff --git a/assets/images/FTL.png.original b/assets/images/FTL.png.original new file mode 100644 index 0000000..3d0a9c1 Binary files /dev/null and b/assets/images/FTL.png.original differ diff --git a/assets/images/alphacol.png.original b/assets/images/alphacol.png.original new file mode 100644 index 0000000..612826e Binary files /dev/null and b/assets/images/alphacol.png.original differ diff --git a/assets/images/apioform.png.original b/assets/images/apioform.png.original new file mode 100644 index 0000000..c41237e Binary files /dev/null and b/assets/images/apioform.png.original differ diff --git a/assets/images/csproblem.png.original b/assets/images/csproblem.png.original new file mode 100644 index 0000000..d5dbf7c Binary files /dev/null and b/assets/images/csproblem.png.original differ diff --git a/assets/images/emu-war.png.original b/assets/images/emu-war.png.original new file mode 100644 index 0000000..13128b5 Binary files /dev/null and b/assets/images/emu-war.png.original differ diff --git a/assets/images/flight.png.original b/assets/images/flight.png.original new file mode 100644 index 0000000..67eb010 Binary files /dev/null and b/assets/images/flight.png.original differ diff --git a/assets/images/fractalart.png.original b/assets/images/fractalart.png.original new file mode 100644 index 0000000..1c052df Binary files /dev/null and b/assets/images/fractalart.png.original differ diff --git a/assets/images/gol.png.original b/assets/images/gol.png.original new file mode 100644 index 0000000..381fdc9 Binary files /dev/null and b/assets/images/gol.png.original differ diff --git a/assets/images/guihacker.png.original b/assets/images/guihacker.png.original new file mode 100644 index 0000000..d3203af Binary files /dev/null and b/assets/images/guihacker.png.original differ diff --git a/assets/images/heavscp.png.original b/assets/images/heavscp.png.original new file mode 100644 index 0000000..df77514 Binary files /dev/null and b/assets/images/heavscp.png.original differ diff --git a/assets/images/ideas.png.original b/assets/images/ideas.png.original new file mode 100644 index 0000000..1826705 Binary files /dev/null and b/assets/images/ideas.png.original differ diff --git a/assets/images/incdec.png.original b/assets/images/incdec.png.original new file mode 100644 index 0000000..7fe999b Binary files /dev/null and b/assets/images/incdec.png.original differ diff --git a/assets/images/infipage.png.original b/assets/images/infipage.png.original new file mode 100644 index 0000000..117cbd7 Binary files /dev/null and b/assets/images/infipage.png.original differ diff --git a/assets/images/joe.png.original b/assets/images/joe.png.original new file mode 100644 index 0000000..206ca78 Binary files /dev/null and b/assets/images/joe.png.original differ diff --git a/assets/images/lorem.png.original b/assets/images/lorem.png.original new file mode 100644 index 0000000..f3e6baf Binary files /dev/null and b/assets/images/lorem.png.original differ diff --git a/assets/images/maghammer.png.original b/assets/images/maghammer.png.original new file mode 100644 index 0000000..431834f Binary files /dev/null and b/assets/images/maghammer.png.original differ diff --git a/assets/images/minoteaur.png.original b/assets/images/minoteaur.png.original new file mode 100644 index 0000000..74f270b Binary files /dev/null and b/assets/images/minoteaur.png.original differ diff --git a/assets/images/nemc.png.original b/assets/images/nemc.png.original new file mode 100644 index 0000000..1526da1 Binary files /dev/null and b/assets/images/nemc.png.original differ diff --git a/assets/images/new-website.png.original b/assets/images/new-website.png.original new file mode 100644 index 0000000..24f25cf Binary files /dev/null and b/assets/images/new-website.png.original differ diff --git a/assets/images/opinion.jpg b/assets/images/opinion.jpg new file mode 100644 index 0000000..6d33bb5 Binary files /dev/null and b/assets/images/opinion.jpg differ diff --git a/assets/images/opinion.png.original b/assets/images/opinion.png.original new file mode 100644 index 0000000..812acd5 Binary files /dev/null and b/assets/images/opinion.png.original differ diff --git a/assets/images/osbill.png.original b/assets/images/osbill.png.original new file mode 100644 index 0000000..ea538d8 Binary files /dev/null and b/assets/images/osbill.png.original differ diff --git a/assets/images/osmarkscalculator.png.original b/assets/images/osmarkscalculator.png.original new file mode 100644 index 0000000..425b1df Binary files /dev/null and b/assets/images/osmarkscalculator.png.original differ diff --git a/assets/images/otherstuff.png.original b/assets/images/otherstuff.png.original new file mode 100644 index 0000000..71df356 Binary files /dev/null and b/assets/images/otherstuff.png.original differ diff --git a/assets/images/phones.png.original b/assets/images/phones.png.original new file mode 100644 index 0000000..0efe2da Binary files /dev/null and b/assets/images/phones.png.original differ diff --git a/assets/images/points.png.original b/assets/images/points.png.original new file mode 100644 index 0000000..5d1ea5b Binary files /dev/null and b/assets/images/points.png.original differ diff --git a/assets/images/polcal.jpg b/assets/images/polcal.jpg new file mode 100644 index 0000000..6c8b84d Binary files /dev/null and b/assets/images/polcal.jpg differ diff --git a/assets/images/polcal.png.original b/assets/images/polcal.png.original new file mode 100644 index 0000000..868c2b2 Binary files /dev/null and b/assets/images/polcal.png.original differ diff --git a/assets/images/progedu.png.original b/assets/images/progedu.png.original new file mode 100644 index 0000000..91ca3d7 Binary files /dev/null and b/assets/images/progedu.png.original differ diff --git a/assets/images/rote.png.original b/assets/images/rote.png.original new file mode 100644 index 0000000..b2dc4a5 Binary files /dev/null and b/assets/images/rote.png.original differ diff --git a/assets/images/rpncalc2.png.original b/assets/images/rpncalc2.png.original new file mode 100644 index 0000000..e1fb4e4 Binary files /dev/null and b/assets/images/rpncalc2.png.original differ diff --git a/assets/images/rpncalc3.png.original b/assets/images/rpncalc3.png.original new file mode 100644 index 0000000..7270422 Binary files /dev/null and b/assets/images/rpncalc3.png.original differ diff --git a/assets/images/rpncalc4.png.original b/assets/images/rpncalc4.png.original new file mode 100644 index 0000000..b0d4ee6 Binary files /dev/null and b/assets/images/rpncalc4.png.original differ diff --git a/assets/images/rssgood.png.original b/assets/images/rssgood.png.original new file mode 100644 index 0000000..0b31a47 Binary files /dev/null and b/assets/images/rssgood.png.original differ diff --git a/assets/images/scorer.png.original b/assets/images/scorer.png.original new file mode 100644 index 0000000..6b5907f Binary files /dev/null and b/assets/images/scorer.png.original differ diff --git a/assets/images/stack.png.original b/assets/images/stack.png.original new file mode 100644 index 0000000..7a0f601 Binary files /dev/null and b/assets/images/stack.png.original differ diff --git a/assets/images/themes.png.original b/assets/images/themes.png.original new file mode 100644 index 0000000..abbf2fa Binary files /dev/null and b/assets/images/themes.png.original differ diff --git a/assets/images/tictactoe.png.original b/assets/images/tictactoe.png.original new file mode 100644 index 0000000..f32ad3b Binary files /dev/null and b/assets/images/tictactoe.png.original differ diff --git a/assets/images/whorl.png.original b/assets/images/whorl.png.original new file mode 100644 index 0000000..53ebb30 Binary files /dev/null and b/assets/images/whorl.png.original differ diff --git a/assets/images/wsterm.png.original b/assets/images/wsterm.png.original new file mode 100644 index 0000000..868c3a1 Binary files /dev/null and b/assets/images/wsterm.png.original differ diff --git a/assets/js/date-fns.js b/assets/js/date-fns.js new file mode 100644 index 0000000..66c3392 --- /dev/null +++ b/assets/js/date-fns.js @@ -0,0 +1,4 @@ +(function webpackUniversalModuleDefinition(root,factory){if(typeof exports==="object"&&typeof module==="object")module.exports=factory();else if(typeof define==="function"&&define.amd)define([],factory);else if(typeof exports==="object")exports["dateFns"]=factory();else root["dateFns"]=factory()})(this,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:false};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.loaded=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.p="";return __webpack_require__(0)}([function(module,exports,__webpack_require__){module.exports={addDays:__webpack_require__(1),addHours:__webpack_require__(5),addISOYears:__webpack_require__(7),addMilliseconds:__webpack_require__(6),addMinutes:__webpack_require__(15),addMonths:__webpack_require__(16),addQuarters:__webpack_require__(18),addSeconds:__webpack_require__(19),addWeeks:__webpack_require__(20),addYears:__webpack_require__(21),areRangesOverlapping:__webpack_require__(22),closestIndexTo:__webpack_require__(23),closestTo:__webpack_require__(24),compareAsc:__webpack_require__(25),compareDesc:__webpack_require__(26),differenceInCalendarDays:__webpack_require__(13),differenceInCalendarISOWeeks:__webpack_require__(27),differenceInCalendarISOYears:__webpack_require__(28),differenceInCalendarMonths:__webpack_require__(29),differenceInCalendarQuarters:__webpack_require__(30),differenceInCalendarWeeks:__webpack_require__(32),differenceInCalendarYears:__webpack_require__(33),differenceInDays:__webpack_require__(34),differenceInHours:__webpack_require__(35),differenceInISOYears:__webpack_require__(37),differenceInMilliseconds:__webpack_require__(36),differenceInMinutes:__webpack_require__(39),differenceInMonths:__webpack_require__(40),differenceInQuarters:__webpack_require__(41),differenceInSeconds:__webpack_require__(42),differenceInWeeks:__webpack_require__(43),differenceInYears:__webpack_require__(44),distanceInWords:__webpack_require__(45),distanceInWordsStrict:__webpack_require__(50),distanceInWordsToNow:__webpack_require__(51),eachDay:__webpack_require__(52),endOfDay:__webpack_require__(53),endOfHour:__webpack_require__(54),endOfISOWeek:__webpack_require__(55),endOfISOYear:__webpack_require__(57),endOfMinute:__webpack_require__(58),endOfMonth:__webpack_require__(59),endOfQuarter:__webpack_require__(60),endOfSecond:__webpack_require__(61),endOfToday:__webpack_require__(62),endOfTomorrow:__webpack_require__(63),endOfWeek:__webpack_require__(56),endOfYear:__webpack_require__(64),endOfYesterday:__webpack_require__(65),format:__webpack_require__(66),getDate:__webpack_require__(71),getDay:__webpack_require__(72),getDayOfYear:__webpack_require__(67),getDaysInMonth:__webpack_require__(17),getDaysInYear:__webpack_require__(73),getHours:__webpack_require__(75),getISODay:__webpack_require__(76),getISOWeek:__webpack_require__(69),getISOWeeksInYear:__webpack_require__(77),getISOYear:__webpack_require__(8),getMilliseconds:__webpack_require__(78),getMinutes:__webpack_require__(79),getMonth:__webpack_require__(80),getOverlappingDaysInRanges:__webpack_require__(81),getQuarter:__webpack_require__(31),getSeconds:__webpack_require__(82),getTime:__webpack_require__(83),getYear:__webpack_require__(84),isAfter:__webpack_require__(85),isBefore:__webpack_require__(86),isDate:__webpack_require__(4),isEqual:__webpack_require__(87),isFirstDayOfMonth:__webpack_require__(88),isFriday:__webpack_require__(89),isFuture:__webpack_require__(90),isLastDayOfMonth:__webpack_require__(91),isLeapYear:__webpack_require__(74),isMonday:__webpack_require__(92),isPast:__webpack_require__(93),isSameDay:__webpack_require__(94),isSameHour:__webpack_require__(95),isSameISOWeek:__webpack_require__(97),isSameISOYear:__webpack_require__(99),isSameMinute:__webpack_require__(100),isSameMonth:__webpack_require__(102),isSameQuarter:__webpack_require__(103),isSameSecond:__webpack_require__(105),isSameWeek:__webpack_require__(98),isSameYear:__webpack_require__(107),isSaturday:__webpack_require__(108),isSunday:__webpack_require__(109),isThisHour:__webpack_require__(110),isThisISOWeek:__webpack_require__(111),isThisISOYear:__webpack_require__(112),isThisMinute:__webpack_require__(113),isThisMonth:__webpack_require__(114),isThisQuarter:__webpack_require__(115),isThisSecond:__webpack_require__(116),isThisWeek:__webpack_require__(117),isThisYear:__webpack_require__(118),isThursday:__webpack_require__(119),isToday:__webpack_require__(120),isTomorrow:__webpack_require__(121),isTuesday:__webpack_require__(122),isValid:__webpack_require__(70),isWednesday:__webpack_require__(123),isWeekend:__webpack_require__(124),isWithinRange:__webpack_require__(125),isYesterday:__webpack_require__(126),lastDayOfISOWeek:__webpack_require__(127),lastDayOfISOYear:__webpack_require__(129),lastDayOfMonth:__webpack_require__(130),lastDayOfQuarter:__webpack_require__(131),lastDayOfWeek:__webpack_require__(128),lastDayOfYear:__webpack_require__(132),max:__webpack_require__(133),min:__webpack_require__(134),parse:__webpack_require__(2),setDate:__webpack_require__(135),setDay:__webpack_require__(136),setDayOfYear:__webpack_require__(137),setHours:__webpack_require__(138),setISODay:__webpack_require__(139),setISOWeek:__webpack_require__(140),setISOYear:__webpack_require__(11),setMilliseconds:__webpack_require__(141),setMinutes:__webpack_require__(142),setMonth:__webpack_require__(143),setQuarter:__webpack_require__(144),setSeconds:__webpack_require__(145),setYear:__webpack_require__(146),startOfDay:__webpack_require__(14),startOfHour:__webpack_require__(96),startOfISOWeek:__webpack_require__(9),startOfISOYear:__webpack_require__(12),startOfMinute:__webpack_require__(101),startOfMonth:__webpack_require__(147),startOfQuarter:__webpack_require__(104),startOfSecond:__webpack_require__(106),startOfToday:__webpack_require__(148),startOfTomorrow:__webpack_require__(149),startOfWeek:__webpack_require__(10),startOfYear:__webpack_require__(68),startOfYesterday:__webpack_require__(150),subDays:__webpack_require__(151),subHours:__webpack_require__(152),subISOYears:__webpack_require__(38),subMilliseconds:__webpack_require__(153),subMinutes:__webpack_require__(154),subMonths:__webpack_require__(155),subQuarters:__webpack_require__(156),subSeconds:__webpack_require__(157),subWeeks:__webpack_require__(158),subYears:__webpack_require__(159)}},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function addDays(dirtyDate,dirtyAmount){var date=parse(dirtyDate);var amount=Number(dirtyAmount);date.setDate(date.getDate()+amount);return date}module.exports=addDays},function(module,exports,__webpack_require__){var getTimezoneOffsetInMilliseconds=__webpack_require__(3);var isDate=__webpack_require__(4);var MILLISECONDS_IN_HOUR=36e5;var MILLISECONDS_IN_MINUTE=6e4;var DEFAULT_ADDITIONAL_DIGITS=2;var parseTokenDateTimeDelimeter=/[T ]/;var parseTokenPlainTime=/:/;var parseTokenYY=/^(\d{2})$/;var parseTokensYYY=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/];var parseTokenYYYY=/^(\d{4})/;var parseTokensYYYYY=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/];var parseTokenMM=/^-(\d{2})$/;var parseTokenDDD=/^-?(\d{3})$/;var parseTokenMMDD=/^-?(\d{2})-?(\d{2})$/;var parseTokenWww=/^-?W(\d{2})$/;var parseTokenWwwD=/^-?W(\d{2})-?(\d{1})$/;var parseTokenHH=/^(\d{2}([.,]\d*)?)$/;var parseTokenHHMM=/^(\d{2}):?(\d{2}([.,]\d*)?)$/;var parseTokenHHMMSS=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/;var parseTokenTimezone=/([Z+-].*)$/;var parseTokenTimezoneZ=/^(Z)$/;var parseTokenTimezoneHH=/^([+-])(\d{2})$/;var parseTokenTimezoneHHMM=/^([+-])(\d{2}):?(\d{2})$/;function parse(argument,dirtyOptions){if(isDate(argument)){return new Date(argument.getTime())}else if(typeof argument!=="string"){return new Date(argument)}var options=dirtyOptions||{};var additionalDigits=options.additionalDigits;if(additionalDigits==null){additionalDigits=DEFAULT_ADDITIONAL_DIGITS}else{additionalDigits=Number(additionalDigits)}var dateStrings=splitDateString(argument);var parseYearResult=parseYear(dateStrings.date,additionalDigits);var year=parseYearResult.year;var restDateString=parseYearResult.restDateString;var date=parseDate(restDateString,year);if(date){var timestamp=date.getTime();var time=0;var offset;if(dateStrings.time){time=parseTime(dateStrings.time)}if(dateStrings.timezone){offset=parseTimezone(dateStrings.timezone)*MILLISECONDS_IN_MINUTE}else{var fullTime=timestamp+time;var fullTimeDate=new Date(fullTime);offset=getTimezoneOffsetInMilliseconds(fullTimeDate);var fullTimeDateNextDay=new Date(fullTime);fullTimeDateNextDay.setDate(fullTimeDate.getDate()+1);var offsetDiff=getTimezoneOffsetInMilliseconds(fullTimeDateNextDay)-getTimezoneOffsetInMilliseconds(fullTimeDate);if(offsetDiff>0){offset+=offsetDiff}}return new Date(timestamp+time+offset)}else{return new Date(argument)}}function splitDateString(dateString){var dateStrings={};var array=dateString.split(parseTokenDateTimeDelimeter);var timeString;if(parseTokenPlainTime.test(array[0])){dateStrings.date=null;timeString=array[0]}else{dateStrings.date=array[0];timeString=array[1]}if(timeString){var token=parseTokenTimezone.exec(timeString);if(token){dateStrings.time=timeString.replace(token[1],"");dateStrings.timezone=token[1]}else{dateStrings.time=timeString}}return dateStrings}function parseYear(dateString,additionalDigits){var parseTokenYYY=parseTokensYYY[additionalDigits];var parseTokenYYYYY=parseTokensYYYYY[additionalDigits];var token;token=parseTokenYYYY.exec(dateString)||parseTokenYYYYY.exec(dateString);if(token){var yearString=token[1];return{year:parseInt(yearString,10),restDateString:dateString.slice(yearString.length)}}token=parseTokenYY.exec(dateString)||parseTokenYYY.exec(dateString);if(token){var centuryString=token[1];return{year:parseInt(centuryString,10)*100,restDateString:dateString.slice(centuryString.length)}}return{year:null}}function parseDate(dateString,year){if(year===null){return null}var token;var date;var month;var week;if(dateString.length===0){date=new Date(0);date.setUTCFullYear(year);return date}token=parseTokenMM.exec(dateString);if(token){date=new Date(0);month=parseInt(token[1],10)-1;date.setUTCFullYear(year,month);return date}token=parseTokenDDD.exec(dateString);if(token){date=new Date(0);var dayOfYear=parseInt(token[1],10);date.setUTCFullYear(year,0,dayOfYear);return date}token=parseTokenMMDD.exec(dateString);if(token){date=new Date(0);month=parseInt(token[1],10)-1;var day=parseInt(token[2],10);date.setUTCFullYear(year,month,day);return date}token=parseTokenWww.exec(dateString);if(token){week=parseInt(token[1],10)-1;return dayOfISOYear(year,week)}token=parseTokenWwwD.exec(dateString);if(token){week=parseInt(token[1],10)-1;var dayOfWeek=parseInt(token[2],10)-1;return dayOfISOYear(year,week,dayOfWeek)}return null}function parseTime(timeString){var token;var hours;var minutes;token=parseTokenHH.exec(timeString);if(token){hours=parseFloat(token[1].replace(",","."));return hours%24*MILLISECONDS_IN_HOUR}token=parseTokenHHMM.exec(timeString);if(token){hours=parseInt(token[1],10);minutes=parseFloat(token[2].replace(",","."));return hours%24*MILLISECONDS_IN_HOUR+minutes*MILLISECONDS_IN_MINUTE}token=parseTokenHHMMSS.exec(timeString);if(token){hours=parseInt(token[1],10);minutes=parseInt(token[2],10);var seconds=parseFloat(token[3].replace(",","."));return hours%24*MILLISECONDS_IN_HOUR+minutes*MILLISECONDS_IN_MINUTE+seconds*1e3}return null}function parseTimezone(timezoneString){var token;var absoluteOffset;token=parseTokenTimezoneZ.exec(timezoneString);if(token){return 0}token=parseTokenTimezoneHH.exec(timezoneString);if(token){absoluteOffset=parseInt(token[2],10)*60;return token[1]==="+"?-absoluteOffset:absoluteOffset}token=parseTokenTimezoneHHMM.exec(timezoneString);if(token){absoluteOffset=parseInt(token[2],10)*60+parseInt(token[3],10);return token[1]==="+"?-absoluteOffset:absoluteOffset}return 0}function dayOfISOYear(isoYear,week,day){week=week||0;day=day||0;var date=new Date(0);date.setUTCFullYear(isoYear,0,4);var fourthOfJanuaryDay=date.getUTCDay()||7;var diff=week*7+day+1-fourthOfJanuaryDay;date.setUTCDate(date.getUTCDate()+diff);return date}module.exports=parse},function(module,exports){var MILLISECONDS_IN_MINUTE=6e4;module.exports=function getTimezoneOffsetInMilliseconds(dirtyDate){var date=new Date(dirtyDate.getTime());var baseTimezoneOffset=date.getTimezoneOffset();date.setSeconds(0,0);var millisecondsPartOfTimezoneOffset=date.getTime()%MILLISECONDS_IN_MINUTE;return baseTimezoneOffset*MILLISECONDS_IN_MINUTE+millisecondsPartOfTimezoneOffset}},function(module,exports){function isDate(argument){return argument instanceof Date}module.exports=isDate},function(module,exports,__webpack_require__){var addMilliseconds=__webpack_require__(6);var MILLISECONDS_IN_HOUR=36e5;function addHours(dirtyDate,dirtyAmount){var amount=Number(dirtyAmount);return addMilliseconds(dirtyDate,amount*MILLISECONDS_IN_HOUR)}module.exports=addHours},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function addMilliseconds(dirtyDate,dirtyAmount){var timestamp=parse(dirtyDate).getTime();var amount=Number(dirtyAmount);return new Date(timestamp+amount)}module.exports=addMilliseconds},function(module,exports,__webpack_require__){var getISOYear=__webpack_require__(8);var setISOYear=__webpack_require__(11);function addISOYears(dirtyDate,dirtyAmount){var amount=Number(dirtyAmount);return setISOYear(dirtyDate,getISOYear(dirtyDate)+amount)}module.exports=addISOYears},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var startOfISOWeek=__webpack_require__(9);function getISOYear(dirtyDate){var date=parse(dirtyDate);var year=date.getFullYear();var fourthOfJanuaryOfNextYear=new Date(0);fourthOfJanuaryOfNextYear.setFullYear(year+1,0,4);fourthOfJanuaryOfNextYear.setHours(0,0,0,0);var startOfNextYear=startOfISOWeek(fourthOfJanuaryOfNextYear);var fourthOfJanuaryOfThisYear=new Date(0);fourthOfJanuaryOfThisYear.setFullYear(year,0,4);fourthOfJanuaryOfThisYear.setHours(0,0,0,0);var startOfThisYear=startOfISOWeek(fourthOfJanuaryOfThisYear);if(date.getTime()>=startOfNextYear.getTime()){return year+1}else if(date.getTime()>=startOfThisYear.getTime()){return year}else{return year-1}}module.exports=getISOYear},function(module,exports,__webpack_require__){var startOfWeek=__webpack_require__(10);function startOfISOWeek(dirtyDate){return startOfWeek(dirtyDate,{weekStartsOn:1})}module.exports=startOfISOWeek},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfWeek(dirtyDate,dirtyOptions){var weekStartsOn=dirtyOptions?Number(dirtyOptions.weekStartsOn)||0:0;var date=parse(dirtyDate);var day=date.getDay();var diff=(dayinitialEndTime||comparedStartTime>comparedEndTime){throw new Error("The start of the range cannot be after the end of the range")}return initialStartTimetimeRight){return 1}else{return 0}}module.exports=compareAsc},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function compareDesc(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var timeLeft=dateLeft.getTime();var dateRight=parse(dirtyDateRight);var timeRight=dateRight.getTime();if(timeLeft>timeRight){return-1}else if(timeLeft0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInHours},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function differenceInMilliseconds(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);return dateLeft.getTime()-dateRight.getTime()}module.exports=differenceInMilliseconds},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var differenceInCalendarISOYears=__webpack_require__(28);var compareAsc=__webpack_require__(25);var subISOYears=__webpack_require__(38);function differenceInISOYears(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);var sign=compareAsc(dateLeft,dateRight);var difference=Math.abs(differenceInCalendarISOYears(dateLeft,dateRight));dateLeft=subISOYears(dateLeft,sign*difference);var isLastISOYearNotFull=compareAsc(dateLeft,dateRight)===-sign;return sign*(difference-isLastISOYearNotFull)}module.exports=differenceInISOYears},function(module,exports,__webpack_require__){var addISOYears=__webpack_require__(7);function subISOYears(dirtyDate,dirtyAmount){var amount=Number(dirtyAmount);return addISOYears(dirtyDate,-amount)}module.exports=subISOYears},function(module,exports,__webpack_require__){var differenceInMilliseconds=__webpack_require__(36);var MILLISECONDS_IN_MINUTE=6e4;function differenceInMinutes(dirtyDateLeft,dirtyDateRight){var diff=differenceInMilliseconds(dirtyDateLeft,dirtyDateRight)/MILLISECONDS_IN_MINUTE;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInMinutes},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var differenceInCalendarMonths=__webpack_require__(29);var compareAsc=__webpack_require__(25);function differenceInMonths(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);var sign=compareAsc(dateLeft,dateRight);var difference=Math.abs(differenceInCalendarMonths(dateLeft,dateRight));dateLeft.setMonth(dateLeft.getMonth()-sign*difference);var isLastMonthNotFull=compareAsc(dateLeft,dateRight)===-sign;return sign*(difference-isLastMonthNotFull)}module.exports=differenceInMonths},function(module,exports,__webpack_require__){var differenceInMonths=__webpack_require__(40);function differenceInQuarters(dirtyDateLeft,dirtyDateRight){var diff=differenceInMonths(dirtyDateLeft,dirtyDateRight)/3;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInQuarters},function(module,exports,__webpack_require__){var differenceInMilliseconds=__webpack_require__(36);function differenceInSeconds(dirtyDateLeft,dirtyDateRight){var diff=differenceInMilliseconds(dirtyDateLeft,dirtyDateRight)/1e3;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInSeconds},function(module,exports,__webpack_require__){var differenceInDays=__webpack_require__(34);function differenceInWeeks(dirtyDateLeft,dirtyDateRight){var diff=differenceInDays(dirtyDateLeft,dirtyDateRight)/7;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInWeeks},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var differenceInCalendarYears=__webpack_require__(33);var compareAsc=__webpack_require__(25);function differenceInYears(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);var sign=compareAsc(dateLeft,dateRight);var difference=Math.abs(differenceInCalendarYears(dateLeft,dateRight));dateLeft.setFullYear(dateLeft.getFullYear()-sign*difference);var isLastYearNotFull=compareAsc(dateLeft,dateRight)===-sign;return sign*(difference-isLastYearNotFull)}module.exports=differenceInYears},function(module,exports,__webpack_require__){var compareDesc=__webpack_require__(26);var parse=__webpack_require__(2);var differenceInSeconds=__webpack_require__(42);var differenceInMonths=__webpack_require__(40);var enLocale=__webpack_require__(46);var MINUTES_IN_DAY=1440;var MINUTES_IN_ALMOST_TWO_DAYS=2520;var MINUTES_IN_MONTH=43200;var MINUTES_IN_TWO_MONTHS=86400;function distanceInWords(dirtyDateToCompare,dirtyDate,dirtyOptions){var options=dirtyOptions||{};var comparison=compareDesc(dirtyDateToCompare,dirtyDate);var locale=options.locale;var localize=enLocale.distanceInWords.localize;if(locale&&locale.distanceInWords&&locale.distanceInWords.localize){localize=locale.distanceInWords.localize}var localizeOptions={addSuffix:Boolean(options.addSuffix),comparison:comparison};var dateLeft,dateRight;if(comparison>0){dateLeft=parse(dirtyDateToCompare);dateRight=parse(dirtyDate)}else{dateLeft=parse(dirtyDate);dateRight=parse(dirtyDateToCompare)}var seconds=differenceInSeconds(dateRight,dateLeft);var offset=dateRight.getTimezoneOffset()-dateLeft.getTimezoneOffset();var minutes=Math.round(seconds/60)-offset;var months;if(minutes<2){if(options.includeSeconds){if(seconds<5){return localize("lessThanXSeconds",5,localizeOptions)}else if(seconds<10){return localize("lessThanXSeconds",10,localizeOptions)}else if(seconds<20){return localize("lessThanXSeconds",20,localizeOptions)}else if(seconds<40){return localize("halfAMinute",null,localizeOptions)}else if(seconds<60){return localize("lessThanXMinutes",1,localizeOptions)}else{return localize("xMinutes",1,localizeOptions)}}else{if(minutes===0){return localize("lessThanXMinutes",1,localizeOptions)}else{return localize("xMinutes",minutes,localizeOptions)}}}else if(minutes<45){return localize("xMinutes",minutes,localizeOptions)}else if(minutes<90){return localize("aboutXHours",1,localizeOptions)}else if(minutes0){return"in "+result}else{return result+" ago"}}return result}return{localize:localize}}module.exports=buildDistanceInWordsLocale},function(module,exports,__webpack_require__){var buildFormattingTokensRegExp=__webpack_require__(49);function buildFormatLocale(){var months3char=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var monthsFull=["January","February","March","April","May","June","July","August","September","October","November","December"];var weekdays2char=["Su","Mo","Tu","We","Th","Fr","Sa"];var weekdays3char=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var weekdaysFull=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var meridiemUppercase=["AM","PM"];var meridiemLowercase=["am","pm"];var meridiemFull=["a.m.","p.m."];var formatters={MMM:function(date){return months3char[date.getMonth()]},MMMM:function(date){return monthsFull[date.getMonth()]},dd:function(date){return weekdays2char[date.getDay()]},ddd:function(date){return weekdays3char[date.getDay()]},dddd:function(date){return weekdaysFull[date.getDay()]},A:function(date){return date.getHours()/12>=1?meridiemUppercase[1]:meridiemUppercase[0]},a:function(date){return date.getHours()/12>=1?meridiemLowercase[1]:meridiemLowercase[0]},aa:function(date){return date.getHours()/12>=1?meridiemFull[1]:meridiemFull[0]}};var ordinalFormatters=["M","D","DDD","d","Q","W"];ordinalFormatters.forEach(function(formatterToken){formatters[formatterToken+"o"]=function(date,formatters){return ordinal(formatters[formatterToken](date))}});return{formatters:formatters,formattingTokensRegExp:buildFormattingTokensRegExp(formatters)}}function ordinal(number){var rem100=number%100;if(rem100>20||rem100<10){switch(rem100%10){case 1:return number+"st";case 2:return number+"nd";case 3:return number+"rd"}}return number+"th"}module.exports=buildFormatLocale},function(module,exports){var commonFormatterKeys=["M","MM","Q","D","DD","DDD","DDDD","d","E","W","WW","YY","YYYY","GG","GGGG","H","HH","h","hh","m","mm","s","ss","S","SS","SSS","Z","ZZ","X","x"];function buildFormattingTokensRegExp(formatters){var formatterKeys=[];for(var key in formatters){if(formatters.hasOwnProperty(key)){formatterKeys.push(key)}}var formattingTokens=commonFormatterKeys.concat(formatterKeys).sort().reverse();var formattingTokensRegExp=new RegExp("(\\[[^\\[]*\\])|(\\\\)?"+"("+formattingTokens.join("|")+"|.)","g");return formattingTokensRegExp}module.exports=buildFormattingTokensRegExp},function(module,exports,__webpack_require__){var compareDesc=__webpack_require__(26);var parse=__webpack_require__(2);var differenceInSeconds=__webpack_require__(42);var enLocale=__webpack_require__(46);var MINUTES_IN_DAY=1440;var MINUTES_IN_MONTH=43200;var MINUTES_IN_YEAR=525600;function distanceInWordsStrict(dirtyDateToCompare,dirtyDate,dirtyOptions){var options=dirtyOptions||{};var comparison=compareDesc(dirtyDateToCompare,dirtyDate);var locale=options.locale;var localize=enLocale.distanceInWords.localize;if(locale&&locale.distanceInWords&&locale.distanceInWords.localize){localize=locale.distanceInWords.localize}var localizeOptions={addSuffix:Boolean(options.addSuffix),comparison:comparison};var dateLeft,dateRight;if(comparison>0){dateLeft=parse(dirtyDateToCompare);dateRight=parse(dirtyDate)}else{dateLeft=parse(dirtyDate);dateRight=parse(dirtyDateToCompare)}var unit;var mathPartial=Math[options.partialMethod?String(options.partialMethod):"floor"];var seconds=differenceInSeconds(dateRight,dateLeft);var offset=dateRight.getTimezoneOffset()-dateLeft.getTimezoneOffset();var minutes=mathPartial(seconds/60)-offset;var hours,days,months,years;if(options.unit){unit=String(options.unit)}else{if(minutes<1){unit="s"}else if(minutes<60){unit="m"}else if(minutesendTime){throw new Error("The first date cannot be after the second date")}var dates=[];var currentDate=startDate;currentDate.setHours(0,0,0,0);while(currentDate.getTime()<=endTime){dates.push(parse(currentDate));currentDate.setDate(currentDate.getDate()+step)}return dates}module.exports=eachDay},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function endOfDay(dirtyDate){var date=parse(dirtyDate);date.setHours(23,59,59,999);return date}module.exports=endOfDay},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function endOfHour(dirtyDate){var date=parse(dirtyDate);date.setMinutes(59,59,999);return date}module.exports=endOfHour},function(module,exports,__webpack_require__){var endOfWeek=__webpack_require__(56);function endOfISOWeek(dirtyDate){return endOfWeek(dirtyDate,{weekStartsOn:1})}module.exports=endOfISOWeek},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function endOfWeek(dirtyDate,dirtyOptions){var weekStartsOn=dirtyOptions?Number(dirtyOptions.weekStartsOn)||0:0;var date=parse(dirtyDate);var day=date.getDay();var diff=(day12){return hours%12}else{return hours}},hh:function(date){return addLeadingZeros(formatters["h"](date),2)},m:function(date){return date.getMinutes()},mm:function(date){return addLeadingZeros(date.getMinutes(),2)},s:function(date){return date.getSeconds()},ss:function(date){return addLeadingZeros(date.getSeconds(),2)},S:function(date){return Math.floor(date.getMilliseconds()/100)},SS:function(date){return addLeadingZeros(Math.floor(date.getMilliseconds()/10),2)},SSS:function(date){return addLeadingZeros(date.getMilliseconds(),3)},Z:function(date){return formatTimezone(date.getTimezoneOffset(),":")},ZZ:function(date){return formatTimezone(date.getTimezoneOffset())},X:function(date){return Math.floor(date.getTime()/1e3)},x:function(date){return date.getTime()}};function buildFormatFn(formatStr,localeFormatters,formattingTokensRegExp){var array=formatStr.match(formattingTokensRegExp);var length=array.length;var i;var formatter;for(i=0;i0?"-":"+";var absOffset=Math.abs(offset);var hours=Math.floor(absOffset/60);var minutes=absOffset%60;return sign+addLeadingZeros(hours,2)+delimeter+addLeadingZeros(minutes,2)}function addLeadingZeros(number,targetLength){var output=Math.abs(number).toString();while(output.lengthinitialEndTime||comparedStartTime>comparedEndTime){throw new Error("The start of the range cannot be after the end of the range")}var isOverlapping=initialStartTimeinitialEndTime?initialEndTime:comparedEndTime;var differenceInMs=overlapEndDate-overlapStartDate;return Math.ceil(differenceInMs/MILLISECONDS_IN_DAY)}module.exports=getOverlappingDaysInRanges},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function getSeconds(dirtyDate){var date=parse(dirtyDate);var seconds=date.getSeconds();return seconds}module.exports=getSeconds},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function getTime(dirtyDate){var date=parse(dirtyDate);var timestamp=date.getTime();return timestamp}module.exports=getTime},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function getYear(dirtyDate){var date=parse(dirtyDate);var year=date.getFullYear();return year}module.exports=getYear},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isAfter(dirtyDate,dirtyDateToCompare){var date=parse(dirtyDate);var dateToCompare=parse(dirtyDateToCompare);return date.getTime()>dateToCompare.getTime()}module.exports=isAfter},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isBefore(dirtyDate,dirtyDateToCompare){var date=parse(dirtyDate);var dateToCompare=parse(dirtyDateToCompare);return date.getTime()(new Date).getTime()}module.exports=isFuture},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var endOfDay=__webpack_require__(53);var endOfMonth=__webpack_require__(59);function isLastDayOfMonth(dirtyDate){var date=parse(dirtyDate);return endOfDay(date).getTime()===endOfMonth(date).getTime()}module.exports=isLastDayOfMonth},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isMonday(dirtyDate){return parse(dirtyDate).getDay()===1}module.exports=isMonday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isPast(dirtyDate){return parse(dirtyDate).getTime()<(new Date).getTime()}module.exports=isPast},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isSameDay(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfDay=startOfDay(dirtyDateLeft);var dateRightStartOfDay=startOfDay(dirtyDateRight);return dateLeftStartOfDay.getTime()===dateRightStartOfDay.getTime()}module.exports=isSameDay},function(module,exports,__webpack_require__){var startOfHour=__webpack_require__(96);function isSameHour(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfHour=startOfHour(dirtyDateLeft);var dateRightStartOfHour=startOfHour(dirtyDateRight);return dateLeftStartOfHour.getTime()===dateRightStartOfHour.getTime()}module.exports=isSameHour},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfHour(dirtyDate){var date=parse(dirtyDate);date.setMinutes(0,0,0);return date}module.exports=startOfHour},function(module,exports,__webpack_require__){var isSameWeek=__webpack_require__(98);function isSameISOWeek(dirtyDateLeft,dirtyDateRight){return isSameWeek(dirtyDateLeft,dirtyDateRight,{weekStartsOn:1})}module.exports=isSameISOWeek},function(module,exports,__webpack_require__){var startOfWeek=__webpack_require__(10);function isSameWeek(dirtyDateLeft,dirtyDateRight,dirtyOptions){var dateLeftStartOfWeek=startOfWeek(dirtyDateLeft,dirtyOptions);var dateRightStartOfWeek=startOfWeek(dirtyDateRight,dirtyOptions);return dateLeftStartOfWeek.getTime()===dateRightStartOfWeek.getTime()}module.exports=isSameWeek},function(module,exports,__webpack_require__){var startOfISOYear=__webpack_require__(12);function isSameISOYear(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfYear=startOfISOYear(dirtyDateLeft);var dateRightStartOfYear=startOfISOYear(dirtyDateRight);return dateLeftStartOfYear.getTime()===dateRightStartOfYear.getTime()}module.exports=isSameISOYear},function(module,exports,__webpack_require__){var startOfMinute=__webpack_require__(101);function isSameMinute(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfMinute=startOfMinute(dirtyDateLeft);var dateRightStartOfMinute=startOfMinute(dirtyDateRight);return dateLeftStartOfMinute.getTime()===dateRightStartOfMinute.getTime()}module.exports=isSameMinute},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfMinute(dirtyDate){var date=parse(dirtyDate);date.setSeconds(0,0);return date}module.exports=startOfMinute},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSameMonth(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);return dateLeft.getFullYear()===dateRight.getFullYear()&&dateLeft.getMonth()===dateRight.getMonth()}module.exports=isSameMonth},function(module,exports,__webpack_require__){var startOfQuarter=__webpack_require__(104);function isSameQuarter(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfQuarter=startOfQuarter(dirtyDateLeft);var dateRightStartOfQuarter=startOfQuarter(dirtyDateRight);return dateLeftStartOfQuarter.getTime()===dateRightStartOfQuarter.getTime()}module.exports=isSameQuarter},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfQuarter(dirtyDate){var date=parse(dirtyDate);var currentMonth=date.getMonth();var month=currentMonth-currentMonth%3;date.setMonth(month,1);date.setHours(0,0,0,0);return date}module.exports=startOfQuarter},function(module,exports,__webpack_require__){var startOfSecond=__webpack_require__(106);function isSameSecond(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfSecond=startOfSecond(dirtyDateLeft);var dateRightStartOfSecond=startOfSecond(dirtyDateRight);return dateLeftStartOfSecond.getTime()===dateRightStartOfSecond.getTime()}module.exports=isSameSecond},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfSecond(dirtyDate){var date=parse(dirtyDate);date.setMilliseconds(0);return date}module.exports=startOfSecond},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSameYear(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);return dateLeft.getFullYear()===dateRight.getFullYear()}module.exports=isSameYear},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSaturday(dirtyDate){return parse(dirtyDate).getDay()===6}module.exports=isSaturday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSunday(dirtyDate){return parse(dirtyDate).getDay()===0}module.exports=isSunday},function(module,exports,__webpack_require__){var isSameHour=__webpack_require__(95);function isThisHour(dirtyDate){return isSameHour(new Date,dirtyDate)}module.exports=isThisHour},function(module,exports,__webpack_require__){var isSameISOWeek=__webpack_require__(97);function isThisISOWeek(dirtyDate){return isSameISOWeek(new Date,dirtyDate)}module.exports=isThisISOWeek},function(module,exports,__webpack_require__){var isSameISOYear=__webpack_require__(99);function isThisISOYear(dirtyDate){return isSameISOYear(new Date,dirtyDate)}module.exports=isThisISOYear},function(module,exports,__webpack_require__){var isSameMinute=__webpack_require__(100);function isThisMinute(dirtyDate){return isSameMinute(new Date,dirtyDate)}module.exports=isThisMinute},function(module,exports,__webpack_require__){var isSameMonth=__webpack_require__(102);function isThisMonth(dirtyDate){return isSameMonth(new Date,dirtyDate)}module.exports=isThisMonth},function(module,exports,__webpack_require__){var isSameQuarter=__webpack_require__(103);function isThisQuarter(dirtyDate){return isSameQuarter(new Date,dirtyDate)}module.exports=isThisQuarter},function(module,exports,__webpack_require__){var isSameSecond=__webpack_require__(105);function isThisSecond(dirtyDate){return isSameSecond(new Date,dirtyDate)}module.exports=isThisSecond},function(module,exports,__webpack_require__){var isSameWeek=__webpack_require__(98);function isThisWeek(dirtyDate,dirtyOptions){return isSameWeek(new Date,dirtyDate,dirtyOptions)}module.exports=isThisWeek},function(module,exports,__webpack_require__){var isSameYear=__webpack_require__(107);function isThisYear(dirtyDate){return isSameYear(new Date,dirtyDate)}module.exports=isThisYear},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isThursday(dirtyDate){return parse(dirtyDate).getDay()===4}module.exports=isThursday},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isToday(dirtyDate){return startOfDay(dirtyDate).getTime()===startOfDay(new Date).getTime()}module.exports=isToday},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isTomorrow(dirtyDate){var tomorrow=new Date;tomorrow.setDate(tomorrow.getDate()+1);return startOfDay(dirtyDate).getTime()===startOfDay(tomorrow).getTime()}module.exports=isTomorrow},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isTuesday(dirtyDate){return parse(dirtyDate).getDay()===2}module.exports=isTuesday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isWednesday(dirtyDate){return parse(dirtyDate).getDay()===3}module.exports=isWednesday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isWeekend(dirtyDate){var date=parse(dirtyDate);var day=date.getDay();return day===0||day===6}module.exports=isWeekend},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isWithinRange(dirtyDate,dirtyStartDate,dirtyEndDate){var time=parse(dirtyDate).getTime();var startTime=parse(dirtyStartDate).getTime();var endTime=parse(dirtyEndDate).getTime();if(startTime>endTime){throw new Error("The start of the range cannot be after the end of the range")}return time>=startTime&&time<=endTime}module.exports=isWithinRange},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isYesterday(dirtyDate){var yesterday=new Date;yesterday.setDate(yesterday.getDate()-1);return startOfDay(dirtyDate).getTime()===startOfDay(yesterday).getTime()}module.exports=isYesterday},function(module,exports,__webpack_require__){var lastDayOfWeek=__webpack_require__(128);function lastDayOfISOWeek(dirtyDate){return lastDayOfWeek(dirtyDate,{weekStartsOn:1})}module.exports=lastDayOfISOWeek},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function lastDayOfWeek(dirtyDate,dirtyOptions){var weekStartsOn=dirtyOptions?Number(dirtyOptions.weekStartsOn)||0:0;var date=parse(dirtyDate);var day=date.getDay();var diff=(day15 bits. \ No newline at end of file diff --git a/blog/on-phones.md b/blog/on-phones.md index 98be4d5..78e38be 100644 --- a/blog/on-phones.md +++ b/blog/on-phones.md @@ -13,4 +13,16 @@ updated: 24/01/2020 * The lack of SD card slots is, again, probably just planned obsolecence. * Proper physical QWERTY keyboards would be nice, though as they're such a niche feature that's probably never going to happen except on a few phones. * The screens don't need to get bigger. People's hands aren't growing every year. And they don't need more pixels to drain increasingly large amounts of power. -* Removable batteries should come back. When I initially wrote this in 2017 or so, they were pretty common, but now barely any new devices let you *swap the battery*, despite lithium-ion batteries degrading within a few years of heavy use. I know you can't economically do highly modular design in a phone, but this is not a complex, technically difficult or expensive thing to want. \ No newline at end of file +* Removable batteries should come back. When I initially wrote this in 2017 or so, they were pretty common, but now barely any new devices let you *swap the battery*, despite lithium-ion batteries degrading within a few years of heavy use. I know you can't economically do highly modular design in a phone, but this is not a complex, technically difficult or expensive thing to want. + +It's now the future (2023) and things have actually improved slightly in some ways but generally remained about the same: + +* Notches mostly gave way to punch-hole cutouts for cameras, which are somewhat more tolerable. +* Manufacturers have started offering longer software service lifespans, and Project Treble has had the convenient effect of making it possible to run GSIs on all new devices. While I think this means you don't get updates to vendor firmware components, you can at least get OS-level security updates. +* Battery technology has incrementally improved over the years and SoCs are getting made on better processes with better core designs. This has, of course, been mostly cancelled out by dumber software or something, but you can get a few devices with really good battery capabilities. +* Headphone jacks and micro-SD card slots remain mostly gone, but it turns out that wireless headphones are good now and flash is cheap enough that most phones ship with lots of storage anyway. +* A few highly niche products with physical keyboards still exist. Unfortunately, they're bad in every area aside from having the keyboards so I don't have one. +* Displays are still unreasonably large on most products I guess. At least they can make them much brighter and unnecessarily high-resolution. +* Everyone wants high-refresh-rate displays now. I am told that once you get used to them you can't go back, so I'm avoiding them in order to be able to keep using cheaper display tech. +* We have 5G now, which allows me to use up my entire data plan in mere *minutes* (assuming the theoretical maximum link rate is achieved, which will never actually happen). I've heard that it's simpler and neater internally, but I don't trust telecoms people to ever get this right. +* Foldable phones are cool but I dislike, both aesthetically and for reasons of durability, compromising the solid-brick-of-microelectronics nature of modern phones with (large) mechanical parts, and don't really get the usecase. \ No newline at end of file diff --git a/blog/other-stuff.md b/blog/other-stuff.md index 4a76cad..901b441 100644 --- a/blog/other-stuff.md +++ b/blog/other-stuff.md @@ -50,14 +50,15 @@ Obviously this is just stuff *I* like; you might not like it, which isn't really * Egan has short story anthologies which I have also read and recommend. * [Stories of Your Life and Others](https://www.goodreads.com/book/show/223380.Stories_of_Your_Life_and_Others) - just very good short stories. Chiang has written a sequel, [Exhalation](https://www.goodreads.com/book/show/41160292-exhalation), which I also entirely recommend. * He also write [Arrival](https://www.goodreads.com/book/show/32200035-arrival). I like this but not the movie, since the movie's scriptwriters clearly did not understand what was going on. -* [A Hero's War](https://m.fictionpress.com/s/3238329/1/A-Hero-s-War) - bootstrapping industrialization in a setting with magic. Unfortunately, unfinished and seems likely to remain that way. +* [A Hero's War](https://fictionpress.com/s/3238329/1/A-Hero-s-War) - bootstrapping industrialization in a setting with magic. Unfortunately, unfinished and seems likely to remain that way. * [Snow Crash](https://www.goodreads.com/book/show/40651883-snow-crash) - a fun action story even though I don't take the tangents into Sumerian mythology (?) very seriously. * Since this list was written, I think it became notorious for introducing the "metaverse" as pushed by Facebook now. This is very silly. Everyone who is paying attention knows that the real metaverse is Roblox. * [Limitless](https://en.wikipedia.org/wiki/Limitless_(TV_series)) (the movie is also decent) - actually among the least bad depictions of superhuman intelligence I've seen in media, and generally funny. -* [Pantheon](https://en.wikipedia.org/wiki/Pantheon_(TV_series)) - unfortunately cancelled and pulled from streaming (for tax purposes somehow?) and thus hard to watch, but one of about three TV series I've seen on the subject of brain uploads, and I think the smartest. Some day I want my own ominous giant cube of servers in Norway. +* [Pantheon](https://en.wikipedia.org/wiki/Pantheon_(TV_series)) - ~~unfortunately cancelled and pulled from streaming (for tax purposes somehow?) and thus hard to watch,~~ apparently uncancelled and hosted by Amazon now?! Still hard to watch. One of about three TV series I've seen on the subject of brain uploads, and I think the smartest, not that this is a very high bar since it's frequently quite silly (they repeatedly talk about how uploads are just data which can be copied, and then forget this every time it would be useful). Some day I want my own ominous giant cube of servers in Norway. * [Mark of the Fool](https://www.goodreads.com/series/346305-mark-of-the-fool) - somewhat standardly D&D-like world, but the characters are well-written and take reasonable decisions. * [Nice Dragons Finish Last](https://www.goodreads.com/series/128485-heartstrikers) - enjoyable urban fantasy. * [Street Cultivation](https://www.goodreads.com/series/287542-street-cultivation) - again, sane characters who do not make obviously stupid decisions for plot reasons. +* [Nexus](https://www.goodreads.com/book/show/13642710-nexus) - somewhat dumb plot (I think; I read it a while ago and am not far through a reread now) but very cool transhumanist technology. Special mentions (i.e. "I haven't gotten around to reading these but they are well-reviewed and sound interesting") to: * [The Divine Cities](https://www.goodreads.com/series/159695-the-divine-cities) by Robert Jackson Bennet. @@ -72,6 +73,6 @@ Special mentions (i.e. "I haven't gotten around to reading these but they are we * "house of suns is really very good, you should read" - baidicoot/Aidan, creator of the world-renowned [Emu War](/emu-war) game * [Singularity Sky](https://www.goodreads.com/book/show/81992.Singularity_Sky) by Charlie Stross. -If you want EPUB versions of the free web serial stuff here for your e-reader, there are tools to generate those, or you can contact me for a copy. +If you want EPUB versions of the free web serials here for your e-reader, there are tools to generate those, or you can contact me for a copy. -You can suggest other possibly-good stuff in the comments and I may add it to an extra section, and pointlessly complain there or [by email](mailto:osmarks@protonmail.com) if you don't like some of this. Please tell me if any links are dead. +You can suggest other possibly-good stuff in the comments and I may add it to an extra section, and pointlessly complain there or [by email](mailto:me@osmarks.net) if you don't like some of this. Please tell me if any links are dead. diff --git a/blog/political-opinions.md b/blog/political-opinions.md new file mode 100644 index 0000000..ae5d926 --- /dev/null +++ b/blog/political-opinions.md @@ -0,0 +1,42 @@ +--- +title: Stop having political opinions +description: This is, of course, all part of my evil plan to drive site activity through systematically generating (meta)political outrage. +created: 24/09/2023 +slug: opinion +draft: yes +--- +This may sound strange coming from someone whose website contains things which are clearly [political opinions](/osbill/); I am being [hypocritical](https://www.overcomingbias.com/p/homo-hipocritushtml)/didn't notice/have updated my views since that/am writing hyperbolically or ironically to make a point/do not require myself to have self-consistent beliefs (select your favourite option). Regardless, I think that holding, forming and in various ways acting on political opinions is somewhere between unnecessary and significantly net harmful. I apologize in advance for not using concrete examples for anything in this post, but those would be political opinions. + +## Importance, Tractability, Neglectedness + +Political interaction is often framed as altruistic or even morally necessary - most notably, voting is a "civic duty" and in some countries compulsory, and it's common for political movements and their participants to believe that they are helping to bring about a better world through their actions, or that they're preventing some other group from doing harm (and thus in some sense doing good) with their ill-posed opinions, misaligned values or sheer evilness. Thus, let's evaluate it as an altruistic act using the [ITN](https://forum.effectivealtruism.org/topics/itn-framework) framework favoured by Effective Altruism. In brief, Importance is the value of fully solving whatever problem you're targeting, Tractability is the marginal value of your input to it (how much an additional unit of work can affect the problem), and Neglectedness is how little the problem is already being worked on. + +Politics clearly fails at neglectedness. The majority of people are interested at least to the extent of thinking and talking about it regularly and voting. Very large chunks of media time are allotted to politics, and people readily seek out political content to read and debate. There is no shortage of advocacy groups, think tanks and public intellectuals engaging in politics. You might contend that your favourite political position is neglected and less popular than widely discussed ones, but given that you are aware of it and supporting it it probably still has a fairly large amount of supporters - the world population is quite large, after all - and since you're still in the same field as all the other positions you are competing with them for resources and attention. + +It does not do well on tractability. For mostly the same reasons as neglectedness, your marginal contribution is not big. [Voting](https://putanumonit.com/2015/12/30/010-voting/) is, even under fairly optimistic assumptions, very unlikely to change the outcome of an election. Discussing politics with people you know is notorious for never changing anyone's beliefs, and arguments on social media are even less effective - very little discussion surfaces novel ideas and it mostly serves as an ineffective attempt to apply social pressure. The situation with protests and similar activity is perhaps better because there are fewer people doing that, but I do not think their effectiveness is going to be affected much by the addition or removal of a person on the margin, and I am not convinced that they do much in general. Politics is also especially intractable because on many issues, people are actively working against you. + +Importance is somewhat more ambiguous. I have been playing fast and loose with the exact definition of "politics" here - while it's clearly true that the sum of everything people want solved via politics is very important, the plausible consequences of something like electing a party you like or having a policy you want implemented are significantly smaller, both from the perspectives of [conflict theory](https://slatestarcodex.com/2018/01/24/conflict-vs-mistake/) (the frame of political disagreements as battles between groups over values or resource allocation) and mistake theory (political disagreements as good-faith discussions of what the best thing to do is given a shared understanding of goals). Conflict-theoretically, any victory can be eroded by changing power dynamics later or nulified by enemies in the system surrounding it; mistake-theoretically, the impact of policies is very hard to test, let alone know in advance, and many of the issues policies are intended to solve are very complicated and any single solution is unlikely to work very well. + +## The Magic Fix-Everything Button + +A large amount of modern politics-as-practiced seems to take a specific kind of conflict-theoretic view which I think makes it less important (in that the policies resulting from it will be worse) as well as less tractable (it's easier to persuade people if they don't tie opposing views into their identity, and easier to take actions if you are not battling some other group). Specifically, the belief that the main obstacle to improving the world is simply that evil people are in power, and that if you can demand it insistently enough you can replace them with favorable people who will then fix everything in a simple and obvious way which has heretofore gone unused. This is exemplified by [movements with unclear goals and underspecified demands to fix things](https://www.astralcodexten.com/p/book-review-the-revolt-of-the-public). + +While there are absolutely some cases where a bad policy exists for conflict-theoretic reasons (e.g. one group wants to enrich itself at the expense of others and opposition is too diffuse to stop it), the biggest problems we face now have no clean complete solution, only a wide range of possible policy positions with a complex set of tradeoffs. Insistence on a particular consequence without thought to how it might actually be achieved, erasure of tradeoffs, or [ignorance of the reasons](https://en.wiktionary.org/wiki/Chesterton%27s_fence) someone else might be against an obviously-good-to-you policy result in prolonged conflict and ineffective results. Where possible, it's better to try and [move the Pareto frontier](https://www.overcomingbias.com/p/policy_tugowarhtml) with novel solutions rather than attempting to force through a result against others. + +This can also lead to, in effect, passivity: not considering solutions to problems other than wrangling large-scale governmental mechanisms. This is also harmful, since the government is [not omnicompetent](https://www.theonion.com/smart-qualified-people-behind-the-scenes-keeping-ameri-1819571706) and anything complicated is mired in horrifying bureaucratic quagmires of impenetrable dysfunction, as are most large-scale organizations. + +## Selfish Reasons To Not Participate + +Rather than merely not being a public good, I think involvement in politics is even individually harmful. The most obvious reason is opportunity cost - all the time spent reading political news, voting, forming opinions, or having conversations about it could be spent more effectively - but there is the further reason that because people often tie politics to their identities, political discussions are frequently damaging to relationships. + +So if it's bad to participate, why is it so popular? The short answer is, to reuse the favourite adage of "ersatz" on the EleutherAI Discord server, "people are insane". We are [adaptation-executors, not fitness-maximizers](https://www.lesswrong.com/posts/XPErvb8m9FapXCjhA/adaptation-executers-not-fitness-maximizers), built on evolved cognitive heuristics optimized for ancient savannah environments in smaller tribes. It's plausible that in those, tractability and neglectedness were much lower and social missteps or groups moving against you significantly costlier, the resulting strategies misgeneralize to today's world of 8 billion people, and few people bother to explicitly reason about the cost/benefit and override this. The system is also hyperstitious: now that political interaction is considered altruistic and expected, people are incentivized to participate more for signalling reasons. + +This can also be blamed on cultural evolution/memetics. As with religions, the most contagious ideologies are selected for and propagate, growing more able to effectively capture human attention regardless of actual value to their hosts. The incentives of media also help: receiving payment for clicks on your videos and articles incentivizes recapitulation of the same process through deliberate design, resulting in content optimized to spread through exploiting outrage and tribalism. + +## Universalizability + +The most common objection I've heard is along the lines of "but if everyone did this, no political improvement would occur and the world would be much worse off". This is true but irrelevant: I'm not a Kantian and don't only advocate for behaviors which need to apply to everyone at once. In the current state of the world, I think the marginal benefit (to everyone, and to you) of engagement is below the marginal cost and so it should be avoided - if a sufficiently large amount of people agreed with me on this and did so, some of my arguments would apply less and it would become more worthwhile, and I might then argue in favour of political engagement. + +Another is the claim that I am a privileged person who is only able to ignore politics because I'm not heavily threatened or discriminated against by existing instutions. This also misses the point somewhat - this affects importance, but not neglectedness or tractability, which are still, I think, so much lower than people's behaviour implies that this argument holds up. + +If you have any arguments against my argument I haven't addressed here, please tell me so I can think about them. \ No newline at end of file diff --git a/blog/stack.md b/blog/stack.md index 8ba6720..aebe02f 100644 --- a/blog/stack.md +++ b/blog/stack.md @@ -6,14 +6,18 @@ updated: 11/05/2023 --- As you may know, osmarks.net is a website, served from computers which are believed to exist. But have you ever wondered exactly how it's all set up? If not, you may turn elsewhere and live in ignorance. Otherwise, continue reading. -Many similar personal sites are hosted on free static site services or various cloud platforms, but mine actually runs on a physical server. This was originally done because of my general distrust of SaaS/cloud platforms, to learn about Linux administration, and desire to run some non-web things, but now it's necessary to run the full range of weird components which are now important to the website. ~~The hardware has remained the same since early 2019, before I actually had a public site, apart from the addition of more disk capacity and a spare GPU for occasional machine learning workloads - I am using an old HP ML110 G7 tower server. Despite limited RAM and CPU power compared to contemporary rackmount models, it was cheap, has continued to work amazingly reliably, and is much more power-efficient than those would have been. It mostly only runs at about 5% CPU load and 2GB of RAM in use anyway, so it's not been an issue.~~ Due to the increasing compute demands of internal workloads, among other things, it has now been replaced with a custom build using a consumer Ryzen CPU. This has massively increased performance thanks to the CPU's much better IPC, clocks and core count, the 8x increase in RAM, and actually having an SSD. +Many similar personal sites are hosted on free static site services or various cloud platforms, but mine actually runs on a physical server. This was originally done because of my general distrust of SaaS/cloud platforms, to learn about Linux administration, and desire to run some non-web things, but now it's necessary to run the full range of weird components which are now important to the website. ~~The hardware has remained the same since early 2019, before I actually had a public site, apart from the addition of more disk capacity and a spare GPU for occasional machine learning workloads - I am using an old HP ML110 G7 tower server. Despite limited RAM and CPU power compared to contemporary rackmount models, it was cheap, has continued to work amazingly reliably, and is much more power-efficient than those would have been. It mostly only runs at about 5% CPU load and 2GB of RAM in use anyway, so it's not been an issue.~~ Due to the increasing compute demands of internal workloads, among other things, it has now been replaced with a custom build using a consumer Ryzen CPU. This has massively increased performance thanks to the CPU's much better IPC, clocks and core count, the 16x increase in RAM, and actually having an SSD[^2]. The main site itself, which you're currently reading, is in fact just a simple static website. Over the years the exact implementation has varied a lot, from the original not-actually-that-static version using Caddy, some weird PHP scripts for Markdown, and a few folders of HTML files, to the later strange combination of Haskell (using Hakyll) and makefiles to the current somewhat horrible Node.js program (which also interacts with someone else's Go program. Fun!). The modern implementation of the compiler does templating, dependency resolution, Markdown and some optimization tasks in about 300 lines of poorly-described JavaScript. Being static files, many, many different webservers could have been used for this site. In practice, it's mostly alternated randomly between [caddy](https://caddyserver.com/) (a more recent, Go-based webserver with automatic LetsEncrypt integration) and [nginx](https://nginx.org/) (an older and more powerful but slightly quirky program) - caddy generally had easier configuration, but I arbitrarily preferred nginx in some ways. After caddy v2 suddenly required me to rewrite my configuration and introduced a bunch of weird issues, I permanently switched over to nginx and haven't changed back. The configuration file is now 600 lines or so, even with inclusion of includes to shorten things, but it... works, at least. This is mostly to accommodate the bizzarely large set of subdomains I now have for various people, and reverse proxy configuration for backend services. I also use a custom-compiled build of nginx with HTTP/3 (QUIC) support and some modules compiled in. -Some of these backend things are only for personal use, but a few are related to the site itself. For example, the comment server is a standalone Python program, [isso](https://posativ.org/isso/), with corresponding JS embedded in each page. This works pretty well, but has lead to some weird quirkiness, such as each separate 404-erroring URL having its own list of comments. There's also the Random Stuff API, a custom assemblage of about 15 different Python libraries and external programs which, while technically not linked on the site, does interact with other projects like [PotatOS](https://git.osmarks.net/osmarks/potatOS/), and internal services on the same infrastructure like my [RSS reader](https://miniflux.app/). The images subdomain also uses a [PHP program](https://larsjung.de/h5ai/) to generate a nice searchable index; in fact, it is one of two the only PHP things I have unfortunately not yet been able to purge. There also used to be a publicly available status page using some custom code, but this doesn't work very well and has now been dropped; previously I had a Grafana (and earlier Netdata) instance there, but this has now been cancelled because it leaks a worrying amount of information. +Some of these backend things are only for personal use, but a few are related to the site itself. For example, the comment server is a standalone Python program, [isso](https://posativ.org/isso/), with corresponding JS embedded in each page. This works pretty well, but has lead to some weird quirkiness, such as each separate 404-erroring URL having its own list of comments. There's also the Random Stuff API, a custom assemblage of about 15 different Python libraries and external programs which, while technically not linked on the site, does interact with other projects like [PotatOS](https://git.osmarks.net/osmarks/potatOS/), and internal services on the same infrastructure like my [RSS reader](https://miniflux.app/). The images subdomain also uses a [PHP program](https://larsjung.de/h5ai/) to generate a nice searchable index; in fact, it is one of two the only PHP things I have unfortunately not yet been able to purge[^1]. There also used to be a publicly available status page using some custom code, but this doesn't work very well and has now been dropped; previously I had a Grafana (and earlier Netdata) instance there, but this has now been cancelled because it leaks a worrying amount of information. As for the underlying OS everything runs on, I currently use [Arch Linux](https://i.osmarks.net/memes-or-something/arch-btw.png) (as well as Alpine on a few lower-resourced cloud servers). Some form of Linux is inevitable - BSDs aren't really compatible with much, and Windows is obviously unsuited for server duty - but I mostly use Arch for its stability (this sounds sarcastic, but I've actually found it to be very reliable with regular updates), wide range of packages (particularly from the AUR; as I don't really run critical production infrastructure, I can generally afford to compile stuff from source a lot), and better general ease-of-use than Alpine. As much as I vaguely resent it, this is mostly down to systemd - despite it being a horrific bloated monolith, `journalctl` is very convenient and unit files are pleasant and easy to write compared to the weird OpenRC scripts Alpine uses. I am actually considering yet another redesign, however; switching to a dynamic site implementation instead would allow me to integrate the comment system and achievement system better, make things like the "from other blogs" tiles actually update at reasonable intervals, and arbitrarily A/B test users, although it would break some nice things like this site's very aggressive caching and fast serving. Please leave your thoughts or lack of thoughts on this in the comments. + +[^1]: The previous one was DokuWiki, now replaced with Minoteaur. + +[^2]: My next upgrade is probably going to be more SSD space, since I'm *somehow* running out of that. \ No newline at end of file diff --git a/experiments/political-opinion-calendar/index.html b/experiments/political-opinion-calendar/index.html new file mode 100644 index 0000000..7d0042d --- /dev/null +++ b/experiments/political-opinion-calendar/index.html @@ -0,0 +1,128 @@ +--- +title: Political Opinion Calendar +description: Instead of wasting time thinking of the best political opinion to hold, simply pick them pseudorandomly per day with this tool. +slug: polcal +--- + + + +
+ +
+ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8519d8a..5b7ed4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,17 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@msgpack/msgpack": "^3.0.0-beta2", + "axios": "^1.5.0", + "better-sqlite3": "^8.7.0", "chalk": "^4.1.0", "dayjs": "^1.8.28", + "esbuild": "^0.19.6", "fs-extra": "^8.1.0", "gray-matter": "^4.0.2", "handlebars": "^4.7.6", "html-minifier": "^4.0.0", + "idb": "^7.1.1", "markdown-it": "^13.0.1", "markdown-it-anchor": "^8.6.7", "markdown-it-footnote": "^3.0.3", @@ -24,7 +29,8 @@ "ramda": "^0.26.1", "sass": "^1.26.8", "terser": "^4.8.0", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "yalps": "^0.5.5" } }, "node_modules/@babel/helper-validator-identifier": { @@ -58,6 +64,344 @@ "node": ">=6.9.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.6.tgz", + "integrity": "sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.6.tgz", + "integrity": "sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.6.tgz", + "integrity": "sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.6.tgz", + "integrity": "sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.6.tgz", + "integrity": "sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.6.tgz", + "integrity": "sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.6.tgz", + "integrity": "sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.6.tgz", + "integrity": "sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.6.tgz", + "integrity": "sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.6.tgz", + "integrity": "sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.6.tgz", + "integrity": "sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.6.tgz", + "integrity": "sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.6.tgz", + "integrity": "sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.6.tgz", + "integrity": "sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.6.tgz", + "integrity": "sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.6.tgz", + "integrity": "sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.6.tgz", + "integrity": "sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.6.tgz", + "integrity": "sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.6.tgz", + "integrity": "sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.6.tgz", + "integrity": "sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.6.tgz", + "integrity": "sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.6.tgz", + "integrity": "sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@msgpack/msgpack": { + "version": "3.0.0-beta2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", + "engines": { + "node": ">= 14" + } + }, "node_modules/@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -135,6 +479,21 @@ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -146,6 +505,35 @@ "node": ">= 10.0.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.7.0.tgz", + "integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -154,6 +542,24 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -165,6 +571,29 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -234,6 +663,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -261,6 +695,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -280,11 +725,57 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", @@ -296,6 +787,42 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/esbuild": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.6.tgz", + "integrity": "sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.6", + "@esbuild/android-arm64": "0.19.6", + "@esbuild/android-x64": "0.19.6", + "@esbuild/darwin-arm64": "0.19.6", + "@esbuild/darwin-x64": "0.19.6", + "@esbuild/freebsd-arm64": "0.19.6", + "@esbuild/freebsd-x64": "0.19.6", + "@esbuild/linux-arm": "0.19.6", + "@esbuild/linux-arm64": "0.19.6", + "@esbuild/linux-ia32": "0.19.6", + "@esbuild/linux-loong64": "0.19.6", + "@esbuild/linux-mips64el": "0.19.6", + "@esbuild/linux-ppc64": "0.19.6", + "@esbuild/linux-riscv64": "0.19.6", + "@esbuild/linux-s390x": "0.19.6", + "@esbuild/linux-x64": "0.19.6", + "@esbuild/netbsd-x64": "0.19.6", + "@esbuild/openbsd-x64": "0.19.6", + "@esbuild/sunos-x64": "0.19.6", + "@esbuild/win32-arm64": "0.19.6", + "@esbuild/win32-ia32": "0.19.6", + "@esbuild/win32-x64": "0.19.6" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -308,6 +835,14 @@ "node": ">=4" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -319,6 +854,11 @@ "node": ">=0.10.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -330,6 +870,43 @@ "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -374,6 +951,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -462,6 +1044,11 @@ "he": "bin/he" } }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, "node_modules/html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -482,6 +1069,45 @@ "node": ">=6" } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -623,6 +1249,17 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/markdown-it": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", @@ -662,6 +1299,36 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", @@ -670,6 +1337,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -683,6 +1355,11 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -696,6 +1373,17 @@ "lower-case": "^1.1.1" } }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -712,6 +1400,14 @@ "node": ">=0.10.0" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -736,6 +1432,31 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -744,6 +1465,11 @@ "asap": "~2.0.3" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pug": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", @@ -856,11 +1582,47 @@ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/ramda": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -892,18 +1654,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/sass": { - "version": "1.35.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.2.tgz", - "integrity": "sha512-jhO5KAR+AMxCEwIH3v+4zbB2WB0z67V1X0jbapfVwQQdjHZUGUyukpnoM6+iCMfsIUC016w9OPKQ5jrNOS9uXw==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=14.0.0" } }, "node_modules/section-matter": { @@ -918,6 +1701,63 @@ "node": ">=4" } }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -926,6 +1766,14 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -940,6 +1788,14 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -948,6 +1804,14 @@ "node": ">=0.10.0" } }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -959,6 +1823,32 @@ "node": ">=8" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/terser": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", @@ -999,6 +1889,17 @@ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -1028,6 +1929,11 @@ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -1062,6 +1968,24 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yalps": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/yalps/-/yalps-0.5.5.tgz", + "integrity": "sha512-b5uoTjroIL0Mrn3MInFgj1uZJbQzsJqWkC5FHMPlJc81pS3c0Hv3NGECV8QR0rbim77ZcX9SLHEncpSq7bFgsg==", + "dependencies": { + "heap": "^0.2.7" + } } }, "dependencies": { @@ -1084,6 +2008,143 @@ "to-fast-properties": "^2.0.0" } }, + "@esbuild/android-arm": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.6.tgz", + "integrity": "sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.6.tgz", + "integrity": "sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.6.tgz", + "integrity": "sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.6.tgz", + "integrity": "sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.6.tgz", + "integrity": "sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.6.tgz", + "integrity": "sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.6.tgz", + "integrity": "sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.6.tgz", + "integrity": "sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.6.tgz", + "integrity": "sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.6.tgz", + "integrity": "sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.6.tgz", + "integrity": "sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.6.tgz", + "integrity": "sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.6.tgz", + "integrity": "sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.6.tgz", + "integrity": "sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.6.tgz", + "integrity": "sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.6.tgz", + "integrity": "sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.6.tgz", + "integrity": "sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.6.tgz", + "integrity": "sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.6.tgz", + "integrity": "sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.6.tgz", + "integrity": "sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.6.tgz", + "integrity": "sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.6.tgz", + "integrity": "sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==", + "optional": true + }, + "@msgpack/msgpack": { + "version": "3.0.0-beta2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==" + }, "@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -1146,6 +2207,21 @@ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -1154,11 +2230,43 @@ "@babel/types": "^7.9.6" } }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "better-sqlite3": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.7.0.tgz", + "integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -1167,6 +2275,15 @@ "fill-range": "^7.0.1" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1222,6 +2339,11 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "clean-css": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", @@ -1243,6 +2365,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1262,21 +2392,86 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" + }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, "entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" }, + "esbuild": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.6.tgz", + "integrity": "sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==", + "requires": { + "@esbuild/android-arm": "0.19.6", + "@esbuild/android-arm64": "0.19.6", + "@esbuild/android-x64": "0.19.6", + "@esbuild/darwin-arm64": "0.19.6", + "@esbuild/darwin-x64": "0.19.6", + "@esbuild/freebsd-arm64": "0.19.6", + "@esbuild/freebsd-x64": "0.19.6", + "@esbuild/linux-arm": "0.19.6", + "@esbuild/linux-arm64": "0.19.6", + "@esbuild/linux-ia32": "0.19.6", + "@esbuild/linux-loong64": "0.19.6", + "@esbuild/linux-mips64el": "0.19.6", + "@esbuild/linux-ppc64": "0.19.6", + "@esbuild/linux-riscv64": "0.19.6", + "@esbuild/linux-s390x": "0.19.6", + "@esbuild/linux-x64": "0.19.6", + "@esbuild/netbsd-x64": "0.19.6", + "@esbuild/openbsd-x64": "0.19.6", + "@esbuild/sunos-x64": "0.19.6", + "@esbuild/win32-arm64": "0.19.6", + "@esbuild/win32-ia32": "0.19.6", + "@esbuild/win32-x64": "0.19.6" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -1285,6 +2480,11 @@ "is-extendable": "^0.1.0" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1293,6 +2493,26 @@ "to-regex-range": "^5.0.1" } }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -1324,6 +2544,11 @@ "has-symbols": "^1.0.1" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1383,6 +2608,11 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, "html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -1397,6 +2627,31 @@ "uglify-js": "^3.5.1" } }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1508,6 +2763,14 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "markdown-it": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", @@ -1543,11 +2806,34 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, "minimist": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -1558,6 +2844,11 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -1571,6 +2862,14 @@ "lower-case": "^1.1.1" } }, + "node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "requires": { + "semver": "^7.3.5" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1581,6 +2880,14 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -1599,6 +2906,25 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -1607,6 +2933,11 @@ "asap": "~2.0.3" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pug": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", @@ -1719,11 +3050,41 @@ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "ramda": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1746,12 +3107,19 @@ "path-parse": "^1.0.6" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "sass": { - "version": "1.35.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.2.tgz", - "integrity": "sha512-jhO5KAR+AMxCEwIH3v+4zbB2WB0z67V1X0jbapfVwQQdjHZUGUyukpnoM6+iCMfsIUC016w9OPKQ5jrNOS9uXw==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "section-matter": { @@ -1763,11 +3131,39 @@ "kind-of": "^6.0.0" } }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, "source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -1782,11 +3178,24 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1795,6 +3204,29 @@ "has-flag": "^4.0.0" } }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "terser": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", @@ -1823,6 +3255,14 @@ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -1843,6 +3283,11 @@ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -1868,6 +3313,24 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yalps": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/yalps/-/yalps-0.5.5.tgz", + "integrity": "sha512-b5uoTjroIL0Mrn3MInFgj1uZJbQzsJqWkC5FHMPlJc81pS3c0Hv3NGECV8QR0rbim77ZcX9SLHEncpSq7bFgsg==", + "requires": { + "heap": "^0.2.7" + } } } } diff --git a/package.json b/package.json index 263f18b..c4db6a1 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,17 @@ "description": "Static site generation code for my website.", "main": "index.js", "dependencies": { + "@msgpack/msgpack": "^3.0.0-beta2", + "axios": "^1.5.0", + "better-sqlite3": "^8.7.0", "chalk": "^4.1.0", "dayjs": "^1.8.28", + "esbuild": "^0.19.6", "fs-extra": "^8.1.0", "gray-matter": "^4.0.2", "handlebars": "^4.7.6", "html-minifier": "^4.0.0", + "idb": "^7.1.1", "markdown-it": "^13.0.1", "markdown-it-anchor": "^8.6.7", "markdown-it-footnote": "^3.0.3", @@ -19,7 +24,8 @@ "ramda": "^0.26.1", "sass": "^1.26.8", "terser": "^4.8.0", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "yalps": "^0.5.5" }, "license": "MIT" } diff --git a/src/global.json b/src/global.json index 9a2d986..da00ccb 100644 --- a/src/global.json +++ b/src/global.json @@ -18,7 +18,7 @@ "If you can't stand the heat, get out of the server room." ], "feeds": [ - "https://blogs.sciencemag.org/pipeline/feed", + "https://www.science.org/blogs/pipeline/feed", "https://www.rtl-sdr.com/feed/", "https://astralcodexten.substack.com/feed", "https://www.rifters.com/crawl/?feed=rss2", @@ -27,5 +27,6 @@ "https://aphyr.com/posts.atom", "https://os.phil-opp.com/rss.xml" ], - "dateFormat": "YYYY-MM-DD" + "dateFormat": "YYYY-MM-DD", + "microblogSource": "https://b.osmarks.net/outbox" } \ No newline at end of file diff --git a/src/index.js b/src/index.js index 4c27e06..f16f521 100644 --- a/src/index.js +++ b/src/index.js @@ -18,6 +18,10 @@ const childProcess = require("child_process") const chalk = require("chalk") const crypto = require("crypto") const uuid = require("uuid") +const sqlite = require("better-sqlite3") +const axios = require("axios") +const msgpack = require("@msgpack/msgpack") +const esbuild = require("esbuild") dayjs.extend(customParseFormat) @@ -28,6 +32,7 @@ const blogDir = path.join(root, "blog") const errorPagesDir = path.join(root, "error") const assetsDir = path.join(root, "assets") const outDir = path.join(root, "out") +const srcDir = path.join(root, "src") const buildID = nanoid() globalData.buildID = buildID @@ -189,7 +194,7 @@ const processBlog = async () => { }, processContent: renderMarkdown }) }) console.log(chalk.yellow(`${Object.keys(blog).length} blog entries`)) - globalData.blog = addGuids(R.sortBy(x => x.updated ? -x.updated.valueOf() : 0, R.values(blog))) + globalData.blog = addGuids(R.filter(x => !x.draft, R.sortBy(x => x.updated ? -x.updated.valueOf() : 0, R.values(blog)))) } const processErrorPages = () => { @@ -214,51 +219,76 @@ const applyMetricPrefix = (x, unit) => { globalData.metricPrefix = applyMetricPrefix const writeBuildID = () => fsp.writeFile(path.join(outDir, "buildID.txt"), buildID) + const index = async () => { const index = globalData.templates.index({ ...globalData, title: "Index", posts: globalData.blog, description: globalData.siteDescription }) await fsp.writeFile(path.join(outDir, "index.html"), index) } -const compileCSS = async () => { - const css = sass.renderSync({ - data: await readFile(path.join(root, "style.sass")), - outputStyle: "compressed", - indentedSyntax: true - }).css - globalData.css = css + +const cache = sqlite("cache.sqlite3") +cache.exec("CREATE TABLE IF NOT EXISTS cache (k TEXT NOT NULL PRIMARY KEY, v BLOB NOT NULL, ts INTEGER NOT NULL)") +const writeCacheStmt = cache.prepare("INSERT OR REPLACE INTO cache VALUES (?, ?, ?)") +const readCacheStmt = cache.prepare("SELECT * FROM cache WHERE k = ?") +const readCache = (k, maxAge=null, ts=null) => { + const row = readCacheStmt.get(k) + if (!row) return + if ((maxAge && row.ts < (Date.now() - maxAge) || (ts && row.ts != ts))) return + return msgpack.decode(row.v) } -const loadTemplates = async () => { - globalData.templates = await loadDir(templateDir, async fullPath => pug.compile(await readFile(fullPath), { filename: fullPath })) +const writeCache = (k, v, ts=Date.now()) => { + const enc = msgpack.encode(v) + writeCacheStmt.run(k, Buffer.from(enc.buffer, enc.byteOffset, enc.byteLength), ts) } + +const fetchMicroblog = async () => { + const cached = readCache("microblog", 60*60*1000) + if (cached) { globalData.microblog = cached; return } + const posts = (await axios({ url: globalData.microblogSource, headers: { "Accept": 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' } })).data.orderedItems + globalData.microblog = posts.slice(0, 6).map(post => minifyHTML(globalData.templates.activitypub({ + ...globalData, + permalink: post.object.id, + date: dayjs(post.object.published), + content: post.object.content, + bgcol: hashColor(post.object.id, 1, 0.9) + }))) + writeCache("microblog", globalData.microblog) +} + const runOpenring = async () => { - try { - var cached = JSON.parse(await fsp.readFile("cache.json", {encoding: "utf8"})) - } catch(e) { - console.log(chalk.keyword("orange")("Failed to load cache:"), e) - } - if (cached && (Date.now() - cached.time) < (60 * 60 * 1000)) { - console.log(chalk.keyword("orange")("Loading Openring data from cache")) - return cached.data - } - globalData.openring = "bee" + const cached = readCache("openring", 60*60*1000) + if (cached) { globalData.openring = cached; return } // wildly unsafe but only runs on input from me anyway const arg = `./openring -n6 ${globalData.feeds.map(x => '-s "' + x + '"').join(" ")} < openring.html` console.log(chalk.keyword("orange")("Openring:") + " " + arg) const out = await util.promisify(childProcess.exec)(arg) console.log(chalk.keyword("orange")("Openring:") + "\n" + out.stderr.trim()) globalData.openring = minifyHTML(out.stdout) - await fsp.writeFile("cache.json", JSON.stringify({ - time: Date.now(), - data: globalData.openring - })) + writeCache("openring", globalData.openring) } + +const compileCSS = async () => { + const css = sass.renderSync({ + data: await readFile(path.join(srcDir, "style.sass")), + outputStyle: "compressed", + indentedSyntax: true + }).css + globalData.css = css +} + +const loadTemplates = async () => { + globalData.templates = await loadDir(templateDir, async fullPath => pug.compile(await readFile(fullPath), { filename: fullPath })) +} + const genRSS = async () => { const rssFeed = globalData.templates.rss({ ...globalData, items: globalData.blog, lastUpdate: new Date() }) await fsp.writeFile(path.join(outDir, "rss.xml"), rssFeed) } + const genManifest = async () => { const m = mustache.render(await readFile(path.join(assetsDir, "manifest.webmanifest")), globalData) fsp.writeFile(path.join(outAssets, "manifest.webmanifest"), m) } + const minifyJSTask = async () => { const jsDir = path.join(assetsDir, "js") const jsOutDir = path.join(outAssets, "js") @@ -267,10 +297,22 @@ const minifyJSTask = async () => { await minifyJSFile(await readFile(fullpath), file, path.join(jsOutDir, file)) })) } + +const compilePageJSTask = async () => { + await esbuild.build({ + entryPoints: [ path.join(srcDir, "page.js") ], + bundle: true, + outfile: path.join(outAssets, "js/page.js"), + minify: true, + sourcemap: true + }) +} + const genServiceWorker = async () => { const serviceWorker = mustache.render(await readFile(path.join(assetsDir, "sw.js")), globalData) await minifyJSFile(serviceWorker, "sw.js", path.join(outDir, "sw.js")) } + const copyAsset = subpath => fse.copy(path.join(assetsDir, subpath), path.join(outAssets, subpath)) const doImages = async () => { @@ -279,9 +321,37 @@ const doImages = async () => { copyAsset("titillium-web-semibold.woff2") copyAsset("share-tech-mono.woff2") globalData.images = {} - for (const image of await fse.readdir(path.join(assetsDir, "images"), { encoding: "utf-8" })) { - globalData.images[image.split(".").slice(0, -1).join(".")] = "/assets/images/" + image - } + await Promise.all( + (await fse.readdir(path.join(assetsDir, "images"), { encoding: "utf-8" })).map(async image => { + if (image.endsWith(".original")) { // generate alternative formats + const stripped = image.replace(/\.original$/).split(".").slice(0, -1).join(".") + globalData.images[stripped] = {} + const fullPath = path.join(assetsDir, "images", image) + const stat = await fse.stat(fullPath) + const writeFormat = async (name, ext, mime, cmd, supplementaryArgs) => { + let bytes = readCache(`images/${stripped}/${name}`, null, stat.mtimeMs) + const destFilename = stripped + ext + const destPath = path.join(outAssets, "images", destFilename) + if (!bytes) { + console.log(chalk.keyword("orange")(`Compressing image ${stripped} (${name})`)) + await util.promisify(childProcess.execFile)(cmd, supplementaryArgs.concat([ + fullPath, + destPath + ])) + writeCache(`images/${stripped}/${name}`, await fsp.readFile(destPath), stat.mtimeMs) + } else { + await fsp.writeFile(destPath, bytes) + } + + globalData.images[stripped][mime] = "/assets/images/" + destFilename + } + await writeFormat("avif", ".avif", "image/avif", "avifenc", ["-s", "0", "-q", "20"]) + await writeFormat("jpeg-scaled", ".jpg", "_fallback", "convert", ["-resize", "25%", "-format", "jpeg"]) + } else { + globalData.images[image.split(".").slice(0, -1).join(".")] = "/assets/images/" + image + } + }) + ) } const tasks = { @@ -290,18 +360,20 @@ const tasks = { pagedeps: { deps: ["templates", "css"] }, css: { deps: [], fn: compileCSS }, writeBuildID: { deps: [], fn: writeBuildID }, - index: { deps: ["openring", "pagedeps", "blog", "experiments", "images"], fn: index }, + index: { deps: ["openring", "pagedeps", "blog", "experiments", "images", "fetchMicroblog"], fn: index }, openring: { deps: [], fn: runOpenring }, rss: { deps: ["blog"], fn: genRSS }, blog: { deps: ["pagedeps"], fn: processBlog }, + fetchMicroblog: { deps: [], fn: fetchMicroblog }, experiments: { deps: ["pagedeps"], fn: processExperiments }, assetsDir: { deps: [], fn: () => fse.ensureDir(outAssets) }, manifest: { deps: ["assetsDir"], fn: genManifest }, minifyJS: { deps: ["assetsDir"], fn: minifyJSTask }, + compilePageJS: { deps: ["assetsDir"], fn: compilePageJSTask }, serviceWorker: { deps: [], fn: genServiceWorker }, images: { deps: ["assetsDir"], fn: doImages }, offlinePage: { deps: ["assetsDir", "pagedeps"], fn: () => applyTemplate(globalData.templates.experiment, path.join(assetsDir, "offline.html"), () => path.join(outAssets, "offline.html"), {}) }, - assets: { deps: ["manifest", "minifyJS", "serviceWorker", "images"] }, + assets: { deps: ["manifest", "minifyJS", "serviceWorker", "images", "compilePageJS"] }, main: { deps: ["writeBuildID", "index", "errorPages", "assets", "experiments", "blog", "rss"] } } diff --git a/assets/js/page.js b/src/page.js similarity index 69% rename from assets/js/page.js rename to src/page.js index 51ee585..0163ab0 100644 --- a/assets/js/page.js +++ b/src/page.js @@ -1,6 +1,5 @@ -// I cannot be bothered to set up a bundler -// https://www.npmjs.com/package/idb -!function(e,t){t(window.idb={})}(this,(function(e){"use strict";let t,n;const r=new WeakMap,o=new WeakMap,s=new WeakMap,i=new WeakMap,a=new WeakMap;let c={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return o.get(e);if("objectStoreNames"===t)return e.objectStoreNames||s.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return f(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function d(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(n||(n=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(p(this),t),f(r.get(this))}:function(...t){return f(e.apply(p(this),t))}:function(t,...n){const r=e.call(p(this),t,...n);return s.set(r,t.sort?t.sort():[t]),f(r)}}function u(e){return"function"==typeof e?d(e):(e instanceof IDBTransaction&&function(e){if(o.has(e))return;const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("complete",o),e.removeEventListener("error",s),e.removeEventListener("abort",s)},o=()=>{t(),r()},s=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",o),e.addEventListener("error",s),e.addEventListener("abort",s)}));o.set(e,t)}(e),n=e,(t||(t=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some((e=>n instanceof e))?new Proxy(e,c):e);var n}function f(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("success",o),e.removeEventListener("error",s)},o=()=>{t(f(e.result)),r()},s=()=>{n(e.error),r()};e.addEventListener("success",o),e.addEventListener("error",s)}));return t.then((t=>{t instanceof IDBCursor&&r.set(t,e)})).catch((()=>{})),a.set(t,e),t}(e);if(i.has(e))return i.get(e);const t=u(e);return t!==e&&(i.set(e,t),a.set(t,e)),t}const p=e=>a.get(e);const l=["get","getKey","getAll","getAllKeys","count"],D=["put","add","delete","clear"],b=new Map;function v(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(b.get(t))return b.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,o=D.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!o&&!l.includes(n))return;const s=async function(e,...t){const s=this.transaction(e,o?"readwrite":"readonly");let i=s.store;return r&&(i=i.index(t.shift())),(await Promise.all([i[n](...t),o&&s.done]))[0]};return b.set(t,s),s}c=(e=>({...e,get:(t,n,r)=>v(t,n)||e.get(t,n,r),has:(t,n)=>!!v(t,n)||e.has(t,n)}))(c),e.deleteDB=function(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",(()=>t())),f(n).then((()=>{}))},e.openDB=function(e,t,{blocked:n,upgrade:r,blocking:o,terminated:s}={}){const i=indexedDB.open(e,t),a=f(i);return r&&i.addEventListener("upgradeneeded",(e=>{r(f(i.result),e.oldVersion,e.newVersion,f(i.transaction))})),n&&i.addEventListener("blocked",(()=>n())),a.then((e=>{s&&e.addEventListener("close",(()=>s())),o&&e.addEventListener("versionchange",(()=>o()))})).catch((()=>{})),a},e.unwrap=p,e.wrap=f})); +const idb = require("idb") +const { solve } = require("yalps") // attempt to register service worker if ("serviceWorker" in navigator) { @@ -34,6 +33,7 @@ const hashString = function(str, seed = 0) { } const colHash = (str, saturation = 100, lightness = 70) => `hsl(${hashString(str) % 360}, ${saturation}%, ${lightness}%)` +window.colHash = colHash // Arbitrary Points code, wrapped in an IIFE to not pollute the global environment much more than it already is window.points = (async () => { @@ -368,6 +368,144 @@ window.points = (async () => { } })() +const footnotes = document.querySelector(".footnotes") +const sidenotes = document.querySelector(".sidenotes") +if (sidenotes) { + const codeblocks = document.querySelectorAll("pre.hljs") + const article = document.querySelector("main.blog-post") + while (footnotes.firstChild) { + sidenotes.appendChild(footnotes.firstChild) + } + const footnoteItems = sidenotes.querySelectorAll(".footnote-item") + + const sum = xs => xs.reduce((a, b) => a + b, 0) + const arrayOf = (n, x) => new Array(n).fill(x) + const BORDER = 16 + const sidenotesAtSide = () => getComputedStyle(sidenotes).paddingLeft !== "0px" + let rendered = false + const relayout = forceRedraw => { + // sidenote column width is static: no need to redo positioning on resize unless no positions applied + if (sidenotesAtSide()) { + if (rendered && !forceRedraw) return + // sidenote vertical placement algorithm + const snRect = sidenotes.getBoundingClientRect() + const articleRect = article.getBoundingClientRect() + const exclusions = [[-Infinity, Math.max(articleRect.top, snRect.top)]] + for (const codeblock of codeblocks) { + const codeblockRect = codeblock.getBoundingClientRect() + if (codeblockRect.width !== 0) { // collapsed + exclusions.push([codeblockRect.top - BORDER, codeblockRect.top + codeblockRect.height + BORDER]) + } + } + // convert unusable regions into list of usable regions + const inclusions = [] + for (const [start, end] of exclusions) { + if (inclusions.length) inclusions[inclusions.length - 1].end = start - snRect.top + inclusions.push({ start: end - snRect.top, contents: [] }) + } + inclusions[inclusions.length - 1].end = Infinity + const notes = [] + // read off sidenotes to place + for (const item of footnoteItems) { + const itemRect = item.getBoundingClientRect() + const link = article.querySelector(`#${item.id.replace(/^fn/, "fnref")}`) + const linkRect = link.getBoundingClientRect() + item.style.position = "absolute" + item.style.left = getComputedStyle(sidenotes).paddingLeft + item.style.marginBottom = item.style.marginTop = `${BORDER / 2}px` + notes.push({ + item, + height: itemRect.height + BORDER, + target: linkRect.top - snRect.top + }) + } + // preliminary placement: place in valid regions going down + for (const note of notes) { + const index = inclusions.findLastIndex(inc => (inc.start + note.height) < note.target) + const next = inclusions.slice(index) + .findIndex(inc => (sum(inc.contents.map(x => x.height)) + note.height) < (inc.end - inc.start)) + inclusions[index + next].contents.push(note) + } + // TODO: try simple moves between regions? might be useful sometimes + // place within region and apply styles + for (const inc of inclusions) { + const regionNotes = inc.contents + if (regionNotes.length > 0) { + const variables = {} + const constraints = {} + if (inc.end !== Infinity) { + const heights = regionNotes.map(note => note.height) + constraints["sum_gaps"] = { max: inc.end - inc.start - sum(heights) } + } + regionNotes.forEach((note, i) => { + variables[`distbound_${i}`] = { + "distsum": 1, + [`distbound_${i}_offset`]: 1, + [`distbound_${i}_offset_neg`]: 1 + } + + const heightsum = sum(regionNotes.slice(0, i).map(x => x.height)) + const baseoffset = heightsum - note.target + + // WANT: distbound_i >= placement_i - target_i AND distbound_i <= target_i - placement_i + // distbound_i >= gapsum_i + heightsum_i - target_i + + // distbound_i_offset = distbound_i - gapsum_i + // so distbound_i_offset >= heightsum_i - target_i + // implies distbound_i - gapsum_i >= heightsum_i - target_i + // (as required) + + // distbound_i + gapsum_i >= heightsum_i - target_i + + constraints[`distbound_${i}_offset`] = { min: baseoffset } + constraints[`distbound_${i}_offset_neg`] = { min: -baseoffset } + + constraints[`gap_${i}`] = { min: 0 } + const G_i_var = { "sum_gaps": 1 } + for (let j = i; j <= regionNotes.length; j++) G_i_var[`distbound_${j}_offset`] = -1 + for (let j = i; j < regionNotes.length; j++) G_i_var[`distbound_${j}_offset_neg`] = 1 + variables[`gap_${i}`] = G_i_var + }) + const model = { + direction: "minimize", + objective: "distsum", + constraints, + variables + } + const solution = solve(model, { includeZeroVariables: true }) + if (solution.status !== "optimal") { + // implode + solution.variables = [] + console.warn("Sidenote layout failed", solution.status) + } + const solutionVars = new Map(solution.variables) + let position = 0 + regionNotes.forEach((note, i) => { + position += solutionVars.get(`gap_${i}`) || 0 + note.item.style.top = position + "px" + position += note.height + }) + } + } + rendered = true + } else { + for (const item of sidenotes.querySelectorAll(".footnote-item")) { + item.style.position = "static" + } + rendered = false + } + } + + window.onresize = relayout + window.onload = relayout + document.querySelectorAll("summary").forEach(x => { + x.addEventListener("click", () => { + setTimeout(() => relayout(true), 0) + }) + }) + window.relayout = relayout +} + const customStyle = localStorage.getItem("user-stylesheet") let customStyleEl = null if (customStyle) { @@ -376,4 +514,6 @@ if (customStyle) { customStyleEl.onload = () => console.log("Loaded custom styles") customStyleEl.id = "custom-style" document.head.appendChild(customStyleEl) -} \ No newline at end of file +} +window.customStyleEl = customStyleEl +window.customStyle = customStyle \ No newline at end of file diff --git a/style.sass b/src/style.sass similarity index 77% rename from style.sass rename to src/style.sass index 180eef5..e5ad20a 100644 --- a/style.sass +++ b/src/style.sass @@ -1,3 +1,7 @@ +$sidenotes-width: 20rem +$content-margin: 1rem +$content-width: 40rem + @font-face font-family: 'Titillium Web' font-style: normal @@ -56,7 +60,7 @@ nav color: white font-size: 1.25em - a, img + a, img, picture margin-right: 0.5em @for $i from 1 through 6 @@ -71,18 +75,18 @@ h1, h2, h3, h4, h5, h6 color: inherit main, .header - margin-left: 1em - margin-right: 1em + margin-left: $content-margin + margin-right: $content-margin // for easier viewing on big screen devices, narrow the width of text // also make links a bit more distinct main.blog-post - max-width: 40em + max-width: $content-width text-align: justify a text-decoration: underline -.blog, .experiments, .atl +.blog, .experiments, .atl, .microblog margin: -0.5em margin-bottom: 0 display: flex @@ -94,6 +98,9 @@ main.blog-post padding: 1em flex: 1 1 20% +.microblog > div + flex: 1 1 30% + main margin-top: 1em @@ -147,7 +154,7 @@ button, select, input, textarea, .textarea .imbox display: flex - img + img, picture padding-right: 1em height: 8em width: 8em @@ -162,5 +169,36 @@ button, select, input, textarea, .textarea border: 1px solid black padding: 1em margin: -1px - img - width: 100% \ No newline at end of file + img, picture + width: 100% + +blockquote + padding-left: 0.4rem + border-left: 0.4rem solid black + margin-left: 0.2rem + +.microblog p + margin: 0 + +.sidenotes-container + display: flex + flex-wrap: wrap +.sidenotes + width: $sidenotes-width + min-width: $sidenotes-width + padding-left: 1.5rem + position: relative +.footnotes-sep + display: none +.footnotes-list + text-align: justify +@media (max-width: calc(2 * $content-margin + $content-width + $sidenotes-width)) + .sidenotes + min-width: auto + width: auto + max-width: $content-width + padding: 0 + margin-left: $content-margin + margin-right: $content-margin + .footnotes-sep + display: block \ No newline at end of file diff --git a/templates/activitypub.pug b/templates/activitypub.pug new file mode 100644 index 0000000..8861f9c --- /dev/null +++ b/templates/activitypub.pug @@ -0,0 +1,4 @@ +div(style=`background: ${bgcol}`) + div + a(href=permalink)= renderDate(date) + div!= content \ No newline at end of file diff --git a/templates/blogPost.pug b/templates/blogPost.pug index 0c41f48..d5c9537 100644 --- a/templates/blogPost.pug +++ b/templates/blogPost.pug @@ -1,4 +1,10 @@ extends layout.pug block content - main.blog-post!= content \ No newline at end of file + .sidenotes-container + main.blog-post!= content + .sidenotes + +block under-title + if draft + h1 DRAFT \ No newline at end of file diff --git a/templates/index.pug b/templates/index.pug index 3649490..89ac60d 100644 --- a/templates/index.pug +++ b/templates/index.pug @@ -9,13 +9,20 @@ block content each post in posts .imbox(style=`background: ${post.bgcol}`) if images.hasOwnProperty(post.slug) - img(src=images[post.slug]) + +image(images[post.slug]) div div a.title(href=`/${post.slug}/`)= post.title - span.deemph= `${renderDate(post.created)} / ${metricPrefix(post.wordCount, "")} words` + div.deemph= `${renderDate(post.created)} / ${metricPrefix(post.wordCount, "")} words` div.description!= post.description + h2 Microblog + p. + Short-form observations. + div.microblog + each entry in microblog + != entry + h2 Experiments p. Various web projects I have put together over many years. Made with at least four different JS frameworks. Some of them are bad. @@ -23,7 +30,7 @@ block content each experiment in experiments .imbox(style=`background: ${experiment.bgcol}`) if images.hasOwnProperty(experiment.slug) - img(src=images[experiment.slug]) + +image(images[experiment.slug]) div div a.title(href=`/${experiment.slug}/`)= experiment.title diff --git a/templates/layout.pug b/templates/layout.pug index 06cbf83..b317b5f 100644 --- a/templates/layout.pug +++ b/templates/layout.pug @@ -1,9 +1,23 @@ mixin nav-item(url, name) a(href=url)= name +mixin image(src) + if typeof src === "string" + img(src=src) + else + picture + each val, key in src + if key == "_fallback" + img(src=val) + else + source(srcset=val, type=key) + doctype html html(lang="en") head + link(rel="preload", href="/assets/share-tech-mono.woff2", as="font", crossorigin="anonymous") + link(rel="preload", href="/assets/titillium-web-semibold.woff2", as="font", crossorigin="anonymous") + link(rel="preload", href="/assets/titillium-web.woff2", as="font", crossorigin="anonymous") title= `${title} @ ${name}` script(src="/assets/js/page.js", defer=true) meta(charset="UTF-8")